diff --git a/gpu/compute.go b/gpu/compute.go index 8de7e5ac..570229bd 100644 --- a/gpu/compute.go +++ b/gpu/compute.go @@ -902,7 +902,7 @@ restart: m.cpuTex.Free() handle, err := g.ctx.NewTexture(driver.TextureFormatRGBA8, texSize, texSize, driver.FilterNearest, driver.FilterNearest, - driver.BufferBindingShaderStorage|driver.BufferBindingFramebuffer) + driver.BufferBindingShaderStorageRead|driver.BufferBindingFramebuffer) if err != nil { 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 // between framebuffer and texture space. - g.materials.vert.uniforms.scale = [2]float32{2 / float32(texSize), -2 / float32(texSize)} - g.materials.vert.uniforms.pos = [2]float32{-1, +1} - g.materials.vert.buf.Upload(byteslice.Struct(g.materials.vert.uniforms)) - g.ctx.BindVertexUniforms(g.materials.vert.buf) - g.ctx.BindFragmentUniforms(g.materials.frag.buf) + m.vert.uniforms.scale = [2]float32{2 / float32(texSize), -2 / float32(texSize)} + m.vert.uniforms.pos = [2]float32{-1, +1} + m.vert.buf.Upload(byteslice.Struct(m.vert.uniforms)) + g.ctx.BindVertexUniforms(m.vert.buf) + g.ctx.BindFragmentUniforms(m.frag.buf) vertexData := byteslice.Slice(m.quads) n := pow2Ceil(len(vertexData)) 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) if s := len(scene); s > g.buffers.scene.size { 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 } } @@ -1161,13 +1161,13 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim clearSize := 4 + numPartitions*stateStride if clearSize > g.buffers.state.size { 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 } } 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) 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. const sizeBump = 4 * 1024 * 1024 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 } } @@ -1234,7 +1234,7 @@ func (g *compute) render(dst driver.Texture, cpuDst cpu.ImageDescriptor, tileDim case memMallocFailed: // Resize memory and try again. 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 } 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, driver.FilterNearest, driver.FilterNearest, - driver.BufferBindingShaderStorage|driver.BufferBindingTexture|driver.BufferBindingFramebuffer) + driver.BufferBindingShaderStorageWrite|driver.BufferBindingTexture|driver.BufferBindingFramebuffer) if err != nil { return err } diff --git a/gpu/internal/driver/driver.go b/gpu/internal/driver/driver.go index 4fb4da24..f272e66b 100644 --- a/gpu/internal/driver/driver.go +++ b/gpu/internal/driver/driver.go @@ -157,7 +157,8 @@ const ( BufferBindingUniforms BufferBindingTexture BufferBindingFramebuffer - BufferBindingShaderStorage + BufferBindingShaderStorageRead + BufferBindingShaderStorageWrite ) const ( diff --git a/gpu/internal/opengl/opengl.go b/gpu/internal/opengl/opengl.go index 57a910de..788c1e1d 100644 --- a/gpu/internal/opengl/opengl.go +++ b/gpu/internal/opengl/opengl.go @@ -984,7 +984,7 @@ func lookupUniform(funcs *gl.Functions, p gl.Program, loc shader.UniformLocation func (b *Backend) BindStorageBuffer(binding int, buf driver.Buffer) { bf := buf.(*buffer) - if bf.typ&driver.BufferBindingShaderStorage == 0 { + if bf.typ&(driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite) == 0 { panic("not a shader storage buffer") } b.storage[binding] = bf @@ -1356,7 +1356,7 @@ func firstBufferType(typ driver.BufferBinding) gl.Enum { return gl.ARRAY_BUFFER case typ&driver.BufferBindingUniforms != 0: return gl.UNIFORM_BUFFER - case typ&driver.BufferBindingShaderStorage != 0: + case typ&(driver.BufferBindingShaderStorageRead|driver.BufferBindingShaderStorageWrite) != 0: return gl.SHADER_STORAGE_BUFFER default: panic("unsupported buffer type")