summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp89
1 files changed, 22 insertions, 67 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
index ca4b16987f..fcc2456bd6 100644
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/EGLImageD3D.cpp
@@ -22,46 +22,14 @@
namespace rx
{
-static gl::ImageIndex GetImageIndex(GLenum target, size_t mip, size_t layer)
-{
- if (target == GL_TEXTURE_3D)
- {
- return gl::ImageIndex::Make3D(static_cast<GLint>(mip), static_cast<GLint>(layer));
- }
- else
- {
- ASSERT(layer == 0);
- return gl::ImageIndex::MakeGeneric(target, static_cast<GLint>(mip));
- }
-}
-EGLImageD3D::EGLImageD3D(RendererD3D *renderer,
+EGLImageD3D::EGLImageD3D(const egl::ImageState &state,
EGLenum target,
- egl::ImageSibling *buffer,
- const egl::AttributeMap &attribs)
- : mRenderer(renderer), mBuffer(buffer), mAttachmentBuffer(nullptr), mRenderTarget(nullptr)
+ const egl::AttributeMap &attribs,
+ RendererD3D *renderer)
+ : ImageImpl(state), mRenderer(renderer), mRenderTarget(nullptr)
{
ASSERT(renderer != nullptr);
- ASSERT(buffer != nullptr);
-
- if (egl::IsTextureTarget(target))
- {
- mAttachmentBuffer = GetImplAs<TextureD3D>(GetAs<gl::Texture>(buffer));
- mAttachmentTarget = gl::FramebufferAttachment::Target(
- GL_NONE, GetImageIndex(egl_gl::EGLImageTargetToGLTextureTarget(target),
- attribs.get(EGL_GL_TEXTURE_LEVEL_KHR, 0),
- attribs.get(EGL_GL_TEXTURE_ZOFFSET_KHR, 0)));
- }
- else if (egl::IsRenderbufferTarget(target))
- {
- mAttachmentBuffer = GetImplAs<RenderbufferD3D>(GetAs<gl::Renderbuffer>(buffer));
- mAttachmentTarget =
- gl::FramebufferAttachment::Target(GL_NONE, gl::ImageIndex::MakeInvalid());
- }
- else
- {
- UNREACHABLE();
- }
}
EGLImageD3D::~EGLImageD3D()
@@ -71,62 +39,49 @@ EGLImageD3D::~EGLImageD3D()
egl::Error EGLImageD3D::initialize()
{
- return egl::Error(EGL_SUCCESS);
+ return egl::NoError();
}
-gl::Error EGLImageD3D::orphan(egl::ImageSibling *sibling)
+gl::Error EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling)
{
- if (sibling == mBuffer)
+ if (sibling == mState.source.get())
{
- gl::Error error = copyToLocalRendertarget();
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(copyToLocalRendertarget(context));
}
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
-gl::Error EGLImageD3D::getRenderTarget(RenderTargetD3D **outRT) const
+gl::Error EGLImageD3D::getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const
{
- if (mAttachmentBuffer)
+ if (mState.source.get())
{
+ ASSERT(!mRenderTarget);
FramebufferAttachmentRenderTarget *rt = nullptr;
- gl::Error error = mAttachmentBuffer->getAttachmentRenderTarget(mAttachmentTarget, &rt);
- if (error.isError())
- {
- return error;
- }
-
+ ANGLE_TRY(
+ mState.source->getAttachmentRenderTarget(context, GL_NONE, mState.imageIndex, &rt));
*outRT = static_cast<RenderTargetD3D *>(rt);
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
else
{
ASSERT(mRenderTarget);
*outRT = mRenderTarget;
- return gl::Error(GL_NO_ERROR);
+ return gl::NoError();
}
}
-gl::Error EGLImageD3D::copyToLocalRendertarget()
+gl::Error EGLImageD3D::copyToLocalRendertarget(const gl::Context *context)
{
- ASSERT(mBuffer != nullptr);
- ASSERT(mAttachmentBuffer != nullptr);
+ ASSERT(mState.source.get() != nullptr);
ASSERT(mRenderTarget == nullptr);
RenderTargetD3D *curRenderTarget = nullptr;
- gl::Error error = getRenderTarget(&curRenderTarget);
- if (error.isError())
- {
- return error;
- }
+ ANGLE_TRY(getRenderTarget(context, &curRenderTarget));
- // Clear the source image buffers
- mBuffer = nullptr;
- mAttachmentBuffer = nullptr;
+ // This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
+ curRenderTarget->signalDirty(context);
return mRenderer->createRenderTargetCopy(curRenderTarget, &mRenderTarget);
}
-}
+} // namespace rx