blob: 1689c66d294bd8a3bb1145f73b9cfd7473d94937 [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
Jamie Madille703c602018-02-20 10:21:48 -050019RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
20 : RenderbufferImpl(state), mRequiredSize(0)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040021{
22}
23
24RenderbufferVk::~RenderbufferVk()
25{
26}
27
Jamie Madill12eb3d72018-02-14 12:34:45 -050028gl::Error RenderbufferVk::onDestroy(const gl::Context *context)
29{
30 ContextVk *contextVk = vk::GetImpl(context);
31 RendererVk *renderer = contextVk->getRenderer();
32
33 renderer->releaseResource(*this, &mImage);
34 renderer->releaseResource(*this, &mDeviceMemory);
Jamie Madill0cbfa582018-02-15 14:45:41 -050035 renderer->releaseResource(*this, &mImageView);
Jamie Madill12eb3d72018-02-14 12:34:45 -050036 return gl::NoError();
37}
38
Jamie Madillea84f6f2017-09-20 13:20:30 -040039gl::Error RenderbufferVk::setStorage(const gl::Context *context,
40 GLenum internalformat,
41 size_t width,
42 size_t height)
Jamie Madill9e54b5a2016-05-25 12:57:39 -040043{
Jamie Madill12eb3d72018-02-14 12:34:45 -050044 ContextVk *contextVk = vk::GetImpl(context);
Jamie Madill57fbfd82018-02-14 12:45:34 -050045 RendererVk *renderer = contextVk->getRenderer();
46 const vk::Format &vkFormat = renderer->getFormat(internalformat);
Jamie Madill0cbfa582018-02-15 14:45:41 -050047 VkDevice device = renderer->getDevice();
Jamie Madill12eb3d72018-02-14 12:34:45 -050048
49 VkImageUsageFlags usage =
50 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
51 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT);
52
53 VkImageCreateInfo imageInfo;
54 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
55 imageInfo.pNext = nullptr;
56 imageInfo.flags = 0;
57 imageInfo.imageType = VK_IMAGE_TYPE_2D;
58 imageInfo.format = vkFormat.vkTextureFormat;
59 imageInfo.extent.width = static_cast<uint32_t>(width);
60 imageInfo.extent.height = static_cast<uint32_t>(height);
61 imageInfo.extent.depth = 1;
62 imageInfo.mipLevels = 1;
63 imageInfo.arrayLayers = 1;
64 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
65 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
66 imageInfo.usage = usage;
67 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
68 imageInfo.queueFamilyIndexCount = 0;
69 imageInfo.pQueueFamilyIndices = nullptr;
70 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
71
Jamie Madill0cbfa582018-02-15 14:45:41 -050072 ANGLE_TRY(mImage.init(device, imageInfo));
Jamie Madill12eb3d72018-02-14 12:34:45 -050073
74 VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
Jamie Madill57fbfd82018-02-14 12:45:34 -050075 ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory, &mRequiredSize));
Jamie Madill0cbfa582018-02-15 14:45:41 -050076
77 VkImageAspectFlags aspect = VK_IMAGE_ASPECT_COLOR_BIT;
78
79 // Allocate ImageView.
80 VkImageViewCreateInfo viewInfo;
81 viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
82 viewInfo.pNext = nullptr;
83 viewInfo.flags = 0;
84 viewInfo.image = mImage.getHandle();
85 viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
86 viewInfo.format = vkFormat.vkTextureFormat;
87 viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
88 viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
89 viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
90 viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
91 viewInfo.subresourceRange.aspectMask = aspect;
92 viewInfo.subresourceRange.baseMipLevel = 0;
93 viewInfo.subresourceRange.levelCount = 1;
94 viewInfo.subresourceRange.baseArrayLayer = 0;
95 viewInfo.subresourceRange.layerCount = 1;
96
97 ANGLE_TRY(mImageView.init(device, viewInfo));
98
99 // Init RenderTarget.
100 mRenderTarget.extents.width = static_cast<int>(width);
101 mRenderTarget.extents.height = static_cast<int>(height);
102 mRenderTarget.extents.depth = 1;
103 mRenderTarget.format = &vkFormat;
104 mRenderTarget.image = &mImage;
105 mRenderTarget.imageView = &mImageView;
106 mRenderTarget.resource = this;
107 mRenderTarget.samples = VK_SAMPLE_COUNT_1_BIT; // TODO(jmadill): Multisample bits.
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