blob: 215e82195590cb97ac6509d0f4a931e8dd2e5288 [file]
//
// 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"
namespace egl
{
Surface::Surface(rx::SurfaceImpl *impl)
: mImplementation(impl),
// 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)
{
}
Surface::~Surface()
{
if (mTexture)
{
if (mImplementation)
{
mImplementation->releaseTexImage(mTexture->id());
}
mTexture->releaseTexImage();
mTexture = NULL;
}
SafeDelete(mImplementation);
}
EGLNativeWindowType Surface::getWindowHandle() const
{
return mImplementation->getWindowHandle();
}
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 mImplementation->isPostSubBufferSupported();
}
void Surface::setSwapInterval(EGLint interval)
{
mImplementation->setSwapInterval(interval);
}
EGLint Surface::getConfigID() const
{
return mImplementation->getConfig()->configID;
}
const Config *Surface::getConfig() const
{
return mImplementation->getConfig();
}
EGLint Surface::getPixelAspectRatio() const
{
return mPixelAspectRatio;
}
EGLenum Surface::getRenderBuffer() const
{
return mRenderBuffer;
}
EGLenum Surface::getSwapBehavior() const
{
return mSwapBehavior;
}
EGLenum Surface::getTextureFormat() const
{
return mImplementation->getTextureFormat();
}
EGLenum Surface::getTextureTarget() const
{
return mImplementation->getTextureTarget();
}
EGLint Surface::isFixedSize() const
{
return mImplementation->isFixedSize();
}
EGLenum Surface::getFormat() const
{
return mImplementation->getFormat();
}
EGLint Surface::getWidth() const
{
return mImplementation->getWidth();
}
EGLint Surface::getHeight() const
{
return 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);
}
}