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