diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2020-09-28 18:35:40 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2020-09-28 18:35:40 +0000 |
| commit | 010aaab94dc6c199d384462665609074a9d34222 (patch) | |
| tree | ee60b1f2741c8423d8e6fa1202a642c83f49cd43 /Graphics/GraphicsEngineVulkan | |
| parent | Added initial implementations of Metal backend tests (diff) | |
| download | DiligentCore-010aaab94dc6c199d384462665609074a9d34222.tar.gz DiligentCore-010aaab94dc6c199d384462665609074a9d34222.zip | |
Vulkan backend: few fixes to
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
3 files changed, 20 insertions, 13 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp b/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp index ebb1ea22..5261235a 100644 --- a/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp +++ b/Graphics/GraphicsEngineVulkan/src/EngineFactoryVk.cpp @@ -253,7 +253,7 @@ void EngineFactoryVkImpl::CreateDeviceAndContextsVk(const EngineVkCreateInfo& _E if (EngineCI.Features.MeshShaders == DEVICE_FEATURE_STATE_ENABLED && !MeshShadersSupported) LOG_ERROR_AND_THROW("Mesh shaders are not supported by this device"); - // The actual state of Features.MeshShaders in device caps is set by VulkanLogicalDevice + // The actual state of Features.MeshShaders in device caps is set by RenderDeviceVkImpl #if defined(_MSC_VER) && defined(_WIN64) static_assert(sizeof(DeviceFeatures) == 23, "Did you add a new feature to DeviceFeatures? Please handle its satus here."); diff --git a/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp index c010e460..63792bc5 100644 --- a/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/RenderPassVkImpl.cpp @@ -136,15 +136,22 @@ RenderPassVkImpl::RenderPassVkImpl(IReferenceCounters* pRefCounters, std::vector<VkSubpassDependency> vkDependencies(Desc.DependencyCount); for (Uint32 i = 0; i < Desc.DependencyCount; ++i) { - const auto& DependencyDesc = m_Desc.pDependencies[i]; - auto& vkDependency = vkDependencies[i]; - vkDependency.srcSubpass = DependencyDesc.SrcSubpass; - vkDependency.dstSubpass = DependencyDesc.DstSubpass; - vkDependency.srcStageMask = DependencyDesc.SrcStageMask; - vkDependency.dstStageMask = DependencyDesc.DstStageMask; - vkDependency.srcAccessMask = DependencyDesc.SrcAccessMask; - vkDependency.dstAccessMask = DependencyDesc.DstAccessMask; - vkDependency.dependencyFlags = 0; + const auto& DependencyDesc = m_Desc.pDependencies[i]; + auto& vkDependency = vkDependencies[i]; + vkDependency.srcSubpass = DependencyDesc.SrcSubpass; + vkDependency.dstSubpass = DependencyDesc.DstSubpass; + vkDependency.srcStageMask = DependencyDesc.SrcStageMask; + vkDependency.dstStageMask = DependencyDesc.DstStageMask; + vkDependency.srcAccessMask = DependencyDesc.SrcAccessMask; + vkDependency.dstAccessMask = DependencyDesc.DstAccessMask; + + // VK_DEPENDENCY_BY_REGION_BIT specifies that dependencies will be framebuffer-local. + // Framebuffer-local dependencies are more optimal for most architectures; particularly + // tile-based architectures - which can keep framebuffer-regions entirely in on-chip registers + // and thus avoid external bandwidth across such a dependency. Including a framebuffer-global + // dependency in your rendering will usually force all implementations to flush data to memory, + // or to a higher level cache, breaking any potential locality optimizations. + vkDependency.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT; } RenderPassCI.dependencyCount = Desc.DependencyCount; RenderPassCI.pDependencies = vkDependencies.data(); diff --git a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp index 25966163..c9336b79 100644 --- a/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp +++ b/Graphics/GraphicsEngineVulkan/src/VulkanTypeConversions.cpp @@ -1172,10 +1172,10 @@ static VkAccessFlags ResourceStateFlagToVkAccessFlags(RESOURCE_STATE StateFlag) case RESOURCE_STATE_INDIRECT_ARGUMENT: return VK_ACCESS_INDIRECT_COMMAND_READ_BIT; case RESOURCE_STATE_COPY_DEST: return VK_ACCESS_TRANSFER_WRITE_BIT; case RESOURCE_STATE_COPY_SOURCE: return VK_ACCESS_TRANSFER_READ_BIT; - case RESOURCE_STATE_RESOLVE_DEST: return VK_ACCESS_MEMORY_READ_BIT; - case RESOURCE_STATE_RESOLVE_SOURCE: return VK_ACCESS_MEMORY_WRITE_BIT; + case RESOURCE_STATE_RESOLVE_DEST: return VK_ACCESS_TRANSFER_WRITE_BIT; + case RESOURCE_STATE_RESOLVE_SOURCE: return VK_ACCESS_TRANSFER_READ_BIT; case RESOURCE_STATE_INPUT_ATTACHMENT: return VK_ACCESS_INPUT_ATTACHMENT_READ_BIT; - case RESOURCE_STATE_PRESENT: return VK_ACCESS_MEMORY_READ_BIT; + case RESOURCE_STATE_PRESENT: return 0; // clang-format on default: |
