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