Hash :
ea84f6ff
Author :
Date :
2017-09-20T13:20:30
Pass Context to Framebuffer11 dirty callback. This allows us to call StateManager11::invalidateRenderTarget from the Framebuffer11::signal function, which will then trigger state refresh on the next draw call. This requires passing Context through a few more Renderbuffer methods, and reorganizing the RenderTarget signalling so that it doesn't signal dirty in the destructor. Instead they are signaled as they are destroyed in the containing classes. BUG=angleproject:2151 Change-Id: I4cf575e4a01b48275ff78d75bc55b2d1fced591d Reviewed-on: https://chromium-review.googlesource.com/673139 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
//
// 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::NoError();
}
gl::Error EGLImageD3D::orphan(const gl::Context *context, egl::ImageSibling *sibling)
{
if (sibling == mState.source.get())
{
ANGLE_TRY(copyToLocalRendertarget(context));
}
return gl::NoError();
}
gl::Error EGLImageD3D::getRenderTarget(const gl::Context *context, RenderTargetD3D **outRT) const
{
if (mState.source.get())
{
ASSERT(!mRenderTarget);
FramebufferAttachmentRenderTarget *rt = nullptr;
ANGLE_TRY(
mState.source->getAttachmentRenderTarget(context, 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(const gl::Context *context)
{
ASSERT(mState.source.get() != nullptr);
ASSERT(mRenderTarget == nullptr);
RenderTargetD3D *curRenderTarget = nullptr;
ANGLE_TRY(getRenderTarget(context, &curRenderTarget));
// This only currently applies do D3D11, where it invalidates FBOs with this Image attached.
curRenderTarget->signalDirty(context);
return mRenderer->createRenderTargetCopy(curRenderTarget, &mRenderTarget);
}
} // namespace rx