Revert "internal/graphicsdriver/opengl/gl: refactoring"

This reverts commit a1ad87a262.

Reason: compile error
This commit is contained in:
Hajime Hoshi 2022-11-09 18:27:06 +09:00
parent a1ad87a262
commit 96298bb59d
3 changed files with 49 additions and 23 deletions

View File

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

View File

@ -17,14 +17,27 @@ func GoStr(cstr *byte) string {
return C.GoString((*C.char)(unsafe.Pointer(cstr))) return C.GoString((*C.char)(unsafe.Pointer(cstr)))
} }
// CStr takes a Go string (with or without null-termination) // Strs takes a list of Go strings (with or without null-termination) and
// and returns the C counterpart. // returns their C counterpart.
// //
// The returned free function must be called once you are done using the string // The returned free function must be called once you are done using the strings
// in order to free the memory. // in order to free the memory.
func CStr(str string) (cstr *byte, free func()) { //
cs := C.CString(str) // If no strings are provided as a parameter this function will panic.
return cs, func() { func Strs(strs ...string) (cstrs **byte, free func()) {
C.free(unsafe.Pointer(cs)) 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))
}
} }
} }

View File

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