mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 02:15:34 +00:00
gpu: [compute] generalize sizedBuffer to cover vertex buffers
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+12
-26
@@ -76,8 +76,7 @@ type compute struct {
|
|||||||
fbo driver.Framebuffer
|
fbo driver.Framebuffer
|
||||||
quads []materialVertex
|
quads []materialVertex
|
||||||
|
|
||||||
bufSize int
|
buffer sizedBuffer
|
||||||
buffer driver.Buffer
|
|
||||||
}
|
}
|
||||||
timers struct {
|
timers struct {
|
||||||
profile string
|
profile string
|
||||||
@@ -457,20 +456,9 @@ restart:
|
|||||||
m.quads[i].posY = p.Y
|
m.quads[i].posY = p.Y
|
||||||
}
|
}
|
||||||
vertexData := byteslice.Slice(m.quads)
|
vertexData := byteslice.Slice(m.quads)
|
||||||
if len(vertexData) > m.bufSize {
|
n := pow2Ceil(len(vertexData))
|
||||||
if m.buffer != nil {
|
m.buffer.ensureCapacity(g.ctx, driver.BufferBindingVertices, n)
|
||||||
m.buffer.Release()
|
m.buffer.buffer.Upload(vertexData)
|
||||||
m.buffer = nil
|
|
||||||
}
|
|
||||||
n := pow2Ceil(len(vertexData))
|
|
||||||
buf, err := g.ctx.NewBuffer(driver.BufferBindingVertices, n)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
m.bufSize = n
|
|
||||||
m.buffer = buf
|
|
||||||
}
|
|
||||||
m.buffer.Upload(vertexData)
|
|
||||||
g.ctx.BindTexture(0, g.images.tex)
|
g.ctx.BindTexture(0, g.images.tex)
|
||||||
g.ctx.BindFramebuffer(m.fbo)
|
g.ctx.BindFramebuffer(m.fbo)
|
||||||
g.ctx.Viewport(0, 0, texSize, texSize)
|
g.ctx.Viewport(0, 0, texSize, texSize)
|
||||||
@@ -478,7 +466,7 @@ restart:
|
|||||||
g.ctx.Clear(0, 0, 0, 0)
|
g.ctx.Clear(0, 0, 0, 0)
|
||||||
}
|
}
|
||||||
g.ctx.BindProgram(m.prog)
|
g.ctx.BindProgram(m.prog)
|
||||||
g.ctx.BindVertexBuffer(m.buffer, int(unsafe.Sizeof(m.quads[0])), 0)
|
g.ctx.BindVertexBuffer(m.buffer.buffer, int(unsafe.Sizeof(m.quads[0])), 0)
|
||||||
g.ctx.BindInputLayout(m.layout)
|
g.ctx.BindInputLayout(m.layout)
|
||||||
g.ctx.DrawArrays(driver.DrawModeTriangles, 0, len(m.quads))
|
g.ctx.DrawArrays(driver.DrawModeTriangles, 0, len(m.quads))
|
||||||
return nil
|
return nil
|
||||||
@@ -738,7 +726,7 @@ func (g *compute) render(tileDims image.Point) error {
|
|||||||
if s := len(scene); s > g.buffers.scene.size {
|
if s := len(scene); s > g.buffers.scene.size {
|
||||||
realloced = true
|
realloced = true
|
||||||
paddedCap := s * 11 / 10
|
paddedCap := s * 11 / 10
|
||||||
if err := g.buffers.scene.ensureCapacity(g.ctx, paddedCap); err != nil {
|
if err := g.buffers.scene.ensureCapacity(g.ctx, driver.BufferBindingShaderStorage, paddedCap); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -786,7 +774,7 @@ func (g *compute) render(tileDims image.Point) error {
|
|||||||
if clearSize > g.buffers.state.size {
|
if clearSize > g.buffers.state.size {
|
||||||
realloced = true
|
realloced = true
|
||||||
paddedCap := clearSize * 11 / 10
|
paddedCap := clearSize * 11 / 10
|
||||||
if err := g.buffers.state.ensureCapacity(g.ctx, paddedCap); err != nil {
|
if err := g.buffers.state.ensureCapacity(g.ctx, driver.BufferBindingShaderStorage, paddedCap); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -799,7 +787,7 @@ func (g *compute) render(tileDims image.Point) error {
|
|||||||
// Add space for dynamic GPU allocations.
|
// Add space for dynamic GPU allocations.
|
||||||
const sizeBump = 4 * 1024 * 1024
|
const sizeBump = 4 * 1024 * 1024
|
||||||
minSize += sizeBump
|
minSize += sizeBump
|
||||||
if err := g.buffers.memory.ensureCapacity(g.ctx, minSize); err != nil {
|
if err := g.buffers.memory.ensureCapacity(g.ctx, driver.BufferBindingShaderStorage, minSize); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -863,7 +851,7 @@ func (g *compute) render(tileDims image.Point) error {
|
|||||||
// Resize memory and try again.
|
// Resize memory and try again.
|
||||||
realloced = true
|
realloced = true
|
||||||
sz := g.buffers.memory.size * 15 / 10
|
sz := g.buffers.memory.size * 15 / 10
|
||||||
if err := g.buffers.memory.ensureCapacity(g.ctx, sz); err != nil {
|
if err := g.buffers.memory.ensureCapacity(g.ctx, driver.BufferBindingShaderStorage, sz); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
@@ -946,9 +934,7 @@ func (g *compute) Release() {
|
|||||||
if g.materials.tex != nil {
|
if g.materials.tex != nil {
|
||||||
g.materials.tex.Release()
|
g.materials.tex.Release()
|
||||||
}
|
}
|
||||||
if g.materials.buffer != nil {
|
g.materials.buffer.release()
|
||||||
g.materials.buffer.Release()
|
|
||||||
}
|
|
||||||
if g.timers.t != nil {
|
if g.timers.t != nil {
|
||||||
g.timers.t.release()
|
g.timers.t.release()
|
||||||
}
|
}
|
||||||
@@ -974,14 +960,14 @@ func (b *sizedBuffer) release() {
|
|||||||
*b = sizedBuffer{}
|
*b = sizedBuffer{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *sizedBuffer) ensureCapacity(ctx driver.Device, size int) error {
|
func (b *sizedBuffer) ensureCapacity(ctx driver.Device, binding driver.BufferBinding, size int) error {
|
||||||
if b.size >= size {
|
if b.size >= size {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if b.buffer != nil {
|
if b.buffer != nil {
|
||||||
b.release()
|
b.release()
|
||||||
}
|
}
|
||||||
buf, err := ctx.NewBuffer(driver.BufferBindingShaderStorage, size)
|
buf, err := ctx.NewBuffer(binding, size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user