Commit 57d9cbb6 by Jamie Madill Committed by Commit Bot

Sync individual attachments in RenderTargetCache.

This allows Framebuffer syncState methods to handle dirty bits themselves. This will be useful for the implementation of masked color clear. Bug: angleproject:2455 Change-Id: I65ad9c61e89e317c820f6be5550edd8185b52afc Reviewed-on: https://chromium-review.googlesource.com/1032856 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarLuc Ferron <lucferron@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent d47044ad
...@@ -26,10 +26,18 @@ class RenderTargetCache final : angle::NonCopyable ...@@ -26,10 +26,18 @@ class RenderTargetCache final : angle::NonCopyable
RenderTargetCache(); RenderTargetCache();
~RenderTargetCache(); ~RenderTargetCache();
// Update all RenderTargets from the dirty bits.
gl::Error update(const gl::Context *context, gl::Error update(const gl::Context *context,
const gl::FramebufferState &state, const gl::FramebufferState &state,
const gl::Framebuffer::DirtyBits &dirtyBits); const gl::Framebuffer::DirtyBits &dirtyBits);
// Update individual RenderTargets.
gl::Error updateColorRenderTarget(const gl::Context *context,
const gl::FramebufferState &state,
size_t colorIndex);
gl::Error updateDepthStencilRenderTarget(const gl::Context *context,
const gl::FramebufferState &state);
using RenderTargetArray = gl::AttachmentArray<RenderTargetT *>; using RenderTargetArray = gl::AttachmentArray<RenderTargetT *>;
const RenderTargetArray &getColors() const; const RenderTargetArray &getColors() const;
...@@ -42,12 +50,6 @@ class RenderTargetCache final : angle::NonCopyable ...@@ -42,12 +50,6 @@ class RenderTargetCache final : angle::NonCopyable
const gl::FramebufferAttachment *attachment, const gl::FramebufferAttachment *attachment,
RenderTargetT **cachedRenderTarget); RenderTargetT **cachedRenderTarget);
gl::Error updateColorRenderTarget(const gl::Context *context,
const gl::FramebufferState &state,
size_t colorIndex);
gl::Error updateDepthStencilRenderTarget(const gl::Context *context,
const gl::FramebufferState &state);
gl::AttachmentArray<RenderTargetT *> mColorRenderTargets; gl::AttachmentArray<RenderTargetT *> mColorRenderTargets;
// We only support a single Depth/Stencil RenderTarget currently. // We only support a single Depth/Stencil RenderTarget currently.
RenderTargetT *mDepthStencilRenderTarget; RenderTargetT *mDepthStencilRenderTarget;
......
...@@ -327,7 +327,32 @@ gl::Error FramebufferVk::syncState(const gl::Context *context, ...@@ -327,7 +327,32 @@ gl::Error FramebufferVk::syncState(const gl::Context *context,
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
ASSERT(dirtyBits.any()); ASSERT(dirtyBits.any());
ANGLE_TRY(mRenderTargetCache.update(context, mState, dirtyBits)); for (size_t dirtyBit : dirtyBits)
{
switch (dirtyBit)
{
case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT:
case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT:
ANGLE_TRY(mRenderTargetCache.updateDepthStencilRenderTarget(context, mState));
break;
case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS:
case gl::Framebuffer::DIRTY_BIT_READ_BUFFER:
case gl::Framebuffer::DIRTY_BIT_DEFAULT_WIDTH:
case gl::Framebuffer::DIRTY_BIT_DEFAULT_HEIGHT:
case gl::Framebuffer::DIRTY_BIT_DEFAULT_SAMPLES:
case gl::Framebuffer::DIRTY_BIT_DEFAULT_FIXED_SAMPLE_LOCATIONS:
break;
default:
{
ASSERT(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 == 0 &&
dirtyBit < gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_MAX);
size_t colorIndex =
static_cast<size_t>(dirtyBit - gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0);
ANGLE_TRY(mRenderTargetCache.updateColorRenderTarget(context, mState, colorIndex));
break;
}
}
}
mRenderPassDesc.reset(); mRenderPassDesc.reset();
renderer->releaseResource(*this, &mFramebuffer); renderer->releaseResource(*this, &mFramebuffer);
......
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