Edit

kc3-lang/angle/src/libANGLE/renderer/gl/DisplayGL.cpp

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2015-12-08 11:48:51
    Hash : 2018c0ba
    Message : Add a EGL_ANGLE_d3d_texture_client_buffer extension. Allows creation of pbuffers from D3D texture objects. BUG=540829 BUG=angleproject:1144 Change-Id: If8ea717ef011608cd01357c217837133d726d3ea Reviewed-on: https://chromium-review.googlesource.com/316804 Commit-Queue: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/renderer/gl/DisplayGL.cpp
  • //
    // 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.
    //
    
    // DisplayGL.h: GL implementation of egl::Display
    
    #include "libANGLE/renderer/gl/DisplayGL.h"
    
    #include "libANGLE/AttributeMap.h"
    #include "libANGLE/Context.h"
    #include "libANGLE/Display.h"
    #include "libANGLE/Surface.h"
    #include "libANGLE/renderer/gl/ContextGL.h"
    #include "libANGLE/renderer/gl/RendererGL.h"
    #include "libANGLE/renderer/gl/StateManagerGL.h"
    #include "libANGLE/renderer/gl/SurfaceGL.h"
    
    #include <EGL/eglext.h>
    
    namespace rx
    {
    
    DisplayGL::DisplayGL() : mRenderer(nullptr), mCurrentDrawSurface(nullptr)
    {
    }
    
    DisplayGL::~DisplayGL()
    {
    }
    
    egl::Error DisplayGL::initialize(egl::Display *display)
    {
        mRenderer = new RendererGL(getFunctionsGL(), display->getAttributeMap());
    
        const gl::Version &maxVersion = mRenderer->getMaxSupportedESVersion();
        if (maxVersion < gl::Version(2, 0))
        {
            return egl::Error(EGL_NOT_INITIALIZED, "OpenGL ES 2.0 is not supportable.");
        }
    
        return egl::Error(EGL_SUCCESS);
    }
    
    void DisplayGL::terminate()
    {
        SafeDelete(mRenderer);
    }
    
    ImageImpl *DisplayGL::createImage(EGLenum target,
                                      egl::ImageSibling *buffer,
                                      const egl::AttributeMap &attribs)
    {
        UNIMPLEMENTED();
        return nullptr;
    }
    
    ContextImpl *DisplayGL::createContext(const gl::ContextState &state)
    {
        ASSERT(mRenderer != nullptr);
        return new ContextGL(state, mRenderer);
    }
    
    StreamProducerImpl *DisplayGL::createStreamProducerD3DTextureNV12(
        egl::Stream::ConsumerType consumerType,
        const egl::AttributeMap &attribs)
    {
        UNIMPLEMENTED();
        return nullptr;
    }
    
    egl::Error DisplayGL::makeCurrent(egl::Surface *drawSurface, egl::Surface *readSurface, gl::Context *context)
    {
        // Notify the previous surface (if it still exists) that it is no longer current
        if (mCurrentDrawSurface && mSurfaceSet.find(mCurrentDrawSurface) != mSurfaceSet.end())
        {
            ANGLE_TRY(GetImplAs<SurfaceGL>(mCurrentDrawSurface)->unMakeCurrent());
        }
        mCurrentDrawSurface = nullptr;
    
        if (!drawSurface)
        {
            return egl::Error(EGL_SUCCESS);
        }
    
        // Pause transform feedback before making a new surface current, to workaround anglebug.com/1426
        ContextGL *glContext = GetImplAs<ContextGL>(context);
        glContext->getStateManager()->pauseTransformFeedback(context->getContextState());
    
        SurfaceGL *glDrawSurface = GetImplAs<SurfaceGL>(drawSurface);
        ANGLE_TRY(glDrawSurface->makeCurrent());
        mCurrentDrawSurface = drawSurface;
    
        return egl::Error(EGL_SUCCESS);
    }
    
    gl::Version DisplayGL::getMaxSupportedESVersion() const
    {
        ASSERT(mRenderer != nullptr);
        return mRenderer->getMaxSupportedESVersion();
    }
    }