anv: Implement new way for setting streamout buffers.
For gen12 we set the streamout buffers using 4 separate commands instead of 3DSTATE_SO_BUFFER. Signed-off-by: Plamena Manolova <plamena.manolova@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -204,6 +204,15 @@ struct gen_perf_config;
|
|||||||
*/
|
*/
|
||||||
#define ANV_PREDICATE_RESULT_REG 0x2678 /* MI_ALU_REG15 */
|
#define ANV_PREDICATE_RESULT_REG 0x2678 /* MI_ALU_REG15 */
|
||||||
|
|
||||||
|
/* For gen12 we set the streamout buffers using 4 separate commands
|
||||||
|
* (3DSTATE_SO_BUFFER_INDEX_*) instead of 3DSTATE_SO_BUFFER. However the layout
|
||||||
|
* of the 3DSTATE_SO_BUFFER_INDEX_* commands is identical to that of
|
||||||
|
* 3DSTATE_SO_BUFFER apart from the SOBufferIndex field, so for now we use the
|
||||||
|
* 3DSTATE_SO_BUFFER command, but change the 3DCommandSubOpcode.
|
||||||
|
* SO_BUFFER_INDEX_0_CMD is actually the 3DCommandSubOpcode for
|
||||||
|
* 3DSTATE_SO_BUFFER_INDEX_0.
|
||||||
|
*/
|
||||||
|
#define SO_BUFFER_INDEX_0_CMD 0x60
|
||||||
#define anv_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
|
#define anv_printflike(a, b) __attribute__((__format__(__printf__, a, b)))
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
|
@@ -2757,7 +2757,12 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
for (unsigned idx = 0; idx < MAX_XFB_BUFFERS; idx++) {
|
for (unsigned idx = 0; idx < MAX_XFB_BUFFERS; idx++) {
|
||||||
struct anv_xfb_binding *xfb = &cmd_buffer->state.xfb_bindings[idx];
|
struct anv_xfb_binding *xfb = &cmd_buffer->state.xfb_bindings[idx];
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) {
|
||||||
|
#if GEN_GEN < 12
|
||||||
sob.SOBufferIndex = idx;
|
sob.SOBufferIndex = idx;
|
||||||
|
#else
|
||||||
|
sob._3DCommandOpcode = 0;
|
||||||
|
sob._3DCommandSubOpcode = SO_BUFFER_INDEX_0_CMD + idx;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (cmd_buffer->state.xfb_enabled && xfb->buffer && xfb->size != 0) {
|
if (cmd_buffer->state.xfb_enabled && xfb->buffer && xfb->size != 0) {
|
||||||
sob.SOBufferEnable = true;
|
sob.SOBufferEnable = true;
|
||||||
|
@@ -149,7 +149,12 @@ genX(cmd_buffer_so_memcpy)(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
VK_SHADER_STAGE_VERTEX_BIT, entry_size);
|
VK_SHADER_STAGE_VERTEX_BIT, entry_size);
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) {
|
||||||
|
#if GEN_GEN < 12
|
||||||
sob.SOBufferIndex = 0;
|
sob.SOBufferIndex = 0;
|
||||||
|
#else
|
||||||
|
sob._3DCommandOpcode = 0;
|
||||||
|
sob._3DCommandSubOpcode = SO_BUFFER_INDEX_0_CMD;
|
||||||
|
#endif
|
||||||
sob.MOCS = anv_mocs_for_bo(cmd_buffer->device, dst.bo),
|
sob.MOCS = anv_mocs_for_bo(cmd_buffer->device, dst.bo),
|
||||||
sob.SurfaceBaseAddress = dst;
|
sob.SurfaceBaseAddress = dst;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user