blob: caee47d7ec364a3f694aa142d75dcbbf9eca5bfc [file] [log] [blame]
//
// Copyright (c) 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/Texture.h"
#include "libANGLE/renderer/d3d/RenderbufferD3D.h"
#include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/RenderTargetD3D.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()
{
return egl::Error(EGL_SUCCESS);
}
gl::Error EGLImageD3D::orphan(egl::ImageSibling *sibling)
{
if (sibling == mState.source.get())
{
ANGLE_TRY(copyToLocalRendertarget());
}
return gl::NoError();
}
gl::Error EGLImageD3D::getRenderTarget(RenderTargetD3D **outRT) const
{
if (mState.source.get())
{
ASSERT(!mRenderTarget);
FramebufferAttachmentRenderTarget *rt = nullptr;
ANGLE_TRY(mState.source->getAttachmentRenderTarget(GL_NONE, mState.imageIndex, &rt));
*outRT = static_cast<RenderTargetD3D *>(rt);
return gl::NoError();
}
else
{
ASSERT(mRenderTarget);
*outRT = mRenderTarget;
return gl::NoError();
}
}
gl::Error EGLImageD3D::copyToLocalRendertarget()
{
ASSERT(mState.source.get() != nullptr);
ASSERT(mRenderTarget == nullptr);
RenderTargetD3D *curRenderTarget = nullptr;
ANGLE_TRY(getRenderTarget(&curRenderTarget));
// This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
curRenderTarget->signalDirty();
return mRenderer->createRenderTargetCopy(curRenderTarget, &mRenderTarget);
}
} // namespace rx