diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Surface.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Surface.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Surface.cpp b/src/3rdparty/angle/src/libANGLE/Surface.cpp new file mode 100644 index 0000000000..ac455f3905 --- /dev/null +++ b/src/3rdparty/angle/src/libANGLE/Surface.cpp @@ -0,0 +1,166 @@ +// +// Copyright (c) 2002-2014 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. +// + +// Surface.cpp: Implements the egl::Surface class, representing a drawing surface +// such as the client area of a window, including any back buffers. +// Implements EGLSurface and related functionality. [EGL 1.4] section 2.2 page 3. + +#include "libANGLE/Surface.h" + +#include "libANGLE/Config.h" +#include "libANGLE/Texture.h" +#include "libANGLE/renderer/SurfaceImpl.h" + +#include <EGL/eglext.h> + +namespace egl +{ + +Surface::Surface(rx::SurfaceImpl *impl, EGLint surfaceType, const egl::Config *config, const AttributeMap &attributes) + : RefCountObject(0), // id unused + mImplementation(impl), + mType(surfaceType), + mConfig(config), + mPostSubBufferRequested(false), + mFixedSize(false), + mFixedWidth(0), + mFixedHeight(0), + mTextureFormat(EGL_NO_TEXTURE), + mTextureTarget(EGL_NO_TEXTURE), + // FIXME: Determine actual pixel aspect ratio + mPixelAspectRatio(static_cast<EGLint>(1.0 * EGL_DISPLAY_SCALING)), + mRenderBuffer(EGL_BACK_BUFFER), + mSwapBehavior(EGL_BUFFER_PRESERVED), + mTexture(NULL) +{ + addRef(); + + mPostSubBufferRequested = (attributes.get(EGL_POST_SUB_BUFFER_SUPPORTED_NV, EGL_FALSE) == EGL_TRUE); + + mFixedSize = (attributes.get(EGL_FIXED_SIZE_ANGLE, EGL_FALSE) == EGL_TRUE); + if (mFixedSize) + { + mFixedWidth = attributes.get(EGL_WIDTH, 0); + mFixedHeight = attributes.get(EGL_HEIGHT, 0); + } + + if (mType != EGL_WINDOW_BIT) + { + mTextureFormat = attributes.get(EGL_TEXTURE_FORMAT, EGL_NO_TEXTURE); + mTextureTarget = attributes.get(EGL_TEXTURE_TARGET, EGL_NO_TEXTURE); + } +} + +Surface::~Surface() +{ + if (mTexture) + { + if (mImplementation) + { + mImplementation->releaseTexImage(mTexture->id()); + } + mTexture->releaseTexImage(); + mTexture = NULL; + } + + SafeDelete(mImplementation); +} + +EGLint Surface::getType() const +{ + return mType; +} + +Error Surface::swap() +{ + return mImplementation->swap(); +} + +Error Surface::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) +{ + return mImplementation->postSubBuffer(x, y, width, height); +} + +Error Surface::querySurfacePointerANGLE(EGLint attribute, void **value) +{ + return mImplementation->querySurfacePointerANGLE(attribute, value); +} + +EGLint Surface::isPostSubBufferSupported() const +{ + return mPostSubBufferRequested && mImplementation->isPostSubBufferSupported(); +} + +void Surface::setSwapInterval(EGLint interval) +{ + mImplementation->setSwapInterval(interval); +} + +const Config *Surface::getConfig() const +{ + return mConfig; +} + +EGLint Surface::getPixelAspectRatio() const +{ + return mPixelAspectRatio; +} + +EGLenum Surface::getRenderBuffer() const +{ + return mRenderBuffer; +} + +EGLenum Surface::getSwapBehavior() const +{ + return mSwapBehavior; +} + +EGLenum Surface::getTextureFormat() const +{ + return mTextureFormat; +} + +EGLenum Surface::getTextureTarget() const +{ + return mTextureTarget; +} + +EGLint Surface::isFixedSize() const +{ + return mFixedSize; +} + +EGLint Surface::getWidth() const +{ + return mFixedSize ? mFixedWidth : mImplementation->getWidth(); +} + +EGLint Surface::getHeight() const +{ + return mFixedSize ? mFixedHeight : mImplementation->getHeight(); +} + +Error Surface::bindTexImage(gl::Texture *texture, EGLint buffer) +{ + ASSERT(!mTexture); + + texture->bindTexImage(this); + mTexture = texture; + return mImplementation->bindTexImage(buffer); +} + +Error Surface::releaseTexImage(EGLint buffer) +{ + ASSERT(mTexture); + gl::Texture *boundTexture = mTexture; + mTexture = NULL; + + boundTexture->releaseTexImage(); + return mImplementation->releaseTexImage(buffer); +} + +} |