default.go (12636B)
1 // Copyright 2020 The Ebiten Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 //go:build android || ios 16 // +build android ios 17 18 package gles 19 20 // #cgo android CFLAGS: -Dos_android 21 // #cgo android LDFLAGS: -lGLESv2 22 // #cgo ios CFLAGS: -Dos_ios 23 // #cgo ios LDFLAGS: -framework OpenGLES 24 // 25 // #if defined(os_android) 26 // #include <GLES2/gl2.h> 27 // #endif 28 // 29 // #if defined(os_ios) 30 // #include <OpenGLES/ES2/glext.h> 31 // #endif 32 import "C" 33 34 import ( 35 "unsafe" 36 ) 37 38 func glBool(x bool) C.GLboolean { 39 if x { 40 return TRUE 41 } 42 return FALSE 43 } 44 45 type DefaultContext struct{} 46 47 func (DefaultContext) ActiveTexture(texture uint32) { 48 C.glActiveTexture(C.GLenum(texture)) 49 } 50 51 func (DefaultContext) AttachShader(program uint32, shader uint32) { 52 C.glAttachShader(C.GLuint(program), C.GLuint(shader)) 53 } 54 55 func (DefaultContext) BindAttribLocation(program uint32, index uint32, name string) { 56 s, free := cString(name) 57 defer free() 58 C.glBindAttribLocation(C.GLuint(program), C.GLuint(index), (*C.GLchar)(unsafe.Pointer(s))) 59 } 60 61 func (DefaultContext) BindBuffer(target uint32, buffer uint32) { 62 C.glBindBuffer(C.GLenum(target), C.GLuint(buffer)) 63 } 64 65 func (DefaultContext) BindFramebuffer(target uint32, framebuffer uint32) { 66 C.glBindFramebuffer(C.GLenum(target), C.GLuint(framebuffer)) 67 } 68 69 func (DefaultContext) BindRenderbuffer(target uint32, renderbuffer uint32) { 70 C.glBindRenderbuffer(C.GLenum(target), C.GLuint(renderbuffer)) 71 } 72 73 func (DefaultContext) BindTexture(target uint32, texture uint32) { 74 C.glBindTexture(C.GLenum(target), C.GLuint(texture)) 75 } 76 77 func (DefaultContext) BlendFunc(sfactor uint32, dfactor uint32) { 78 C.glBlendFunc(C.GLenum(sfactor), C.GLenum(dfactor)) 79 } 80 81 func (DefaultContext) BufferData(target uint32, size int, data []byte, usage uint32) { 82 var p *byte 83 if data != nil { 84 p = &data[0] 85 } 86 C.glBufferData(C.GLenum(target), C.GLsizeiptr(size), unsafe.Pointer(p), C.GLenum(usage)) 87 } 88 89 func (DefaultContext) BufferSubData(target uint32, offset int, data []byte) { 90 C.glBufferSubData(C.GLenum(target), C.GLintptr(offset), C.GLsizeiptr(len(data)), unsafe.Pointer(&data[0])) 91 } 92 93 func (DefaultContext) CheckFramebufferStatus(target uint32) uint32 { 94 return uint32(C.glCheckFramebufferStatus(C.GLenum(target))) 95 } 96 97 func (DefaultContext) Clear(mask uint32) { 98 C.glClear(C.GLbitfield(mask)) 99 } 100 101 func (DefaultContext) ColorMask(red, green, blue, alpha bool) { 102 C.glColorMask(glBool(red), glBool(green), glBool(blue), glBool(alpha)) 103 } 104 105 func (DefaultContext) CompileShader(shader uint32) { 106 C.glCompileShader(C.GLuint(shader)) 107 } 108 109 func (DefaultContext) CreateProgram() uint32 { 110 return uint32(C.glCreateProgram()) 111 } 112 113 func (DefaultContext) CreateShader(xtype uint32) uint32 { 114 return uint32(C.glCreateShader(C.GLenum(xtype))) 115 } 116 117 func (DefaultContext) DeleteBuffers(buffers []uint32) { 118 C.glDeleteBuffers(C.GLsizei(len(buffers)), (*C.GLuint)(unsafe.Pointer(&buffers[0]))) 119 } 120 121 func (DefaultContext) DeleteFramebuffers(framebuffers []uint32) { 122 C.glDeleteFramebuffers(C.GLsizei(len(framebuffers)), (*C.GLuint)(unsafe.Pointer(&framebuffers[0]))) 123 } 124 125 func (DefaultContext) DeleteProgram(program uint32) { 126 C.glDeleteProgram(C.GLuint(program)) 127 } 128 129 func (DefaultContext) DeleteRenderbuffers(renderbuffers []uint32) { 130 C.glDeleteRenderbuffers(C.GLsizei(len(renderbuffers)), (*C.GLuint)(unsafe.Pointer(&renderbuffers[0]))) 131 } 132 133 func (DefaultContext) DeleteShader(shader uint32) { 134 C.glDeleteShader(C.GLuint(shader)) 135 } 136 137 func (DefaultContext) DeleteTextures(textures []uint32) { 138 C.glDeleteTextures(C.GLsizei(len(textures)), (*C.GLuint)(unsafe.Pointer(&textures[0]))) 139 } 140 141 func (DefaultContext) Disable(cap uint32) { 142 C.glDisable(C.GLenum(cap)) 143 } 144 145 func (DefaultContext) DisableVertexAttribArray(index uint32) { 146 C.glDisableVertexAttribArray(C.GLuint(index)) 147 } 148 149 func (DefaultContext) DrawElements(mode uint32, count int32, xtype uint32, offset int) { 150 C.glDrawElements(C.GLenum(mode), C.GLsizei(count), C.GLenum(xtype), unsafe.Pointer(uintptr(offset))) 151 } 152 153 func (DefaultContext) Enable(cap uint32) { 154 C.glEnable(C.GLenum(cap)) 155 } 156 157 func (DefaultContext) EnableVertexAttribArray(index uint32) { 158 C.glEnableVertexAttribArray(C.GLuint(index)) 159 } 160 161 func (DefaultContext) Flush() { 162 C.glFlush() 163 } 164 165 func (DefaultContext) FramebufferRenderbuffer(target uint32, attachment uint32, renderbuffertarget uint32, renderbuffer uint32) { 166 C.glFramebufferRenderbuffer(C.GLenum(target), C.GLenum(attachment), C.GLenum(renderbuffertarget), C.GLuint(renderbuffer)) 167 } 168 169 func (DefaultContext) FramebufferTexture2D(target uint32, attachment uint32, textarget uint32, texture uint32, level int32) { 170 C.glFramebufferTexture2D(C.GLenum(target), C.GLenum(attachment), C.GLenum(textarget), C.GLuint(texture), C.GLint(level)) 171 } 172 173 func (DefaultContext) GenBuffers(n int32) []uint32 { 174 buffers := make([]uint32, n) 175 C.glGenBuffers(C.GLsizei(n), (*C.GLuint)(unsafe.Pointer(&buffers[0]))) 176 return buffers 177 } 178 179 func (DefaultContext) GenFramebuffers(n int32) []uint32 { 180 framebuffers := make([]uint32, n) 181 C.glGenFramebuffers(C.GLsizei(n), (*C.GLuint)(unsafe.Pointer(&framebuffers[0]))) 182 return framebuffers 183 } 184 185 func (DefaultContext) GenRenderbuffers(n int32) []uint32 { 186 renderbuffers := make([]uint32, n) 187 C.glGenRenderbuffers(C.GLsizei(n), (*C.GLuint)(unsafe.Pointer(&renderbuffers[0]))) 188 return renderbuffers 189 } 190 191 func (DefaultContext) GenTextures(n int32) []uint32 { 192 textures := make([]uint32, n) 193 C.glGenTextures(C.GLsizei(n), (*C.GLuint)(unsafe.Pointer(&textures[0]))) 194 return textures 195 } 196 197 func (DefaultContext) GetError() uint32 { 198 return uint32(C.glGetError()) 199 } 200 201 func (DefaultContext) GetIntegerv(dst []int32, pname uint32) { 202 C.glGetIntegerv(C.GLenum(pname), (*C.GLint)(unsafe.Pointer(&dst[0]))) 203 } 204 205 func (DefaultContext) GetProgramiv(dst []int32, program uint32, pname uint32) { 206 C.glGetProgramiv(C.GLuint(program), C.GLenum(pname), (*C.GLint)(unsafe.Pointer(&dst[0]))) 207 } 208 209 func (d DefaultContext) GetProgramInfoLog(program uint32) string { 210 buflens := make([]int32, 1) 211 d.GetProgramiv(buflens, program, INFO_LOG_LENGTH) 212 buflen := buflens[0] 213 if buflen == 0 { 214 return "" 215 } 216 buf := make([]byte, buflen) 217 var length int32 218 C.glGetProgramInfoLog(C.GLuint(program), C.GLsizei(buflen), (*C.GLsizei)(unsafe.Pointer(&length)), (*C.GLchar)(unsafe.Pointer(&buf[0]))) 219 return string(buf[:length]) 220 } 221 222 func (DefaultContext) GetShaderiv(dst []int32, shader uint32, pname uint32) { 223 C.glGetShaderiv(C.GLuint(shader), C.GLenum(pname), (*C.GLint)(unsafe.Pointer(&dst[0]))) 224 } 225 226 func (d DefaultContext) GetShaderInfoLog(shader uint32) string { 227 buflens := make([]int32, 1) 228 d.GetShaderiv(buflens, shader, INFO_LOG_LENGTH) 229 buflen := buflens[0] 230 if buflen == 0 { 231 return "" 232 } 233 buf := make([]byte, buflen) 234 var length int32 235 C.glGetShaderInfoLog(C.GLuint(shader), C.GLsizei(buflen), (*C.GLsizei)(unsafe.Pointer(&length)), (*C.GLchar)(unsafe.Pointer(&buf[0]))) 236 return string(buf[:length]) 237 } 238 239 func (DefaultContext) GetShaderPrecisionFormat(shadertype uint32, precisiontype uint32) (rangeLow, rangeHigh, precision int) { 240 var r [2]int32 241 var p int32 242 C.glGetShaderPrecisionFormat(C.GLenum(shadertype), C.GLenum(precisiontype), (*C.GLint)(unsafe.Pointer(&r[0])), (*C.GLint)(unsafe.Pointer(&p))) 243 return int(r[0]), int(r[1]), int(p) 244 } 245 246 func (DefaultContext) GetUniformLocation(program uint32, name string) int32 { 247 s, free := cString(name) 248 defer free() 249 return int32(C.glGetUniformLocation(C.GLuint(program), (*C.GLchar)(unsafe.Pointer(s)))) 250 } 251 252 func (DefaultContext) IsFramebuffer(framebuffer uint32) bool { 253 return C.glIsFramebuffer(C.GLuint(framebuffer)) != FALSE 254 } 255 256 func (DefaultContext) IsProgram(program uint32) bool { 257 return C.glIsProgram(C.GLuint(program)) != FALSE 258 } 259 260 func (DefaultContext) IsRenderbuffer(renderbuffer uint32) bool { 261 return C.glIsRenderbuffer(C.GLuint(renderbuffer)) != FALSE 262 } 263 264 func (DefaultContext) IsTexture(texture uint32) bool { 265 return C.glIsTexture(C.GLuint(texture)) != FALSE 266 } 267 268 func (DefaultContext) LinkProgram(program uint32) { 269 C.glLinkProgram(C.GLuint(program)) 270 } 271 272 func (DefaultContext) PixelStorei(pname uint32, param int32) { 273 C.glPixelStorei(C.GLenum(pname), C.GLint(param)) 274 } 275 276 func (DefaultContext) ReadPixels(dst []byte, x int32, y int32, width int32, height int32, format uint32, xtype uint32) { 277 C.glReadPixels(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(xtype), unsafe.Pointer(&dst[0])) 278 } 279 280 func (DefaultContext) RenderbufferStorage(target uint32, internalFormat uint32, width int32, height int32) { 281 C.glRenderbufferStorage(C.GLenum(target), C.GLenum(internalFormat), C.GLsizei(width), C.GLsizei(height)) 282 } 283 284 func (DefaultContext) Scissor(x, y, width, height int32) { 285 C.glScissor(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height)) 286 } 287 288 func (DefaultContext) ShaderSource(shader uint32, xstring string) { 289 s, free := cStringPtr(xstring) 290 defer free() 291 C.glShaderSource(C.GLuint(shader), 1, (**C.GLchar)(unsafe.Pointer(s)), nil) 292 } 293 294 func (DefaultContext) StencilFunc(func_ uint32, ref int32, mask uint32) { 295 C.glStencilFunc(C.GLenum(func_), C.GLint(ref), C.GLuint(mask)) 296 } 297 298 func (DefaultContext) StencilOp(sfail, dpfail, dppass uint32) { 299 C.glStencilOp(C.GLenum(sfail), C.GLenum(dpfail), C.GLenum(dppass)) 300 } 301 302 func (DefaultContext) TexImage2D(target uint32, level int32, internalformat int32, width int32, height int32, format uint32, xtype uint32, pixels []byte) { 303 var p *byte 304 if pixels != nil { 305 p = &pixels[0] 306 } 307 C.glTexImage2D(C.GLenum(target), C.GLint(level), C.GLint(internalformat), C.GLsizei(width), C.GLsizei(height), 0 /* border */, C.GLenum(format), C.GLenum(xtype), unsafe.Pointer(p)) 308 } 309 310 func (DefaultContext) TexParameteri(target uint32, pname uint32, param int32) { 311 C.glTexParameteri(C.GLenum(target), C.GLenum(pname), C.GLint(param)) 312 } 313 314 func (DefaultContext) TexSubImage2D(target uint32, level int32, xoffset int32, yoffset int32, width int32, height int32, format uint32, xtype uint32, pixels []byte) { 315 C.glTexSubImage2D(C.GLenum(target), C.GLint(level), C.GLint(xoffset), C.GLint(yoffset), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(xtype), unsafe.Pointer(&pixels[0])) 316 } 317 318 func (DefaultContext) Uniform1f(location int32, v0 float32) { 319 C.glUniform1f(C.GLint(location), C.GLfloat(v0)) 320 } 321 322 func (DefaultContext) Uniform1fv(location int32, value []float32) { 323 C.glUniform1fv(C.GLint(location), C.GLsizei(len(value)), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 324 } 325 326 func (DefaultContext) Uniform1i(location int32, v0 int32) { 327 C.glUniform1i(C.GLint(location), C.GLint(v0)) 328 } 329 330 func (DefaultContext) Uniform2fv(location int32, value []float32) { 331 C.glUniform2fv(C.GLint(location), C.GLsizei(len(value)/2), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 332 } 333 334 func (DefaultContext) Uniform3fv(location int32, value []float32) { 335 C.glUniform3fv(C.GLint(location), C.GLsizei(len(value)/3), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 336 } 337 338 func (DefaultContext) Uniform4fv(location int32, value []float32) { 339 C.glUniform4fv(C.GLint(location), C.GLsizei(len(value)/4), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 340 } 341 342 func (DefaultContext) UniformMatrix2fv(location int32, transpose bool, value []float32) { 343 C.glUniformMatrix2fv(C.GLint(location), C.GLsizei(len(value)/4), glBool(transpose), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 344 } 345 346 func (DefaultContext) UniformMatrix3fv(location int32, transpose bool, value []float32) { 347 C.glUniformMatrix3fv(C.GLint(location), C.GLsizei(len(value)/9), glBool(transpose), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 348 } 349 350 func (DefaultContext) UniformMatrix4fv(location int32, transpose bool, value []float32) { 351 C.glUniformMatrix4fv(C.GLint(location), C.GLsizei(len(value)/16), glBool(transpose), (*C.GLfloat)(unsafe.Pointer(&value[0]))) 352 } 353 354 func (DefaultContext) UseProgram(program uint32) { 355 C.glUseProgram(C.GLuint(program)) 356 } 357 358 func (DefaultContext) VertexAttribPointer(index uint32, size int32, xtype uint32, normalized bool, stride int32, offset int) { 359 C.glVertexAttribPointer(C.GLuint(index), C.GLint(size), C.GLenum(xtype), glBool(normalized), C.GLsizei(stride), unsafe.Pointer(uintptr(offset))) 360 } 361 362 func (DefaultContext) Viewport(x int32, y int32, width int32, height int32) { 363 C.glViewport(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height)) 364 }