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