blob: 6d8d1133332954c8cb28dde30406c9a9fdc5ac5f [file] [log] [blame]
Jamie Madill9e54b5a2016-05-25 12:57:39 -04001//
2// Copyright 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6// RenderbufferVk.cpp:
7// Implements the class methods for RenderbufferVk.
8//
9
10#include "libANGLE/renderer/vulkan/RenderbufferVk.h"
11
Jamie Madill12eb3d72018-02-14 12:34:45 -050012#include "libANGLE/Context.h"
13#include "libANGLE/renderer/vulkan/ContextVk.h"
14#include "libANGLE/renderer/vulkan/RendererVk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040015
16namespace rx
17{
18
Jamie Madill12eb3d72018-02-14 12:34:45 -050019RenderbufferVk::RenderbufferVk() : RenderbufferImpl(), mRequiredSize(0)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040020{
21}
22
23RenderbufferVk::~RenderbufferVk()
24{
25}
26
Jamie Madill12eb3d72018-02-14 12:34:45 -050027gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
28{
29 ContextVk *contextVk = vk::GetImpl(context);
30 RendererVk *renderer = contextVk->getRenderer();
31
32 renderer->releaseResource(*this, &mImage);
33 renderer->releaseResource(*this, &mDeviceMemory);
Jamie Madill0cbfa582018-02-15 14:45:41 -050034 renderer->releaseResource(*this, &mImageView);
Jamie Madill12eb3d72018-02-14 12:34:45 -050035 return gl::NoError();
36}
37
Jamie Madillea84f6f2017-09-20 13:20:30 -040038gl::Error RenderbufferVk::setStorage(const gl::Context *context,
39 GLenum internalformat,
40 size_t width,
41 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040042{
Jamie Madill12eb3d72018-02-14 12:34:45 -050043 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050044 RendererVk *renderer = contextVk->getRenderer();
45 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050046 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050047
48 VkImageUsageFlags usage =
49 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
50 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
51
52 VkImageCreateInfo imageInfo;
53 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
54 imageInfo.pNext = nullptr;
55 imageInfo.flags = 0;
56 imageInfo.imageType = VK_IMAGE_TYPE_2D;
57 imageInfo.format = vkFormat.vkTextureFormat;
58 imageInfo.extent.width = static_cast<uint32_t>(width);
59 imageInfo.extent.height = static_cast<uint32_t>(height);
60 imageInfo.extent.depth = 1;
61 imageInfo.mipLevels = 1;
62 imageInfo.arrayLayers = 1;
63 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
64 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
65 imageInfo.usage = usage;
66 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
67 imageInfo.queueFamilyIndexCount = 0;
68 imageInfo.pQueueFamilyIndices = nullptr;
69 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
70
Jamie Madill0cbfa582018-02-15 14:45:41 -050071 ANGLE_TRY(mImage.init(device, imageInfo));
Jamie Madill12eb3d72018-02-14 12:34:45 -050072
73 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill57fbfd82018-02-14 12:45:34 -050074 ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory, &mRequiredSize));
Jamie Madill0cbfa582018-02-15 14:45:41 -050075
76 VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
77
78 // Allocate ImageView.
79 VkImageViewCreateInfo viewInfo;
80 viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
81 viewInfo.pNext = nullptr;
82 viewInfo.flags = 0;
83 viewInfo.image = mImage.getHandle();
84 viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
85 viewInfo.format = vkFormat.vkTextureFormat;
86 viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
87 viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
88 viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
89 viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
90 viewInfo.subresourceRange.aspectMask = aspect;
91 viewInfo.subresourceRange.baseMipLevel = 0;
92 viewInfo.subresourceRange.levelCount = 1;
93 viewInfo.subresourceRange.baseArrayLayer = 0;
94 viewInfo.subresourceRange.layerCount = 1;
95
96 ANGLE_TRY(mImageView.init(device, viewInfo));
97
98 // Init RenderTarget.
99 mRenderTarget.extents.width = static_cast<int>(width);
100 mRenderTarget.extents.height = static_cast<int>(height);
101 mRenderTarget.extents.depth = 1;
102 mRenderTarget.format = &vkFormat;
103 mRenderTarget.image = &mImage;
104 mRenderTarget.imageView = &mImageView;
105 mRenderTarget.resource = this;
106 mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
107
Jamie Madill12eb3d72018-02-14 12:34:45 -0500108 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400109}
110
Jamie Madillea84f6f2017-09-20 13:20:30 -0400111gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
112 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400113 GLenum internalformat,
114 size_t width,
115 size_t height)
116{
117 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500118 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400119}
120
Jamie Madillea84f6f2017-09-20 13:20:30 -0400121gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400122{
123 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500124 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400125}
126
Jamie Madill0cbfa582018-02-15 14:45:41 -0500127gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
128 GLenum /*binding*/,
129 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400130 FramebufferAttachmentRenderTarget **rtOut)
131{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500132 ASSERT(mImage.valid());
133 *rtOut = &mRenderTarget;
134 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400135}
136
Jamie Madill05b35b22017-10-03 09:01:44 -0400137gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
138 const gl::ImageIndex &imageIndex)
139{
140 UNIMPLEMENTED();
141 return gl::NoError();
142}
143
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400144} // namespace rx