Hash :
7e44ec26
Author :
Date :
2019-08-26T15:59:48
GL_EXT_multisampled_render_to_texture extension. Part 1. Adding new parameters for extension without adding any real code change. Since no new code paths were added, we expect all tests to pass as before. Bug: angleproject:980428 Change-Id: I551b46a66f422eabd357fd021e00cf266a991efb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1772377 Commit-Queue: Rafael Cintron <rafael.cintron@microsoft.com> Reviewed-by: Rafael Cintron <rafael.cintron@microsoft.com> Reviewed-by: Geoff Lang <geofflang@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 88 89 90
//
// 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