renderer_gl.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684
  1. /*
  2. * Copyright 2011-2013 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. #define BGFX_USE_NSGL 0
  10. #if BGFX_CONFIG_RENDERER_OPENGL
  11. # if BGFX_CONFIG_RENDERER_OPENGL >= 31
  12. # define GLCOREARB_PROTOTYPES
  13. # include <gl/glcorearb.h>
  14. # define GL_ARB_shader_objects // OSX collsion with GLhandleARB in gltypes.h
  15. # else
  16. # if BX_PLATFORM_LINUX
  17. # define GL_PROTOTYPES
  18. # define GL_GLEXT_LEGACY
  19. # include <GL/gl.h>
  20. # undef GL_PROTOTYPES
  21. # elif BX_PLATFORM_OSX
  22. # define GL_GLEXT_LEGACY
  23. # define long ptrdiff_t
  24. # include <OpenGL/gl.h>
  25. # undef long
  26. # undef GL_VERSION_1_2
  27. # undef GL_VERSION_1_3
  28. # undef GL_VERSION_1_4
  29. # undef GL_VERSION_1_5
  30. # undef GL_VERSION_2_0
  31. # else
  32. # include <GL/gl.h>
  33. # endif // BX_PLATFORM_
  34. // remove deprecated from glext.h
  35. # define GL_VERSION_1_2_DEPRECATED
  36. # define GL_ARB_imaging_DEPRECATED
  37. # define GL_VERSION_1_3_DEPRECATED
  38. # define GL_VERSION_1_4_DEPRECATED
  39. # define GL_VERSION_1_5_DEPRECATED
  40. # define GL_VERSION_2_0_DEPRECATED
  41. # define GL_VERSION_2_1_DEPRECATED
  42. // ignore everything above 2.1
  43. # define GL_VERSION_3_0
  44. # define GL_VERSION_3_0_DEPRECATED
  45. # define GL_VERSION_3_1
  46. # define GL_VERSION_3_2
  47. # define GL_VERSION_3_3
  48. # define GL_VERSION_4_0
  49. # define GL_VERSION_4_1
  50. # define GL_VERSION_4_2
  51. # include <gl/glext.h>
  52. # endif // BGFX_CONFIG_RENDERER_OPENGL >= 31
  53. # define glVertexAttribDivisor glVertexAttribDivisorARB
  54. # define glDrawArraysInstanced glDrawArraysInstancedARB
  55. # define glDrawElementsInstanced glDrawElementsInstancedARB
  56. # if BX_PLATFORM_WINDOWS
  57. # undef BGFX_USE_WGL
  58. # define BGFX_USE_WGL 1
  59. # endif // BX_PLATFORM_
  60. #elif BGFX_CONFIG_RENDERER_OPENGLES2 || BGFX_CONFIG_RENDERER_OPENGLES3
  61. # if BGFX_CONFIG_RENDERER_OPENGLES2
  62. # if BX_PLATFORM_IOS
  63. # include <OpenGLES/ES2/gl.h>
  64. # include <OpenGLES/ES2/glext.h>
  65. typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array);
  66. typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays);
  67. typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays);
  68. typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array);
  69. typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, GLvoid *binary);
  70. typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const GLvoid *binary, GLint length);
  71. typedef void (GL_APIENTRYP PFLGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
  72. typedef void (GL_APIENTRYP PFLGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount);
  73. typedef void (GL_APIENTRYP PFLGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor);
  74. //#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6
  75. #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
  76. #define GL_SAMPLER_3D_OES 0x8B5F
  77. #define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
  78. # else
  79. # include <GLES2/gl2platform.h>
  80. # include <GLES2/gl2.h>
  81. # include <GLES2/gl2ext.h>
  82. # endif // BX_PLATFORM_
  83. # define glProgramBinary glProgramBinaryOES
  84. # define glGetProgramBinary glGetProgramBinaryOES
  85. # define glBindVertexArray glBindVertexArrayOES
  86. # define glDeleteVertexArrays glDeleteVertexArraysOES
  87. # define glGenVertexArrays glGenVertexArraysOES
  88. # define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES
  89. # define GL_HALF_FLOAT GL_HALF_FLOAT_OES
  90. # define GL_RGBA8 GL_RGBA //GL_RGBA8_OES
  91. # define GL_RGB10_A2 GL_RGB10_A2_EXT
  92. # define GL_R16F GL_R16F_EXT
  93. # define GL_R32F GL_R32F_EXT
  94. # define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT
  95. # define GL_SAMPLER_3D GL_SAMPLER_3D_OES
  96. # define GL_MIN GL_MIN_EXT
  97. # define GL_MAX GL_MAX_EXT
  98. # elif BGFX_CONFIG_RENDERER_OPENGLES3
  99. # include <GLES3/gl3platform.h>
  100. # include <GLES3/gl3.h>
  101. # include <GLES3/gl3ext.h>
  102. # endif // BGFX_CONFIG_RENDERER_
  103. # if BX_PLATFORM_ANDROID || BX_PLATFORM_EMSCRIPTEN || BX_PLATFORM_WINDOWS || BX_PLATFORM_QNX
  104. # undef BGFX_USE_EGL
  105. # define BGFX_USE_EGL 1
  106. # include "glcontext_egl.h"
  107. # endif // BX_PLATFORM_
  108. # if BX_PLATFORM_EMSCRIPTEN
  109. # include <emscripten/emscripten.h>
  110. # endif // BX_PLATFORM_EMSCRIPTEN
  111. typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
  112. #endif // BGFX_CONFIG_RENDERER_OPENGL
  113. # ifndef GL_LUMINANCE
  114. # define GL_LUMINANCE 0x1909
  115. # endif // GL_LUMINANCE
  116. # ifndef GL_BGRA_EXT
  117. # define GL_BGRA_EXT 0x80E1
  118. # endif // GL_BGRA_EXT
  119. # ifndef GL_R16F_EXT
  120. # define GL_R16F_EXT 0x822D
  121. # endif // GL_R16F_EXT
  122. # ifndef GL_R32F_EXT
  123. # define GL_R32F_EXT 0x822E
  124. # endif // GL_R32F_EXT
  125. # ifndef GL_RGB10_A2_EXT
  126. # define GL_RGB10_A2_EXT 0x8059
  127. # endif // GL_RGB10_A2_EXT
  128. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  129. # define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
  130. # endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  131. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  132. # define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
  133. # endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  134. # ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  135. # define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
  136. # endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  137. # ifndef GL_COMPRESSED_LUMINANCE_LATC1_EXT
  138. # define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
  139. # endif // GL_COMPRESSED_LUMINANCE_LATC1_EXT
  140. # ifndef GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  141. # define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
  142. # endif // GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  143. # ifndef GL_COMPRESSED_RED_RGTC1_EXT
  144. # define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB
  145. # endif // GL_COMPRESSED_RED_RGTC1_EXT
  146. # ifndef GL_COMPRESSED_RED_GREEN_RGTC2_EXT
  147. # define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD
  148. # endif // GL_COMPRESSED_RED_GREEN_RGTC2_EXT
  149. # ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  150. # define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
  151. # endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  152. # ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
  153. # define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
  154. # endif // GL_TEXTURE_MAX_ANISOTROPY_EXT
  155. # ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  156. # define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
  157. # endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  158. # ifndef GL_VBO_FREE_MEMORY_ATI
  159. # define GL_VBO_FREE_MEMORY_ATI 0x87FB
  160. # endif // GL_VBO_FREE_MEMORY_ATI
  161. # ifndef GL_TEXTURE_FREE_MEMORY_ATI
  162. # define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
  163. # endif // GL_TEXTURE_FREE_MEMORY_ATI
  164. # ifndef GL_RENDERBUFFER_FREE_MEMORY_ATI
  165. # define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
  166. # endif // GL_RENDERBUFFER_FREE_MEMORY_ATI
  167. // http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt
  168. # ifndef GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  169. # define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
  170. # endif // GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  171. # ifndef GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  172. # define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
  173. # endif // GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  174. # ifndef GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  175. # define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
  176. # endif // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  177. # ifndef GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  178. # define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
  179. # endif // GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  180. # ifndef GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  181. # define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
  182. # endif // GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  183. #ifndef GL_RGBA16
  184. # define GL_RGBA16 0x805B
  185. #endif // GL_RGBA16
  186. #ifndef GL_RGBA16F
  187. # define GL_RGBA16F 0x881A
  188. #endif // GL_RGBA16F
  189. #if BX_PLATFORM_NACL
  190. # include "glcontext_ppapi.h"
  191. #elif BX_PLATFORM_WINDOWS
  192. # include <windows.h>
  193. #elif BX_PLATFORM_LINUX
  194. # include "glcontext_glx.h"
  195. #elif BX_PLATFORM_OSX
  196. # include "glcontext_nsgl.h"
  197. #elif BX_PLATFORM_IOS
  198. # include "glcontext_eagl.h"
  199. #endif // BX_PLATFORM_
  200. #if BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
  201. # include <gl/GRemedyGLExtensions.h>
  202. #endif // BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
  203. #if BGFX_USE_WGL
  204. # include "glcontext_wgl.h"
  205. #endif // BGFX_USE_WGL
  206. #ifndef GL_APIENTRY
  207. # define GL_APIENTRY APIENTRY
  208. #endif // GL_APIENTRY
  209. #ifndef GL_APIENTRYP
  210. # define GL_APIENTRYP GL_APIENTRY*
  211. #endif // GL_APIENTRYP
  212. #if !BGFX_CONFIG_RENDERER_OPENGL
  213. # define glClearDepth glClearDepthf
  214. #endif // !BGFX_CONFIG_RENDERER_OPENGL
  215. namespace bgfx
  216. {
  217. // Both GL_ARB_instanced_arrays and GL_ANGLE_instanced_arrays use the same function signature.
  218. typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORBGFXPROC)(GLuint _index, GLuint _divisor);
  219. typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBGFXPROC)(GLenum _mode, GLint _first, GLsizei _count, GLsizei _primcount);
  220. typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBGFXPROC)(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei _primcount);
  221. # define _GL_CHECK(_call) \
  222. do { \
  223. /*BX_TRACE(#_call);*/ \
  224. _call; \
  225. GLenum err = glGetError(); \
  226. BX_CHECK(0 == err, #_call "; glError 0x%x %d", err, err); \
  227. } while (0)
  228. #if BGFX_CONFIG_DEBUG
  229. # define GL_CHECK(_call) _GL_CHECK(_call)
  230. #else
  231. # define GL_CHECK(_call) _call
  232. #endif // BGFX_CONFIG_DEBUG
  233. #if BGFX_CONFIG_DEBUG_GREMEDY
  234. # define _GREMEDY_SETMARKER(_string) glStringMarkerGREMEDY(0, _string)
  235. # define _GREMEDY_FRAMETERMINATOR() glFrameTerminatorGREMEDY()
  236. #else
  237. # define _GREMEDY_SETMARKER(_string) do { BX_UNUSED(_string); } while(0)
  238. # define _GREMEDY_FRAMETERMINATOR() do {} while(0)
  239. #endif // BGFX_CONFIG_DEBUG_GREMEDY
  240. #define GREMEDY_SETMARKER(_string) _GREMEDY_SETMARKER(_string)
  241. #define GREMEDY_FRAMETERMINATOR() _GREMEDY_FRAMETERMINATOR()
  242. #define GL_IMPORT(_optional, _proto, _func) extern _proto _func
  243. #include "glimports.h"
  244. #undef GL_IMPORT
  245. void dumpExtensions(const char* _extensions);
  246. class ConstantBuffer;
  247. class VaoStateCache
  248. {
  249. public:
  250. GLuint add(uint32_t _hash)
  251. {
  252. invalidate(_hash);
  253. GLuint arrayId;
  254. GL_CHECK(glGenVertexArrays(1, &arrayId) );
  255. m_hashMap.insert(stl::make_pair(_hash, arrayId) );
  256. return arrayId;
  257. }
  258. GLuint find(uint32_t _hash)
  259. {
  260. HashMap::iterator it = m_hashMap.find(_hash);
  261. if (it != m_hashMap.end() )
  262. {
  263. return it->second;
  264. }
  265. return UINT32_MAX;
  266. }
  267. void invalidate(uint32_t _hash)
  268. {
  269. GL_CHECK(glBindVertexArray(0) );
  270. HashMap::iterator it = m_hashMap.find(_hash);
  271. if (it != m_hashMap.end() )
  272. {
  273. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  274. m_hashMap.erase(it);
  275. }
  276. }
  277. void invalidate()
  278. {
  279. GL_CHECK(glBindVertexArray(0) );
  280. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  281. {
  282. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  283. }
  284. m_hashMap.clear();
  285. }
  286. private:
  287. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  288. HashMap m_hashMap;
  289. };
  290. class VaoCacheRef
  291. {
  292. public:
  293. void add(uint32_t _hash)
  294. {
  295. m_vaoSet.insert(_hash);
  296. }
  297. void invalidate(VaoStateCache& _vaoCache)
  298. {
  299. for (VaoSet::iterator it = m_vaoSet.begin(), itEnd = m_vaoSet.end(); it != itEnd; ++it)
  300. {
  301. _vaoCache.invalidate(*it);
  302. }
  303. m_vaoSet.clear();
  304. }
  305. typedef stl::unordered_set<uint32_t> VaoSet;
  306. VaoSet m_vaoSet;
  307. };
  308. #if !BGFX_CONFIG_RENDERER_OPENGLES2
  309. class SamplerStateCache
  310. {
  311. public:
  312. GLuint add(uint32_t _hash)
  313. {
  314. invalidate(_hash);
  315. GLuint samplerId;
  316. GL_CHECK(glGenSamplers(1, &samplerId) );
  317. m_hashMap.insert(stl::make_pair(_hash, samplerId) );
  318. return samplerId;
  319. }
  320. GLuint find(uint32_t _hash)
  321. {
  322. HashMap::iterator it = m_hashMap.find(_hash);
  323. if (it != m_hashMap.end() )
  324. {
  325. return it->second;
  326. }
  327. return UINT32_MAX;
  328. }
  329. void invalidate(uint32_t _hash)
  330. {
  331. HashMap::iterator it = m_hashMap.find(_hash);
  332. if (it != m_hashMap.end() )
  333. {
  334. GL_CHECK(glDeleteSamplers(1, &it->second) );
  335. m_hashMap.erase(it);
  336. }
  337. }
  338. void invalidate()
  339. {
  340. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  341. {
  342. GL_CHECK(glDeleteSamplers(1, &it->second) );
  343. }
  344. m_hashMap.clear();
  345. }
  346. private:
  347. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  348. HashMap m_hashMap;
  349. };
  350. #endif // !BGFX_CONFIG_RENDERER_OPENGLES2
  351. struct IndexBuffer
  352. {
  353. void create(uint32_t _size, void* _data)
  354. {
  355. m_size = _size;
  356. GL_CHECK(glGenBuffers(1, &m_id) );
  357. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  358. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  359. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
  360. , _size
  361. , _data
  362. , (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
  363. ) );
  364. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  365. }
  366. void update(uint32_t _offset, uint32_t _size, void* _data)
  367. {
  368. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  369. GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
  370. , _offset
  371. , _size
  372. , _data
  373. ) );
  374. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  375. }
  376. void destroy();
  377. void add(uint32_t _hash)
  378. {
  379. m_vcref.add(_hash);
  380. }
  381. GLuint m_id;
  382. uint32_t m_size;
  383. VaoCacheRef m_vcref;
  384. };
  385. struct VertexBuffer
  386. {
  387. void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle)
  388. {
  389. m_size = _size;
  390. m_decl = _declHandle;
  391. GL_CHECK(glGenBuffers(1, &m_id) );
  392. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  393. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
  394. GL_CHECK(glBufferData(GL_ARRAY_BUFFER
  395. , _size
  396. , _data
  397. , (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
  398. ) );
  399. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
  400. }
  401. void update(uint32_t _offset, uint32_t _size, void* _data)
  402. {
  403. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
  404. GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER
  405. , _offset
  406. , _size
  407. , _data
  408. ) );
  409. GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
  410. }
  411. void destroy();
  412. void add(uint32_t _hash)
  413. {
  414. m_vcref.add(_hash);
  415. }
  416. GLuint m_id;
  417. uint32_t m_size;
  418. VertexDeclHandle m_decl;
  419. VaoCacheRef m_vcref;
  420. };
  421. struct Texture
  422. {
  423. Texture()
  424. : m_id(0)
  425. , m_target(GL_TEXTURE_2D)
  426. , m_fmt(GL_ZERO)
  427. , m_type(GL_ZERO)
  428. , m_flags(0)
  429. , m_currentFlags(UINT32_MAX)
  430. , m_numMips(0)
  431. , m_compressed(false)
  432. {
  433. }
  434. void init(GLenum _target, uint8_t _numMips, uint32_t _flags);
  435. void create(const Memory* _mem, uint32_t _flags);
  436. void createColor(uint32_t _colorFormat, uint32_t _width, uint32_t _height, GLenum _min, GLenum _mag);
  437. void createDepth(uint32_t _width, uint32_t _height);
  438. void destroy();
  439. void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem);
  440. void setSamplerState(uint32_t _flags);
  441. void commit(uint32_t _stage, uint32_t _flags);
  442. GLuint m_id;
  443. GLenum m_target;
  444. GLenum m_fmt;
  445. GLenum m_type;
  446. uint32_t m_flags;
  447. uint32_t m_currentFlags;
  448. uint8_t m_numMips;
  449. bool m_compressed;
  450. };
  451. struct Shader
  452. {
  453. void create(GLenum _type, Memory* _mem)
  454. {
  455. m_id = glCreateShader(_type);
  456. m_type = _type;
  457. bx::MemoryReader reader(_mem->data, _mem->size);
  458. m_hash = hashMurmur2A(_mem->data, _mem->size);
  459. uint32_t magic;
  460. bx::read(&reader, magic);
  461. uint32_t iohash;
  462. bx::read(&reader, iohash);
  463. const uint8_t* code = reader.getDataPtr();
  464. if (0 != m_id)
  465. {
  466. GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&code, NULL) );
  467. GL_CHECK(glCompileShader(m_id) );
  468. GLint compiled = 0;
  469. GL_CHECK(glGetShaderiv(m_id, GL_COMPILE_STATUS, &compiled) );
  470. if (0 == compiled)
  471. {
  472. char log[1024];
  473. GL_CHECK(glGetShaderInfoLog(m_id, sizeof(log), NULL, log) );
  474. BX_TRACE("Failed to compile shader. %d: %s", compiled, log);
  475. BX_TRACE("\n####\n%s\n####", code);
  476. GL_CHECK(glDeleteShader(m_id) );
  477. BGFX_FATAL(false, bgfx::Fatal::InvalidShader, "Failed to compile shader.");
  478. }
  479. }
  480. }
  481. void destroy()
  482. {
  483. GL_CHECK(glDeleteShader(m_id) );
  484. }
  485. GLuint m_id;
  486. GLenum m_type;
  487. uint32_t m_hash;
  488. };
  489. struct RenderTarget
  490. {
  491. RenderTarget()
  492. : m_width(0)
  493. , m_height(0)
  494. , m_msaa(0)
  495. {
  496. memset(m_fbo, 0, sizeof(m_fbo) );
  497. }
  498. void create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags);
  499. void destroy();
  500. void resolve();
  501. GLsizei m_width;
  502. GLsizei m_height;
  503. uint32_t m_msaa;
  504. Texture m_color;
  505. Texture m_depth;
  506. GLuint m_fbo[2];
  507. GLuint m_colorRbo;
  508. GLuint m_depthRbo;
  509. };
  510. struct Program
  511. {
  512. void create(const Shader& _vsh, const Shader& _fsh);
  513. void destroy();
  514. void init();
  515. void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
  516. void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
  517. void commit()
  518. {
  519. m_constantBuffer->commit();
  520. }
  521. void add(uint32_t _hash)
  522. {
  523. m_vcref.add(_hash);
  524. }
  525. GLuint m_id;
  526. uint8_t m_used[Attrib::Count+1]; // dense
  527. GLint m_attributes[Attrib::Count]; // sparse
  528. GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
  529. GLint m_sampler[BGFX_CONFIG_MAX_TEXTURES];
  530. uint8_t m_numSamplers;
  531. ConstantBuffer* m_constantBuffer;
  532. PredefinedUniform m_predefined[PredefinedUniform::Count];
  533. uint8_t m_numPredefined;
  534. VaoCacheRef m_vcref;
  535. };
  536. #if BGFX_CONFIG_RENDERER_OPENGL
  537. struct Queries
  538. {
  539. void create()
  540. {
  541. glGenQueries(countof(m_queries), m_queries);
  542. }
  543. void destroy()
  544. {
  545. glDeleteQueries(countof(m_queries), m_queries);
  546. }
  547. void begin(uint16_t _id, GLenum _target) const
  548. {
  549. glBeginQuery(_target, m_queries[_id]);
  550. }
  551. void end(GLenum _target) const
  552. {
  553. glEndQuery(_target);
  554. }
  555. uint64_t getResult(uint16_t _id) const
  556. {
  557. uint64_t result;
  558. glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result);
  559. return result;
  560. }
  561. GLuint m_queries[64];
  562. };
  563. #endif // BGFX_CONFIG_RENDERER_OPENGL
  564. } // namespace bgfx
  565. #endif // __RENDERER_GL_H__