diff options
author | Jason Ekstrand <[email protected]> | 2015-06-10 16:37:31 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2015-06-10 16:37:33 -0700 |
commit | 29d2bbb2b512dae78eb7eb29d1562c7a550806d3 (patch) | |
tree | cc6e3da6609a323fd0d454a70cdf701aa0d5edde /src | |
parent | 047ed02723071d7eccbed3210b5be6ae73603a53 (diff) |
vk/cmd: Add an initial implementation of PipelineBarrier
We may want to do something more inteligent here later such as actually
handling image layout transitions. However, this should do for now.
Diffstat (limited to 'src')
-rw-r--r-- | src/vulkan/device.c | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/src/vulkan/device.c b/src/vulkan/device.c index 39d818d2656..8cb5b3f8c93 100644 --- a/src/vulkan/device.c +++ b/src/vulkan/device.c @@ -3341,7 +3341,119 @@ void anv_CmdPipelineBarrier( uint32_t memBarrierCount, const void** ppMemBarriers) { - stub(); + struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer; + uint32_t b, *dw; + + struct GEN8_PIPE_CONTROL cmd = { + GEN8_PIPE_CONTROL_header, + .PostSyncOperation = NoWrite, + }; + + /* XXX: I think waitEvent is a no-op on our HW. We should verify that. */ + + for (uint32_t i = 0; i < pipeEventCount; i++) { + switch (pPipeEvents[i]) { + case VK_PIPE_EVENT_TOP_OF_PIPE: + /* This is just what PIPE_CONTROL does */ + break; + case VK_PIPE_EVENT_VERTEX_PROCESSING_COMPLETE: + case VK_PIPE_EVENT_LOCAL_FRAGMENT_PROCESSING_COMPLETE: + case VK_PIPE_EVENT_FRAGMENT_PROCESSING_COMPLETE: + cmd.StallAtPixelScoreboard = true; + break; + case VK_PIPE_EVENT_GRAPHICS_PIPELINE_COMPLETE: + case VK_PIPE_EVENT_COMPUTE_PIPELINE_COMPLETE: + case VK_PIPE_EVENT_TRANSFER_COMPLETE: + case VK_PIPE_EVENT_COMMANDS_COMPLETE: + cmd.CommandStreamerStallEnable = true; + break; + default: + unreachable("Invalid VkPipeEvent"); + } + } + + /* XXX: Right now, we're really dumb and just flush whatever categories + * the app asks for. One of these days we may make this a bit better + * but right now that's all the hardware allows for in most areas. + */ + VkMemoryOutputFlags out_flags = 0; + VkMemoryInputFlags in_flags = 0; + + for (uint32_t i = 0; i < memBarrierCount; i++) { + const struct anv_common *common = ppMemBarriers[i]; + switch (common->sType) { + case VK_STRUCTURE_TYPE_MEMORY_BARRIER: { + const VkMemoryBarrier *barrier = (VkMemoryBarrier *)common; + out_flags |= barrier->outputMask; + in_flags |= barrier->inputMask; + break; + } + case VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER: { + const VkBufferMemoryBarrier *barrier = (VkBufferMemoryBarrier *)common; + out_flags |= barrier->outputMask; + in_flags |= barrier->inputMask; + break; + } + case VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER: { + const VkImageMemoryBarrier *barrier = (VkImageMemoryBarrier *)common; + out_flags |= barrier->outputMask; + in_flags |= barrier->inputMask; + break; + } + default: + unreachable("Invalid memory barrier type"); + } + } + + for_each_bit(b, out_flags) { + switch ((VkMemoryOutputFlags)(1 << b)) { + case VK_MEMORY_OUTPUT_CPU_WRITE_BIT: + break; /* FIXME: Little-core systems */ + case VK_MEMORY_OUTPUT_SHADER_WRITE_BIT: + cmd.DCFlushEnable = true; + break; + case VK_MEMORY_OUTPUT_COLOR_ATTACHMENT_BIT: + cmd.RenderTargetCacheFlushEnable = true; + break; + case VK_MEMORY_OUTPUT_DEPTH_STENCIL_ATTACHMENT_BIT: + cmd.DepthCacheFlushEnable = true; + break; + case VK_MEMORY_OUTPUT_TRANSFER_BIT: + cmd.RenderTargetCacheFlushEnable = true; + cmd.DepthCacheFlushEnable = true; + break; + default: + unreachable("Invalid memory output flag"); + } + } + + for_each_bit(b, out_flags) { + switch ((VkMemoryInputFlags)(1 << b)) { + case VK_MEMORY_INPUT_CPU_READ_BIT: + break; /* FIXME: Little-core systems */ + case VK_MEMORY_INPUT_INDIRECT_COMMAND_BIT: + case VK_MEMORY_INPUT_INDEX_FETCH_BIT: + case VK_MEMORY_INPUT_VERTEX_ATTRIBUTE_FETCH_BIT: + cmd.VFCacheInvalidationEnable = true; + break; + case VK_MEMORY_INPUT_UNIFORM_READ_BIT: + cmd.ConstantCacheInvalidationEnable = true; + /* fallthrough */ + case VK_MEMORY_INPUT_SHADER_READ_BIT: + cmd.DCFlushEnable = true; + cmd.TextureCacheInvalidationEnable = true; + break; + case VK_MEMORY_INPUT_COLOR_ATTACHMENT_BIT: + case VK_MEMORY_INPUT_DEPTH_STENCIL_ATTACHMENT_BIT: + break; /* XXX: Hunh? */ + case VK_MEMORY_INPUT_TRANSFER_BIT: + cmd.TextureCacheInvalidationEnable = true; + break; + } + } + + dw = anv_batch_emit_dwords(&cmd_buffer->batch, GEN8_PIPE_CONTROL_length); + GEN8_PIPE_CONTROL_pack(&cmd_buffer->batch, dw, &cmd); } void anv_CmdInitAtomicCounters( |