| // | |
| // 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 |