blob: a93ed42b022cc4143752091b32616515a96ba2bd [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
Luc Ferrone6a40d02018-03-22 10:30:57 -040019namespace
20{
21constexpr VkClearDepthStencilValue kDefaultClearDepthStencilValue = {0.0f, 1};
22constexpr VkClearColorValue kBlackClearColorValue = {{0}};
23
24} // anonymous namespace
25
Jamie Madille703c602018-02-20 10:21:48 -050026RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
Jamie Madill7b213812018-03-06 10:13:13 -050027 : RenderbufferImpl(state), mAllocatedMemorySize(0)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040028{
Jamie Madill7b213812018-03-06 10:13:13 -050029 mRenderTarget.image = &mImage;
30 mRenderTarget.imageView = &mImageView;
31 mRenderTarget.resource = this;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040032}
33
34RenderbufferVk::~RenderbufferVk()
35{
36}
37
Jamie Madill12eb3d72018-02-14 12:34:45 -050038gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
39{
40 ContextVk *contextVk = vk::GetImpl(context);
41 RendererVk *renderer = contextVk->getRenderer();
42
43 renderer->releaseResource(*this, &mImage);
44 renderer->releaseResource(*this, &mDeviceMemory);
Jamie Madill0cbfa582018-02-15 14:45:41 -050045 renderer->releaseResource(*this, &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050046
47 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
48
Jamie Madill12eb3d72018-02-14 12:34:45 -050049 return gl::NoError();
50}
51
Jamie Madillea84f6f2017-09-20 13:20:30 -040052gl::Error RenderbufferVk::setStorage(const gl::Context *context,
53 GLenum internalformat,
54 size_t width,
55 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040056{
Jamie Madill12eb3d72018-02-14 12:34:45 -050057 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050058 RendererVk *renderer = contextVk->getRenderer();
59 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050060 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050061
Jamie Madill7b213812018-03-06 10:13:13 -050062 if (mImage.valid())
63 {
64 // Check against the state if we need to recreate the storage.
65 if (internalformat != mState.getFormat().info->internalFormat ||
66 static_cast<GLsizei>(width) != mState.getWidth() ||
67 static_cast<GLsizei>(height) != mState.getHeight())
68 {
69 ASSERT(mImageView.valid());
70 renderer->releaseResource(*this, &mImage);
71 renderer->releaseResource(*this, &mDeviceMemory);
72 renderer->releaseResource(*this, &mImageView);
Jamie Madill12eb3d72018-02-14 12:34:45 -050073
Jamie Madill7b213812018-03-06 10:13:13 -050074 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
75 }
76 }
Jamie Madill0cbfa582018-02-15 14:45:41 -050077
78 // Init RenderTarget.
79 mRenderTarget.extents.width = static_cast<int>(width);
80 mRenderTarget.extents.height = static_cast<int>(height);
81 mRenderTarget.extents.depth = 1;
82 mRenderTarget.format = &vkFormat;
Jamie Madill0cbfa582018-02-15 14:45:41 -050083 mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
84
Jamie Madill7b213812018-03-06 10:13:13 -050085 if (!mImage.valid() && (width != 0 || height != 0))
86 {
Luc Ferrone6a40d02018-03-22 10:30:57 -040087 const angle::Format &textureFormat = vkFormat.textureFormat();
88 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
Jamie Madill7b213812018-03-06 10:13:13 -050089 const VkImageUsageFlags usage =
Luc Ferrone6a40d02018-03-22 10:30:57 -040090 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
91 VK_IMAGE_USAGE_SAMPLED_BIT |
92 (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
93 (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050094
95 VkImageCreateInfo imageInfo;
96 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
97 imageInfo.pNext = nullptr;
98 imageInfo.flags = 0;
99 imageInfo.imageType = VK_IMAGE_TYPE_2D;
100 imageInfo.format = vkFormat.vkTextureFormat;
101 imageInfo.extent.width = static_cast<uint32_t>(width);
102 imageInfo.extent.height = static_cast<uint32_t>(height);
103 imageInfo.extent.depth = 1;
104 imageInfo.mipLevels = 1;
105 imageInfo.arrayLayers = 1;
106 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
107 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
108 imageInfo.usage = usage;
109 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
110 imageInfo.queueFamilyIndexCount = 0;
111 imageInfo.pQueueFamilyIndices = nullptr;
112 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
113
114 ANGLE_TRY(mImage.init(device, imageInfo));
115
116 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
117 ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory,
118 &mAllocatedMemorySize));
119
Luc Ferrone6a40d02018-03-22 10:30:57 -0400120 VkImageAspectFlags aspect =
121 (textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
122 (textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
123 (textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -0500124
125 // Allocate ImageView.
126 VkImageViewCreateInfo viewInfo;
127 viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
128 viewInfo.pNext = nullptr;
129 viewInfo.flags = 0;
130 viewInfo.image = mImage.getHandle();
131 viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
132 viewInfo.format = vkFormat.vkTextureFormat;
133 viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
134 viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
135 viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
136 viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
137 viewInfo.subresourceRange.aspectMask = aspect;
138 viewInfo.subresourceRange.baseMipLevel = 0;
139 viewInfo.subresourceRange.levelCount = 1;
140 viewInfo.subresourceRange.baseArrayLayer = 0;
141 viewInfo.subresourceRange.layerCount = 1;
142
143 ANGLE_TRY(mImageView.init(device, viewInfo));
Jamie Madille4c5a232018-03-02 21:00:31 -0500144
145 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
146 vk::CommandBuffer *commandBuffer = nullptr;
147 ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
Luc Ferrone6a40d02018-03-22 10:30:57 -0400148 mImage.changeLayoutWithStages(aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
149 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
150 VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
151
152 if (isDepthOrStencilFormat)
153 {
154 commandBuffer->clearSingleDepthStencilImage(mImage, aspect,
155 kDefaultClearDepthStencilValue);
156 }
157 else
158 {
159 commandBuffer->clearSingleColorImage(mImage, kBlackClearColorValue);
160 }
Jamie Madill7b213812018-03-06 10:13:13 -0500161 }
162
Jamie Madill12eb3d72018-02-14 12:34:45 -0500163 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400164}
165
Jamie Madillea84f6f2017-09-20 13:20:30 -0400166gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
167 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400168 GLenum internalformat,
169 size_t width,
170 size_t height)
171{
172 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500173 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400174}
175
Jamie Madillea84f6f2017-09-20 13:20:30 -0400176gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400177{
178 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500179 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400180}
181
Jamie Madill0cbfa582018-02-15 14:45:41 -0500182gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
183 GLenum /*binding*/,
184 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400185 FramebufferAttachmentRenderTarget **rtOut)
186{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500187 ASSERT(mImage.valid());
188 *rtOut = &mRenderTarget;
189 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400190}
191
Jamie Madill05b35b22017-10-03 09:01:44 -0400192gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
193 const gl::ImageIndex &imageIndex)
194{
195 UNIMPLEMENTED();
196 return gl::NoError();
197}
198
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400199} // namespace rx