blob: 042921960c620d30ba7b0e20c6fd6cc851875cbb [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 Madill93edca12018-03-30 10:43:18 -040026RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) : RenderbufferImpl(state)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040027{
Jamie Madill93edca12018-03-30 10:43:18 -040028 mRenderTarget.image = &mImage.getImage();
Jamie Madill7b213812018-03-06 10:13:13 -050029 mRenderTarget.imageView = &mImageView;
30 mRenderTarget.resource = this;
Jamie Madill9e54b5a2016-05-25 12:57:39 -040031}
32
33RenderbufferVk::~RenderbufferVk()
34{
35}
36
Jamie Madill12eb3d72018-02-14 12:34:45 -050037gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
38{
39 ContextVk *contextVk = vk::GetImpl(context);
40 RendererVk *renderer = contextVk->getRenderer();
41
Jamie Madill93edca12018-03-30 10:43:18 -040042 mImage.release(renderer->getCurrentQueueSerial(), renderer);
Jamie Madill0cbfa582018-02-15 14:45:41 -050043 renderer->releaseResource(*this, &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050044
45 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
46
Jamie Madill12eb3d72018-02-14 12:34:45 -050047 return gl::NoError();
48}
49
Jamie Madillea84f6f2017-09-20 13:20:30 -040050gl::Error RenderbufferVk::setStorage(const gl::Context *context,
51 GLenum internalformat,
52 size_t width,
53 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040054{
Jamie Madill12eb3d72018-02-14 12:34:45 -050055 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050056 RendererVk *renderer = contextVk->getRenderer();
57 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050058 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050059
Jamie Madill7b213812018-03-06 10:13:13 -050060 if (mImage.valid())
61 {
62 // Check against the state if we need to recreate the storage.
63 if (internalformat != mState.getFormat().info->internalFormat ||
64 static_cast<GLsizei>(width) != mState.getWidth() ||
65 static_cast<GLsizei>(height) != mState.getHeight())
66 {
Jamie Madill93edca12018-03-30 10:43:18 -040067 mImage.release(renderer->getCurrentQueueSerial(), renderer);
Jamie Madill7b213812018-03-06 10:13:13 -050068 renderer->releaseResource(*this, &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050069 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
70 }
71 }
Jamie Madill0cbfa582018-02-15 14:45:41 -050072
73 // Init RenderTarget.
74 mRenderTarget.extents.width = static_cast<int>(width);
75 mRenderTarget.extents.height = static_cast<int>(height);
76 mRenderTarget.extents.depth = 1;
77 mRenderTarget.format = &vkFormat;
Jamie Madill0cbfa582018-02-15 14:45:41 -050078 mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
79
Jamie Madill7b213812018-03-06 10:13:13 -050080 if (!mImage.valid() && (width != 0 || height != 0))
81 {
Luc Ferrone6a40d02018-03-22 10:30:57 -040082 const angle::Format &textureFormat = vkFormat.textureFormat();
83 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
Jamie Madill7b213812018-03-06 10:13:13 -050084 const VkImageUsageFlags usage =
Luc Ferrone6a40d02018-03-22 10:30:57 -040085 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
86 VK_IMAGE_USAGE_SAMPLED_BIT |
87 (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
88 (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050089
Jamie Madill93edca12018-03-30 10:43:18 -040090 ANGLE_TRY(mImage.init2D(device, mRenderTarget.extents, vkFormat, 1, usage));
Jamie Madill7b213812018-03-06 10:13:13 -050091
92 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill93edca12018-03-30 10:43:18 -040093 ANGLE_TRY(mImage.initMemory(device, renderer->getMemoryProperties(), flags));
Jamie Madill7b213812018-03-06 10:13:13 -050094
Luc Ferrone6a40d02018-03-22 10:30:57 -040095 VkImageAspectFlags aspect =
96 (textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
97 (textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
98 (textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050099
Jamie Madill93edca12018-03-30 10:43:18 -0400100 ANGLE_TRY(mImage.initImageView(device, aspect, gl::SwizzleState(), &mImageView));
Jamie Madille4c5a232018-03-02 21:00:31 -0500101
102 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
103 vk::CommandBuffer *commandBuffer = nullptr;
104 ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
Jamie Madill93edca12018-03-30 10:43:18 -0400105
106 mImage.getImage().changeLayoutWithStages(
107 VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
108 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400109
110 if (isDepthOrStencilFormat)
111 {
Jamie Madill93edca12018-03-30 10:43:18 -0400112 commandBuffer->clearSingleDepthStencilImage(mImage.getImage(), aspect,
Luc Ferrone6a40d02018-03-22 10:30:57 -0400113 kDefaultClearDepthStencilValue);
114 }
115 else
116 {
Jamie Madill93edca12018-03-30 10:43:18 -0400117 commandBuffer->clearSingleColorImage(mImage.getImage(), kBlackClearColorValue);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400118 }
Jamie Madill7b213812018-03-06 10:13:13 -0500119 }
120
Jamie Madill12eb3d72018-02-14 12:34:45 -0500121 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400122}
123
Jamie Madillea84f6f2017-09-20 13:20:30 -0400124gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
125 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400126 GLenum internalformat,
127 size_t width,
128 size_t height)
129{
130 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500131 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400132}
133
Jamie Madillea84f6f2017-09-20 13:20:30 -0400134gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400135{
136 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500137 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400138}
139
Jamie Madill0cbfa582018-02-15 14:45:41 -0500140gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
141 GLenum /*binding*/,
142 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400143 FramebufferAttachmentRenderTarget **rtOut)
144{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500145 ASSERT(mImage.valid());
146 *rtOut = &mRenderTarget;
147 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400148}
149
Jamie Madill05b35b22017-10-03 09:01:44 -0400150gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
151 const gl::ImageIndex &imageIndex)
152{
153 UNIMPLEMENTED();
154 return gl::NoError();
155}
156
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400157} // namespace rx