blob: 9eb9445c9919100a0b7aab18de46f82590f5042b [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 Madillbcf467f2018-05-23 09:46:00 -040026RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
Geoff Langf3e823d2019-01-14 12:40:34 -050027 : RenderbufferImpl(state), mImage(nullptr)
Jamie Madillb980c562018-11-27 11:34:27 -050028{}
Jamie Madill9e54b5a2016-05-25 12:57:39 -040029
Jamie Madillb980c562018-11-27 11:34:27 -050030RenderbufferVk::~RenderbufferVk() {}
Jamie Madill9e54b5a2016-05-25 12:57:39 -040031
Jamie Madillc2328a12018-10-18 15:00:29 -040032void RenderbufferVk::onDestroy(const gl::Context *context)
Jamie Madill12eb3d72018-02-14 12:34:45 -050033{
34 ContextVk *contextVk = vk::GetImpl(context);
35 RendererVk *renderer = contextVk->getRenderer();
36
Geoff Langf3e823d2019-01-14 12:40:34 -050037 if (mImage)
38 {
39 mImage->releaseImage(renderer);
40 mImage->releaseStagingBuffer(renderer);
41 SafeDelete(mImage);
42 }
Geoff Lang08f8fa62019-01-10 14:25:47 -050043
Jamie Madill2d03ff42018-09-27 15:04:26 -040044 renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView);
Jamie Madill12eb3d72018-02-14 12:34:45 -050045}
46
Jamie Madillc2328a12018-10-18 15:00:29 -040047angle::Result RenderbufferVk::setStorage(const gl::Context *context,
48 GLenum internalformat,
49 size_t width,
50 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040051{
Jamie Madill12eb3d72018-02-14 12:34:45 -050052 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050053 RendererVk *renderer = contextVk->getRenderer();
54 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill12eb3d72018-02-14 12:34:45 -050055
Geoff Langf3e823d2019-01-14 12:40:34 -050056 if (mImage != nullptr && mImage->valid())
Jamie Madill7b213812018-03-06 10:13:13 -050057 {
58 // Check against the state if we need to recreate the storage.
59 if (internalformat != mState.getFormat().info->internalFormat ||
60 static_cast<GLsizei>(width) != mState.getWidth() ||
61 static_cast<GLsizei>(height) != mState.getHeight())
62 {
Geoff Langf3e823d2019-01-14 12:40:34 -050063 mImage->releaseImage(renderer);
Jamie Madill2d03ff42018-09-27 15:04:26 -040064 renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050065 }
66 }
Jamie Madill0cbfa582018-02-15 14:45:41 -050067
Geoff Langf3e823d2019-01-14 12:40:34 -050068 if ((mImage == nullptr || !mImage->valid()) && (width != 0 && height != 0))
Jamie Madill7b213812018-03-06 10:13:13 -050069 {
Geoff Langf3e823d2019-01-14 12:40:34 -050070 if (mImage == nullptr)
71 {
72 mImage = new vk::ImageHelper();
73 }
74
Luc Ferrone6a40d02018-03-22 10:30:57 -040075 const angle::Format &textureFormat = vkFormat.textureFormat();
76 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
Jamie Madill7b213812018-03-06 10:13:13 -050077 const VkImageUsageFlags usage =
Luc Ferrone6a40d02018-03-22 10:30:57 -040078 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
79 VK_IMAGE_USAGE_SAMPLED_BIT |
80 (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
81 (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050082
Jamie Madillbc543422018-03-30 10:43:19 -040083 gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
Geoff Langf3e823d2019-01-14 12:40:34 -050084 ANGLE_TRY(mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1, 1));
Jamie Madill7b213812018-03-06 10:13:13 -050085
86 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Geoff Langf3e823d2019-01-14 12:40:34 -050087 ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
Jamie Madill7b213812018-03-06 10:13:13 -050088
Geoff Lang9e141642018-06-27 11:43:18 -040089 VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
Jamie Madill7b213812018-03-06 10:13:13 -050090
Shahbaz Youssefif83a28a2018-12-09 03:48:34 +010091 // Note that LUMA textures are not color-renderable, so a read-view with swizzle is not
92 // needed.
Geoff Langf3e823d2019-01-14 12:40:34 -050093 ANGLE_TRY(mImage->initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
94 &mImageView, 1));
Jamie Madille4c5a232018-03-02 21:00:31 -050095
96 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
97 vk::CommandBuffer *commandBuffer = nullptr;
Geoff Langf3e823d2019-01-14 12:40:34 -050098 ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
Jamie Madill93edca12018-03-30 10:43:18 -040099
Luc Ferrone6a40d02018-03-22 10:30:57 -0400100 if (isDepthOrStencilFormat)
101 {
Geoff Langf3e823d2019-01-14 12:40:34 -0500102 mImage->clearDepthStencil(aspect, aspect, kDefaultClearDepthStencilValue,
103 commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400104 }
105 else
106 {
Geoff Langf3e823d2019-01-14 12:40:34 -0500107 mImage->clearColor(kBlackClearColorValue, 0, 1, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400108 }
Geoff Langf3e823d2019-01-14 12:40:34 -0500109
110 mRenderTarget.init(mImage, &mImageView, 0, nullptr);
Jamie Madill7b213812018-03-06 10:13:13 -0500111 }
112
Jamie Madill7c985f52018-11-29 18:16:17 -0500113 return angle::Result::Continue;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400114}
115
Jamie Madillc2328a12018-10-18 15:00:29 -0400116angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context,
117 size_t samples,
118 GLenum internalformat,
119 size_t width,
120 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400121{
Jamie Madillc2328a12018-10-18 15:00:29 -0400122 ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
Jamie Madill7c985f52018-11-29 18:16:17 -0500123 return angle::Result::Stop;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400124}
125
Jamie Madillc2328a12018-10-18 15:00:29 -0400126angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context,
127 egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400128{
Jamie Madillc2328a12018-10-18 15:00:29 -0400129 ANGLE_VK_UNREACHABLE(vk::GetImpl(context));
Jamie Madill7c985f52018-11-29 18:16:17 -0500130 return angle::Result::Stop;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400131}
132
Jamie Madill6f755b22018-10-09 12:48:54 -0400133angle::Result RenderbufferVk::getAttachmentRenderTarget(const gl::Context *context,
134 GLenum binding,
135 const gl::ImageIndex &imageIndex,
136 FramebufferAttachmentRenderTarget **rtOut)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400137{
Geoff Langf3e823d2019-01-14 12:40:34 -0500138 ASSERT(mImage && mImage->valid());
Jamie Madill0cbfa582018-02-15 14:45:41 -0500139 *rtOut = &mRenderTarget;
Jamie Madill7c985f52018-11-29 18:16:17 -0500140 return angle::Result::Continue;
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400141}
142
Jamie Madill6f755b22018-10-09 12:48:54 -0400143angle::Result RenderbufferVk::initializeContents(const gl::Context *context,
144 const gl::ImageIndex &imageIndex)
Jamie Madill05b35b22017-10-03 09:01:44 -0400145{
146 UNIMPLEMENTED();
Jamie Madill7c985f52018-11-29 18:16:17 -0500147 return angle::Result::Continue;
Jamie Madill05b35b22017-10-03 09:01:44 -0400148}
149
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400150} // namespace rx