diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/renderer/gl/DisplayGL.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/renderer/gl/DisplayGL.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/renderer/gl/DisplayGL.cpp b/gfx/angle/src/libANGLE/renderer/gl/DisplayGL.cpp new file mode 100755 index 000000000..30c5c7b4e --- /dev/null +++ b/gfx/angle/src/libANGLE/renderer/gl/DisplayGL.cpp @@ -0,0 +1,103 @@ +// +// 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(); +} +} |