Commit 2e5042a3 by Chris Forbes

Refactor multiview support to remove some redundancy

Bug: b/119621736 Change-Id: I9be8dc680f68622e795fccf4ff8213dccd5debb2 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/35488Tested-by: 's avatarChris Forbes <chrisforbes@google.com> Presubmit-Ready: Chris Forbes <chrisforbes@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 79370726
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
#include "VkRenderPass.hpp" #include "VkRenderPass.hpp"
#include <algorithm> #include <algorithm>
#include <memory.h> #include <memory.h>
#include <System/Math.hpp>
namespace vk namespace vk
{ {
...@@ -65,34 +64,24 @@ void Framebuffer::clear(const RenderPass* renderPass, uint32_t clearValueCount, ...@@ -65,34 +64,24 @@ void Framebuffer::clear(const RenderPass* renderPass, uint32_t clearValueCount,
(clearStencil ? VK_IMAGE_ASPECT_STENCIL_BIT : 0); (clearStencil ? VK_IMAGE_ASPECT_STENCIL_BIT : 0);
if (renderPass->isMultiView()) if (renderPass->isMultiView())
{ {
auto viewMask = renderPass->getAttachmentViewMask(i); attachments[i]->clearWithLayerMask(pClearValues[i], aspectMask, renderArea, renderPass->getAttachmentViewMask(i));
while (viewMask)
{
uint32_t view = sw::log2i(viewMask);
viewMask &= ~(1 << view);
VkClearRect r{renderArea, view, 1};
attachments[i]->clear(pClearValues[i], aspectMask, r);
}
} }
else else
{
attachments[i]->clear(pClearValues[i], aspectMask, renderArea); attachments[i]->clear(pClearValues[i], aspectMask, renderArea);
}
} }
} }
else if(attachment.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR) else if(attachment.loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR)
{ {
if (renderPass->isMultiView()) if (renderPass->isMultiView())
{ {
auto viewMask = renderPass->getAttachmentViewMask(i); attachments[i]->clearWithLayerMask(pClearValues[i], VK_IMAGE_ASPECT_COLOR_BIT, renderArea, renderPass->getAttachmentViewMask(i));
while (viewMask)
{
uint32_t view = sw::log2i(viewMask);
viewMask &= ~(1 << view);
VkClearRect r{renderArea, view, 1};
attachments[i]->clear(pClearValues[i], VK_IMAGE_ASPECT_COLOR_BIT, r);
}
} }
else else
{
attachments[i]->clear(pClearValues[i], VK_IMAGE_ASPECT_COLOR_BIT, renderArea); attachments[i]->clear(pClearValues[i], VK_IMAGE_ASPECT_COLOR_BIT, renderArea);
}
} }
} }
} }
...@@ -101,48 +90,39 @@ void Framebuffer::clearAttachment(const RenderPass* renderPass, uint32_t subpass ...@@ -101,48 +90,39 @@ void Framebuffer::clearAttachment(const RenderPass* renderPass, uint32_t subpass
{ {
VkSubpassDescription subpass = renderPass->getSubpass(subpassIndex); VkSubpassDescription subpass = renderPass->getSubpass(subpassIndex);
if(attachment.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT) if (attachment.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT)
{ {
if(attachment.colorAttachment != VK_ATTACHMENT_UNUSED) if (attachment.colorAttachment != VK_ATTACHMENT_UNUSED)
{ {
ASSERT(attachment.colorAttachment < subpass.colorAttachmentCount); ASSERT(attachment.colorAttachment < subpass.colorAttachmentCount);
ASSERT(subpass.pColorAttachments[attachment.colorAttachment].attachment < attachmentCount); ASSERT(subpass.pColorAttachments[attachment.colorAttachment].attachment < attachmentCount);
ImageView *imageView = attachments[subpass.pColorAttachments[attachment.colorAttachment].attachment];
if (renderPass->isMultiView()) if (renderPass->isMultiView())
{ {
auto viewMask = renderPass->getViewMask(subpassIndex); imageView->clearWithLayerMask(attachment.clearValue, attachment.aspectMask, rect.rect,
while (viewMask) renderPass->getViewMask(subpassIndex));
{
int view = sw::log2i(viewMask);
viewMask &= ~(1 << view);
VkClearRect r = rect;
r.baseArrayLayer = view;
attachments[subpass.pColorAttachments[attachment.colorAttachment].attachment]->clear(attachment.clearValue, attachment.aspectMask, r);
}
} }
else else
attachments[subpass.pColorAttachments[attachment.colorAttachment].attachment]->clear( {
attachment.clearValue, attachment.aspectMask, rect); imageView->clear(attachment.clearValue, attachment.aspectMask, rect);
}
} }
} }
else if(attachment.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) else if (attachment.aspectMask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))
{ {
ASSERT(subpass.pDepthStencilAttachment->attachment < attachmentCount); ASSERT(subpass.pDepthStencilAttachment->attachment < attachmentCount);
ImageView *imageView = attachments[subpass.pDepthStencilAttachment->attachment];
if (renderPass->isMultiView()) if (renderPass->isMultiView())
{ {
auto viewMask = renderPass->getViewMask(subpassIndex); imageView->clearWithLayerMask(attachment.clearValue, attachment.aspectMask, rect.rect,
while (viewMask) renderPass->getViewMask(subpassIndex));
{ }
int view = sw::log2i(viewMask);
viewMask &= ~(1 << view);
VkClearRect r = rect;
r.baseArrayLayer = view;
attachments[subpass.pDepthStencilAttachment->attachment]->clear(attachment.clearValue, attachment.aspectMask, r);
}
}
else else
attachments[subpass.pDepthStencilAttachment->attachment]->clear(attachment.clearValue, attachment.aspectMask, rect); {
imageView->clear(attachment.clearValue, attachment.aspectMask, rect);
}
} }
} }
...@@ -161,19 +141,15 @@ void Framebuffer::resolve(const RenderPass* renderPass, uint32_t subpassIndex) ...@@ -161,19 +141,15 @@ void Framebuffer::resolve(const RenderPass* renderPass, uint32_t subpassIndex)
uint32_t resolveAttachment = subpass.pResolveAttachments[i].attachment; uint32_t resolveAttachment = subpass.pResolveAttachments[i].attachment;
if(resolveAttachment != VK_ATTACHMENT_UNUSED) if(resolveAttachment != VK_ATTACHMENT_UNUSED)
{ {
ImageView *imageView = attachments[subpass.pColorAttachments[i].attachment];
if (renderPass->isMultiView()) if (renderPass->isMultiView())
{ {
auto viewMask = renderPass->getViewMask(subpassIndex); imageView->resolveWithLayerMask(attachments[resolveAttachment],
while (viewMask) renderPass->getViewMask(subpassIndex));
{
int view = sw::log2i(viewMask);
viewMask &= ~(1 << view);
attachments[subpass.pColorAttachments[i].attachment]->resolve(attachments[resolveAttachment], view);
}
} }
else else
{ {
attachments[subpass.pColorAttachments[i].attachment]->resolve(attachments[resolveAttachment]); imageView->resolve(attachments[resolveAttachment]);
} }
} }
} }
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "VkImageView.hpp" #include "VkImageView.hpp"
#include "VkImage.hpp" #include "VkImage.hpp"
#include <System/Math.hpp>
namespace namespace
{ {
...@@ -154,6 +155,18 @@ void ImageView::clear(const VkClearValue& clearValue, const VkImageAspectFlags a ...@@ -154,6 +155,18 @@ void ImageView::clear(const VkClearValue& clearValue, const VkImageAspectFlags a
image->clear(clearValue, format, renderArea.rect, sr); image->clear(clearValue, format, renderArea.rect, sr);
} }
void ImageView::clearWithLayerMask(const VkClearValue &clearValue, VkImageAspectFlags aspectMask, const VkRect2D &renderArea, uint32_t layerMask)
{
while (layerMask)
{
uint32_t layer = sw::log2i(layerMask);
layerMask &= ~(1 << layer);
VkClearRect r = {renderArea, layer, 1};
r.baseArrayLayer = layer;
clear(clearValue, aspectMask, r);
}
}
void ImageView::resolve(ImageView* resolveAttachment, int layer) void ImageView::resolve(ImageView* resolveAttachment, int layer)
{ {
if((subresourceRange.levelCount != 1) || (resolveAttachment->subresourceRange.levelCount != 1)) if((subresourceRange.levelCount != 1) || (resolveAttachment->subresourceRange.levelCount != 1))
...@@ -214,6 +227,16 @@ void ImageView::resolve(ImageView* resolveAttachment) ...@@ -214,6 +227,16 @@ void ImageView::resolve(ImageView* resolveAttachment)
image->copyTo(resolveAttachment->image, region); image->copyTo(resolveAttachment->image, region);
} }
void ImageView::resolveWithLayerMask(ImageView *resolveAttachment, uint32_t layerMask)
{
while (layerMask)
{
int layer = sw::log2i(layerMask);
layerMask &= ~(1 << layer);
resolve(resolveAttachment, layer);
}
}
const Image* ImageView::getImage(Usage usage) const const Image* ImageView::getImage(Usage usage) const
{ {
switch(usage) switch(usage)
......
...@@ -41,8 +41,10 @@ public: ...@@ -41,8 +41,10 @@ public:
void clear(const VkClearValue& clearValues, VkImageAspectFlags aspectMask, const VkRect2D& renderArea); void clear(const VkClearValue& clearValues, VkImageAspectFlags aspectMask, const VkRect2D& renderArea);
void clear(const VkClearValue& clearValue, VkImageAspectFlags aspectMask, const VkClearRect& renderArea); void clear(const VkClearValue& clearValue, VkImageAspectFlags aspectMask, const VkClearRect& renderArea);
void clearWithLayerMask(const VkClearValue &clearValue, VkImageAspectFlags aspectMask, const VkRect2D &renderArea, uint32_t layerMask);
void resolve(ImageView* resolveAttachment); void resolve(ImageView* resolveAttachment);
void resolve(ImageView* resolveAttachment, int layer); void resolve(ImageView* resolveAttachment, int layer);
void resolveWithLayerMask(ImageView *resolveAttachment, uint32_t layerMask);
VkImageViewType getType() const { return viewType; } VkImageViewType getType() const { return viewType; }
Format getFormat(Usage usage = RAW) const; Format getFormat(Usage usage = RAW) const;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment