webgl2.odin 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package webgl
  2. foreign import "webgl2"
  3. import "base:intrinsics"
  4. import glm "core:math/linalg/glsl"
  5. Query :: distinct u32
  6. Sampler :: distinct u32
  7. Sync :: distinct u32
  8. TransformFeedback :: distinct u32
  9. VertexArrayObject :: distinct u32
  10. IsWebGL2Supported :: proc "contextless" () -> bool {
  11. major, minor: i32
  12. GetWebGLVersion(&major, &minor)
  13. return major >= 2
  14. }
  15. @(default_calling_convention="contextless")
  16. foreign webgl2 {
  17. /* Buffer objects */
  18. CopyBufferSubData :: proc(readTarget, writeTarget: Enum, readOffset, writeOffset: int, size: int) ---
  19. GetBufferSubData :: proc(target: Enum, srcByteOffset: int, dst_buffer: []byte, dstOffset: int = 0, length: int = 0) ---
  20. /* Framebuffer objects */
  21. BlitFramebuffer :: proc(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1: i32, mask: u32, filter: Enum) ---
  22. FramebufferTextureLayer :: proc(target: Enum, attachment: Enum, texture: Texture, level: i32, layer: i32) ---
  23. InvalidateFramebuffer :: proc(target: Enum, attachments: []Enum) ---
  24. InvalidateSubFramebuffer :: proc(target: Enum, attachments: []Enum, x, y, width, height: i32) ---
  25. ReadBuffer :: proc(src: Enum) ---
  26. /* Renderbuffer objects */
  27. RenderbufferStorageMultisample :: proc(target: Enum, samples: i32, internalformat: Enum, width, height: i32) ---
  28. /* Texture objects */
  29. TexStorage3D :: proc(target: Enum, levels: i32, internalformat: Enum, width, height, depth: i32) ---
  30. TexImage3D :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, format, type: Enum, size: int, data: rawptr) ---
  31. TexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset, width, height, depth: i32, format, type: Enum, size: int, data: rawptr) ---
  32. CompressedTexImage3D :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, imageSize: int, data: rawptr) ---
  33. CompressedTexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset: i32, width, height, depth: i32, format: Enum, imageSize: int, data: rawptr) ---
  34. CopyTexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset, zoffset: i32, x, y, width, height: i32) ---
  35. /* Programs and shaders */
  36. GetFragDataLocation :: proc(program: Program, name: string) -> i32 ---
  37. /* Uniforms */
  38. Uniform1ui :: proc(location: i32, v0: u32) ---
  39. Uniform2ui :: proc(location: i32, v0: u32, v1: u32) ---
  40. Uniform3ui :: proc(location: i32, v0: u32, v1: u32, v2: u32) ---
  41. Uniform4ui :: proc(location: i32, v0: u32, v1: u32, v2: u32, v3: u32) ---
  42. /* Vertex attribs */
  43. VertexAttribI4i :: proc(index: i32, x, y, z, w: i32) ---
  44. VertexAttribI4ui :: proc(index: i32, x, y, z, w: u32) ---
  45. VertexAttribIPointer :: proc(index: i32, size: int, type: Enum, stride: int, offset: uintptr) ---
  46. /* Writing to the drawing buffer */
  47. VertexAttribDivisor :: proc(index: u32, divisor: u32) ---
  48. DrawArraysInstanced :: proc(mode: Enum, first, count: int, instanceCount: int) ---
  49. DrawElementsInstanced :: proc(mode: Enum, count: int, type: Enum, offset: int, instanceCount: int) ---
  50. DrawRangeElements :: proc(mode: Enum, start, end, count: int, type: Enum, offset: int) ---
  51. /* Multiple Render Targets */
  52. DrawBuffers :: proc(buffers: []Enum) ---
  53. ClearBufferfv :: proc(buffer: Enum, drawbuffer: i32, values: []f32) ---
  54. ClearBufferiv :: proc(buffer: Enum, drawbuffer: i32, values: []i32) ---
  55. ClearBufferuiv :: proc(buffer: Enum, drawbuffer: i32, values: []u32) ---
  56. ClearBufferfi :: proc(buffer: Enum, drawbuffer: i32, depth: f32, stencil: i32) ---
  57. CreateQuery :: proc() -> Query ---
  58. DeleteQuery :: proc(query: Query) ---
  59. IsQuery :: proc(query: Query) -> bool ---
  60. BeginQuery :: proc(target: Enum, query: Query) ---
  61. EndQuery :: proc(target: Enum) ---
  62. GetQuery :: proc(target, pname: Enum) ---
  63. CreateSampler :: proc() -> Sampler ---
  64. DeleteSampler :: proc(sampler: Sampler) ---
  65. IsSampler :: proc(sampler: Sampler) -> bool ---
  66. BindSampler :: proc(unit: Enum, sampler: Sampler) ---
  67. SamplerParameteri :: proc(sampler: Sampler, pname: Enum, param: i32) ---
  68. SamplerParameterf :: proc(sampler: Sampler, pname: Enum, param: f32) ---
  69. FenceSync :: proc(condition: Enum, flags: u32) -> Sync ---
  70. IsSync :: proc(sync: Sync) -> bool ---
  71. DeleteSync :: proc(sync: Sync) ---
  72. ClientWaitSync :: proc(sync: Sync, flags: u32, timeout: u64) ---
  73. WaitSync :: proc(sync: Sync, flags: u32, timeout: i64) ---
  74. CreateTransformFeedback :: proc() -> TransformFeedback ---
  75. DeleteTransformFeedback :: proc(tf: TransformFeedback) ---
  76. IsTransformFeedback :: proc(tf: TransformFeedback) -> bool ---
  77. BindTransformFeedback :: proc(target: Enum, tf: TransformFeedback) ---
  78. BeginTransformFeedback :: proc(primitiveMode: Enum) ---
  79. EndTransformFeedback :: proc() ---
  80. TransformFeedbackVaryings :: proc(program: Program, varyings: []string, bufferMode: Enum) ---
  81. PauseTransformFeedback :: proc() ---
  82. ResumeTransformFeedback :: proc() ---
  83. BindBufferBase :: proc(target: Enum, index: i32, buffer: Buffer) ---
  84. BindBufferRange :: proc(target: Enum, index: i32, buffer: Buffer, offset: int, size: int) ---
  85. GetUniformBlockIndex :: proc(program: Program, uniformBlockName: string) -> i32 ---
  86. UniformBlockBinding :: proc(program: Program, uniformBlockIndex: i32, uniformBlockBinding: i32) ---
  87. CreateVertexArray :: proc() -> VertexArrayObject ---
  88. DeleteVertexArray :: proc(vertexArray: VertexArrayObject) ---
  89. IsVertexArray :: proc(vertexArray: VertexArrayObject) -> bool ---
  90. BindVertexArray :: proc(vertexArray: VertexArrayObject) ---
  91. }
  92. GetActiveUniformBlockName :: proc(program: Program, uniformBlockIndex: i32, buf: []byte) -> string {
  93. foreign webgl2 {
  94. _GetActiveUniformBlockName :: proc "contextless" (program: Program, uniformBlockIndex: i32, buf: []byte, length: ^int) ---
  95. }
  96. n: int
  97. _GetActiveUniformBlockName(program, uniformBlockIndex, buf, &n)
  98. return string(buf[:n])
  99. }
  100. Uniform1uiv :: proc "contextless" (location: i32, v: u32) {
  101. Uniform1ui(location, v)
  102. }
  103. Uniform2uiv :: proc "contextless" (location: i32, v: glm.uvec2) {
  104. Uniform2ui(location, v.x, v.y)
  105. }
  106. Uniform3uiv :: proc "contextless" (location: i32, v: glm.uvec3) {
  107. Uniform3ui(location, v.x, v.y, v.z)
  108. }
  109. Uniform4uiv :: proc "contextless" (location: i32, v: glm.uvec4) {
  110. Uniform4ui(location, v.x, v.y, v.z, v.w)
  111. }
  112. UniformMatrix3x2fv :: proc "contextless" (location: i32, m: glm.mat3x2) {
  113. foreign webgl2 {
  114. _UniformMatrix3x2fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  115. }
  116. array := intrinsics.matrix_flatten(m)
  117. _UniformMatrix3x2fv(location, &array[0])
  118. }
  119. UniformMatrix4x2fv :: proc "contextless" (location: i32, m: glm.mat4x2) {
  120. foreign webgl2 {
  121. _UniformMatrix4x2fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  122. }
  123. array := intrinsics.matrix_flatten(m)
  124. _UniformMatrix4x2fv(location, &array[0])
  125. }
  126. UniformMatrix2x3fv :: proc "contextless" (location: i32, m: glm.mat2x3) {
  127. foreign webgl2 {
  128. _UniformMatrix2x3fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  129. }
  130. array := intrinsics.matrix_flatten(m)
  131. _UniformMatrix2x3fv(location, &array[0])
  132. }
  133. UniformMatrix4x3fv :: proc "contextless" (location: i32, m: glm.mat4x3) {
  134. foreign webgl2 {
  135. _UniformMatrix4x3fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  136. }
  137. array := intrinsics.matrix_flatten(m)
  138. _UniformMatrix4x3fv(location, &array[0])
  139. }
  140. UniformMatrix2x4fv :: proc "contextless" (location: i32, m: glm.mat2x4) {
  141. foreign webgl2 {
  142. _UniformMatrix2x4fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  143. }
  144. array := intrinsics.matrix_flatten(m)
  145. _UniformMatrix2x4fv(location, &array[0])
  146. }
  147. UniformMatrix3x4fv :: proc "contextless" (location: i32, m: glm.mat3x4) {
  148. foreign webgl2 {
  149. _UniformMatrix3x4fv :: proc "contextless" (location: i32, addr: [^]f32) ---
  150. }
  151. array := intrinsics.matrix_flatten(m)
  152. _UniformMatrix3x4fv(location, &array[0])
  153. }
  154. VertexAttribI4iv :: proc "contextless" (index: i32, v: glm.ivec4) {
  155. VertexAttribI4i(index, v.x, v.y, v.z, v.w)
  156. }
  157. VertexAttribI4uiv :: proc "contextless" (index: i32, v: glm.uvec4) {
  158. VertexAttribI4ui(index, v.x, v.y, v.z, v.w)
  159. }