From: Jason Ekstrand Date: Wed, 11 Nov 2015 00:42:34 +0000 (-0800) Subject: anv/gen7: Implement the VS state depth-stall workaround X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3a3d79b38e27babab7c5b2d79032e0879d6a7c44;p=mesa.git anv/gen7: Implement the VS state depth-stall workaround --- diff --git a/src/vulkan/anv_device.c b/src/vulkan/anv_device.c index 3c6760b832d..1328516c48e 100644 --- a/src/vulkan/anv_device.c +++ b/src/vulkan/anv_device.c @@ -667,6 +667,8 @@ VkResult anv_CreateDevice( anv_state_pool_init(&device->surface_state_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); device->info = *physical_device->info; @@ -705,6 +707,9 @@ void anv_DestroyDevice( anv_state_pool_free(&device->dynamic_state_pool, device->border_colors); #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_state_pool_finish(&device->dynamic_state_pool); anv_block_pool_finish(&device->dynamic_state_block_pool); diff --git a/src/vulkan/anv_private.h b/src/vulkan/anv_private.h index 8a8fe8d04a4..a60c679cede 100644 --- a/src/vulkan/anv_private.h +++ b/src/vulkan/anv_private.h @@ -497,6 +497,8 @@ struct anv_device { struct anv_block_pool surface_state_block_pool; struct anv_state_pool surface_state_pool; + struct anv_bo workaround_bo; + struct anv_meta_state meta_state; struct anv_state border_colors; diff --git a/src/vulkan/gen7_cmd_buffer.c b/src/vulkan/gen7_cmd_buffer.c index b3619df2c2e..5ebf129a802 100644 --- a/src/vulkan/gen7_cmd_buffer.c +++ b/src/vulkan/gen7_cmd_buffer.c @@ -287,6 +287,24 @@ gen7_cmd_buffer_flush_state(struct anv_cmd_buffer *cmd_buffer) 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) anv_flush_descriptor_sets(cmd_buffer); diff --git a/src/vulkan/gen7_pipeline.c b/src/vulkan/gen7_pipeline.c index 6eed60dbd3d..1fed33a53d1 100644 --- a/src/vulkan/gen7_pipeline.c +++ b/src/vulkan/gen7_pipeline.c @@ -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_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, .ConstantBufferOffset = 0, .ConstantBufferSize = 4);