renderer_gl.h 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. /*
  2. * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/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_FREEBSD \
  12. || BX_PLATFORM_QNX \
  13. || BX_PLATFORM_RPI \
  14. || BX_PLATFORM_WINDOWS \
  15. ) )
  16. #define BGFX_USE_WGL (BGFX_CONFIG_RENDERER_OPENGL && BX_PLATFORM_WINDOWS)
  17. #define BGFX_USE_GLX (BGFX_CONFIG_RENDERER_OPENGL && (0 \
  18. || BX_PLATFORM_LINUX \
  19. || BX_PLATFORM_FREEBSD \
  20. ) )
  21. #define BGFX_USE_GL_DYNAMIC_LIB (0 \
  22. || BX_PLATFORM_LINUX \
  23. || BX_PLATFORM_FREEBSD \
  24. || BX_PLATFORM_OSX \
  25. || BX_PLATFORM_WINDOWS \
  26. )
  27. #if BGFX_CONFIG_RENDERER_OPENGL
  28. # if BGFX_CONFIG_RENDERER_OPENGL >= 31
  29. # include <gl/glcorearb.h>
  30. # if BX_PLATFORM_OSX
  31. # define GL_ARB_shader_objects // OSX collsion with GLhandleARB in gltypes.h
  32. # endif // BX_PLATFORM_OSX
  33. # else
  34. # if BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
  35. # define GL_PROTOTYPES
  36. # define GL_GLEXT_LEGACY
  37. # include <GL/gl.h>
  38. # undef GL_PROTOTYPES
  39. # elif BX_PLATFORM_OSX
  40. # define GL_GLEXT_LEGACY
  41. # define long ptrdiff_t
  42. # include <OpenGL/gl.h>
  43. # undef long
  44. # undef GL_VERSION_1_2
  45. # undef GL_VERSION_1_3
  46. # undef GL_VERSION_1_4
  47. # undef GL_VERSION_1_5
  48. # undef GL_VERSION_2_0
  49. # else
  50. # include <GL/gl.h>
  51. # endif // BX_PLATFORM_
  52. # include <gl/glext.h>
  53. # endif // BGFX_CONFIG_RENDERER_OPENGL >= 31
  54. #elif BGFX_CONFIG_RENDERER_OPENGLES
  55. typedef double GLdouble;
  56. # if BGFX_CONFIG_RENDERER_OPENGLES < 30
  57. # if BX_PLATFORM_IOS
  58. # include <OpenGLES/ES2/gl.h>
  59. # include <OpenGLES/ES2/glext.h>
  60. //#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6
  61. #define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368
  62. #define GL_TEXTURE_3D_OES 0x806F
  63. #define GL_SAMPLER_3D_OES 0x8B5F
  64. #define GL_TEXTURE_WRAP_R_OES 0x8072
  65. #define GL_PROGRAM_BINARY_LENGTH_OES 0x8741
  66. # else
  67. # include <GLES2/gl2platform.h>
  68. # include <GLES2/gl2.h>
  69. # include <GLES2/gl2ext.h>
  70. # endif // BX_PLATFORM_
  71. typedef int64_t GLint64;
  72. typedef uint64_t GLuint64;
  73. # define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES
  74. # define GL_HALF_FLOAT GL_HALF_FLOAT_OES
  75. # define GL_RGBA8 GL_RGBA8_OES
  76. # define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT
  77. # define GL_TEXTURE_3D GL_TEXTURE_3D_OES
  78. # define GL_SAMPLER_3D GL_SAMPLER_3D_OES
  79. # define GL_TEXTURE_WRAP_R GL_TEXTURE_WRAP_R_OES
  80. # define GL_MIN GL_MIN_EXT
  81. # define GL_MAX GL_MAX_EXT
  82. # define GL_DEPTH_COMPONENT24 GL_DEPTH_COMPONENT24_OES
  83. # define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES
  84. # define GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT32_OES
  85. # define GL_UNSIGNED_INT_24_8 GL_UNSIGNED_INT_24_8_OES
  86. # elif BGFX_CONFIG_RENDERER_OPENGLES >= 30
  87. # include <GLES3/gl3platform.h>
  88. # include <GLES3/gl3.h>
  89. # include <GLES3/gl3ext.h>
  90. # endif // BGFX_CONFIG_RENDERER_
  91. # if BGFX_USE_EGL
  92. # include "glcontext_egl.h"
  93. # endif // BGFX_USE_EGL
  94. # if BX_PLATFORM_EMSCRIPTEN
  95. # include <emscripten/emscripten.h>
  96. # endif // BX_PLATFORM_EMSCRIPTEN
  97. #endif // BGFX_CONFIG_RENDERER_OPENGL
  98. #include "renderer.h"
  99. #include "ovr.h"
  100. #include "renderdoc.h"
  101. #ifndef GL_LUMINANCE
  102. # define GL_LUMINANCE 0x1909
  103. #endif // GL_LUMINANCE
  104. #ifndef GL_BGRA
  105. # define GL_BGRA 0x80E1
  106. #endif // GL_BGRA
  107. #ifndef GL_R8
  108. # define GL_R8 0x8229
  109. #endif // GL_R8
  110. #ifndef GL_R16
  111. # define GL_R16 0x822A
  112. #endif // GL_R16
  113. #ifndef GL_R16F
  114. # define GL_R16F 0x822D
  115. #endif // GL_R16F
  116. #ifndef GL_R32UI
  117. # define GL_R32UI 0x8236
  118. #endif // GL_R32UI
  119. #ifndef GL_R32F
  120. # define GL_R32F 0x822E
  121. #endif // GL_R32F
  122. #ifndef GL_RG8
  123. # define GL_RG8 0x822B
  124. #endif // GL_RG8
  125. #ifndef GL_RG16
  126. # define GL_RG16 0x822C
  127. #endif // GL_RG16
  128. #ifndef GL_RG16UI
  129. # define GL_RG16UI 0x823A
  130. #endif // GL_RG16UI
  131. #ifndef GL_RG16F
  132. # define GL_RG16F 0x822F
  133. #endif // GL_RG16F
  134. #ifndef GL_R32UI
  135. # define GL_R32UI 0x8236
  136. #endif // GL_R32UI
  137. #ifndef GL_RG32UI
  138. # define GL_RG32UI 0x823C
  139. #endif // GL_RG32UI
  140. #ifndef GL_RG32F
  141. # define GL_RG32F 0x8230
  142. #endif // GL_RG32F
  143. #ifndef GL_RGBA32UI
  144. # define GL_RGBA32UI 0x8D70
  145. #endif // GL_RGBA32UI
  146. #ifndef GL_RGBA32F
  147. # define GL_RGBA32F 0x8814
  148. #endif // GL_RGBA32F
  149. #ifndef GL_STENCIL_INDEX
  150. # define GL_STENCIL_INDEX 0x1901
  151. #endif // GL_STENCIL_INDEX
  152. #ifndef GL_RED
  153. # define GL_RED 0x1903
  154. #endif // GL_RED
  155. #ifndef GL_RED_INTEGER
  156. # define GL_RED_INTEGER 0x8D94
  157. #endif // GL_RED_INTEGER
  158. #ifndef GL_RG
  159. # define GL_RG 0x8227
  160. #endif // GL_RG
  161. #ifndef GL_RG_INTEGER
  162. # define GL_RG_INTEGER 0x8228
  163. #endif // GL_RG_INTEGER
  164. #ifndef GL_GREEN
  165. # define GL_GREEN 0x1904
  166. #endif // GL_GREEN
  167. #ifndef GL_BLUE
  168. # define GL_BLUE 0x1905
  169. #endif // GL_BLUE
  170. #ifndef GL_RGBA_INTEGER
  171. # define GL_RGBA_INTEGER 0x8D99
  172. #endif // GL_RGBA_INTEGER
  173. #ifndef GL_RGB10_A2
  174. # define GL_RGB10_A2 0x8059
  175. #endif // GL_RGB10_A2
  176. #ifndef GL_RGBA16
  177. # define GL_RGBA16 0x805B
  178. #endif // GL_RGBA16
  179. #ifndef GL_RGBA16F
  180. # define GL_RGBA16F 0x881A
  181. #endif // GL_RGBA16F
  182. #ifndef GL_R16UI
  183. # define GL_R16UI 0x8234
  184. #endif // GL_R16UI
  185. #ifndef GL_RGBA16UI
  186. # define GL_RGBA16UI 0x8D76
  187. #endif // GL_RGBA16UI
  188. #ifndef GL_R11F_G11F_B10F
  189. # define GL_R11F_G11F_B10F 0x8C3A
  190. #endif // GL_R11F_G11F_B10F
  191. #ifndef GL_UNSIGNED_INT_10F_11F_11F_REV
  192. # define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B
  193. #endif // GL_UNSIGNED_INT_10F_11F_11F_REV
  194. #ifndef GL_COMPRESSED_RGB_S3TC_DXT1_EXT
  195. # define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
  196. #endif // GL_COMPRESSED_RGB_S3TC_DXT1_EXT
  197. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  198. # define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
  199. #endif // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
  200. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  201. # define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
  202. #endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
  203. #ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  204. # define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
  205. #endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
  206. #ifndef GL_COMPRESSED_LUMINANCE_LATC1_EXT
  207. # define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70
  208. #endif // GL_COMPRESSED_LUMINANCE_LATC1_EXT
  209. #ifndef GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  210. # define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72
  211. #endif // GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT
  212. #ifndef GL_COMPRESSED_RED_RGTC1
  213. # define GL_COMPRESSED_RED_RGTC1 0x8DBB
  214. #endif // GL_COMPRESSED_RED_RGTC1
  215. #ifndef GL_COMPRESSED_RG_RGTC2
  216. # define GL_COMPRESSED_RG_RGTC2 0x8DBD
  217. #endif // GL_COMPRESSED_RG_RGTC2
  218. #ifndef GL_ETC1_RGB8_OES
  219. # define GL_ETC1_RGB8_OES 0x8D64
  220. #endif // GL_ETC1_RGB8_OES
  221. #ifndef GL_COMPRESSED_RGB8_ETC2
  222. # define GL_COMPRESSED_RGB8_ETC2 0x9274
  223. #endif // GL_COMPRESSED_RGB8_ETC2
  224. #ifndef GL_COMPRESSED_RGBA8_ETC2_EAC
  225. # define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278
  226. #endif // GL_COMPRESSED_RGBA8_ETC2_EAC
  227. #ifndef GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
  228. # define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276
  229. #endif // GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2
  230. #ifndef GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
  231. # define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01
  232. #endif // GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG
  233. #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
  234. # define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03
  235. #endif // GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
  236. #ifndef GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
  237. # define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00
  238. #endif // GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG
  239. #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
  240. # define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02
  241. #endif // GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG
  242. #ifndef GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
  243. # define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137
  244. #endif // GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG
  245. #ifndef GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
  246. # define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138
  247. #endif // GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG
  248. #ifndef GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
  249. # define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54
  250. #endif // GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT
  251. #ifndef GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
  252. # define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55
  253. #endif // GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT
  254. #ifndef GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
  255. # define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56
  256. #endif // GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT
  257. #ifndef GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
  258. # define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57
  259. #endif // GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT
  260. #ifndef GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
  261. # define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
  262. #endif // GL_COMPRESSED_RGBA_BPTC_UNORM_ARB
  263. #ifndef GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
  264. # define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
  265. #endif // GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB
  266. #ifndef GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
  267. # define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
  268. #endif // GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB
  269. #ifndef GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
  270. # define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
  271. #endif // GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB
  272. #ifndef GL_SRGB8_ALPHA8
  273. # define GL_SRGB8_ALPHA8 0x8C43
  274. #endif // GL_SRGB8_ALPHA8
  275. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
  276. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D
  277. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
  278. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
  279. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E
  280. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
  281. #ifndef GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
  282. # define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F
  283. #endif // GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
  284. #ifndef GL_COMPRESSED_SRGB8_ETC2
  285. # define GL_COMPRESSED_SRGB8_ETC2 0x9275
  286. #endif // GL_COMPRESSED_SRGB8_ETC2
  287. #ifndef GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
  288. # define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277
  289. #endif // GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2
  290. #ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  291. # define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
  292. #endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
  293. #ifndef GL_TEXTURE_MAX_ANISOTROPY_EXT
  294. # define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE
  295. #endif // GL_TEXTURE_MAX_ANISOTROPY_EXT
  296. #ifndef GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  297. # define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF
  298. #endif // GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
  299. #ifndef GL_TEXTURE_SWIZZLE_RGBA
  300. # define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
  301. #endif // GL_TEXTURE_SWIZZLE_RGBA
  302. #ifndef GL_MAX_SAMPLES
  303. # define GL_MAX_SAMPLES 0x8D57
  304. #endif // GL_MAX_SAMPLES
  305. #ifndef GL_MAX_COLOR_ATTACHMENTS
  306. # define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
  307. #endif // GL_MAX_COLOR_ATTACHMENTS
  308. #ifndef GL_MAX_DRAW_BUFFERS
  309. # define GL_MAX_DRAW_BUFFERS 0x8824
  310. #endif // GL_MAX_DRAW_BUFFERS
  311. #ifndef GL_QUERY_RESULT
  312. # define GL_QUERY_RESULT 0x8866
  313. #endif // GL_QUERY_RESULT
  314. #ifndef GL_READ_FRAMEBUFFER
  315. # define GL_READ_FRAMEBUFFER 0x8CA8
  316. #endif /// GL_READ_FRAMEBUFFER
  317. #ifndef GL_DRAW_FRAMEBUFFER
  318. # define GL_DRAW_FRAMEBUFFER 0x8CA9
  319. #endif // GL_DRAW_FRAMEBUFFER
  320. #ifndef GL_TIME_ELAPSED
  321. # define GL_TIME_ELAPSED 0x88BF
  322. #endif // GL_TIME_ELAPSED
  323. #ifndef GL_VBO_FREE_MEMORY_ATI
  324. # define GL_VBO_FREE_MEMORY_ATI 0x87FB
  325. #endif // GL_VBO_FREE_MEMORY_ATI
  326. #ifndef GL_TEXTURE_FREE_MEMORY_ATI
  327. # define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
  328. #endif // GL_TEXTURE_FREE_MEMORY_ATI
  329. #ifndef GL_RENDERBUFFER_FREE_MEMORY_ATI
  330. # define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
  331. #endif // GL_RENDERBUFFER_FREE_MEMORY_ATI
  332. // http://developer.download.nvidia.com/opengl/specs/GL_NVX_gpu_memory_info.txt
  333. #ifndef GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  334. # define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
  335. #endif // GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX
  336. #ifndef GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  337. # define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
  338. #endif // GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX
  339. #ifndef GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  340. # define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
  341. #endif // GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX
  342. #ifndef GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  343. # define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
  344. #endif // GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX
  345. #ifndef GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  346. # define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
  347. #endif // GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX
  348. #ifndef GL_UNPACK_ROW_LENGTH
  349. # define GL_UNPACK_ROW_LENGTH 0x0CF2
  350. #endif // GL_UNPACK_ROW_LENGTH
  351. #ifndef GL_DEPTH_STENCIL
  352. # define GL_DEPTH_STENCIL 0x84F9
  353. #endif // GL_DEPTH_STENCIL
  354. #ifndef GL_DEPTH_COMPONENT32
  355. # define GL_DEPTH_COMPONENT32 0x81A7
  356. #endif // GL_DEPTH_COMPONENT32
  357. #ifndef GL_DEPTH_COMPONENT32F
  358. # define GL_DEPTH_COMPONENT32F 0x8CAC
  359. #endif // GL_DEPTH_COMPONENT32F
  360. #ifndef GL_DEPTH_STENCIL_ATTACHMENT
  361. # define GL_DEPTH_STENCIL_ATTACHMENT 0x821A
  362. #endif // GL_DEPTH_STENCIL_ATTACHMENT
  363. #ifndef GL_TEXTURE_COMPARE_MODE
  364. # define GL_TEXTURE_COMPARE_MODE 0x884C
  365. #endif // GL_TEXTURE_COMPARE_MODE
  366. #ifndef GL_TEXTURE_COMPARE_FUNC
  367. # define GL_TEXTURE_COMPARE_FUNC 0x884D
  368. #endif // GL_TEXTURE_COMPARE_FUNC
  369. #ifndef GL_COMPARE_REF_TO_TEXTURE
  370. # define GL_COMPARE_REF_TO_TEXTURE 0x884E
  371. #endif // GL_COMPARE_REF_TO_TEXTURE
  372. #ifndef GL_INT_SAMPLER_2D
  373. # define GL_INT_SAMPLER_2D 0x8DCA
  374. #endif // GL_INT_SAMPLER_2D
  375. #ifndef GL_UNSIGNED_INT_SAMPLER_2D
  376. # define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2
  377. #endif // GL_UNSIGNED_INT_SAMPLER_2D
  378. #ifndef GL_INT_SAMPLER_3D
  379. # define GL_INT_SAMPLER_3D 0x8DCB
  380. #endif // GL_INT_SAMPLER_3D
  381. #ifndef GL_UNSIGNED_INT_SAMPLER_3D
  382. # define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3
  383. #endif // GL_UNSIGNED_INT_SAMPLER_3D
  384. #ifndef GL_INT_SAMPLER_CUBE
  385. # define GL_INT_SAMPLER_CUBE 0x8DCC
  386. #endif // GL_INT_SAMPLER_CUBEER_3D
  387. #ifndef GL_UNSIGNED_INT_SAMPLER_CUBE
  388. # define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4
  389. #endif // GL_UNSIGNED_INT_SAMPLER_CUBE
  390. #ifndef GL_SAMPLER_2D_SHADOW
  391. # define GL_SAMPLER_2D_SHADOW 0x8B62
  392. #endif // GL_SAMPLER_2D_SHADOW
  393. #ifndef GL_TEXTURE_MAX_LEVEL
  394. # define GL_TEXTURE_MAX_LEVEL 0x813D
  395. #endif // GL_TEXTURE_MAX_LEVEL
  396. #ifndef GL_COMPUTE_SHADER
  397. # define GL_COMPUTE_SHADER 0x91B9
  398. #endif // GL_COMPUTE_SHADER
  399. #ifndef GL_READ_ONLY
  400. # define GL_READ_ONLY 0x88B8
  401. #endif // GL_READ_ONLY
  402. #ifndef GL_WRITE_ONLY
  403. # define GL_WRITE_ONLY 0x88B9
  404. #endif // GL_WRITE_ONLY
  405. #ifndef GL_READ_WRITE
  406. # define GL_READ_WRITE 0x88BA
  407. #endif // GL_READ_WRITE
  408. #ifndef GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
  409. # define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001
  410. #endif // GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT
  411. #ifndef GL_ELEMENT_ARRAY_BARRIER_BIT
  412. # define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002
  413. #endif // GL_ELEMENT_ARRAY_BARRIER_BIT
  414. #ifndef GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
  415. # define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020
  416. #endif // GL_SHADER_IMAGE_ACCESS_BARRIER_BIT
  417. #ifndef GL_SHADER_STORAGE_BARRIER_BIT
  418. # define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000
  419. #endif // GL_SHADER_STORAGE_BARRIER_BIT
  420. #ifndef GL_SHADER_STORAGE_BUFFER
  421. # define GL_SHADER_STORAGE_BUFFER 0x90D2
  422. #endif // GL_SHADER_STORAGE_BUFFER
  423. #ifndef GL_IMAGE_1D
  424. # define GL_IMAGE_1D 0x904C
  425. #endif // GL_IMAGE_1D
  426. #ifndef GL_IMAGE_2D
  427. # define GL_IMAGE_2D 0x904D
  428. #endif // GL_IMAGE_2D
  429. #ifndef GL_IMAGE_3D
  430. # define GL_IMAGE_3D 0x904E
  431. #endif // GL_IMAGE_3D
  432. #ifndef GL_IMAGE_CUBE
  433. # define GL_IMAGE_CUBE 0x9050
  434. #endif // GL_IMAGE_CUBE
  435. #ifndef GL_INT_IMAGE_1D
  436. # define GL_INT_IMAGE_1D 0x9057
  437. #endif // GL_INT_IMAGE_1D
  438. #ifndef GL_INT_IMAGE_2D
  439. # define GL_INT_IMAGE_2D 0x9058
  440. #endif // GL_INT_IMAGE_2D
  441. #ifndef GL_INT_IMAGE_3D
  442. # define GL_INT_IMAGE_3D 0x9059
  443. #endif // GL_INT_IMAGE_3D
  444. #ifndef GL_INT_IMAGE_CUBE
  445. # define GL_INT_IMAGE_CUBE 0x905B
  446. #endif // GL_INT_IMAGE_CUBE
  447. #ifndef GL_UNSIGNED_INT_IMAGE_1D
  448. # define GL_UNSIGNED_INT_IMAGE_1D 0x9062
  449. #endif // GL_UNSIGNED_INT_IMAGE_1D
  450. #ifndef GL_UNSIGNED_INT_IMAGE_2D
  451. # define GL_UNSIGNED_INT_IMAGE_2D 0x9063
  452. #endif // GL_UNSIGNED_INT_IMAGE_2D
  453. #ifndef GL_UNSIGNED_INT_IMAGE_3D
  454. # define GL_UNSIGNED_INT_IMAGE_3D 0x9064
  455. #endif // GL_UNSIGNED_INT_IMAGE_3D
  456. #ifndef GL_UNSIGNED_INT_IMAGE_CUBE
  457. # define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066
  458. #endif // GL_UNSIGNED_INT_IMAGE_CUBE
  459. #ifndef GL_PROGRAM_INPUT
  460. # define GL_PROGRAM_INPUT 0x92E3
  461. #endif // GL_PROGRAM_INPUT
  462. #ifndef GL_ACTIVE_RESOURCES
  463. # define GL_ACTIVE_RESOURCES 0x92F5
  464. #endif // GL_ACTIVE_RESOURCES
  465. #ifndef GL_UNIFORM
  466. # define GL_UNIFORM 0x92E1
  467. #endif // GL_UNIFORM
  468. #ifndef GL_BUFFER_VARIABLE
  469. # define GL_BUFFER_VARIABLE 0x92E5
  470. #endif // GL_BUFFER_VARIABLE
  471. #ifndef GL_UNSIGNED_INT_VEC2
  472. # define GL_UNSIGNED_INT_VEC2 0x8DC6
  473. #endif // GL_UNSIGNED_INT_VEC2
  474. #ifndef GL_UNSIGNED_INT_VEC3
  475. # define GL_UNSIGNED_INT_VEC3 0x8DC7
  476. #endif // GL_UNSIGNED_INT_VEC3
  477. #ifndef GL_UNSIGNED_INT_VEC4
  478. # define GL_UNSIGNED_INT_VEC4 0x8DC8
  479. #endif // GL_UNSIGNED_INT_VEC4
  480. #ifndef GL_TYPE
  481. # define GL_TYPE 0x92FA
  482. #endif // GL_TYPE
  483. #ifndef GL_ARRAY_SIZE
  484. # define GL_ARRAY_SIZE 0x92FB
  485. #endif // GL_ARRAY_SIZE
  486. #ifndef GL_LOCATION
  487. # define GL_LOCATION 0x930E
  488. #endif // GL_LOCATION
  489. #ifndef GL_UNSIGNED_INT_10_10_10_2
  490. # define GL_UNSIGNED_INT_10_10_10_2 0x8DF6
  491. #endif // GL_UNSIGNED_INT_10_10_10_2
  492. // _KHR or _ARB...
  493. #define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242
  494. #define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243
  495. #define GL_DEBUG_CALLBACK_FUNCTION 0x8244
  496. #define GL_DEBUG_CALLBACK_USER_PARAM 0x8245
  497. #define GL_DEBUG_SOURCE_API 0x8246
  498. #define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
  499. #define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
  500. #define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
  501. #define GL_DEBUG_SOURCE_APPLICATION 0x824A
  502. #define GL_DEBUG_SOURCE_OTHER 0x824B
  503. #define GL_DEBUG_TYPE_ERROR 0x824C
  504. #define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D
  505. #define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E
  506. #define GL_DEBUG_TYPE_PORTABILITY 0x824F
  507. #define GL_DEBUG_TYPE_PERFORMANCE 0x8250
  508. #define GL_DEBUG_TYPE_OTHER 0x8251
  509. #define GL_DEBUG_TYPE_MARKER 0x8268
  510. #define GL_DEBUG_TYPE_PUSH_GROUP 0x8269
  511. #define GL_DEBUG_TYPE_POP_GROUP 0x826A
  512. #define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
  513. #define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C
  514. #define GL_DEBUG_GROUP_STACK_DEPTH 0x826D
  515. #define GL_MAX_LABEL_LENGTH 0x82E8
  516. #define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143
  517. #define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144
  518. #define GL_DEBUG_LOGGED_MESSAGES 0x9145
  519. #define GL_DEBUG_SEVERITY_HIGH 0x9146
  520. #define GL_DEBUG_SEVERITY_MEDIUM 0x9147
  521. #define GL_DEBUG_SEVERITY_LOW 0x9148
  522. #ifndef GL_DEPTH_CLAMP
  523. # define GL_DEPTH_CLAMP 0x864F
  524. #endif // GL_DEPTH_CLAMP
  525. #ifndef GL_TEXTURE_CUBE_MAP_SEAMLESS
  526. # define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
  527. #endif // GL_TEXTURE_CUBE_MAP_SEAMLESS
  528. #ifndef GL_DRAW_INDIRECT_BUFFER
  529. # define GL_DRAW_INDIRECT_BUFFER 0x8F3F
  530. #endif // GL_DRAW_INDIRECT_BUFFER
  531. #ifndef GL_DISPATCH_INDIRECT_BUFFER
  532. # define GL_DISPATCH_INDIRECT_BUFFER 0x90EE
  533. #endif // GL_DISPATCH_INDIRECT_BUFFER
  534. #if BX_PLATFORM_NACL
  535. # include "glcontext_ppapi.h"
  536. #elif BX_PLATFORM_WINDOWS
  537. # include <windows.h>
  538. #elif BX_PLATFORM_LINUX || BX_PLATFORM_FREEBSD
  539. # include "glcontext_glx.h"
  540. #elif BX_PLATFORM_OSX
  541. # include "glcontext_nsgl.h"
  542. #elif BX_PLATFORM_IOS
  543. # include "glcontext_eagl.h"
  544. #endif // BX_PLATFORM_
  545. #if BGFX_USE_WGL
  546. # include "glcontext_wgl.h"
  547. #endif // BGFX_USE_WGL
  548. #ifndef GL_APIENTRY
  549. # define GL_APIENTRY APIENTRY
  550. #endif // GL_APIENTRY
  551. #ifndef GL_APIENTRYP
  552. # define GL_APIENTRYP GL_APIENTRY*
  553. #endif // GL_APIENTRYP
  554. #if !BGFX_CONFIG_RENDERER_OPENGL
  555. # define glClearDepth glClearDepthf
  556. #endif // !BGFX_CONFIG_RENDERER_OPENGL
  557. namespace bgfx
  558. {
  559. class ConstantBuffer;
  560. } // namespace bgfx
  561. namespace bgfx { namespace gl
  562. {
  563. void dumpExtensions(const char* _extensions);
  564. const char* glEnumName(GLenum _enum);
  565. #define _GL_CHECK(_check, _call) \
  566. BX_MACRO_BLOCK_BEGIN \
  567. /*BX_TRACE(#_call);*/ \
  568. _call; \
  569. GLenum gl_err = glGetError(); \
  570. _check(0 == gl_err, #_call "; GL error 0x%x: %s", gl_err, glEnumName(gl_err) ); \
  571. BX_UNUSED(gl_err); \
  572. BX_MACRO_BLOCK_END
  573. #define IGNORE_GL_ERROR_CHECK(...) BX_NOOP()
  574. #if BGFX_CONFIG_DEBUG
  575. # define GL_CHECK(_call) _GL_CHECK(BX_CHECK, _call)
  576. # define GL_CHECK_I(_call) _GL_CHECK(IGNORE_GL_ERROR_CHECK, _call)
  577. #else
  578. # define GL_CHECK(_call) _call
  579. # define GL_CHECK_I(_call) _call
  580. #endif // BGFX_CONFIG_DEBUG
  581. #define GL_IMPORT_TYPEDEFS 1
  582. #define GL_IMPORT(_optional, _proto, _func, _import) extern _proto _func
  583. #include "glimports.h"
  584. class VaoStateCache
  585. {
  586. public:
  587. GLuint add(uint32_t _hash)
  588. {
  589. invalidate(_hash);
  590. GLuint arrayId;
  591. GL_CHECK(glGenVertexArrays(1, &arrayId) );
  592. m_hashMap.insert(stl::make_pair(_hash, arrayId) );
  593. return arrayId;
  594. }
  595. GLuint find(uint32_t _hash)
  596. {
  597. HashMap::iterator it = m_hashMap.find(_hash);
  598. if (it != m_hashMap.end() )
  599. {
  600. return it->second;
  601. }
  602. return UINT32_MAX;
  603. }
  604. void invalidate(uint32_t _hash)
  605. {
  606. GL_CHECK(glBindVertexArray(0) );
  607. HashMap::iterator it = m_hashMap.find(_hash);
  608. if (it != m_hashMap.end() )
  609. {
  610. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  611. m_hashMap.erase(it);
  612. }
  613. }
  614. void invalidate()
  615. {
  616. GL_CHECK(glBindVertexArray(0) );
  617. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  618. {
  619. GL_CHECK(glDeleteVertexArrays(1, &it->second) );
  620. }
  621. m_hashMap.clear();
  622. }
  623. uint32_t getCount() const
  624. {
  625. return uint32_t(m_hashMap.size() );
  626. }
  627. private:
  628. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  629. HashMap m_hashMap;
  630. };
  631. class VaoCacheRef
  632. {
  633. public:
  634. void add(uint32_t _hash)
  635. {
  636. m_vaoSet.insert(_hash);
  637. }
  638. void invalidate(VaoStateCache& _vaoCache)
  639. {
  640. for (VaoSet::iterator it = m_vaoSet.begin(), itEnd = m_vaoSet.end(); it != itEnd; ++it)
  641. {
  642. _vaoCache.invalidate(*it);
  643. }
  644. m_vaoSet.clear();
  645. }
  646. typedef stl::unordered_set<uint32_t> VaoSet;
  647. VaoSet m_vaoSet;
  648. };
  649. class SamplerStateCache
  650. {
  651. public:
  652. GLuint add(uint32_t _hash)
  653. {
  654. invalidate(_hash);
  655. GLuint samplerId;
  656. GL_CHECK(glGenSamplers(1, &samplerId) );
  657. m_hashMap.insert(stl::make_pair(_hash, samplerId) );
  658. return samplerId;
  659. }
  660. GLuint find(uint32_t _hash)
  661. {
  662. HashMap::iterator it = m_hashMap.find(_hash);
  663. if (it != m_hashMap.end() )
  664. {
  665. return it->second;
  666. }
  667. return UINT32_MAX;
  668. }
  669. void invalidate(uint32_t _hash)
  670. {
  671. HashMap::iterator it = m_hashMap.find(_hash);
  672. if (it != m_hashMap.end() )
  673. {
  674. GL_CHECK(glDeleteSamplers(1, &it->second) );
  675. m_hashMap.erase(it);
  676. }
  677. }
  678. void invalidate()
  679. {
  680. for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
  681. {
  682. GL_CHECK(glDeleteSamplers(1, &it->second) );
  683. }
  684. m_hashMap.clear();
  685. }
  686. uint32_t getCount() const
  687. {
  688. return uint32_t(m_hashMap.size() );
  689. }
  690. private:
  691. typedef stl::unordered_map<uint32_t, GLuint> HashMap;
  692. HashMap m_hashMap;
  693. };
  694. struct IndexBufferGL
  695. {
  696. void create(uint32_t _size, void* _data, uint16_t _flags)
  697. {
  698. m_size = _size;
  699. m_flags = _flags;
  700. GL_CHECK(glGenBuffers(1, &m_id) );
  701. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  702. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  703. GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
  704. , _size
  705. , _data
  706. , (NULL==_data) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW
  707. ) );
  708. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  709. }
  710. void update(uint32_t _offset, uint32_t _size, void* _data)
  711. {
  712. BX_CHECK(0 != m_id, "Updating invalid index buffer.");
  713. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
  714. GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
  715. , _offset
  716. , _size
  717. , _data
  718. ) );
  719. GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
  720. }
  721. void destroy();
  722. void add(uint32_t _hash)
  723. {
  724. m_vcref.add(_hash);
  725. }
  726. GLuint m_id;
  727. uint32_t m_size;
  728. VaoCacheRef m_vcref;
  729. uint16_t m_flags;
  730. };
  731. struct VertexBufferGL
  732. {
  733. void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle, uint16_t _flags)
  734. {
  735. m_size = _size;
  736. m_decl = _declHandle;
  737. const bool drawIndirect = 0 != (_flags & BGFX_BUFFER_DRAW_INDIRECT);
  738. m_target = drawIndirect ? GL_DRAW_INDIRECT_BUFFER : GL_ARRAY_BUFFER;
  739. GL_CHECK(glGenBuffers(1, &m_id) );
  740. BX_CHECK(0 != m_id, "Failed to generate buffer id.");
  741. GL_CHECK(glBindBuffer(m_target, m_id) );
  742. GL_CHECK(glBufferData(m_target
  743. , _size
  744. , _data
  745. , (NULL==_data) ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW
  746. ) );
  747. GL_CHECK(glBindBuffer(m_target, 0) );
  748. }
  749. void update(uint32_t _offset, uint32_t _size, void* _data)
  750. {
  751. BX_CHECK(0 != m_id, "Updating invalid vertex buffer.");
  752. GL_CHECK(glBindBuffer(m_target, m_id) );
  753. GL_CHECK(glBufferSubData(m_target
  754. , _offset
  755. , _size
  756. , _data
  757. ) );
  758. GL_CHECK(glBindBuffer(m_target, 0) );
  759. }
  760. void destroy();
  761. void add(uint32_t _hash)
  762. {
  763. m_vcref.add(_hash);
  764. }
  765. GLuint m_id;
  766. GLenum m_target;
  767. uint32_t m_size;
  768. VertexDeclHandle m_decl;
  769. VaoCacheRef m_vcref;
  770. };
  771. struct TextureGL
  772. {
  773. TextureGL()
  774. : m_id(0)
  775. , m_rbo(0)
  776. , m_target(GL_TEXTURE_2D)
  777. , m_fmt(GL_ZERO)
  778. , m_type(GL_ZERO)
  779. , m_flags(0)
  780. , m_currentFlags(UINT32_MAX)
  781. , m_numMips(0)
  782. {
  783. }
  784. bool init(GLenum _target, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _format, uint8_t _numMips, uint32_t _flags);
  785. void create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
  786. void destroy();
  787. void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
  788. void setSamplerState(uint32_t _flags);
  789. void commit(uint32_t _stage, uint32_t _flags);
  790. GLuint m_id;
  791. GLuint m_rbo;
  792. GLenum m_target;
  793. GLenum m_fmt;
  794. GLenum m_type;
  795. uint32_t m_flags;
  796. uint32_t m_currentFlags;
  797. uint32_t m_width;
  798. uint32_t m_height;
  799. uint32_t m_depth;
  800. uint8_t m_numMips;
  801. uint8_t m_requestedFormat;
  802. uint8_t m_textureFormat;
  803. };
  804. struct ShaderGL
  805. {
  806. ShaderGL()
  807. : m_id(0)
  808. , m_type(0)
  809. , m_hash(0)
  810. {
  811. }
  812. void create(Memory* _mem);
  813. void destroy();
  814. GLuint m_id;
  815. GLenum m_type;
  816. uint32_t m_hash;
  817. };
  818. struct FrameBufferGL
  819. {
  820. FrameBufferGL()
  821. : m_swapChain(NULL)
  822. , m_denseIdx(UINT16_MAX)
  823. , m_num(0)
  824. {
  825. memset(m_fbo, 0, sizeof(m_fbo) );
  826. }
  827. void create(uint8_t _num, const TextureHandle* _handles);
  828. void create(uint16_t _denseIdx, void* _nwh, uint32_t _width, uint32_t _height, TextureFormat::Enum _depthFormat);
  829. void postReset();
  830. uint16_t destroy();
  831. void resolve();
  832. void discard(uint16_t _flags);
  833. SwapChainGL* m_swapChain;
  834. GLuint m_fbo[2];
  835. uint32_t m_width;
  836. uint32_t m_height;
  837. uint16_t m_denseIdx;
  838. uint8_t m_num;
  839. uint8_t m_numTh;
  840. TextureHandle m_th[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  841. };
  842. struct ProgramGL
  843. {
  844. ProgramGL()
  845. : m_id(0)
  846. , m_constantBuffer(NULL)
  847. , m_numPredefined(0)
  848. {
  849. }
  850. void create(const ShaderGL& _vsh, const ShaderGL& _fsh);
  851. void destroy();
  852. void init();
  853. void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
  854. void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
  855. void add(uint32_t _hash)
  856. {
  857. m_vcref.add(_hash);
  858. }
  859. GLuint m_id;
  860. uint8_t m_used[Attrib::Count+1]; // dense
  861. GLint m_attributes[Attrib::Count]; // sparse
  862. GLint m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT+1];
  863. GLint m_sampler[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
  864. uint8_t m_numSamplers;
  865. ConstantBuffer* m_constantBuffer;
  866. PredefinedUniform m_predefined[PredefinedUniform::Count];
  867. uint8_t m_numPredefined;
  868. VaoCacheRef m_vcref;
  869. };
  870. struct QueriesGL
  871. {
  872. void create()
  873. {
  874. glGenQueries(BX_COUNTOF(m_queries), m_queries);
  875. }
  876. void destroy()
  877. {
  878. glDeleteQueries(BX_COUNTOF(m_queries), m_queries);
  879. }
  880. void begin(uint16_t _id, GLenum _target) const
  881. {
  882. glBeginQuery(_target, m_queries[_id]);
  883. }
  884. void end(GLenum _target) const
  885. {
  886. glEndQuery(_target);
  887. }
  888. uint64_t getResult(uint16_t _id) const
  889. {
  890. uint64_t result;
  891. glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result);
  892. return result;
  893. }
  894. GLuint m_queries[64];
  895. };
  896. } /* namespace gl */ } // namespace bgfx
  897. #endif // BGFX_RENDERER_GL_H_HEADER_GUARD