renderer_gl.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. /*
  2. * Copyright 2011-2012 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef __RENDERER_GL_H__
  6. #define __RENDERER_GL_H__
  7. #define BGFX_USE_EGL 0
  8. #define BGFX_USE_WGL 0
  9. #if BGFX_CONFIG_RENDERER_OPENGL
  10. # if BX_PLATFORM_LINUX
  11. # define GL_PROTOTYPES
  12. # define GL_GLEXT_LEGACY
  13. # include <GL/gl.h>
  14. # include <GL/glx.h>
  15. # undef GL_PROTOTYPES
  16. # elif BX_PLATFORM_OSX
  17. # define GL_PROTOTYPES
  18. # define GL_GLEXT_LEGACY
  19. # define GL_VERSION_1_2
  20. # define GL_VERSION_1_3
  21. # define GL_VERSION_1_5
  22. # define GL_VERSION_2_0
  23. # include <OpenGL/gl.h>
  24. # undef GL_VERSION_2_0
  25. # undef GL_VERSION_1_5
  26. # undef GL_VERSION_1_3
  27. # undef GL_VERSION_1_2
  28. # undef GL_PROTOTYPES
  29. # else
  30. # include <GL/gl.h>
  31. # endif // BX_PLATFORM_
  32. # if BX_PLATFORM_WINDOWS
  33. # undef BGFX_USE_WGL
  34. # define BGFX_USE_WGL 1
  35. # endif // BX_PLATFORM_
  36. // remove deprecated from glext.h
  37. # define GL_VERSION_1_2_DEPRECATED
  38. # define GL_ARB_imaging_DEPRECATED
  39. # define GL_VERSION_1_3_DEPRECATED
  40. # define GL_VERSION_1_4_DEPRECATED
  41. # define GL_VERSION_1_5_DEPRECATED
  42. # define GL_VERSION_2_0_DEPRECATED
  43. # define GL_VERSION_2_1_DEPRECATED
  44. // ignore everything above 2.1
  45. # define GL_VERSION_3_0
  46. # define GL_VERSION_3_0_DEPRECATED
  47. # define GL_VERSION_3_1
  48. # define GL_VERSION_3_2
  49. # define GL_VERSION_3_3
  50. # define GL_VERSION_4_0
  51. # define GL_VERSION_4_1
  52. # define GL_VERSION_4_2
  53. # include <gl/glext.h>
  54. // http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt
  55. # ifndef GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  56. # define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
  57. # endif // GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  58. # ifndef GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  59. # define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
  60. # endif // GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  61. # ifndef GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  62. # define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
  63. # endif // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  64. # ifndef GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  65. # define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
  66. # endif // GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  67. # ifndef GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  68. # define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
  69. # endif // GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  70. #elif BGFX_CONFIG_RENDERER_OPENGLES2 || BGFX_CONFIG_RENDERER_OPENGLES3
  71. # if BGFX_CONFIG_RENDERER_OPENGLES2
  72. # include <GLES2/gl2platform.h>
  73. # include <GLES2/gl2.h>
  74. # include <GLES2/gl2ext.h>
  75. # elif BGFX_CONFIG_RENDERER_OPENGLES3
  76. # include <GLES3/gl3platform.h>
  77. # include <GLES3/gl3.h>
  78. # include <GLES3/gl3ext.h>
  79. # endif // BGFX_CONFIG_RENDERER_
  80. # if BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_WINDOWS
  81. # include <EGL/egl.h>
  82. # undef BGFX_USE_EGL
  83. # define BGFX_USE_EGL 1
  84. # endif // BX_PLATFORM_
  85. # if BX_PLATFORM_EMSCRIPTEN
  86. # include <emscripten/emscripten.h>
  87. # endif // BX_PLATFORM_EMSCRIPTEN
  88. # ifndef GL_BGRA_EXT
  89. # define GL_BGRA_EXT 0x80E1
  90. # endif // GL_BGRA_EXT
  91. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  92. # define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
  93. # endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  94. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  95. # define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
  96. # endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  97. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  98. # define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
  99. # endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  100. # ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  101. # define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
  102. # endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  103. # ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
  104. # define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
  105. # endif // GL_TEXTURE_MAX_ANISOTROPY_EXT
  106. # ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  107. # define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
  108. # endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  109. typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
  110. #endif // BGFX_CONFIG_RENDERER_OPENGL
  111. #if BX_PLATFORM_NACL
  112. # include <ppapi/gles2/gl2ext_ppapi.h>
  113. # include <ppapi/c/pp_completion_callback.h>
  114. # include <ppapi/c/ppb_instance.h>
  115. # include <ppapi/c/ppb_graphics_3d.h>
  116. #elif BX_PLATFORM_WINDOWS
  117. # include <windows.h>
  118. #elif BX_PLATFORM_LINUX
  119. # include <X11/Xlib.h>
  120. #endif // BX_PLATFORM_
  121. #if BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
  122. # include <gl/GRemedyGLExtensions.h>
  123. #endif // BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
  124. #if BGFX_USE_WGL
  125. # include <wgl/wglext.h>
  126. typedef PROC (APIENTRYP PFNWGLGETPROCADDRESSPROC) (LPCSTR lpszProc);
  127. typedef BOOL (APIENTRYP PFNWGLMAKECURRENTPROC) (HDC hdc, HGLRC hglrc);
  128. typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTPROC) (HDC hdc);
  129. typedef BOOL (APIENTRYP PFNWGLDELETECONTEXTPROC) (HGLRC hglrc);
  130. //
  131. typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
  132. typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
  133. typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
  134. typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
  135. typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
  136. typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
  137. typedef void (APIENTRYP PFNGLPIXELSTOREI) (GLenum pname, GLint param);
  138. typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
  139. typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
  140. typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
  141. typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
  142. typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
  143. typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
  144. typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
  145. typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
  146. typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
  147. typedef void (APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *params);
  148. typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
  149. typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
  150. typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
  151. typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size);
  152. typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
  153. typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
  154. typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
  155. typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
  156. typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
  157. typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
  158. typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);
  159. typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  160. typedef void (APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
  161. typedef void (APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask);
  162. typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass);
  163. #endif // BGFX_USE_WGL
  164. #ifndef GL_APIENTRY
  165. # define GL_APIENTRY APIENTRY
  166. #endif // GL_APIENTRY
  167. #ifndef GL_APIENTRYP
  168. # define GL_APIENTRYP GL_APIENTRY*
  169. #endif // GL_APIENTRYP
  170. namespace bgfx
  171. {
  172. typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORBGFXPROC)(GLuint _index, GLuint _divisor);
  173. typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBGFXPROC)(GLenum _mode, GLint _first, GLsizei _count, GLsizei _primcount);
  174. typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBGFXPROC)(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei _primcount);
  175. # define _GL_CHECK(_call) \
  176. do { \
  177. /*BX_TRACE(#_call);*/ \
  178. _call; \
  179. GLenum err = glGetError(); \
  180. BX_CHECK(0 == err, #_call "; glError 0x%x %d", err, err); \
  181. } while (0)
  182. #if BGFX_CONFIG_DEBUG
  183. # define GL_CHECK(_call) _GL_CHECK(_call)
  184. #else
  185. # define GL_CHECK(_call) _call
  186. #endif // BGFX_CONFIG_DEBUG
  187. #if BGFX_CONFIG_DEBUG_GREMEDY
  188. # define _GREMEDY_SETMARKER(_string) \
  189. do \
  190. { \
  191. if (NULL != glStringMarkerGREMEDY) \
  192. { \
  193. glStringMarkerGREMEDY( (GLsizei)strlen(_string), _string); \
  194. } \
  195. } while(0)
  196. # define _GREMEDY_FRAMETERMINATOR() \
  197. do \
  198. { \
  199. if (NULL != glStringMarkerGREMEDY) \
  200. { \
  201. glFrameTerminatorGREMEDY(); \
  202. } \
  203. } while(0)
  204. #else
  205. # define _GREMEDY_SETMARKER(_string) do {} while(0)
  206. # define _GREMEDY_FRAMETERMINATOR() do {} while(0)
  207. #endif // BGFX_CONFIG_DEBUG_GREMEDY
  208. #define GREMEDY_SETMARKER(_string) _GREMEDY_SETMARKER(_string)
  209. #define GREMEDY_FRAMETERMINATOR() _GREMEDY_FRAMETERMINATOR()
  210. #if BGFX_USE_WGL
  211. extern PFNWGLGETPROCADDRESSPROC wglGetProcAddress;
  212. extern PFNWGLMAKECURRENTPROC wglMakeCurrent;
  213. extern PFNWGLCREATECONTEXTPROC wglCreateContext;
  214. #endif // BGFX_USE_WGL
  215. #define GL_IMPORT(_optional, _proto, _func) extern _proto _func
  216. #include "glimports.h"
  217. #undef GL_IMPORT
  218. class ConstantBuffer;
  219. struct IndexBuffer
  220. {
  221. void create(uint32_t _size, void* _data)
  222. {
  223. m_size = _size;
  224. GL_CHECK(glGenBuffers(1, &m_id) );
  225. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  226. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  227. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
  228. , _size
  229. , _data
  230. , (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
  231. ) );
  232. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  233. }
  234. void update(uint32_t _offset, uint32_t _size, void* _data)
  235. {
  236. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  237. GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
  238. , _offset
  239. , _size
  240. , _data
  241. ) );
  242. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  243. }
  244. void destroy()
  245. {
  246. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  247. glDeleteBuffers(1, &m_id);
  248. }
  249. GLuint m_id;
  250. uint32_t m_size;
  251. };
  252. struct VertexBuffer
  253. {
  254. void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle)
  255. {
  256. m_size = _size;
  257. m_decl = _declHandle;
  258. GL_CHECK(glGenBuffers(1, &m_id) );
  259. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  260. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
  261. GL_CHECK(glBufferData(GL_ARRAY_BUFFER
  262. , _size
  263. , _data
  264. , (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
  265. ) );
  266. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
  267. }
  268. void update(uint32_t _offset, uint32_t _size, void* _data)
  269. {
  270. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
  271. GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER
  272. , _offset
  273. , _size
  274. , _data
  275. ) );
  276. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
  277. }
  278. void destroy()
  279. {
  280. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
  281. GL_CHECK(glDeleteBuffers(1, &m_id) );
  282. }
  283. GLuint m_id;
  284. uint32_t m_size;
  285. VertexDeclHandle m_decl;
  286. };
  287. struct Texture
  288. {
  289. Texture()
  290. : m_id(0)
  291. , m_target(GL_TEXTURE_2D)
  292. , m_fmt(GL_ZERO)
  293. , m_type(GL_ZERO)
  294. , m_compressed(false)
  295. {
  296. }
  297. void create(const Memory* _mem, uint32_t _flags);
  298. void createColor(uint32_t _width, uint32_t _height, GLenum _min, GLenum _mag);
  299. void createDepth(uint32_t _width, uint32_t _height);
  300. void destroy();
  301. void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem);
  302. GLuint m_id;
  303. GLenum m_target;
  304. GLenum m_fmt;
  305. GLenum m_type;
  306. bool m_compressed;
  307. };
  308. struct Shader
  309. {
  310. void create(GLenum _type, Memory* _mem)
  311. {
  312. m_id = glCreateShader(_type);
  313. m_type = _type;
  314. bx::MemoryReader reader(_mem->data, _mem->size);
  315. m_hash = hashMurmur2A(_mem->data, _mem->size);
  316. uint32_t magic;
  317. bx::read(&reader, magic);
  318. uint32_t iohash;
  319. bx::read(&reader, iohash);
  320. const uint8_t* code = reader.getDataPtr();
  321. if (0 != m_id)
  322. {
  323. GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&code, NULL) );
  324. GL_CHECK(glCompileShader(m_id) );
  325. GLint compiled = 0;
  326. GL_CHECK(glGetShaderiv(m_id, GL_COMPILE_STATUS, &compiled) );
  327. if (0 == compiled)
  328. {
  329. char log[1024];
  330. GL_CHECK(glGetShaderInfoLog(m_id, sizeof(log), NULL, log) );
  331. BX_TRACE("Failed to compile shader. %d: %s", compiled, log);
  332. BX_TRACE("\n####\n%s\n####", code);
  333. GL_CHECK(glDeleteShader(m_id) );
  334. BGFX_FATAL(false, bgfx::Fatal::InvalidShader, "Failed to compile shader.");
  335. }
  336. }
  337. }
  338. void destroy()
  339. {
  340. GL_CHECK(glDeleteShader(m_id) );
  341. }
  342. GLuint m_id;
  343. GLenum m_type;
  344. uint32_t m_hash;
  345. };
  346. struct RenderTarget
  347. {
  348. void create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags);
  349. void destroy();
  350. GLsizei m_width;
  351. GLsizei m_height;
  352. Texture m_color;
  353. Texture m_depth;
  354. GLuint m_fbo;
  355. GLuint m_rbo;
  356. };
  357. struct Program
  358. {
  359. void create(const Shader& _vsh, const Shader& _fsh);
  360. void destroy();
  361. void init();
  362. void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
  363. void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
  364. void commit()
  365. {
  366. m_constantBuffer->commit();
  367. }
  368. GLuint m_id;
  369. uint8_t m_used[Attrib::Count+1]; // dense
  370. uint16_t m_attributes[Attrib::Count]; // sparse
  371. uint16_t m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
  372. uint32_t m_enabled;
  373. GLuint m_sampler[BGFX_CONFIG_MAX_TEXTURES];
  374. uint8_t m_numSamplers;
  375. ConstantBuffer* m_constantBuffer;
  376. PredefinedUniform m_predefined[PredefinedUniform::Count];
  377. uint8_t m_numPredefined;
  378. };
  379. #if BGFX_CONFIG_RENDERER_OPENGL
  380. struct Queries
  381. {
  382. void create()
  383. {
  384. glGenQueries(countof(m_queries), m_queries);
  385. }
  386. void destroy()
  387. {
  388. glDeleteQueries(countof(m_queries), m_queries);
  389. }
  390. void begin(uint16_t _id, GLenum _target) const
  391. {
  392. glBeginQuery(_target, m_queries[_id]);
  393. }
  394. void end(GLenum _target) const
  395. {
  396. glEndQuery(_target);
  397. }
  398. uint64_t getResult(uint16_t _id) const
  399. {
  400. uint64_t result;
  401. glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result);
  402. return result;
  403. }
  404. GLuint m_queries[64];
  405. };
  406. #endif // BGFX_CONFIG_RENDERER_OPENGL
  407. } // namespace bgfx
  408. #endif // __RENDERER_GL_H__