mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
gpu,gpu/internal: split shader storage usage into read and write
Metal has texture write usage flags for read and write. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+12
-12
@@ -902,7 +902,7 @@ restart:
|
|||||||
m.cpuTex.Free()
|
m.cpuTex.Free()
|
||||||
handle, err := g.ctx.NewTexture(driver.TextureFormatRGBA8, texSize, texSize,
|
handle, err := g.ctx.NewTexture(driver.TextureFormatRGBA8, texSize, texSize,
|
||||||
driver.FilterNearest, driver.FilterNearest,
|
driver.FilterNearest, driver.FilterNearest,
|
||||||
driver.BufferBindingShaderStorage|driver.BufferBindingFramebuffer)
|
driver.BufferBindingShaderStorageRead|driver.BufferBindingFramebuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("compute: failed to create material atlas: %v", err)
|
return fmt.Errorf("compute: failed to create material atlas: %v", err)
|
||||||
}
|
}
|
||||||
@@ -919,11 +919,11 @@ restart:
|
|||||||
}
|
}
|
||||||
// Transform to clip space: [-1, -1] - [1, 1] and flip Y-axis to cancel the implied transformation
|
// Transform to clip space: [-1, -1] - [1, 1] and flip Y-axis to cancel the implied transformation
|
||||||
// between framebuffer and texture space.
|
// between framebuffer and texture space.
|
||||||
g.materials.vert.uniforms.scale = [2]float32{2 / float32(texSize), -2 / float32(texSize)}
|
m.vert.uniforms.scale = [2]float32{2 / float32(texSize), -2 / float32(texSize)}
|
||||||
g.materials.vert.uniforms.pos = [2]float32{-1, +1}
|
m.vert.uniforms.pos = [2]float32{-1, +1}
|
||||||
g.materials.vert.buf.Upload(byteslice.Struct(g.materials.vert.uniforms))
|
m.vert.buf.Upload(byteslice.Struct(m.vert.uniforms))
|
||||||
g.ctx.BindVertexUniforms(g.materials.vert.buf)
|
g.ctx.BindVertexUniforms(m.vert.buf)
|
||||||
g.ctx.BindFragmentUniforms(g.materials.frag.buf)
|
g.ctx.BindFragmentUniforms(m.frag.buf)
|
||||||
vertexData := byteslice.Slice(m.quads)
|
vertexData := byteslice.Slice(m.quads)
|
||||||
n := pow2Ceil(len(vertexData))
|
n := pow2Ceil(len(vertexData))
|
||||||
m.buffer.ensureCapacity(false, g.ctx, driver.BufferBindingVertices, n)
|
m.buffer.ensureCapacity(false, g.ctx, driver.BufferBindingVertices, n)
|
||||||
@@ -1125,7 +1125,7 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim
|
|||||||
scene := byteslice.Slice(enc.scene)
|
scene := byteslice.Slice(enc.scene)
|
||||||
if s := len(scene); s > g.buffers.scene.size {
|
if s := len(scene); s > g.buffers.scene.size {
|
||||||
paddedCap := s * 11 / 10
|
paddedCap := s * 11 / 10
|
||||||
if err := g.buffers.scene.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorage, paddedCap); err != nil {
|
if err := g.buffers.scene.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorageRead, paddedCap); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1161,13 +1161,13 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim
|
|||||||
clearSize := 4 + numPartitions*stateStride
|
clearSize := 4 + numPartitions*stateStride
|
||||||
if clearSize > g.buffers.state.size {
|
if clearSize > g.buffers.state.size {
|
||||||
paddedCap := clearSize * 11 / 10
|
paddedCap := clearSize * 11 / 10
|
||||||
if err := g.buffers.state.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorage, paddedCap); err != nil {
|
if err := g.buffers.state.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite, paddedCap); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
confData := byteslice.Struct(g.conf)
|
confData := byteslice.Struct(g.conf)
|
||||||
g.buffers.config.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorage, len(confData))
|
g.buffers.config.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorageRead, len(confData))
|
||||||
g.buffers.config.upload(confData)
|
g.buffers.config.upload(confData)
|
||||||
|
|
||||||
minSize := int(unsafe.Sizeof(memoryHeader{})) + int(alloc)
|
minSize := int(unsafe.Sizeof(memoryHeader{})) + int(alloc)
|
||||||
@@ -1175,7 +1175,7 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim
|
|||||||
// 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.useCPU, g.ctx, driver.BufferBindingShaderStorage, minSize); err != nil {
|
if err := g.buffers.memory.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite, minSize); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1234,7 +1234,7 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim
|
|||||||
case memMallocFailed:
|
case memMallocFailed:
|
||||||
// Resize memory and try again.
|
// Resize memory and try again.
|
||||||
sz := g.buffers.memory.size * 15 / 10
|
sz := g.buffers.memory.size * 15 / 10
|
||||||
if err := g.buffers.memory.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorage, sz); err != nil {
|
if err := g.buffers.memory.ensureCapacity(g.useCPU, g.ctx, driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite, sz); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
@@ -1312,7 +1312,7 @@ func (a *layerAtlas) ensureSize(useCPU bool, ctx driver.Device, size image.Point
|
|||||||
img, err := ctx.NewTexture(driver.TextureFormatRGBA8, size.X, size.Y,
|
img, err := ctx.NewTexture(driver.TextureFormatRGBA8, size.X, size.Y,
|
||||||
driver.FilterNearest,
|
driver.FilterNearest,
|
||||||
driver.FilterNearest,
|
driver.FilterNearest,
|
||||||
driver.BufferBindingShaderStorage|driver.BufferBindingTexture|driver.BufferBindingFramebuffer)
|
driver.BufferBindingShaderStorageWrite|driver.BufferBindingTexture|driver.BufferBindingFramebuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,7 +157,8 @@ const (
|
|||||||
BufferBindingUniforms
|
BufferBindingUniforms
|
||||||
BufferBindingTexture
|
BufferBindingTexture
|
||||||
BufferBindingFramebuffer
|
BufferBindingFramebuffer
|
||||||
BufferBindingShaderStorage
|
BufferBindingShaderStorageRead
|
||||||
|
BufferBindingShaderStorageWrite
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -984,7 +984,7 @@ func lookupUniform(funcs *gl.Functions, p gl.Program, loc shader.UniformLocation
|
|||||||
|
|
||||||
func (b *Backend) BindStorageBuffer(binding int, buf driver.Buffer) {
|
func (b *Backend) BindStorageBuffer(binding int, buf driver.Buffer) {
|
||||||
bf := buf.(*buffer)
|
bf := buf.(*buffer)
|
||||||
if bf.typ&driver.BufferBindingShaderStorage == 0 {
|
if bf.typ&(driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite) == 0 {
|
||||||
panic("not a shader storage buffer")
|
panic("not a shader storage buffer")
|
||||||
}
|
}
|
||||||
b.storage[binding] = bf
|
b.storage[binding] = bf
|
||||||
@@ -1356,7 +1356,7 @@ func firstBufferType(typ driver.BufferBinding) gl.Enum {
|
|||||||
return gl.ARRAY_BUFFER
|
return gl.ARRAY_BUFFER
|
||||||
case typ&driver.BufferBindingUniforms != 0:
|
case typ&driver.BufferBindingUniforms != 0:
|
||||||
return gl.UNIFORM_BUFFER
|
return gl.UNIFORM_BUFFER
|
||||||
case typ&driver.BufferBindingShaderStorage != 0:
|
case typ&(driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite) != 0:
|
||||||
return gl.SHADER_STORAGE_BUFFER
|
return gl.SHADER_STORAGE_BUFFER
|
||||||
default:
|
default:
|
||||||
panic("unsupported buffer type")
|
panic("unsupported buffer type")
|
||||||
|
|||||||
Reference in New Issue
Block a user