internal/graphicsdriver/opengl/gl: reladn: refactoring

This is a reland of a1ad87a262
This commit is contained in:
Hajime Hoshi 2022-11-09 16:07:30 +09:00
parent 96298bb59d
commit 097adcf8b6
3 changed files with 23 additions and 49 deletions

View File

@ -290,8 +290,8 @@ func (c *context) newShader(shaderType uint32, source string) (shader, error) {
if s == 0 {
return 0, fmt.Errorf("opengl: glCreateShader failed: shader type: %d", shaderType)
}
cSources, free := gl.Strs(source + "\x00")
gl.ShaderSource(uint32(s), 1, cSources, nil)
cSources, free := gl.CStr(source)
gl.ShaderSource(uint32(s), 1, &cSources, nil)
free()
gl.CompileShader(s)
@ -325,8 +325,8 @@ func (c *context) newProgram(shaders []shader, attributes []string) (program, er
}
for i, name := range attributes {
l, free := gl.Strs(name + "\x00")
gl.BindAttribLocation(p, uint32(i), *l)
l, free := gl.CStr(name)
gl.BindAttribLocation(p, uint32(i), l)
free()
}
@ -360,8 +360,8 @@ func (c *context) deleteProgram(p program) {
}
func (c *context) getUniformLocationImpl(p program, location string) uniformLocation {
l, free := gl.Strs(location + "\x00")
uniform := uniformLocation(gl.GetUniformLocation(uint32(p), *l))
l, free := gl.CStr(location)
uniform := uniformLocation(gl.GetUniformLocation(uint32(p), l))
free()
return uniform
}

View File

@ -17,27 +17,14 @@ func GoStr(cstr *byte) string {
return C.GoString((*C.char)(unsafe.Pointer(cstr)))
}
// Strs takes a list of Go strings (with or without null-termination) and
// returns their C counterpart.
// CStr takes a Go string (with or without null-termination)
// and returns the C counterpart.
//
// The returned free function must be called once you are done using the strings
// The returned free function must be called once you are done using the string
// in order to free the memory.
//
// If no strings are provided as a parameter this function will panic.
func Strs(strs ...string) (cstrs **byte, free func()) {
if len(strs) == 0 {
panic("gl: expected at least 1 string at Strs")
}
css := make([]*byte, 0, len(strs))
for _, str := range strs {
cs := C.CString(str)
css = append(css, (*byte)(unsafe.Pointer(cs)))
}
return (**byte)(&css[0]), func() {
for _, cs := range css {
C.free(unsafe.Pointer(cs))
}
func CStr(str string) (cstr *byte, free func()) {
cs := C.CString(str)
return (*byte)(unsafe.Pointer(cs)), func() {
C.free(unsafe.Pointer(cs))
}
}

View File

@ -26,31 +26,18 @@ func GoStr(cstr *byte) string {
return ""
}
// Strs takes a list of Go strings (with or without null-termination) and
// returns their C counterpart.
// CStr takes a Go string (with or without null-termination)
// and returns the C counterpart.
//
// The returned free function must be called once you are done using the strings
// The returned free function must be called once you are done using the string
// in order to free the memory.
//
// If no strings are provided as a parameter this function will panic.
func Strs(strs ...string) (cstrs **byte, free func()) {
if len(strs) == 0 {
panic("gl: expected at least 1 string at Strs")
func CStr(str string) (cstr *byte, free func()) {
bs := []byte(str)
if len(bs) == 0 || bs[len(bs)-1] != 0 {
bs = append(bs, 0)
}
pinned := make([][]byte, 0, len(strs))
ptrs := make([]*byte, 0, len(strs))
for _, str := range strs {
bs := []byte(str)
if len(bs) == 0 || bs[len(bs)-1] != 0 {
bs = append(bs, 0)
}
pinned = append(pinned, bs)
ptrs = append(ptrs, &bs[0])
}
return &ptrs[0], func() {
runtime.KeepAlive(pinned)
pinned = nil
return &bs[0], func() {
runtime.KeepAlive(bs)
bs = nil
}
}