mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-06 18:05:35 +00:00
gpu: add NewBuffer and Buffer.Upload for creating mutable buffers
We're going to need them for shader uniform buffer storage. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -23,6 +23,7 @@ type Backend interface {
|
|||||||
NilTexture() Texture
|
NilTexture() Texture
|
||||||
NewFramebuffer() Framebuffer
|
NewFramebuffer() Framebuffer
|
||||||
NewImmutableBuffer(typ BufferType, data []byte) Buffer
|
NewImmutableBuffer(typ BufferType, data []byte) Buffer
|
||||||
|
NewBuffer(typ BufferType, size int) Buffer
|
||||||
NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error)
|
NewProgram(vertexShader, fragmentShader ShaderSources) (Program, error)
|
||||||
NewInputLayout(vertexShader ShaderSources, layout []InputDesc) (InputLayout, error)
|
NewInputLayout(vertexShader ShaderSources, layout []InputDesc) (InputLayout, error)
|
||||||
|
|
||||||
@@ -118,6 +119,7 @@ type Buffer interface {
|
|||||||
BindVertex(stride, offset int)
|
BindVertex(stride, offset int)
|
||||||
BindIndex()
|
BindIndex()
|
||||||
Release()
|
Release()
|
||||||
|
Upload(data []byte)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Framebuffer interface {
|
type Framebuffer interface {
|
||||||
|
|||||||
+37
-15
@@ -60,9 +60,11 @@ type gpuFramebuffer struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type gpuBuffer struct {
|
type gpuBuffer struct {
|
||||||
backend *Backend
|
backend *Backend
|
||||||
obj Buffer
|
obj Buffer
|
||||||
typ Enum
|
typ Enum
|
||||||
|
size int
|
||||||
|
immutable bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type gpuProgram struct {
|
type gpuProgram struct {
|
||||||
@@ -162,20 +164,18 @@ func (b *Backend) NewTexture(minFilter, magFilter gpu.TextureFilter) gpu.Texture
|
|||||||
return tex
|
return tex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Backend) NewBuffer(typ gpu.BufferType, size int) gpu.Buffer {
|
||||||
|
obj := b.funcs.CreateBuffer()
|
||||||
|
gltyp := toBufferType(typ)
|
||||||
|
return &gpuBuffer{backend: b, obj: obj, typ: gltyp, size: size}
|
||||||
|
}
|
||||||
|
|
||||||
func (b *Backend) NewImmutableBuffer(typ gpu.BufferType, data []byte) gpu.Buffer {
|
func (b *Backend) NewImmutableBuffer(typ gpu.BufferType, data []byte) gpu.Buffer {
|
||||||
obj := b.funcs.CreateBuffer()
|
obj := b.funcs.CreateBuffer()
|
||||||
var gltyp Enum
|
gltyp := toBufferType(typ)
|
||||||
switch typ {
|
buf := &gpuBuffer{backend: b, obj: obj, typ: gltyp, size: len(data)}
|
||||||
case gpu.BufferTypeVertices:
|
buf.Upload(data)
|
||||||
gltyp = ARRAY_BUFFER
|
buf.immutable = true
|
||||||
case gpu.BufferTypeIndices:
|
|
||||||
gltyp = ELEMENT_ARRAY_BUFFER
|
|
||||||
default:
|
|
||||||
panic("unsupported buffer type")
|
|
||||||
}
|
|
||||||
buf := &gpuBuffer{backend: b, obj: obj, typ: gltyp}
|
|
||||||
b.funcs.BindBuffer(gltyp, obj)
|
|
||||||
b.funcs.BufferData(gltyp, data, STATIC_DRAW)
|
|
||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,6 +362,17 @@ func (p *gpuProgram) Release() {
|
|||||||
p.backend.funcs.DeleteProgram(p.obj)
|
p.backend.funcs.DeleteProgram(p.obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *gpuBuffer) Upload(data []byte) {
|
||||||
|
if b.immutable {
|
||||||
|
panic("immutable buffer")
|
||||||
|
}
|
||||||
|
if len(data) > b.size {
|
||||||
|
panic("buffer size overflow")
|
||||||
|
}
|
||||||
|
b.backend.funcs.BindBuffer(b.typ, b.obj)
|
||||||
|
b.backend.funcs.BufferData(b.typ, data, STATIC_DRAW)
|
||||||
|
}
|
||||||
|
|
||||||
func (b *gpuBuffer) Release() {
|
func (b *gpuBuffer) Release() {
|
||||||
b.backend.funcs.DeleteBuffer(b.obj)
|
b.backend.funcs.DeleteBuffer(b.obj)
|
||||||
}
|
}
|
||||||
@@ -567,3 +578,14 @@ func hasExtension(exts []string, ext string) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toBufferType(typ gpu.BufferType) Enum {
|
||||||
|
switch typ {
|
||||||
|
case gpu.BufferTypeVertices:
|
||||||
|
return ARRAY_BUFFER
|
||||||
|
case gpu.BufferTypeIndices:
|
||||||
|
return ELEMENT_ARRAY_BUFFER
|
||||||
|
default:
|
||||||
|
panic("unsupported buffer type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user