Vulkan: Add an Image helper class.
This class wraps a lot of the common functionality of a vk::Image.
It keeps an associated DeviceMemory and ImageView.
Eventually we can probably merge this class with RenderTargetVk. We
can also use it to implement the same functionality between
Renderbuffer and Texture and abstract different storage types, like
2D and Cube.
Bug: angleproject:2318
Change-Id: I39239f47b483cfb96290a15b06edd264f7f4bb34
Reviewed-on: https://chromium-review.googlesource.com/980772
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
Reviewed-by: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
index a93ed42..0429219 100644
--- a/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RenderbufferVk.cpp
@@ -23,10 +23,9 @@
} // anonymous namespace
-RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
- : RenderbufferImpl(state), mAllocatedMemorySize(0)
+RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) : RenderbufferImpl(state)
{
- mRenderTarget.image = &mImage;
+ mRenderTarget.image = &mImage.getImage();
mRenderTarget.imageView = &mImageView;
mRenderTarget.resource = this;
}
@@ -40,8 +39,7 @@
ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer();
- renderer->releaseResource(*this, &mImage);
- renderer->releaseResource(*this, &mDeviceMemory);
+ mImage.release(renderer->getCurrentQueueSerial(), renderer);
renderer->releaseResource(*this, &mImageView);
onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
@@ -66,11 +64,8 @@
static_cast<GLsizei>(width) != mState.getWidth() ||
static_cast<GLsizei>(height) != mState.getHeight())
{
- ASSERT(mImageView.valid());
- renderer->releaseResource(*this, &mImage);
- renderer->releaseResource(*this, &mDeviceMemory);
+ mImage.release(renderer->getCurrentQueueSerial(), renderer);
renderer->releaseResource(*this, &mImageView);
-
onStateChange(context, angle::SubjectMessage::DEPENDENT_DIRTY_BITS);
}
}
@@ -92,71 +87,34 @@
(textureFormat.redBits > 0 ? VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT : 0) |
(isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
- VkImageCreateInfo imageInfo;
- imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- imageInfo.pNext = nullptr;
- imageInfo.flags = 0;
- imageInfo.imageType = VK_IMAGE_TYPE_2D;
- imageInfo.format = vkFormat.vkTextureFormat;
- imageInfo.extent.width = static_cast<uint32_t>(width);
- imageInfo.extent.height = static_cast<uint32_t>(height);
- imageInfo.extent.depth = 1;
- imageInfo.mipLevels = 1;
- imageInfo.arrayLayers = 1;
- imageInfo.samples = VK_SAMPLE_COUNT_1_BIT;
- imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL;
- imageInfo.usage = usage;
- imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- imageInfo.queueFamilyIndexCount = 0;
- imageInfo.pQueueFamilyIndices = nullptr;
- imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-
- ANGLE_TRY(mImage.init(device, imageInfo));
+ ANGLE_TRY(mImage.init2D(device, mRenderTarget.extents, vkFormat, 1, usage));
VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
- ANGLE_TRY(vk::AllocateImageMemory(renderer, flags, &mImage, &mDeviceMemory,
- &mAllocatedMemorySize));
+ ANGLE_TRY(mImage.initMemory(device, renderer->getMemoryProperties(), flags));
VkImageAspectFlags aspect =
(textureFormat.depthBits > 0 ? VK_IMAGE_ASPECT_DEPTH_BIT : 0) |
(textureFormat.stencilBits > 0 ? VK_IMAGE_ASPECT_STENCIL_BIT : 0) |
(textureFormat.redBits > 0 ? VK_IMAGE_ASPECT_COLOR_BIT : 0);
- // Allocate ImageView.
- VkImageViewCreateInfo viewInfo;
- viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- viewInfo.pNext = nullptr;
- viewInfo.flags = 0;
- viewInfo.image = mImage.getHandle();
- viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
- viewInfo.format = vkFormat.vkTextureFormat;
- viewInfo.components.r = VK_COMPONENT_SWIZZLE_R;
- viewInfo.components.g = VK_COMPONENT_SWIZZLE_G;
- viewInfo.components.b = VK_COMPONENT_SWIZZLE_B;
- viewInfo.components.a = VK_COMPONENT_SWIZZLE_A;
- viewInfo.subresourceRange.aspectMask = aspect;
- viewInfo.subresourceRange.baseMipLevel = 0;
- viewInfo.subresourceRange.levelCount = 1;
- viewInfo.subresourceRange.baseArrayLayer = 0;
- viewInfo.subresourceRange.layerCount = 1;
-
- ANGLE_TRY(mImageView.init(device, viewInfo));
+ ANGLE_TRY(mImage.initImageView(device, aspect, gl::SwizzleState(), &mImageView));
// TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
- mImage.changeLayoutWithStages(aspect, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
- VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
+
+ mImage.getImage().changeLayoutWithStages(
+ VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, commandBuffer);
if (isDepthOrStencilFormat)
{
- commandBuffer->clearSingleDepthStencilImage(mImage, aspect,
+ commandBuffer->clearSingleDepthStencilImage(mImage.getImage(), aspect,
kDefaultClearDepthStencilValue);
}
else
{
- commandBuffer->clearSingleColorImage(mImage, kBlackClearColorValue);
+ commandBuffer->clearSingleColorImage(mImage.getImage(), kBlackClearColorValue);
}
}