1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Framebuffer.h: Defines the Framebuffer class. Implements GL framebuffer
16// objects and related functionality. [OpenGL ES 2.0.24] section 4.4 page 105.
17
18#ifndef LIBGLESV2_FRAMEBUFFER_H_
19#define LIBGLESV2_FRAMEBUFFER_H_
20
21#include "Context.h"
22#include "common/Object.hpp"
23#include "common/Image.hpp"
24
25#include <GLES2/gl2.h>
26
27namespace es2
28{
29class Renderbuffer;
30class Colorbuffer;
31class Depthbuffer;
32class Stencilbuffer;
33class DepthStencilbuffer;
34
35class Framebuffer
36{
37public:
38 Framebuffer();
39
40 virtual ~Framebuffer();
41
42 void setColorbuffer(GLenum type, GLuint colorbuffer, GLuint index, GLint level = 0, GLint layer = 0);
43 void setDepthbuffer(GLenum type, GLuint depthbuffer, GLint level = 0, GLint layer = 0);
44 void setStencilbuffer(GLenum type, GLuint stencilbuffer, GLint level = 0, GLint layer = 0);
45
46 void setReadBuffer(GLenum buf);
47 void setDrawBuffer(GLuint index, GLenum buf);
48 GLenum getReadBuffer() const;
49 GLenum getDrawBuffer(GLuint index) const;
50
51 void detachTexture(GLuint texture);
52 void detachRenderbuffer(GLuint renderbuffer);
53
54 egl::Image *getRenderTarget(GLuint index);
55 egl::Image *getReadRenderTarget();
56 egl::Image *getDepthBuffer();
57 egl::Image *getStencilBuffer();
58
59 Renderbuffer *getColorbuffer(GLuint index) const;
60 Renderbuffer *getReadColorbuffer() const;
61 Renderbuffer *getDepthbuffer() const;
62 Renderbuffer *getStencilbuffer() const;
63
64 GLenum getReadBufferType();
65 GLenum getColorbufferType(GLuint index);
66 GLenum getDepthbufferType();
67 GLenum getStencilbufferType();
68
69 GLuint getColorbufferName(GLuint index);
70 GLuint getDepthbufferName();
71 GLuint getStencilbufferName();
72
73 GLint getColorbufferLayer(GLuint index);
74 GLint getDepthbufferLayer();
75 GLint getStencilbufferLayer();
76
77 bool hasStencil();
78
79 GLenum completeness();
80 GLenum completeness(int &width, int &height, int &samples);
81
82 GLenum getImplementationColorReadFormat() const;
83 GLenum getImplementationColorReadType() const;
84 GLenum getDepthReadFormat() const;
85 GLenum getDepthReadType() const;
86
87 virtual bool isDefaultFramebuffer() const { return false; }
88
89 static bool IsRenderbuffer(GLenum type);
90
91protected:
92 GLuint getReadBufferIndex() const;
93
94 GLenum readBuffer;
95 GLenum drawBuffer[MAX_COLOR_ATTACHMENTS];
96
97 GLenum mColorbufferType[MAX_COLOR_ATTACHMENTS];
98 gl::BindingPointer<Renderbuffer> mColorbufferPointer[MAX_COLOR_ATTACHMENTS];
99 GLint mColorbufferLayer[MAX_COLOR_ATTACHMENTS];
100
101 GLenum mDepthbufferType;
102 gl::BindingPointer<Renderbuffer> mDepthbufferPointer;
103 GLint mDepthbufferLayer;
104
105 GLenum mStencilbufferType;
106 gl::BindingPointer<Renderbuffer> mStencilbufferPointer;
107 GLint mStencilbufferLayer;
108
109private:
110 Renderbuffer *lookupRenderbuffer(GLenum type, GLuint handle, GLint level) const;
111};
112
113class DefaultFramebuffer : public Framebuffer
114{
115public:
116 DefaultFramebuffer();
117 DefaultFramebuffer(Colorbuffer *colorbuffer, DepthStencilbuffer *depthStencil);
118
119 bool isDefaultFramebuffer() const override { return true; }
120};
121
122}
123
124#endif // LIBGLESV2_FRAMEBUFFER_H_
125