1 //
2 // Copyright 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/FramebufferGL.h"
14 #include "libANGLE/renderer/gl/FunctionsGL.h"
15 #include "libANGLE/renderer/gl/RendererGL.h"
16 #include "libANGLE/renderer/gl/StateManagerGL.h"
17
18 namespace rx
19 {
20
PbufferSurfaceCGL(const egl::SurfaceState & state,RendererGL * renderer,EGLint width,EGLint height)21 PbufferSurfaceCGL::PbufferSurfaceCGL(const egl::SurfaceState &state,
22 RendererGL *renderer,
23 EGLint width,
24 EGLint height)
25 : SurfaceGL(state),
26 mWidth(width),
27 mHeight(height),
28 mFunctions(renderer->getFunctions()),
29 mStateManager(renderer->getStateManager()),
30 mFramebuffer(0),
31 mColorRenderbuffer(0),
32 mDSRenderbuffer(0)
33 {}
34
~PbufferSurfaceCGL()35 PbufferSurfaceCGL::~PbufferSurfaceCGL()
36 {
37 if (mFramebuffer != 0)
38 {
39 mStateManager->deleteFramebuffer(mFramebuffer);
40 mFramebuffer = 0;
41 }
42
43 if (mColorRenderbuffer != 0)
44 {
45 mStateManager->deleteRenderbuffer(mColorRenderbuffer);
46 mColorRenderbuffer = 0;
47 }
48 if (mDSRenderbuffer != 0)
49 {
50 mStateManager->deleteRenderbuffer(mDSRenderbuffer);
51 mDSRenderbuffer = 0;
52 }
53 }
54
initialize(const egl::Display * display)55 egl::Error PbufferSurfaceCGL::initialize(const egl::Display *display)
56 {
57 mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
58 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
59 mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight);
60
61 mFunctions->genRenderbuffers(1, &mDSRenderbuffer);
62 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
63 mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight);
64
65 return egl::NoError();
66 }
67
makeCurrent(const gl::Context * context)68 egl::Error PbufferSurfaceCGL::makeCurrent(const gl::Context *context)
69 {
70 return egl::NoError();
71 }
72
swap(const gl::Context * context)73 egl::Error PbufferSurfaceCGL::swap(const gl::Context *context)
74 {
75 return egl::NoError();
76 }
77
postSubBuffer(const gl::Context * context,EGLint x,EGLint y,EGLint width,EGLint height)78 egl::Error PbufferSurfaceCGL::postSubBuffer(const gl::Context *context,
79 EGLint x,
80 EGLint y,
81 EGLint width,
82 EGLint height)
83 {
84 return egl::NoError();
85 }
86
querySurfacePointerANGLE(EGLint attribute,void ** value)87 egl::Error PbufferSurfaceCGL::querySurfacePointerANGLE(EGLint attribute, void **value)
88 {
89 UNIMPLEMENTED();
90 return egl::NoError();
91 }
92
bindTexImage(const gl::Context * context,gl::Texture * texture,EGLint buffer)93 egl::Error PbufferSurfaceCGL::bindTexImage(const gl::Context *context,
94 gl::Texture *texture,
95 EGLint buffer)
96 {
97 UNIMPLEMENTED();
98 return egl::NoError();
99 }
100
releaseTexImage(const gl::Context * context,EGLint buffer)101 egl::Error PbufferSurfaceCGL::releaseTexImage(const gl::Context *context, EGLint buffer)
102 {
103 UNIMPLEMENTED();
104 return egl::NoError();
105 }
106
setSwapInterval(const egl::Display * display,EGLint interval)107 void PbufferSurfaceCGL::setSwapInterval(const egl::Display *display, EGLint interval) {}
108
getWidth() const109 EGLint PbufferSurfaceCGL::getWidth() const
110 {
111 return mWidth;
112 }
113
getHeight() const114 EGLint PbufferSurfaceCGL::getHeight() const
115 {
116 return mHeight;
117 }
118
isPostSubBufferSupported() const119 EGLint PbufferSurfaceCGL::isPostSubBufferSupported() const
120 {
121 UNIMPLEMENTED();
122 return EGL_FALSE;
123 }
124
getSwapBehavior() const125 EGLint PbufferSurfaceCGL::getSwapBehavior() const
126 {
127 return EGL_BUFFER_PRESERVED;
128 }
129
attachToFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)130 egl::Error PbufferSurfaceCGL::attachToFramebuffer(const gl::Context *context,
131 gl::Framebuffer *framebuffer)
132 {
133 FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
134 ASSERT(framebufferGL->getFramebufferID() == 0);
135
136 if (mFramebuffer == 0)
137 {
138 GLuint framebufferID = 0;
139 mFunctions->genFramebuffers(1, &framebufferID);
140 mStateManager->bindFramebuffer(GL_FRAMEBUFFER, framebufferID);
141 mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
142 mColorRenderbuffer);
143 mFunctions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
144 GL_RENDERBUFFER, mDSRenderbuffer);
145 mFramebuffer = framebufferID;
146 }
147 framebufferGL->setFramebufferID(mFramebuffer);
148 return egl::NoError();
149 }
150
detachFromFramebuffer(const gl::Context * context,gl::Framebuffer * framebuffer)151 egl::Error PbufferSurfaceCGL::detachFromFramebuffer(const gl::Context *context,
152 gl::Framebuffer *framebuffer)
153 {
154 FramebufferGL *framebufferGL = GetImplAs<FramebufferGL>(framebuffer);
155 ASSERT(framebufferGL->getFramebufferID() == mFramebuffer);
156 framebufferGL->setFramebufferID(0);
157 return egl::NoError();
158 }
159
160 } // namespace rx
161