Vulkan: Depth / stencil attachments bug fixes
I found a couple of bugs trying to enable polygon offset render states.
This is just pre-work to get to a better state.
Bug:angleproject:2353
Change-Id: If6af949a09af1340e870afb627ae427d01c6e77c
Reviewed-on: https://chromium-review.googlesource.com/975631
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index 13c7b58..a93ed42 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -16,6 +16,13 @@
namespace rx
{
+namespace
+{
+constexpr VkClearDepthStencilValue kDefaultClearDepthStencilValue = {0.0f, 1};
+constexpr VkClearColorValue kBlackClearColorValue = {{0}};
+
+} // anonymous namespace
+
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
: RenderbufferImpl(state), mAllocatedMemorySize(0)
{
@@ -77,9 +84,13 @@
if (!mImage.valid() && (width != 0 || height != 0))
{
+ const angle::Format &textureFormat = vkFormat.textureFormat();
+ bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
const VkImageUsageFlags usage =
- (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_SAMPLED_BIT |
+ (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
+ (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
VkImageCreateInfo imageInfo;
imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
@@ -106,7 +117,10 @@
ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory,
&mAllocatedMemorySize));
- VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
+ VkImageAspectFlags aspect =
+ (textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
+ (textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
+ (textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
// Allocate ImageView.
VkImageViewCreateInfo viewInfo;
@@ -131,11 +145,19 @@
// TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
- VkClearColorValue black = {{0}};
- mImage.changeLayoutWithStages(
- VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
- commandBuffer->clearSingleColorImage(mImage, black);
+ mImage.changeLayoutWithStages(aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
+
+ if (isDepthOrStencilFormat)
+ {
+ commandBuffer->clearSingleDepthStencilImage(mImage, aspect,
+ kDefaultClearDepthStencilValue);
+ }
+ else
+ {
+ commandBuffer->clearSingleColorImage(mImage, kBlackClearColorValue);
+ }
}
return gl::NoError();