Commit e7ed96c3 by Corentin Wallez

Implement Pbuffers for the CGL backend, using renderbuffers

The CGL pbuffers have been deprecated since OSX 10.7 but our testing requires that an EGL implementation supports pbuffers. This commit implement pbuffers on top of renderbuffer using only OpenGL. BUG=angleproject:891 Change-Id: Ie8e09c9300a00800600c3a77044ba05205f805da Reviewed-on: https://chromium-review.googlesource.com/299442Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 9cf9bcbe
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <EGL/eglext.h> #include <EGL/eglext.h>
#include "common/debug.h" #include "common/debug.h"
#include "libANGLE/renderer/gl/CGL/PbufferSurfaceCGL.h"
#include "libANGLE/renderer/gl/CGL/WindowSurfaceCGL.h" #include "libANGLE/renderer/gl/CGL/WindowSurfaceCGL.h"
namespace namespace
...@@ -118,8 +119,9 @@ SurfaceImpl *DisplayCGL::createWindowSurface(const egl::Config *configuration, ...@@ -118,8 +119,9 @@ SurfaceImpl *DisplayCGL::createWindowSurface(const egl::Config *configuration,
SurfaceImpl *DisplayCGL::createPbufferSurface(const egl::Config *configuration, SurfaceImpl *DisplayCGL::createPbufferSurface(const egl::Config *configuration,
const egl::AttributeMap &attribs) const egl::AttributeMap &attribs)
{ {
UNIMPLEMENTED(); EGLint width = attribs.get(EGL_WIDTH, 0);
return nullptr; EGLint height = attribs.get(EGL_HEIGHT, 0);
return new PbufferSurfaceCGL(this->getRenderer(), width, height, mFunctions);
} }
SurfaceImpl* DisplayCGL::createPbufferFromClientBuffer(const egl::Config *configuration, SurfaceImpl* DisplayCGL::createPbufferFromClientBuffer(const egl::Config *configuration,
...@@ -187,7 +189,7 @@ egl::ConfigSet DisplayCGL::generateConfigs() const ...@@ -187,7 +189,7 @@ egl::ConfigSet DisplayCGL::generateConfigs() const
config.bindToTextureRGB = EGL_FALSE; config.bindToTextureRGB = EGL_FALSE;
config.bindToTextureRGBA = EGL_FALSE; config.bindToTextureRGBA = EGL_FALSE;
config.surfaceType = EGL_WINDOW_BIT; config.surfaceType = EGL_WINDOW_BIT | EGL_PBUFFER_BIT;
config.minSwapInterval = 1; config.minSwapInterval = 1;
config.maxSwapInterval = 1; config.maxSwapInterval = 1;
......
//
// 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.
//
// PBufferSurfaceCGL.h: an implementation of egl::Surface for PBuffers for the CLG backend,
// currently implemented using renderbuffers
#ifndef LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
#define LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
#include "libANGLE/renderer/gl/SurfaceGL.h"
namespace rx
{
class FunctionsGL;
class StateManagerGL;
class PbufferSurfaceCGL : public SurfaceGL
{
public:
PbufferSurfaceCGL(RendererGL *renderer,
EGLint width,
EGLint height,
const FunctionsGL *functions);
~PbufferSurfaceCGL() override;
egl::Error initialize() override;
egl::Error makeCurrent() override;
egl::Error swap() override;
egl::Error postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) override;
egl::Error querySurfacePointerANGLE(EGLint attribute, void **value) override;
egl::Error bindTexImage(EGLint buffer) override;
egl::Error releaseTexImage(EGLint buffer) override;
void setSwapInterval(EGLint interval) override;
EGLint getWidth() const override;
EGLint getHeight() const override;
EGLint isPostSubBufferSupported() const override;
EGLint getSwapBehavior() const override;
FramebufferImpl *createDefaultFramebuffer(const gl::Framebuffer::Data &data) override;
private:
unsigned mWidth;
unsigned mHeight;
const FunctionsGL *mFunctions;
StateManagerGL *mStateManager;
GLuint mFramebuffer;
GLuint mColorRenderbuffer;
GLuint mDSRenderbuffer;
};
}
#endif // LIBANGLE_RENDERER_GL_CGL_PBUFFERSURFACECGL_H_
//
// 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.
//
// PBufferSurfaceCGL.cpp: an implementation of egl::Surface for PBuffers for the CLG backend,
// currently implemented using renderbuffers
#include "libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h"
#include "common/debug.h"
#include "libANGLE/renderer/gl/FunctionsGL.h"
#include "libANGLE/renderer/gl/FramebufferGL.h"
#include "libANGLE/renderer/gl/RendererGL.h"
#include "libANGLE/renderer/gl/StateManagerGL.h"
namespace rx
{
PbufferSurfaceCGL::PbufferSurfaceCGL(RendererGL *renderer,
EGLint width,
EGLint height,
const FunctionsGL *functions)
: SurfaceGL(renderer),
mWidth(width),
mHeight(height),
mFunctions(functions),
mStateManager(renderer->getStateManager()),
mFramebuffer(0),
mColorRenderbuffer(0),
mDSRenderbuffer(0)
{
}
PbufferSurfaceCGL::~PbufferSurfaceCGL()
{
if (mFramebuffer != 0)
{
mFunctions->deleteFramebuffers(1, &mFramebuffer);
mFramebuffer = 0;
}
if (mColorRenderbuffer != 0)
{
mFunctions->deleteRenderbuffers(1, &mColorRenderbuffer);
mColorRenderbuffer = 0;
}
if (mDSRenderbuffer != 0)
{
mFunctions->deleteRenderbuffers(1, &mDSRenderbuffer);
mDSRenderbuffer = 0;
}
}
egl::Error PbufferSurfaceCGL::initialize()
{
mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight);
mFunctions->genRenderbuffers(1, &mDSRenderbuffer);
mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight);
mFunctions->genFramebuffers(1, &mFramebuffer);
mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
mColorRenderbuffer);
mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, mDSRenderbuffer);
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::makeCurrent()
{
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::swap()
{
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height)
{
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value)
{
UNIMPLEMENTED();
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::bindTexImage(EGLint buffer)
{
UNIMPLEMENTED();
return egl::Error(EGL_SUCCESS);
}
egl::Error PbufferSurfaceCGL::releaseTexImage(EGLint buffer)
{
UNIMPLEMENTED();
return egl::Error(EGL_SUCCESS);
}
void PbufferSurfaceCGL::setSwapInterval(EGLint interval)
{
}
EGLint PbufferSurfaceCGL::getWidth() const
{
return mWidth;
}
EGLint PbufferSurfaceCGL::getHeight() const
{
return mHeight;
}
EGLint PbufferSurfaceCGL::isPostSubBufferSupported() const
{
UNIMPLEMENTED();
return EGL_FALSE;
}
EGLint PbufferSurfaceCGL::getSwapBehavior() const
{
return EGL_BUFFER_PRESERVED;
}
FramebufferImpl *PbufferSurfaceCGL::createDefaultFramebuffer(const gl::Framebuffer::Data &data)
{
// TODO(cwallez) assert it happens only once?
return new FramebufferGL(mFramebuffer, data, mFunctions, mStateManager);
}
}
...@@ -466,6 +466,8 @@ ...@@ -466,6 +466,8 @@
[ [
'libANGLE/renderer/gl/cgl/DisplayCGL.mm', 'libANGLE/renderer/gl/cgl/DisplayCGL.mm',
'libANGLE/renderer/gl/cgl/DisplayCGL.h', 'libANGLE/renderer/gl/cgl/DisplayCGL.h',
'libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.mm',
'libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h',
'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm', 'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.mm',
'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h', 'libANGLE/renderer/gl/cgl/WindowSurfaceCGL.h',
], ],
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment