Vulkan: Implement basic Renderbuffer attachments.
Creating an ImageView for color Renderbuffers allows us to render to
them in a RenderPass. We will also need additional functionality to
support depth/stencil Renderbuffers.
Bug: angleproject:2347
Change-Id: I5d4f7d8242ad4fbca38cb08c0cf6b43edca57c8f
Reviewed-on: https://chromium-review.googlesource.com/922456
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index d87747b..6d8d113 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -31,6 +31,7 @@
renderer->releaseResource(*this, &mImage);
renderer->releaseResource(*this, &mDeviceMemory);
+ renderer->releaseResource(*this, &mImageView);
return gl::NoError();
}
@@ -42,6 +43,7 @@
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
const vk::Format &vkFormat = renderer->getFormat(internalformat);
+ VkDevice device = renderer->getDevice();
VkImageUsageFlags usage =
(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
@@ -66,10 +68,43 @@
imageInfo.pQueueFamilyIndices = nullptr;
imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- ANGLE_TRY(mImage.init(contextVk->getDevice(), imageInfo));
+ ANGLE_TRY(mImage.init(device, imageInfo));
VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory, &mRequiredSize));
+
+ VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ // Allocate ImageView.
+ VkImageViewCreateInfo viewInfo;
+ viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ viewInfo.pNext = nullptr;
+ viewInfo.flags = 0;
+ viewInfo.image = mImage.getHandle();
+ viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ viewInfo.format = vkFormat.vkTextureFormat;
+ viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
+ viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
+ viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
+ viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
+ viewInfo.subresourceRange.aspectMask = aspect;
+ viewInfo.subresourceRange.baseMipLevel = 0;
+ viewInfo.subresourceRange.levelCount = 1;
+ viewInfo.subresourceRange.baseArrayLayer = 0;
+ viewInfo.subresourceRange.layerCount = 1;
+
+ ANGLE_TRY(mImageView.init(device, viewInfo));
+
+ // Init RenderTarget.
+ mRenderTarget.extents.width = static_cast<int>(width);
+ mRenderTarget.extents.height = static_cast<int>(height);
+ mRenderTarget.extents.depth = 1;
+ mRenderTarget.format = &vkFormat;
+ mRenderTarget.image = &mImage;
+ mRenderTarget.imageView = &mImageView;
+ mRenderTarget.resource = this;
+ mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
+
return gl::NoError();
}
@@ -89,13 +124,14 @@
return gl::InternalError();
}
-gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context *context,
- GLenum binding,
- const gl::ImageIndex &imageIndex,
+gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
+ GLenum /*binding*/,
+ const gl::ImageIndex & /*imageIndex*/,
FramebufferAttachmentRenderTarget **rtOut)
{
- UNIMPLEMENTED();
- return gl::InternalError();
+ ASSERT(mImage.valid());
+ *rtOut = &mRenderTarget;
+ return gl::NoError();
}
gl::Error RenderbufferVk::initializeContents(const gl::Context *context,