| // |
| // Copyright 2015 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // EGLImageD3D.cpp: Implements the rx::EGLImageD3D class, the D3D implementation of EGL images |
| |
| #include "libANGLE/renderer/d3d/EGLImageD3D.h" |
| |
| #include "common/debug.h" |
| #include "common/utilities.h" |
| #include "libANGLE/AttributeMap.h" |
| #include "libANGLE/Context.h" |
| #include "libANGLE/Texture.h" |
| #include "libANGLE/renderer/d3d/RenderTargetD3D.h" |
| #include "libANGLE/renderer/d3d/RenderbufferD3D.h" |
| #include "libANGLE/renderer/d3d/RendererD3D.h" |
| #include "libANGLE/renderer/d3d/TextureD3D.h" |
| #include "libANGLE/renderer/d3d/TextureStorage.h" |
| |
| #include <EGL/eglext.h> |
| |
| namespace rx |
| { |
| |
| EGLImageD3D::EGLImageD3D(const egl::ImageState &state, |
| EGLenum target, |
| const egl::AttributeMap &attribs, |
| RendererD3D *renderer) |
| : ImageImpl(state), mRenderer(renderer), mRenderTarget(nullptr) |
| { |
| ASSERT(renderer != nullptr); |
| } |
| |
| EGLImageD3D::~EGLImageD3D() |
| { |
| SafeDelete(mRenderTarget); |
| } |
| |
| egl::Error EGLImageD3D::initialize(const egl::Display *display) |
| { |
| return egl::NoError(); |
| } |
| |
| angle::Result EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling) |
| { |
| if (sibling == mState.source) |
| { |
| ANGLE_TRY(copyToLocalRendertarget(context)); |
| } |
| |
| return angle::Result::Continue; |
| } |
| |
| angle::Result EGLImageD3D::getRenderTarget(const gl::Context *context, |
| RenderTargetD3D **outRT) const |
| { |
| if (mState.source != nullptr) |
| { |
| ASSERT(!mRenderTarget); |
| FramebufferAttachmentRenderTarget *rt = nullptr; |
| ANGLE_TRY( |
| mState.source->getAttachmentRenderTarget(context, GL_NONE, mState.imageIndex, 0, &rt)); |
| *outRT = static_cast<RenderTargetD3D *>(rt); |
| return angle::Result::Continue; |
| } |
| |
| ASSERT(mRenderTarget); |
| *outRT = mRenderTarget; |
| return angle::Result::Continue; |
| } |
| |
| angle::Result EGLImageD3D::copyToLocalRendertarget(const gl::Context *context) |
| { |
| ASSERT(mState.source != nullptr); |
| ASSERT(mRenderTarget == nullptr); |
| |
| RenderTargetD3D *curRenderTarget = nullptr; |
| ANGLE_TRY(getRenderTarget(context, &curRenderTarget)); |
| |
| // Invalidate FBOs with this Image attached. Only currently applies to D3D11. |
| for (egl::ImageSibling *target : mState.targets) |
| { |
| target->onStateChange(angle::SubjectMessage::SubjectChanged); |
| } |
| |
| return mRenderer->createRenderTargetCopy(context, curRenderTarget, &mRenderTarget); |
| } |
| } // namespace rx |