Vulkan: Implement basic Renderbuffer creation.
Bug: angleproject:2347
Change-Id: I56edfde2dbc020d5c792cc4f107aa4b9d6b71840
Reviewed-on: https://chromium-review.googlesource.com/905895
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index af79ead..29a572c 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -9,12 +9,14 @@
#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
-#include "common/debug.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/renderer/vulkan/ContextVk.h"
+#include "libANGLE/renderer/vulkan/RendererVk.h"
namespace rx
{
-RenderbufferVk::RenderbufferVk() : RenderbufferImpl()
+RenderbufferVk::RenderbufferVk() : RenderbufferImpl(), mRequiredSize(0)
{
}
@@ -22,13 +24,52 @@
{
}
+gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
+{
+ ContextVk *contextVk = vk::GetImpl(context);
+ RendererVk *renderer = contextVk->getRenderer();
+
+ renderer->releaseResource(*this, &mImage);
+ renderer->releaseResource(*this, &mDeviceMemory);
+ return gl::NoError();
+}
+
gl::Error RenderbufferVk::setStorage(const gl::Context *context,
GLenum internalformat,
size_t width,
size_t height)
{
- UNIMPLEMENTED();
- return gl::InternalError();
+ ContextVk *contextVk = vk::GetImpl(context);
+ const vk::Format &vkFormat = contextVk->getRenderer()->getFormat(internalformat);
+
+ 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);
+
+ VkImageCreateInfo imageInfo;
+ imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ imageInfo.pNext = nullptr;
+ imageInfo.flags = 0;
+ imageInfo.imageType = VK_IMAGE_TYPE_2D;
+ imageInfo.format = vkFormat.vkTextureFormat;
+ imageInfo.extent.width = static_cast<uint32_t>(width);
+ imageInfo.extent.height = static_cast<uint32_t>(height);
+ imageInfo.extent.depth = 1;
+ imageInfo.mipLevels = 1;
+ imageInfo.arrayLayers = 1;
+ imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
+ imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
+ imageInfo.usage = usage;
+ imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ imageInfo.queueFamilyIndexCount = 0;
+ imageInfo.pQueueFamilyIndices = nullptr;
+ imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+
+ ANGLE_TRY(mImage.init(contextVk->getDevice(), imageInfo));
+
+ VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ ANGLE_TRY(vk::AllocateImageMemory(contextVk, flags, &mImage, &mDeviceMemory, &mRequiredSize));
+ return gl::NoError();
}
gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,