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