1 /*
2  Copyright (c) 2013 yvt
3 
4  This file is part of OpenSpades.
5 
6  OpenSpades is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  OpenSpades is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OpenSpades.  If not, see <http://www.gnu.org/licenses/>.
18 
19  */
20 
21 #pragma once
22 
23 #include <cstdlib> // for integer types
24 
25 #include <Core/Math.h>
26 #include <Core/RefCountedObject.h>
27 
28 #undef Always
29 #undef None
30 
31 namespace spades {
32 	namespace draw {
33 		class IGLDevice : public RefCountedObject {
34 		protected:
~IGLDevice()35 			virtual ~IGLDevice() {}
36 
37 		public:
38 			enum Enum {
39 
40 				// datatype
41 				Int,
42 				UnsignedInt,
43 				Short,
44 				UnsignedShort,
45 				Byte,
46 				UnsignedByte,
47 				FloatType,
48 				UnsignedShort5551,
49 				UnsignedShort1555Rev,
50 				UnsignedInt2101010Rev,
51 
52 				// Front face
53 				CW,
54 				CCW,
55 
56 				// State
57 				DepthTest,
58 				CullFace,
59 				Blend,
60 				Multisample,
61 				FramebufferSRGB,
62 
63 				// Parameters
64 				FramebufferBinding,
65 
66 				// String query
67 				Vendor,
68 				Renderer,
69 				Version,
70 				ShadingLanguageVersion,
71 				Extensions,
72 
73 				// Blend equation
74 				Add,
75 				Subtract,
76 				ReverseSubtract,
77 				MinOp,
78 				MaxOp,
79 
80 				// Blend function
81 				Zero,
82 				One,
83 				SrcColor,
84 				DestColor,
85 				OneMinusSrcColor,
86 				OneMinusDestColor,
87 				SrcAlpha,
88 				DestAlpha,
89 				OneMinusSrcAlpha,
90 				OneMinusDestAlpha,
91 				ConstantColor,
92 				ConstantAlpha,
93 				OneMinusConstantColor,
94 				OneMinusConstantAlpha,
95 
96 				// Depth function
97 				Never,
98 				Always,
99 				Less,
100 				LessOrEqual,
101 				Equal,
102 				Greater,
103 				GreaterOrEqual,
104 				NotEqual,
105 
106 				// cull
107 				Front,
108 				Back,
109 				FrontAndBack,
110 
111 				// Query Object
112 				SamplesPassed,
113 				AnySamplesPassed,
114 
115 				QueryResult,
116 				QueryResultAvailable,
117 
118 				// Conditional Render
119 				QueryWait,
120 				QueryNoWait,
121 				QueryByRegionWait,
122 				QueryByRegionNoWait,
123 
124 				// Buffer target
125 				ArrayBuffer,
126 				ElementArrayBuffer,
127 				PixelPackBuffer,
128 				PixelUnpackBuffer,
129 
130 				// Buffer usage
131 				StaticDraw,
132 				StreamDraw,
133 				DynamicDraw,
134 
135 				// Buffer Map access
136 				ReadOnly,
137 				WriteOnly,
138 				ReadWrite,
139 
140 				// Texture targets
141 				Texture2D,
142 				Texture3D,
143 				Texture2DArray,
144 
145 				// Texture parameter
146 				TextureMinFilter,
147 				TextureMagFilter,
148 				TextureWrapS,
149 				TextureWrapT,
150 				TextureWrapR,
151 				TextureCompareMode,
152 				TextureCompareFunc,
153 				TextureMaxAnisotropy,
154 
155 				// texture compare mode
156 				CompareRefToTexture,
157 				None,
158 
159 				// Texture filter
160 				Nearest,
161 				Linear,
162 				NearestMipmapNearest,
163 				NearestMipmapLinear,
164 				LinearMipmapNearest,
165 				LinearMipmapLinear,
166 
167 				// Texture internal format
168 				Red,
169 				RG,
170 				RGB,
171 				RGBA,
172 				BGRA,
173 				DepthComponent,
174 				DepthComponent24,
175 				StencilIndex,
176 				RGB10A2,
177 				RGB16F,
178 				RGBA16F,
179 				R16F,
180 				RGB5,
181 				RGB5A1,
182 				RGB8,
183 				RGBA8,
184 				SRGB8,
185 				SRGB8Alpha,
186 
187 				// Texture wrap
188 				ClampToEdge,
189 				Repeat,
190 
191 				// draw mode
192 				Points,
193 				LineStrip,
194 				LineLoop,
195 				Lines,
196 				TriangleStrip,
197 				TriangleFan,
198 				Triangles,
199 
200 				// shader type
201 				VertexShader,
202 				GeometryShader,
203 				FragmentShader,
204 
205 				// shader query
206 				ShaderType,
207 				DeleteStatus,
208 				CompileStatus,
209 				InfoLogLength,
210 				ShaderSourceLength,
211 
212 				// program query
213 				/* DeleteStatus, */
214 				LinkStatus,
215 				ValidateStatus,
216 				/* InfoLogLength, */
217 				AttachedShaders,
218 
219 				// renderbuffer target
220 				Renderbuffer,
221 
222 				// framebuffer target
223 				Framebuffer,
224 				ReadFramebuffer,
225 				DrawFramebuffer,
226 
227 				// framebuffer attachment
228 				ColorAttachment0,
229 				ColorAttachment1,
230 				ColorAttachment2,
231 				ColorAttachment3,
232 				ColorAttachment4,
233 				ColorAttachment5,
234 				ColorAttachment6,
235 				ColorAttachment7,
236 				DepthAttachment,
237 				StencilAttachment,
238 
239 				// framebuffer status
240 				FramebufferComplete,
241 				FramebufferUndefined,
242 				FramebufferIncompleteAttachment,
243 				FramebufferIncompleteMissingAttachment,
244 				FramebufferIncompleteDrawBuffer,
245 				FramebufferIncompleteReadBuffer,
246 				FramebufferUnsupported,
247 				FramebufferIncompleteMultisample,
248 				FramebufferIncompleteLayerTargets,
249 
250 				// EXT_timer_query
251 				TimeElapsed,
252 
253 				ColorBufferBit = 1,
254 				DepthBufferBit = 2,
255 				StencilBufferBit = 4
256 
257 			};
258 			typedef unsigned int UInteger;
259 			typedef int Integer;
260 			typedef float Float;
261 			typedef unsigned int Sizei;
262 			typedef std::uint64_t UInteger64;
263 
264 			virtual void DepthRange(Float near, Float far) = 0;
265 			virtual void Viewport(Integer x, Integer y, Sizei width, Sizei height) = 0;
266 
267 			virtual void ClearDepth(Float) = 0;
268 			virtual void ClearColor(Float, Float, Float, Float) = 0;
269 			virtual void Clear(Enum) = 0;
270 
271 			virtual void DepthMask(bool) = 0;
272 			virtual void ColorMask(bool r, bool g, bool b, bool a) = 0;
273 
274 			virtual void Finish() = 0;
275 			virtual void Flush() = 0;
276 
277 			virtual void FrontFace(Enum) = 0;
278 			virtual void Enable(Enum state, bool) = 0;
279 
280 			virtual const char *GetString(Enum type) = 0;
281 			virtual const char *GetIndexedString(Enum type, UInteger) = 0;
282 
283 			virtual Integer GetInteger(Enum type) = 0;
284 
285 			virtual void BlendEquation(Enum mode) = 0;
286 			virtual void BlendEquation(Enum rgb, Enum alpha) = 0;
287 			virtual void BlendFunc(Enum src, Enum dest) = 0;
288 			virtual void BlendFunc(Enum srcRgb, Enum destRgb, Enum srcAlpha, Enum destAlpha) = 0;
289 			virtual void BlendColor(Float r, Float g, Float b, Float a) = 0;
290 			virtual void DepthFunc(Enum) = 0;
291 			virtual void LineWidth(Float) = 0;
292 
293 			virtual UInteger GenBuffer() = 0;
294 			virtual void DeleteBuffer(UInteger) = 0;
295 			virtual void BindBuffer(Enum, UInteger) = 0;
296 
297 			virtual void BufferData(Enum target, Sizei size, const void *data, Enum usage) = 0;
298 			virtual void BufferSubData(Enum target, Sizei offset, Sizei size, const void *data) = 0;
299 
300 			virtual UInteger GenQuery() = 0;
301 			virtual void DeleteQuery(UInteger) = 0;
302 			virtual void BeginQuery(Enum target, UInteger query) = 0;
303 			virtual void EndQuery(Enum target) = 0;
304 			virtual UInteger GetQueryObjectUInteger(UInteger query, Enum pname) = 0;
305 			virtual UInteger64 GetQueryObjectUInteger64(UInteger query, Enum pname) = 0;
306 			virtual void BeginConditionalRender(UInteger query, Enum mode) = 0;
307 			virtual void EndConditionalRender() = 0;
308 
309 			virtual void *MapBuffer(Enum target, Enum access) = 0;
310 			virtual void UnmapBuffer(Enum target) = 0;
311 
312 			virtual UInteger GenTexture() = 0;
313 			virtual void DeleteTexture(UInteger) = 0;
314 
315 			virtual void ActiveTexture(UInteger stage) = 0;
316 			virtual void BindTexture(Enum, UInteger) = 0;
317 			virtual void TexParamater(Enum target, Enum paramater, Enum value) = 0;
318 			virtual void TexParamater(Enum target, Enum paramater, float value) = 0;
319 			virtual void TexImage2D(Enum target, Integer level, Enum internalFormat, Sizei width,
320 			                        Sizei height, Integer border, Enum format, Enum type,
321 			                        const void *data) = 0;
322 			virtual void TexImage3D(Enum target, Integer level, Enum internalFormat, Sizei width,
323 			                        Sizei height, Sizei depth, Integer border, Enum format,
324 			                        Enum type, const void *data) = 0;
325 			virtual void TexSubImage2D(Enum target, Integer level, Integer x, Integer y,
326 			                           Sizei width, Sizei height, Enum format, Enum type,
327 			                           const void *data) = 0;
328 			virtual void TexSubImage3D(Enum target, Integer level, Integer x, Integer y, Integer z,
329 			                           Sizei width, Sizei height, Sizei depth, Enum format,
330 			                           Enum type, const void *data) = 0;
331 			virtual void CopyTexSubImage2D(Enum target, Integer level, Integer destinationX,
332 			                               Integer destinationY, Integer srcX, Integer srcY,
333 			                               Sizei width, Sizei height) = 0;
334 			virtual void GenerateMipmap(Enum target) = 0;
335 
336 			virtual void VertexAttrib(UInteger index, Float) = 0;
337 			virtual void VertexAttrib(UInteger index, Float, Float) = 0;
338 			virtual void VertexAttrib(UInteger index, Float, Float, Float) = 0;
339 			virtual void VertexAttrib(UInteger index, Float, Float, Float, Float) = 0;
340 
341 			virtual void VertexAttribPointer(UInteger index, Integer size, Enum type,
342 			                                 bool normalized, Sizei stride, const void *) = 0;
343 			virtual void VertexAttribIPointer(UInteger index, Integer size, Enum type, Sizei stride,
344 			                                  const void *) = 0;
345 			virtual void EnableVertexAttribArray(UInteger index, bool) = 0;
346 			virtual void VertexAttribDivisor(UInteger index, UInteger divisor) = 0;
347 
348 			virtual void DrawArrays(Enum mode, Integer first, Sizei count) = 0;
349 			virtual void DrawElements(Enum mode, Sizei count, Enum type, const void *indices) = 0;
350 			virtual void DrawArraysInstanced(Enum mode, Integer first, Sizei count,
351 			                                 Sizei instances) = 0;
352 			virtual void DrawElementsInstanced(Enum mode, Sizei count, Enum type,
353 			                                   const void *indices, Sizei instances) = 0;
354 
355 			virtual UInteger CreateShader(Enum type) = 0;
356 			virtual void ShaderSource(UInteger shader, Sizei count, const char **string,
357 			                          const int *len) = 0;
358 			virtual void CompileShader(UInteger) = 0;
359 			virtual void DeleteShader(UInteger) = 0;
360 			virtual Integer GetShaderInteger(UInteger shader, Enum param) = 0;
361 			virtual void GetShaderInfoLog(UInteger shader, Sizei bufferSize, Sizei *length,
362 			                              char *outString) = 0;
363 			virtual Integer GetProgramInteger(UInteger program, Enum param) = 0;
364 			virtual void GetProgramInfoLog(UInteger program, Sizei bufferSize, Sizei *length,
365 			                               char *outString) = 0;
366 
367 			virtual UInteger CreateProgram() = 0;
368 			virtual void AttachShader(UInteger program, UInteger shader) = 0;
369 			virtual void DetachShader(UInteger program, UInteger shader) = 0;
370 			virtual void LinkProgram(UInteger program) = 0;
371 			virtual void UseProgram(UInteger program) = 0;
372 			virtual void DeleteProgram(UInteger program) = 0;
373 			virtual void ValidateProgram(UInteger program) = 0;
374 			virtual Integer GetAttribLocation(UInteger program, const char *name) = 0;
375 			virtual void BindAttribLocation(UInteger program, UInteger index, const char *name) = 0;
376 			virtual Integer GetUniformLocation(UInteger program, const char *name) = 0;
377 			virtual void Uniform(Integer loc, Float) = 0;
378 			virtual void Uniform(Integer loc, Float, Float) = 0;
379 			virtual void Uniform(Integer loc, Float, Float, Float) = 0;
380 			virtual void Uniform(Integer loc, Float, Float, Float, Float) = 0;
381 			virtual void Uniform(Integer loc, Integer) = 0;
382 			virtual void Uniform(Integer loc, Integer, Integer) = 0;
383 			virtual void Uniform(Integer loc, Integer, Integer, Integer) = 0;
384 			virtual void Uniform(Integer loc, Integer, Integer, Integer, Integer) = 0;
385 			virtual void Uniform(Integer loc, bool transpose, const Matrix4 &) = 0;
386 
387 			virtual UInteger GenRenderbuffer() = 0;
388 			virtual void DeleteRenderbuffer(UInteger) = 0;
389 			virtual void BindRenderbuffer(Enum target, UInteger) = 0;
390 			virtual void RenderbufferStorage(Enum target, Enum internalFormat, Sizei width,
391 			                                 Sizei height) = 0;
392 			virtual void RenderbufferStorage(Enum target, Sizei samples, Enum internalFormat,
393 			                                 Sizei width, Sizei height) = 0;
394 
395 			virtual UInteger GenFramebuffer() = 0;
396 			virtual void BindFramebuffer(Enum target, UInteger framebuffer) = 0;
397 			virtual void DeleteFramebuffer(UInteger) = 0;
398 			virtual void FramebufferTexture2D(Enum target, Enum attachment, Enum texTarget,
399 			                                  UInteger texture, Integer level) = 0;
400 			virtual void FramebufferRenderbuffer(Enum target, Enum attachment,
401 			                                     Enum renderbufferTarget,
402 			                                     UInteger renderbuffer) = 0;
403 			virtual void BlitFramebuffer(Integer srcX0, Integer srcY0, Integer srcX1, Integer srcY1,
404 			                             Integer dstX0, Integer dstY0, Integer dstX1, Integer dstY1,
405 			                             UInteger mask, Enum filter) = 0;
406 			virtual Enum CheckFramebufferStatus(Enum target) = 0;
407 
408 			virtual void ReadPixels(Integer x, Integer y, Sizei width, Sizei height, Enum format,
409 			                        Enum type, void *data) = 0;
410 
411 			virtual Integer ScreenWidth() = 0;
412 			virtual Integer ScreenHeight() = 0;
413 
414 			virtual void Swap() = 0;
415 		};
416 	}
417 }
418