anv/gen7: Implement the VS state depth-stall workaround

This commit is contained in:
Jason Ekstrand
2015-11-10 16:42:34 -08:00
parent 750b8f9e98
commit 3a3d79b38e
4 changed files with 38 additions and 0 deletions

View File

@@ -667,6 +667,8 @@ VkResult anv_CreateDevice(
anv_state_pool_init(&device->surface_state_pool, anv_state_pool_init(&device->surface_state_pool,
&device->surface_state_block_pool); &device->surface_state_block_pool);
anv_bo_init_new(&device->workaround_bo, device, 1024);
anv_block_pool_init(&device->scratch_block_pool, device, 0x10000); anv_block_pool_init(&device->scratch_block_pool, device, 0x10000);
device->info = *physical_device->info; device->info = *physical_device->info;
@@ -705,6 +707,9 @@ void anv_DestroyDevice(
anv_state_pool_free(&device->dynamic_state_pool, device->border_colors); anv_state_pool_free(&device->dynamic_state_pool, device->border_colors);
#endif #endif
anv_gem_munmap(device->workaround_bo.map, device->workaround_bo.size);
anv_gem_close(device, device->workaround_bo.gem_handle);
anv_bo_pool_finish(&device->batch_bo_pool); anv_bo_pool_finish(&device->batch_bo_pool);
anv_state_pool_finish(&device->dynamic_state_pool); anv_state_pool_finish(&device->dynamic_state_pool);
anv_block_pool_finish(&device->dynamic_state_block_pool); anv_block_pool_finish(&device->dynamic_state_block_pool);

View File

@@ -497,6 +497,8 @@ struct anv_device {
struct anv_block_pool surface_state_block_pool; struct anv_block_pool surface_state_block_pool;
struct anv_state_pool surface_state_pool; struct anv_state_pool surface_state_pool;
struct anv_bo workaround_bo;
struct anv_meta_state meta_state; struct anv_meta_state meta_state;
struct anv_state border_colors; struct anv_state border_colors;

View File

@@ -287,6 +287,24 @@ gen7_cmd_buffer_flush_state(struct anv_cmd_buffer *cmd_buffer)
anv_batch_emit_batch(&cmd_buffer->batch, &pipeline->batch); anv_batch_emit_batch(&cmd_buffer->batch, &pipeline->batch);
} }
if (cmd_buffer->state.descriptors_dirty & VK_SHADER_STAGE_VERTEX_BIT ||
cmd_buffer->state.push_constants_dirty & VK_SHADER_STAGE_VERTEX_BIT) {
/* From the IVB PRM Vol. 2, Part 1, Section 3.2.1:
*
* "A PIPE_CONTROL with Post-Sync Operation set to 1h and a depth
* stall needs to be sent just prior to any 3DSTATE_VS,
* 3DSTATE_URB_VS, 3DSTATE_CONSTANT_VS,
* 3DSTATE_BINDING_TABLE_POINTER_VS,
* 3DSTATE_SAMPLER_STATE_POINTER_VS command. Only one
* PIPE_CONTROL needs to be sent before any combination of VS
* associated 3DSTATE."
*/
anv_batch_emit(&cmd_buffer->batch, GEN7_PIPE_CONTROL,
.DepthStallEnable = true,
.PostSyncOperation = WriteImmediateData,
.Address = { &cmd_buffer->device->workaround_bo, 0 });
}
if (cmd_buffer->state.descriptors_dirty) if (cmd_buffer->state.descriptors_dirty)
anv_flush_descriptor_sets(cmd_buffer); anv_flush_descriptor_sets(cmd_buffer);

View File

@@ -380,6 +380,19 @@ gen7_graphics_pipeline_create(
anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_DS, .DSFunctionEnable = false); anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_DS, .DSFunctionEnable = false);
anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_STREAMOUT, .SOFunctionEnable = false); anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_STREAMOUT, .SOFunctionEnable = false);
/* From the IVB PRM Vol. 2, Part 1, Section 3.2.1:
*
* "A PIPE_CONTROL with Post-Sync Operation set to 1h and a depth stall
* needs to be sent just prior to any 3DSTATE_VS, 3DSTATE_URB_VS,
* 3DSTATE_CONSTANT_VS, 3DSTATE_BINDING_TABLE_POINTER_VS,
* 3DSTATE_SAMPLER_STATE_POINTER_VS command. Only one PIPE_CONTROL
* needs to be sent before any combination of VS associated 3DSTATE."
*/
anv_batch_emit(&pipeline->batch, GEN7_PIPE_CONTROL,
.DepthStallEnable = true,
.PostSyncOperation = WriteImmediateData,
.Address = { &device->workaround_bo, 0 });
anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_VS, anv_batch_emit(&pipeline->batch, GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_VS,
.ConstantBufferOffset = 0, .ConstantBufferOffset = 0,
.ConstantBufferSize = 4); .ConstantBufferSize = 4);