diff options
Diffstat (limited to 'gfx/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp')
-rwxr-xr-x | gfx/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/gfx/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp b/gfx/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp new file mode 100755 index 000000000..693b61c9c --- /dev/null +++ b/gfx/angle/src/libANGLE/renderer/gl/egl/SurfaceEGL.cpp @@ -0,0 +1,132 @@ +// +// Copyright (c) 2016 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. +// + +// SurfaceEGL.cpp: EGL implementation of egl::Surface + +#include "libANGLE/renderer/gl/egl/SurfaceEGL.h" + +#include "common/debug.h" + +namespace rx +{ + +SurfaceEGL::SurfaceEGL(const egl::SurfaceState &state, + const FunctionsEGL *egl, + EGLConfig config, + const std::vector<EGLint> &attribList, + EGLContext context, + RendererGL *renderer) + : SurfaceGL(state, renderer), + mEGL(egl), + mConfig(config), + mAttribList(attribList), + mSurface(EGL_NO_SURFACE), + mContext(context) +{ +} + +SurfaceEGL::~SurfaceEGL() +{ + if (mSurface != EGL_NO_SURFACE) + { + EGLBoolean success = mEGL->destroySurface(mSurface); + ASSERT(success == EGL_TRUE); + } +} + +egl::Error SurfaceEGL::makeCurrent() +{ + EGLBoolean success = mEGL->makeCurrent(mSurface, mContext); + if (success == EGL_FALSE) + { + return egl::Error(mEGL->getError(), "eglMakeCurrent failed"); + } + return egl::Error(EGL_SUCCESS); +} + +egl::Error SurfaceEGL::swap() +{ + EGLBoolean success = mEGL->swapBuffers(mSurface); + if (success == EGL_FALSE) + { + return egl::Error(mEGL->getError(), "eglSwapBuffers failed"); + } + return egl::Error(EGL_SUCCESS); +} + +egl::Error SurfaceEGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) +{ + UNIMPLEMENTED(); + return egl::Error(EGL_BAD_SURFACE); +} + +egl::Error SurfaceEGL::querySurfacePointerANGLE(EGLint attribute, void **value) +{ + UNIMPLEMENTED(); + return egl::Error(EGL_BAD_SURFACE); +} + +egl::Error SurfaceEGL::bindTexImage(gl::Texture *texture, EGLint buffer) +{ + EGLBoolean success = mEGL->bindTexImage(mSurface, buffer); + if (success == EGL_FALSE) + { + return egl::Error(mEGL->getError(), "eglBindTexImage failed"); + } + return egl::Error(EGL_SUCCESS); +} + +egl::Error SurfaceEGL::releaseTexImage(EGLint buffer) +{ + EGLBoolean success = mEGL->releaseTexImage(mSurface, buffer); + if (success == EGL_FALSE) + { + return egl::Error(mEGL->getError(), "eglReleaseTexImage failed"); + } + return egl::Error(EGL_SUCCESS); +} + +void SurfaceEGL::setSwapInterval(EGLint interval) +{ + EGLBoolean success = mEGL->swapInterval(interval); + if (success == EGL_FALSE) + { + ERR("eglSwapInterval error 0x%04x", mEGL->getError()); + ASSERT(false); + } +} + +EGLint SurfaceEGL::getWidth() const +{ + EGLint value; + EGLBoolean success = mEGL->querySurface(mSurface, EGL_WIDTH, &value); + ASSERT(success == EGL_TRUE); + return value; +} + +EGLint SurfaceEGL::getHeight() const +{ + EGLint value; + EGLBoolean success = mEGL->querySurface(mSurface, EGL_HEIGHT, &value); + ASSERT(success == EGL_TRUE); + return value; +} + +EGLint SurfaceEGL::isPostSubBufferSupported() const +{ + UNIMPLEMENTED(); + return 0; +} + +EGLint SurfaceEGL::getSwapBehavior() const +{ + EGLint value; + EGLBoolean success = mEGL->querySurface(mSurface, EGL_SWAP_BEHAVIOR, &value); + ASSERT(success == EGL_TRUE); + return value; +} + +} // namespace rx |