diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c index aec8ebe1223..67b55a9caff 100644 --- a/src/intel/vulkan/anv_blorp.c +++ b/src/intel/vulkan/anv_blorp.c @@ -1347,7 +1347,7 @@ anv_cmd_buffer_alloc_blorp_binding_table(struct anv_cmd_buffer *cmd_buffer, /* Re-emit state base addresses so we get the new surface state base * address before we start emitting binding tables etc. */ - anv_cmd_buffer_emit_state_base_address(cmd_buffer); + anv_cmd_buffer_emit_bt_pool_base_address(cmd_buffer); *bt_state = anv_cmd_buffer_alloc_binding_table(cmd_buffer, num_entries, state_offset); diff --git a/src/intel/vulkan/anv_cmd_buffer.c b/src/intel/vulkan/anv_cmd_buffer.c index 02d558a4e0a..5db014ef63c 100644 --- a/src/intel/vulkan/anv_cmd_buffer.c +++ b/src/intel/vulkan/anv_cmd_buffer.c @@ -330,10 +330,10 @@ const struct vk_command_buffer_ops anv_cmd_buffer_ops = { }; void -anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer) +anv_cmd_buffer_emit_bt_pool_base_address(struct anv_cmd_buffer *cmd_buffer) { const struct intel_device_info *devinfo = cmd_buffer->device->info; - anv_genX(devinfo, cmd_buffer_emit_state_base_address)(cmd_buffer); + anv_genX(devinfo, cmd_buffer_emit_bt_pool_base_address)(cmd_buffer); } void diff --git a/src/intel/vulkan/anv_genX.h b/src/intel/vulkan/anv_genX.h index 4a2c65d73e2..e45216c4099 100644 --- a/src/intel/vulkan/anv_genX.h +++ b/src/intel/vulkan/anv_genX.h @@ -80,6 +80,8 @@ genX(load_image_clear_color)(struct anv_cmd_buffer *cmd_buffer, struct anv_state surface_state, const struct anv_image *image); +void genX(cmd_buffer_emit_bt_pool_base_address)(struct anv_cmd_buffer *cmd_buffer); + void genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer); void genX(cmd_buffer_apply_pipe_flushes)(struct anv_cmd_buffer *cmd_buffer); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 2ed7a411aab..d31e41c1d5d 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -4048,7 +4048,7 @@ anv_cmd_buffer_alloc_space(struct anv_cmd_buffer *cmd_buffer, VkResult anv_cmd_buffer_new_binding_table_block(struct anv_cmd_buffer *cmd_buffer); -void anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer); +void anv_cmd_buffer_emit_bt_pool_base_address(struct anv_cmd_buffer *cmd_buffer); struct anv_state anv_cmd_buffer_gfx_push_constants(struct anv_cmd_buffer *cmd_buffer); diff --git a/src/intel/vulkan/genX_cmd_buffer.c b/src/intel/vulkan/genX_cmd_buffer.c index cb54ed678ec..b756e0e4444 100644 --- a/src/intel/vulkan/genX_cmd_buffer.c +++ b/src/intel/vulkan/genX_cmd_buffer.c @@ -97,26 +97,13 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) return; struct anv_device *device = cmd_buffer->device; - uint32_t mocs = isl_mocs(&device->isl_dev, 0, false); + const uint32_t mocs = isl_mocs(&device->isl_dev, 0, false); /* If we are emitting a new state base address we probably need to re-emit * binding tables. */ cmd_buffer->state.descriptors_dirty |= ~0; -#if GFX_VERx10 >= 125 - genx_batch_emit_pipe_control(&cmd_buffer->batch, - cmd_buffer->device->info, - cmd_buffer->state.current_pipeline, - ANV_PIPE_CS_STALL_BIT); - anv_batch_emit( - &cmd_buffer->batch, GENX(3DSTATE_BINDING_TABLE_POOL_ALLOC), btpa) { - btpa.BindingTablePoolBaseAddress = - anv_cmd_buffer_surface_base_address(cmd_buffer); - btpa.BindingTablePoolBufferSize = device->physical->va.binding_table_pool.size / 4096; - btpa.MOCS = mocs; - } -#else /* GFX_VERx10 < 125 */ /* Emit a render target cache flush. * * This isn't documented anywhere in the PRM. However, it seems to be @@ -152,8 +139,15 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) sba.StatelessDataPortAccessMOCS = mocs; +#if GFX_VERx10 >= 125 + sba.SurfaceStateBaseAddress = + (struct anv_address) { .offset = + device->physical->va.internal_surface_state_pool.addr, + }; +#else sba.SurfaceStateBaseAddress = anv_cmd_buffer_surface_base_address(cmd_buffer); +#endif sba.SurfaceStateMOCS = mocs; sba.SurfaceStateBaseAddressModifyEnable = true; @@ -229,7 +223,9 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) genX(flush_pipeline_select)(cmd_buffer, gfx12_wa_pipeline); #endif -#endif /* GFX_VERx10 < 125 */ +#if GFX_VERx10 >= 125 + genX(cmd_buffer_emit_bt_pool_base_address)(cmd_buffer); +#endif /* After re-setting the surface state base address, we have to do some * cache flushing so that the sampler engine will pick up the new @@ -299,6 +295,39 @@ genX(cmd_buffer_emit_state_base_address)(struct anv_cmd_buffer *cmd_buffer) bits); } +void +genX(cmd_buffer_emit_bt_pool_base_address)(struct anv_cmd_buffer *cmd_buffer) +{ + /* If we are emitting a new state base address we probably need to re-emit + * binding tables. + */ + cmd_buffer->state.descriptors_dirty |= ~0; + +#if GFX_VERx10 >= 125 + struct anv_device *device = cmd_buffer->device; + const uint32_t mocs = isl_mocs(&device->isl_dev, 0, false); + + genx_batch_emit_pipe_control(&cmd_buffer->batch, + cmd_buffer->device->info, + cmd_buffer->state.current_pipeline, + ANV_PIPE_CS_STALL_BIT); + anv_batch_emit( + &cmd_buffer->batch, GENX(3DSTATE_BINDING_TABLE_POOL_ALLOC), btpa) { + btpa.BindingTablePoolBaseAddress = + anv_cmd_buffer_surface_base_address(cmd_buffer); + btpa.BindingTablePoolBufferSize = device->physical->va.binding_table_pool.size / 4096; + btpa.MOCS = mocs; + } + + genx_batch_emit_pipe_control(&cmd_buffer->batch, + cmd_buffer->device->info, + cmd_buffer->state.current_pipeline, + ANV_PIPE_STATE_CACHE_INVALIDATE_BIT); +#else /* GFX_VERx10 < 125 */ + genX(cmd_buffer_emit_state_base_address)(cmd_buffer); +#endif +} + static void add_surface_reloc(struct anv_cmd_buffer *cmd_buffer, struct anv_address addr) @@ -2228,10 +2257,10 @@ genX(cmd_buffer_flush_descriptor_sets)(struct anv_cmd_buffer *cmd_buffer, if (result != VK_SUCCESS) return 0; - /* Re-emit state base addresses so we get the new surface state base + /* Re-emit the BT base address so we get the new surface state base * address before we start emitting binding tables etc. */ - genX(cmd_buffer_emit_state_base_address)(cmd_buffer); + genX(cmd_buffer_emit_bt_pool_base_address)(cmd_buffer); /* Re-emit all active binding tables */ flushed = 0; diff --git a/src/intel/vulkan/genX_simple_shader.c b/src/intel/vulkan/genX_simple_shader.c index e34f1cd59d3..7ec6fd5afdd 100644 --- a/src/intel/vulkan/genX_simple_shader.c +++ b/src/intel/vulkan/genX_simple_shader.c @@ -291,7 +291,7 @@ genX(emit_simpler_shader_init_fragment)(struct anv_simple_shader *state) /* Re-emit state base addresses so we get the new surface state base * address before we start emitting binding tables etc. */ - genX(cmd_buffer_emit_state_base_address)(state->cmd_buffer); + genX(cmd_buffer_emit_bt_pool_base_address)(state->cmd_buffer); state->bt_state = anv_cmd_buffer_alloc_binding_table(state->cmd_buffer, 1, &bt_offset);