1// 2// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved. 3// Use of this source code is governed by a BSD-style license that can be 4// found in the LICENSE file. 5// 6 7// PBufferSurfaceCGL.cpp: an implementation of egl::Surface for PBuffers for the CLG backend, 8// currently implemented using renderbuffers 9 10#include "libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.h" 11 12#include "common/debug.h" 13#include "libANGLE/renderer/gl/FunctionsGL.h" 14#include "libANGLE/renderer/gl/FramebufferGL.h" 15#include "libANGLE/renderer/gl/RendererGL.h" 16#include "libANGLE/renderer/gl/StateManagerGL.h" 17 18namespace rx 19{ 20 21PbufferSurfaceCGL::PbufferSurfaceCGL(const egl::SurfaceState &state, 22 RendererGL *renderer, 23 EGLint width, 24 EGLint height, 25 const FunctionsGL *functions) 26 : SurfaceGL(state, renderer), 27 mWidth(width), 28 mHeight(height), 29 mFunctions(functions), 30 mStateManager(renderer->getStateManager()), 31 mRenderer(renderer), 32 mFramebuffer(0), 33 mColorRenderbuffer(0), 34 mDSRenderbuffer(0) 35{ 36} 37 38PbufferSurfaceCGL::~PbufferSurfaceCGL() 39{ 40 if (mFramebuffer != 0) 41 { 42 mFunctions->deleteFramebuffers(1, &mFramebuffer); 43 mFramebuffer = 0; 44 } 45 46 if (mColorRenderbuffer != 0) 47 { 48 mFunctions->deleteRenderbuffers(1, &mColorRenderbuffer); 49 mColorRenderbuffer = 0; 50 } 51 if (mDSRenderbuffer != 0) 52 { 53 mFunctions->deleteRenderbuffers(1, &mDSRenderbuffer); 54 mDSRenderbuffer = 0; 55 } 56} 57 58egl::Error PbufferSurfaceCGL::initialize() 59{ 60 mFunctions->genRenderbuffers(1, &mColorRenderbuffer); 61 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer); 62 mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight); 63 64 mFunctions->genRenderbuffers(1, &mDSRenderbuffer); 65 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer); 66 mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight); 67 68 mFunctions->genFramebuffers(1, &mFramebuffer); 69 mStateManager->bindFramebuffer(GL_FRAMEBUFFER, mFramebuffer); 70 mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 71 mColorRenderbuffer); 72 mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, 73 GL_RENDERBUFFER, mDSRenderbuffer); 74 75 return egl::Error(EGL_SUCCESS); 76} 77 78egl::Error PbufferSurfaceCGL::makeCurrent() 79{ 80 return egl::Error(EGL_SUCCESS); 81} 82 83egl::Error PbufferSurfaceCGL::swap() 84{ 85 return egl::Error(EGL_SUCCESS); 86} 87 88egl::Error PbufferSurfaceCGL::postSubBuffer(EGLint x, EGLint y, EGLint width, EGLint height) 89{ 90 return egl::Error(EGL_SUCCESS); 91} 92 93egl::Error PbufferSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value) 94{ 95 UNIMPLEMENTED(); 96 return egl::Error(EGL_SUCCESS); 97} 98 99egl::Error PbufferSurfaceCGL::bindTexImage(gl::Texture *texture, EGLint buffer) 100{ 101 UNIMPLEMENTED(); 102 return egl::Error(EGL_SUCCESS); 103} 104 105egl::Error PbufferSurfaceCGL::releaseTexImage(EGLint buffer) 106{ 107 UNIMPLEMENTED(); 108 return egl::Error(EGL_SUCCESS); 109} 110 111void PbufferSurfaceCGL::setSwapInterval(EGLint interval) 112{ 113} 114 115EGLint PbufferSurfaceCGL::getWidth() const 116{ 117 return mWidth; 118} 119 120EGLint PbufferSurfaceCGL::getHeight() const 121{ 122 return mHeight; 123} 124 125EGLint PbufferSurfaceCGL::isPostSubBufferSupported() const 126{ 127 UNIMPLEMENTED(); 128 return EGL_FALSE; 129} 130 131EGLint PbufferSurfaceCGL::getSwapBehavior() const 132{ 133 return EGL_BUFFER_PRESERVED; 134} 135 136FramebufferImpl *PbufferSurfaceCGL::createDefaultFramebuffer(const gl::FramebufferState &state) 137{ 138 // TODO(cwallez) assert it happens only once? 139 return new FramebufferGL(mFramebuffer, state, mFunctions, mRenderer->getWorkarounds(), 140 mRenderer->getBlitter(), mStateManager); 141} 142 143} 144