blob: eceee0922e99ba3e263fc58e65522e43c93aaca8 [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 Madillc57ee252018-05-30 19:53:48 -040041 renderer->releaseObject(getStoredQueueSerial(), &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 Madill12eb3d72018-02-14 12:34:45 -050056
Jamie Madill7b213812018-03-06 10:13:13 -050057 if (mImage.valid())
58 {
59 // Check against the state if we need to recreate the storage.
60 if (internalformat != mState.getFormat().info->internalFormat ||
61 static_cast<GLsizei>(width) != mState.getWidth() ||
62 static_cast<GLsizei>(height) != mState.getHeight())
63 {
Jamie Madill93edca12018-03-30 10:43:18 -040064 mImage.release(renderer->getCurrentQueueSerial(), renderer);
Jamie Madillc57ee252018-05-30 19:53:48 -040065 renderer->releaseObject(getStoredQueueSerial(), &mImageView);
Jamie Madill7b213812018-03-06 10:13:13 -050066 onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
67 }
68 }
Jamie Madill0cbfa582018-02-15 14:45:41 -050069
Jamie Madill7b213812018-03-06 10:13:13 -050070 if (!mImage.valid() && (width != 0 || height != 0))
71 {
Luc Ferrone6a40d02018-03-22 10:30:57 -040072 const angle::Format &textureFormat = vkFormat.textureFormat();
73 bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
Jamie Madill7b213812018-03-06 10:13:13 -050074 const VkImageUsageFlags usage =
Luc Ferrone6a40d02018-03-22 10:30:57 -040075 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
76 VK_IMAGE_USAGE_SAMPLED_BIT |
77 (textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
78 (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
Jamie Madill7b213812018-03-06 10:13:13 -050079
Jamie Madillbc543422018-03-30 10:43:19 -040080 gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
Jamie Madill21061022018-07-12 23:56:30 -040081 ANGLE_TRY(mImage.init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1));
Jamie Madill7b213812018-03-06 10:13:13 -050082
83 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill21061022018-07-12 23:56:30 -040084 ANGLE_TRY(mImage.initMemory(contextVk, renderer->getMemoryProperties(), flags));
Jamie Madill7b213812018-03-06 10:13:13 -050085
Geoff Lang9e141642018-06-27 11:43:18 -040086 VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
Jamie Madill7b213812018-03-06 10:13:13 -050087
Jamie Madill21061022018-07-12 23:56:30 -040088 ANGLE_TRY(mImage.initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
Luc Ferron66410532018-04-20 12:47:45 -040089 &mImageView, 1));
Jamie Madille4c5a232018-03-02 21:00:31 -050090
91 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
92 vk::CommandBuffer *commandBuffer = nullptr;
Jamie Madill21061022018-07-12 23:56:30 -040093 ANGLE_TRY(beginWriteResource(contextVk, &commandBuffer));
Jamie Madill93edca12018-03-30 10:43:18 -040094
Luc Ferrone6a40d02018-03-22 10:30:57 -040095 if (isDepthOrStencilFormat)
96 {
Jamie Madill858c1cc2018-03-31 14:19:13 -040097 mImage.clearDepthStencil(aspect, kDefaultClearDepthStencilValue, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -040098 }
99 else
100 {
Luc Ferronc20b9502018-05-24 09:30:17 -0400101 mImage.clearColor(kBlackClearColorValue, 0, 1, commandBuffer);
Luc Ferrone6a40d02018-03-22 10:30:57 -0400102 }
Jamie Madill7b213812018-03-06 10:13:13 -0500103 }
104
Jamie Madill12eb3d72018-02-14 12:34:45 -0500105 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400106}
107
Jamie Madillea84f6f2017-09-20 13:20:30 -0400108gl::Error RenderbufferVk::setStorageMultisample(const gl::Context *context,
109 size_t samples,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400110 GLenum internalformat,
111 size_t width,
112 size_t height)
113{
114 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500115 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400116}
117
Jamie Madillea84f6f2017-09-20 13:20:30 -0400118gl::Error RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400119{
120 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500121 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400122}
123
Jamie Madill0cbfa582018-02-15 14:45:41 -0500124gl::Error RenderbufferVk::getAttachmentRenderTarget(const gl::Context * /*context*/,
125 GLenum /*binding*/,
126 const gl::ImageIndex & /*imageIndex*/,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400127 FramebufferAttachmentRenderTarget **rtOut)
128{
Jamie Madill0cbfa582018-02-15 14:45:41 -0500129 ASSERT(mImage.valid());
130 *rtOut = &mRenderTarget;
131 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400132}
133
Jamie Madill05b35b22017-10-03 09:01:44 -0400134gl::Error RenderbufferVk::initializeContents(const gl::Context *context,
135 const gl::ImageIndex &imageIndex)
136{
137 UNIMPLEMENTED();
138 return gl::NoError();
139}
140
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400141} // namespace rx