blob: 6919c6b75f840478ad8096cf49f9ab75781c4a53 [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)
27 : RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, this)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040028{
29}
30
31RenderbufferVk::~RenderbufferVk()
32{
33}
34
Jamie Madill12eb3d72018-02-14 12:34:45 -050035gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
36{
37 ContextVk *contextVk = vk::GetImpl(context);
38 RendererVk *renderer = contextVk->getRenderer();
39
Jamie Madill93edca12018-03-30 10:43:18 -040040 mImage.release(renderer->getCurrentQueueSerial(), renderer);
Jamie Madill0cbfa582018-02-15 14:45:41 -050041 renderer->releaseResource(*this, &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050042
43 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
44
Jamie Madill12eb3d72018-02-14 12:34:45 -050045 return gl::NoError();
46}
47
Jamie Madillea84f6f2017-09-20 13:20:30 -040048gl::Error RenderbufferVk::setStorage(const gl::Context *context,
49 GLenum internalformat,
50 size_t width,
51 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040052{
Jamie Madill12eb3d72018-02-14 12:34:45 -050053 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050054 RendererVk *renderer = contextVk->getRenderer();
55 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050056 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050057
Jamie Madill7b213812018-03-06 10:13:13 -050058 if (mImage.valid())
59 {
60 // Check against the state if we need to recreate the storage.
61 if (internalformat != mState.getFormat().info->internalFormat ||
62 static_cast<GLsizei>(width) != mState.getWidth() ||
63 static_cast<GLsizei>(height) != mState.getHeight())
64 {
Jamie Madill93edca12018-03-30 10:43:18 -040065 mImage.release(renderer->getCurrentQueueSerial(), renderer);
Jamie Madill7b213812018-03-06 10:13:13 -050066 renderer->releaseResource(*this, &mImageView);
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
Jamie Madill7b213812018-03-06 10:13:13 -050071 if (!mImage.valid() && (width != 0 || height != 0))
72 {
Luc Ferrone6a40d02018-03-22 10:30:57 -040073 const angle::Format &textureFormat = vkFormat.textureFormat();
74 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
Jamie Madill7b213812018-03-06 10:13:13 -050075 const VkImageUsageFlags usage =
Luc Ferrone6a40d02018-03-22 10:30:57 -040076 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
77 VK_IMAGE_USAGE_SAMPLED_BIT |
78 (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
79 (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050080
Jamie Madillbc543422018-03-30 10:43:19 -040081 gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
Luc Ferron66410532018-04-20 12:47:45 -040082 ANGLE_TRY(mImage.init(device, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1));
Jamie Madill7b213812018-03-06 10:13:13 -050083
84 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill93edca12018-03-30 10:43:18 -040085 ANGLE_TRY(mImage.initMemory(device, renderer->getMemoryProperties(), flags));
Jamie Madill7b213812018-03-06 10:13:13 -050086
Luc Ferrone6a40d02018-03-22 10:30:57 -040087 VkImageAspectFlags aspect =
88 (textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
89 (textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
90 (textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050091
Jamie Madill20fa8d52018-04-15 10:09:32 -040092 ANGLE_TRY(mImage.initImageView(device, gl::TextureType::_2D, aspect, gl::SwizzleState(),
Luc Ferron66410532018-04-20 12:47:45 -040093 &mImageView, 1));
Jamie Madille4c5a232018-03-02 21:00:31 -050094
95 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
96 vk::CommandBuffer *commandBuffer = nullptr;
97 ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
Jamie Madill93edca12018-03-30 10:43:18 -040098
Luc Ferrone6a40d02018-03-22 10:30:57 -040099 if (isDepthOrStencilFormat)
100 {
Jamie Madill858c1cc2018-03-31 14:19:13 -0400101 mImage.clearDepthStencil(aspect, kDefaultClearDepthStencilValue, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400102 }
103 else
104 {
Luc Ferronc20b9502018-05-24 09:30:17 -0400105 mImage.clearColor(kBlackClearColorValue, 0, 1, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400106 }
Jamie Madill7b213812018-03-06 10:13:13 -0500107 }
108
Jamie Madill12eb3d72018-02-14 12:34:45 -0500109 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400110}
111
Jamie Madillea84f6f2017-09-20 13:20:30 -0400112gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
113 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400114 GLenum internalformat,
115 size_t width,
116 size_t height)
117{
118 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500119 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400120}
121
Jamie Madillea84f6f2017-09-20 13:20:30 -0400122gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400123{
124 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500125 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400126}
127
Jamie Madill0cbfa582018-02-15 14:45:41 -0500128gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
129 GLenum /*binding*/,
130 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400131 FramebufferAttachmentRenderTarget **rtOut)
132{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500133 ASSERT(mImage.valid());
134 *rtOut = &mRenderTarget;
135 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400136}
137
Jamie Madill05b35b22017-10-03 09:01:44 -0400138gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
139 const gl::ImageIndex &imageIndex)
140{
141 UNIMPLEMENTED();
142 return gl::NoError();
143}
144
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400145} // namespace rx