void Framebuffer11::syncState(const gl::Framebuffer::DirtyBits &dirtyBits) { mRenderer->getStateManager()->invalidateRenderTarget(); const auto &mergedDirtyBits = dirtyBits | mInternalDirtyBits; mInternalDirtyBits.reset(); for (auto dirtyBit : IterateBitSet(mergedDirtyBits)) { switch (dirtyBit) { case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT: case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT: updateDepthStencilRenderTarget(); break; case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS: case gl::Framebuffer::DIRTY_BIT_READ_BUFFER: 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); updateColorRenderTarget(colorIndex); break; } } } // We should not have dirtied any additional state during our sync. ASSERT(!mInternalDirtyBits.any()); FramebufferD3D::syncState(dirtyBits); }
void Framebuffer11::syncState(const gl::Context *context, const gl::Framebuffer::DirtyBits &dirtyBits) { const auto &mergedDirtyBits = dirtyBits | mInternalDirtyBits; mInternalDirtyBits.reset(); for (auto dirtyBit : mergedDirtyBits) { switch (dirtyBit) { case gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT: case gl::Framebuffer::DIRTY_BIT_STENCIL_ATTACHMENT: updateDepthStencilRenderTarget(context); break; case gl::Framebuffer::DIRTY_BIT_DRAW_BUFFERS: case gl::Framebuffer::DIRTY_BIT_READ_BUFFER: break; 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); updateColorRenderTarget(context, colorIndex); break; } } } // We should not have dirtied any additional state during our sync. ASSERT(!mInternalDirtyBits.any()); FramebufferD3D::syncState(context, dirtyBits); // Call this last to allow the state manager to take advantage of the cached render targets. mRenderer->getStateManager()->invalidateRenderTarget(); // Call this to syncViewport for framebuffer default parameters. if (mState.getDefaultWidth() != 0 || mState.getDefaultHeight() != 0) { mRenderer->getStateManager()->invalidateViewport(context); } }