blob: 823c0ea3ea6aad81b6fddb37d15070042f8b369e [file] [log] [blame]
Geoff Langf9a6f082015-01-22 13:32:49 -05001//
2// Copyright 2015 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// RenderbufferGL.cpp: Implements the class methods for RenderbufferGL.
8
9#include "libANGLE/renderer/gl/RenderbufferGL.h"
10
11#include "common/debug.h"
Geoff Langa4903b72015-03-02 16:02:48 -080012#include "libANGLE/Caps.h"
Geoff Langcd69f1c2015-03-18 14:33:23 -040013#include "libANGLE/angletypes.h"
14#include "libANGLE/renderer/gl/FunctionsGL.h"
15#include "libANGLE/renderer/gl/StateManagerGL.h"
Geoff Langa4903b72015-03-02 16:02:48 -080016#include "libANGLE/renderer/gl/renderergl_utils.h"
Geoff Langf9a6f082015-01-22 13:32:49 -050017
18namespace rx
19{
20
Geoff Langa4903b72015-03-02 16:02:48 -080021RenderbufferGL::RenderbufferGL(const FunctionsGL *functions, StateManagerGL *stateManager, const gl::TextureCapsMap &textureCaps)
Geoff Langcd69f1c2015-03-18 14:33:23 -040022 : RenderbufferImpl(),
23 mFunctions(functions),
24 mStateManager(stateManager),
Geoff Langa4903b72015-03-02 16:02:48 -080025 mTextureCaps(textureCaps),
Geoff Langcd69f1c2015-03-18 14:33:23 -040026 mRenderbufferID(0)
27{
28 mFunctions->genRenderbuffers(1, &mRenderbufferID);
29}
Geoff Langf9a6f082015-01-22 13:32:49 -050030
31RenderbufferGL::~RenderbufferGL()
Geoff Langcd69f1c2015-03-18 14:33:23 -040032{
33 if (mRenderbufferID != 0)
34 {
35 mFunctions->deleteRenderbuffers(1, &mRenderbufferID);
36 mRenderbufferID = 0;
37 }
38}
Geoff Langf9a6f082015-01-22 13:32:49 -050039
Geoff Langa08e1bd2015-03-24 10:17:18 -040040gl::Error RenderbufferGL::setStorage(GLenum internalformat, size_t width, size_t height)
41{
Geoff Langcd69f1c2015-03-18 14:33:23 -040042 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
43 mFunctions->renderbufferStorage(GL_RENDERBUFFER, internalformat, width, height);
44 return gl::Error(GL_NO_ERROR);
Geoff Langa08e1bd2015-03-24 10:17:18 -040045}
46
47gl::Error RenderbufferGL::setStorageMultisample(size_t samples, GLenum internalformat, size_t width, size_t height)
Geoff Langf9a6f082015-01-22 13:32:49 -050048{
Geoff Langcd69f1c2015-03-18 14:33:23 -040049 mStateManager->bindRenderbuffer(GL_RENDERBUFFER, mRenderbufferID);
50 mFunctions->renderbufferStorageMultisample(GL_RENDERBUFFER, samples, internalformat, width, height);
Geoff Langa4903b72015-03-02 16:02:48 -080051
52 const gl::TextureCaps &formatCaps = mTextureCaps.get(internalformat);
53 if (samples > formatCaps.getMaxSamples())
54 {
55 // Before version 4.2, it is unknown if the specific internal format can support the requested number
56 // of samples. It is expected that GL_OUT_OF_MEMORY is returned if the renderbuffer cannot be created.
57 GLenum error = GL_NO_ERROR;
58 do
59 {
60 GLenum error = mFunctions->getError();
61 if (error == GL_OUT_OF_MEMORY)
62 {
63 return gl::Error(GL_OUT_OF_MEMORY);
64 }
65
66 ASSERT(error == GL_NO_ERROR);
67 } while (error != GL_NO_ERROR);
68 }
69
Geoff Langcd69f1c2015-03-18 14:33:23 -040070 return gl::Error(GL_NO_ERROR);
71}
72
73GLuint RenderbufferGL::getRenderbufferID() const
74{
75 return mRenderbufferID;
Geoff Langf9a6f082015-01-22 13:32:49 -050076}
77
78}