gl.shim.ts 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { idFactory } from 'mol-util/id-factory'
  7. const c = {
  8. ACTIVE_ATTRIBUTE_MAX_LENGTH: 35722,
  9. ACTIVE_UNIFORM_MAX_LENGTH: 35719,
  10. INFO_LOG_LENGTH: 35716,
  11. NUM_COMPRESSED_TEXTURE_FORMATS: 34466,
  12. SHADER_COMPILER: 36346,
  13. SHADER_SOURCE_LENGTH: 35720,
  14. MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0x84FF,
  15. MAX_TEXTURE_IMAGE_UNITS_NV: 0x8872
  16. }
  17. const gl = {
  18. ACTIVE_ATTRIBUTES: 35721,
  19. ACTIVE_TEXTURE: 34016,
  20. ACTIVE_UNIFORMS: 35718,
  21. ALIASED_LINE_WIDTH_RANGE: 33902,
  22. ALIASED_POINT_SIZE_RANGE: 33901,
  23. ALPHA: 6406,
  24. ALPHA_BITS: 3413,
  25. ALWAYS: 519,
  26. ARRAY_BUFFER: 34962,
  27. ARRAY_BUFFER_BINDING: 34964,
  28. ATTACHED_SHADERS: 35717,
  29. BACK: 1029,
  30. BLEND: 3042,
  31. BLEND_COLOR: 32773,
  32. BLEND_DST_ALPHA: 32970,
  33. BLEND_DST_RGB: 32968,
  34. BLEND_EQUATION: 32777,
  35. BLEND_EQUATION_ALPHA: 34877,
  36. BLEND_EQUATION_RGB: 32777,
  37. BLEND_SRC_ALPHA: 32971,
  38. BLEND_SRC_RGB: 32969,
  39. BLUE_BITS: 3412,
  40. BOOL: 35670,
  41. BOOL_VEC2: 35671,
  42. BOOL_VEC3: 35672,
  43. BOOL_VEC4: 35673,
  44. BROWSER_DEFAULT_WEBGL: 37444,
  45. BUFFER_SIZE: 34660,
  46. BUFFER_USAGE: 34661,
  47. BYTE: 5120,
  48. CCW: 2305,
  49. CLAMP_TO_EDGE: 33071,
  50. COLOR_ATTACHMENT0: 36064,
  51. COLOR_BUFFER_BIT: 16384,
  52. COLOR_CLEAR_VALUE: 3106,
  53. COLOR_WRITEMASK: 3107,
  54. COMPILE_STATUS: 35713,
  55. COMPRESSED_TEXTURE_FORMATS: 34467,
  56. CONSTANT_ALPHA: 32771,
  57. CONSTANT_COLOR: 32769,
  58. CONTEXT_LOST_WEBGL: 37442,
  59. CULL_FACE: 2884,
  60. CULL_FACE_MODE: 2885,
  61. CURRENT_PROGRAM: 35725,
  62. CURRENT_VERTEX_ATTRIB: 34342,
  63. CW: 2304,
  64. DECR: 7683,
  65. DECR_WRAP: 34056,
  66. DELETE_STATUS: 35712,
  67. DEPTH_ATTACHMENT: 36096,
  68. DEPTH_BITS: 3414,
  69. DEPTH_BUFFER_BIT: 256,
  70. DEPTH_CLEAR_VALUE: 2931,
  71. DEPTH_COMPONENT: 6402,
  72. DEPTH_COMPONENT16: 33189,
  73. DEPTH_FUNC: 2932,
  74. DEPTH_RANGE: 2928,
  75. DEPTH_STENCIL: 34041,
  76. DEPTH_STENCIL_ATTACHMENT: 33306,
  77. DEPTH_TEST: 2929,
  78. DEPTH_WRITEMASK: 2930,
  79. DITHER: 3024,
  80. DONT_CARE: 4352,
  81. DST_ALPHA: 772,
  82. DST_COLOR: 774,
  83. DYNAMIC_DRAW: 35048,
  84. ELEMENT_ARRAY_BUFFER: 34963,
  85. ELEMENT_ARRAY_BUFFER_BINDING: 34965,
  86. EQUAL: 514,
  87. FASTEST: 4353,
  88. FLOAT: 5126,
  89. FLOAT_MAT2: 35674,
  90. FLOAT_MAT3: 35675,
  91. FLOAT_MAT4: 35676,
  92. FLOAT_VEC2: 35664,
  93. FLOAT_VEC3: 35665,
  94. FLOAT_VEC4: 35666,
  95. FRAGMENT_SHADER: 35632,
  96. FRAMEBUFFER: 36160,
  97. FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 36049,
  98. FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 36048,
  99. FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: 36051,
  100. FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: 36050,
  101. FRAMEBUFFER_BINDING: 36006,
  102. FRAMEBUFFER_COMPLETE: 36053,
  103. FRAMEBUFFER_INCOMPLETE_ATTACHMENT: 36054,
  104. FRAMEBUFFER_INCOMPLETE_DIMENSIONS: 36057,
  105. FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: 36055,
  106. FRAMEBUFFER_UNSUPPORTED: 36061,
  107. FRONT: 1028,
  108. FRONT_AND_BACK: 1032,
  109. FRONT_FACE: 2886,
  110. FUNC_ADD: 32774,
  111. FUNC_REVERSE_SUBTRACT: 32779,
  112. FUNC_SUBTRACT: 32778,
  113. GENERATE_MIPMAP_HINT: 33170,
  114. GEQUAL: 518,
  115. GREATER: 516,
  116. GREEN_BITS: 3411,
  117. HIGH_FLOAT: 36338,
  118. HIGH_INT: 36341,
  119. IMPLEMENTATION_COLOR_READ_FORMAT: 0x8B9B,
  120. IMPLEMENTATION_COLOR_READ_TYPE: 0x8B9A,
  121. INCR: 7682,
  122. INCR_WRAP: 34055,
  123. INT: 5124,
  124. INT_VEC2: 35667,
  125. INT_VEC3: 35668,
  126. INT_VEC4: 35669,
  127. INVALID_ENUM: 1280,
  128. INVALID_FRAMEBUFFER_OPERATION: 1286,
  129. INVALID_OPERATION: 1282,
  130. INVALID_VALUE: 1281,
  131. INVERT: 5386,
  132. KEEP: 7680,
  133. LEQUAL: 515,
  134. LESS: 513,
  135. LINEAR: 9729,
  136. LINEAR_MIPMAP_LINEAR: 9987,
  137. LINEAR_MIPMAP_NEAREST: 9985,
  138. LINES: 1,
  139. LINE_LOOP: 2,
  140. LINE_STRIP: 3,
  141. LINE_WIDTH: 2849,
  142. LINK_STATUS: 35714,
  143. LOW_FLOAT: 36336,
  144. LOW_INT: 36339,
  145. LUMINANCE: 6409,
  146. LUMINANCE_ALPHA: 6410,
  147. MAX_COMBINED_TEXTURE_IMAGE_UNITS: 35661,
  148. MAX_CUBE_MAP_TEXTURE_SIZE: 34076,
  149. MAX_FRAGMENT_UNIFORM_VECTORS: 36349,
  150. MAX_RENDERBUFFER_SIZE: 34024,
  151. MAX_TEXTURE_IMAGE_UNITS: 34930,
  152. MAX_TEXTURE_SIZE: 3379,
  153. MAX_VARYING_VECTORS: 36348,
  154. MAX_VERTEX_ATTRIBS: 34921,
  155. MAX_VERTEX_TEXTURE_IMAGE_UNITS: 35660,
  156. MAX_VERTEX_UNIFORM_VECTORS: 36347,
  157. MAX_VIEWPORT_DIMS: 3386,
  158. MEDIUM_FLOAT: 36337,
  159. MEDIUM_INT: 36340,
  160. MIRRORED_REPEAT: 33648,
  161. NEAREST: 9728,
  162. NEAREST_MIPMAP_LINEAR: 9986,
  163. NEAREST_MIPMAP_NEAREST: 9984,
  164. NEVER: 512,
  165. NICEST: 4354,
  166. NONE: 0,
  167. NOTEQUAL: 517,
  168. NO_ERROR: 0,
  169. ONE: 1,
  170. ONE_MINUS_CONSTANT_ALPHA: 32772,
  171. ONE_MINUS_CONSTANT_COLOR: 32770,
  172. ONE_MINUS_DST_ALPHA: 773,
  173. ONE_MINUS_DST_COLOR: 775,
  174. ONE_MINUS_SRC_ALPHA: 771,
  175. ONE_MINUS_SRC_COLOR: 769,
  176. OUT_OF_MEMORY: 1285,
  177. PACK_ALIGNMENT: 3333,
  178. POINTS: 0,
  179. POLYGON_OFFSET_FACTOR: 32824,
  180. POLYGON_OFFSET_FILL: 32823,
  181. POLYGON_OFFSET_UNITS: 10752,
  182. RED_BITS: 3410,
  183. RENDERBUFFER: 36161,
  184. RENDERBUFFER_ALPHA_SIZE: 36179,
  185. RENDERBUFFER_BINDING: 36007,
  186. RENDERBUFFER_BLUE_SIZE: 36178,
  187. RENDERBUFFER_DEPTH_SIZE: 36180,
  188. RENDERBUFFER_GREEN_SIZE: 36177,
  189. RENDERBUFFER_HEIGHT: 36163,
  190. RENDERBUFFER_INTERNAL_FORMAT: 36164,
  191. RENDERBUFFER_RED_SIZE: 36176,
  192. RENDERBUFFER_STENCIL_SIZE: 36181,
  193. RENDERBUFFER_WIDTH: 36162,
  194. RENDERER: 7937,
  195. REPEAT: 10497,
  196. REPLACE: 7681,
  197. RGB: 6407,
  198. RGB5_A1: 32855,
  199. RGB565: 36194,
  200. RGBA: 6408,
  201. RGBA4: 32854,
  202. SAMPLER_2D: 35678,
  203. SAMPLER_CUBE: 35680,
  204. SAMPLES: 32937,
  205. SAMPLE_ALPHA_TO_COVERAGE: 32926,
  206. SAMPLE_BUFFERS: 32936,
  207. SAMPLE_COVERAGE: 32928,
  208. SAMPLE_COVERAGE_INVERT: 32939,
  209. SAMPLE_COVERAGE_VALUE: 32938,
  210. SCISSOR_BOX: 3088,
  211. SCISSOR_TEST: 3089,
  212. SHADER_TYPE: 35663,
  213. SHADING_LANGUAGE_VERSION: 35724,
  214. SHORT: 5122,
  215. SRC_ALPHA: 770,
  216. SRC_ALPHA_SATURATE: 776,
  217. SRC_COLOR: 768,
  218. STATIC_DRAW: 35044,
  219. STENCIL_ATTACHMENT: 36128,
  220. STENCIL_BACK_FAIL: 34817,
  221. STENCIL_BACK_FUNC: 34816,
  222. STENCIL_BACK_PASS_DEPTH_FAIL: 34818,
  223. STENCIL_BACK_PASS_DEPTH_PASS: 34819,
  224. STENCIL_BACK_REF: 36003,
  225. STENCIL_BACK_VALUE_MASK: 36004,
  226. STENCIL_BACK_WRITEMASK: 36005,
  227. STENCIL_BITS: 3415,
  228. STENCIL_BUFFER_BIT: 1024,
  229. STENCIL_CLEAR_VALUE: 2961,
  230. STENCIL_FAIL: 2964,
  231. STENCIL_FUNC: 2962,
  232. STENCIL_INDEX: 6401,
  233. STENCIL_INDEX8: 36168,
  234. STENCIL_PASS_DEPTH_FAIL: 2965,
  235. STENCIL_PASS_DEPTH_PASS: 2966,
  236. STENCIL_REF: 2967,
  237. STENCIL_TEST: 2960,
  238. STENCIL_VALUE_MASK: 2963,
  239. STENCIL_WRITEMASK: 2968,
  240. STREAM_DRAW: 35040,
  241. SUBPIXEL_BITS: 3408,
  242. TEXTURE: 5890,
  243. TEXTURE0: 33984,
  244. TEXTURE1: 33985,
  245. TEXTURE2: 33986,
  246. TEXTURE3: 33987,
  247. TEXTURE4: 33988,
  248. TEXTURE5: 33989,
  249. TEXTURE6: 33990,
  250. TEXTURE7: 33991,
  251. TEXTURE8: 33992,
  252. TEXTURE9: 33993,
  253. TEXTURE10: 33994,
  254. TEXTURE11: 33995,
  255. TEXTURE12: 33996,
  256. TEXTURE13: 33997,
  257. TEXTURE14: 33998,
  258. TEXTURE15: 33999,
  259. TEXTURE16: 34000,
  260. TEXTURE17: 34001,
  261. TEXTURE18: 34002,
  262. TEXTURE19: 34003,
  263. TEXTURE20: 34004,
  264. TEXTURE21: 34005,
  265. TEXTURE22: 34006,
  266. TEXTURE23: 34007,
  267. TEXTURE24: 34008,
  268. TEXTURE25: 34009,
  269. TEXTURE26: 34010,
  270. TEXTURE27: 34011,
  271. TEXTURE28: 34012,
  272. TEXTURE29: 34013,
  273. TEXTURE30: 34014,
  274. TEXTURE31: 34015,
  275. TEXTURE_2D: 3553,
  276. TEXTURE_BINDING_2D: 32873,
  277. TEXTURE_BINDING_CUBE_MAP: 34068,
  278. TEXTURE_CUBE_MAP: 34067,
  279. TEXTURE_CUBE_MAP_NEGATIVE_X: 34070,
  280. TEXTURE_CUBE_MAP_NEGATIVE_Y: 34072,
  281. TEXTURE_CUBE_MAP_NEGATIVE_Z: 34074,
  282. TEXTURE_CUBE_MAP_POSITIVE_X: 34069,
  283. TEXTURE_CUBE_MAP_POSITIVE_Y: 34071,
  284. TEXTURE_CUBE_MAP_POSITIVE_Z: 34073,
  285. TEXTURE_MAG_FILTER: 10240,
  286. TEXTURE_MIN_FILTER: 10241,
  287. TEXTURE_WRAP_S: 10242,
  288. TEXTURE_WRAP_T: 10243,
  289. TRIANGLES: 4,
  290. TRIANGLE_FAN: 6,
  291. TRIANGLE_STRIP: 5,
  292. UNPACK_ALIGNMENT: 3317,
  293. UNPACK_COLORSPACE_CONVERSION_WEBGL: 37443,
  294. UNPACK_FLIP_Y_WEBGL: 37440,
  295. UNPACK_PREMULTIPLY_ALPHA_WEBGL: 37441,
  296. UNSIGNED_BYTE: 5121,
  297. UNSIGNED_INT: 5125,
  298. UNSIGNED_SHORT: 5123,
  299. UNSIGNED_SHORT_4_4_4_4: 32819,
  300. UNSIGNED_SHORT_5_5_5_1: 32820,
  301. UNSIGNED_SHORT_5_6_5: 33635,
  302. VALIDATE_STATUS: 35715,
  303. VENDOR: 7936,
  304. VERSION: 7938,
  305. VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 34975,
  306. VERTEX_ATTRIB_ARRAY_ENABLED: 34338,
  307. VERTEX_ATTRIB_ARRAY_NORMALIZED: 34922,
  308. VERTEX_ATTRIB_ARRAY_POINTER: 34373,
  309. VERTEX_ATTRIB_ARRAY_SIZE: 34339,
  310. VERTEX_ATTRIB_ARRAY_STRIDE: 34340,
  311. VERTEX_ATTRIB_ARRAY_TYPE: 34341,
  312. VERTEX_SHADER: 35633,
  313. VIEWPORT: 2978,
  314. ZERO: 0
  315. }
  316. type gl = typeof gl
  317. export function createGl(width: number, height: number, contextAttributes: WebGLContextAttributes): WebGLRenderingContext {
  318. const getNextId = idFactory()
  319. const items: { [k: number]: any } = {}
  320. const boundTextures: { [k: number]: any } = {}
  321. const viewport = { x: 0, y: 0, width, height }
  322. const depthRange = { zNear: 0, zFar: 1 }
  323. const colorClearValue = { r: 0, g: 0, b: 0, a: 0 }
  324. // let _activeFramebuffer: number
  325. // let _activeRenderbuffer: number
  326. return {
  327. ...gl,
  328. canvas: {
  329. width, height
  330. } as HTMLCanvasElement,
  331. getAttachedShaders: function(program: WebGLProgram) {
  332. return [] as WebGLShader[]
  333. },
  334. getBufferParameter: function(target: number, pname: number) {
  335. return 0
  336. },
  337. getContextAttributes: function() { return contextAttributes },
  338. getFramebufferAttachmentParameter: function() {},
  339. getProgramInfoLog: function() { return ''; },
  340. getShaderInfoLog: function() { return ''; },
  341. getRenderbufferParameter: function() {},
  342. getShaderPrecisionFormat: function(shadertype: number, precisiontype: number) {
  343. return {
  344. precision: 0,
  345. rangeMax: 0,
  346. rangeMin: 0
  347. }
  348. },
  349. getShaderSource: function(shader: WebGLShader | null) { return ''; },
  350. getTexParameter: function() {},
  351. getUniform: function() {},
  352. getVertexAttrib: function() {},
  353. getVertexAttribOffset: function(index: number, pname: number) { return 0; },
  354. hint: function(target: number, mode: number) {},
  355. isBuffer: function(buffer: WebGLBuffer | null) { return true; },
  356. isEnabled: function(cap: number) { return true; },
  357. isFramebuffer: function(framebuffer: WebGLFramebuffer | null) { return true; },
  358. isProgram: function(program: WebGLProgram | null) { return true; },
  359. isRenderbuffer: function(renderbuffer: WebGLRenderbuffer | null) { return true; },
  360. isShader: function(shader: WebGLShader | null) { return true; },
  361. isTexture: function(texture: WebGLTexture | null) { return true; },
  362. getExtension: function (extensionName: string): any {
  363. switch (extensionName) {
  364. case 'EXT_blend_minmax': return {
  365. MAX_EXT: 0,
  366. MIN_EXT: 0
  367. } as EXT_blend_minmax
  368. case 'EXT_texture_filter_anisotropic': return {
  369. MAX_TEXTURE_MAX_ANISOTROPY_EXT: 0,
  370. TEXTURE_MAX_ANISOTROPY_EXT: 0
  371. } as EXT_texture_filter_anisotropic
  372. case 'EXT_frag_depth': return {} as EXT_frag_depth
  373. case 'EXT_shader_texture_lod': return {} as EXT_shader_texture_lod
  374. case 'EXT_sRGB': return {
  375. FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT: 0,
  376. SRGB8_ALPHA8_EXT: 0,
  377. SRGB_ALPHA_EXT: 0,
  378. SRGB_EXT: 0
  379. } as EXT_sRGB
  380. case 'OES_vertex_array_object': return {
  381. VERTEX_ARRAY_BINDING_OES: 0,
  382. bindVertexArrayOES: function(arrayObject: WebGLVertexArrayObjectOES) { },
  383. createVertexArrayOES: function(): WebGLVertexArrayObjectOES { return {} },
  384. deleteVertexArrayOES: function(arrayObject: WebGLVertexArrayObjectOES) { },
  385. isVertexArrayOES: function(value: any) { return true; }
  386. } as OES_vertex_array_object
  387. case 'WEBGL_color_buffer_float': return {
  388. FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT: 0,
  389. RGB32F_EXT: 0,
  390. RGBA32F_EXT: 0,
  391. UNSIGNED_NORMALIZED_EXT: 0
  392. } as WEBGL_color_buffer_float
  393. case 'WEBGL_compressed_texture_astc': return null
  394. case 'WEBGL_compressed_texture_s3tc_srgb': return null
  395. case 'WEBGL_debug_shaders': return {
  396. getTranslatedShaderSource(shader: WebGLShader) { return ''; }
  397. } as WEBGL_debug_shaders
  398. case 'WEBGL_draw_buffers': return null
  399. case 'WEBGL_lose_context': return {
  400. loseContext: function() { },
  401. restoreContext: function() { },
  402. } as WEBGL_lose_context
  403. case 'WEBGL_depth_texture': return {
  404. UNSIGNED_INT_24_8_WEBGL: 0
  405. } as WEBGL_depth_texture
  406. case 'WEBGL_debug_renderer_info': return {
  407. UNMASKED_RENDERER_WEBGL: 0,
  408. UNMASKED_VENDOR_WEBGL: 0
  409. } as WEBGL_debug_renderer_info
  410. case 'WEBGL_compressed_texture_s3tc': return null
  411. case 'OES_texture_half_float_linear': return {} as OES_texture_half_float_linear
  412. case 'OES_texture_half_float': return {
  413. HALF_FLOAT_OES: 0
  414. } as OES_texture_half_float
  415. case 'OES_texture_float_linear': return {} as OES_texture_float_linear
  416. case 'OES_texture_float': return {} as OES_texture_float
  417. case 'OES_standard_derivatives': return {
  418. FRAGMENT_SHADER_DERIVATIVE_HINT_OES: 0
  419. } as OES_standard_derivatives
  420. case 'OES_element_index_uint': return {} as OES_element_index_uint
  421. case 'ANGLE_instanced_arrays': return {
  422. drawArraysInstancedANGLE: function(mode: number, first: number, count: number, primcount: number) {},
  423. drawElementsInstancedANGLE: function(mode: number, count: number, type: number, offset: number, primcount: number) {},
  424. vertexAttribDivisorANGLE: function(index: number, divisor: number) {},
  425. VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: 0
  426. } as ANGLE_instanced_arrays
  427. }
  428. return null
  429. },
  430. createBuffer: function () {
  431. const id = getNextId()
  432. items[id] = {
  433. which: 'buffer',
  434. };
  435. return id;
  436. },
  437. deleteBuffer: function () { },
  438. bindBuffer: function () { },
  439. bufferData: function () { },
  440. getParameter: function (pname: number) {
  441. switch (pname) {
  442. case c.MAX_TEXTURE_MAX_ANISOTROPY_EXT: return 16;
  443. case c.MAX_TEXTURE_IMAGE_UNITS_NV: return 16;
  444. case gl.ELEMENT_ARRAY_BUFFER_BINDING:
  445. case gl.ARRAY_BUFFER_BINDING:
  446. case gl.FRAMEBUFFER_BINDING:
  447. case gl.CURRENT_PROGRAM:
  448. case gl.RENDERBUFFER_BINDING:
  449. return 0;
  450. // return _activeFramebuffer
  451. // return _activeRenderbuffer
  452. case gl.TEXTURE_BINDING_2D:
  453. case gl.TEXTURE_BINDING_CUBE_MAP:
  454. return null
  455. case gl.VERSION:
  456. return '1.0.0'
  457. case gl.VENDOR:
  458. return 'shim'
  459. case gl.RENDERER:
  460. return 'shim-renderer'
  461. case gl.SHADING_LANGUAGE_VERSION:
  462. return 'WebGL GLSL ES 1.0 shim'
  463. case gl.COMPRESSED_TEXTURE_FORMATS:
  464. return new Uint32Array(0)
  465. // Int arrays
  466. case gl.MAX_VIEWPORT_DIMS:
  467. case gl.SCISSOR_BOX:
  468. return new Int32Array([ 0, 0, 4096, 4096 ])
  469. case gl.VIEWPORT:
  470. const { x, y, width, height } = viewport
  471. return new Int32Array([ x, y, width, height ])
  472. // Float arrays
  473. case gl.ALIASED_LINE_WIDTH_RANGE:
  474. return new Float32Array([0, 1])
  475. case gl.ALIASED_POINT_SIZE_RANGE:
  476. return new Float32Array([0, 255])
  477. case gl.DEPTH_RANGE:
  478. return new Float32Array([ depthRange.zNear, depthRange.zFar ])
  479. case gl.BLEND_COLOR:
  480. return new Float32Array([0, 0, 0, 0])
  481. case gl.COLOR_CLEAR_VALUE:
  482. const { r, g, b, a } = colorClearValue
  483. return new Float32Array([ r, g, b, a ])
  484. case gl.COLOR_WRITEMASK:
  485. return 0
  486. case gl.DEPTH_CLEAR_VALUE:
  487. case gl.LINE_WIDTH:
  488. case gl.POLYGON_OFFSET_FACTOR:
  489. case gl.POLYGON_OFFSET_UNITS:
  490. case gl.SAMPLE_COVERAGE_VALUE:
  491. return 1
  492. case gl.BLEND:
  493. case gl.CULL_FACE:
  494. case gl.DEPTH_TEST:
  495. case gl.DEPTH_WRITEMASK:
  496. case gl.DITHER:
  497. case gl.POLYGON_OFFSET_FILL:
  498. case gl.SAMPLE_COVERAGE_INVERT:
  499. case gl.SCISSOR_TEST:
  500. case gl.STENCIL_TEST:
  501. case gl.UNPACK_FLIP_Y_WEBGL:
  502. case gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL:
  503. return false;
  504. case gl.MAX_TEXTURE_SIZE:
  505. case gl.MAX_CUBE_MAP_TEXTURE_SIZE:
  506. return 16384;
  507. case gl.MAX_VERTEX_UNIFORM_VECTORS:
  508. case gl.MAX_FRAGMENT_UNIFORM_VECTORS:
  509. return 4096;
  510. case gl.MAX_VARYING_VECTORS:
  511. case gl.MAX_TEXTURE_IMAGE_UNITS:
  512. case gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS:
  513. case gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS:
  514. return 32;
  515. case gl.MAX_RENDERBUFFER_SIZE:
  516. return 2048;
  517. case gl.ACTIVE_TEXTURE:
  518. case gl.ALPHA_BITS:
  519. case gl.BLEND_DST_ALPHA:
  520. case gl.BLEND_DST_RGB:
  521. case gl.BLEND_EQUATION_ALPHA:
  522. case gl.BLEND_EQUATION_RGB:
  523. case gl.BLEND_SRC_ALPHA:
  524. case gl.BLEND_SRC_RGB:
  525. case gl.BLUE_BITS:
  526. case gl.CULL_FACE_MODE:
  527. case gl.DEPTH_BITS:
  528. case gl.DEPTH_FUNC:
  529. case gl.FRONT_FACE:
  530. case gl.GENERATE_MIPMAP_HINT:
  531. case gl.GREEN_BITS:
  532. case gl.MAX_VERTEX_ATTRIBS:
  533. case gl.PACK_ALIGNMENT:
  534. case gl.RED_BITS:
  535. case gl.SAMPLE_BUFFERS:
  536. case gl.SAMPLES:
  537. case gl.STENCIL_BACK_FAIL:
  538. case gl.STENCIL_BACK_FUNC:
  539. case gl.STENCIL_BACK_PASS_DEPTH_FAIL:
  540. case gl.STENCIL_BACK_PASS_DEPTH_PASS:
  541. case gl.STENCIL_BACK_REF:
  542. case gl.STENCIL_BACK_VALUE_MASK:
  543. case gl.STENCIL_BACK_WRITEMASK:
  544. case gl.STENCIL_BITS:
  545. case gl.STENCIL_CLEAR_VALUE:
  546. case gl.STENCIL_FAIL:
  547. case gl.STENCIL_FUNC:
  548. case gl.STENCIL_PASS_DEPTH_FAIL:
  549. case gl.STENCIL_PASS_DEPTH_PASS:
  550. case gl.STENCIL_REF:
  551. case gl.STENCIL_VALUE_MASK:
  552. case gl.STENCIL_WRITEMASK:
  553. case gl.SUBPIXEL_BITS:
  554. case gl.UNPACK_ALIGNMENT:
  555. case gl.UNPACK_COLORSPACE_CONVERSION_WEBGL:
  556. return 0;
  557. default:
  558. return 0;
  559. }
  560. },
  561. getSupportedExtensions: function () {
  562. return [
  563. 'EXT_blend_minmax', 'EXT_texture_filter_anisotropic', 'EXT_frag_depth',
  564. 'EXT_shader_texture_lod', 'EXT_sRGB', 'OES_vertex_array_object',
  565. 'WEBGL_color_buffer_float', 'WEBGL_debug_shaders', 'WEBGL_lose_context',
  566. 'WEBGL_depth_texture', 'WEBGL_debug_renderer_info', 'OES_texture_half_float_linear',
  567. 'OES_texture_half_float', 'OES_texture_float_linear', 'OES_texture_float',
  568. 'OES_standard_derivatives', 'OES_element_index_uint', 'ANGLE_instanced_arrays'
  569. ];
  570. },
  571. createShader: function (type: number) {
  572. const id = getNextId()
  573. items[id] = {
  574. which: 'shader',
  575. type: type,
  576. };
  577. return id as WebGLShader;
  578. },
  579. getShaderParameter: function (shader: WebGLShader, pname: number) {
  580. switch (pname) {
  581. case gl.SHADER_TYPE: return items[shader as number].type;
  582. case gl.COMPILE_STATUS: return true;
  583. default: throw `getShaderParameter ${pname}`;
  584. }
  585. },
  586. shaderSource: function () { },
  587. compileShader: function () { },
  588. createProgram: function () {
  589. const id = getNextId()
  590. items[id] = {
  591. which: 'program',
  592. shaders: [],
  593. };
  594. return id;
  595. },
  596. attachShader: function (program: WebGLProgram, shader: WebGLShader) {
  597. items[program as number].shaders.push(shader as number);
  598. },
  599. bindAttribLocation: function () { },
  600. linkProgram: function () { },
  601. getProgramParameter: function (program: number, pname: number) {
  602. switch (pname) {
  603. case gl.LINK_STATUS: return true;
  604. case gl.ACTIVE_UNIFORMS: return 4;
  605. case gl.ACTIVE_ATTRIBUTES: return 0;
  606. case gl.ACTIVE_UNIFORMS: return 0;
  607. case gl.DELETE_STATUS: return false;
  608. case gl.VALIDATE_STATUS: return true;
  609. case gl.ATTACHED_SHADERS: return 2;
  610. default: throw `getProgramParameter ${pname}`;
  611. }
  612. },
  613. deleteShader: function () { },
  614. deleteProgram: function () { },
  615. viewport: function (x: number, y: number, width: number, height: number) {
  616. viewport.x = x
  617. viewport.y = y
  618. viewport.width = width
  619. viewport.height = height
  620. },
  621. clearColor: function (red: number, green: number, blue: number, alpha: number) {
  622. colorClearValue.r = red
  623. colorClearValue.g = green
  624. colorClearValue.b = blue
  625. colorClearValue.a = alpha
  626. },
  627. clearDepth: function () { },
  628. depthFunc: function () { },
  629. enable: function () { },
  630. disable: function () { },
  631. frontFace: function () { },
  632. cullFace: function () { },
  633. activeTexture: function () { },
  634. createTexture: function () {
  635. const id = getNextId()
  636. items[id] = {
  637. which: 'texture',
  638. };
  639. return id;
  640. },
  641. deleteTexture: function () { },
  642. bindTexture: function (target: number, texture: WebGLTexture | null) {
  643. boundTextures[target as number] = texture;
  644. },
  645. texParameterf: function () { },
  646. texParameteri: function () { },
  647. pixelStorei: function () { },
  648. texImage2D: function () { },
  649. texSubImage2D: function () { },
  650. compressedTexImage2D: function () { },
  651. useProgram: function () { },
  652. getUniformLocation: function () {
  653. return 0;
  654. },
  655. getActiveUniform: function (program: WebGLProgram, index: number) {
  656. return {
  657. size: 1,
  658. type: gl.INT_VEC3,
  659. name: `__activeUniform${index}`,
  660. };
  661. },
  662. getActiveAttrib: function (program: WebGLProgram, index: number) {
  663. return {
  664. size: 1,
  665. type: gl.FLOAT,
  666. name: `__activeAttrib${index}`
  667. };
  668. },
  669. clear: function () { },
  670. uniform1f: function () { },
  671. uniform1fv: function () { },
  672. uniform1i: function () { },
  673. uniform1iv: function () { },
  674. uniform2f: function () { },
  675. uniform2fv: function () { },
  676. uniform2i: function () { },
  677. uniform2iv: function () { },
  678. uniform3f: function () { },
  679. uniform3fv: function () { },
  680. uniform3i: function () { },
  681. uniform3iv: function () { },
  682. uniform4f: function () { },
  683. uniform4fv: function () { },
  684. uniform4i: function () { },
  685. uniform4iv: function () { },
  686. uniformMatrix2fv: function () { },
  687. uniformMatrix3fv: function () { },
  688. uniformMatrix4fv: function () { },
  689. getAttribLocation: function () { return 1 },
  690. vertexAttribPointer: function () { },
  691. enableVertexAttribArray: function () { },
  692. disableVertexAttribArray: function () { },
  693. drawElements: function () { },
  694. drawArrays: function () { },
  695. depthMask: function () { },
  696. depthRange: function (zNear: number, zFar: number) {
  697. depthRange.zNear = zNear
  698. depthRange.zFar = zFar
  699. },
  700. bufferSubData: function () { },
  701. blendFunc: function () { },
  702. createFramebuffer: function () {
  703. const id = getNextId()
  704. items[id] = {
  705. which: 'framebuffer',
  706. shaders: [],
  707. };
  708. return id;
  709. },
  710. bindFramebuffer: function () { },
  711. framebufferTexture2D: function () { },
  712. checkFramebufferStatus: function () {
  713. return gl.FRAMEBUFFER_COMPLETE;
  714. },
  715. deleteFramebuffer: function () { },
  716. createRenderbuffer: function () {
  717. const id = getNextId()
  718. items[id] = {
  719. which: 'renderbuffer',
  720. shaders: [],
  721. };
  722. return id;
  723. },
  724. bindRenderbuffer: function () { },
  725. deleteRenderbuffer: function () { },
  726. renderbufferStorage: function () { },
  727. framebufferRenderbuffer: function () { },
  728. scissor: function () { },
  729. colorMask: function () { },
  730. lineWidth: function () { },
  731. vertexAttrib1f: function () { },
  732. vertexAttrib1fv: function () { },
  733. vertexAttrib2f: function () { },
  734. vertexAttrib2fv: function () { },
  735. vertexAttrib3f: function () { },
  736. vertexAttrib3fv: function () { },
  737. vertexAttrib4f: function () { },
  738. vertexAttrib4fv: function () { },
  739. validateProgram: function () { },
  740. generateMipmap: function () { },
  741. isContextLost: function () { return false; },
  742. drawingBufferWidth: 1024,
  743. drawingBufferHeight: 1024,
  744. blendColor: function () { },
  745. blendEquation: function () { },
  746. blendEquationSeparate: function () { },
  747. blendFuncSeparate: function () { },
  748. clearStencil: function () { },
  749. compressedTexSubImage2D: function () { },
  750. copyTexImage2D: function () { },
  751. copyTexSubImage2D: function () { },
  752. detachShader: function () { },
  753. finish: function () { },
  754. flush: function () { },
  755. getError: function () { return 0; },
  756. polygonOffset: function () { },
  757. readPixels: function () { },
  758. sampleCoverage: function () { },
  759. stencilFunc: function () { },
  760. stencilFuncSeparate: function () { },
  761. stencilMask: function () { },
  762. stencilMaskSeparate: function () { },
  763. stencilOp: function () { },
  764. stencilOpSeparate: function () { },
  765. }
  766. }