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>tags/19.3-branchpoint
| @@ -204,6 +204,15 @@ struct gen_perf_config; | |||
| */ | |||
| #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))) | |||
| 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++) { | |||
| struct anv_xfb_binding *xfb = &cmd_buffer->state.xfb_bindings[idx]; | |||
| anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) { | |||
| #if GEN_GEN < 12 | |||
| 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) { | |||
| 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); | |||
| anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_SO_BUFFER), sob) { | |||
| #if GEN_GEN < 12 | |||
| 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.SurfaceBaseAddress = dst; | |||