webgl2.odin 7.7 KB

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