xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/RenderbufferGL.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker 
7*8975f5c5SAndroid Build Coastguard Worker // RenderbufferGL.cpp: Implements the class methods for RenderbufferGL.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/RenderbufferGL.h"
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Caps.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/BlitGL.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ContextGL.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/FunctionsGL.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/ImageGL.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/StateManagerGL.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/formatutilsgl.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/gl/renderergl_utils.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "platform/autogen/FeaturesGL_autogen.h"
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace rx
25*8975f5c5SAndroid Build Coastguard Worker {
RenderbufferGL(const gl::RenderbufferState & state,GLuint id)26*8975f5c5SAndroid Build Coastguard Worker RenderbufferGL::RenderbufferGL(const gl::RenderbufferState &state, GLuint id)
27*8975f5c5SAndroid Build Coastguard Worker     : RenderbufferImpl(state), mRenderbufferID(id)
28*8975f5c5SAndroid Build Coastguard Worker {}
29*8975f5c5SAndroid Build Coastguard Worker 
~RenderbufferGL()30*8975f5c5SAndroid Build Coastguard Worker RenderbufferGL::~RenderbufferGL()
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker     ASSERT(mRenderbufferID == 0);
33*8975f5c5SAndroid Build Coastguard Worker }
34*8975f5c5SAndroid Build Coastguard Worker 
onDestroy(const gl::Context * context)35*8975f5c5SAndroid Build Coastguard Worker void RenderbufferGL::onDestroy(const gl::Context *context)
36*8975f5c5SAndroid Build Coastguard Worker {
37*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *stateManager = GetStateManagerGL(context);
38*8975f5c5SAndroid Build Coastguard Worker     stateManager->deleteRenderbuffer(mRenderbufferID);
39*8975f5c5SAndroid Build Coastguard Worker     mRenderbufferID = 0;
40*8975f5c5SAndroid Build Coastguard Worker }
41*8975f5c5SAndroid Build Coastguard Worker 
setStorage(const gl::Context * context,GLenum internalformat,GLsizei width,GLsizei height)42*8975f5c5SAndroid Build Coastguard Worker angle::Result RenderbufferGL::setStorage(const gl::Context *context,
43*8975f5c5SAndroid Build Coastguard Worker                                          GLenum internalformat,
44*8975f5c5SAndroid Build Coastguard Worker                                          GLsizei width,
45*8975f5c5SAndroid Build Coastguard Worker                                          GLsizei height)
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions      = GetFunctionsGL(context);
48*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *stateManager      = GetStateManagerGL(context);
49*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = GetFeaturesGL(context);
50*8975f5c5SAndroid Build Coastguard Worker 
51*8975f5c5SAndroid Build Coastguard Worker     stateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     nativegl::RenderbufferFormat renderbufferFormat =
54*8975f5c5SAndroid Build Coastguard Worker         nativegl::GetRenderbufferFormat(functions, features, internalformat);
55*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_TRY_ALWAYS_CHECK(
56*8975f5c5SAndroid Build Coastguard Worker         context, functions->renderbufferStorage(GL_RENDERBUFFER, renderbufferFormat.internalFormat,
57*8975f5c5SAndroid Build Coastguard Worker                                                 width, height));
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     mNativeInternalFormat = renderbufferFormat.internalFormat;
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
62*8975f5c5SAndroid Build Coastguard Worker }
63*8975f5c5SAndroid Build Coastguard Worker 
setStorageMultisample(const gl::Context * context,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height,gl::MultisamplingMode mode)64*8975f5c5SAndroid Build Coastguard Worker angle::Result RenderbufferGL::setStorageMultisample(const gl::Context *context,
65*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei samples,
66*8975f5c5SAndroid Build Coastguard Worker                                                     GLenum internalformat,
67*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei width,
68*8975f5c5SAndroid Build Coastguard Worker                                                     GLsizei height,
69*8975f5c5SAndroid Build Coastguard Worker                                                     gl::MultisamplingMode mode)
70*8975f5c5SAndroid Build Coastguard Worker {
71*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *functions      = GetFunctionsGL(context);
72*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *stateManager      = GetStateManagerGL(context);
73*8975f5c5SAndroid Build Coastguard Worker     const angle::FeaturesGL &features = GetFeaturesGL(context);
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker     stateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     nativegl::RenderbufferFormat renderbufferFormat =
78*8975f5c5SAndroid Build Coastguard Worker         nativegl::GetRenderbufferFormat(functions, features, internalformat);
79*8975f5c5SAndroid Build Coastguard Worker     if (mode == gl::MultisamplingMode::Regular)
80*8975f5c5SAndroid Build Coastguard Worker     {
81*8975f5c5SAndroid Build Coastguard Worker         ANGLE_GL_TRY_ALWAYS_CHECK(context, functions->renderbufferStorageMultisample(
82*8975f5c5SAndroid Build Coastguard Worker                                                GL_RENDERBUFFER, samples,
83*8975f5c5SAndroid Build Coastguard Worker                                                renderbufferFormat.internalFormat, width, height));
84*8975f5c5SAndroid Build Coastguard Worker     }
85*8975f5c5SAndroid Build Coastguard Worker     else
86*8975f5c5SAndroid Build Coastguard Worker     {
87*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mode == gl::MultisamplingMode::MultisampledRenderToTexture);
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker         if (functions->renderbufferStorageMultisampleEXT)
90*8975f5c5SAndroid Build Coastguard Worker         {
91*8975f5c5SAndroid Build Coastguard Worker             ANGLE_GL_TRY_ALWAYS_CHECK(
92*8975f5c5SAndroid Build Coastguard Worker                 context,
93*8975f5c5SAndroid Build Coastguard Worker                 functions->renderbufferStorageMultisampleEXT(
94*8975f5c5SAndroid Build Coastguard Worker                     GL_RENDERBUFFER, samples, renderbufferFormat.internalFormat, width, height));
95*8975f5c5SAndroid Build Coastguard Worker         }
96*8975f5c5SAndroid Build Coastguard Worker         else
97*8975f5c5SAndroid Build Coastguard Worker         {
98*8975f5c5SAndroid Build Coastguard Worker             ASSERT(functions->renderbufferStorageMultisampleIMG);
99*8975f5c5SAndroid Build Coastguard Worker             ANGLE_GL_TRY_ALWAYS_CHECK(
100*8975f5c5SAndroid Build Coastguard Worker                 context,
101*8975f5c5SAndroid Build Coastguard Worker                 functions->renderbufferStorageMultisampleIMG(
102*8975f5c5SAndroid Build Coastguard Worker                     GL_RENDERBUFFER, samples, renderbufferFormat.internalFormat, width, height));
103*8975f5c5SAndroid Build Coastguard Worker         }
104*8975f5c5SAndroid Build Coastguard Worker     }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     mNativeInternalFormat = renderbufferFormat.internalFormat;
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker     return angle::Result::Continue;
109*8975f5c5SAndroid Build Coastguard Worker }
110*8975f5c5SAndroid Build Coastguard Worker 
setStorageEGLImageTarget(const gl::Context * context,egl::Image * image)111*8975f5c5SAndroid Build Coastguard Worker angle::Result RenderbufferGL::setStorageEGLImageTarget(const gl::Context *context,
112*8975f5c5SAndroid Build Coastguard Worker                                                        egl::Image *image)
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker     ImageGL *imageGL = GetImplAs<ImageGL>(image);
115*8975f5c5SAndroid Build Coastguard Worker     return imageGL->setRenderbufferStorage(context, this, &mNativeInternalFormat);
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker 
getRenderbufferID() const118*8975f5c5SAndroid Build Coastguard Worker GLuint RenderbufferGL::getRenderbufferID() const
119*8975f5c5SAndroid Build Coastguard Worker {
120*8975f5c5SAndroid Build Coastguard Worker     return mRenderbufferID;
121*8975f5c5SAndroid Build Coastguard Worker }
122*8975f5c5SAndroid Build Coastguard Worker 
initializeContents(const gl::Context * context,GLenum binding,const gl::ImageIndex & imageIndex)123*8975f5c5SAndroid Build Coastguard Worker angle::Result RenderbufferGL::initializeContents(const gl::Context *context,
124*8975f5c5SAndroid Build Coastguard Worker                                                  GLenum binding,
125*8975f5c5SAndroid Build Coastguard Worker                                                  const gl::ImageIndex &imageIndex)
126*8975f5c5SAndroid Build Coastguard Worker {
127*8975f5c5SAndroid Build Coastguard Worker     BlitGL *blitter = GetBlitGL(context);
128*8975f5c5SAndroid Build Coastguard Worker     return blitter->clearRenderbuffer(context, this, mNativeInternalFormat);
129*8975f5c5SAndroid Build Coastguard Worker }
130*8975f5c5SAndroid Build Coastguard Worker 
getNativeInternalFormat() const131*8975f5c5SAndroid Build Coastguard Worker GLenum RenderbufferGL::getNativeInternalFormat() const
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker     return mNativeInternalFormat;
134*8975f5c5SAndroid Build Coastguard Worker }
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
137