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,