nouveau: add state buffers, lightweight replacement for state objects
Just a dumb buffer, allowed by the RING_3D/fixed subchannel binding and no support for relocations. This is *much* faster than state objects.
This commit is contained in:
@@ -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
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user