renderer_gl.h 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463
  1. /*
  2. * Copyright 2011-2016 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  4. */
  5. #ifndef BGFX_RENDERER_GL_H_HEADER_GUARD
  6. #define BGFX_RENDERER_GL_H_HEADER_GUARD
  7. #define BGFX_USE_EGL (BGFX_CONFIG_RENDERER_OPENGLES && (0 \
  8. || BX_PLATFORM_ANDROID \
  9. || BX_PLATFORM_EMSCRIPTEN \
  10. || BX_PLATFORM_LINUX \
  11. || BX_PLATFORM_BSD \
  12. || BX_PLATFORM_QNX \
  13. || BX_PLATFORM_RPI \
  14. || BX_PLATFORM_STEAMLINK \
  15. || BX_PLATFORM_WINDOWS \
  16. ) )
  17. #define BGFX_USE_WGL (BGFX_CONFIG_RENDERER_OPENGL && BX_PLATFORM_WINDOWS)
  18. #define BGFX_USE_GLX (BGFX_CONFIG_RENDERER_OPENGL && (0 \
  19. || BX_PLATFORM_LINUX \
  20. || BX_PLATFORM_BSD \
  21. ) )
  22. #define BGFX_USE_GL_DYNAMIC_LIB (0 \
  23. || BX_PLATFORM_LINUX \
  24. || BX_PLATFORM_BSD \
  25. || BX_PLATFORM_OSX \
  26. || BX_PLATFORM_WINDOWS \
  27. )
  28. #if BGFX_CONFIG_RENDERER_OPENGL
  29. # if BGFX_CONFIG_RENDERER_OPENGL >= 31
  30. # include <gl/glcorearb.h>
  31. # if BX_PLATFORM_OSX
  32. # define GL_ARB_shader_objects // OSX collsion with GLhandleARB in gltypes.h
  33. # endif // BX_PLATFORM_OSX
  34. # else
  35. # if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
  36. # define GL_PROTOTYPES
  37. # define GL_GLEXT_LEGACY
  38. # include <GL/gl.h>
  39. # undef GL_PROTOTYPES
  40. # elif BX_PLATFORM_OSX
  41. # define GL_GLEXT_LEGACY
  42. # define long ptrdiff_t
  43. # include <OpenGL/gl.h>
  44. # undef long
  45. # undef GL_VERSION_1_2
  46. # undef GL_VERSION_1_3
  47. # undef GL_VERSION_1_4
  48. # undef GL_VERSION_1_5
  49. # undef GL_VERSION_2_0
  50. # else
  51. # include <GL/gl.h>
  52. # endif // BX_PLATFORM_
  53. # include <gl/glext.h>
  54. # endif // BGFX_CONFIG_RENDERER_OPENGL >= 31
  55. #elif BGFX_CONFIG_RENDERER_OPENGLES
  56. typedef double GLdouble;
  57. # if BGFX_CONFIG_RENDERER_OPENGLES < 30
  58. # if BX_PLATFORM_IOS
  59. # include <OpenGLES/ES2/gl.h>
  60. # include <OpenGLES/ES2/glext.h>
  61. //#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6
  62. #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
  63. #define GL_TEXTURE_3D_OES 0x806F
  64. #define GL_SAMPLER_3D_OES 0x8B5F
  65. #define GL_TEXTURE_WRAP_R_OES 0x8072
  66. #define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
  67. # else
  68. # include <GLES2/gl2platform.h>
  69. # include <GLES2/gl2.h>
  70. # include <GLES2/gl2ext.h>
  71. # endif // BX_PLATFORM_
  72. typedef int64_t GLint64;
  73. typedef uint64_t GLuint64;
  74. # define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES
  75. # define GL_HALF_FLOAT GL_HALF_FLOAT_OES
  76. # define GL_RGBA8 GL_RGBA8_OES
  77. # define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT
  78. # define GL_TEXTURE_3D GL_TEXTURE_3D_OES
  79. # define GL_SAMPLER_3D GL_SAMPLER_3D_OES
  80. # define GL_TEXTURE_WRAP_R GL_TEXTURE_WRAP_R_OES
  81. # define GL_MIN GL_MIN_EXT
  82. # define GL_MAX GL_MAX_EXT
  83. # define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES
  84. # define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES
  85. # define GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT32_OES
  86. # define GL_UNSIGNED_INT_24_8 GL_UNSIGNED_INT_24_8_OES
  87. # elif BGFX_CONFIG_RENDERER_OPENGLES >= 30
  88. # include <GLES3/gl3platform.h>
  89. # include <GLES3/gl3.h>
  90. # include <GLES3/gl3ext.h>
  91. # endif // BGFX_CONFIG_RENDERER_
  92. # if BGFX_USE_EGL
  93. # include "glcontext_egl.h"
  94. # endif // BGFX_USE_EGL
  95. # if BX_PLATFORM_EMSCRIPTEN
  96. # include <emscripten/emscripten.h>
  97. # endif // BX_PLATFORM_EMSCRIPTEN
  98. #endif // BGFX_CONFIG_RENDERER_OPENGL
  99. #include "renderer.h"
  100. #include "hmd_ovr.h"
  101. #include "hmd_openvr.h"
  102. #include "debug_renderdoc.h"
  103. #ifndef GL_LUMINANCE
  104. # define GL_LUMINANCE 0x1909
  105. #endif // GL_LUMINANCE
  106. #ifndef GL_BGRA
  107. # define GL_BGRA 0x80E1
  108. #endif // GL_BGRA
  109. #ifndef GL_R8
  110. # define GL_R8 0x8229
  111. #endif // GL_R8
  112. #ifndef GL_R8I
  113. # define GL_R8I 0x8231
  114. #endif // GL_R8I
  115. #ifndef GL_R8UI
  116. # define GL_R8UI 0x8232
  117. #endif // GL_R8UI
  118. #ifndef GL_R8_SNORM
  119. # define GL_R8_SNORM 0x8F94
  120. #endif // GL_R8_SNORM
  121. #ifndef GL_R16
  122. # define GL_R16 0x822A
  123. #endif // GL_R16
  124. #ifndef GL_R16I
  125. # define GL_R16I 0x8233
  126. #endif // GL_R16I
  127. #ifndef GL_R16UI
  128. # define GL_R16UI 0x8234
  129. #endif // GL_R16UI
  130. #ifndef GL_R16F
  131. # define GL_R16F 0x822D
  132. #endif // GL_R16F
  133. #ifndef GL_R16_SNORM
  134. # define GL_R16_SNORM 0x8F98
  135. #endif // GL_R16_SNORM
  136. #ifndef GL_R32UI
  137. # define GL_R32UI 0x8236
  138. #endif // GL_R32UI
  139. #ifndef GL_R32F
  140. # define GL_R32F 0x822E
  141. #endif // GL_R32F
  142. #ifndef GL_RG8
  143. # define GL_RG8 0x822B
  144. #endif // GL_RG8
  145. #ifndef GL_RG8I
  146. # define GL_RG8I 0x8237
  147. #endif // GL_RG8I
  148. #ifndef GL_RG8UI
  149. # define GL_RG8UI 0x8238
  150. #endif // GL_RG8UI
  151. #ifndef GL_RG8_SNORM
  152. # define GL_RG8_SNORM 0x8F95
  153. #endif // GL_RG8_SNORM
  154. #ifndef GL_RG16
  155. # define GL_RG16 0x822C
  156. #endif // GL_RG16
  157. #ifndef GL_RG16UI
  158. # define GL_RG16UI 0x823A
  159. #endif // GL_RG16UI
  160. #ifndef GL_RG16F
  161. # define GL_RG16F 0x822F
  162. #endif // GL_RG16F
  163. #ifndef GL_RG16I
  164. # define GL_RG16I 0x8239
  165. #endif // GL_RG16I
  166. #ifndef GL_RG16UI
  167. # define GL_RG16UI 0x823A
  168. #endif // GL_RG16UI
  169. #ifndef GL_RG16_SNORM
  170. # define GL_RG16_SNORM 0x8F99
  171. #endif // GL_RG16_SNORM
  172. #ifndef GL_R32I
  173. # define GL_R32I 0x8235
  174. #endif // GL_R32I
  175. #ifndef GL_R32UI
  176. # define GL_R32UI 0x8236
  177. #endif // GL_R32UI
  178. #ifndef GL_RG32I
  179. # define GL_RG32I 0x823B
  180. #endif // GL_RG32I
  181. #ifndef GL_RG32UI
  182. # define GL_RG32UI 0x823C
  183. #endif // GL_RG32UI
  184. #ifndef GL_RG32F
  185. # define GL_RG32F 0x8230
  186. #endif // GL_RG32F
  187. #ifndef GL_RGB8
  188. # define GL_RGB8 0x8051
  189. #endif // GL_RGB8
  190. #ifndef GL_SRGB
  191. # define GL_SRGB 0x8C40
  192. #endif // GL_SRGB
  193. #ifndef GL_SRGB8
  194. # define GL_SRGB8 0x8C41
  195. #endif // GL_SRGB8
  196. #ifndef GL_RGB8I
  197. # define GL_RGB8I 0x8D8F
  198. #endif // GL_RGB8I
  199. #ifndef GL_RGB8UI
  200. # define GL_RGB8UI 0x8D7D
  201. #endif // GL_RGB8UI
  202. #ifndef GL_RGB8_SNORM
  203. # define GL_RGB8_SNORM 0x8F96
  204. #endif // GL_RGB8_SNORM
  205. #ifndef GL_RGBA8I
  206. # define GL_RGBA8I 0x8D8E
  207. #endif // GL_RGBA8I
  208. #ifndef GL_RGBA8UI
  209. # define GL_RGBA8UI 0x8D7C
  210. #endif // GL_RGBA8UI
  211. #ifndef GL_RGBA8_SNORM
  212. # define GL_RGBA8_SNORM 0x8F97
  213. #endif // GL_RGBA8_SNORM
  214. #ifndef GL_RGBA16I
  215. # define GL_RGBA16I 0x8D88
  216. #endif // GL_RGBA16I
  217. #ifndef GL_RGBA16UI
  218. # define GL_RGBA16UI 0x8D76
  219. #endif // GL_RGBA16UI
  220. #ifndef GL_RGBA16_SNORM
  221. # define GL_RGBA16_SNORM 0x8F9B
  222. #endif // GL_RGBA16_SNORM
  223. #ifndef GL_RGBA32UI
  224. # define GL_RGBA32UI 0x8D70
  225. #endif // GL_RGBA32UI
  226. #ifndef GL_RGBA32F
  227. # define GL_RGBA32F 0x8814
  228. #endif // GL_RGBA32F
  229. #ifndef GL_RGBA32I
  230. # define GL_RGBA32I 0x8D82
  231. #endif // GL_RGBA32I
  232. #ifndef GL_STENCIL_INDEX
  233. # define GL_STENCIL_INDEX 0x1901
  234. #endif // GL_STENCIL_INDEX
  235. #ifndef GL_RED
  236. # define GL_RED 0x1903
  237. #endif // GL_RED
  238. #ifndef GL_RED_INTEGER
  239. # define GL_RED_INTEGER 0x8D94
  240. #endif // GL_RED_INTEGER
  241. #ifndef GL_RG
  242. # define GL_RG 0x8227
  243. #endif // GL_RG
  244. #ifndef GL_RG_INTEGER
  245. # define GL_RG_INTEGER 0x8228
  246. #endif // GL_RG_INTEGER
  247. #ifndef GL_GREEN
  248. # define GL_GREEN 0x1904
  249. #endif // GL_GREEN
  250. #ifndef GL_BLUE
  251. # define GL_BLUE 0x1905
  252. #endif // GL_BLUE
  253. #ifndef GL_RGBA_INTEGER
  254. # define GL_RGBA_INTEGER 0x8D99
  255. #endif // GL_RGBA_INTEGER
  256. #ifndef GL_RGB10_A2
  257. # define GL_RGB10_A2 0x8059
  258. #endif // GL_RGB10_A2
  259. #ifndef GL_RGBA16
  260. # define GL_RGBA16 0x805B
  261. #endif // GL_RGBA16
  262. #ifndef GL_RGBA16F
  263. # define GL_RGBA16F 0x881A
  264. #endif // GL_RGBA16F
  265. #ifndef GL_R16UI
  266. # define GL_R16UI 0x8234
  267. #endif // GL_R16UI
  268. #ifndef GL_RGBA16UI
  269. # define GL_RGBA16UI 0x8D76
  270. #endif // GL_RGBA16UI
  271. #ifndef GL_RGB9_E5
  272. # define GL_RGB9_E5 0x8C3D
  273. #endif // GL_RGB9_E5
  274. #ifndef GL_UNSIGNED_INT_5_9_9_9_REV
  275. # define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E
  276. #endif // GL_UNSIGNED_INT_5_9_9_9_REV
  277. #ifndef GL_R11F_G11F_B10F
  278. # define GL_R11F_G11F_B10F 0x8C3A
  279. #endif // GL_R11F_G11F_B10F
  280. #ifndef GL_UNSIGNED_SHORT_5_6_5_REV
  281. # define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364
  282. #endif // GL_UNSIGNED_SHORT_5_6_5_REV
  283. #ifndef GL_UNSIGNED_SHORT_1_5_5_5_REV
  284. # define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366
  285. #endif // GL_UNSIGNED_SHORT_1_5_5_5_REV
  286. #ifndef GL_UNSIGNED_SHORT_4_4_4_4_REV
  287. # define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365
  288. #endif // GL_UNSIGNED_SHORT_4_4_4_4_REV
  289. #ifndef GL_UNSIGNED_INT_10F_11F_11F_REV
  290. # define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
  291. #endif // GL_UNSIGNED_INT_10F_11F_11F_REV
  292. #ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
  293. # define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
  294. #endif // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
  295. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  296. # define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
  297. #endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  298. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  299. # define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
  300. #endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  301. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  302. # define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
  303. #endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  304. #ifndef GL_COMPRESSED_LUMINANCE_LATC1_EXT
  305. # define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
  306. #endif // GL_COMPRESSED_LUMINANCE_LATC1_EXT
  307. #ifndef GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  308. # define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
  309. #endif // GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  310. #ifndef GL_COMPRESSED_RED_RGTC1
  311. # define GL_COMPRESSED_RED_RGTC1 0x8DBB
  312. #endif // GL_COMPRESSED_RED_RGTC1
  313. #ifndef GL_COMPRESSED_RG_RGTC2
  314. # define GL_COMPRESSED_RG_RGTC2 0x8DBD
  315. #endif // GL_COMPRESSED_RG_RGTC2
  316. #ifndef GL_ETC1_RGB8_OES
  317. # define GL_ETC1_RGB8_OES 0x8D64
  318. #endif // GL_ETC1_RGB8_OES
  319. #ifndef GL_COMPRESSED_RGB8_ETC2
  320. # define GL_COMPRESSED_RGB8_ETC2 0x9274
  321. #endif // GL_COMPRESSED_RGB8_ETC2
  322. #ifndef GL_COMPRESSED_RGBA8_ETC2_EAC
  323. # define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
  324. #endif // GL_COMPRESSED_RGBA8_ETC2_EAC
  325. #ifndef GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
  326. # define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
  327. #endif // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
  328. #ifndef GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
  329. # define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
  330. #endif // GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
  331. #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
  332. # define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
  333. #endif // GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
  334. #ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
  335. # define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
  336. #endif // GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
  337. #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
  338. # define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
  339. #endif // GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
  340. #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
  341. # define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137
  342. #endif // GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
  343. #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
  344. # define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138
  345. #endif // GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
  346. #ifndef GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
  347. # define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54
  348. #endif // GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
  349. #ifndef GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
  350. # define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55
  351. #endif // GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
  352. #ifndef GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
  353. # define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56
  354. #endif // GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
  355. #ifndef GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
  356. # define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57
  357. #endif // GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
  358. #ifndef GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
  359. # define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
  360. #endif // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
  361. #ifndef GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
  362. # define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
  363. #endif // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
  364. #ifndef GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
  365. # define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
  366. #endif // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
  367. #ifndef GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
  368. # define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
  369. #endif // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
  370. #ifndef GL_SRGB8_ALPHA8
  371. # define GL_SRGB8_ALPHA8 0x8C43
  372. #endif // GL_SRGB8_ALPHA8
  373. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
  374. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
  375. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
  376. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
  377. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
  378. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
  379. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
  380. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
  381. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
  382. #ifndef GL_COMPRESSED_SRGB8_ETC2
  383. # define GL_COMPRESSED_SRGB8_ETC2 0x9275
  384. #endif // GL_COMPRESSED_SRGB8_ETC2
  385. #ifndef GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
  386. # define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
  387. #endif // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
  388. #ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  389. # define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
  390. #endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  391. #ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
  392. # define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
  393. #endif // GL_TEXTURE_MAX_ANISOTROPY_EXT
  394. #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  395. # define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
  396. #endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  397. #ifndef GL_TEXTURE_SWIZZLE_RGBA
  398. # define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
  399. #endif // GL_TEXTURE_SWIZZLE_RGBA
  400. #ifndef GL_MAX_SAMPLES
  401. # define GL_MAX_SAMPLES 0x8D57
  402. #endif // GL_MAX_SAMPLES
  403. #ifndef GL_MAX_COLOR_ATTACHMENTS
  404. # define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
  405. #endif // GL_MAX_COLOR_ATTACHMENTS
  406. #ifndef GL_MAX_DRAW_BUFFERS
  407. # define GL_MAX_DRAW_BUFFERS 0x8824
  408. #endif // GL_MAX_DRAW_BUFFERS
  409. #ifndef GL_QUERY_RESULT
  410. # define GL_QUERY_RESULT 0x8866
  411. #endif // GL_QUERY_RESULT
  412. #ifndef GL_QUERY_RESULT_AVAILABLE
  413. # define GL_QUERY_RESULT_AVAILABLE 0x8867
  414. #endif // GL_QUERY_RESULT_AVAILABLE
  415. #ifndef GL_SAMPLES_PASSED
  416. # define GL_SAMPLES_PASSED 0x8914
  417. #endif // GL_SAMPLES_PASSED
  418. #ifndef GL_ANY_SAMPLES_PASSED
  419. # define GL_ANY_SAMPLES_PASSED 0x8C2F
  420. #endif // GL_ANY_SAMPLES_PASSED
  421. #ifndef GL_READ_FRAMEBUFFER
  422. # define GL_READ_FRAMEBUFFER 0x8CA8
  423. #endif /// GL_READ_FRAMEBUFFER
  424. #ifndef GL_DRAW_FRAMEBUFFER
  425. # define GL_DRAW_FRAMEBUFFER 0x8CA9
  426. #endif // GL_DRAW_FRAMEBUFFER
  427. #ifndef GL_TIME_ELAPSED
  428. # define GL_TIME_ELAPSED 0x88BF
  429. #endif // GL_TIME_ELAPSED
  430. #ifndef GL_TIMESTAMP
  431. # define GL_TIMESTAMP 0x8E28
  432. #endif // GL_TIMESTAMP
  433. #ifndef GL_VBO_FREE_MEMORY_ATI
  434. # define GL_VBO_FREE_MEMORY_ATI 0x87FB
  435. #endif // GL_VBO_FREE_MEMORY_ATI
  436. #ifndef GL_TEXTURE_FREE_MEMORY_ATI
  437. # define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
  438. #endif // GL_TEXTURE_FREE_MEMORY_ATI
  439. #ifndef GL_RENDERBUFFER_FREE_MEMORY_ATI
  440. # define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
  441. #endif // GL_RENDERBUFFER_FREE_MEMORY_ATI
  442. // http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt
  443. #ifndef GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  444. # define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
  445. #endif // GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  446. #ifndef GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  447. # define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
  448. #endif // GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  449. #ifndef GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  450. # define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
  451. #endif // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  452. #ifndef GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  453. # define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
  454. #endif // GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  455. #ifndef GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  456. # define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
  457. #endif // GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  458. #ifndef GL_UNPACK_ROW_LENGTH
  459. # define GL_UNPACK_ROW_LENGTH 0x0CF2
  460. #endif // GL_UNPACK_ROW_LENGTH
  461. #ifndef GL_DEPTH_STENCIL
  462. # define GL_DEPTH_STENCIL 0x84F9
  463. #endif // GL_DEPTH_STENCIL
  464. #ifndef GL_DEPTH_COMPONENT32
  465. # define GL_DEPTH_COMPONENT32 0x81A7
  466. #endif // GL_DEPTH_COMPONENT32
  467. #ifndef GL_DEPTH_COMPONENT32F
  468. # define GL_DEPTH_COMPONENT32F 0x8CAC
  469. #endif // GL_DEPTH_COMPONENT32F
  470. #ifndef GL_DEPTH_STENCIL_ATTACHMENT
  471. # define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
  472. #endif // GL_DEPTH_STENCIL_ATTACHMENT
  473. #ifndef GL_TEXTURE_COMPARE_MODE
  474. # define GL_TEXTURE_COMPARE_MODE 0x884C
  475. #endif // GL_TEXTURE_COMPARE_MODE
  476. #ifndef GL_TEXTURE_COMPARE_FUNC
  477. # define GL_TEXTURE_COMPARE_FUNC 0x884D
  478. #endif // GL_TEXTURE_COMPARE_FUNC
  479. #ifndef GL_COMPARE_REF_TO_TEXTURE
  480. # define GL_COMPARE_REF_TO_TEXTURE 0x884E
  481. #endif // GL_COMPARE_REF_TO_TEXTURE
  482. #ifndef GL_INT_SAMPLER_2D
  483. # define GL_INT_SAMPLER_2D 0x8DCA
  484. #endif // GL_INT_SAMPLER_2D
  485. #ifndef GL_UNSIGNED_INT_SAMPLER_2D
  486. # define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
  487. #endif // GL_UNSIGNED_INT_SAMPLER_2D
  488. #ifndef GL_INT_SAMPLER_3D
  489. # define GL_INT_SAMPLER_3D 0x8DCB
  490. #endif // GL_INT_SAMPLER_3D
  491. #ifndef GL_UNSIGNED_INT_SAMPLER_3D
  492. # define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
  493. #endif // GL_UNSIGNED_INT_SAMPLER_3D
  494. #ifndef GL_INT_SAMPLER_CUBE
  495. # define GL_INT_SAMPLER_CUBE 0x8DCC
  496. #endif // GL_INT_SAMPLER_CUBEER_3D
  497. #ifndef GL_UNSIGNED_INT_SAMPLER_CUBE
  498. # define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
  499. #endif // GL_UNSIGNED_INT_SAMPLER_CUBE
  500. #ifndef GL_SAMPLER_2D_MULTISAMPLE
  501. # define GL_SAMPLER_2D_MULTISAMPLE 0x9108
  502. #endif // GL_SAMPLER_2D_MULTISAMPLE
  503. #ifndef GL_INT_SAMPLER_2D_MULTISAMPLE
  504. # define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
  505. #endif // GL_INT_SAMPLER_2D_MULTISAMPLE
  506. #ifndef GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE
  507. # define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
  508. #endif // GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE
  509. #ifndef GL_SAMPLER_2D_SHADOW
  510. # define GL_SAMPLER_2D_SHADOW 0x8B62
  511. #endif // GL_SAMPLER_2D_SHADOW
  512. #ifndef GL_TEXTURE_MAX_LEVEL
  513. # define GL_TEXTURE_MAX_LEVEL 0x813D
  514. #endif // GL_TEXTURE_MAX_LEVEL
  515. #ifndef GL_COMPUTE_SHADER
  516. # define GL_COMPUTE_SHADER 0x91B9
  517. #endif // GL_COMPUTE_SHADER
  518. #ifndef GL_READ_ONLY
  519. # define GL_READ_ONLY 0x88B8
  520. #endif // GL_READ_ONLY
  521. #ifndef GL_WRITE_ONLY
  522. # define GL_WRITE_ONLY 0x88B9
  523. #endif // GL_WRITE_ONLY
  524. #ifndef GL_READ_WRITE
  525. # define GL_READ_WRITE 0x88BA
  526. #endif // GL_READ_WRITE
  527. #ifndef GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
  528. # define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
  529. #endif // GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
  530. #ifndef GL_ELEMENT_ARRAY_BARRIER_BIT
  531. # define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
  532. #endif // GL_ELEMENT_ARRAY_BARRIER_BIT
  533. #ifndef GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
  534. # define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
  535. #endif // GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
  536. #ifndef GL_SHADER_STORAGE_BARRIER_BIT
  537. # define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
  538. #endif // GL_SHADER_STORAGE_BARRIER_BIT
  539. #ifndef GL_SHADER_STORAGE_BUFFER
  540. # define GL_SHADER_STORAGE_BUFFER 0x90D2
  541. #endif // GL_SHADER_STORAGE_BUFFER
  542. #ifndef GL_IMAGE_1D
  543. # define GL_IMAGE_1D 0x904C
  544. #endif // GL_IMAGE_1D
  545. #ifndef GL_IMAGE_2D
  546. # define GL_IMAGE_2D 0x904D
  547. #endif // GL_IMAGE_2D
  548. #ifndef GL_IMAGE_3D
  549. # define GL_IMAGE_3D 0x904E
  550. #endif // GL_IMAGE_3D
  551. #ifndef GL_IMAGE_CUBE
  552. # define GL_IMAGE_CUBE 0x9050
  553. #endif // GL_IMAGE_CUBE
  554. #ifndef GL_INT_IMAGE_1D
  555. # define GL_INT_IMAGE_1D 0x9057
  556. #endif // GL_INT_IMAGE_1D
  557. #ifndef GL_INT_IMAGE_2D
  558. # define GL_INT_IMAGE_2D 0x9058
  559. #endif // GL_INT_IMAGE_2D
  560. #ifndef GL_INT_IMAGE_3D
  561. # define GL_INT_IMAGE_3D 0x9059
  562. #endif // GL_INT_IMAGE_3D
  563. #ifndef GL_INT_IMAGE_CUBE
  564. # define GL_INT_IMAGE_CUBE 0x905B
  565. #endif // GL_INT_IMAGE_CUBE
  566. #ifndef GL_UNSIGNED_INT_IMAGE_1D
  567. # define GL_UNSIGNED_INT_IMAGE_1D 0x9062
  568. #endif // GL_UNSIGNED_INT_IMAGE_1D
  569. #ifndef GL_UNSIGNED_INT_IMAGE_2D
  570. # define GL_UNSIGNED_INT_IMAGE_2D 0x9063
  571. #endif // GL_UNSIGNED_INT_IMAGE_2D
  572. #ifndef GL_UNSIGNED_INT_IMAGE_3D
  573. # define GL_UNSIGNED_INT_IMAGE_3D 0x9064
  574. #endif // GL_UNSIGNED_INT_IMAGE_3D
  575. #ifndef GL_UNSIGNED_INT_IMAGE_CUBE
  576. # define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
  577. #endif // GL_UNSIGNED_INT_IMAGE_CUBE
  578. #ifndef GL_PROGRAM_INPUT
  579. # define GL_PROGRAM_INPUT 0x92E3
  580. #endif // GL_PROGRAM_INPUT
  581. #ifndef GL_ACTIVE_RESOURCES
  582. # define GL_ACTIVE_RESOURCES 0x92F5
  583. #endif // GL_ACTIVE_RESOURCES
  584. #ifndef GL_UNIFORM
  585. # define GL_UNIFORM 0x92E1
  586. #endif // GL_UNIFORM
  587. #ifndef GL_BUFFER_VARIABLE
  588. # define GL_BUFFER_VARIABLE 0x92E5
  589. #endif // GL_BUFFER_VARIABLE
  590. #ifndef GL_UNSIGNED_INT_VEC2
  591. # define GL_UNSIGNED_INT_VEC2 0x8DC6
  592. #endif // GL_UNSIGNED_INT_VEC2
  593. #ifndef GL_UNSIGNED_INT_VEC3
  594. # define GL_UNSIGNED_INT_VEC3 0x8DC7
  595. #endif // GL_UNSIGNED_INT_VEC3
  596. #ifndef GL_UNSIGNED_INT_VEC4
  597. # define GL_UNSIGNED_INT_VEC4 0x8DC8
  598. #endif // GL_UNSIGNED_INT_VEC4
  599. #ifndef GL_TYPE
  600. # define GL_TYPE 0x92FA
  601. #endif // GL_TYPE
  602. #ifndef GL_ARRAY_SIZE
  603. # define GL_ARRAY_SIZE 0x92FB
  604. #endif // GL_ARRAY_SIZE
  605. #ifndef GL_LOCATION
  606. # define GL_LOCATION 0x930E
  607. #endif // GL_LOCATION
  608. #ifndef GL_UNSIGNED_INT_10_10_10_2
  609. # define GL_UNSIGNED_INT_10_10_10_2 0x8DF6
  610. #endif // GL_UNSIGNED_INT_10_10_10_2
  611. #ifndef GL_FRAMEBUFFER_SRGB
  612. # define GL_FRAMEBUFFER_SRGB 0x8DB9
  613. #endif // GL_FRAMEBUFFER_SRGB
  614. #ifndef GL_NUM_EXTENSIONS
  615. # define GL_NUM_EXTENSIONS 0x821D
  616. #endif // GL_NUM_EXTENSIONS
  617. #ifndef GL_SAMPLE_ALPHA_TO_COVERAGE
  618. # define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
  619. #endif // GL_SAMPLE_ALPHA_TO_COVERAGE
  620. #ifndef GL_CONSERVATIVE_RASTERIZATION_NV
  621. # define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346
  622. #endif // GL_CONSERVATIVE_RASTERIZATION_NV
  623. #ifndef GL_NEGATIVE_ONE_TO_ONE
  624. # define GL_NEGATIVE_ONE_TO_ONE 0x935E
  625. #endif // GL_NEGATIVE_ONE_TO_ONE
  626. #ifndef GL_ZERO_TO_ONE
  627. # define GL_ZERO_TO_ONE 0x935F
  628. #endif // GL_ZERO_TO_ONE
  629. #ifndef GL_LOWER_LEFT
  630. # define GL_LOWER_LEFT 0x8CA1
  631. #endif // GL_LOWER_LEFT
  632. #ifndef GL_UPPER_LEFT
  633. # define GL_UPPER_LEFT 0x8CA2
  634. #endif // GL_UPPER_LEFT
  635. // _KHR or _ARB...
  636. #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
  637. #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
  638. #define GL_DEBUG_CALLBACK_FUNCTION 0x8244
  639. #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
  640. #define GL_DEBUG_SOURCE_API 0x8246
  641. #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
  642. #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
  643. #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
  644. #define GL_DEBUG_SOURCE_APPLICATION 0x824A
  645. #define GL_DEBUG_SOURCE_OTHER 0x824B
  646. #define GL_DEBUG_TYPE_ERROR 0x824C
  647. #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
  648. #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
  649. #define GL_DEBUG_TYPE_PORTABILITY 0x824F
  650. #define GL_DEBUG_TYPE_PERFORMANCE 0x8250
  651. #define GL_DEBUG_TYPE_OTHER 0x8251
  652. #define GL_DEBUG_TYPE_MARKER 0x8268
  653. #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
  654. #define GL_DEBUG_TYPE_POP_GROUP 0x826A
  655. #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
  656. #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
  657. #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
  658. #define GL_MAX_LABEL_LENGTH 0x82E8
  659. #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
  660. #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
  661. #define GL_DEBUG_LOGGED_MESSAGES 0x9145
  662. #define GL_DEBUG_SEVERITY_HIGH 0x9146
  663. #define GL_DEBUG_SEVERITY_MEDIUM 0x9147
  664. #define GL_DEBUG_SEVERITY_LOW 0x9148
  665. #ifndef GL_DEPTH_CLAMP
  666. # define GL_DEPTH_CLAMP 0x864F
  667. #endif // GL_DEPTH_CLAMP
  668. #ifndef GL_TEXTURE_BORDER_COLOR
  669. # define GL_TEXTURE_BORDER_COLOR 0x1004
  670. #endif // GL_TEXTURE_BORDER_COLOR
  671. #ifndef GL_CLAMP_TO_BORDER
  672. # define GL_CLAMP_TO_BORDER 0x812D
  673. #endif // GL_CLAMP_TO_BORDER
  674. #ifndef GL_TEXTURE_CUBE_MAP_SEAMLESS
  675. # define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
  676. #endif // GL_TEXTURE_CUBE_MAP_SEAMLESS
  677. #ifndef GL_TEXTURE_2D_MULTISAMPLE
  678. # define GL_TEXTURE_2D_MULTISAMPLE 0x9100
  679. #endif // GL_TEXTURE_2D_MULTISAMPLE
  680. #ifndef GL_DRAW_INDIRECT_BUFFER
  681. # define GL_DRAW_INDIRECT_BUFFER 0x8F3F
  682. #endif // GL_DRAW_INDIRECT_BUFFER
  683. #ifndef GL_DISPATCH_INDIRECT_BUFFER
  684. # define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
  685. #endif // GL_DISPATCH_INDIRECT_BUFFER
  686. #ifndef GL_MAX_NAME_LENGTH
  687. # define GL_MAX_NAME_LENGTH 0x92F6
  688. #endif // GL_MAX_NAME_LENGTH
  689. #if BX_PLATFORM_NACL
  690. # include "glcontext_ppapi.h"
  691. #elif BX_PLATFORM_WINDOWS
  692. # include <windows.h>
  693. #elif BX_PLATFORM_LINUX || BX_PLATFORM_BSD
  694. # include "glcontext_glx.h"
  695. #elif BX_PLATFORM_OSX
  696. # include "glcontext_nsgl.h"
  697. #elif BX_PLATFORM_IOS
  698. # include "glcontext_eagl.h"
  699. #endif // BX_PLATFORM_
  700. #if BGFX_USE_WGL
  701. # include "glcontext_wgl.h"
  702. #endif // BGFX_USE_WGL
  703. #ifndef GL_APIENTRY
  704. # define GL_APIENTRY APIENTRY
  705. #endif // GL_APIENTRY
  706. #ifndef GL_APIENTRYP
  707. # define GL_APIENTRYP GL_APIENTRY*
  708. #endif // GL_APIENTRYP
  709. #if !BGFX_CONFIG_RENDERER_OPENGL
  710. # define glClearDepth glClearDepthf
  711. #endif // !BGFX_CONFIG_RENDERER_OPENGL
  712. namespace bgfx
  713. {
  714. class UniformBuffer;
  715. } // namespace bgfx
  716. namespace bgfx { namespace gl
  717. {
  718. #if BGFX_CONFIG_USE_OVR
  719. struct OVRBufferGL : public OVRBufferI
  720. {
  721. virtual void create(const ovrSession& _session, int _eyeIdx, int _msaaSamples) BX_OVERRIDE;
  722. virtual void destroy(const ovrSession& _session) BX_OVERRIDE;
  723. virtual void render(const ovrSession& _session) BX_OVERRIDE;
  724. virtual void postRender(const ovrSession& _sesion) BX_OVERRIDE;
  725. GLuint m_eyeFbo;
  726. GLuint m_eyeTexId;
  727. GLuint m_depthBuffer;
  728. GLuint m_msaaEyeFbo;
  729. GLuint m_msaaEyeTexId;
  730. GLuint m_msaaDepthBuffer;
  731. };
  732. struct OVRMirrorGL : public OVRMirrorI
  733. {
  734. virtual void create(const ovrSession& _session, int _width, int _height) BX_OVERRIDE;
  735. virtual void destroy(const ovrSession& _session) BX_OVERRIDE;
  736. virtual void blit(const ovrSession& _session) BX_OVERRIDE;
  737. GLuint m_mirrorFBO;
  738. };
  739. #endif // BGFX_CONFIG_USE_OVR
  740. void dumpExtensions(const char* _extensions);
  741. const char* glEnumName(GLenum _enum);
  742. #define _GL_CHECK(_check, _call) \
  743. BX_MACRO_BLOCK_BEGIN \
  744. /*BX_TRACE(#_call);*/ \
  745. _call; \
  746. GLenum gl_err = glGetError(); \
  747. _check(0 == gl_err, #_call "; GL error 0x%x: %s", gl_err, glEnumName(gl_err) ); \
  748. BX_UNUSED(gl_err); \
  749. BX_MACRO_BLOCK_END
  750. #define IGNORE_GL_ERROR_CHECK(...) BX_NOOP()
  751. #if BGFX_CONFIG_DEBUG
  752. # define GL_CHECK(_call) _GL_CHECK(BX_CHECK, _call)
  753. # define GL_CHECK_I(_call) _GL_CHECK(IGNORE_GL_ERROR_CHECK, _call)
  754. #else
  755. # define GL_CHECK(_call) _call
  756. # define GL_CHECK_I(_call) _call
  757. #endif // BGFX_CONFIG_DEBUG
  758. #define GL_IMPORT_TYPEDEFS 1
  759. #define GL_IMPORT(_optional, _proto, _func, _import) extern _proto _func
  760. #include "glimports.h"
  761. class VaoStateCache
  762. {
  763. public:
  764. GLuint add(uint32_t _hash)
  765. {
  766. invalidate(_hash);
  767. GLuint arrayId;
  768. GL_CHECK(glGenVertexArrays(1, &arrayId) );
  769. m_hashMap.insert(stl::make_pair(_hash, arrayId) );
  770. return arrayId;
  771. }
  772. GLuint find(uint32_t _hash)
  773. {
  774. HashMap::iterator it = m_hashMap.find(_hash);
  775. if (it != m_hashMap.end() )
  776. {
  777. return it->second;
  778. }
  779. return UINT32_MAX;
  780. }
  781. void invalidate(uint32_t _hash)
  782. {
  783. GL_CHECK(glBindVertexArray(0) );
  784. HashMap::iterator it = m_hashMap.find(_hash);
  785. if (it != m_hashMap.end() )
  786. {
  787. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  788. m_hashMap.erase(it);
  789. }
  790. }
  791. void invalidate()
  792. {
  793. GL_CHECK(glBindVertexArray(0) );
  794. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  795. {
  796. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  797. }
  798. m_hashMap.clear();
  799. }
  800. uint32_t getCount() const
  801. {
  802. return uint32_t(m_hashMap.size() );
  803. }
  804. private:
  805. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  806. HashMap m_hashMap;
  807. };
  808. class VaoCacheRef
  809. {
  810. public:
  811. void add(uint32_t _hash)
  812. {
  813. m_vaoSet.insert(_hash);
  814. }
  815. void invalidate(VaoStateCache& _vaoCache)
  816. {
  817. for (VaoSet::iterator it = m_vaoSet.begin(), itEnd = m_vaoSet.end(); it != itEnd; ++it)
  818. {
  819. _vaoCache.invalidate(*it);
  820. }
  821. m_vaoSet.clear();
  822. }
  823. typedef stl::unordered_set<uint32_t> VaoSet;
  824. VaoSet m_vaoSet;
  825. };
  826. class SamplerStateCache
  827. {
  828. public:
  829. GLuint add(uint32_t _hash)
  830. {
  831. invalidate(_hash);
  832. GLuint samplerId;
  833. GL_CHECK(glGenSamplers(1, &samplerId) );
  834. m_hashMap.insert(stl::make_pair(_hash, samplerId) );
  835. return samplerId;
  836. }
  837. GLuint find(uint32_t _hash)
  838. {
  839. HashMap::iterator it = m_hashMap.find(_hash);
  840. if (it != m_hashMap.end() )
  841. {
  842. return it->second;
  843. }
  844. return UINT32_MAX;
  845. }
  846. void invalidate(uint32_t _hash)
  847. {
  848. HashMap::iterator it = m_hashMap.find(_hash);
  849. if (it != m_hashMap.end() )
  850. {
  851. GL_CHECK(glDeleteSamplers(1, &it->second) );
  852. m_hashMap.erase(it);
  853. }
  854. }
  855. void invalidate()
  856. {
  857. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  858. {
  859. GL_CHECK(glDeleteSamplers(1, &it->second) );
  860. }
  861. m_hashMap.clear();
  862. }
  863. uint32_t getCount() const
  864. {
  865. return uint32_t(m_hashMap.size() );
  866. }
  867. private:
  868. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  869. HashMap m_hashMap;
  870. };
  871. struct IndexBufferGL
  872. {
  873. void create(uint32_t _size, void* _data, uint16_t _flags)
  874. {
  875. m_size = _size;
  876. m_flags = _flags;
  877. GL_CHECK(glGenBuffers(1, &m_id) );
  878. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  879. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  880. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
  881. , _size
  882. , _data
  883. , (NULL==_data) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW
  884. ) );
  885. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  886. }
  887. void update(uint32_t _offset, uint32_t _size, void* _data, bool _discard = false)
  888. {
  889. BX_CHECK(0 != m_id, "Updating invalid index buffer.");
  890. if (_discard)
  891. {
  892. // orphan buffer...
  893. destroy();
  894. create(m_size, NULL, m_flags);
  895. }
  896. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  897. GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
  898. , _offset
  899. , _size
  900. , _data
  901. ) );
  902. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  903. }
  904. void destroy();
  905. void add(uint32_t _hash)
  906. {
  907. m_vcref.add(_hash);
  908. }
  909. GLuint m_id;
  910. uint32_t m_size;
  911. VaoCacheRef m_vcref;
  912. uint16_t m_flags;
  913. };
  914. struct VertexBufferGL
  915. {
  916. void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle, uint16_t _flags)
  917. {
  918. m_size = _size;
  919. m_decl = _declHandle;
  920. const bool drawIndirect = 0 != (_flags & BGFX_BUFFER_DRAW_INDIRECT);
  921. m_target = drawIndirect ? GL_DRAW_INDIRECT_BUFFER : GL_ARRAY_BUFFER;
  922. GL_CHECK(glGenBuffers(1, &m_id) );
  923. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  924. GL_CHECK(glBindBuffer(m_target, m_id) );
  925. GL_CHECK(glBufferData(m_target
  926. , _size
  927. , _data
  928. , (NULL==_data) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW
  929. ) );
  930. GL_CHECK(glBindBuffer(m_target, 0) );
  931. }
  932. void update(uint32_t _offset, uint32_t _size, void* _data, bool _discard = false)
  933. {
  934. BX_CHECK(0 != m_id, "Updating invalid vertex buffer.");
  935. if (_discard)
  936. {
  937. // orphan buffer...
  938. destroy();
  939. create(m_size, NULL, m_decl, 0);
  940. }
  941. GL_CHECK(glBindBuffer(m_target, m_id) );
  942. GL_CHECK(glBufferSubData(m_target
  943. , _offset
  944. , _size
  945. , _data
  946. ) );
  947. GL_CHECK(glBindBuffer(m_target, 0) );
  948. }
  949. void destroy();
  950. void add(uint32_t _hash)
  951. {
  952. m_vcref.add(_hash);
  953. }
  954. GLuint m_id;
  955. GLenum m_target;
  956. uint32_t m_size;
  957. VertexDeclHandle m_decl;
  958. VaoCacheRef m_vcref;
  959. };
  960. struct TextureGL
  961. {
  962. TextureGL()
  963. : m_id(0)
  964. , m_rbo(0)
  965. , m_target(GL_TEXTURE_2D)
  966. , m_fmt(GL_ZERO)
  967. , m_type(GL_ZERO)
  968. , m_flags(0)
  969. , m_currentSamplerHash(UINT32_MAX)
  970. , m_numMips(0)
  971. {
  972. }
  973. bool init(GLenum _target, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips, uint32_t _flags);
  974. void create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
  975. void destroy();
  976. void overrideInternal(uintptr_t _ptr);
  977. void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
  978. void setSamplerState(uint32_t _flags, const float _rgba[4]);
  979. void commit(uint32_t _stage, uint32_t _flags, const float _palette[][4]);
  980. GLuint m_id;
  981. GLuint m_rbo;
  982. GLenum m_target;
  983. GLenum m_fmt;
  984. GLenum m_type;
  985. uint32_t m_flags;
  986. uint32_t m_currentSamplerHash;
  987. uint32_t m_width;
  988. uint32_t m_height;
  989. uint32_t m_depth;
  990. uint8_t m_numMips;
  991. uint8_t m_requestedFormat;
  992. uint8_t m_textureFormat;
  993. };
  994. struct ShaderGL
  995. {
  996. ShaderGL()
  997. : m_id(0)
  998. , m_type(0)
  999. , m_hash(0)
  1000. {
  1001. }
  1002. void create(Memory* _mem);
  1003. void destroy();
  1004. GLuint m_id;
  1005. GLenum m_type;
  1006. uint32_t m_hash;
  1007. };
  1008. struct FrameBufferGL
  1009. {
  1010. FrameBufferGL()
  1011. : m_swapChain(NULL)
  1012. , m_denseIdx(UINT16_MAX)
  1013. , m_num(0)
  1014. {
  1015. memset(m_fbo, 0, sizeof(m_fbo) );
  1016. }
  1017. void create(uint8_t _num, const Attachment* _attachment);
  1018. void create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat);
  1019. void postReset();
  1020. uint16_t destroy();
  1021. void resolve();
  1022. void discard(uint16_t _flags);
  1023. SwapChainGL* m_swapChain;
  1024. GLuint m_fbo[2];
  1025. uint32_t m_width;
  1026. uint32_t m_height;
  1027. uint16_t m_denseIdx;
  1028. uint8_t m_num;
  1029. uint8_t m_numTh;
  1030. Attachment m_attachment[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  1031. };
  1032. struct ProgramGL
  1033. {
  1034. ProgramGL()
  1035. : m_id(0)
  1036. , m_constantBuffer(NULL)
  1037. , m_numPredefined(0)
  1038. {
  1039. }
  1040. void create(const ShaderGL& _vsh, const ShaderGL& _fsh);
  1041. void destroy();
  1042. void init();
  1043. void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
  1044. void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
  1045. void add(uint32_t _hash)
  1046. {
  1047. m_vcref.add(_hash);
  1048. }
  1049. GLuint m_id;
  1050. uint8_t m_used[Attrib::Count+1]; // dense
  1051. GLint m_attributes[Attrib::Count]; // sparse
  1052. GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1];
  1053. GLint m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
  1054. uint8_t m_numSamplers;
  1055. UniformBuffer* m_constantBuffer;
  1056. PredefinedUniform m_predefined[PredefinedUniform::Count];
  1057. uint8_t m_numPredefined;
  1058. VaoCacheRef m_vcref;
  1059. };
  1060. struct TimerQueryGL
  1061. {
  1062. TimerQueryGL()
  1063. : m_control(BX_COUNTOF(m_frame) )
  1064. {
  1065. }
  1066. void create()
  1067. {
  1068. for (uint32_t ii = 0; ii < BX_COUNTOF(m_frame); ++ii)
  1069. {
  1070. Frame& frame = m_frame[ii];
  1071. GL_CHECK(glGenQueries(1, &frame.m_begin) );
  1072. GL_CHECK(glGenQueries(1, &frame.m_elapsed) );
  1073. }
  1074. }
  1075. void destroy()
  1076. {
  1077. for (uint32_t ii = 0; ii < BX_COUNTOF(m_frame); ++ii)
  1078. {
  1079. Frame& frame = m_frame[ii];
  1080. GL_CHECK(glDeleteQueries(1, &frame.m_begin) );
  1081. GL_CHECK(glDeleteQueries(1, &frame.m_elapsed) );
  1082. }
  1083. }
  1084. void begin()
  1085. {
  1086. while (0 == m_control.reserve(1) )
  1087. {
  1088. get();
  1089. }
  1090. Frame& frame = m_frame[m_control.m_current];
  1091. if (!BX_ENABLED(BX_PLATFORM_OSX) )
  1092. {
  1093. GL_CHECK(glQueryCounter(frame.m_begin
  1094. , GL_TIMESTAMP
  1095. ) );
  1096. }
  1097. GL_CHECK(glBeginQuery(GL_TIME_ELAPSED
  1098. , frame.m_elapsed
  1099. ) );
  1100. }
  1101. void end()
  1102. {
  1103. GL_CHECK(glEndQuery(GL_TIME_ELAPSED) );
  1104. m_control.commit(1);
  1105. }
  1106. bool get()
  1107. {
  1108. if (0 != m_control.available() )
  1109. {
  1110. Frame& frame = m_frame[m_control.m_read];
  1111. GLint available;
  1112. GL_CHECK(glGetQueryObjectiv(frame.m_elapsed
  1113. , GL_QUERY_RESULT_AVAILABLE
  1114. , &available
  1115. ) );
  1116. if (available)
  1117. {
  1118. if (!BX_ENABLED(BX_PLATFORM_OSX) )
  1119. {
  1120. GL_CHECK(glGetQueryObjectui64v(frame.m_begin
  1121. , GL_QUERY_RESULT
  1122. , &m_begin
  1123. ) );
  1124. }
  1125. else
  1126. {
  1127. m_begin = 0;
  1128. }
  1129. GL_CHECK(glGetQueryObjectui64v(frame.m_elapsed
  1130. , GL_QUERY_RESULT
  1131. , &m_elapsed
  1132. ) );
  1133. m_end = m_begin + m_elapsed;
  1134. m_control.consume(1);
  1135. return true;
  1136. }
  1137. }
  1138. return false;
  1139. }
  1140. uint64_t m_begin;
  1141. uint64_t m_end;
  1142. uint64_t m_elapsed;
  1143. struct Frame
  1144. {
  1145. GLuint m_begin;
  1146. GLuint m_elapsed;
  1147. };
  1148. Frame m_frame[4];
  1149. bx::RingBufferControl m_control;
  1150. };
  1151. struct OcclusionQueryGL
  1152. {
  1153. OcclusionQueryGL()
  1154. : m_control(BX_COUNTOF(m_query) )
  1155. {
  1156. }
  1157. void create();
  1158. void destroy();
  1159. void begin(Frame* _render, OcclusionQueryHandle _handle);
  1160. void end();
  1161. void resolve(Frame* _render, bool _wait = false);
  1162. struct Query
  1163. {
  1164. GLuint m_id;
  1165. OcclusionQueryHandle m_handle;
  1166. };
  1167. Query m_query[BGFX_CONFIG_MAX_OCCUSION_QUERIES];
  1168. bx::RingBufferControl m_control;
  1169. };
  1170. } /* namespace gl */ } // namespace bgfx
  1171. #endif // BGFX_RENDERER_GL_H_HEADER_GUARD