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
36namespace glu
37{
38class CallLogWrapper;
39}
40
41namespace sglr
42{
43
44enum GLContextLogFlag
45{
46	GLCONTEXT_LOG_CALLS		= (1 << 0),
47	GLCONTEXT_LOG_PROGRAMS	= (1 << 1)
48};
49
50class GLContext : public Context
51{
52public:
53										GLContext				(const glu::RenderContext& context, tcu::TestLog& log, deUint32 logFlags, const tcu::IVec4& baseViewport);
54	virtual								~GLContext				(void);
55
56	void								enableLogging			(deUint32 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			(deUint32 texture);
63
64	virtual void						bindTexture				(deUint32 target, deUint32 texture);
65	virtual void						genTextures				(int numTextures, deUint32* textures);
66	virtual void						deleteTextures			(int numTextures, const deUint32* textures);
67
68	virtual void						bindFramebuffer			(deUint32 target, deUint32 framebuffer);
69	virtual void						genFramebuffers			(int numFramebuffers, deUint32* framebuffers);
70	virtual void						deleteFramebuffers		(int numFramebuffers, const deUint32* framebuffers);
71
72	virtual void						bindRenderbuffer		(deUint32 target, deUint32 renderbuffer);
73	virtual void						genRenderbuffers		(int numRenderbuffers, deUint32* renderbuffers);
74	virtual void						deleteRenderbuffers		(int numRenderbuffers, const deUint32* renderbuffers);
75
76	virtual void						pixelStorei				(deUint32 pname, int param);
77	virtual void						texImage1D				(deUint32 target, int level, deUint32 internalFormat, int width, int border, deUint32 format, deUint32 type, const void* data);
78	virtual void						texImage2D				(deUint32 target, int level, deUint32 internalFormat, int width, int height, int border, deUint32 format, deUint32 type, const void* data);
79	virtual void						texImage3D				(deUint32 target, int level, deUint32 internalFormat, int width, int height, int depth, int border, deUint32 format, deUint32 type, const void* data);
80	virtual void						texSubImage1D			(deUint32 target, int level, int xoffset, int width, deUint32 format, deUint32 type, const void* data);
81	virtual void						texSubImage2D			(deUint32 target, int level, int xoffset, int yoffset, int width, int height, deUint32 format, deUint32 type, const void* data);
82	virtual void						texSubImage3D			(deUint32 target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, deUint32 format, deUint32 type, const void* data);
83	virtual void						copyTexImage1D			(deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int border);
84	virtual void						copyTexImage2D			(deUint32 target, int level, deUint32 internalFormat, int x, int y, int width, int height, int border);
85	virtual void						copyTexSubImage1D		(deUint32 target, int level, int xoffset, int x, int y, int width);
86	virtual void						copyTexSubImage2D		(deUint32 target, int level, int xoffset, int yoffset, int x, int y, int width, int height);
87	virtual void						copyTexSubImage3D		(deUint32 target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height);
88
89	virtual void						texStorage2D			(deUint32 target, int levels, deUint32 internalFormat, int width, int height);
90	virtual void						texStorage3D			(deUint32 target, int levels, deUint32 internalFormat, int width, int height, int depth);
91
92	virtual void						texParameteri			(deUint32 target, deUint32 pname, int value);
93
94	virtual void						framebufferTexture2D	(deUint32 target, deUint32 attachment, deUint32 textarget, deUint32 texture, int level);
95	virtual void						framebufferTextureLayer	(deUint32 target, deUint32 attachment, deUint32 texture, int level, int layer);
96	virtual void						framebufferRenderbuffer	(deUint32 target, deUint32 attachment, deUint32 renderbuffertarget, deUint32 renderbuffer);
97	virtual deUint32					checkFramebufferStatus	(deUint32 target);
98
99	virtual void						getFramebufferAttachmentParameteriv	(deUint32 target, deUint32 attachment, deUint32 pname, int* params);
100
101	virtual void						renderbufferStorage				(deUint32 target, deUint32 internalformat, int width, int height);
102	virtual void						renderbufferStorageMultisample	(deUint32 target, int samples, deUint32 internalFormat, int width, int height);
103
104	virtual void						bindBuffer				(deUint32 target, deUint32 buffer);
105	virtual void						genBuffers				(int numBuffers, deUint32* buffers);
106	virtual void						deleteBuffers			(int numBuffers, const deUint32* buffers);
107
108	virtual void						bufferData				(deUint32 target, deIntptr size, const void* data, deUint32 usage);
109	virtual void						bufferSubData			(deUint32 target, deIntptr offset, deIntptr size, const void* data);
110
111	virtual void						clearColor				(float red, float green, float blue, float alpha);
112	virtual void						clearDepthf				(float depth);
113	virtual void						clearStencil			(int stencil);
114
115	virtual void						clear					(deUint32 buffers);
116	virtual void						clearBufferiv			(deUint32 buffer, int drawbuffer, const int* value);
117	virtual void						clearBufferfv			(deUint32 buffer, int drawbuffer, const float* value);
118	virtual void						clearBufferuiv			(deUint32 buffer, int drawbuffer, const deUint32* value);
119	virtual void						clearBufferfi			(deUint32 buffer, int drawbuffer, float depth, int stencil);
120	virtual void						scissor					(int x, int y, int width, int height);
121
122	virtual void						enable					(deUint32 cap);
123	virtual void						disable					(deUint32 cap);
124
125	virtual void						stencilFunc				(deUint32 func, int ref, deUint32 mask);
126	virtual void						stencilOp				(deUint32 sfail, deUint32 dpfail, deUint32 dppass);
127	virtual void						stencilFuncSeparate		(deUint32 face, deUint32 func, int ref, deUint32 mask);
128	virtual void						stencilOpSeparate		(deUint32 face, deUint32 sfail, deUint32 dpfail, deUint32 dppass);
129
130	virtual void						depthFunc				(deUint32 func);
131	virtual void						depthRangef				(float n, float f);
132	virtual void						depthRange				(double n, double f);
133
134	virtual void						polygonOffset			(float factor, float units);
135	virtual void						provokingVertex			(deUint32 convention);
136	virtual void						primitiveRestartIndex	(deUint32 index);
137
138	virtual void						blendEquation			(deUint32 mode);
139	virtual void						blendEquationSeparate	(deUint32 modeRGB, deUint32 modeAlpha);
140	virtual void						blendFunc				(deUint32 src, deUint32 dst);
141	virtual void						blendFuncSeparate		(deUint32 srcRGB, deUint32 dstRGB, deUint32 srcAlpha, deUint32 dstAlpha);
142	virtual void						blendColor				(float red, float green, float blue, float alpha);
143
144	virtual void						colorMask				(deBool r, deBool g, deBool b, deBool a);
145	virtual void						depthMask				(deBool mask);
146	virtual void						stencilMask				(deUint32 mask);
147	virtual void						stencilMaskSeparate		(deUint32 face, deUint32 mask);
148
149	virtual void						blitFramebuffer			(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, deUint32 mask, deUint32 filter);
150
151	virtual void						invalidateSubFramebuffer(deUint32 target, int numAttachments, const deUint32* attachments, int x, int y, int width, int height);
152	virtual void						invalidateFramebuffer	(deUint32 target, int numAttachments, const deUint32* attachments);
153
154	virtual void						bindVertexArray			(deUint32 array);
155	virtual void						genVertexArrays			(int numArrays, deUint32* vertexArrays);
156	virtual void						deleteVertexArrays		(int numArrays, const deUint32* vertexArrays);
157
158	virtual void						vertexAttribPointer		(deUint32 index, int size, deUint32 type, deBool normalized, int stride, const void *pointer);
159	virtual void						vertexAttribIPointer	(deUint32 index, int size, deUint32 type, int stride, const void *pointer);
160	virtual void						enableVertexAttribArray	(deUint32 index);
161	virtual void						disableVertexAttribArray(deUint32 index);
162	virtual void						vertexAttribDivisor		(deUint32 index, deUint32 divisor);
163
164	virtual void						vertexAttrib1f			(deUint32 index, float);
165	virtual void						vertexAttrib2f			(deUint32 index, float, float);
166	virtual void						vertexAttrib3f			(deUint32 index, float, float, float);
167	virtual void						vertexAttrib4f			(deUint32 index, float, float, float, float);
168	virtual void						vertexAttribI4i			(deUint32 index, deInt32, deInt32, deInt32, deInt32);
169	virtual void						vertexAttribI4ui		(deUint32 index, deUint32, deUint32, deUint32, deUint32);
170
171	virtual deInt32						getAttribLocation		(deUint32 program, const char *name);
172
173	virtual void						uniform1f				(deInt32 location, float);
174	virtual void						uniform1i				(deInt32 location, deInt32);
175	virtual void						uniform1fv				(deInt32 index, deInt32 count, const float*);
176	virtual void						uniform2fv				(deInt32 index, deInt32 count, const float*);
177	virtual void						uniform3fv				(deInt32 index, deInt32 count, const float*);
178	virtual void						uniform4fv				(deInt32 index, deInt32 count, const float*);
179	virtual void						uniform1iv				(deInt32 index, deInt32 count, const deInt32*);
180	virtual void						uniform2iv				(deInt32 index, deInt32 count, const deInt32*);
181	virtual void						uniform3iv				(deInt32 index, deInt32 count, const deInt32*);
182	virtual void						uniform4iv				(deInt32 index, deInt32 count, const deInt32*);
183	virtual void						uniformMatrix3fv		(deInt32 location, deInt32 count, deInt32 transpose, const float *value);
184	virtual void						uniformMatrix4fv		(deInt32 location, deInt32 count, deInt32 transpose, const float *value);
185	virtual deInt32						getUniformLocation		(deUint32 program, const char *name);
186
187	virtual void						lineWidth				(float);
188
189	virtual void						drawArrays				(deUint32 mode, int first, int count);
190	virtual void						drawArraysInstanced		(deUint32 mode, int first, int count, int instanceCount);
191	virtual void						drawElements			(deUint32 mode, int count, deUint32 type, const void *indices);
192	virtual void						drawElementsInstanced	(deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount);
193	virtual void						drawElementsBaseVertex	(deUint32 mode, int count, deUint32 type, const void *indices, int baseVertex);
194	virtual void						drawElementsInstancedBaseVertex	(deUint32 mode, int count, deUint32 type, const void *indices, int instanceCount, int baseVertex);
195	virtual void						drawRangeElements		(deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices);
196	virtual void						drawRangeElementsBaseVertex	(deUint32 mode, deUint32 start, deUint32 end, int count, deUint32 type, const void *indices, int baseVertex);
197	virtual void						drawArraysIndirect		(deUint32 mode, const void *indirect);
198	virtual void						drawElementsIndirect	(deUint32 mode, deUint32 type, const void *indirect);
199
200	virtual void						multiDrawArrays			(deUint32 mode, const int* first, const int* count, int primCount);
201	virtual void						multiDrawElements		(deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount);
202	virtual void						multiDrawElementsBaseVertex (deUint32 mode, const int* count, deUint32 type, const void** indices, int primCount, const int* baseVertex);
203
204	virtual deUint32					createProgram			(ShaderProgram*);
205	virtual void						deleteProgram			(deUint32 program);
206	virtual void						useProgram				(deUint32 program);
207
208	virtual void						readPixels				(int x, int y, int width, int height, deUint32 format, deUint32 type, void* data);
209	virtual deUint32					getError				(void);
210	virtual void						finish					(void);
211
212	virtual void						getIntegerv				(deUint32 pname, int* params);
213	virtual const char*					getString				(deUint32 pname);
214
215	// Expose helpers from Context.
216	using Context::readPixels;
217	using Context::texImage2D;
218	using Context::texSubImage2D;
219
220private:
221										GLContext				(const GLContext& other);
222	GLContext&							operator=				(const GLContext& other);
223
224	tcu::IVec2							getReadOffset			(void) const;
225	tcu::IVec2							getDrawOffset			(void) const;
226
227	const glu::RenderContext&			m_context;
228	tcu::TestLog&						m_log;
229
230	deUint32							m_logFlags;
231	tcu::IVec4							m_baseViewport;
232	tcu::IVec4							m_curViewport;
233	tcu::IVec4							m_curScissor;
234	deUint32							m_readFramebufferBinding;
235	deUint32							m_drawFramebufferBinding;
236
237	glu::CallLogWrapper*				m_wrapper;
238
239	// For cleanup
240	std::set<deUint32>					m_allocatedTextures;
241	std::set<deUint32>					m_allocatedFbos;
242	std::set<deUint32>					m_allocatedRbos;
243	std::set<deUint32>					m_allocatedBuffers;
244	std::set<deUint32>					m_allocatedVaos;
245	std::vector<glu::ShaderProgram*>	m_programs;
246} DE_WARN_UNUSED_TYPE;
247
248} // sglr
249
250#endif // _SGLRGLCONTEXT_HPP
251