xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/cgl/PbufferSurfaceCGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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