opengl.odin 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #foreign_system_library "opengl32" when ODIN_OS == "windows"
  2. #import "win32.odin" when ODIN_OS == "windows"
  3. #include "opengl_constants.odin"
  4. Clear :: proc(mask: u32) #foreign "glClear"
  5. ClearColor :: proc(r, g, b, a: f32) #foreign "glClearColor"
  6. Begin :: proc(mode: i32) #foreign "glBegin"
  7. End :: proc() #foreign "glEnd"
  8. Finish :: proc() #foreign "glFinish"
  9. BlendFunc :: proc(sfactor, dfactor: i32) #foreign "glBlendFunc"
  10. Enable :: proc(cap: i32) #foreign "glEnable"
  11. Disable :: proc(cap: i32) #foreign "glDisable"
  12. GenTextures :: proc(count: i32, result: ^u32) #foreign "glGenTextures"
  13. DeleteTextures :: proc(count: i32, result: ^u32) #foreign "glDeleteTextures"
  14. TexParameteri :: proc(target, pname, param: i32) #foreign "glTexParameteri"
  15. TexParameterf :: proc(target: i32, pname: i32, param: f32) #foreign "glTexParameterf"
  16. BindTexture :: proc(target: i32, texture: u32) #foreign "glBindTexture"
  17. LoadIdentity :: proc() #foreign "glLoadIdentity"
  18. Viewport :: proc(x, y, width, height: i32) #foreign "glViewport"
  19. Ortho :: proc(left, right, bottom, top, near, far: f64) #foreign "glOrtho"
  20. Color3f :: proc(r, g, b: f32) #foreign "glColor3f"
  21. Vertex3f :: proc(x, y, z: f32) #foreign "glVertex3f"
  22. TexImage2D :: proc(target, level, internal_format,
  23. width, height, border,
  24. format, _type: i32, pixels: rawptr) #foreign "glTexImage2D"
  25. GetError :: proc() -> i32 #foreign "glGetError"
  26. GetString :: proc(name: i32) -> ^byte #foreign "glGetString"
  27. GetIntegerv :: proc(name: i32, v: ^i32) #foreign "glGetIntegerv"
  28. _libgl := win32.LoadLibraryA(("opengl32.dll\x00" as string).data)
  29. GetProcAddress :: proc(name: string) -> proc() {
  30. assert(name[name.count-1] == 0)
  31. res := win32.wglGetProcAddress(name.data)
  32. if res == nil {
  33. res = win32.GetProcAddress(_libgl, name.data)
  34. }
  35. return res
  36. }
  37. GenBuffers: proc(count: i32, buffers: ^u32)
  38. GenVertexArrays: proc(count: i32, buffers: ^u32)
  39. GenSamplers: proc(count: i32, buffers: ^u32)
  40. BindBuffer: proc(target: i32, buffer: u32)
  41. BindVertexArray: proc(buffer: u32)
  42. BindSampler: proc(position: i32, sampler: u32)
  43. BufferData: proc(target: i32, size: int, data: rawptr, usage: i32)
  44. BufferSubData: proc(target: i32, offset, size: int, data: rawptr)
  45. DrawArrays: proc(mode, first: i32, count: u32)
  46. DrawElements: proc(mode: i32, count: u32, type_: i32, indices: rawptr)
  47. MapBuffer: proc(target, access: i32) -> rawptr
  48. UnmapBuffer: proc(target: i32)
  49. VertexAttribPointer: proc(index: u32, size, type_: i32, normalized: i32, stride: u32, pointer: rawptr)
  50. EnableVertexAttribArray: proc(index: u32)
  51. CreateShader: proc(shader_type: i32) -> u32
  52. ShaderSource: proc(shader: u32, count: u32, string: ^^byte, length: ^i32)
  53. CompileShader: proc(shader: u32)
  54. CreateProgram: proc() -> u32
  55. AttachShader: proc(program, shader: u32)
  56. DetachShader: proc(program, shader: u32)
  57. DeleteShader: proc(shader: u32)
  58. LinkProgram: proc(program: u32)
  59. UseProgram: proc(program: u32)
  60. DeleteProgram: proc(program: u32)
  61. GetShaderiv: proc(shader: u32, pname: i32, params: ^i32)
  62. GetProgramiv: proc(program: u32, pname: i32, params: ^i32)
  63. GetShaderInfoLog: proc(shader: u32, max_length: u32, length: ^u32, info_long: ^byte)
  64. GetProgramInfoLog: proc(program: u32, max_length: u32, length: ^u32, info_long: ^byte)
  65. ActiveTexture: proc(texture: i32)
  66. GenerateMipmap: proc(target: i32)
  67. SamplerParameteri: proc(sampler: u32, pname: i32, param: i32)
  68. SamplerParameterf: proc(sampler: u32, pname: i32, param: f32)
  69. SamplerParameteriv: proc(sampler: u32, pname: i32, params: ^i32)
  70. SamplerParameterfv: proc(sampler: u32, pname: i32, params: ^f32)
  71. SamplerParameterIiv: proc(sampler: u32, pname: i32, params: ^i32)
  72. SamplerParameterIuiv: proc(sampler: u32, pname: i32, params: ^u32)
  73. Uniform1i: proc(loc: i32, v0: i32)
  74. Uniform2i: proc(loc: i32, v0, v1: i32)
  75. Uniform3i: proc(loc: i32, v0, v1, v2: i32)
  76. Uniform4i: proc(loc: i32, v0, v1, v2, v3: i32)
  77. Uniform1f: proc(loc: i32, v0: f32)
  78. Uniform2f: proc(loc: i32, v0, v1: f32)
  79. Uniform3f: proc(loc: i32, v0, v1, v2: f32)
  80. Uniform4f: proc(loc: i32, v0, v1, v2, v3: f32)
  81. UniformMatrix4fv: proc(loc: i32, count: u32, transpose: i32, value: ^f32)
  82. GetUniformLocation: proc(program: u32, name: ^byte) -> i32
  83. init :: proc() {
  84. set_proc_address :: proc(p: rawptr, name: string) #inline { (p as ^proc())^ = GetProcAddress(name); }
  85. set_proc_address(^GenBuffers, "glGenBuffers\x00")
  86. set_proc_address(^GenVertexArrays, "glGenVertexArrays\x00")
  87. set_proc_address(^GenSamplers, "glGenSamplers\x00")
  88. set_proc_address(^BindBuffer, "glBindBuffer\x00")
  89. set_proc_address(^BindSampler, "glBindSampler\x00")
  90. set_proc_address(^BindVertexArray, "glBindVertexArray\x00")
  91. set_proc_address(^BufferData, "glBufferData\x00")
  92. set_proc_address(^BufferSubData, "glBufferSubData\x00")
  93. set_proc_address(^DrawArrays, "glDrawArrays\x00")
  94. set_proc_address(^DrawElements, "glDrawElements\x00")
  95. set_proc_address(^MapBuffer, "glMapBuffer\x00")
  96. set_proc_address(^UnmapBuffer, "glUnmapBuffer\x00")
  97. set_proc_address(^VertexAttribPointer, "glVertexAttribPointer\x00")
  98. set_proc_address(^EnableVertexAttribArray, "glEnableVertexAttribArray\x00")
  99. set_proc_address(^CreateShader, "glCreateShader\x00")
  100. set_proc_address(^ShaderSource, "glShaderSource\x00")
  101. set_proc_address(^CompileShader, "glCompileShader\x00")
  102. set_proc_address(^CreateProgram, "glCreateProgram\x00")
  103. set_proc_address(^AttachShader, "glAttachShader\x00")
  104. set_proc_address(^DetachShader, "glDetachShader\x00")
  105. set_proc_address(^DeleteShader, "glDeleteShader\x00")
  106. set_proc_address(^LinkProgram, "glLinkProgram\x00")
  107. set_proc_address(^UseProgram, "glUseProgram\x00")
  108. set_proc_address(^DeleteProgram, "glDeleteProgram\x00")
  109. set_proc_address(^GetShaderiv, "glGetShaderiv\x00")
  110. set_proc_address(^GetProgramiv, "glGetProgramiv\x00")
  111. set_proc_address(^GetShaderInfoLog, "glGetShaderInfoLog\x00")
  112. set_proc_address(^GetProgramInfoLog, "glGetProgramInfoLog\x00")
  113. set_proc_address(^ActiveTexture, "glActiveTexture\x00")
  114. set_proc_address(^GenerateMipmap, "glGenerateMipmap\x00")
  115. set_proc_address(^Uniform1i, "glUniform1i\x00")
  116. set_proc_address(^UniformMatrix4fv, "glUniformMatrix4fv\x00")
  117. set_proc_address(^GetUniformLocation, "glGetUniformLocation\x00")
  118. set_proc_address(^SamplerParameteri, "glSamplerParameteri\x00")
  119. set_proc_address(^SamplerParameterf, "glSamplerParameterf\x00")
  120. set_proc_address(^SamplerParameteriv, "glSamplerParameteriv\x00")
  121. set_proc_address(^SamplerParameterfv, "glSamplerParameterfv\x00")
  122. set_proc_address(^SamplerParameterIiv, "glSamplerParameterIiv\x00")
  123. set_proc_address(^SamplerParameterIuiv, "glSamplerParameterIuiv\x00")
  124. }