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