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