Common.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <AnKi/Gr/Common.h>
  7. #if ANKI_GL == ANKI_GL_DESKTOP
  8. # if ANKI_OS == ANKI_OS_WINDOWS && !defined(GLEW_STATIC)
  9. # define GLEW_STATIC
  10. # endif
  11. # include <GL/glew.h>
  12. # if !defined(ANKI_GLEW_H)
  13. # error "Wrong GLEW included"
  14. # endif
  15. #elif ANKI_GL == ANKI_GL_ES
  16. # include <GLES3/gl3.h>
  17. #else
  18. # error "See file"
  19. #endif
  20. namespace anki {
  21. // Forward
  22. class GlState;
  23. class RenderingThread;
  24. /// @addtogroup opengl
  25. /// @{
  26. #define ANKI_GL_LOGI(...) ANKI_LOG("GL ", NORMAL, __VA_ARGS__)
  27. #define ANKI_GL_LOGE(...) ANKI_LOG("GL ", ERROR, __VA_ARGS__)
  28. #define ANKI_GL_LOGW(...) ANKI_LOG("GL ", WARNING, __VA_ARGS__)
  29. #define ANKI_GL_LOGF(...) ANKI_LOG("GL ", FATAL, __VA_ARGS__)
  30. #define ANKI_GL_SELF(class_) class_& self = *static_cast<class_*>(this)
  31. #define ANKI_GL_SELF_CONST(class_) const class_& self = *static_cast<const class_*>(this)
  32. enum class GlExtensions : U16
  33. {
  34. NONE = 0,
  35. ARB_SHADER_BALLOT = 1 << 0,
  36. };
  37. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(GlExtensions, inline)
  38. // Spec limits
  39. const U MAX_UNIFORM_BLOCK_SIZE = 16384;
  40. const U MAX_STORAGE_BLOCK_SIZE = 2 << 27;
  41. /// Converter.
  42. GLenum convertCompareOperation(CompareOperation in);
  43. GLenum convertStencilOperation(StencilOperation in);
  44. inline GLenum convertFaceMode(FaceSelectionBit in)
  45. {
  46. if(in == FaceSelectionBit::FRONT)
  47. {
  48. return GL_FRONT;
  49. }
  50. else if(in == FaceSelectionBit::BACK)
  51. {
  52. return GL_BACK;
  53. }
  54. else
  55. {
  56. return GL_FRONT_AND_BACK;
  57. }
  58. }
  59. void convertFilter(SamplingFilter minMagFilter, SamplingFilter mipFilter, GLenum& minFilter, GLenum& magFilter);
  60. void convertVertexFormat(Format fmt, U& compCount, GLenum& type, Bool& normalized);
  61. inline GLenum convertIndexType(IndexType ak)
  62. {
  63. GLenum out;
  64. switch(ak)
  65. {
  66. case IndexType::U16:
  67. out = GL_UNSIGNED_SHORT;
  68. break;
  69. case IndexType::U32:
  70. out = GL_UNSIGNED_INT;
  71. break;
  72. default:
  73. ANKI_ASSERT(0);
  74. out = 0;
  75. }
  76. return out;
  77. }
  78. inline GLenum convertFillMode(FillMode mode)
  79. {
  80. GLenum out;
  81. switch(mode)
  82. {
  83. case FillMode::POINTS:
  84. out = GL_POINT;
  85. break;
  86. case FillMode::WIREFRAME:
  87. out = GL_LINE;
  88. break;
  89. case FillMode::SOLID:
  90. out = GL_FILL;
  91. break;
  92. default:
  93. ANKI_ASSERT(0);
  94. out = 0;
  95. }
  96. return out;
  97. }
  98. GLenum convertBlendFactor(BlendFactor in);
  99. inline GLenum convertBlendOperation(BlendOperation ak)
  100. {
  101. GLenum out;
  102. switch(ak)
  103. {
  104. case BlendOperation::ADD:
  105. out = GL_FUNC_ADD;
  106. break;
  107. case BlendOperation::SUBTRACT:
  108. out = GL_FUNC_SUBTRACT;
  109. break;
  110. case BlendOperation::REVERSE_SUBTRACT:
  111. out = GL_FUNC_REVERSE_SUBTRACT;
  112. break;
  113. case BlendOperation::MIN:
  114. out = GL_MIN;
  115. break;
  116. case BlendOperation::MAX:
  117. out = GL_MAX;
  118. break;
  119. default:
  120. ANKI_ASSERT(0);
  121. out = 0;
  122. }
  123. return out;
  124. }
  125. inline GLenum convertPrimitiveTopology(PrimitiveTopology ak)
  126. {
  127. GLenum out;
  128. switch(ak)
  129. {
  130. case PrimitiveTopology::POINTS:
  131. out = GL_POINTS;
  132. break;
  133. case PrimitiveTopology::LINES:
  134. out = GL_LINES;
  135. break;
  136. case PrimitiveTopology::LINE_STRIP:
  137. out = GL_LINE_STRIP;
  138. break;
  139. case PrimitiveTopology::TRIANGLES:
  140. out = GL_TRIANGLES;
  141. break;
  142. case PrimitiveTopology::TRIANGLE_STRIP:
  143. out = GL_TRIANGLE_STRIP;
  144. break;
  145. case PrimitiveTopology::PATCHES:
  146. out = GL_PATCHES;
  147. break;
  148. default:
  149. ANKI_ASSERT(0);
  150. out = 0;
  151. }
  152. return out;
  153. }
  154. void convertTextureInformation(Format pf, Bool& compressed, GLenum& format, GLenum& internalFormat, GLenum& type,
  155. DepthStencilAspectBit& dsAspect);
  156. /// @}
  157. } // end namespace anki