mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-04 00:30:11 +01:00
vk: Use a separate block pool and state stream for binding tables
The binding table pointers packet only allows for a 16-bit binding table address so all binding tables have to be in the first 64 KB of the surface state BO. We solve this by adding a slave block pool that pulls off the first 64 KB worth of blocks and reserves them for binding tables.
This commit is contained in:
parent
d24f8245db
commit
923691c70d
2 changed files with 15 additions and 1 deletions
|
|
@ -321,6 +321,15 @@ VkResult anv_CreateDevice(
|
|||
anv_block_pool_init(&device->instruction_block_pool, device, 2048);
|
||||
anv_block_pool_init(&device->surface_state_block_pool, device, 2048);
|
||||
|
||||
|
||||
/* Binding table pointers are only 16 bits so we have to make sure that
|
||||
* they get allocated at the beginning of the surface state BO. To
|
||||
* handle this, we create a separate block pool that works out of the
|
||||
* first 64 KB of the surface state BO.
|
||||
*/
|
||||
anv_block_pool_init_slave(&device->binding_table_block_pool,
|
||||
&device->surface_state_block_pool, 32);
|
||||
|
||||
anv_state_pool_init(&device->surface_state_pool,
|
||||
&device->surface_state_block_pool);
|
||||
|
||||
|
|
@ -2077,6 +2086,8 @@ VkResult anv_CreateCommandBuffer(
|
|||
goto fail_exec2_objects;
|
||||
}
|
||||
|
||||
anv_state_stream_init(&cmd_buffer->binding_table_state_stream,
|
||||
&device->binding_table_block_pool);
|
||||
anv_state_stream_init(&cmd_buffer->surface_state_stream,
|
||||
&device->surface_state_block_pool);
|
||||
anv_state_stream_init(&cmd_buffer->dynamic_state_stream,
|
||||
|
|
@ -2469,7 +2480,8 @@ flush_descriptor_sets(struct anv_cmd_buffer *cmd_buffer)
|
|||
uint32_t size;
|
||||
|
||||
size = (bias + surface_count) * sizeof(uint32_t);
|
||||
state = anv_state_stream_alloc(&cmd_buffer->surface_state_stream, size, 32);
|
||||
state = anv_state_stream_alloc(&cmd_buffer->binding_table_state_stream,
|
||||
size, 32);
|
||||
memcpy(state.map, bindings->descriptors[s].surfaces, size);
|
||||
|
||||
for (uint32_t i = 0; i < layers; i++)
|
||||
|
|
|
|||
|
|
@ -293,6 +293,7 @@ struct anv_device {
|
|||
|
||||
struct anv_block_pool instruction_block_pool;
|
||||
struct anv_block_pool surface_state_block_pool;
|
||||
struct anv_block_pool binding_table_block_pool;
|
||||
struct anv_state_pool surface_state_pool;
|
||||
|
||||
struct anv_clear_state clear_state;
|
||||
|
|
@ -548,6 +549,7 @@ struct anv_cmd_buffer {
|
|||
|
||||
uint32_t bo_count;
|
||||
struct anv_batch batch;
|
||||
struct anv_state_stream binding_table_state_stream;
|
||||
struct anv_state_stream surface_state_stream;
|
||||
struct anv_state_stream dynamic_state_stream;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue