diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 7992c5e007c..fd9ad55c21f 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -3627,6 +3627,17 @@ VkResult anv_CreateDevice( goto fail_trivial_batch; anv_genX(device->info, init_cps_device_state)(device); + + if (device->vk.enabled_extensions.EXT_descriptor_buffer) { + device->cps_states_db = + anv_state_pool_alloc(&device->dynamic_state_db_pool, + device->cps_states.alloc_size, 32); + if (device->cps_states_db.map == NULL) + goto fail_trivial_batch; + + memcpy(device->cps_states_db.map, device->cps_states.map, + device->cps_states.alloc_size); + } } if (device->physical->indirect_descriptors) { @@ -3933,6 +3944,7 @@ void anv_DestroyDevice( anv_state_pool_free(&device->dynamic_state_pool, device->cps_states); anv_state_pool_free(&device->dynamic_state_pool, device->breakpoint); if (device->vk.enabled_extensions.EXT_descriptor_buffer) { + anv_state_pool_free(&device->dynamic_state_db_pool, device->cps_states_db); anv_state_pool_free(&device->dynamic_state_db_pool, device->slice_hash_db); anv_state_pool_free(&device->dynamic_state_db_pool, device->border_colors_db); anv_state_reserved_pool_finish(&device->custom_border_colors_db); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 6b6cffcc305..26d51dcb324 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1789,6 +1789,7 @@ struct anv_device { * array. */ struct anv_state cps_states; + struct anv_state cps_states_db; uint32_t queue_count; struct anv_queue * queues; @@ -3584,6 +3585,12 @@ struct anv_cmd_ray_tracing_state { size_t build_priv_mem_size; }; +enum anv_cmd_descriptor_buffer_mode { + ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN, + ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY, + ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER, +}; + /** State required while building cmd buffer */ struct anv_cmd_state { /* PIPELINE_SELECT.PipelineSelection */ @@ -3597,6 +3604,13 @@ struct anv_cmd_state { enum anv_pipe_bits pending_pipe_bits; + /** + * Whether the last programmed STATE_BASE_ADDRESS references + * anv_device::dynamic_state_pool or anv_device::dynamic_state_pool_db for + * the dynamic state heap. + */ + enum anv_cmd_descriptor_buffer_mode current_db_mode; + struct { /** * Tracks operations susceptible to interfere with queries in the diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index 2a88ffba431..cb54ed678ec 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -2482,6 +2482,8 @@ genX(BeginCommandBuffer)( cmd_buffer->usage_flags = pBeginInfo->flags; + cmd_buffer->state.current_db_mode = ANV_CMD_DESCRIPTOR_BUFFER_MODE_LEGACY; + /* VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT must be ignored for * primary level command buffers. * diff --git a/src/intel/vulkan/genX_gfx_state.c b/src/intel/vulkan/genX_gfx_state.c index d190f1e57c0..e9f26070265 100644 --- a/src/intel/vulkan/genX_gfx_state.c +++ b/src/intel/vulkan/genX_gfx_state.c @@ -93,11 +93,19 @@ genX(streamout_prologue)(struct anv_cmd_buffer *cmd_buffer) #if GFX_VER >= 12 static uint32_t -get_cps_state_offset(struct anv_device *device, bool cps_enabled, +get_cps_state_offset(struct anv_cmd_buffer *cmd_buffer, bool cps_enabled, const struct vk_fragment_shading_rate_state *fsr) { - if (!cps_enabled) - return device->cps_states.offset; + struct anv_device *device = cmd_buffer->device; + + if (!cps_enabled) { + assert(cmd_buffer->state.current_db_mode != + ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN); + return cmd_buffer->state.current_db_mode == + ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER ? + device->cps_states_db.offset : + device->cps_states.offset; + } uint32_t offset; static const uint32_t size_index[] = { @@ -122,7 +130,12 @@ get_cps_state_offset(struct anv_device *device, bool cps_enabled, offset *= MAX_VIEWPORTS * GENX(CPS_STATE_length) * 4; - return device->cps_states.offset + offset; + assert(cmd_buffer->state.current_db_mode != + ANV_CMD_DESCRIPTOR_BUFFER_MODE_UNKNOWN); + return (cmd_buffer->state.current_db_mode == + ANV_CMD_DESCRIPTOR_BUFFER_MODE_BUFFER ? + device->cps_states_db.offset : + device->cps_states.offset) + offset; } #endif /* GFX_VER >= 12 */ @@ -589,7 +602,7 @@ genX(cmd_buffer_flush_gfx_runtime_state)(struct anv_cmd_buffer *cmd_buffer) SET(CPS, cps.MinCPSizeY, dyn->fsr.fragment_size.height); #elif GFX_VER >= 12 SET(CPS, cps.CoarsePixelShadingStateArrayPointer, - get_cps_state_offset(device, cps_enable, &dyn->fsr)); + get_cps_state_offset(cmd_buffer, cps_enable, &dyn->fsr)); #endif } #endif /* GFX_VER >= 11 */