anv: add new helper to update binding table pool offset
We'll want to differentiate STATE_BASE_ADDRESS from 3DSTATE_BINDING_TABLE_POOL updates. Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Ivan Briano <ivan.briano@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/22151>
This commit is contained in:
committed by
Marge Bot
parent
ef8f09148f
commit
7ba059854c
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user