diff --git a/src/intel/shaders/generate_draws.cl b/src/intel/shaders/generate_draws.cl index f5a29e555aa..eff7aed6bf3 100644 --- a/src/intel/shaders/generate_draws.cl +++ b/src/intel/shaders/generate_draws.cl @@ -8,10 +8,9 @@ static void end_generated_draws(global void *dst_ptr, uint32_t item_idx, uint32_t draw_id, uint32_t draw_count, uint32_t ring_count, uint32_t max_draw_count, - uint32_t flags, + uint32_t flags, uint32_t _3dprim_size_B, uint64_t gen_addr, uint64_t end_addr) { - uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4; bool indirect_count = (flags & ANV_GENERATED_FLAG_COUNT) != 0; bool ring_mode = (flags & ANV_GENERATED_FLAG_RING_MODE) != 0; /* We can have an indirect draw count = 0. */ @@ -44,12 +43,13 @@ genX(libanv_write_draw)(global void *dst_base, uint32_t instance_multiplier, uint32_t max_draw_count, uint32_t flags, + uint32_t mocs, + uint32_t _3dprim_size_B, uint32_t ring_count, uint64_t gen_addr, uint64_t end_addr, uint32_t item_idx) { - uint32_t _3dprim_size_B = ((flags >> 16) & 0xff) * 4; uint32_t draw_id = draw_base + item_idx; uint32_t draw_count = *_draw_count; global void *dst_ptr = dst_base + item_idx * _3dprim_size_B; @@ -62,7 +62,6 @@ genX(libanv_write_draw)(global void *dst_base, bool uses_tbimr = (flags & ANV_GENERATED_FLAG_TBIMR) != 0; bool uses_base = (flags & ANV_GENERATED_FLAG_BASE) != 0; bool uses_drawid = (flags & ANV_GENERATED_FLAG_DRAWID) != 0; - uint32_t mocs = (flags >> 8) & 0xff; genX(write_draw)(dst_ptr, indirect_ptr, draw_id_ptr, draw_id, instance_multiplier, @@ -72,6 +71,7 @@ genX(libanv_write_draw)(global void *dst_base, } end_generated_draws(dst_ptr, item_idx, draw_id, draw_count, - ring_count, max_draw_count, flags, + ring_count, max_draw_count, + flags, _3dprim_size_B, gen_addr, end_addr); } diff --git a/src/intel/shaders/libintel_shaders.h b/src/intel/shaders/libintel_shaders.h index 53518b2d141..85956055994 100644 --- a/src/intel/shaders/libintel_shaders.h +++ b/src/intel/shaders/libintel_shaders.h @@ -46,20 +46,22 @@ typedef struct VkDrawIndirectCommand { /** * Flags for generated_draws.cl */ -#define ANV_GENERATED_FLAG_INDEXED BITFIELD_BIT(0) -#define ANV_GENERATED_FLAG_PREDICATED BITFIELD_BIT(1) -/* Only used on Gfx9, means the pipeline is using gl_DrawID */ -#define ANV_GENERATED_FLAG_DRAWID BITFIELD_BIT(2) -/* Only used on Gfx9, means the pipeline is using gl_BaseVertex or - * gl_BaseInstance - */ -#define ANV_GENERATED_FLAG_BASE BITFIELD_BIT(3) -/* Whether the count is indirect */ -#define ANV_GENERATED_FLAG_COUNT BITFIELD_BIT(4) -/* Whether the generation shader writes to the ring buffer */ -#define ANV_GENERATED_FLAG_RING_MODE BITFIELD_BIT(5) -/* Whether TBIMR tile-based rendering shall be enabled. */ -#define ANV_GENERATED_FLAG_TBIMR BITFIELD_BIT(6) +enum anv_generated_draw_flags { + ANV_GENERATED_FLAG_INDEXED = BITFIELD_BIT(0), + ANV_GENERATED_FLAG_PREDICATED = BITFIELD_BIT(1), + /* Only used on Gfx9, means the pipeline is using gl_DrawID */ + ANV_GENERATED_FLAG_DRAWID = BITFIELD_BIT(2), + /* Only used on Gfx9, means the pipeline is using gl_BaseVertex or + * gl_BaseInstance + */ + ANV_GENERATED_FLAG_BASE = BITFIELD_BIT(3), + /* Whether the count is indirect */ + ANV_GENERATED_FLAG_COUNT = BITFIELD_BIT(4), + /* Whether the generation shader writes to the ring buffer */ + ANV_GENERATED_FLAG_RING_MODE = BITFIELD_BIT(5), + /* Whether TBIMR tile-based rendering shall be enabled. */ + ANV_GENERATED_FLAG_TBIMR = BITFIELD_BIT(6), +}; /** * Flags for query_copy.cl diff --git a/src/intel/vulkan/anv_internal_kernels.h b/src/intel/vulkan/anv_internal_kernels.h index d0e325add2a..898b96db8f0 100644 --- a/src/intel/vulkan/anv_internal_kernels.h +++ b/src/intel/vulkan/anv_internal_kernels.h @@ -36,7 +36,14 @@ struct PACKED anv_gen_indirect_params { /* Stride between each elements of the indirect data buffer */ uint32_t indirect_data_stride; - uint32_t flags; /* 0-7: bits, 8-15: mocs, 16-23: cmd_dws */ + /* Bitfield of ANV_GENERATED_FLAG_* */ + uint32_t flags; + + /* MOCS to use for VERTEX_BUFFER_STATE (only used on Gfx9) */ + uint32_t mocs; + + /* 3DPRIMITIVE instruction size (in bytes) */ + uint32_t cmd_primitive_size; /* Base number of the draw ID, it is added to the index computed from the * gl_FragCoord diff --git a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h index 1448ee5aab5..11e1b5a5268 100644 --- a/src/intel/vulkan/genX_cmd_draw_generated_indirect.h +++ b/src/intel/vulkan/genX_cmd_draw_generated_indirect.h @@ -91,12 +91,12 @@ genX(cmd_buffer_emit_generate_draws)(struct anv_cmd_buffer *cmd_buffer, vs_prog_data->uses_baseinstance) ? ANV_GENERATED_FLAG_BASE : 0) | (vs_prog_data->uses_drawid ? ANV_GENERATED_FLAG_DRAWID : 0) | - (anv_mocs(device, indirect_data_addr.bo, - ISL_SURF_USAGE_VERTEX_BUFFER_BIT) << 8) | (!anv_address_is_null(count_addr) ? ANV_GENERATED_FLAG_COUNT : 0) | - (ring_count != 0 ? ANV_GENERATED_FLAG_RING_MODE : 0) | - ((generated_cmd_stride / 4) << 16), + (ring_count != 0 ? ANV_GENERATED_FLAG_RING_MODE : 0), + .mocs = anv_mocs(device, indirect_data_addr.bo, + ISL_SURF_USAGE_VERTEX_BUFFER_BIT), + .cmd_primitive_size = generated_cmd_stride, .draw_base = item_base, .max_draw_count = max_count, .ring_count = ring_count, diff --git a/src/intel/vulkan/genX_internal_kernels.c b/src/intel/vulkan/genX_internal_kernels.c index 8b8ca0f8e6b..b44acfebf9d 100644 --- a/src/intel/vulkan/genX_internal_kernels.c +++ b/src/intel/vulkan/genX_internal_kernels.c @@ -74,6 +74,8 @@ genX(call_internal_shader)(nir_builder *b, enum anv_internal_kernel_name shader_ load_param(b, 32, struct anv_gen_indirect_params, instance_multiplier), load_param(b, 32, struct anv_gen_indirect_params, max_draw_count), load_param(b, 32, struct anv_gen_indirect_params, flags), + load_param(b, 32, struct anv_gen_indirect_params, mocs), + load_param(b, 32, struct anv_gen_indirect_params, cmd_primitive_size), load_param(b, 32, struct anv_gen_indirect_params, ring_count), load_param(b, 64, struct anv_gen_indirect_params, gen_addr), load_param(b, 64, struct anv_gen_indirect_params, end_addr),