• 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 #import "common/platform.h"
11 
12 #if defined(ANGLE_PLATFORM_IOS) && !defined(ANGLE_PLATFORM_MACCATALYST)
13 
14 #    include "libANGLE/renderer/gl/eagl/PbufferSurfaceEAGL.h"
15 
16 #    include "common/debug.h"
17 #    include "libANGLE/renderer/gl/FramebufferGL.h"
18 #    include "libANGLE/renderer/gl/FunctionsGL.h"
19 #    include "libANGLE/renderer/gl/RendererGL.h"
20 #    include "libANGLE/renderer/gl/StateManagerGL.h"
21 
22 namespace rx
23 {
24 
PbufferSurfaceEAGL(const egl::SurfaceState & state,RendererGL * renderer,EGLint width,EGLint height)25 PbufferSurfaceEAGL::PbufferSurfaceEAGL(const egl::SurfaceState &state,
26                                        RendererGL *renderer,
27                                        EGLint width,
28                                        EGLint height)
29     : SurfaceGL(state),
30       mWidth(width),
31       mHeight(height),
32       mFunctions(renderer->getFunctions()),
33       mStateManager(renderer->getStateManager()),
34       mColorRenderbuffer(0),
35       mDSRenderbuffer(0)
36 {}
37 
~PbufferSurfaceEAGL()38 PbufferSurfaceEAGL::~PbufferSurfaceEAGL()
39 {
40     if (mColorRenderbuffer != 0)
41     {
42         mFunctions->deleteRenderbuffers(1, &mColorRenderbuffer);
43         mColorRenderbuffer = 0;
44     }
45     if (mDSRenderbuffer != 0)
46     {
47         mFunctions->deleteRenderbuffers(1, &mDSRenderbuffer);
48         mDSRenderbuffer = 0;
49     }
50 }
51 
initialize(const egl::Display * display)52 egl::Error PbufferSurfaceEAGL::initialize(const egl::Display *display)
53 {
54     mFunctions->genRenderbuffers(1, &mColorRenderbuffer);
55     mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mColorRenderbuffer);
56     mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, mWidth, mHeight);
57 
58     mFunctions->genRenderbuffers(1, &mDSRenderbuffer);
59     mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mDSRenderbuffer);
60     mFunctions->renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mWidth, mHeight);
61 
62     return egl::NoError();
63 }
64 
makeCurrent(const gl::Context * context)65 egl::Error PbufferSurfaceEAGL::makeCurrent(const gl::Context *context)
66 {
67     return egl::NoError();
68 }
69 
swap(const gl::Context * context)70 egl::Error PbufferSurfaceEAGL::swap(const gl::Context *context)
71 {
72     return egl::NoError();
73 }
74 
postSubBuffer(const gl::Context * context,EGLint x,EGLint y,EGLint width,EGLint height)75 egl::Error PbufferSurfaceEAGL::postSubBuffer(const gl::Context *context,
76                                              EGLint x,
77                                              EGLint y,
78                                              EGLint width,
79                                              EGLint height)
80 {
81     return egl::NoError();
82 }
83 
querySurfacePointerANGLE(EGLint attribute,void ** value)84 egl::Error PbufferSurfaceEAGL::querySurfacePointerANGLE(EGLint attribute, void **value)
85 {
86     UNIMPLEMENTED();
87     return egl::NoError();
88 }
89 
bindTexImage(const gl::Context * context,gl::Texture * texture,EGLint buffer)90 egl::Error PbufferSurfaceEAGL::bindTexImage(const gl::Context *context,
91                                             gl::Texture *texture,
92                                             EGLint buffer)
93 {
94     ERR() << "PbufferSurfaceEAGL::bindTexImage";
95     UNIMPLEMENTED();
96     return egl::NoError();
97 }
98 
releaseTexImage(const gl::Context * context,EGLint buffer)99 egl::Error PbufferSurfaceEAGL::releaseTexImage(const gl::Context *context, EGLint buffer)
100 {
101     UNIMPLEMENTED();
102     return egl::NoError();
103 }
104 
setSwapInterval(EGLint interval)105 void PbufferSurfaceEAGL::setSwapInterval(EGLint interval) {}
106 
getWidth() const107 EGLint PbufferSurfaceEAGL::getWidth() const
108 {
109     return mWidth;
110 }
111 
getHeight() const112 EGLint PbufferSurfaceEAGL::getHeight() const
113 {
114     return mHeight;
115 }
116 
isPostSubBufferSupported() const117 EGLint PbufferSurfaceEAGL::isPostSubBufferSupported() const
118 {
119     UNIMPLEMENTED();
120     return EGL_FALSE;
121 }
122 
getSwapBehavior() const123 EGLint PbufferSurfaceEAGL::getSwapBehavior() const
124 {
125     return EGL_BUFFER_PRESERVED;
126 }
127 
createDefaultFramebuffer(const gl::Context * context,const gl::FramebufferState & state)128 FramebufferImpl *PbufferSurfaceEAGL::createDefaultFramebuffer(const gl::Context *context,
129                                                               const gl::FramebufferState &state)
130 {
131     const FunctionsGL *functions = GetFunctionsGL(context);
132     StateManagerGL *stateManager = GetStateManagerGL(context);
133 
134     GLuint framebuffer = 0;
135     functions->genFramebuffers(1, &framebuffer);
136     stateManager->bindFramebuffer(GL_FRAMEBUFFER, framebuffer);
137     functions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
138                                        mColorRenderbuffer);
139     functions->framebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,
140                                        mDSRenderbuffer);
141 
142     return new FramebufferGL(state, framebuffer, true, false);
143 }
144 
145 }  // namespace rx
146 
147 #endif  // defined(ANGLE_PLATFORM_IOS)
148