xref: /aosp_15_r20/external/deqp/framework/opengl/simplereference/sglrGLContext.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1 #ifndef _SGLRGLCONTEXT_HPP
2 #define _SGLRGLCONTEXT_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program OpenGL ES Utilities
5  * ------------------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief GL Rendering Context.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "sglrContext.hpp"
28 #include "tcuTestLog.hpp"
29 #include "tcuVector.hpp"
30 #include "gluRenderContext.hpp"
31 #include "gluShaderProgram.hpp"
32 
33 #include <set>
34 #include <vector>
35 
36 namespace glu
37 {
38 class CallLogWrapper;
39 }
40 
41 namespace sglr
42 {
43 
44 enum GLContextLogFlag
45 {
46     GLCONTEXT_LOG_CALLS    = (1 << 0),
47     GLCONTEXT_LOG_PROGRAMS = (1 << 1)
48 };
49 
50 class GLContext : public Context
51 {
52 public:
53     GLContext(const glu::RenderContext &context, tcu::TestLog &log, uint32_t logFlags, const tcu::IVec4 &baseViewport);
54     virtual ~GLContext(void);
55 
56     void enableLogging(uint32_t logFlags);
57 
58     virtual int getWidth(void) const;
59     virtual int getHeight(void) const;
60 
61     virtual void viewport(int x, int y, int width, int height);
62     virtual void activeTexture(uint32_t texture);
63 
64     virtual void bindTexture(uint32_t target, uint32_t texture);
65     virtual void genTextures(int numTextures, uint32_t *textures);
66     virtual void deleteTextures(int numTextures, const uint32_t *textures);
67 
68     virtual void bindFramebuffer(uint32_t target, uint32_t framebuffer);
69     virtual void genFramebuffers(int numFramebuffers, uint32_t *framebuffers);
70     virtual void deleteFramebuffers(int numFramebuffers, const uint32_t *framebuffers);
71 
72     virtual void bindRenderbuffer(uint32_t target, uint32_t renderbuffer);
73     virtual void genRenderbuffers(int numRenderbuffers, uint32_t *renderbuffers);
74     virtual void deleteRenderbuffers(int numRenderbuffers, const uint32_t *renderbuffers);
75 
76     virtual void pixelStorei(uint32_t pname, int param);
77     virtual void texImage1D(uint32_t target, int level, uint32_t internalFormat, int width, int border, uint32_t format,
78                             uint32_t type, const void *data);
79     virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int border,
80                             uint32_t format, uint32_t type, const void *data);
81     virtual void texImage3D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int depth,
82                             int border, uint32_t format, uint32_t type, const void *data);
83     virtual void texSubImage1D(uint32_t target, int level, int xoffset, int width, uint32_t format, uint32_t type,
84                                const void *data);
85     virtual void texSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int width, int height,
86                                uint32_t format, uint32_t type, const void *data);
87     virtual void texSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int width, int height,
88                                int depth, uint32_t format, uint32_t type, const void *data);
89     virtual void copyTexImage1D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width,
90                                 int border);
91     virtual void copyTexImage2D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width,
92                                 int height, int border);
93     virtual void copyTexSubImage1D(uint32_t target, int level, int xoffset, int x, int y, int width);
94     virtual void copyTexSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int x, int y, int width,
95                                    int height);
96     virtual void copyTexSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int x, int y,
97                                    int width, int height);
98 
99     virtual void texStorage2D(uint32_t target, int levels, uint32_t internalFormat, int width, int height);
100     virtual void texStorage3D(uint32_t target, int levels, uint32_t internalFormat, int width, int height, int depth);
101 
102     virtual void texParameteri(uint32_t target, uint32_t pname, int value);
103 
104     virtual void framebufferTexture2D(uint32_t target, uint32_t attachment, uint32_t textarget, uint32_t texture,
105                                       int level);
106     virtual void framebufferTextureLayer(uint32_t target, uint32_t attachment, uint32_t texture, int level, int layer);
107     virtual void framebufferRenderbuffer(uint32_t target, uint32_t attachment, uint32_t renderbuffertarget,
108                                          uint32_t renderbuffer);
109     virtual uint32_t checkFramebufferStatus(uint32_t target);
110 
111     virtual void getFramebufferAttachmentParameteriv(uint32_t target, uint32_t attachment, uint32_t pname, int *params);
112 
113     virtual void renderbufferStorage(uint32_t target, uint32_t internalformat, int width, int height);
114     virtual void renderbufferStorageMultisample(uint32_t target, int samples, uint32_t internalFormat, int width,
115                                                 int height);
116 
117     virtual void bindBuffer(uint32_t target, uint32_t buffer);
118     virtual void genBuffers(int numBuffers, uint32_t *buffers);
119     virtual void deleteBuffers(int numBuffers, const uint32_t *buffers);
120 
121     virtual void bufferData(uint32_t target, intptr_t size, const void *data, uint32_t usage);
122     virtual void bufferSubData(uint32_t target, intptr_t offset, intptr_t size, const void *data);
123 
124     virtual void clearColor(float red, float green, float blue, float alpha);
125     virtual void clearDepthf(float depth);
126     virtual void clearStencil(int stencil);
127 
128     virtual void clear(uint32_t buffers);
129     virtual void clearBufferiv(uint32_t buffer, int drawbuffer, const int *value);
130     virtual void clearBufferfv(uint32_t buffer, int drawbuffer, const float *value);
131     virtual void clearBufferuiv(uint32_t buffer, int drawbuffer, const uint32_t *value);
132     virtual void clearBufferfi(uint32_t buffer, int drawbuffer, float depth, int stencil);
133     virtual void scissor(int x, int y, int width, int height);
134 
135     virtual void enable(uint32_t cap);
136     virtual void disable(uint32_t cap);
137 
138     virtual void stencilFunc(uint32_t func, int ref, uint32_t mask);
139     virtual void stencilOp(uint32_t sfail, uint32_t dpfail, uint32_t dppass);
140     virtual void stencilFuncSeparate(uint32_t face, uint32_t func, int ref, uint32_t mask);
141     virtual void stencilOpSeparate(uint32_t face, uint32_t sfail, uint32_t dpfail, uint32_t dppass);
142 
143     virtual void depthFunc(uint32_t func);
144     virtual void depthRangef(float n, float f);
145     virtual void depthRange(double n, double f);
146 
147     virtual void polygonOffset(float factor, float units);
148     virtual void provokingVertex(uint32_t convention);
149     virtual void primitiveRestartIndex(uint32_t index);
150 
151     virtual void blendEquation(uint32_t mode);
152     virtual void blendEquationSeparate(uint32_t modeRGB, uint32_t modeAlpha);
153     virtual void blendFunc(uint32_t src, uint32_t dst);
154     virtual void blendFuncSeparate(uint32_t srcRGB, uint32_t dstRGB, uint32_t srcAlpha, uint32_t dstAlpha);
155     virtual void blendColor(float red, float green, float blue, float alpha);
156 
157     virtual void colorMask(bool r, bool g, bool b, bool a);
158     virtual void depthMask(bool mask);
159     virtual void stencilMask(uint32_t mask);
160     virtual void stencilMaskSeparate(uint32_t face, uint32_t mask);
161 
162     virtual void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1,
163                                  uint32_t mask, uint32_t filter);
164 
165     virtual void invalidateSubFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments, int x,
166                                           int y, int width, int height);
167     virtual void invalidateFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments);
168 
169     virtual void bindVertexArray(uint32_t array);
170     virtual void genVertexArrays(int numArrays, uint32_t *vertexArrays);
171     virtual void deleteVertexArrays(int numArrays, const uint32_t *vertexArrays);
172 
173     virtual void vertexAttribPointer(uint32_t index, int size, uint32_t type, bool normalized, int stride,
174                                      const void *pointer);
175     virtual void vertexAttribIPointer(uint32_t index, int size, uint32_t type, int stride, const void *pointer);
176     virtual void enableVertexAttribArray(uint32_t index);
177     virtual void disableVertexAttribArray(uint32_t index);
178     virtual void vertexAttribDivisor(uint32_t index, uint32_t divisor);
179 
180     virtual void vertexAttrib1f(uint32_t index, float);
181     virtual void vertexAttrib2f(uint32_t index, float, float);
182     virtual void vertexAttrib3f(uint32_t index, float, float, float);
183     virtual void vertexAttrib4f(uint32_t index, float, float, float, float);
184     virtual void vertexAttribI4i(uint32_t index, int32_t, int32_t, int32_t, int32_t);
185     virtual void vertexAttribI4ui(uint32_t index, uint32_t, uint32_t, uint32_t, uint32_t);
186 
187     virtual int32_t getAttribLocation(uint32_t program, const char *name);
188 
189     virtual void uniform1f(int32_t location, float);
190     virtual void uniform1i(int32_t location, int32_t);
191     virtual void uniform1fv(int32_t index, int32_t count, const float *);
192     virtual void uniform2fv(int32_t index, int32_t count, const float *);
193     virtual void uniform3fv(int32_t index, int32_t count, const float *);
194     virtual void uniform4fv(int32_t index, int32_t count, const float *);
195     virtual void uniform1iv(int32_t index, int32_t count, const int32_t *);
196     virtual void uniform2iv(int32_t index, int32_t count, const int32_t *);
197     virtual void uniform3iv(int32_t index, int32_t count, const int32_t *);
198     virtual void uniform4iv(int32_t index, int32_t count, const int32_t *);
199     virtual void uniformMatrix3fv(int32_t location, int32_t count, bool transpose, const float *value);
200     virtual void uniformMatrix4fv(int32_t location, int32_t count, bool transpose, const float *value);
201     virtual int32_t getUniformLocation(uint32_t program, const char *name);
202 
203     virtual void lineWidth(float);
204 
205     virtual void drawArrays(uint32_t mode, int first, int count);
206     virtual void drawArraysInstanced(uint32_t mode, int first, int count, int instanceCount);
207     virtual void drawElements(uint32_t mode, int count, uint32_t type, const void *indices);
208     virtual void drawElementsInstanced(uint32_t mode, int count, uint32_t type, const void *indices, int instanceCount);
209     virtual void drawElementsBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, int baseVertex);
210     virtual void drawElementsInstancedBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices,
211                                                  int instanceCount, int baseVertex);
212     virtual void drawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type,
213                                    const void *indices);
214     virtual void drawRangeElementsBaseVertex(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type,
215                                              const void *indices, int baseVertex);
216     virtual void drawArraysIndirect(uint32_t mode, const void *indirect);
217     virtual void drawElementsIndirect(uint32_t mode, uint32_t type, const void *indirect);
218 
219     virtual void multiDrawArrays(uint32_t mode, const int *first, const int *count, int primCount);
220     virtual void multiDrawElements(uint32_t mode, const int *count, uint32_t type, const void **indices, int primCount);
221     virtual void multiDrawElementsBaseVertex(uint32_t mode, const int *count, uint32_t type, const void **indices,
222                                              int primCount, const int *baseVertex);
223 
224     virtual uint32_t createProgram(ShaderProgram *);
225     virtual void deleteProgram(uint32_t program);
226     virtual void useProgram(uint32_t program);
227 
228     virtual void readPixels(int x, int y, int width, int height, uint32_t format, uint32_t type, void *data);
229     virtual uint32_t getError(void);
230     virtual void finish(void);
231 
232     virtual void getIntegerv(uint32_t pname, int *params);
233     virtual const char *getString(uint32_t pname);
234 
235     // Expose helpers from Context.
236     using Context::readPixels;
237     using Context::texImage2D;
238     using Context::texSubImage2D;
239 
240 private:
241     GLContext(const GLContext &other);
242     GLContext &operator=(const GLContext &other);
243 
244     tcu::IVec2 getReadOffset(void) const;
245     tcu::IVec2 getDrawOffset(void) const;
246 
247     const glu::RenderContext &m_context;
248     tcu::TestLog &m_log;
249 
250     uint32_t m_logFlags;
251     tcu::IVec4 m_baseViewport;
252     tcu::IVec4 m_curViewport;
253     tcu::IVec4 m_curScissor;
254     uint32_t m_readFramebufferBinding;
255     uint32_t m_drawFramebufferBinding;
256 
257     glu::CallLogWrapper *m_wrapper;
258 
259     // For cleanup
260     std::set<uint32_t> m_allocatedTextures;
261     std::set<uint32_t> m_allocatedFbos;
262     std::set<uint32_t> m_allocatedRbos;
263     std::set<uint32_t> m_allocatedBuffers;
264     std::set<uint32_t> m_allocatedVaos;
265     std::vector<glu::ShaderProgram *> m_programs;
266 } DE_WARN_UNUSED_TYPE;
267 
268 } // namespace sglr
269 
270 #endif // _SGLRGLCONTEXT_HPP
271