blob: 13c7b5880cf330e7746f3fa2adfa9f3017e47e62 [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 Madille703c602018-02-20 10:21:48 -050019RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
Jamie Madill7b213812018-03-06 10:13:13 -050020 : RenderbufferImpl(state), mAllocatedMemorySize(0)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040021{
Jamie Madill7b213812018-03-06 10:13:13 -050022 mRenderTarget.image = &mImage;
23 mRenderTarget.imageView = &mImageView;
24 mRenderTarget.resource = this;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040025}
26
27RenderbufferVk::~RenderbufferVk()
28{
29}
30
Jamie Madill12eb3d72018-02-14 12:34:45 -050031gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
32{
33 ContextVk *contextVk = vk::GetImpl(context);
34 RendererVk *renderer = contextVk->getRenderer();
35
36 renderer->releaseResource(*this, &mImage);
37 renderer->releaseResource(*this, &mDeviceMemory);
Jamie Madill0cbfa582018-02-15 14:45:41 -050038 renderer->releaseResource(*this, &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050039
40 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
41
Jamie Madill12eb3d72018-02-14 12:34:45 -050042 return gl::NoError();
43}
44
Jamie Madillea84f6f2017-09-20 13:20:30 -040045gl::Error RenderbufferVk::setStorage(const gl::Context *context,
46 GLenum internalformat,
47 size_t width,
48 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040049{
Jamie Madill12eb3d72018-02-14 12:34:45 -050050 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050051 RendererVk *renderer = contextVk->getRenderer();
52 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050053 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050054
Jamie Madill7b213812018-03-06 10:13:13 -050055 if (mImage.valid())
56 {
57 // Check against the state if we need to recreate the storage.
58 if (internalformat != mState.getFormat().info->internalFormat ||
59 static_cast<GLsizei>(width) != mState.getWidth() ||
60 static_cast<GLsizei>(height) != mState.getHeight())
61 {
62 ASSERT(mImageView.valid());
63 renderer->releaseResource(*this, &mImage);
64 renderer->releaseResource(*this, &mDeviceMemory);
65 renderer->releaseResource(*this, &mImageView);
Jamie Madill12eb3d72018-02-14 12:34:45 -050066
Jamie Madill7b213812018-03-06 10:13:13 -050067 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
68 }
69 }
Jamie Madill0cbfa582018-02-15 14:45:41 -050070
71 // Init RenderTarget.
72 mRenderTarget.extents.width = static_cast<int>(width);
73 mRenderTarget.extents.height = static_cast<int>(height);
74 mRenderTarget.extents.depth = 1;
75 mRenderTarget.format = &vkFormat;
Jamie Madill0cbfa582018-02-15 14:45:41 -050076 mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
77
Jamie Madill7b213812018-03-06 10:13:13 -050078 if (!mImage.valid() && (width != 0 || height != 0))
79 {
80 const VkImageUsageFlags usage =
81 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
82 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
83
84 VkImageCreateInfo imageInfo;
85 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
86 imageInfo.pNext = nullptr;
87 imageInfo.flags = 0;
88 imageInfo.imageType = VK_IMAGE_TYPE_2D;
89 imageInfo.format = vkFormat.vkTextureFormat;
90 imageInfo.extent.width = static_cast<uint32_t>(width);
91 imageInfo.extent.height = static_cast<uint32_t>(height);
92 imageInfo.extent.depth = 1;
93 imageInfo.mipLevels = 1;
94 imageInfo.arrayLayers = 1;
95 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
96 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
97 imageInfo.usage = usage;
98 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
99 imageInfo.queueFamilyIndexCount = 0;
100 imageInfo.pQueueFamilyIndices = nullptr;
101 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
102
103 ANGLE_TRY(mImage.init(device, imageInfo));
104
105 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
106 ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory,
107 &mAllocatedMemorySize));
108
109 VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
110
111 // Allocate ImageView.
112 VkImageViewCreateInfo viewInfo;
113 viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
114 viewInfo.pNext = nullptr;
115 viewInfo.flags = 0;
116 viewInfo.image = mImage.getHandle();
117 viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
118 viewInfo.format = vkFormat.vkTextureFormat;
119 viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
120 viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
121 viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
122 viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
123 viewInfo.subresourceRange.aspectMask = aspect;
124 viewInfo.subresourceRange.baseMipLevel = 0;
125 viewInfo.subresourceRange.levelCount = 1;
126 viewInfo.subresourceRange.baseArrayLayer = 0;
127 viewInfo.subresourceRange.layerCount = 1;
128
129 ANGLE_TRY(mImageView.init(device, viewInfo));
Jamie Madille4c5a232018-03-02 21:00:31 -0500130
131 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
132 vk::CommandBuffer *commandBuffer = nullptr;
133 ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
134 VkClearColorValue black = {{0}};
135 mImage.changeLayoutWithStages(
136 VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
137 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
138 commandBuffer->clearSingleColorImage(mImage, black);
Jamie Madill7b213812018-03-06 10:13:13 -0500139 }
140
Jamie Madill12eb3d72018-02-14 12:34:45 -0500141 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400142}
143
Jamie Madillea84f6f2017-09-20 13:20:30 -0400144gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
145 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400146 GLenum internalformat,
147 size_t width,
148 size_t height)
149{
150 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500151 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400152}
153
Jamie Madillea84f6f2017-09-20 13:20:30 -0400154gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400155{
156 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500157 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400158}
159
Jamie Madill0cbfa582018-02-15 14:45:41 -0500160gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
161 GLenum /*binding*/,
162 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400163 FramebufferAttachmentRenderTarget **rtOut)
164{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500165 ASSERT(mImage.valid());
166 *rtOut = &mRenderTarget;
167 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400168}
169
Jamie Madill05b35b22017-10-03 09:01:44 -0400170gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
171 const gl::ImageIndex &imageIndex)
172{
173 UNIMPLEMENTED();
174 return gl::NoError();
175}
176
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400177} // namespace rx