mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 10:25:37 +00:00
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:
+11
-5
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user