summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp461
1 files changed, 269 insertions, 192 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
index 186a035902..02326d7b50 100644
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Framebuffer11.cpp
@@ -8,94 +8,119 @@
#include "libANGLE/renderer/d3d/d3d11/Framebuffer11.h"
+#include "common/bitset_utils.h"
#include "common/debug.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/Framebuffer.h"
+#include "libANGLE/FramebufferAttachment.h"
+#include "libANGLE/Texture.h"
+#include "libANGLE/renderer/d3d/TextureD3D.h"
#include "libANGLE/renderer/d3d/d3d11/Buffer11.h"
#include "libANGLE/renderer/d3d/d3d11/Clear11.h"
-#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
-#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
-#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
#include "libANGLE/renderer/d3d/d3d11/RenderTarget11.h"
+#include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
+#include "libANGLE/renderer/d3d/d3d11/TextureStorage11.h"
#include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
-#include "libANGLE/renderer/d3d/TextureD3D.h"
-#include "libANGLE/Framebuffer.h"
-#include "libANGLE/FramebufferAttachment.h"
-#include "libANGLE/Texture.h"
+#include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
+
+using namespace angle;
namespace rx
{
-Framebuffer11::Framebuffer11(const gl::Framebuffer::Data &data, Renderer11 *renderer)
- : FramebufferD3D(data, renderer), mRenderer(renderer)
+namespace
{
- ASSERT(mRenderer != nullptr);
-}
-
-Framebuffer11::~Framebuffer11()
+gl::Error MarkAttachmentsDirty(const gl::Context *context,
+ const gl::FramebufferAttachment *attachment)
{
-}
-
-static gl::Error InvalidateAttachmentSwizzles(const gl::FramebufferAttachment *attachment)
-{
- if (attachment && attachment->type() == GL_TEXTURE)
+ if (attachment->type() == GL_TEXTURE)
{
gl::Texture *texture = attachment->getTexture();
TextureD3D *textureD3D = GetImplAs<TextureD3D>(texture);
TextureStorage *texStorage = nullptr;
- gl::Error error = textureD3D->getNativeTexture(&texStorage);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(textureD3D->getNativeTexture(context, &texStorage));
if (texStorage)
{
TextureStorage11 *texStorage11 = GetAs<TextureStorage11>(texStorage);
ASSERT(texStorage11);
- texStorage11->invalidateSwizzleCacheLevel(attachment->mipLevel());
+ texStorage11->markLevelDirty(attachment->mipLevel());
}
}
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error Framebuffer11::invalidateSwizzles() const
+void UpdateCachedRenderTarget(const gl::Context *context,
+ const gl::FramebufferAttachment *attachment,
+ RenderTarget11 *&cachedRenderTarget,
+ OnRenderTargetDirtyBinding *channelBinding)
{
- for (const auto &colorAttachment : mData.getColorAttachments())
+ RenderTarget11 *newRenderTarget = nullptr;
+ if (attachment)
{
- if (colorAttachment.isAttached())
+ // TODO(jmadill): Don't swallow this error.
+ gl::Error error = attachment->getRenderTarget(context, &newRenderTarget);
+ if (error.isError())
{
- gl::Error error = InvalidateAttachmentSwizzles(&colorAttachment);
- if (error.isError())
- {
- return error;
- }
+ ERR() << "Internal rendertarget error: " << error;
}
}
+ if (newRenderTarget != cachedRenderTarget)
+ {
+ OnRenderTargetDirtyChannel *channel =
+ (newRenderTarget ? newRenderTarget->getBroadcastChannel() : nullptr);
+ channelBinding->bind(channel);
+ cachedRenderTarget = newRenderTarget;
+ }
+}
+} // anonymous namespace
+
+Framebuffer11::Framebuffer11(const gl::FramebufferState &data, Renderer11 *renderer)
+ : FramebufferD3D(data, renderer),
+ mRenderer(renderer),
+ mCachedDepthStencilRenderTarget(nullptr),
+ mDepthStencilRenderTargetDirty(this, gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS)
+{
+ ASSERT(mRenderer != nullptr);
+ mCachedColorRenderTargets.fill(nullptr);
+ for (size_t colorIndex = 0; colorIndex < data.getColorAttachments().size(); ++colorIndex)
+ {
+ mColorRenderTargetsDirty.emplace_back(this, colorIndex);
+ }
+}
- gl::Error error = InvalidateAttachmentSwizzles(mData.getDepthAttachment());
- if (error.isError())
+Framebuffer11::~Framebuffer11()
+{
+}
+
+gl::Error Framebuffer11::markAttachmentsDirty(const gl::Context *context) const
+{
+ const auto &colorAttachments = mState.getColorAttachments();
+ for (size_t drawBuffer : mState.getEnabledDrawBuffers())
{
- return error;
+ const gl::FramebufferAttachment &colorAttachment = colorAttachments[drawBuffer];
+ ASSERT(colorAttachment.isAttached());
+ ANGLE_TRY(MarkAttachmentsDirty(context, &colorAttachment));
}
- error = InvalidateAttachmentSwizzles(mData.getStencilAttachment());
- if (error.isError())
+ const gl::FramebufferAttachment *dsAttachment = mState.getDepthOrStencilAttachment();
+ if (dsAttachment)
{
- return error;
+ ANGLE_TRY(MarkAttachmentsDirty(context, dsAttachment));
}
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error Framebuffer11::clear(const gl::Data &data, const ClearParameters &clearParams)
+gl::Error Framebuffer11::clearImpl(const gl::Context *context, const ClearParameters &clearParams)
{
Clear11 *clearer = mRenderer->getClearer();
- gl::Error error(GL_NO_ERROR);
- const gl::FramebufferAttachment *colorAttachment = mData.getFirstColorAttachment();
+ const gl::FramebufferAttachment *colorAttachment = mState.getFirstColorAttachment();
if (clearParams.scissorEnabled == true && colorAttachment != nullptr &&
UsePresentPathFast(mRenderer, colorAttachment))
{
@@ -107,46 +132,43 @@ gl::Error Framebuffer11::clear(const gl::Data &data, const ClearParameters &clea
presentPathFastClearParams.scissor.y = framebufferSize.height -
presentPathFastClearParams.scissor.y -
presentPathFastClearParams.scissor.height;
- error = clearer->clearFramebuffer(presentPathFastClearParams, mData);
+ ANGLE_TRY(clearer->clearFramebuffer(context, presentPathFastClearParams, mState));
}
else
{
- error = clearer->clearFramebuffer(clearParams, mData);
+ ANGLE_TRY(clearer->clearFramebuffer(context, clearParams, mState));
}
- if (error.isError())
- {
- return error;
- }
-
- error = invalidateSwizzles();
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(markAttachmentsDirty(context));
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error Framebuffer11::invalidate(size_t count, const GLenum *attachments)
+gl::Error Framebuffer11::invalidate(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
- return invalidateBase(count, attachments, false);
+ return invalidateBase(context, count, attachments, false);
}
-gl::Error Framebuffer11::discard(size_t count, const GLenum *attachments)
+gl::Error Framebuffer11::discard(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments)
{
- return invalidateBase(count, attachments, true);
+ return invalidateBase(context, count, attachments, true);
}
-gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments, bool useEXTBehavior) const
+gl::Error Framebuffer11::invalidateBase(const gl::Context *context,
+ size_t count,
+ const GLenum *attachments,
+ bool useEXTBehavior) const
{
-#if defined(ANGLE_ENABLE_D3D11_1)
ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
if (!deviceContext1)
{
// DiscardView() is only supported on ID3D11DeviceContext1
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
bool foundDepth = false;
@@ -175,37 +197,14 @@ gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments,
ASSERT((attachments[i] >= GL_COLOR_ATTACHMENT0 && attachments[i] <= GL_COLOR_ATTACHMENT15) ||
(attachments[i] == GL_COLOR));
- RenderTarget11 *renderTarget = nullptr;
- ID3D11View *colorView = nullptr;
- gl::Error error(GL_NO_ERROR);
- size_t colorAttachmentID = 0;
-
- if (attachments[i] == GL_COLOR)
- {
- colorAttachmentID = 0;
- }
- else
+ size_t colorIndex =
+ (attachments[i] == GL_COLOR ? 0u : (attachments[i] - GL_COLOR_ATTACHMENT0));
+ const gl::FramebufferAttachment *colorAttachment =
+ mState.getColorAttachment(colorIndex);
+ if (colorAttachment)
{
- colorAttachmentID = attachments[i] - GL_COLOR_ATTACHMENT0;
+ ANGLE_TRY(invalidateAttachment(context, colorAttachment));
}
-
- if (mData.getColorAttachment(static_cast<unsigned int>(colorAttachmentID)))
- {
- error = mData.getColorAttachment(static_cast<unsigned int>(colorAttachmentID))
- ->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
-
- colorView = renderTarget->getRenderTargetView();
-
- if (colorView != nullptr)
- {
- deviceContext1->DiscardView(colorView);
- }
- }
-
break;
}
}
@@ -222,7 +221,7 @@ gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments,
discardDepth = foundDepth;
// Don't bother discarding the stencil buffer if the depth buffer will already do it
- discardStencil = foundStencil && (!discardDepth || mData.getDepthAttachment() == nullptr);
+ discardStencil = foundStencil && (!discardDepth || mState.getDepthAttachment() == nullptr);
}
else
{
@@ -230,94 +229,86 @@ gl::Error Framebuffer11::invalidateBase(size_t count, const GLenum *attachments,
// attachments list does not include DEPTH_STENCIL_ATTACHMENT or both DEPTH_ATTACHMENT and
// STENCIL_ATTACHMENT, then only the specified portion of every pixel in the subregion of pixels
// of the DEPTH_STENCIL buffer may be invalidated, and the other portion must be preserved.
- discardDepth = (foundDepth && foundStencil) || (foundDepth && (mData.getStencilAttachment() == nullptr));
- discardStencil = (foundStencil && (mData.getDepthAttachment() == nullptr));
+ discardDepth = (foundDepth && foundStencil) ||
+ (foundDepth && (mState.getStencilAttachment() == nullptr));
+ discardStencil = (foundStencil && (mState.getDepthAttachment() == nullptr));
}
- if (discardDepth && mData.getDepthAttachment())
+ if (discardDepth && mState.getDepthAttachment())
{
- RenderTarget11 *renderTarget = nullptr;
- ID3D11View *depthView = nullptr;
- gl::Error error(GL_NO_ERROR);
-
- error = mData.getDepthAttachment()->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
-
- depthView = renderTarget->getDepthStencilView();
-
- if (depthView != nullptr)
- {
- deviceContext1->DiscardView(depthView);
- }
+ ANGLE_TRY(invalidateAttachment(context, mState.getDepthAttachment()));
}
- if (discardStencil && mData.getStencilAttachment())
+ if (discardStencil && mState.getStencilAttachment())
{
- RenderTarget11 *renderTarget = nullptr;
- ID3D11View *stencilView = nullptr;
- gl::Error error(GL_NO_ERROR);
-
- error = mData.getStencilAttachment()->getRenderTarget(&renderTarget);
- if (error.isError())
- {
- return error;
- }
-
- stencilView = renderTarget->getDepthStencilView();
-
- if (stencilView != nullptr)
- {
- deviceContext1->DiscardView(stencilView);
- }
+ ANGLE_TRY(invalidateAttachment(context, mState.getStencilAttachment()));
}
-#endif // ANGLE_ENABLE_D3D11_1
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error Framebuffer11::invalidateSub(size_t, const GLenum *, const gl::Rectangle &)
+gl::Error Framebuffer11::invalidateSub(const gl::Context *context,
+ size_t,
+ const GLenum *,
+ const gl::Rectangle &)
{
// A no-op implementation conforms to the spec, so don't call UNIMPLEMENTED()
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error Framebuffer11::readPixelsImpl(const gl::Rectangle &area,
+gl::Error Framebuffer11::invalidateAttachment(const gl::Context *context,
+ const gl::FramebufferAttachment *attachment) const
+{
+ ID3D11DeviceContext1 *deviceContext1 = mRenderer->getDeviceContext1IfSupported();
+ ASSERT(deviceContext1);
+ ASSERT(attachment && attachment->isAttached());
+
+ RenderTarget11 *renderTarget = nullptr;
+ ANGLE_TRY(attachment->getRenderTarget(context, &renderTarget));
+ const auto &rtv = renderTarget->getRenderTargetView();
+
+ if (rtv.valid())
+ {
+ deviceContext1->DiscardView(rtv.get());
+ }
+
+ return gl::NoError();
+}
+
+gl::Error Framebuffer11::readPixelsImpl(const gl::Context *context,
+ const gl::Rectangle &area,
GLenum format,
GLenum type,
size_t outputPitch,
const gl::PixelPackState &pack,
- uint8_t *pixels) const
+ uint8_t *pixels)
{
- const gl::FramebufferAttachment *readAttachment = mData.getReadAttachment();
+ const gl::FramebufferAttachment *readAttachment = mState.getReadAttachment();
ASSERT(readAttachment);
- gl::Buffer *packBuffer = pack.pixelBuffer.get();
+ gl::Buffer *packBuffer = context->getGLState().getTargetBuffer(gl::BufferBinding::PixelPack);
if (packBuffer != nullptr)
{
- if (pack.rowLength != 0 || pack.skipRows != 0 || pack.skipPixels != 0)
- {
- UNIMPLEMENTED();
- return gl::Error(GL_INVALID_OPERATION,
- "Unimplemented pixel store parameters in readPixelsImpl");
- }
-
Buffer11 *packBufferStorage = GetImplAs<Buffer11>(packBuffer);
PackPixelsParams packParams(area, format, type, static_cast<GLuint>(outputPitch), pack,
- reinterpret_cast<ptrdiff_t>(pixels));
+ packBuffer, reinterpret_cast<ptrdiff_t>(pixels));
- return packBufferStorage->packPixels(*readAttachment, packParams);
+ return packBufferStorage->packPixels(context, *readAttachment, packParams);
}
- return mRenderer->readFromAttachment(*readAttachment, area, format, type,
+ return mRenderer->readFromAttachment(context, *readAttachment, area, format, type,
static_cast<GLuint>(outputPitch), pack, pixels);
}
-gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectangle &destArea, const gl::Rectangle *scissor,
- bool blitRenderTarget, bool blitDepth, bool blitStencil, GLenum filter,
- const gl::Framebuffer *sourceFramebuffer)
+gl::Error Framebuffer11::blitImpl(const gl::Context *context,
+ const gl::Rectangle &sourceArea,
+ const gl::Rectangle &destArea,
+ const gl::Rectangle *scissor,
+ bool blitRenderTarget,
+ bool blitDepth,
+ bool blitStencil,
+ GLenum filter,
+ const gl::Framebuffer *sourceFramebuffer)
{
if (blitRenderTarget)
{
@@ -325,15 +316,11 @@ gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectang
ASSERT(readBuffer);
RenderTargetD3D *readRenderTarget = nullptr;
- gl::Error error = readBuffer->getRenderTarget(&readRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
ASSERT(readRenderTarget);
- const auto &colorAttachments = mData.getColorAttachments();
- const auto &drawBufferStates = mData.getDrawBufferStates();
+ const auto &colorAttachments = mState.getColorAttachments();
+ const auto &drawBufferStates = mState.getDrawBufferStates();
for (size_t colorAttachment = 0; colorAttachment < colorAttachments.size(); colorAttachment++)
{
@@ -343,11 +330,7 @@ gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectang
drawBufferStates[colorAttachment] != GL_NONE)
{
RenderTargetD3D *drawRenderTarget = nullptr;
- error = drawBuffer.getRenderTarget(&drawRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(drawBuffer.getRenderTarget(context, &drawRenderTarget));
ASSERT(drawRenderTarget);
const bool invertColorSource = UsePresentPathFast(mRenderer, readBuffer);
@@ -368,13 +351,9 @@ gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectang
actualDestArea.height = -destArea.height;
}
- error = mRenderer->blitRenderbufferRect(actualSourceArea, actualDestArea,
- readRenderTarget, drawRenderTarget, filter,
- scissor, blitRenderTarget, false, false);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(mRenderer->blitRenderbufferRect(
+ context, actualSourceArea, actualDestArea, readRenderTarget, drawRenderTarget,
+ filter, scissor, blitRenderTarget, false, false));
}
}
}
@@ -385,46 +364,144 @@ gl::Error Framebuffer11::blit(const gl::Rectangle &sourceArea, const gl::Rectang
ASSERT(readBuffer);
RenderTargetD3D *readRenderTarget = nullptr;
- gl::Error error = readBuffer->getRenderTarget(&readRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(readBuffer->getRenderTarget(context, &readRenderTarget));
ASSERT(readRenderTarget);
- const gl::FramebufferAttachment *drawBuffer = mData.getDepthOrStencilAttachment();
+ const gl::FramebufferAttachment *drawBuffer = mState.getDepthOrStencilAttachment();
ASSERT(drawBuffer);
RenderTargetD3D *drawRenderTarget = nullptr;
- error = drawBuffer->getRenderTarget(&drawRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(drawBuffer->getRenderTarget(context, &drawRenderTarget));
ASSERT(drawRenderTarget);
- error = mRenderer->blitRenderbufferRect(sourceArea, destArea, readRenderTarget, drawRenderTarget, filter, scissor,
- false, blitDepth, blitStencil);
- if (error.isError())
+ ANGLE_TRY(mRenderer->blitRenderbufferRect(context, sourceArea, destArea, readRenderTarget,
+ drawRenderTarget, filter, scissor, false,
+ blitDepth, blitStencil));
+ }
+
+ ANGLE_TRY(markAttachmentsDirty(context));
+ return gl::NoError();
+}
+
+GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const
+{
+ RenderTarget11 *renderTarget11 = GetAs<RenderTarget11>(renderTarget);
+ return renderTarget11->getFormatSet().format().fboImplementationInternalFormat;
+}
+
+void Framebuffer11::updateColorRenderTarget(const gl::Context *context, size_t colorIndex)
+{
+ UpdateCachedRenderTarget(context, mState.getColorAttachment(colorIndex),
+ mCachedColorRenderTargets[colorIndex],
+ &mColorRenderTargetsDirty[colorIndex]);
+}
+
+void Framebuffer11::updateDepthStencilRenderTarget(const gl::Context *context)
+{
+ UpdateCachedRenderTarget(context, mState.getDepthOrStencilAttachment(),
+ mCachedDepthStencilRenderTarget, &mDepthStencilRenderTargetDirty);
+}
+
+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)
{
- return error;
+ 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;
+ }
}
}
- gl::Error error = invalidateSwizzles();
- if (error.isError())
+ // 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);
+ }
+}
+
+void Framebuffer11::signal(size_t channelID, const gl::Context *context)
+{
+ if (channelID == gl::IMPLEMENTATION_MAX_FRAMEBUFFER_ATTACHMENTS)
+ {
+ // Stencil is redundant in this case.
+ mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_DEPTH_ATTACHMENT);
+ mCachedDepthStencilRenderTarget = nullptr;
+ }
+ else
{
- return error;
+ mInternalDirtyBits.set(gl::Framebuffer::DIRTY_BIT_COLOR_ATTACHMENT_0 + channelID);
+ mCachedColorRenderTargets[channelID] = nullptr;
}
- return gl::Error(GL_NO_ERROR);
+ // Notify the context we need to re-validate the RenderTarget.
+ // TODO(jmadill): Check that we're the active draw framebuffer.
+ mRenderer->getStateManager()->invalidateRenderTarget();
}
-GLenum Framebuffer11::getRenderTargetImplementationFormat(RenderTargetD3D *renderTarget) const
+gl::Error Framebuffer11::getSamplePosition(size_t index, GLfloat *xy) const
{
- RenderTarget11 *renderTarget11 = GetAs<RenderTarget11>(renderTarget);
- const d3d11::DXGIFormat &dxgiFormatInfo = d3d11::GetDXGIFormatInfo(renderTarget11->getDXGIFormat());
- return dxgiFormatInfo.internalFormat;
+ const gl::FramebufferAttachment *attachment = mState.getFirstNonNullAttachment();
+ ASSERT(attachment);
+ GLsizei sampleCount = attachment->getSamples();
+
+ d3d11_gl::GetSamplePosition(sampleCount, index, xy);
+ return gl::NoError();
+}
+
+bool Framebuffer11::hasAnyInternalDirtyBit() const
+{
+ return mInternalDirtyBits.any();
+}
+
+void Framebuffer11::syncInternalState(const gl::Context *context)
+{
+ syncState(context, gl::Framebuffer::DirtyBits());
}
+RenderTarget11 *Framebuffer11::getFirstRenderTarget() const
+{
+ ASSERT(mInternalDirtyBits.none());
+ for (auto *renderTarget : mCachedColorRenderTargets)
+ {
+ if (renderTarget)
+ {
+ return renderTarget;
+ }
+ }
+
+ return mCachedDepthStencilRenderTarget;
}
+
+} // namespace rx