gpu: avoid internal uniform buffer pointers

Uniform buffers are byte slice backed by Go structs. However, if a uniform
buffer value is embedded in a larger structure with pointers, the Cgo
pointer checker will complain. Avoid the error by moving the uniform
values into separate structures.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-02-23 16:27:54 +01:00
parent b9d131409e
commit 23757b1022
2 changed files with 62 additions and 44 deletions
+11 -5
View File
@@ -216,7 +216,12 @@ type blitter struct {
viewport image.Point viewport image.Point
prog [2]*program prog [2]*program
layout backend.InputLayout layout backend.InputLayout
colUniforms struct { colUniforms *blitColUniforms
texUniforms *blitTexUniforms
quadVerts backend.Buffer
}
type blitColUniforms struct {
vert struct { vert struct {
blitUniforms blitUniforms
_ [8]byte // Padding to a multiple of 16. _ [8]byte // Padding to a multiple of 16.
@@ -224,14 +229,13 @@ type blitter struct {
frag struct { frag struct {
colorUniforms colorUniforms
} }
} }
texUniforms struct {
type blitTexUniforms struct {
vert struct { vert struct {
blitUniforms blitUniforms
_ [8]byte // Padding to a multiple of 16. _ [8]byte // Padding to a multiple of 16.
} }
}
quadVerts backend.Buffer
} }
type uniformBuffer struct { type uniformBuffer struct {
@@ -431,6 +435,8 @@ func newBlitter(ctx backend.Device) *blitter {
ctx: ctx, ctx: ctx,
quadVerts: quadVerts, quadVerts: quadVerts,
} }
b.colUniforms = new(blitColUniforms)
b.texUniforms = new(blitTexUniforms)
prog, layout, err := createColorPrograms(ctx, shader_blit_vert, shader_blit_frag, prog, layout, err := createColorPrograms(ctx, shader_blit_vert, shader_blit_frag,
[2]interface{}{&b.colUniforms.vert, &b.texUniforms.vert}, [2]interface{}{&b.colUniforms.frag, nil}) [2]interface{}{&b.colUniforms.vert, &b.texUniforms.vert}, [2]interface{}{&b.colUniforms.frag, nil})
if err != nil { if err != nil {
+30 -18
View File
@@ -27,13 +27,19 @@ type pather struct {
type coverer struct { type coverer struct {
ctx backend.Device ctx backend.Device
prog [2]*program prog [2]*program
texUniforms struct { texUniforms *coverTexUniforms
colUniforms *coverColUniforms
layout backend.InputLayout
}
type coverTexUniforms struct {
vert struct { vert struct {
coverUniforms coverUniforms
_ [8]byte // Padding to multiple of 16. _ [8]byte // Padding to multiple of 16.
} }
} }
colUniforms struct {
type coverColUniforms struct {
vert struct { vert struct {
coverUniforms coverUniforms
_ [8]byte // Padding to multiple of 16. _ [8]byte // Padding to multiple of 16.
@@ -41,8 +47,6 @@ type coverer struct {
frag struct { frag struct {
colorUniforms colorUniforms
} }
}
layout backend.InputLayout
} }
type coverUniforms struct { type coverUniforms struct {
@@ -60,29 +64,33 @@ type stenciler struct {
ctx backend.Device ctx backend.Device
prog struct { prog struct {
prog *program prog *program
uniforms struct { uniforms *stencilUniforms
layout backend.InputLayout
}
iprog struct {
prog *program
uniforms *intersectUniforms
layout backend.InputLayout
}
fbos fboSet
intersections fboSet
indexBuf backend.Buffer
}
type stencilUniforms struct {
vert struct { vert struct {
scale [2]float32 scale [2]float32
offset [2]float32 offset [2]float32
pathOffset [2]float32 pathOffset [2]float32
_ [8]byte // Padding to multiple of 16. _ [8]byte // Padding to multiple of 16.
} }
} }
layout backend.InputLayout
} type intersectUniforms struct {
iprog struct {
prog *program
uniforms struct {
vert struct { vert struct {
uvScale [2]float32 uvScale [2]float32
uvOffset [2]float32 uvOffset [2]float32
} }
}
layout backend.InputLayout
}
fbos fboSet
intersections fboSet
indexBuf backend.Buffer
} }
type fboSet struct { type fboSet struct {
@@ -125,6 +133,8 @@ func newCoverer(ctx backend.Device) *coverer {
c := &coverer{ c := &coverer{
ctx: ctx, ctx: ctx,
} }
c.colUniforms = new(coverColUniforms)
c.texUniforms = new(coverTexUniforms)
prog, layout, err := createColorPrograms(ctx, shader_cover_vert, shader_cover_frag, prog, layout, err := createColorPrograms(ctx, shader_cover_vert, shader_cover_frag,
[2]interface{}{&c.colUniforms.vert, &c.texUniforms.vert}, [2]interface{}{&c.colUniforms.vert, &c.texUniforms.vert},
[2]interface{}{&c.colUniforms.frag, nil}, [2]interface{}{&c.colUniforms.frag, nil},
@@ -178,6 +188,7 @@ func newStenciler(ctx backend.Device) *stenciler {
if err != nil { if err != nil {
panic(err) panic(err)
} }
st.prog.uniforms = new(stencilUniforms)
vertUniforms := newUniformBuffer(ctx, &st.prog.uniforms.vert) vertUniforms := newUniformBuffer(ctx, &st.prog.uniforms.vert)
st.prog.prog = newProgram(prog, vertUniforms, nil) st.prog.prog = newProgram(prog, vertUniforms, nil)
st.prog.layout = progLayout st.prog.layout = progLayout
@@ -185,6 +196,7 @@ func newStenciler(ctx backend.Device) *stenciler {
if err != nil { if err != nil {
panic(err) panic(err)
} }
st.iprog.uniforms = new(intersectUniforms)
vertUniforms = newUniformBuffer(ctx, &st.iprog.uniforms.vert) vertUniforms = newUniformBuffer(ctx, &st.iprog.uniforms.vert)
st.iprog.prog = newProgram(iprog, vertUniforms, nil) st.iprog.prog = newProgram(iprog, vertUniforms, nil)
st.iprog.layout = iprogLayout st.iprog.layout = iprogLayout