zorldo

Goofing around with Ebiten
git clone git://bsandro.tech/zorldo
Log | Files | Refs | README

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 }