summaryrefslogtreecommitdiffstats
path: root/tools/gfx/vulkan/render-vk.cpp
diff options
context:
space:
mode:
authorKai Yao <kyao@nvidia.com>2021-10-04 13:58:51 -0700
committerGitHub <noreply@github.com>2021-10-04 13:58:51 -0700
commitda32069a0c1c8c723d7ef45100049a8f0dd5d9c4 (patch)
tree69de59f5a1e68453df9b880bd1eed3f61147f30e /tools/gfx/vulkan/render-vk.cpp
parent97bb82ebcdf8f1391b9d93b5a8d7b1dfc4e88e52 (diff)
Modified barrier API to accept multiple resources per call (#1959)
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'tools/gfx/vulkan/render-vk.cpp')
-rw-r--r--tools/gfx/vulkan/render-vk.cpp89
1 files changed, 56 insertions, 33 deletions
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index d2cbd6790..9eb0b71a1 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -4108,47 +4108,70 @@ public:
size,
data);
}
- virtual SLANG_NO_THROW void SLANG_MCALL textureBarrier(ITextureResource* texture, ResourceState src, ResourceState dst)
- {
- auto image = static_cast<TextureResourceImpl*>(texture);
- auto desc = image->getDesc();
-
- VkImageMemoryBarrier barrier = {};
- barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- barrier.image = image->m_image;
- barrier.oldLayout = translateImageLayout(src);
- barrier.newLayout = translateImageLayout(dst);
- barrier.subresourceRange.aspectMask;
- barrier.subresourceRange.baseArrayLayer = 0;
- barrier.subresourceRange.baseMipLevel = 0;
- barrier.subresourceRange.layerCount = desc->arraySize;
- barrier.subresourceRange.levelCount = desc->numMipLevels;
- barrier.srcAccessMask = calcAccessFlags(src);
- barrier.dstAccessMask = calcAccessFlags(dst);
-
- VkPipelineStageFlagBits srcStage = calcPipelineStageFlags(src, true);
- VkPipelineStageFlagBits dstStage = calcPipelineStageFlags(dst, false);
+ virtual SLANG_NO_THROW void SLANG_MCALL textureBarrier(
+ size_t count,
+ ITextureResource* const* textures,
+ ResourceState src,
+ ResourceState dst)
+ {
+ List<VkImageMemoryBarrier> barriers;
+ barriers.setCount(count);
+
+ for (size_t i = 0; i < count; i++)
+ {
+ auto image = static_cast<TextureResourceImpl*>(textures[i]);
+ auto desc = image->getDesc();
+
+ VkImageMemoryBarrier barrier = {};
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.image = image->m_image;
+ barrier.oldLayout = translateImageLayout(src);
+ barrier.newLayout = translateImageLayout(dst);
+ barrier.subresourceRange.aspectMask;
+ barrier.subresourceRange.baseArrayLayer = 0;
+ barrier.subresourceRange.baseMipLevel = 0;
+ barrier.subresourceRange.layerCount = desc->arraySize;
+ barrier.subresourceRange.levelCount = desc->numMipLevels;
+ barrier.srcAccessMask = calcAccessFlags(src);
+ barrier.dstAccessMask = calcAccessFlags(dst);
+ barriers.add(barrier);
+ }
+
+ VkPipelineStageFlagBits srcStage = calcPipelineStageFlags(src, true);
+ VkPipelineStageFlagBits dstStage = calcPipelineStageFlags(dst, false);
auto& vkApi = m_commandBuffer->m_renderer->m_api;
- vkApi.vkCmdPipelineBarrier(m_commandBuffer->m_commandBuffer, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, 1, &barrier);
+ vkApi.vkCmdPipelineBarrier(m_commandBuffer->m_commandBuffer, srcStage, dstStage, 0, 0, nullptr, 0, nullptr, count, barriers.getBuffer());
}
- virtual SLANG_NO_THROW void SLANG_MCALL bufferBarrier(IBufferResource* buffer, ResourceState src, ResourceState dst)
+ virtual SLANG_NO_THROW void SLANG_MCALL bufferBarrier(
+ size_t count,
+ IBufferResource* const* buffers,
+ ResourceState src,
+ ResourceState dst)
{
- auto bufferImpl = static_cast<BufferResourceImpl*>(buffer);
+ List<VkBufferMemoryBarrier> barriers;
+ barriers.setCount(count);
+
+ for (size_t i = 0; i < count; i++)
+ {
+ auto bufferImpl = static_cast<BufferResourceImpl*>(buffers[i]);
- VkBufferMemoryBarrier barrier = {};
- barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
- barrier.srcAccessMask = calcAccessFlags(src);
- barrier.dstAccessMask = calcAccessFlags(dst);
- barrier.buffer = bufferImpl->m_buffer.m_buffer;
- barrier.offset = 0;
- barrier.size = buffer->getDesc()->sizeInBytes;
+ VkBufferMemoryBarrier barrier = {};
+ barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
+ barrier.srcAccessMask = calcAccessFlags(src);
+ barrier.dstAccessMask = calcAccessFlags(dst);
+ barrier.buffer = bufferImpl->m_buffer.m_buffer;
+ barrier.offset = 0;
+ barrier.size = bufferImpl->getDesc()->sizeInBytes;
+
+ barriers.add(barrier);
+ }
- VkPipelineStageFlagBits srcStage = calcPipelineStageFlags(src, true);
- VkPipelineStageFlagBits dstStage = calcPipelineStageFlags(dst, false);
+ VkPipelineStageFlagBits srcStage = calcPipelineStageFlags(src, true);
+ VkPipelineStageFlagBits dstStage = calcPipelineStageFlags(dst, false);
auto& vkApi = m_commandBuffer->m_renderer->m_api;
- vkApi.vkCmdPipelineBarrier(m_commandBuffer->m_commandBuffer, srcStage, dstStage, 0, 0, nullptr, 1, &barrier, 0, nullptr);
+ vkApi.vkCmdPipelineBarrier(m_commandBuffer->m_commandBuffer, srcStage, dstStage, 0, 0, nullptr, count, barriers.getBuffer(), 0, nullptr);
}
virtual SLANG_NO_THROW void SLANG_MCALL endEncoding() override
{