Common.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. {
  22. // Forward
  23. class GlState;
  24. class RenderingThread;
  25. /// @addtogroup opengl
  26. /// @{
  27. #define ANKI_GL_LOGI(...) ANKI_LOG("GL ", NORMAL, __VA_ARGS__)
  28. #define ANKI_GL_LOGE(...) ANKI_LOG("GL ", ERROR, __VA_ARGS__)
  29. #define ANKI_GL_LOGW(...) ANKI_LOG("GL ", WARNING, __VA_ARGS__)
  30. #define ANKI_GL_LOGF(...) ANKI_LOG("GL ", FATAL, __VA_ARGS__)
  31. #define ANKI_GL_SELF(class_) class_& self = *static_cast<class_*>(this)
  32. #define ANKI_GL_SELF_CONST(class_) const class_& self = *static_cast<const class_*>(this)
  33. enum class GlExtensions : U16
  34. {
  35. NONE = 0,
  36. ARB_SHADER_BALLOT = 1 << 0,
  37. };
  38. ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(GlExtensions, inline)
  39. // Spec limits
  40. const U MAX_UNIFORM_BLOCK_SIZE = 16384;
  41. const U MAX_STORAGE_BLOCK_SIZE = 2 << 27;
  42. /// Converter.
  43. GLenum convertCompareOperation(CompareOperation in);
  44. GLenum convertStencilOperation(StencilOperation in);
  45. inline GLenum convertFaceMode(FaceSelectionBit in)
  46. {
  47. if(in == FaceSelectionBit::FRONT)
  48. {
  49. return GL_FRONT;
  50. }
  51. else if(in == FaceSelectionBit::BACK)
  52. {
  53. return GL_BACK;
  54. }
  55. else
  56. {
  57. return GL_FRONT_AND_BACK;
  58. }
  59. }
  60. void convertFilter(SamplingFilter minMagFilter, SamplingFilter mipFilter, GLenum& minFilter, GLenum& magFilter);
  61. void convertVertexFormat(Format fmt, U& compCount, GLenum& type, Bool& normalized);
  62. inline GLenum convertIndexType(IndexType ak)
  63. {
  64. GLenum out;
  65. switch(ak)
  66. {
  67. case IndexType::U16:
  68. out = GL_UNSIGNED_SHORT;
  69. break;
  70. case IndexType::U32:
  71. out = GL_UNSIGNED_INT;
  72. break;
  73. default:
  74. ANKI_ASSERT(0);
  75. out = 0;
  76. }
  77. return out;
  78. }
  79. inline GLenum convertFillMode(FillMode mode)
  80. {
  81. GLenum out;
  82. switch(mode)
  83. {
  84. case FillMode::POINTS:
  85. out = GL_POINT;
  86. break;
  87. case FillMode::WIREFRAME:
  88. out = GL_LINE;
  89. break;
  90. case FillMode::SOLID:
  91. out = GL_FILL;
  92. break;
  93. default:
  94. ANKI_ASSERT(0);
  95. out = 0;
  96. }
  97. return out;
  98. }
  99. GLenum convertBlendFactor(BlendFactor in);
  100. inline GLenum convertBlendOperation(BlendOperation ak)
  101. {
  102. GLenum out;
  103. switch(ak)
  104. {
  105. case BlendOperation::ADD:
  106. out = GL_FUNC_ADD;
  107. break;
  108. case BlendOperation::SUBTRACT:
  109. out = GL_FUNC_SUBTRACT;
  110. break;
  111. case BlendOperation::REVERSE_SUBTRACT:
  112. out = GL_FUNC_REVERSE_SUBTRACT;
  113. break;
  114. case BlendOperation::MIN:
  115. out = GL_MIN;
  116. break;
  117. case BlendOperation::MAX:
  118. out = GL_MAX;
  119. break;
  120. default:
  121. ANKI_ASSERT(0);
  122. out = 0;
  123. }
  124. return out;
  125. }
  126. inline GLenum convertPrimitiveTopology(PrimitiveTopology ak)
  127. {
  128. GLenum out;
  129. switch(ak)
  130. {
  131. case PrimitiveTopology::POINTS:
  132. out = GL_POINTS;
  133. break;
  134. case PrimitiveTopology::LINES:
  135. out = GL_LINES;
  136. break;
  137. case PrimitiveTopology::LINE_STRIP:
  138. out = GL_LINE_STRIP;
  139. break;
  140. case PrimitiveTopology::TRIANGLES:
  141. out = GL_TRIANGLES;
  142. break;
  143. case PrimitiveTopology::TRIANGLE_STRIP:
  144. out = GL_TRIANGLE_STRIP;
  145. break;
  146. case PrimitiveTopology::PATCHES:
  147. out = GL_PATCHES;
  148. break;
  149. default:
  150. ANKI_ASSERT(0);
  151. out = 0;
  152. }
  153. return out;
  154. }
  155. void convertTextureInformation(Format pf, Bool& compressed, GLenum& format, GLenum& internalFormat, GLenum& type,
  156. DepthStencilAspectBit& dsAspect);
  157. /// @}
  158. } // end namespace anki