Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 1 | // |
| 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 Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 12 | #include "libANGLE/Context.h" |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 13 | #include "libANGLE/Image.h" |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 14 | #include "libANGLE/renderer/vulkan/ContextVk.h" |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 15 | #include "libANGLE/renderer/vulkan/ImageVk.h" |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 16 | #include "libANGLE/renderer/vulkan/RendererVk.h" |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 17 | |
| 18 | namespace rx |
| 19 | { |
Jamie Madill | bcf467f | 2018-05-23 09:46:00 -0400 | [diff] [blame] | 20 | RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 21 | : RenderbufferImpl(state), mOwnsImage(false), mImage(nullptr) |
Jamie Madill | b980c56 | 2018-11-27 11:34:27 -0500 | [diff] [blame] | 22 | {} |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 23 | |
Jamie Madill | b980c56 | 2018-11-27 11:34:27 -0500 | [diff] [blame] | 24 | RenderbufferVk::~RenderbufferVk() {} |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 25 | |
Jamie Madill | c2328a1 | 2018-10-18 15:00:29 -0400 | [diff] [blame] | 26 | void RenderbufferVk::onDestroy(const gl::Context *context) |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 27 | { |
| 28 | ContextVk *contextVk = vk::GetImpl(context); |
| 29 | RendererVk *renderer = contextVk->getRenderer(); |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 30 | releaseAndDeleteImage(context, renderer); |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 31 | } |
| 32 | |
Jamie Madill | c2328a1 | 2018-10-18 15:00:29 -0400 | [diff] [blame] | 33 | angle::Result RenderbufferVk::setStorage(const gl::Context *context, |
| 34 | GLenum internalformat, |
| 35 | size_t width, |
| 36 | size_t height) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 37 | { |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 38 | ContextVk *contextVk = vk::GetImpl(context); |
Jamie Madill | 57fbfd8 | 2018-02-14 12:45:34 -0500 | [diff] [blame] | 39 | RendererVk *renderer = contextVk->getRenderer(); |
| 40 | const vk::Format &vkFormat = renderer->getFormat(internalformat); |
Jamie Madill | 12eb3d7 | 2018-02-14 12:34:45 -0500 | [diff] [blame] | 41 | |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 42 | if (!mOwnsImage) |
| 43 | { |
| 44 | releaseAndDeleteImage(context, renderer); |
| 45 | } |
| 46 | |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 47 | if (mImage != nullptr && mImage->valid()) |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 48 | { |
| 49 | // Check against the state if we need to recreate the storage. |
| 50 | if (internalformat != mState.getFormat().info->internalFormat || |
| 51 | static_cast<GLsizei>(width) != mState.getWidth() || |
| 52 | static_cast<GLsizei>(height) != mState.getHeight()) |
| 53 | { |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 54 | releaseImage(context, renderer); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 55 | } |
| 56 | } |
Jamie Madill | 0cbfa58 | 2018-02-15 14:45:41 -0500 | [diff] [blame] | 57 | |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 58 | if ((mImage == nullptr || !mImage->valid()) && (width != 0 && height != 0)) |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 59 | { |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 60 | if (mImage == nullptr) |
| 61 | { |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 62 | mImage = new vk::ImageHelper(); |
| 63 | mOwnsImage = true; |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 64 | } |
| 65 | |
Jamie Madill | 0631e19 | 2019-04-18 16:09:12 -0400 | [diff] [blame] | 66 | const angle::Format &textureFormat = vkFormat.imageFormat(); |
Luc Ferron | e6a40d0 | 2018-03-22 10:30:57 -0400 | [diff] [blame] | 67 | bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0; |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 68 | const VkImageUsageFlags usage = |
Luc Ferron | e6a40d0 | 2018-03-22 10:30:57 -0400 | [diff] [blame] | 69 | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | |
| 70 | VK_IMAGE_USAGE_SAMPLED_BIT | |
| 71 | (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) | |
| 72 | (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 73 | |
Jamie Madill | bc54342 | 2018-03-30 10:43:19 -0400 | [diff] [blame] | 74 | gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1); |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 75 | ANGLE_TRY(mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1, 1)); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 76 | |
| 77 | VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 78 | ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags)); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 79 | |
Geoff Lang | 9e14164 | 2018-06-27 11:43:18 -0400 | [diff] [blame] | 80 | VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 81 | |
Shahbaz Youssefi | f83a28a | 2018-12-09 03:48:34 +0100 | [diff] [blame] | 82 | // Note that LUMA textures are not color-renderable, so a read-view with swizzle is not |
| 83 | // needed. |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 84 | ANGLE_TRY(mImage->initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(), |
Geoff Lang | 4a29870 | 2019-01-18 10:49:36 -0500 | [diff] [blame] | 85 | &mImageView, 0, 1)); |
Jamie Madill | e4c5a23 | 2018-03-02 21:00:31 -0500 | [diff] [blame] | 86 | |
Shahbaz Youssefi | 65d10f3 | 2019-03-21 16:30:31 -0400 | [diff] [blame] | 87 | // Clear the renderbuffer if it has emulated channels. |
Jamie Madill | 6722009 | 2019-05-20 11:12:53 -0400 | [diff] [blame^] | 88 | mImage->clearIfEmulatedFormat(vk::GetImpl(context), gl::ImageIndex::Make2D(0), vkFormat); |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 89 | |
Jamie Madill | 6722009 | 2019-05-20 11:12:53 -0400 | [diff] [blame^] | 90 | mRenderTarget.init(mImage, &mImageView, 0, 0); |
Jamie Madill | 7b21381 | 2018-03-06 10:13:13 -0500 | [diff] [blame] | 91 | } |
| 92 | |
Jamie Madill | 7c985f5 | 2018-11-29 18:16:17 -0500 | [diff] [blame] | 93 | return angle::Result::Continue; |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 94 | } |
| 95 | |
Jamie Madill | c2328a1 | 2018-10-18 15:00:29 -0400 | [diff] [blame] | 96 | angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context, |
| 97 | size_t samples, |
| 98 | GLenum internalformat, |
| 99 | size_t width, |
| 100 | size_t height) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 101 | { |
Jamie Madill | c2328a1 | 2018-10-18 15:00:29 -0400 | [diff] [blame] | 102 | ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); |
Jamie Madill | 7c985f5 | 2018-11-29 18:16:17 -0500 | [diff] [blame] | 103 | return angle::Result::Stop; |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 104 | } |
| 105 | |
Jamie Madill | c2328a1 | 2018-10-18 15:00:29 -0400 | [diff] [blame] | 106 | angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, |
| 107 | egl::Image *image) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 108 | { |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 109 | ContextVk *contextVk = vk::GetImpl(context); |
| 110 | RendererVk *renderer = contextVk->getRenderer(); |
| 111 | |
| 112 | releaseAndDeleteImage(context, renderer); |
| 113 | |
| 114 | ImageVk *imageVk = vk::GetImpl(image); |
| 115 | mImage = imageVk->getImage(); |
| 116 | mOwnsImage = false; |
| 117 | |
| 118 | const vk::Format &vkFormat = renderer->getFormat(image->getFormat().info->sizedInternalFormat); |
Jamie Madill | 0631e19 | 2019-04-18 16:09:12 -0400 | [diff] [blame] | 119 | const angle::Format &textureFormat = vkFormat.imageFormat(); |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 120 | |
| 121 | VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat); |
| 122 | |
Geoff Lang | 009696c | 2019-01-31 14:47:07 -0500 | [diff] [blame] | 123 | // Transfer the image to this queue if needed |
| 124 | uint32_t rendererQueueFamilyIndex = contextVk->getRenderer()->getQueueFamilyIndex(); |
| 125 | if (mImage->isQueueChangeNeccesary(rendererQueueFamilyIndex)) |
| 126 | { |
Shahbaz Youssefi | 2660b50 | 2019-03-21 12:08:40 -0400 | [diff] [blame] | 127 | vk::CommandBuffer *commandBuffer = nullptr; |
Geoff Lang | 009696c | 2019-01-31 14:47:07 -0500 | [diff] [blame] | 128 | ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer)); |
| 129 | mImage->changeLayoutAndQueue(aspect, vk::ImageLayout::ColorAttachment, |
| 130 | rendererQueueFamilyIndex, commandBuffer); |
| 131 | } |
| 132 | |
Geoff Lang | eca36cb | 2019-01-18 14:03:52 -0500 | [diff] [blame] | 133 | ANGLE_TRY(mImage->initLayerImageView(contextVk, imageVk->getImageTextureType(), aspect, |
| 134 | gl::SwizzleState(), &mImageView, imageVk->getImageLevel(), |
| 135 | 1, imageVk->getImageLayer(), 1)); |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 136 | |
Jamie Madill | 6722009 | 2019-05-20 11:12:53 -0400 | [diff] [blame^] | 137 | mRenderTarget.init(mImage, &mImageView, imageVk->getImageLevel(), imageVk->getImageLayer()); |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 138 | |
| 139 | return angle::Result::Continue; |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 140 | } |
| 141 | |
Jamie Madill | 6f755b2 | 2018-10-09 12:48:54 -0400 | [diff] [blame] | 142 | angle::Result RenderbufferVk::getAttachmentRenderTarget(const gl::Context *context, |
| 143 | GLenum binding, |
| 144 | const gl::ImageIndex &imageIndex, |
| 145 | FramebufferAttachmentRenderTarget **rtOut) |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 146 | { |
Geoff Lang | f3e823d | 2019-01-14 12:40:34 -0500 | [diff] [blame] | 147 | ASSERT(mImage && mImage->valid()); |
Jamie Madill | 6722009 | 2019-05-20 11:12:53 -0400 | [diff] [blame^] | 148 | ANGLE_TRY(mRenderTarget.flushStagedUpdates(vk::GetImpl(context))); |
Jamie Madill | 0cbfa58 | 2018-02-15 14:45:41 -0500 | [diff] [blame] | 149 | *rtOut = &mRenderTarget; |
Jamie Madill | 7c985f5 | 2018-11-29 18:16:17 -0500 | [diff] [blame] | 150 | return angle::Result::Continue; |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 151 | } |
| 152 | |
Jamie Madill | 6f755b2 | 2018-10-09 12:48:54 -0400 | [diff] [blame] | 153 | angle::Result RenderbufferVk::initializeContents(const gl::Context *context, |
| 154 | const gl::ImageIndex &imageIndex) |
Jamie Madill | 05b35b2 | 2017-10-03 09:01:44 -0400 | [diff] [blame] | 155 | { |
Shahbaz Youssefi | 65d10f3 | 2019-03-21 16:30:31 -0400 | [diff] [blame] | 156 | mImage->stageSubresourceRobustClear(imageIndex, mImage->getFormat().angleFormat()); |
| 157 | return mImage->flushAllStagedUpdates(vk::GetImpl(context)); |
Jamie Madill | 05b35b2 | 2017-10-03 09:01:44 -0400 | [diff] [blame] | 158 | } |
| 159 | |
Geoff Lang | fe59f6b | 2019-01-16 09:34:30 -0500 | [diff] [blame] | 160 | void RenderbufferVk::releaseOwnershipOfImage(const gl::Context *context) |
| 161 | { |
| 162 | ContextVk *contextVk = vk::GetImpl(context); |
| 163 | RendererVk *renderer = contextVk->getRenderer(); |
| 164 | |
| 165 | mOwnsImage = false; |
| 166 | releaseAndDeleteImage(context, renderer); |
| 167 | } |
| 168 | |
| 169 | void RenderbufferVk::releaseAndDeleteImage(const gl::Context *context, RendererVk *renderer) |
| 170 | { |
| 171 | releaseImage(context, renderer); |
| 172 | SafeDelete(mImage); |
| 173 | } |
| 174 | |
| 175 | void RenderbufferVk::releaseImage(const gl::Context *context, RendererVk *renderer) |
| 176 | { |
| 177 | if (mImage && mOwnsImage) |
| 178 | { |
| 179 | mImage->releaseImage(renderer); |
| 180 | mImage->releaseStagingBuffer(renderer); |
| 181 | } |
| 182 | else |
| 183 | { |
| 184 | mImage = nullptr; |
| 185 | } |
| 186 | |
| 187 | renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView); |
| 188 | } |
| 189 | |
Jamie Madill | 9e54b5a | 2016-05-25 12:57:39 -0400 | [diff] [blame] | 190 | } // namespace rx |