Commit f3e823db by Geoff Lang Committed by Commit Bot

Vulkan: Store ImageHelper as a pointer in TextureVk and RenderbufferVk

Storing ImageHelper as a pointer allows the storage to be swapped or shared with other objects. BUG=angleproject:2668 Change-Id: I2e51f24737be59ffe9f472e9b0b592774a792cd1 Reviewed-on: https://chromium-review.googlesource.com/c/1409404 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent eb67ca6e
...@@ -16,11 +16,8 @@ ...@@ -16,11 +16,8 @@
namespace rx namespace rx
{ {
RenderTargetVk::RenderTargetVk(vk::ImageHelper *image, RenderTargetVk::RenderTargetVk()
vk::ImageView *imageView, : mImage(nullptr), mImageView(nullptr), mLayerIndex(0), mOwner(nullptr)
size_t layerIndex,
TextureVk *owner)
: mImage(image), mImageView(imageView), mLayerIndex(layerIndex), mOwner(owner)
{} {}
RenderTargetVk::~RenderTargetVk() {} RenderTargetVk::~RenderTargetVk() {}
...@@ -32,6 +29,25 @@ RenderTargetVk::RenderTargetVk(RenderTargetVk &&other) ...@@ -32,6 +29,25 @@ RenderTargetVk::RenderTargetVk(RenderTargetVk &&other)
mOwner(other.mOwner) mOwner(other.mOwner)
{} {}
void RenderTargetVk::init(vk::ImageHelper *image,
vk::ImageView *imageView,
size_t layerIndex,
TextureVk *owner)
{
mImage = image;
mImageView = imageView;
mLayerIndex = layerIndex;
mOwner = owner;
}
void RenderTargetVk::reset()
{
mImage = nullptr;
mImageView = nullptr;
mLayerIndex = 0;
mOwner = nullptr;
}
void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk, void RenderTargetVk::onColorDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer, vk::CommandBuffer *commandBuffer,
vk::RenderPassDesc *renderPassDesc) vk::RenderPassDesc *renderPassDesc)
......
...@@ -37,15 +37,18 @@ class TextureVk; ...@@ -37,15 +37,18 @@ class TextureVk;
class RenderTargetVk final : public FramebufferAttachmentRenderTarget class RenderTargetVk final : public FramebufferAttachmentRenderTarget
{ {
public: public:
RenderTargetVk(vk::ImageHelper *image, RenderTargetVk();
vk::ImageView *imageView,
size_t layerIndex,
TextureVk *ownwer);
~RenderTargetVk() override; ~RenderTargetVk() override;
// Used in std::vector initialization. // Used in std::vector initialization.
RenderTargetVk(RenderTargetVk &&other); RenderTargetVk(RenderTargetVk &&other);
void init(vk::ImageHelper *image,
vk::ImageView *imageView,
size_t layerIndex,
TextureVk *owner);
void reset();
// Note: RenderTargets should be called in order, with the depth/stencil onRender last. // Note: RenderTargets should be called in order, with the depth/stencil onRender last.
void onColorDraw(vk::FramebufferHelper *framebufferVk, void onColorDraw(vk::FramebufferHelper *framebufferVk,
vk::CommandBuffer *commandBuffer, vk::CommandBuffer *commandBuffer,
......
...@@ -24,7 +24,7 @@ constexpr VkClearColorValue kBlackClearColorValue = {{0}}; ...@@ -24,7 +24,7 @@ constexpr VkClearColorValue kBlackClearColorValue = {{0}};
} // anonymous namespace } // anonymous namespace
RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state) RenderbufferVk::RenderbufferVk(const gl::RenderbufferState &state)
: RenderbufferImpl(state), mRenderTarget(&mImage, &mImageView, 0, nullptr) : RenderbufferImpl(state), mImage(nullptr)
{} {}
RenderbufferVk::~RenderbufferVk() {} RenderbufferVk::~RenderbufferVk() {}
...@@ -34,8 +34,12 @@ void RenderbufferVk::onDestroy(const gl::Context *context) ...@@ -34,8 +34,12 @@ void RenderbufferVk::onDestroy(const gl::Context *context)
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
mImage.releaseImage(renderer); if (mImage)
mImage.releaseStagingBuffer(renderer); {
mImage->releaseImage(renderer);
mImage->releaseStagingBuffer(renderer);
SafeDelete(mImage);
}
renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView); renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView);
} }
...@@ -49,20 +53,25 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context, ...@@ -49,20 +53,25 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
const vk::Format &vkFormat = renderer->getFormat(internalformat); const vk::Format &vkFormat = renderer->getFormat(internalformat);
if (mImage.valid()) if (mImage != nullptr && mImage->valid())
{ {
// Check against the state if we need to recreate the storage. // Check against the state if we need to recreate the storage.
if (internalformat != mState.getFormat().info->internalFormat || if (internalformat != mState.getFormat().info->internalFormat ||
static_cast<GLsizei>(width) != mState.getWidth() || static_cast<GLsizei>(width) != mState.getWidth() ||
static_cast<GLsizei>(height) != mState.getHeight()) static_cast<GLsizei>(height) != mState.getHeight())
{ {
mImage.releaseImage(renderer); mImage->releaseImage(renderer);
renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView); renderer->releaseObject(renderer->getCurrentQueueSerial(), &mImageView);
} }
} }
if (!mImage.valid() && (width != 0 && height != 0)) if ((mImage == nullptr || !mImage->valid()) && (width != 0 && height != 0))
{ {
if (mImage == nullptr)
{
mImage = new vk::ImageHelper();
}
const angle::Format &textureFormat = vkFormat.textureFormat(); const angle::Format &textureFormat = vkFormat.textureFormat();
bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0; bool isDepthOrStencilFormat = textureFormat.depthBits > 0 || textureFormat.stencilBits > 0;
const VkImageUsageFlags usage = const VkImageUsageFlags usage =
...@@ -72,30 +81,33 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context, ...@@ -72,30 +81,33 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
(isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0); (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1); gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
ANGLE_TRY(mImage.init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1, 1)); ANGLE_TRY(mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1, 1));
VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(mImage.initMemory(contextVk, renderer->getMemoryProperties(), flags)); ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat); VkImageAspectFlags aspect = vk::GetFormatAspectFlags(textureFormat);
// Note that LUMA textures are not color-renderable, so a read-view with swizzle is not // Note that LUMA textures are not color-renderable, so a read-view with swizzle is not
// needed. // needed.
ANGLE_TRY(mImage.initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(), ANGLE_TRY(mImage->initImageView(contextVk, gl::TextureType::_2D, aspect, gl::SwizzleState(),
&mImageView, 1)); &mImageView, 1));
// TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361 // TODO(jmadill): Fold this into the RenderPass load/store ops. http://anglebug.com/2361
vk::CommandBuffer *commandBuffer = nullptr; vk::CommandBuffer *commandBuffer = nullptr;
ANGLE_TRY(mImage.recordCommands(contextVk, &commandBuffer)); ANGLE_TRY(mImage->recordCommands(contextVk, &commandBuffer));
if (isDepthOrStencilFormat) if (isDepthOrStencilFormat)
{ {
mImage.clearDepthStencil(aspect, aspect, kDefaultClearDepthStencilValue, commandBuffer); mImage->clearDepthStencil(aspect, aspect, kDefaultClearDepthStencilValue,
commandBuffer);
} }
else else
{ {
mImage.clearColor(kBlackClearColorValue, 0, 1, commandBuffer); mImage->clearColor(kBlackClearColorValue, 0, 1, commandBuffer);
} }
mRenderTarget.init(mImage, &mImageView, 0, nullptr);
} }
return angle::Result::Continue; return angle::Result::Continue;
...@@ -123,7 +135,7 @@ angle::Result RenderbufferVk::getAttachmentRenderTarget(const gl::Context *conte ...@@ -123,7 +135,7 @@ angle::Result RenderbufferVk::getAttachmentRenderTarget(const gl::Context *conte
const gl::ImageIndex &imageIndex, const gl::ImageIndex &imageIndex,
FramebufferAttachmentRenderTarget **rtOut) FramebufferAttachmentRenderTarget **rtOut)
{ {
ASSERT(mImage.valid()); ASSERT(mImage && mImage->valid());
*rtOut = &mRenderTarget; *rtOut = &mRenderTarget;
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -45,7 +45,7 @@ class RenderbufferVk : public RenderbufferImpl ...@@ -45,7 +45,7 @@ class RenderbufferVk : public RenderbufferImpl
const gl::ImageIndex &imageIndex) override; const gl::ImageIndex &imageIndex) override;
private: private:
vk::ImageHelper mImage; vk::ImageHelper *mImage;
vk::ImageView mImageView; vk::ImageView mImageView;
RenderTargetVk mRenderTarget; RenderTargetVk mRenderTarget;
}; };
......
...@@ -75,8 +75,9 @@ constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags = ...@@ -75,8 +75,9 @@ constexpr VkImageUsageFlags kSurfaceVKDepthStencilImageUsageFlags =
} // namespace } // namespace
OffscreenSurfaceVk::AttachmentImage::AttachmentImage() OffscreenSurfaceVk::AttachmentImage::AttachmentImage()
: renderTarget(&image, &imageView, 0, nullptr) {
{} renderTarget.init(&image, &imageView, 0, nullptr);
}
OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default; OffscreenSurfaceVk::AttachmentImage::~AttachmentImage() = default;
...@@ -273,11 +274,11 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState, ...@@ -273,11 +274,11 @@ WindowSurfaceVk::WindowSurfaceVk(const egl::SurfaceState &surfaceState,
mInstance(VK_NULL_HANDLE), mInstance(VK_NULL_HANDLE),
mSwapchain(VK_NULL_HANDLE), mSwapchain(VK_NULL_HANDLE),
mSwapchainPresentMode(VK_PRESENT_MODE_FIFO_KHR), mSwapchainPresentMode(VK_PRESENT_MODE_FIFO_KHR),
mColorRenderTarget(nullptr, nullptr, 0, nullptr),
mDepthStencilRenderTarget(&mDepthStencilImage, &mDepthStencilImageView, 0, nullptr),
mCurrentSwapchainImageIndex(0), mCurrentSwapchainImageIndex(0),
mCurrentSwapSerialIndex(0) mCurrentSwapSerialIndex(0)
{} {
mDepthStencilRenderTarget.init(&mDepthStencilImage, &mDepthStencilImageView, 0, nullptr);
}
WindowSurfaceVk::~WindowSurfaceVk() WindowSurfaceVk::~WindowSurfaceVk()
{ {
......
...@@ -129,14 +129,14 @@ class TextureVk : public TextureImpl ...@@ -129,14 +129,14 @@ class TextureVk : public TextureImpl
const vk::ImageHelper &getImage() const const vk::ImageHelper &getImage() const
{ {
ASSERT(mImage.valid()); ASSERT(mImage && mImage->valid());
return mImage; return *mImage;
} }
vk::ImageHelper &getImage() vk::ImageHelper &getImage()
{ {
ASSERT(mImage.valid()); ASSERT(mImage && mImage->valid());
return mImage; return *mImage;
} }
const vk::ImageView &getReadImageView() const; const vk::ImageView &getReadImageView() const;
...@@ -149,6 +149,8 @@ class TextureVk : public TextureImpl ...@@ -149,6 +149,8 @@ class TextureVk : public TextureImpl
angle::Result ensureImageInitialized(ContextVk *contextVk); angle::Result ensureImageInitialized(ContextVk *contextVk);
private: private:
angle::Result ensureImageAllocated(RendererVk *renderer);
angle::Result redefineImage(const gl::Context *context, angle::Result redefineImage(const gl::Context *context,
const gl::ImageIndex &index, const gl::ImageIndex &index,
const gl::InternalFormat &internalFormat, const gl::InternalFormat &internalFormat,
...@@ -218,7 +220,7 @@ class TextureVk : public TextureImpl ...@@ -218,7 +220,7 @@ class TextureVk : public TextureImpl
uint32_t levelCount, uint32_t levelCount,
const vk::Format &format); const vk::Format &format);
vk::ImageHelper mImage; vk::ImageHelper *mImage;
vk::ImageView mDrawBaseLevelImageView; vk::ImageView mDrawBaseLevelImageView;
vk::ImageView mReadBaseLevelImageView; vk::ImageView mReadBaseLevelImageView;
vk::ImageView mReadMipmapImageView; vk::ImageView mReadMipmapImageView;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment