blob: 755921576c0608dbc625058355e1d9bc899f3e9a [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// TextureVk.cpp:
7// Implements the class methods for TextureVk.
8//
9
10#include "libANGLE/renderer/vulkan/TextureVk.h"
11
12#include "common/debug.h"
Jamie Madill035fd6b2017-10-03 15:43:22 -040013#include "libANGLE/Context.h"
14#include "libANGLE/renderer/vulkan/ContextVk.h"
15#include "libANGLE/renderer/vulkan/RendererVk.h"
16#include "libANGLE/renderer/vulkan/formatutilsvk.h"
Jamie Madill9e54b5a2016-05-25 12:57:39 -040017
18namespace rx
19{
20
21TextureVk::TextureVk(const gl::TextureState &state) : TextureImpl(state)
22{
23}
24
25TextureVk::~TextureVk()
26{
27}
28
Jamie Madill035fd6b2017-10-03 15:43:22 -040029gl::Error TextureVk::onDestroy(const gl::Context *context)
30{
31 ContextVk *contextVk = GetImplAs<ContextVk>(context);
32 RendererVk *renderer = contextVk->getRenderer();
33
34 renderer->enqueueGarbageOrDeleteNow(*this, std::move(mImage));
35 renderer->enqueueGarbageOrDeleteNow(*this, std::move(mDeviceMemory));
36 renderer->enqueueGarbageOrDeleteNow(*this, std::move(mImageView));
37
38 return gl::NoError();
39}
40
Jamie Madillc564c072017-06-01 12:45:42 -040041gl::Error TextureVk::setImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -050042 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -040043 size_t level,
44 GLenum internalFormat,
45 const gl::Extents &size,
46 GLenum format,
47 GLenum type,
48 const gl::PixelUnpackState &unpack,
49 const uint8_t *pixels)
50{
Jamie Madill035fd6b2017-10-03 15:43:22 -040051 // TODO(jmadill): support multi-level textures.
52 ASSERT(level == 0);
53
54 // TODO(jmadill): support texture re-definition.
55 ASSERT(!mImage.valid());
56
57 // TODO(jmadill): support other types of textures.
58 ASSERT(target == GL_TEXTURE_2D);
59
60 // Convert internalFormat to sized internal format.
61 const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat, type);
62 const vk::Format &vkFormat = vk::Format::Get(formatInfo.sizedInternalFormat);
63
64 VkImageCreateInfo imageInfo;
65 imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
66 imageInfo.pNext = nullptr;
67 imageInfo.flags = 0;
68 imageInfo.imageType = VK_IMAGE_TYPE_2D;
69 imageInfo.format = vkFormat.native;
70 imageInfo.extent.width = size.width;
71 imageInfo.extent.height = size.height;
72 imageInfo.extent.depth = size.depth;
73 imageInfo.mipLevels = 1;
74 imageInfo.arrayLayers = 1;
75 imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
76 imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
77
78 // TODO(jmadill): Are all these image transfer bits necessary?
79 imageInfo.usage = (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
80 VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
81 imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
82 imageInfo.queueFamilyIndexCount = 0;
83 imageInfo.pQueueFamilyIndices = nullptr;
84 imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
85
86 ContextVk *contextVk = GetImplAs<ContextVk>(context);
87 VkDevice device = contextVk->getDevice();
88 ANGLE_TRY(mImage.init(device, imageInfo));
89
90 // Allocate the device memory for the image.
91 // TODO(jmadill): Use more intelligent device memory allocation.
92 VkMemoryRequirements memoryRequirements;
93 mImage.getMemoryRequirements(device, &memoryRequirements);
94
95 RendererVk *renderer = contextVk->getRenderer();
96
97 uint32_t memoryIndex = renderer->getMemoryProperties().findCompatibleMemoryIndex(
98 memoryRequirements.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
99
100 VkMemoryAllocateInfo allocateInfo;
101 allocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
102 allocateInfo.pNext = nullptr;
103 allocateInfo.allocationSize = memoryRequirements.size;
104 allocateInfo.memoryTypeIndex = memoryIndex;
105
106 ANGLE_TRY(mDeviceMemory.allocate(device, allocateInfo));
107 ANGLE_TRY(mImage.bindMemory(device, mDeviceMemory));
108
109 VkImageViewCreateInfo viewInfo;
110 viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
111 viewInfo.pNext = nullptr;
112 viewInfo.flags = 0;
113 viewInfo.image = mImage.getHandle();
114 viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
115 viewInfo.format = vkFormat.native;
116 viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
117 viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
118 viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
119 viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
120 viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
121 viewInfo.subresourceRange.baseMipLevel = 0;
122 viewInfo.subresourceRange.levelCount = 1;
123 viewInfo.subresourceRange.baseArrayLayer = 0;
124 viewInfo.subresourceRange.layerCount = 1;
125
126 ANGLE_TRY(mImageView.init(device, viewInfo));
127
128 // Handle initial data.
129 // TODO(jmadill): Consider re-using staging texture.
130 if (pixels)
131 {
132 vk::StagingImage stagingImage;
133 ANGLE_TRY(renderer->createStagingImage(TextureDimension::TEX_2D, vkFormat, size,
134 vk::StagingUsage::Write, &stagingImage));
135
136 GLuint inputRowPitch = 0;
137 ANGLE_TRY_RESULT(
138 formatInfo.computeRowPitch(type, size.width, unpack.alignment, unpack.rowLength),
139 inputRowPitch);
140
141 GLuint inputDepthPitch = 0;
142 ANGLE_TRY_RESULT(
143 formatInfo.computeDepthPitch(size.height, unpack.imageHeight, inputRowPitch),
144 inputDepthPitch);
145
146 // TODO(jmadill): skip images for 3D Textures.
147 bool applySkipImages = false;
148
149 GLuint inputSkipBytes = 0;
150 ANGLE_TRY_RESULT(
151 formatInfo.computeSkipBytes(inputRowPitch, inputDepthPitch, unpack, applySkipImages),
152 inputSkipBytes);
153
154 auto loadFunction = vkFormat.getLoadFunctions()(type);
155
156 uint8_t *mapPointer = nullptr;
157 ANGLE_TRY(
158 stagingImage.getDeviceMemory().map(device, 0, stagingImage.getSize(), 0, &mapPointer));
159
160 const uint8_t *source = pixels + inputSkipBytes;
161
162 loadFunction.loadFunction(size.width, size.height, size.depth, source, inputRowPitch,
163 inputDepthPitch, mapPointer, inputRowPitch, inputDepthPitch);
164
165 stagingImage.getDeviceMemory().unmap(device);
166
167 vk::CommandBuffer *commandBuffer = nullptr;
168 ANGLE_TRY(contextVk->getStartedCommandBuffer(&commandBuffer));
169 setQueueSerial(renderer->getCurrentQueueSerial());
170
171 stagingImage.getImage().changeLayoutTop(
172 VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, commandBuffer);
173 mImage.changeLayoutTop(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
174 commandBuffer);
175
176 gl::Box wholeRegion(0, 0, 0, size.width, size.height, size.depth);
177 commandBuffer->copySingleImage(stagingImage.getImage(), mImage, wholeRegion,
178 VK_IMAGE_ASPECT_COLOR_BIT);
179
180 // TODO(jmadill): Re-use staging images.
181 renderer->enqueueGarbage(renderer->getCurrentQueueSerial(), std::move(stagingImage));
182 }
183
184 return gl::NoError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400185}
186
Jamie Madillc564c072017-06-01 12:45:42 -0400187gl::Error TextureVk::setSubImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500188 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400189 size_t level,
190 const gl::Box &area,
191 GLenum format,
192 GLenum type,
193 const gl::PixelUnpackState &unpack,
194 const uint8_t *pixels)
195{
196 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500197 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400198}
199
Jamie Madillc564c072017-06-01 12:45:42 -0400200gl::Error TextureVk::setCompressedImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500201 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400202 size_t level,
203 GLenum internalFormat,
204 const gl::Extents &size,
205 const gl::PixelUnpackState &unpack,
206 size_t imageSize,
207 const uint8_t *pixels)
208{
209 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500210 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400211}
212
Jamie Madillc564c072017-06-01 12:45:42 -0400213gl::Error TextureVk::setCompressedSubImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500214 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400215 size_t level,
216 const gl::Box &area,
217 GLenum format,
218 const gl::PixelUnpackState &unpack,
219 size_t imageSize,
220 const uint8_t *pixels)
221{
222 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500223 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400224}
225
Jamie Madillc564c072017-06-01 12:45:42 -0400226gl::Error TextureVk::copyImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500227 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400228 size_t level,
229 const gl::Rectangle &sourceArea,
230 GLenum internalFormat,
231 const gl::Framebuffer *source)
232{
233 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500234 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400235}
236
Jamie Madillc564c072017-06-01 12:45:42 -0400237gl::Error TextureVk::copySubImage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500238 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400239 size_t level,
240 const gl::Offset &destOffset,
241 const gl::Rectangle &sourceArea,
242 const gl::Framebuffer *source)
243{
244 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500245 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400246}
247
Jamie Madillc564c072017-06-01 12:45:42 -0400248gl::Error TextureVk::setStorage(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500249 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400250 size_t levels,
251 GLenum internalFormat,
252 const gl::Extents &size)
253{
254 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500255 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400256}
257
Jamie Madill4928b7c2017-06-20 12:57:39 -0400258gl::Error TextureVk::setEGLImageTarget(const gl::Context *context, GLenum target, egl::Image *image)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400259{
260 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500261 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400262}
263
Jamie Madill4928b7c2017-06-20 12:57:39 -0400264gl::Error TextureVk::setImageExternal(const gl::Context *context,
265 GLenum target,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400266 egl::Stream *stream,
267 const egl::Stream::GLTextureDescription &desc)
268{
269 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500270 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400271}
272
Jamie Madillc564c072017-06-01 12:45:42 -0400273gl::Error TextureVk::generateMipmap(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400274{
275 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500276 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400277}
278
Jamie Madill4928b7c2017-06-20 12:57:39 -0400279gl::Error TextureVk::setBaseLevel(const gl::Context *context, GLuint baseLevel)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400280{
281 UNIMPLEMENTED();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400282 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400283}
284
Jamie Madill4928b7c2017-06-20 12:57:39 -0400285gl::Error TextureVk::bindTexImage(const gl::Context *context, egl::Surface *surface)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400286{
287 UNIMPLEMENTED();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400288 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400289}
290
Jamie Madill4928b7c2017-06-20 12:57:39 -0400291gl::Error TextureVk::releaseTexImage(const gl::Context *context)
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400292{
293 UNIMPLEMENTED();
Jamie Madill4928b7c2017-06-20 12:57:39 -0400294 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400295}
296
Jamie Madill4928b7c2017-06-20 12:57:39 -0400297gl::Error TextureVk::getAttachmentRenderTarget(const gl::Context *context,
298 GLenum binding,
Jamie Madill4fd95d52017-04-05 11:22:18 -0400299 const gl::ImageIndex &imageIndex,
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400300 FramebufferAttachmentRenderTarget **rtOut)
301{
302 UNIMPLEMENTED();
Yuly Novikovc4d18aa2017-03-09 18:45:02 -0500303 return gl::InternalError();
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400304}
305
Geoff Lang22416862016-06-08 16:14:36 -0700306void TextureVk::syncState(const gl::Texture::DirtyBits &dirtyBits)
307{
308 UNIMPLEMENTED();
309}
310
Jamie Madillc564c072017-06-01 12:45:42 -0400311gl::Error TextureVk::setStorageMultisample(const gl::Context *context,
Jamie Madill8897afa2017-02-06 17:17:23 -0500312 GLenum target,
JiangYizhoubddc46b2016-12-09 09:50:51 +0800313 GLsizei samples,
314 GLint internalformat,
315 const gl::Extents &size,
316 GLboolean fixedSampleLocations)
317{
318 UNIMPLEMENTED();
319 return gl::InternalError() << "setStorageMultisample is unimplemented.";
320}
321
Jamie Madill05b35b22017-10-03 09:01:44 -0400322gl::Error TextureVk::initializeContents(const gl::Context *context,
323 const gl::ImageIndex &imageIndex)
324{
325 UNIMPLEMENTED();
326 return gl::NoError();
327}
328
Jamie Madill9e54b5a2016-05-25 12:57:39 -0400329} // namespace rx