nouveau: add state buffers, lightweight replacement for state objects
authorLuca Barbieri <luca@luca-barbieri.com>
Tue, 23 Feb 2010 10:11:52 +0000 (11:11 +0100)
committerLuca Barbieri <luca@luca-barbieri.com>
Mon, 12 Apr 2010 10:13:16 +0000 (12:13 +0200)
Just a dumb buffer, allowed by the RING_3D/fixed subchannel binding and
no support for relocations.

This is *much* faster than state objects.

src/gallium/drivers/nouveau/nouveau_statebuf.h [new file with mode: 0644]
src/gallium/drivers/nvfx/nvfx_state.h

diff --git a/src/gallium/drivers/nouveau/nouveau_statebuf.h b/src/gallium/drivers/nouveau/nouveau_statebuf.h
new file mode 100644 (file)
index 0000000..dcffdd9
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef __NOUVEAU_STATEBUF_H__
+#define __NOUVEAU_STATEBUF_H__
+
+/* state buffers: lightweight state objects interface */
+/* relocations are not supported, but Gallium CSOs don't require them */
+
+struct nouveau_statebuf_builder
+{
+       uint32_t* p;
+#ifdef DEBUG
+       uint32_t* pend;
+#endif
+};
+
+#ifdef DEBUG
+#define sb_init(var) {var, var + sizeof(var) / sizeof((var)[0])}
+#define sb_data(sb, v) do {assert((sb).p != (sb).pend);  *(sb).p++ = (v);} while(0)
+#else
+#define sb_init(var) {var}
+#define sb_data(sb, v) *(sb).p++ = (v)
+#endif
+
+#define sb_method(sb, v, n)  sb_data(sb, RING_3D(v, n));
+
+#define sb_len(sb, var) ((sb).p - (var))
+#define sb_emit(chan, sb_buf, sb_len) do {WAIT_RING((chan), (sb_len)); OUT_RINGp((chan), (sb_buf), (sb_len)); } while(0)
+#endif
index 1f612ea95f584b12af53036bffd9209abfb70a31..8f5b33fcffb951f3ea2a400cd74d425d6589baf0 100644 (file)
@@ -3,6 +3,7 @@
 
 #include "pipe/p_state.h"
 #include "tgsi/tgsi_scan.h"
+#include "nouveau/nouveau_statebuf.h"
 
 struct nvfx_vertex_program_exec {
        uint32_t data[4];