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);
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,
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++)
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;
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;