gpu/gl: remove OpenGL functions parameter from NewBackend

As a consequence, most API is gone from gpu/gl, and embedding Gio in
foreign frameworks don't need to provide an OpenGL implementation.

The next change simplifies the GLFW embedding example accordingly.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-12-04 17:56:25 +01:00
parent b8e33bb420
commit ffe5ab51a2
16 changed files with 503 additions and 489 deletions
+2 -8
View File
@@ -3,7 +3,6 @@
package headless package headless
import ( import (
"gioui.org/app/internal/glimpl"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
@@ -24,14 +23,13 @@ __attribute__ ((visibility ("hidden"))) void gio_headless_prepareContext(CFTypeR
import "C" import "C"
type nsContext struct { type nsContext struct {
c *glimpl.Functions
ctx C.CFTypeRef ctx C.CFTypeRef
prepared bool prepared bool
} }
func newGLContext() (context, error) { func newGLContext() (context, error) {
ctx := C.gio_headless_newContext() ctx := C.gio_headless_newContext()
return &nsContext{ctx: ctx, c: new(glimpl.Functions)}, nil return &nsContext{ctx: ctx}, nil
} }
func (c *nsContext) MakeCurrent() error { func (c *nsContext) MakeCurrent() error {
@@ -48,11 +46,7 @@ func (c *nsContext) ReleaseCurrent() {
} }
func (c *nsContext) Backend() (backend.Device, error) { func (c *nsContext) Backend() (backend.Device, error) {
return gl.NewBackend(c.c) return gl.NewBackend(nil)
}
func (c *nsContext) Functions() *glimpl.Functions {
return c.c
} }
func (d *nsContext) Release() { func (d *nsContext) Release() {
+2 -12
View File
@@ -6,14 +6,13 @@ import (
"errors" "errors"
"syscall/js" "syscall/js"
"gioui.org/app/internal/glimpl"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
"gioui.org/internal/glimpl"
) )
type jsContext struct { type jsContext struct {
ctx js.Value ctx js.Value
f *glimpl.Functions
} }
func newGLContext() (context, error) { func newGLContext() (context, error) {
@@ -26,23 +25,14 @@ func newGLContext() (context, error) {
if ctx.IsNull() { if ctx.IsNull() {
return nil, errors.New("headless: webgl is not supported") return nil, errors.New("headless: webgl is not supported")
} }
f := &glimpl.Functions{Ctx: ctx}
if err := f.Init(); err != nil {
return nil, err
}
c := &jsContext{ c := &jsContext{
ctx: ctx, ctx: ctx,
f: f,
} }
return c, nil return c, nil
} }
func (c *jsContext) Backend() (backend.Device, error) { func (c *jsContext) Backend() (backend.Device, error) {
return gl.NewBackend(c.f) return gl.NewBackend(glimpl.Context(c.ctx))
}
func (c *jsContext) Functions() *glimpl.Functions {
return c.f
} }
func (c *jsContext) Release() { func (c *jsContext) Release() {
+8 -8
View File
@@ -10,10 +10,10 @@ import (
"runtime" "runtime"
"strings" "strings"
"gioui.org/app/internal/glimpl"
"gioui.org/app/internal/srgb" "gioui.org/app/internal/srgb"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
"gioui.org/internal/glimpl"
) )
type Context struct { type Context struct {
@@ -106,20 +106,20 @@ func NewContext(disp NativeDisplayType) (*Context, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
f, err := glimpl.NewFunctions(nil)
if err != nil {
return nil, err
}
c := &Context{ c := &Context{
disp: eglDisp, disp: eglDisp,
eglCtx: eglCtx, eglCtx: eglCtx,
c: new(glimpl.Functions), c: f,
} }
return c, nil return c, nil
} }
func (c *Context) Functions() *glimpl.Functions {
return c.c
}
func (c *Context) Backend() (backend.Device, error) { func (c *Context) Backend() (backend.Device, error) {
return gl.NewBackend(c.c) return gl.NewBackend(nil)
} }
func (c *Context) ReleaseSurface() { func (c *Context) ReleaseSurface() {
@@ -164,7 +164,7 @@ func (c *Context) MakeCurrent() error {
} }
if c.srgbFBO == nil { if c.srgbFBO == nil {
var err error var err error
c.srgbFBO, err = srgb.New(c.c) c.srgbFBO, err = srgb.New(nil)
if err != nil { if err != nil {
c.ReleaseCurrent() c.ReleaseCurrent()
return err return err
+1 -1
View File
@@ -10,7 +10,7 @@ import (
syscall "golang.org/x/sys/windows" syscall "golang.org/x/sys/windows"
"gioui.org/app/internal/glimpl" "gioui.org/internal/glimpl"
gunsafe "gioui.org/internal/unsafe" gunsafe "gioui.org/internal/unsafe"
) )
+50 -47
View File
@@ -7,8 +7,7 @@ import (
"runtime" "runtime"
"strings" "strings"
"gioui.org/app/internal/glimpl" "gioui.org/internal/glimpl"
"gioui.org/gpu/gl"
"gioui.org/internal/unsafe" "gioui.org/internal/unsafe"
) )
@@ -18,26 +17,30 @@ import (
type FBO struct { type FBO struct {
c *glimpl.Functions c *glimpl.Functions
width, height int width, height int
frameBuffer gl.Framebuffer frameBuffer glimpl.Framebuffer
depthBuffer gl.Renderbuffer depthBuffer glimpl.Renderbuffer
colorTex gl.Texture colorTex glimpl.Texture
blitted bool blitted bool
quad gl.Buffer quad glimpl.Buffer
prog gl.Program prog glimpl.Program
gl3 bool gl3 bool
} }
func New(f *glimpl.Functions) (*FBO, error) { func New(ctx glimpl.Context) (*FBO, error) {
f, err := glimpl.NewFunctions(ctx)
if err != nil {
return nil, err
}
var gl3 bool var gl3 bool
glVer := f.GetString(gl.VERSION) glVer := f.GetString(glimpl.VERSION)
ver, _, err := gl.ParseGLVersion(glVer) ver, _, err := glimpl.ParseGLVersion(glVer)
if err != nil { if err != nil {
return nil, err return nil, err
} }
if ver[0] >= 3 { if ver[0] >= 3 {
gl3 = true gl3 = true
} else { } else {
exts := f.GetString(gl.EXTENSIONS) exts := f.GetString(glimpl.EXTENSIONS)
if !strings.Contains(exts, "EXT_sRGB") { if !strings.Contains(exts, "EXT_sRGB") {
return nil, fmt.Errorf("no support for OpenGL ES 3 nor EXT_sRGB") return nil, fmt.Errorf("no support for OpenGL ES 3 nor EXT_sRGB")
} }
@@ -49,17 +52,17 @@ func New(f *glimpl.Functions) (*FBO, error) {
colorTex: f.CreateTexture(), colorTex: f.CreateTexture(),
depthBuffer: f.CreateRenderbuffer(), depthBuffer: f.CreateRenderbuffer(),
} }
f.BindTexture(gl.TEXTURE_2D, s.colorTex) f.BindTexture(glimpl.TEXTURE_2D, s.colorTex)
f.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_S, glimpl.CLAMP_TO_EDGE)
f.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_T, glimpl.CLAMP_TO_EDGE)
f.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MAG_FILTER, glimpl.NEAREST)
f.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MIN_FILTER, glimpl.NEAREST)
return s, nil return s, nil
} }
func (s *FBO) Blit() { func (s *FBO) Blit() {
if !s.blitted { if !s.blitted {
prog, err := gl.CreateProgram(s.c, blitVSrc, blitFSrc, []string{"pos", "uv"}) prog, err := glimpl.CreateProgram(s.c, blitVSrc, blitFSrc, []string{"pos", "uv"})
if err != nil { if err != nil {
panic(err) panic(err)
} }
@@ -67,39 +70,39 @@ func (s *FBO) Blit() {
s.c.UseProgram(prog) s.c.UseProgram(prog)
s.c.Uniform1i(s.c.GetUniformLocation(prog, "tex"), 0) s.c.Uniform1i(s.c.GetUniformLocation(prog, "tex"), 0)
s.quad = s.c.CreateBuffer() s.quad = s.c.CreateBuffer()
s.c.BindBuffer(gl.ARRAY_BUFFER, s.quad) s.c.BindBuffer(glimpl.ARRAY_BUFFER, s.quad)
s.c.BufferData(gl.ARRAY_BUFFER, s.c.BufferData(glimpl.ARRAY_BUFFER,
unsafe.BytesView([]float32{ unsafe.BytesView([]float32{
-1, +1, 0, 1, -1, +1, 0, 1,
+1, +1, 1, 1, +1, +1, 1, 1,
-1, -1, 0, 0, -1, -1, 0, 0,
+1, -1, 1, 0, +1, -1, 1, 0,
}), }),
gl.STATIC_DRAW) glimpl.STATIC_DRAW)
s.blitted = true s.blitted = true
} }
s.c.BindFramebuffer(gl.FRAMEBUFFER, gl.Framebuffer{}) s.c.BindFramebuffer(glimpl.FRAMEBUFFER, glimpl.Framebuffer{})
s.c.UseProgram(s.prog) s.c.UseProgram(s.prog)
s.c.BindTexture(gl.TEXTURE_2D, s.colorTex) s.c.BindTexture(glimpl.TEXTURE_2D, s.colorTex)
s.c.BindBuffer(gl.ARRAY_BUFFER, s.quad) s.c.BindBuffer(glimpl.ARRAY_BUFFER, s.quad)
s.c.VertexAttribPointer(0 /* pos */, 2, gl.FLOAT, false, 4*4, 0) s.c.VertexAttribPointer(0 /* pos */, 2, glimpl.FLOAT, false, 4*4, 0)
s.c.VertexAttribPointer(1 /* uv */, 2, gl.FLOAT, false, 4*4, 4*2) s.c.VertexAttribPointer(1 /* uv */, 2, glimpl.FLOAT, false, 4*4, 4*2)
s.c.EnableVertexAttribArray(0) s.c.EnableVertexAttribArray(0)
s.c.EnableVertexAttribArray(1) s.c.EnableVertexAttribArray(1)
s.c.DrawArrays(gl.TRIANGLE_STRIP, 0, 4) s.c.DrawArrays(glimpl.TRIANGLE_STRIP, 0, 4)
s.c.BindTexture(gl.TEXTURE_2D, gl.Texture{}) s.c.BindTexture(glimpl.TEXTURE_2D, glimpl.Texture{})
s.c.DisableVertexAttribArray(0) s.c.DisableVertexAttribArray(0)
s.c.DisableVertexAttribArray(1) s.c.DisableVertexAttribArray(1)
s.c.BindFramebuffer(gl.FRAMEBUFFER, s.frameBuffer) s.c.BindFramebuffer(glimpl.FRAMEBUFFER, s.frameBuffer)
s.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0) s.c.InvalidateFramebuffer(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0)
s.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT) s.c.InvalidateFramebuffer(glimpl.FRAMEBUFFER, glimpl.DEPTH_ATTACHMENT)
// The Android emulator requires framebuffer 0 bound at eglSwapBuffer time. // The Android emulator requires framebuffer 0 bound at eglSwapBuffer time.
// Bind the sRGB framebuffer again in afterPresent. // Bind the sRGB framebuffer again in afterPresent.
s.c.BindFramebuffer(gl.FRAMEBUFFER, gl.Framebuffer{}) s.c.BindFramebuffer(glimpl.FRAMEBUFFER, glimpl.Framebuffer{})
} }
func (s *FBO) AfterPresent() { func (s *FBO) AfterPresent() {
s.c.BindFramebuffer(gl.FRAMEBUFFER, s.frameBuffer) s.c.BindFramebuffer(glimpl.FRAMEBUFFER, s.frameBuffer)
} }
func (s *FBO) Refresh(w, h int) error { func (s *FBO) Refresh(w, h int) error {
@@ -107,20 +110,20 @@ func (s *FBO) Refresh(w, h int) error {
if w == 0 || h == 0 { if w == 0 || h == 0 {
return nil return nil
} }
s.c.BindTexture(gl.TEXTURE_2D, s.colorTex) s.c.BindTexture(glimpl.TEXTURE_2D, s.colorTex)
if s.gl3 { if s.gl3 {
s.c.TexImage2D(gl.TEXTURE_2D, 0, gl.SRGB8_ALPHA8, w, h, gl.RGBA, gl.UNSIGNED_BYTE, nil) s.c.TexImage2D(glimpl.TEXTURE_2D, 0, glimpl.SRGB8_ALPHA8, w, h, glimpl.RGBA, glimpl.UNSIGNED_BYTE, nil)
} else /* EXT_sRGB */ { } else /* EXT_sRGB */ {
s.c.TexImage2D(gl.TEXTURE_2D, 0, gl.SRGB_ALPHA_EXT, w, h, gl.SRGB_ALPHA_EXT, gl.UNSIGNED_BYTE, nil) s.c.TexImage2D(glimpl.TEXTURE_2D, 0, glimpl.SRGB_ALPHA_EXT, w, h, glimpl.SRGB_ALPHA_EXT, glimpl.UNSIGNED_BYTE, nil)
} }
currentRB := gl.Renderbuffer(s.c.GetBinding(gl.RENDERBUFFER_BINDING)) currentRB := glimpl.Renderbuffer(s.c.GetBinding(glimpl.RENDERBUFFER_BINDING))
s.c.BindRenderbuffer(gl.RENDERBUFFER, s.depthBuffer) s.c.BindRenderbuffer(glimpl.RENDERBUFFER, s.depthBuffer)
s.c.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h) s.c.RenderbufferStorage(glimpl.RENDERBUFFER, glimpl.DEPTH_COMPONENT16, w, h)
s.c.BindRenderbuffer(gl.RENDERBUFFER, currentRB) s.c.BindRenderbuffer(glimpl.RENDERBUFFER, currentRB)
s.c.BindFramebuffer(gl.FRAMEBUFFER, s.frameBuffer) s.c.BindFramebuffer(glimpl.FRAMEBUFFER, s.frameBuffer)
s.c.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, s.colorTex, 0) s.c.FramebufferTexture2D(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0, glimpl.TEXTURE_2D, s.colorTex, 0)
s.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, s.depthBuffer) s.c.FramebufferRenderbuffer(glimpl.FRAMEBUFFER, glimpl.DEPTH_ATTACHMENT, glimpl.RENDERBUFFER, s.depthBuffer)
if st := s.c.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { if st := s.c.CheckFramebufferStatus(glimpl.FRAMEBUFFER); st != glimpl.FRAMEBUFFER_COMPLETE {
return fmt.Errorf("sRGB framebuffer incomplete (%dx%d), status: %#x error: %x", s.width, s.height, st, s.c.GetError()) return fmt.Errorf("sRGB framebuffer incomplete (%dx%d), status: %#x error: %x", s.width, s.height, st, s.c.GetError())
} }
@@ -129,12 +132,12 @@ func (s *FBO) Refresh(w, h int) error {
// texture result in twice gamma corrected colors. Using a plain RGBA // texture result in twice gamma corrected colors. Using a plain RGBA
// texture seems to work. // texture seems to work.
s.c.ClearColor(.5, .5, .5, 1.0) s.c.ClearColor(.5, .5, .5, 1.0)
s.c.Clear(gl.COLOR_BUFFER_BIT) s.c.Clear(glimpl.COLOR_BUFFER_BIT)
var pixel [4]byte var pixel [4]byte
s.c.ReadPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, pixel[:]) s.c.ReadPixels(0, 0, 1, 1, glimpl.RGBA, glimpl.UNSIGNED_BYTE, pixel[:])
if pixel[0] == 128 { // Correct sRGB color value is ~188 if pixel[0] == 128 { // Correct sRGB color value is ~188
s.c.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, gl.RGBA, gl.UNSIGNED_BYTE, nil) s.c.TexImage2D(glimpl.TEXTURE_2D, 0, glimpl.RGBA, w, h, glimpl.RGBA, glimpl.UNSIGNED_BYTE, nil)
if st := s.c.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { if st := s.c.CheckFramebufferStatus(glimpl.FRAMEBUFFER); st != glimpl.FRAMEBUFFER_COMPLETE {
return fmt.Errorf("fallback RGBA framebuffer incomplete (%dx%d), status: %#x error: %x", s.width, s.height, st, s.c.GetError()) return fmt.Errorf("fallback RGBA framebuffer incomplete (%dx%d), status: %#x error: %x", s.width, s.height, st, s.c.GetError())
} }
} }
+20 -20
View File
@@ -21,9 +21,9 @@ import (
"errors" "errors"
"fmt" "fmt"
"gioui.org/app/internal/glimpl"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
"gioui.org/internal/glimpl"
) )
type context struct { type context struct {
@@ -32,8 +32,8 @@ type context struct {
ctx C.CFTypeRef ctx C.CFTypeRef
layer C.CFTypeRef layer C.CFTypeRef
init bool init bool
frameBuffer gl.Framebuffer frameBuffer glimpl.Framebuffer
colorBuffer, depthBuffer gl.Renderbuffer colorBuffer, depthBuffer glimpl.Renderbuffer
} }
func init() { func init() {
@@ -64,7 +64,7 @@ func (c *context) Release() {
if c.ctx == 0 { if c.ctx == 0 {
return return
} }
C.gio_renderbufferStorage(c.ctx, 0, C.GLenum(gl.RENDERBUFFER)) C.gio_renderbufferStorage(c.ctx, 0, C.GLenum(glimpl.RENDERBUFFER))
c.c.DeleteFramebuffer(c.frameBuffer) c.c.DeleteFramebuffer(c.frameBuffer)
c.c.DeleteRenderbuffer(c.colorBuffer) c.c.DeleteRenderbuffer(c.colorBuffer)
c.c.DeleteRenderbuffer(c.depthBuffer) c.c.DeleteRenderbuffer(c.depthBuffer)
@@ -79,10 +79,10 @@ func (c *context) Present() error {
} }
// Discard depth buffer as recommended in // Discard depth buffer as recommended in
// https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html // https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/WorkingwithEAGLContexts/WorkingwithEAGLContexts.html
c.c.BindFramebuffer(gl.FRAMEBUFFER, c.frameBuffer) c.c.BindFramebuffer(glimpl.FRAMEBUFFER, c.frameBuffer)
c.c.InvalidateFramebuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT) c.c.InvalidateFramebuffer(glimpl.FRAMEBUFFER, glimpl.DEPTH_ATTACHMENT)
c.c.BindRenderbuffer(gl.RENDERBUFFER, c.colorBuffer) c.c.BindRenderbuffer(glimpl.RENDERBUFFER, c.colorBuffer)
if C.gio_presentRenderbuffer(c.ctx, C.GLenum(gl.RENDERBUFFER)) == 0 { if C.gio_presentRenderbuffer(c.ctx, C.GLenum(glimpl.RENDERBUFFER)) == 0 {
return errors.New("presentRenderBuffer failed") return errors.New("presentRenderBuffer failed")
} }
return nil return nil
@@ -109,20 +109,20 @@ func (c *context) MakeCurrent() error {
c.c.Finish() c.c.Finish()
return nil return nil
} }
currentRB := gl.Renderbuffer{uint(c.c.GetInteger(gl.RENDERBUFFER_BINDING))} currentRB := glimpl.Renderbuffer{uint(c.c.GetInteger(glimpl.RENDERBUFFER_BINDING))}
c.c.BindRenderbuffer(gl.RENDERBUFFER, c.colorBuffer) c.c.BindRenderbuffer(glimpl.RENDERBUFFER, c.colorBuffer)
if C.gio_renderbufferStorage(c.ctx, c.layer, C.GLenum(gl.RENDERBUFFER)) == 0 { if C.gio_renderbufferStorage(c.ctx, c.layer, C.GLenum(glimpl.RENDERBUFFER)) == 0 {
return errors.New("renderbufferStorage failed") return errors.New("renderbufferStorage failed")
} }
w := c.c.GetRenderbufferParameteri(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH) w := c.c.GetRenderbufferParameteri(glimpl.RENDERBUFFER, glimpl.RENDERBUFFER_WIDTH)
h := c.c.GetRenderbufferParameteri(gl.RENDERBUFFER, gl.RENDERBUFFER_HEIGHT) h := c.c.GetRenderbufferParameteri(glimpl.RENDERBUFFER, glimpl.RENDERBUFFER_HEIGHT)
c.c.BindRenderbuffer(gl.RENDERBUFFER, c.depthBuffer) c.c.BindRenderbuffer(glimpl.RENDERBUFFER, c.depthBuffer)
c.c.RenderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h) c.c.RenderbufferStorage(glimpl.RENDERBUFFER, glimpl.DEPTH_COMPONENT16, w, h)
c.c.BindRenderbuffer(gl.RENDERBUFFER, currentRB) c.c.BindRenderbuffer(glimpl.RENDERBUFFER, currentRB)
c.c.BindFramebuffer(gl.FRAMEBUFFER, c.frameBuffer) c.c.BindFramebuffer(glimpl.FRAMEBUFFER, c.frameBuffer)
c.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, c.colorBuffer) c.c.FramebufferRenderbuffer(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0, glimpl.RENDERBUFFER, c.colorBuffer)
c.c.FramebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, c.depthBuffer) c.c.FramebufferRenderbuffer(glimpl.FRAMEBUFFER, glimpl.DEPTH_ATTACHMENT, glimpl.RENDERBUFFER, c.depthBuffer)
if st := c.c.CheckFramebufferStatus(gl.FRAMEBUFFER); st != gl.FRAMEBUFFER_COMPLETE { if st := c.c.CheckFramebufferStatus(glimpl.FRAMEBUFFER); st != glimpl.FRAMEBUFFER_COMPLETE {
return fmt.Errorf("framebuffer incomplete, status: %#x\n", st) return fmt.Errorf("framebuffer incomplete, status: %#x\n", st)
} }
return nil return nil
+3 -9
View File
@@ -6,16 +6,15 @@ import (
"errors" "errors"
"syscall/js" "syscall/js"
"gioui.org/app/internal/glimpl"
"gioui.org/app/internal/srgb" "gioui.org/app/internal/srgb"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
"gioui.org/internal/glimpl"
) )
type context struct { type context struct {
ctx js.Value ctx js.Value
cnv js.Value cnv js.Value
f *glimpl.Functions
srgbFBO *srgb.FBO srgbFBO *srgb.FBO
} }
@@ -33,20 +32,15 @@ func newContext(w *window) (*context, error) {
if ctx.IsNull() { if ctx.IsNull() {
return nil, errors.New("app: webgl is not supported") return nil, errors.New("app: webgl is not supported")
} }
f := &glimpl.Functions{Ctx: ctx}
if err := f.Init(); err != nil {
return nil, err
}
c := &context{ c := &context{
ctx: ctx, ctx: ctx,
cnv: w.cnv, cnv: w.cnv,
f: f,
} }
return c, nil return c, nil
} }
func (c *context) Backend() (backend.Device, error) { func (c *context) Backend() (backend.Device, error) {
return gl.NewBackend(c.f) return gl.NewBackend(glimpl.Context(c.ctx))
} }
func (c *context) Release() { func (c *context) Release() {
@@ -76,7 +70,7 @@ func (c *context) Unlock() {}
func (c *context) MakeCurrent() error { func (c *context) MakeCurrent() error {
if c.srgbFBO == nil { if c.srgbFBO == nil {
var err error var err error
c.srgbFBO, err = srgb.New(c.f) c.srgbFBO, err = srgb.New(glimpl.Context(c.ctx))
if err != nil { if err != nil {
c.Release() c.Release()
c.srgbFBO = nil c.srgbFBO = nil
+2 -3
View File
@@ -5,9 +5,9 @@
package window package window
import ( import (
"gioui.org/app/internal/glimpl"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/gpu/gl" "gioui.org/gpu/gl"
"gioui.org/internal/glimpl"
) )
/* /*
@@ -43,14 +43,13 @@ func newContext(w *window) (*context, error) {
ctx := C.gio_contextForView(view) ctx := C.gio_contextForView(view)
c := &context{ c := &context{
ctx: ctx, ctx: ctx,
c: new(glimpl.Functions),
view: view, view: view,
} }
return c, nil return c, nil
} }
func (c *context) Backend() (backend.Device, error) { func (c *context) Backend() (backend.Device, error) {
return gl.NewBackend(c.c) return gl.NewBackend(nil)
} }
func (c *context) Release() { func (c *context) Release() {
+120 -109
View File
@@ -11,11 +11,12 @@ import (
"unsafe" "unsafe"
"gioui.org/gpu/backend" "gioui.org/gpu/backend"
"gioui.org/internal/glimpl"
) )
// Backend implements backend.Device. // Backend implements backend.Device.
type Backend struct { type Backend struct {
funcs Functions funcs *glimpl.Functions
state glstate state glstate
@@ -48,13 +49,13 @@ type bufferBinding struct {
} }
type gpuTimer struct { type gpuTimer struct {
funcs Functions funcs *glimpl.Functions
obj Query obj glimpl.Query
} }
type gpuTexture struct { type gpuTexture struct {
backend *Backend backend *Backend
obj Texture obj glimpl.Texture
triple textureTriple triple textureTriple
width int width int
height int height int
@@ -62,16 +63,16 @@ type gpuTexture struct {
type gpuFramebuffer struct { type gpuFramebuffer struct {
backend *Backend backend *Backend
obj Framebuffer obj glimpl.Framebuffer
hasDepth bool hasDepth bool
depthBuf Renderbuffer depthBuf glimpl.Renderbuffer
foreign bool foreign bool
} }
type gpuBuffer struct { type gpuBuffer struct {
backend *Backend backend *Backend
hasBuffer bool hasBuffer bool
obj Buffer obj glimpl.Buffer
typ backend.BufferBinding typ backend.BufferBinding
size int size int
immutable bool immutable bool
@@ -82,7 +83,7 @@ type gpuBuffer struct {
type gpuProgram struct { type gpuProgram struct {
backend *Backend backend *Backend
obj Program obj glimpl.Program
nattr int nattr int
vertUniforms uniformsTracker vertUniforms uniformsTracker
fragUniforms uniformsTracker fragUniforms uniformsTracker
@@ -96,7 +97,7 @@ type uniformsTracker struct {
} }
type uniformLocation struct { type uniformLocation struct {
uniform Uniform uniform glimpl.Uniform
offset int offset int
typ backend.DataType typ backend.DataType
size int size int
@@ -111,14 +112,24 @@ type gpuInputLayout struct {
// a TexImage2D call. // a TexImage2D call.
type textureTriple struct { type textureTriple struct {
internalFormat int internalFormat int
format Enum format glimpl.Enum
typ Enum typ glimpl.Enum
} }
func NewBackend(f Functions) (*Backend, error) { type Context = glimpl.Context
exts := strings.Split(f.GetString(EXTENSIONS), " ")
glVer := f.GetString(VERSION) // NewBackend returns a new Backend.
ver, gles, err := ParseGLVersion(glVer) //
// Pass a WebGL context if GOOS is "js", otherwise pass nil for the current
// context.
func NewBackend(ctx Context) (*Backend, error) {
f, err := glimpl.NewFunctions(ctx)
if err != nil {
return nil, err
}
exts := strings.Split(f.GetString(glimpl.EXTENSIONS), " ")
glVer := f.GetString(glimpl.VERSION)
ver, gles, err := glimpl.ParseGLVersion(glVer)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -143,7 +154,7 @@ func NewBackend(f Functions) (*Backend, error) {
if hasExtension(exts, "GL_EXT_disjoint_timer_query_webgl2") || hasExtension(exts, "GL_EXT_disjoint_timer_query") { if hasExtension(exts, "GL_EXT_disjoint_timer_query_webgl2") || hasExtension(exts, "GL_EXT_disjoint_timer_query") {
b.feats.Features |= backend.FeatureTimers b.feats.Features |= backend.FeatureTimers
} }
b.feats.MaxTextureSize = f.GetInteger(MAX_TEXTURE_SIZE) b.feats.MaxTextureSize = f.GetInteger(glimpl.MAX_TEXTURE_SIZE)
return b, nil return b, nil
} }
@@ -153,7 +164,7 @@ func (b *Backend) BeginFrame() {
} }
func (b *Backend) EndFrame() { func (b *Backend) EndFrame() {
b.funcs.ActiveTexture(TEXTURE0) b.funcs.ActiveTexture(glimpl.TEXTURE0)
} }
func (b *Backend) Caps() backend.Caps { func (b *Backend) Caps() backend.Caps {
@@ -168,7 +179,7 @@ func (b *Backend) NewTimer() backend.Timer {
} }
func (b *Backend) IsTimeContinuous() bool { func (b *Backend) IsTimeContinuous() bool {
return b.funcs.GetInteger(GPU_DISJOINT_EXT) == FALSE return b.funcs.GetInteger(glimpl.GPU_DISJOINT_EXT) == glimpl.FALSE
} }
func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Framebuffer, error) { func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Framebuffer, error) {
@@ -181,19 +192,19 @@ func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Fr
fbo.Release() fbo.Release()
return nil, err return nil, err
} }
b.funcs.FramebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0, TEXTURE_2D, gltex.obj, 0) b.funcs.FramebufferTexture2D(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0, glimpl.TEXTURE_2D, gltex.obj, 0)
if depthBits > 0 { if depthBits > 0 {
size := Enum(DEPTH_COMPONENT16) size := glimpl.Enum(glimpl.DEPTH_COMPONENT16)
switch { switch {
case depthBits > 24: case depthBits > 24:
size = DEPTH_COMPONENT32F size = glimpl.DEPTH_COMPONENT32F
case depthBits > 16: case depthBits > 16:
size = DEPTH_COMPONENT24 size = glimpl.DEPTH_COMPONENT24
} }
depthBuf := b.funcs.CreateRenderbuffer() depthBuf := b.funcs.CreateRenderbuffer()
b.funcs.BindRenderbuffer(RENDERBUFFER, depthBuf) b.funcs.BindRenderbuffer(glimpl.RENDERBUFFER, depthBuf)
b.funcs.RenderbufferStorage(RENDERBUFFER, size, gltex.width, gltex.height) b.funcs.RenderbufferStorage(glimpl.RENDERBUFFER, size, gltex.width, gltex.height)
b.funcs.FramebufferRenderbuffer(FRAMEBUFFER, DEPTH_ATTACHMENT, RENDERBUFFER, depthBuf) b.funcs.FramebufferRenderbuffer(glimpl.FRAMEBUFFER, glimpl.DEPTH_ATTACHMENT, glimpl.RENDERBUFFER, depthBuf)
fbo.depthBuf = depthBuf fbo.depthBuf = depthBuf
fbo.hasDepth = true fbo.hasDepth = true
if err := glErr(b.funcs); err != nil { if err := glErr(b.funcs); err != nil {
@@ -201,7 +212,7 @@ func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Fr
return nil, err return nil, err
} }
} }
if st := b.funcs.CheckFramebufferStatus(FRAMEBUFFER); st != FRAMEBUFFER_COMPLETE { if st := b.funcs.CheckFramebufferStatus(glimpl.FRAMEBUFFER); st != glimpl.FRAMEBUFFER_COMPLETE {
fbo.Release() fbo.Release()
return nil, fmt.Errorf("incomplete framebuffer, status = 0x%x, err = %d", st, b.funcs.GetError()) return nil, fmt.Errorf("incomplete framebuffer, status = 0x%x, err = %d", st, b.funcs.GetError())
} }
@@ -209,7 +220,7 @@ func (b *Backend) NewFramebuffer(tex backend.Texture, depthBits int) (backend.Fr
} }
func (b *Backend) CurrentFramebuffer() backend.Framebuffer { func (b *Backend) CurrentFramebuffer() backend.Framebuffer {
fboID := Framebuffer(b.funcs.GetBinding(FRAMEBUFFER_BINDING)) fboID := glimpl.Framebuffer(b.funcs.GetBinding(glimpl.FRAMEBUFFER_BINDING))
return &gpuFramebuffer{backend: b, obj: fboID, foreign: true} return &gpuFramebuffer{backend: b, obj: fboID, foreign: true}
} }
@@ -225,11 +236,11 @@ func (b *Backend) NewTexture(format backend.TextureFormat, width, height int, mi
return nil, errors.New("unsupported texture format") return nil, errors.New("unsupported texture format")
} }
b.BindTexture(0, tex) b.BindTexture(0, tex)
b.funcs.TexParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, toTexFilter(magFilter)) b.funcs.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MAG_FILTER, toTexFilter(magFilter))
b.funcs.TexParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, toTexFilter(minFilter)) b.funcs.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MIN_FILTER, toTexFilter(minFilter))
b.funcs.TexParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE) b.funcs.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_S, glimpl.CLAMP_TO_EDGE)
b.funcs.TexParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE) b.funcs.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_T, glimpl.CLAMP_TO_EDGE)
b.funcs.TexImage2D(TEXTURE_2D, 0, tex.triple.internalFormat, width, height, tex.triple.format, tex.triple.typ, nil) b.funcs.TexImage2D(glimpl.TEXTURE_2D, 0, tex.triple.internalFormat, width, height, tex.triple.format, tex.triple.typ, nil)
if err := glErr(b.funcs); err != nil { if err := glErr(b.funcs); err != nil {
tex.Release() tex.Release()
return nil, err return nil, err
@@ -273,8 +284,8 @@ func (b *Backend) NewImmutableBuffer(typ backend.BufferBinding, data []byte) (ba
return buf, nil return buf, nil
} }
func glErr(f Functions) error { func glErr(f *glimpl.Functions) error {
if st := f.GetError(); st != NO_ERROR { if st := f.GetError(); st != glimpl.NO_ERROR {
return fmt.Errorf("glGetError: %#x", st) return fmt.Errorf("glGetError: %#x", st)
} }
return nil return nil
@@ -282,8 +293,8 @@ func glErr(f Functions) error {
func (b *Backend) bindTexture(unit int, t *gpuTexture) { func (b *Backend) bindTexture(unit int, t *gpuTexture) {
if b.state.texUnits[unit] != t { if b.state.texUnits[unit] != t {
b.funcs.ActiveTexture(TEXTURE0 + Enum(unit)) b.funcs.ActiveTexture(glimpl.TEXTURE0 + glimpl.Enum(unit))
b.funcs.BindTexture(TEXTURE_2D, t.obj) b.funcs.BindTexture(glimpl.TEXTURE_2D, t.obj)
b.state.texUnits[unit] = t b.state.texUnits[unit] = t
} }
} }
@@ -298,20 +309,20 @@ func (b *Backend) useProgram(p *gpuProgram) {
func (b *Backend) enableVertexArrays(n int) { func (b *Backend) enableVertexArrays(n int) {
// Enable needed arrays. // Enable needed arrays.
for i := b.state.nattr; i < n; i++ { for i := b.state.nattr; i < n; i++ {
b.funcs.EnableVertexAttribArray(Attrib(i)) b.funcs.EnableVertexAttribArray(glimpl.Attrib(i))
} }
// Disable extra arrays. // Disable extra arrays.
for i := n; i < b.state.nattr; i++ { for i := n; i < b.state.nattr; i++ {
b.funcs.DisableVertexAttribArray(Attrib(i)) b.funcs.DisableVertexAttribArray(glimpl.Attrib(i))
} }
b.state.nattr = n b.state.nattr = n
} }
func (b *Backend) SetDepthTest(enable bool) { func (b *Backend) SetDepthTest(enable bool) {
if enable { if enable {
b.funcs.Enable(DEPTH_TEST) b.funcs.Enable(glimpl.DEPTH_TEST)
} else { } else {
b.funcs.Disable(DEPTH_TEST) b.funcs.Disable(glimpl.DEPTH_TEST)
} }
} }
@@ -319,16 +330,16 @@ func (b *Backend) BlendFunc(sfactor, dfactor backend.BlendFactor) {
b.funcs.BlendFunc(toGLBlendFactor(sfactor), toGLBlendFactor(dfactor)) b.funcs.BlendFunc(toGLBlendFactor(sfactor), toGLBlendFactor(dfactor))
} }
func toGLBlendFactor(f backend.BlendFactor) Enum { func toGLBlendFactor(f backend.BlendFactor) glimpl.Enum {
switch f { switch f {
case backend.BlendFactorOne: case backend.BlendFactorOne:
return ONE return glimpl.ONE
case backend.BlendFactorOneMinusSrcAlpha: case backend.BlendFactorOneMinusSrcAlpha:
return ONE_MINUS_SRC_ALPHA return glimpl.ONE_MINUS_SRC_ALPHA
case backend.BlendFactorZero: case backend.BlendFactorZero:
return ZERO return glimpl.ZERO
case backend.BlendFactorDstColor: case backend.BlendFactorDstColor:
return DST_COLOR return glimpl.DST_COLOR
default: default:
panic("unsupported blend factor") panic("unsupported blend factor")
} }
@@ -340,9 +351,9 @@ func (b *Backend) DepthMask(mask bool) {
func (b *Backend) SetBlend(enable bool) { func (b *Backend) SetBlend(enable bool) {
if enable { if enable {
b.funcs.Enable(BLEND) b.funcs.Enable(glimpl.BLEND)
} else { } else {
b.funcs.Disable(BLEND) b.funcs.Disable(glimpl.BLEND)
} }
} }
@@ -350,7 +361,7 @@ func (b *Backend) DrawElements(mode backend.DrawMode, off, count int) {
b.prepareDraw() b.prepareDraw()
// off is in 16-bit indices, but DrawElements take a byte offset. // off is in 16-bit indices, but DrawElements take a byte offset.
byteOff := off * 2 byteOff := off * 2
b.funcs.DrawElements(toGLDrawMode(mode), count, UNSIGNED_SHORT, byteOff) b.funcs.DrawElements(toGLDrawMode(mode), count, glimpl.UNSIGNED_SHORT, byteOff)
} }
func (b *Backend) DrawArrays(mode backend.DrawMode, off, count int) { func (b *Backend) DrawArrays(mode backend.DrawMode, off, count int) {
@@ -369,12 +380,12 @@ func (b *Backend) prepareDraw() {
} }
} }
func toGLDrawMode(mode backend.DrawMode) Enum { func toGLDrawMode(mode backend.DrawMode) glimpl.Enum {
switch mode { switch mode {
case backend.DrawModeTriangleStrip: case backend.DrawModeTriangleStrip:
return TRIANGLE_STRIP return glimpl.TRIANGLE_STRIP
case backend.DrawModeTriangles: case backend.DrawModeTriangles:
return TRIANGLES return glimpl.TRIANGLES
default: default:
panic("unsupported draw mode") panic("unsupported draw mode")
} }
@@ -386,21 +397,21 @@ func (b *Backend) Viewport(x, y, width, height int) {
func (b *Backend) Clear(colR, colG, colB, colA float32) { func (b *Backend) Clear(colR, colG, colB, colA float32) {
b.funcs.ClearColor(colR, colG, colB, colA) b.funcs.ClearColor(colR, colG, colB, colA)
b.funcs.Clear(COLOR_BUFFER_BIT) b.funcs.Clear(glimpl.COLOR_BUFFER_BIT)
} }
func (b *Backend) ClearDepth(d float32) { func (b *Backend) ClearDepth(d float32) {
b.funcs.ClearDepthf(d) b.funcs.ClearDepthf(d)
b.funcs.Clear(DEPTH_BUFFER_BIT) b.funcs.Clear(glimpl.DEPTH_BUFFER_BIT)
} }
func (b *Backend) DepthFunc(f backend.DepthFunc) { func (b *Backend) DepthFunc(f backend.DepthFunc) {
var glfunc Enum var glfunc glimpl.Enum
switch f { switch f {
case backend.DepthFuncGreater: case backend.DepthFuncGreater:
glfunc = GREATER glfunc = glimpl.GREATER
case backend.DepthFuncGreaterEqual: case backend.DepthFuncGreaterEqual:
glfunc = GEQUAL glfunc = glimpl.GEQUAL
default: default:
panic("unsupported depth func") panic("unsupported depth func")
} }
@@ -440,7 +451,7 @@ func (b *Backend) NewProgram(vertShader, fragShader backend.ShaderSources) (back
vsrc, fsrc = vertShader.GLSL130, fragShader.GLSL130 vsrc, fsrc = vertShader.GLSL130, fragShader.GLSL130
} }
} }
p, err := CreateProgram(b.funcs, vsrc, fsrc, attr) p, err := glimpl.CreateProgram(b.funcs, vsrc, fsrc, attr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -453,20 +464,20 @@ func (b *Backend) NewProgram(vertShader, fragShader backend.ShaderSources) (back
// Bind texture uniforms. // Bind texture uniforms.
for _, tex := range vertShader.Textures { for _, tex := range vertShader.Textures {
u := b.funcs.GetUniformLocation(p, tex.Name) u := b.funcs.GetUniformLocation(p, tex.Name)
if u.valid() { if u.Valid() {
b.funcs.Uniform1i(u, tex.Binding) b.funcs.Uniform1i(u, tex.Binding)
} }
} }
for _, tex := range fragShader.Textures { for _, tex := range fragShader.Textures {
u := b.funcs.GetUniformLocation(p, tex.Name) u := b.funcs.GetUniformLocation(p, tex.Name)
if u.valid() { if u.Valid() {
b.funcs.Uniform1i(u, tex.Binding) b.funcs.Uniform1i(u, tex.Binding)
} }
} }
if b.ubo { if b.ubo {
for _, block := range vertShader.Uniforms.Blocks { for _, block := range vertShader.Uniforms.Blocks {
blockIdx := b.funcs.GetUniformBlockIndex(p, block.Name) blockIdx := b.funcs.GetUniformBlockIndex(p, block.Name)
if blockIdx != INVALID_INDEX { if blockIdx != glimpl.INVALID_INDEX {
b.funcs.UniformBlockBinding(p, blockIdx, uint(block.Binding)) b.funcs.UniformBlockBinding(p, blockIdx, uint(block.Binding))
} }
} }
@@ -476,7 +487,7 @@ func (b *Backend) NewProgram(vertShader, fragShader backend.ShaderSources) (back
off := len(vertShader.Uniforms.Blocks) off := len(vertShader.Uniforms.Blocks)
for _, block := range fragShader.Uniforms.Blocks { for _, block := range fragShader.Uniforms.Blocks {
blockIdx := b.funcs.GetUniformBlockIndex(p, block.Name) blockIdx := b.funcs.GetUniformBlockIndex(p, block.Name)
if blockIdx != INVALID_INDEX { if blockIdx != glimpl.INVALID_INDEX {
b.funcs.UniformBlockBinding(p, blockIdx, uint(block.Binding+off)) b.funcs.UniformBlockBinding(p, blockIdx, uint(block.Binding+off))
} }
} }
@@ -487,7 +498,7 @@ func (b *Backend) NewProgram(vertShader, fragShader backend.ShaderSources) (back
return gpuProg, nil return gpuProg, nil
} }
func lookupUniform(funcs Functions, p Program, loc backend.UniformLocation) uniformLocation { func lookupUniform(funcs *glimpl.Functions, p glimpl.Program, loc backend.UniformLocation) uniformLocation {
u := funcs.GetUniformLocation(p, loc.Name) u := funcs.GetUniformLocation(p, loc.Name)
return uniformLocation{uniform: u, offset: loc.Offset, typ: loc.Type, size: loc.Size} return uniformLocation{uniform: u, offset: loc.Offset, typ: loc.Type, size: loc.Size}
} }
@@ -504,10 +515,10 @@ func (p *gpuProgram) updateUniforms() {
f := p.backend.funcs f := p.backend.funcs
if p.backend.ubo { if p.backend.ubo {
if b := p.vertUniforms.buf; b != nil { if b := p.vertUniforms.buf; b != nil {
f.BindBufferBase(UNIFORM_BUFFER, 0, b.obj) f.BindBufferBase(glimpl.UNIFORM_BUFFER, 0, b.obj)
} }
if b := p.fragUniforms.buf; b != nil { if b := p.fragUniforms.buf; b != nil {
f.BindBufferBase(UNIFORM_BUFFER, 1, b.obj) f.BindBufferBase(glimpl.UNIFORM_BUFFER, 1, b.obj)
} }
} else { } else {
p.vertUniforms.update(f) p.vertUniforms.update(f)
@@ -524,7 +535,7 @@ func (p *gpuProgram) Release() {
p.backend.funcs.DeleteProgram(p.obj) p.backend.funcs.DeleteProgram(p.obj)
} }
func (u *uniformsTracker) setup(funcs Functions, p Program, uniformSize int, uniforms []backend.UniformLocation) { func (u *uniformsTracker) setup(funcs *glimpl.Functions, p glimpl.Program, uniformSize int, uniforms []backend.UniformLocation) {
u.locs = make([]uniformLocation, len(uniforms)) u.locs = make([]uniformLocation, len(uniforms))
for i, uniform := range uniforms { for i, uniform := range uniforms {
u.locs[i] = lookupUniform(funcs, p, uniform) u.locs[i] = lookupUniform(funcs, p, uniform)
@@ -545,7 +556,7 @@ func (u *uniformsTracker) setBuffer(buffer backend.Buffer) {
u.version = buf.version - 1 u.version = buf.version - 1
} }
func (p *uniformsTracker) update(funcs Functions) { func (p *uniformsTracker) update(funcs *glimpl.Functions) {
b := p.buf b := p.buf
if b == nil || b.version == p.version { if b == nil || b.version == p.version {
return return
@@ -589,7 +600,7 @@ func (b *gpuBuffer) Upload(data []byte) {
if b.hasBuffer { if b.hasBuffer {
firstBinding := firstBufferType(b.typ) firstBinding := firstBufferType(b.typ)
b.backend.funcs.BindBuffer(firstBinding, b.obj) b.backend.funcs.BindBuffer(firstBinding, b.obj)
b.backend.funcs.BufferData(firstBinding, data, STATIC_DRAW) b.backend.funcs.BufferData(firstBinding, data, glimpl.STATIC_DRAW)
} }
} }
@@ -614,19 +625,19 @@ func (b *Backend) setupVertexArrays() {
return return
} }
buf := b.state.buffer buf := b.state.buffer
b.funcs.BindBuffer(ARRAY_BUFFER, buf.buf.obj) b.funcs.BindBuffer(glimpl.ARRAY_BUFFER, buf.buf.obj)
for i, inp := range layout.inputs { for i, inp := range layout.inputs {
l := layout.layout[i] l := layout.layout[i]
var gltyp Enum var gltyp glimpl.Enum
switch l.Type { switch l.Type {
case backend.DataTypeFloat: case backend.DataTypeFloat:
gltyp = FLOAT gltyp = glimpl.FLOAT
case backend.DataTypeShort: case backend.DataTypeShort:
gltyp = SHORT gltyp = glimpl.SHORT
default: default:
panic("unsupported data type") panic("unsupported data type")
} }
b.funcs.VertexAttribPointer(Attrib(inp.Location), l.Size, gltyp, false, buf.stride, buf.offset+l.Offset) b.funcs.VertexAttribPointer(glimpl.Attrib(inp.Location), l.Size, gltyp, false, buf.stride, buf.offset+l.Offset)
} }
} }
@@ -635,7 +646,7 @@ func (b *Backend) BindIndexBuffer(buf backend.Buffer) {
if gbuf.typ&backend.BufferBindingIndices == 0 { if gbuf.typ&backend.BufferBindingIndices == 0 {
panic("not an index buffer") panic("not an index buffer")
} }
b.funcs.BindBuffer(ELEMENT_ARRAY_BUFFER, gbuf.obj) b.funcs.BindBuffer(glimpl.ELEMENT_ARRAY_BUFFER, gbuf.obj)
} }
func (f *gpuFramebuffer) ReadPixels(src image.Rectangle, pixels []byte) error { func (f *gpuFramebuffer) ReadPixels(src image.Rectangle, pixels []byte) error {
@@ -644,7 +655,7 @@ func (f *gpuFramebuffer) ReadPixels(src image.Rectangle, pixels []byte) error {
if len(pixels) < src.Dx()*src.Dy() { if len(pixels) < src.Dx()*src.Dy() {
return errors.New("unexpected RGBA size") return errors.New("unexpected RGBA size")
} }
f.backend.funcs.ReadPixels(src.Min.X, src.Min.Y, src.Dx(), src.Dy(), RGBA, UNSIGNED_BYTE, pixels) f.backend.funcs.ReadPixels(src.Min.X, src.Min.Y, src.Dx(), src.Dy(), glimpl.RGBA, glimpl.UNSIGNED_BYTE, pixels)
// OpenGL origin is in the lower-left corner. Flip the image to // OpenGL origin is in the lower-left corner. Flip the image to
// match. // match.
flipImageY(src.Dx()*4, src.Dy(), pixels) flipImageY(src.Dx()*4, src.Dy(), pixels)
@@ -666,12 +677,12 @@ func flipImageY(stride int, height int, pixels []byte) {
} }
func (b *Backend) BindFramebuffer(fbo backend.Framebuffer) { func (b *Backend) BindFramebuffer(fbo backend.Framebuffer) {
b.funcs.BindFramebuffer(FRAMEBUFFER, fbo.(*gpuFramebuffer).obj) b.funcs.BindFramebuffer(glimpl.FRAMEBUFFER, fbo.(*gpuFramebuffer).obj)
} }
func (f *gpuFramebuffer) Invalidate() { func (f *gpuFramebuffer) Invalidate() {
f.backend.BindFramebuffer(f) f.backend.BindFramebuffer(f)
f.backend.funcs.InvalidateFramebuffer(FRAMEBUFFER, COLOR_ATTACHMENT0) f.backend.funcs.InvalidateFramebuffer(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0)
} }
func (f *gpuFramebuffer) Release() { func (f *gpuFramebuffer) Release() {
@@ -687,9 +698,9 @@ func (f *gpuFramebuffer) Release() {
func toTexFilter(f backend.TextureFilter) int { func toTexFilter(f backend.TextureFilter) int {
switch f { switch f {
case backend.FilterNearest: case backend.FilterNearest:
return NEAREST return glimpl.NEAREST
case backend.FilterLinear: case backend.FilterLinear:
return LINEAR return glimpl.LINEAR
default: default:
panic("unsupported texture filter") panic("unsupported texture filter")
} }
@@ -714,19 +725,19 @@ func (t *gpuTexture) Upload(img *image.RGBA) {
start := (b.Min.X + b.Min.Y*w) * 4 start := (b.Min.X + b.Min.Y*w) * 4
end := (b.Max.X + (b.Max.Y-1)*w) * 4 end := (b.Max.X + (b.Max.Y-1)*w) * 4
pixels = img.Pix[start:end] pixels = img.Pix[start:end]
t.backend.funcs.TexImage2D(TEXTURE_2D, 0, t.triple.internalFormat, w, h, t.triple.format, t.triple.typ, pixels) t.backend.funcs.TexImage2D(glimpl.TEXTURE_2D, 0, t.triple.internalFormat, w, h, t.triple.format, t.triple.typ, pixels)
} }
func (t *gpuTimer) Begin() { func (t *gpuTimer) Begin() {
t.funcs.BeginQuery(TIME_ELAPSED_EXT, t.obj) t.funcs.BeginQuery(glimpl.TIME_ELAPSED_EXT, t.obj)
} }
func (t *gpuTimer) End() { func (t *gpuTimer) End() {
t.funcs.EndQuery(TIME_ELAPSED_EXT) t.funcs.EndQuery(glimpl.TIME_ELAPSED_EXT)
} }
func (t *gpuTimer) ready() bool { func (t *gpuTimer) ready() bool {
return t.funcs.GetQueryObjectuiv(t.obj, QUERY_RESULT_AVAILABLE) == TRUE return t.funcs.GetQueryObjectuiv(t.obj, glimpl.QUERY_RESULT_AVAILABLE) == glimpl.TRUE
} }
func (t *gpuTimer) Release() { func (t *gpuTimer) Release() {
@@ -737,7 +748,7 @@ func (t *gpuTimer) Duration() (time.Duration, bool) {
if !t.ready() { if !t.ready() {
return 0, false return 0, false
} }
nanos := t.funcs.GetQueryObjectuiv(t.obj, QUERY_RESULT) nanos := t.funcs.GetQueryObjectuiv(t.obj, glimpl.QUERY_RESULT)
return time.Duration(nanos), true return time.Duration(nanos), true
} }
@@ -748,10 +759,10 @@ func (b *Backend) BindInputLayout(l backend.InputLayout) {
func (l *gpuInputLayout) Release() {} func (l *gpuInputLayout) Release() {}
// floatTripleFor determines the best texture triple for floating point FBOs. // floatTripleFor determines the best texture triple for floating point FBOs.
func floatTripleFor(f Functions, ver [2]int, exts []string) (textureTriple, error) { func floatTripleFor(f *glimpl.Functions, ver [2]int, exts []string) (textureTriple, error) {
var triples []textureTriple var triples []textureTriple
if ver[0] >= 3 { if ver[0] >= 3 {
triples = append(triples, textureTriple{R16F, Enum(RED), Enum(HALF_FLOAT)}) triples = append(triples, textureTriple{glimpl.R16F, glimpl.Enum(glimpl.RED), glimpl.Enum(glimpl.HALF_FLOAT)})
} }
// According to the OES_texture_half_float specification, EXT_color_buffer_half_float is needed to // According to the OES_texture_half_float specification, EXT_color_buffer_half_float is needed to
// render to FBOs. However, the Safari WebGL1 implementation does support half-float FBOs but does not // render to FBOs. However, the Safari WebGL1 implementation does support half-float FBOs but does not
@@ -759,32 +770,32 @@ func floatTripleFor(f Functions, ver [2]int, exts []string) (textureTriple, erro
// wrong. // wrong.
if hasExtension(exts, "GL_OES_texture_half_float") || hasExtension(exts, "GL_EXT_color_buffer_half_float") { if hasExtension(exts, "GL_OES_texture_half_float") || hasExtension(exts, "GL_EXT_color_buffer_half_float") {
// Try single channel. // Try single channel.
triples = append(triples, textureTriple{LUMINANCE, Enum(LUMINANCE), Enum(HALF_FLOAT_OES)}) triples = append(triples, textureTriple{glimpl.LUMINANCE, glimpl.Enum(glimpl.LUMINANCE), glimpl.Enum(glimpl.HALF_FLOAT_OES)})
// Fallback to 4 channels. // Fallback to 4 channels.
triples = append(triples, textureTriple{RGBA, Enum(RGBA), Enum(HALF_FLOAT_OES)}) triples = append(triples, textureTriple{glimpl.RGBA, glimpl.Enum(glimpl.RGBA), glimpl.Enum(glimpl.HALF_FLOAT_OES)})
} }
if hasExtension(exts, "GL_OES_texture_float") || hasExtension(exts, "GL_EXT_color_buffer_float") { if hasExtension(exts, "GL_OES_texture_float") || hasExtension(exts, "GL_EXT_color_buffer_float") {
triples = append(triples, textureTriple{RGBA, Enum(RGBA), Enum(FLOAT)}) triples = append(triples, textureTriple{glimpl.RGBA, glimpl.Enum(glimpl.RGBA), glimpl.Enum(glimpl.FLOAT)})
} }
tex := f.CreateTexture() tex := f.CreateTexture()
defer f.DeleteTexture(tex) defer f.DeleteTexture(tex)
f.BindTexture(TEXTURE_2D, tex) f.BindTexture(glimpl.TEXTURE_2D, tex)
f.TexParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_S, glimpl.CLAMP_TO_EDGE)
f.TexParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_WRAP_T, glimpl.CLAMP_TO_EDGE)
f.TexParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, NEAREST) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MAG_FILTER, glimpl.NEAREST)
f.TexParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, NEAREST) f.TexParameteri(glimpl.TEXTURE_2D, glimpl.TEXTURE_MIN_FILTER, glimpl.NEAREST)
fbo := f.CreateFramebuffer() fbo := f.CreateFramebuffer()
defer f.DeleteFramebuffer(fbo) defer f.DeleteFramebuffer(fbo)
defFBO := Framebuffer(f.GetBinding(FRAMEBUFFER_BINDING)) defFBO := glimpl.Framebuffer(f.GetBinding(glimpl.FRAMEBUFFER_BINDING))
f.BindFramebuffer(FRAMEBUFFER, fbo) f.BindFramebuffer(glimpl.FRAMEBUFFER, fbo)
defer f.BindFramebuffer(FRAMEBUFFER, defFBO) defer f.BindFramebuffer(glimpl.FRAMEBUFFER, defFBO)
var attempts []string var attempts []string
for _, tt := range triples { for _, tt := range triples {
const size = 256 const size = 256
f.TexImage2D(TEXTURE_2D, 0, tt.internalFormat, size, size, tt.format, tt.typ, nil) f.TexImage2D(glimpl.TEXTURE_2D, 0, tt.internalFormat, size, size, tt.format, tt.typ, nil)
f.FramebufferTexture2D(FRAMEBUFFER, COLOR_ATTACHMENT0, TEXTURE_2D, tex, 0) f.FramebufferTexture2D(glimpl.FRAMEBUFFER, glimpl.COLOR_ATTACHMENT0, glimpl.TEXTURE_2D, tex, 0)
st := f.CheckFramebufferStatus(FRAMEBUFFER) st := f.CheckFramebufferStatus(glimpl.FRAMEBUFFER)
if st == FRAMEBUFFER_COMPLETE { if st == glimpl.FRAMEBUFFER_COMPLETE {
return tt, nil return tt, nil
} }
attempts = append(attempts, fmt.Sprintf("(0x%x, 0x%x, 0x%x): 0x%x", tt.internalFormat, tt.format, tt.typ, st)) attempts = append(attempts, fmt.Sprintf("(0x%x, 0x%x, 0x%x): 0x%x", tt.internalFormat, tt.format, tt.typ, st))
@@ -795,21 +806,21 @@ func floatTripleFor(f Functions, ver [2]int, exts []string) (textureTriple, erro
func srgbaTripleFor(ver [2]int, exts []string) (textureTriple, error) { func srgbaTripleFor(ver [2]int, exts []string) (textureTriple, error) {
switch { switch {
case ver[0] >= 3: case ver[0] >= 3:
return textureTriple{SRGB8_ALPHA8, Enum(RGBA), Enum(UNSIGNED_BYTE)}, nil return textureTriple{glimpl.SRGB8_ALPHA8, glimpl.Enum(glimpl.RGBA), glimpl.Enum(glimpl.UNSIGNED_BYTE)}, nil
case hasExtension(exts, "GL_EXT_sRGB"): case hasExtension(exts, "GL_EXT_sRGB"):
return textureTriple{SRGB_ALPHA_EXT, Enum(SRGB_ALPHA_EXT), Enum(UNSIGNED_BYTE)}, nil return textureTriple{glimpl.SRGB_ALPHA_EXT, glimpl.Enum(glimpl.SRGB_ALPHA_EXT), glimpl.Enum(glimpl.UNSIGNED_BYTE)}, nil
default: default:
return textureTriple{}, errors.New("no sRGB texture formats found") return textureTriple{}, errors.New("no sRGB texture formats found")
} }
} }
func alphaTripleFor(ver [2]int) textureTriple { func alphaTripleFor(ver [2]int) textureTriple {
intf, f := R8, Enum(RED) intf, f := glimpl.R8, glimpl.Enum(glimpl.RED)
if ver[0] < 3 { if ver[0] < 3 {
// R8, RED not supported on OpenGL ES 2.0. // R8, RED not supported on OpenGL ES 2.0.
intf, f = LUMINANCE, Enum(LUMINANCE) intf, f = glimpl.LUMINANCE, glimpl.Enum(glimpl.LUMINANCE)
} }
return textureTriple{intf, f, UNSIGNED_BYTE} return textureTriple{intf, f, glimpl.UNSIGNED_BYTE}
} }
func hasExtension(exts []string, ext string) bool { func hasExtension(exts []string, ext string) bool {
@@ -821,14 +832,14 @@ func hasExtension(exts []string, ext string) bool {
return false return false
} }
func firstBufferType(typ backend.BufferBinding) Enum { func firstBufferType(typ backend.BufferBinding) glimpl.Enum {
switch { switch {
case typ&backend.BufferBindingIndices != 0: case typ&backend.BufferBindingIndices != 0:
return ELEMENT_ARRAY_BUFFER return glimpl.ELEMENT_ARRAY_BUFFER
case typ&backend.BufferBindingVertices != 0: case typ&backend.BufferBindingVertices != 0:
return ARRAY_BUFFER return glimpl.ARRAY_BUFFER
case typ&backend.BufferBindingUniforms != 0: case typ&backend.BufferBindingUniforms != 0:
return UNIFORM_BUFFER return glimpl.UNIFORM_BUFFER
default: default:
panic("unsupported buffer type") panic("unsupported buffer type")
} }
+3 -3
View File
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: Unlicense OR MIT // SPDX-License-Identifier: Unlicense OR MIT
package gl package glimpl
type ( type (
Attrib uint Attrib uint
@@ -88,7 +88,7 @@ const (
GPU_DISJOINT_EXT = 0x8FBB GPU_DISJOINT_EXT = 0x8FBB
) )
type Functions interface { var _ interface {
ActiveTexture(texture Enum) ActiveTexture(texture Enum)
AttachShader(p Program, s Shader) AttachShader(p Program, s Shader)
BeginQuery(target Enum, query Query) BeginQuery(target Enum, query Query)
@@ -158,4 +158,4 @@ type Functions interface {
UseProgram(p Program) UseProgram(p Program)
VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int)
Viewport(x, y, width, height int) Viewport(x, y, width, height int)
} } = (*Functions)(nil)
@@ -6,8 +6,6 @@ import (
"errors" "errors"
"strings" "strings"
"syscall/js" "syscall/js"
"gioui.org/gpu/gl"
) )
type Functions struct { type Functions struct {
@@ -20,6 +18,16 @@ type Functions struct {
int32Buf js.Value int32Buf js.Value
} }
type Context js.Value
func NewFunctions(ctx Context) (*Functions, error) {
f := &Functions{Ctx: js.Value(ctx)}
if err := f.Init(); err != nil {
return nil, err
}
return f, nil
}
func (f *Functions) Init() error { func (f *Functions) Init() error {
webgl2Class := js.Global().Get("WebGL2RenderingContext") webgl2Class := js.Global().Get("WebGL2RenderingContext")
iswebgl2 := !webgl2Class.IsNull() && f.Ctx.InstanceOf(webgl2Class) iswebgl2 := !webgl2Class.IsNull() && f.Ctx.InstanceOf(webgl2Class)
@@ -45,50 +53,50 @@ func (f *Functions) getExtension(name string) js.Value {
return f.Ctx.Call("getExtension", name) return f.Ctx.Call("getExtension", name)
} }
func (f *Functions) ActiveTexture(t gl.Enum) { func (f *Functions) ActiveTexture(t Enum) {
f.Ctx.Call("activeTexture", int(t)) f.Ctx.Call("activeTexture", int(t))
} }
func (f *Functions) AttachShader(p gl.Program, s gl.Shader) { func (f *Functions) AttachShader(p Program, s Shader) {
f.Ctx.Call("attachShader", js.Value(p), js.Value(s)) f.Ctx.Call("attachShader", js.Value(p), js.Value(s))
} }
func (f *Functions) BeginQuery(target gl.Enum, query gl.Query) { func (f *Functions) BeginQuery(target Enum, query Query) {
if !f.EXT_disjoint_timer_query_webgl2.IsNull() { if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
f.Ctx.Call("beginQuery", int(target), js.Value(query)) f.Ctx.Call("beginQuery", int(target), js.Value(query))
} else { } else {
f.EXT_disjoint_timer_query.Call("beginQueryEXT", int(target), js.Value(query)) f.EXT_disjoint_timer_query.Call("beginQueryEXT", int(target), js.Value(query))
} }
} }
func (f *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { func (f *Functions) BindAttribLocation(p Program, a Attrib, name string) {
f.Ctx.Call("bindAttribLocation", js.Value(p), int(a), name) f.Ctx.Call("bindAttribLocation", js.Value(p), int(a), name)
} }
func (f *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { func (f *Functions) BindBuffer(target Enum, b Buffer) {
f.Ctx.Call("bindBuffer", int(target), js.Value(b)) f.Ctx.Call("bindBuffer", int(target), js.Value(b))
} }
func (f *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { func (f *Functions) BindBufferBase(target Enum, index int, b Buffer) {
f.Ctx.Call("bindBufferBase", int(target), index, js.Value(b)) f.Ctx.Call("bindBufferBase", int(target), index, js.Value(b))
} }
func (f *Functions) BindFramebuffer(target gl.Enum, fb gl.Framebuffer) { func (f *Functions) BindFramebuffer(target Enum, fb Framebuffer) {
f.Ctx.Call("bindFramebuffer", int(target), js.Value(fb)) f.Ctx.Call("bindFramebuffer", int(target), js.Value(fb))
} }
func (f *Functions) BindRenderbuffer(target gl.Enum, rb gl.Renderbuffer) { func (f *Functions) BindRenderbuffer(target Enum, rb Renderbuffer) {
f.Ctx.Call("bindRenderbuffer", int(target), js.Value(rb)) f.Ctx.Call("bindRenderbuffer", int(target), js.Value(rb))
} }
func (f *Functions) BindTexture(target gl.Enum, t gl.Texture) { func (f *Functions) BindTexture(target Enum, t Texture) {
f.Ctx.Call("bindTexture", int(target), js.Value(t)) f.Ctx.Call("bindTexture", int(target), js.Value(t))
} }
func (f *Functions) BlendEquation(mode gl.Enum) { func (f *Functions) BlendEquation(mode Enum) {
f.Ctx.Call("blendEquation", int(mode)) f.Ctx.Call("blendEquation", int(mode))
} }
func (f *Functions) BlendFunc(sfactor, dfactor gl.Enum) { func (f *Functions) BlendFunc(sfactor, dfactor Enum) {
f.Ctx.Call("blendFunc", int(sfactor), int(dfactor)) f.Ctx.Call("blendFunc", int(sfactor), int(dfactor))
} }
func (f *Functions) BufferData(target gl.Enum, src []byte, usage gl.Enum) { func (f *Functions) BufferData(target Enum, src []byte, usage Enum) {
f.Ctx.Call("bufferData", int(target), f.byteArrayOf(src), int(usage)) f.Ctx.Call("bufferData", int(target), f.byteArrayOf(src), int(usage))
} }
func (f *Functions) CheckFramebufferStatus(target gl.Enum) gl.Enum { func (f *Functions) CheckFramebufferStatus(target Enum) Enum {
return gl.Enum(f.Ctx.Call("checkFramebufferStatus", int(target)).Int()) return Enum(f.Ctx.Call("checkFramebufferStatus", int(target)).Int())
} }
func (f *Functions) Clear(mask gl.Enum) { func (f *Functions) Clear(mask Enum) {
f.Ctx.Call("clear", int(mask)) f.Ctx.Call("clear", int(mask))
} }
func (f *Functions) ClearColor(red, green, blue, alpha float32) { func (f *Functions) ClearColor(red, green, blue, alpha float32) {
@@ -97,80 +105,80 @@ func (f *Functions) ClearColor(red, green, blue, alpha float32) {
func (f *Functions) ClearDepthf(d float32) { func (f *Functions) ClearDepthf(d float32) {
f.Ctx.Call("clearDepth", d) f.Ctx.Call("clearDepth", d)
} }
func (f *Functions) CompileShader(s gl.Shader) { func (f *Functions) CompileShader(s Shader) {
f.Ctx.Call("compileShader", js.Value(s)) f.Ctx.Call("compileShader", js.Value(s))
} }
func (f *Functions) CreateBuffer() gl.Buffer { func (f *Functions) CreateBuffer() Buffer {
return gl.Buffer(f.Ctx.Call("createBuffer")) return Buffer(f.Ctx.Call("createBuffer"))
} }
func (f *Functions) CreateFramebuffer() gl.Framebuffer { func (f *Functions) CreateFramebuffer() Framebuffer {
return gl.Framebuffer(f.Ctx.Call("createFramebuffer")) return Framebuffer(f.Ctx.Call("createFramebuffer"))
} }
func (f *Functions) CreateProgram() gl.Program { func (f *Functions) CreateProgram() Program {
return gl.Program(f.Ctx.Call("createProgram")) return Program(f.Ctx.Call("createProgram"))
} }
func (f *Functions) CreateQuery() gl.Query { func (f *Functions) CreateQuery() Query {
return gl.Query(f.Ctx.Call("createQuery")) return Query(f.Ctx.Call("createQuery"))
} }
func (f *Functions) CreateRenderbuffer() gl.Renderbuffer { func (f *Functions) CreateRenderbuffer() Renderbuffer {
return gl.Renderbuffer(f.Ctx.Call("createRenderbuffer")) return Renderbuffer(f.Ctx.Call("createRenderbuffer"))
} }
func (f *Functions) CreateShader(ty gl.Enum) gl.Shader { func (f *Functions) CreateShader(ty Enum) Shader {
return gl.Shader(f.Ctx.Call("createShader", int(ty))) return Shader(f.Ctx.Call("createShader", int(ty)))
} }
func (f *Functions) CreateTexture() gl.Texture { func (f *Functions) CreateTexture() Texture {
return gl.Texture(f.Ctx.Call("createTexture")) return Texture(f.Ctx.Call("createTexture"))
} }
func (f *Functions) DeleteBuffer(v gl.Buffer) { func (f *Functions) DeleteBuffer(v Buffer) {
f.Ctx.Call("deleteBuffer", js.Value(v)) f.Ctx.Call("deleteBuffer", js.Value(v))
} }
func (f *Functions) DeleteFramebuffer(v gl.Framebuffer) { func (f *Functions) DeleteFramebuffer(v Framebuffer) {
f.Ctx.Call("deleteFramebuffer", js.Value(v)) f.Ctx.Call("deleteFramebuffer", js.Value(v))
} }
func (f *Functions) DeleteProgram(p gl.Program) { func (f *Functions) DeleteProgram(p Program) {
f.Ctx.Call("deleteProgram", js.Value(p)) f.Ctx.Call("deleteProgram", js.Value(p))
} }
func (f *Functions) DeleteQuery(query gl.Query) { func (f *Functions) DeleteQuery(query Query) {
if !f.EXT_disjoint_timer_query_webgl2.IsNull() { if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
f.Ctx.Call("deleteQuery", js.Value(query)) f.Ctx.Call("deleteQuery", js.Value(query))
} else { } else {
f.EXT_disjoint_timer_query.Call("deleteQueryEXT", js.Value(query)) f.EXT_disjoint_timer_query.Call("deleteQueryEXT", js.Value(query))
} }
} }
func (f *Functions) DeleteShader(s gl.Shader) { func (f *Functions) DeleteShader(s Shader) {
f.Ctx.Call("deleteShader", js.Value(s)) f.Ctx.Call("deleteShader", js.Value(s))
} }
func (f *Functions) DeleteRenderbuffer(v gl.Renderbuffer) { func (f *Functions) DeleteRenderbuffer(v Renderbuffer) {
f.Ctx.Call("deleteRenderbuffer", js.Value(v)) f.Ctx.Call("deleteRenderbuffer", js.Value(v))
} }
func (f *Functions) DeleteTexture(v gl.Texture) { func (f *Functions) DeleteTexture(v Texture) {
f.Ctx.Call("deleteTexture", js.Value(v)) f.Ctx.Call("deleteTexture", js.Value(v))
} }
func (f *Functions) DepthFunc(fn gl.Enum) { func (f *Functions) DepthFunc(fn Enum) {
f.Ctx.Call("depthFunc", int(fn)) f.Ctx.Call("depthFunc", int(fn))
} }
func (f *Functions) DepthMask(mask bool) { func (f *Functions) DepthMask(mask bool) {
f.Ctx.Call("depthMask", mask) f.Ctx.Call("depthMask", mask)
} }
func (f *Functions) DisableVertexAttribArray(a gl.Attrib) { func (f *Functions) DisableVertexAttribArray(a Attrib) {
f.Ctx.Call("disableVertexAttribArray", int(a)) f.Ctx.Call("disableVertexAttribArray", int(a))
} }
func (f *Functions) Disable(cap gl.Enum) { func (f *Functions) Disable(cap Enum) {
f.Ctx.Call("disable", int(cap)) f.Ctx.Call("disable", int(cap))
} }
func (f *Functions) DrawArrays(mode gl.Enum, first, count int) { func (f *Functions) DrawArrays(mode Enum, first, count int) {
f.Ctx.Call("drawArrays", int(mode), first, count) f.Ctx.Call("drawArrays", int(mode), first, count)
} }
func (f *Functions) DrawElements(mode gl.Enum, count int, ty gl.Enum, offset int) { func (f *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) {
f.Ctx.Call("drawElements", int(mode), count, int(ty), offset) f.Ctx.Call("drawElements", int(mode), count, int(ty), offset)
} }
func (f *Functions) Enable(cap gl.Enum) { func (f *Functions) Enable(cap Enum) {
f.Ctx.Call("enable", int(cap)) f.Ctx.Call("enable", int(cap))
} }
func (f *Functions) EnableVertexAttribArray(a gl.Attrib) { func (f *Functions) EnableVertexAttribArray(a Attrib) {
f.Ctx.Call("enableVertexAttribArray", int(a)) f.Ctx.Call("enableVertexAttribArray", int(a))
} }
func (f *Functions) EndQuery(target gl.Enum) { func (f *Functions) EndQuery(target Enum) {
if !f.EXT_disjoint_timer_query_webgl2.IsNull() { if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
f.Ctx.Call("endQuery", int(target)) f.Ctx.Call("endQuery", int(target))
} else { } else {
@@ -180,50 +188,50 @@ func (f *Functions) EndQuery(target gl.Enum) {
func (f *Functions) Finish() { func (f *Functions) Finish() {
f.Ctx.Call("finish") f.Ctx.Call("finish")
} }
func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget gl.Enum, renderbuffer gl.Renderbuffer) { func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) {
f.Ctx.Call("framebufferRenderbuffer", int(target), int(attachment), int(renderbuffertarget), js.Value(renderbuffer)) f.Ctx.Call("framebufferRenderbuffer", int(target), int(attachment), int(renderbuffertarget), js.Value(renderbuffer))
} }
func (f *Functions) FramebufferTexture2D(target, attachment, texTarget gl.Enum, t gl.Texture, level int) { func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
f.Ctx.Call("framebufferTexture2D", int(target), int(attachment), int(texTarget), js.Value(t), level) f.Ctx.Call("framebufferTexture2D", int(target), int(attachment), int(texTarget), js.Value(t), level)
} }
func (f *Functions) GetError() gl.Enum { func (f *Functions) GetError() Enum {
// Avoid slow getError calls. See gio#179. // Avoid slow getError calls. See gio#179.
return 0 return 0
} }
func (f *Functions) GetRenderbufferParameteri(target, pname gl.Enum) int { func (f *Functions) GetRenderbufferParameteri(target, pname Enum) int {
return paramVal(f.Ctx.Call("getRenderbufferParameteri", int(pname))) return paramVal(f.Ctx.Call("getRenderbufferParameteri", int(pname)))
} }
func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname gl.Enum) int { func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
return paramVal(f.Ctx.Call("getFramebufferAttachmentParameter", int(target), int(attachment), int(pname))) return paramVal(f.Ctx.Call("getFramebufferAttachmentParameter", int(target), int(attachment), int(pname)))
} }
func (f *Functions) GetBinding(pname gl.Enum) gl.Object { func (f *Functions) GetBinding(pname Enum) Object {
return gl.Object(f.Ctx.Call("getParameter", int(pname))) return Object(f.Ctx.Call("getParameter", int(pname)))
} }
func (f *Functions) GetInteger(pname gl.Enum) int { func (f *Functions) GetInteger(pname Enum) int {
return paramVal(f.Ctx.Call("getParameter", int(pname))) return paramVal(f.Ctx.Call("getParameter", int(pname)))
} }
func (f *Functions) GetProgrami(p gl.Program, pname gl.Enum) int { func (f *Functions) GetProgrami(p Program, pname Enum) int {
return paramVal(f.Ctx.Call("getProgramParameter", js.Value(p), int(pname))) return paramVal(f.Ctx.Call("getProgramParameter", js.Value(p), int(pname)))
} }
func (f *Functions) GetProgramInfoLog(p gl.Program) string { func (f *Functions) GetProgramInfoLog(p Program) string {
return f.Ctx.Call("getProgramInfoLog", js.Value(p)).String() return f.Ctx.Call("getProgramInfoLog", js.Value(p)).String()
} }
func (f *Functions) GetQueryObjectuiv(query gl.Query, pname gl.Enum) uint { func (f *Functions) GetQueryObjectuiv(query Query, pname Enum) uint {
if !f.EXT_disjoint_timer_query_webgl2.IsNull() { if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
return uint(paramVal(f.Ctx.Call("getQueryParameter", js.Value(query), int(pname)))) return uint(paramVal(f.Ctx.Call("getQueryParameter", js.Value(query), int(pname))))
} else { } else {
return uint(paramVal(f.EXT_disjoint_timer_query.Call("getQueryObjectEXT", js.Value(query), int(pname)))) return uint(paramVal(f.EXT_disjoint_timer_query.Call("getQueryObjectEXT", js.Value(query), int(pname))))
} }
} }
func (f *Functions) GetShaderi(s gl.Shader, pname gl.Enum) int { func (f *Functions) GetShaderi(s Shader, pname Enum) int {
return paramVal(f.Ctx.Call("getShaderParameter", js.Value(s), int(pname))) return paramVal(f.Ctx.Call("getShaderParameter", js.Value(s), int(pname)))
} }
func (f *Functions) GetShaderInfoLog(s gl.Shader) string { func (f *Functions) GetShaderInfoLog(s Shader) string {
return f.Ctx.Call("getShaderInfoLog", js.Value(s)).String() return f.Ctx.Call("getShaderInfoLog", js.Value(s)).String()
} }
func (f *Functions) GetString(pname gl.Enum) string { func (f *Functions) GetString(pname Enum) string {
switch pname { switch pname {
case gl.EXTENSIONS: case EXTENSIONS:
extsjs := f.Ctx.Call("getSupportedExtensions") extsjs := f.Ctx.Call("getSupportedExtensions")
var exts []string var exts []string
for i := 0; i < extsjs.Length(); i++ { for i := 0; i < extsjs.Length(); i++ {
@@ -234,13 +242,13 @@ func (f *Functions) GetString(pname gl.Enum) string {
return f.Ctx.Call("getParameter", int(pname)).String() return f.Ctx.Call("getParameter", int(pname)).String()
} }
} }
func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { func (f *Functions) GetUniformBlockIndex(p Program, name string) uint {
return uint(paramVal(f.Ctx.Call("getUniformBlockIndex", js.Value(p), name))) return uint(paramVal(f.Ctx.Call("getUniformBlockIndex", js.Value(p), name)))
} }
func (f *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { func (f *Functions) GetUniformLocation(p Program, name string) Uniform {
return gl.Uniform(f.Ctx.Call("getUniformLocation", js.Value(p), name)) return Uniform(f.Ctx.Call("getUniformLocation", js.Value(p), name))
} }
func (f *Functions) InvalidateFramebuffer(target, attachment gl.Enum) { func (f *Functions) InvalidateFramebuffer(target, attachment Enum) {
fn := f.Ctx.Get("invalidateFramebuffer") fn := f.Ctx.Get("invalidateFramebuffer")
if !fn.IsUndefined() { if !fn.IsUndefined() {
if f.int32Buf.IsUndefined() { if f.int32Buf.IsUndefined() {
@@ -250,16 +258,16 @@ func (f *Functions) InvalidateFramebuffer(target, attachment gl.Enum) {
f.Ctx.Call("invalidateFramebuffer", int(target), f.int32Buf) f.Ctx.Call("invalidateFramebuffer", int(target), f.int32Buf)
} }
} }
func (f *Functions) LinkProgram(p gl.Program) { func (f *Functions) LinkProgram(p Program) {
f.Ctx.Call("linkProgram", js.Value(p)) f.Ctx.Call("linkProgram", js.Value(p))
} }
func (f *Functions) PixelStorei(pname gl.Enum, param int32) { func (f *Functions) PixelStorei(pname Enum, param int32) {
f.Ctx.Call("pixelStorei", int(pname), param) f.Ctx.Call("pixelStorei", int(pname), param)
} }
func (f *Functions) RenderbufferStorage(target, internalformat gl.Enum, width, height int) { func (f *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) {
f.Ctx.Call("renderbufferStorage", int(target), int(internalformat), width, height) f.Ctx.Call("renderbufferStorage", int(target), int(internalformat), width, height)
} }
func (f *Functions) ReadPixels(x, y, width, height int, format, ty gl.Enum, data []byte) { func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) {
f.resizeByteBuffer(len(data)) f.resizeByteBuffer(len(data))
f.Ctx.Call("readPixels", x, y, width, height, int(format), int(ty), f.byteBuf) f.Ctx.Call("readPixels", x, y, width, height, int(format), int(ty), f.byteBuf)
js.CopyBytesToGo(data, f.byteBuf) js.CopyBytesToGo(data, f.byteBuf)
@@ -267,40 +275,40 @@ func (f *Functions) ReadPixels(x, y, width, height int, format, ty gl.Enum, data
func (f *Functions) Scissor(x, y, width, height int32) { func (f *Functions) Scissor(x, y, width, height int32) {
f.Ctx.Call("scissor", x, y, width, height) f.Ctx.Call("scissor", x, y, width, height)
} }
func (f *Functions) ShaderSource(s gl.Shader, src string) { func (f *Functions) ShaderSource(s Shader, src string) {
f.Ctx.Call("shaderSource", js.Value(s), src) f.Ctx.Call("shaderSource", js.Value(s), src)
} }
func (f *Functions) TexImage2D(target gl.Enum, level int, internalFormat int, width, height int, format, ty gl.Enum, data []byte) { func (f *Functions) TexImage2D(target Enum, level int, internalFormat int, width, height int, format, ty Enum, data []byte) {
f.Ctx.Call("texImage2D", int(target), int(level), int(internalFormat), int(width), int(height), 0, int(format), int(ty), f.byteArrayOf(data)) f.Ctx.Call("texImage2D", int(target), int(level), int(internalFormat), int(width), int(height), 0, int(format), int(ty), f.byteArrayOf(data))
} }
func (f *Functions) TexSubImage2D(target gl.Enum, level int, x, y, width, height int, format, ty gl.Enum, data []byte) { func (f *Functions) TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte) {
f.Ctx.Call("texSubImage2D", int(target), level, x, y, width, height, int(format), int(ty), f.byteArrayOf(data)) f.Ctx.Call("texSubImage2D", int(target), level, x, y, width, height, int(format), int(ty), f.byteArrayOf(data))
} }
func (f *Functions) TexParameteri(target, pname gl.Enum, param int) { func (f *Functions) TexParameteri(target, pname Enum, param int) {
f.Ctx.Call("texParameteri", int(target), int(pname), int(param)) f.Ctx.Call("texParameteri", int(target), int(pname), int(param))
} }
func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) {
f.Ctx.Call("uniformBlockBinding", js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding)) f.Ctx.Call("uniformBlockBinding", js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding))
} }
func (f *Functions) Uniform1f(dst gl.Uniform, v float32) { func (f *Functions) Uniform1f(dst Uniform, v float32) {
f.Ctx.Call("uniform1f", js.Value(dst), v) f.Ctx.Call("uniform1f", js.Value(dst), v)
} }
func (f *Functions) Uniform1i(dst gl.Uniform, v int) { func (f *Functions) Uniform1i(dst Uniform, v int) {
f.Ctx.Call("uniform1i", js.Value(dst), v) f.Ctx.Call("uniform1i", js.Value(dst), v)
} }
func (f *Functions) Uniform2f(dst gl.Uniform, v0, v1 float32) { func (f *Functions) Uniform2f(dst Uniform, v0, v1 float32) {
f.Ctx.Call("uniform2f", js.Value(dst), v0, v1) f.Ctx.Call("uniform2f", js.Value(dst), v0, v1)
} }
func (f *Functions) Uniform3f(dst gl.Uniform, v0, v1, v2 float32) { func (f *Functions) Uniform3f(dst Uniform, v0, v1, v2 float32) {
f.Ctx.Call("uniform3f", js.Value(dst), v0, v1, v2) f.Ctx.Call("uniform3f", js.Value(dst), v0, v1, v2)
} }
func (f *Functions) Uniform4f(dst gl.Uniform, v0, v1, v2, v3 float32) { func (f *Functions) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) {
f.Ctx.Call("uniform4f", js.Value(dst), v0, v1, v2, v3) f.Ctx.Call("uniform4f", js.Value(dst), v0, v1, v2, v3)
} }
func (f *Functions) UseProgram(p gl.Program) { func (f *Functions) UseProgram(p Program) {
f.Ctx.Call("useProgram", js.Value(p)) f.Ctx.Call("useProgram", js.Value(p))
} }
func (f *Functions) VertexAttribPointer(dst gl.Attrib, size int, ty gl.Enum, normalized bool, stride, offset int) { func (f *Functions) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) {
f.Ctx.Call("vertexAttribPointer", int(dst), size, int(ty), normalized, stride, offset) f.Ctx.Call("vertexAttribPointer", int(dst), size, int(ty), normalized, stride, offset)
} }
func (f *Functions) Viewport(x, y, width, height int) { func (f *Functions) Viewport(x, y, width, height int) {
@@ -8,8 +8,6 @@ import (
"runtime" "runtime"
"strings" "strings"
"unsafe" "unsafe"
"gioui.org/gpu/gl"
) )
/* /*
@@ -77,7 +75,7 @@ __attribute__ ((visibility ("hidden"))) GLuint gio_glGetUniformBlockIndex(GLuint
} }
__attribute__ ((visibility ("hidden"))) void gio_glInvalidateFramebuffer(GLenum target, GLenum attachment) { __attribute__ ((visibility ("hidden"))) void gio_glInvalidateFramebuffer(GLenum target, GLenum attachment) {
// gl.Framebuffer invalidation is just a hint and can safely be ignored. // Framebuffer invalidation is just a hint and can safely be ignored.
if (_glInvalidateFramebuffer != NULL) { if (_glInvalidateFramebuffer != NULL) {
_glInvalidateFramebuffer(target, 1, &attachment); _glInvalidateFramebuffer(target, 1, &attachment);
} }
@@ -157,59 +155,68 @@ __attribute__((constructor)) static void gio_loadGLFunctions() {
*/ */
import "C" import "C"
type Context interface{}
type Functions struct { type Functions struct {
// gl.Query caches. // Query caches.
uints [100]C.GLuint uints [100]C.GLuint
ints [100]C.GLint ints [100]C.GLint
} }
func (f *Functions) ActiveTexture(texture gl.Enum) { func NewFunctions(ctx Context) (*Functions, error) {
if ctx != nil {
panic("non-nil context")
}
return new(Functions), nil
}
func (f *Functions) ActiveTexture(texture Enum) {
C.glActiveTexture(C.GLenum(texture)) C.glActiveTexture(C.GLenum(texture))
} }
func (f *Functions) AttachShader(p gl.Program, s gl.Shader) { func (f *Functions) AttachShader(p Program, s Shader) {
C.glAttachShader(C.GLuint(p.V), C.GLuint(s.V)) C.glAttachShader(C.GLuint(p.V), C.GLuint(s.V))
} }
func (f *Functions) BeginQuery(target gl.Enum, query gl.Query) { func (f *Functions) BeginQuery(target Enum, query Query) {
C.gio_glBeginQuery(C.GLenum(target), C.GLenum(query.V)) C.gio_glBeginQuery(C.GLenum(target), C.GLenum(query.V))
} }
func (f *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { func (f *Functions) BindAttribLocation(p Program, a Attrib, name string) {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
C.glBindAttribLocation(C.GLuint(p.V), C.GLuint(a), cname) C.glBindAttribLocation(C.GLuint(p.V), C.GLuint(a), cname)
} }
func (f *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { func (f *Functions) BindBufferBase(target Enum, index int, b Buffer) {
C.gio_glBindBufferBase(C.GLenum(target), C.GLuint(index), C.GLuint(b.V)) C.gio_glBindBufferBase(C.GLenum(target), C.GLuint(index), C.GLuint(b.V))
} }
func (f *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { func (f *Functions) BindBuffer(target Enum, b Buffer) {
C.glBindBuffer(C.GLenum(target), C.GLuint(b.V)) C.glBindBuffer(C.GLenum(target), C.GLuint(b.V))
} }
func (f *Functions) BindFramebuffer(target gl.Enum, fb gl.Framebuffer) { func (f *Functions) BindFramebuffer(target Enum, fb Framebuffer) {
C.glBindFramebuffer(C.GLenum(target), C.GLuint(fb.V)) C.glBindFramebuffer(C.GLenum(target), C.GLuint(fb.V))
} }
func (f *Functions) BindRenderbuffer(target gl.Enum, fb gl.Renderbuffer) { func (f *Functions) BindRenderbuffer(target Enum, fb Renderbuffer) {
C.glBindRenderbuffer(C.GLenum(target), C.GLuint(fb.V)) C.glBindRenderbuffer(C.GLenum(target), C.GLuint(fb.V))
} }
func (f *Functions) BindTexture(target gl.Enum, t gl.Texture) { func (f *Functions) BindTexture(target Enum, t Texture) {
C.glBindTexture(C.GLenum(target), C.GLuint(t.V)) C.glBindTexture(C.GLenum(target), C.GLuint(t.V))
} }
func (f *Functions) BlendEquation(mode gl.Enum) { func (f *Functions) BlendEquation(mode Enum) {
C.glBlendEquation(C.GLenum(mode)) C.glBlendEquation(C.GLenum(mode))
} }
func (f *Functions) BlendFunc(sfactor, dfactor gl.Enum) { func (f *Functions) BlendFunc(sfactor, dfactor Enum) {
C.glBlendFunc(C.GLenum(sfactor), C.GLenum(dfactor)) C.glBlendFunc(C.GLenum(sfactor), C.GLenum(dfactor))
} }
func (f *Functions) BufferData(target gl.Enum, src []byte, usage gl.Enum) { func (f *Functions) BufferData(target Enum, src []byte, usage Enum) {
var p unsafe.Pointer var p unsafe.Pointer
if len(src) > 0 { if len(src) > 0 {
p = unsafe.Pointer(&src[0]) p = unsafe.Pointer(&src[0])
@@ -217,11 +224,11 @@ func (f *Functions) BufferData(target gl.Enum, src []byte, usage gl.Enum) {
C.glBufferData(C.GLenum(target), C.GLsizeiptr(len(src)), p, C.GLenum(usage)) C.glBufferData(C.GLenum(target), C.GLsizeiptr(len(src)), p, C.GLenum(usage))
} }
func (f *Functions) CheckFramebufferStatus(target gl.Enum) gl.Enum { func (f *Functions) CheckFramebufferStatus(target Enum) Enum {
return gl.Enum(C.glCheckFramebufferStatus(C.GLenum(target))) return Enum(C.glCheckFramebufferStatus(C.GLenum(target)))
} }
func (f *Functions) Clear(mask gl.Enum) { func (f *Functions) Clear(mask Enum) {
C.glClear(C.GLbitfield(mask)) C.glClear(C.GLbitfield(mask))
} }
@@ -233,77 +240,77 @@ func (f *Functions) ClearDepthf(d float32) {
C.glClearDepthf(C.GLfloat(d)) C.glClearDepthf(C.GLfloat(d))
} }
func (f *Functions) CompileShader(s gl.Shader) { func (f *Functions) CompileShader(s Shader) {
C.glCompileShader(C.GLuint(s.V)) C.glCompileShader(C.GLuint(s.V))
} }
func (f *Functions) CreateBuffer() gl.Buffer { func (f *Functions) CreateBuffer() Buffer {
C.glGenBuffers(1, &f.uints[0]) C.glGenBuffers(1, &f.uints[0])
return gl.Buffer{uint(f.uints[0])} return Buffer{uint(f.uints[0])}
} }
func (f *Functions) CreateFramebuffer() gl.Framebuffer { func (f *Functions) CreateFramebuffer() Framebuffer {
C.glGenFramebuffers(1, &f.uints[0]) C.glGenFramebuffers(1, &f.uints[0])
return gl.Framebuffer{uint(f.uints[0])} return Framebuffer{uint(f.uints[0])}
} }
func (f *Functions) CreateProgram() gl.Program { func (f *Functions) CreateProgram() Program {
return gl.Program{uint(C.glCreateProgram())} return Program{uint(C.glCreateProgram())}
} }
func (f *Functions) CreateQuery() gl.Query { func (f *Functions) CreateQuery() Query {
C.gio_glGenQueries(1, &f.uints[0]) C.gio_glGenQueries(1, &f.uints[0])
return gl.Query{uint(f.uints[0])} return Query{uint(f.uints[0])}
} }
func (f *Functions) CreateRenderbuffer() gl.Renderbuffer { func (f *Functions) CreateRenderbuffer() Renderbuffer {
C.glGenRenderbuffers(1, &f.uints[0]) C.glGenRenderbuffers(1, &f.uints[0])
return gl.Renderbuffer{uint(f.uints[0])} return Renderbuffer{uint(f.uints[0])}
} }
func (f *Functions) CreateShader(ty gl.Enum) gl.Shader { func (f *Functions) CreateShader(ty Enum) Shader {
return gl.Shader{uint(C.glCreateShader(C.GLenum(ty)))} return Shader{uint(C.glCreateShader(C.GLenum(ty)))}
} }
func (f *Functions) CreateTexture() gl.Texture { func (f *Functions) CreateTexture() Texture {
C.glGenTextures(1, &f.uints[0]) C.glGenTextures(1, &f.uints[0])
return gl.Texture{uint(f.uints[0])} return Texture{uint(f.uints[0])}
} }
func (f *Functions) DeleteBuffer(v gl.Buffer) { func (f *Functions) DeleteBuffer(v Buffer) {
f.uints[0] = C.GLuint(v.V) f.uints[0] = C.GLuint(v.V)
C.glDeleteBuffers(1, &f.uints[0]) C.glDeleteBuffers(1, &f.uints[0])
} }
func (f *Functions) DeleteFramebuffer(v gl.Framebuffer) { func (f *Functions) DeleteFramebuffer(v Framebuffer) {
f.uints[0] = C.GLuint(v.V) f.uints[0] = C.GLuint(v.V)
C.glDeleteFramebuffers(1, &f.uints[0]) C.glDeleteFramebuffers(1, &f.uints[0])
} }
func (f *Functions) DeleteProgram(p gl.Program) { func (f *Functions) DeleteProgram(p Program) {
C.glDeleteProgram(C.GLuint(p.V)) C.glDeleteProgram(C.GLuint(p.V))
} }
func (f *Functions) DeleteQuery(query gl.Query) { func (f *Functions) DeleteQuery(query Query) {
f.uints[0] = C.GLuint(query.V) f.uints[0] = C.GLuint(query.V)
C.gio_glDeleteQueries(1, &f.uints[0]) C.gio_glDeleteQueries(1, &f.uints[0])
} }
func (f *Functions) DeleteRenderbuffer(v gl.Renderbuffer) { func (f *Functions) DeleteRenderbuffer(v Renderbuffer) {
f.uints[0] = C.GLuint(v.V) f.uints[0] = C.GLuint(v.V)
C.glDeleteRenderbuffers(1, &f.uints[0]) C.glDeleteRenderbuffers(1, &f.uints[0])
} }
func (f *Functions) DeleteShader(s gl.Shader) { func (f *Functions) DeleteShader(s Shader) {
C.glDeleteShader(C.GLuint(s.V)) C.glDeleteShader(C.GLuint(s.V))
} }
func (f *Functions) DeleteTexture(v gl.Texture) { func (f *Functions) DeleteTexture(v Texture) {
f.uints[0] = C.GLuint(v.V) f.uints[0] = C.GLuint(v.V)
C.glDeleteTextures(1, &f.uints[0]) C.glDeleteTextures(1, &f.uints[0])
} }
func (f *Functions) DepthFunc(v gl.Enum) { func (f *Functions) DepthFunc(v Enum) {
C.glDepthFunc(C.GLenum(v)) C.glDepthFunc(C.GLenum(v))
} }
@@ -315,31 +322,31 @@ func (f *Functions) DepthMask(mask bool) {
C.glDepthMask(m) C.glDepthMask(m)
} }
func (f *Functions) DisableVertexAttribArray(a gl.Attrib) { func (f *Functions) DisableVertexAttribArray(a Attrib) {
C.glDisableVertexAttribArray(C.GLuint(a)) C.glDisableVertexAttribArray(C.GLuint(a))
} }
func (f *Functions) Disable(cap gl.Enum) { func (f *Functions) Disable(cap Enum) {
C.glDisable(C.GLenum(cap)) C.glDisable(C.GLenum(cap))
} }
func (f *Functions) DrawArrays(mode gl.Enum, first int, count int) { func (f *Functions) DrawArrays(mode Enum, first int, count int) {
C.glDrawArrays(C.GLenum(mode), C.GLint(first), C.GLsizei(count)) C.glDrawArrays(C.GLenum(mode), C.GLint(first), C.GLsizei(count))
} }
func (f *Functions) DrawElements(mode gl.Enum, count int, ty gl.Enum, offset int) { func (f *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) {
C.gio_glDrawElements(C.GLenum(mode), C.GLsizei(count), C.GLenum(ty), C.uintptr_t(offset)) C.gio_glDrawElements(C.GLenum(mode), C.GLsizei(count), C.GLenum(ty), C.uintptr_t(offset))
} }
func (f *Functions) Enable(cap gl.Enum) { func (f *Functions) Enable(cap Enum) {
C.glEnable(C.GLenum(cap)) C.glEnable(C.GLenum(cap))
} }
func (f *Functions) EndQuery(target gl.Enum) { func (f *Functions) EndQuery(target Enum) {
C.gio_glEndQuery(C.GLenum(target)) C.gio_glEndQuery(C.GLenum(target))
} }
func (f *Functions) EnableVertexAttribArray(a gl.Attrib) { func (f *Functions) EnableVertexAttribArray(a Attrib) {
C.glEnableVertexAttribArray(C.GLuint(a)) C.glEnableVertexAttribArray(C.GLuint(a))
} }
@@ -347,67 +354,67 @@ func (f *Functions) Finish() {
C.glFinish() C.glFinish()
} }
func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget gl.Enum, renderbuffer gl.Renderbuffer) { func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) {
C.glFramebufferRenderbuffer(C.GLenum(target), C.GLenum(attachment), C.GLenum(renderbuffertarget), C.GLuint(renderbuffer.V)) C.glFramebufferRenderbuffer(C.GLenum(target), C.GLenum(attachment), C.GLenum(renderbuffertarget), C.GLuint(renderbuffer.V))
} }
func (f *Functions) FramebufferTexture2D(target, attachment, texTarget gl.Enum, t gl.Texture, level int) { func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
C.glFramebufferTexture2D(C.GLenum(target), C.GLenum(attachment), C.GLenum(texTarget), C.GLuint(t.V), C.GLint(level)) C.glFramebufferTexture2D(C.GLenum(target), C.GLenum(attachment), C.GLenum(texTarget), C.GLuint(t.V), C.GLint(level))
} }
func (c *Functions) GetBinding(pname gl.Enum) gl.Object { func (c *Functions) GetBinding(pname Enum) Object {
return gl.Object{uint(c.GetInteger(pname))} return Object{uint(c.GetInteger(pname))}
} }
func (f *Functions) GetError() gl.Enum { func (f *Functions) GetError() Enum {
return gl.Enum(C.glGetError()) return Enum(C.glGetError())
} }
func (f *Functions) GetRenderbufferParameteri(target, pname gl.Enum) int { func (f *Functions) GetRenderbufferParameteri(target, pname Enum) int {
C.glGetRenderbufferParameteriv(C.GLenum(target), C.GLenum(pname), &f.ints[0]) C.glGetRenderbufferParameteriv(C.GLenum(target), C.GLenum(pname), &f.ints[0])
return int(f.ints[0]) return int(f.ints[0])
} }
func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname gl.Enum) int { func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
C.glGetFramebufferAttachmentParameteriv(C.GLenum(target), C.GLenum(attachment), C.GLenum(pname), &f.ints[0]) C.glGetFramebufferAttachmentParameteriv(C.GLenum(target), C.GLenum(attachment), C.GLenum(pname), &f.ints[0])
return int(f.ints[0]) return int(f.ints[0])
} }
func (f *Functions) GetInteger(pname gl.Enum) int { func (f *Functions) GetInteger(pname Enum) int {
C.glGetIntegerv(C.GLenum(pname), &f.ints[0]) C.glGetIntegerv(C.GLenum(pname), &f.ints[0])
return int(f.ints[0]) return int(f.ints[0])
} }
func (f *Functions) GetProgrami(p gl.Program, pname gl.Enum) int { func (f *Functions) GetProgrami(p Program, pname Enum) int {
C.glGetProgramiv(C.GLuint(p.V), C.GLenum(pname), &f.ints[0]) C.glGetProgramiv(C.GLuint(p.V), C.GLenum(pname), &f.ints[0])
return int(f.ints[0]) return int(f.ints[0])
} }
func (f *Functions) GetProgramInfoLog(p gl.Program) string { func (f *Functions) GetProgramInfoLog(p Program) string {
n := f.GetProgrami(p, gl.INFO_LOG_LENGTH) n := f.GetProgrami(p, INFO_LOG_LENGTH)
buf := make([]byte, n) buf := make([]byte, n)
C.glGetProgramInfoLog(C.GLuint(p.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0]))) C.glGetProgramInfoLog(C.GLuint(p.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0])))
return string(buf) return string(buf)
} }
func (f *Functions) GetQueryObjectuiv(query gl.Query, pname gl.Enum) uint { func (f *Functions) GetQueryObjectuiv(query Query, pname Enum) uint {
C.gio_glGetQueryObjectuiv(C.GLuint(query.V), C.GLenum(pname), &f.uints[0]) C.gio_glGetQueryObjectuiv(C.GLuint(query.V), C.GLenum(pname), &f.uints[0])
return uint(f.uints[0]) return uint(f.uints[0])
} }
func (f *Functions) GetShaderi(s gl.Shader, pname gl.Enum) int { func (f *Functions) GetShaderi(s Shader, pname Enum) int {
C.glGetShaderiv(C.GLuint(s.V), C.GLenum(pname), &f.ints[0]) C.glGetShaderiv(C.GLuint(s.V), C.GLenum(pname), &f.ints[0])
return int(f.ints[0]) return int(f.ints[0])
} }
func (f *Functions) GetShaderInfoLog(s gl.Shader) string { func (f *Functions) GetShaderInfoLog(s Shader) string {
n := f.GetShaderi(s, gl.INFO_LOG_LENGTH) n := f.GetShaderi(s, INFO_LOG_LENGTH)
buf := make([]byte, n) buf := make([]byte, n)
C.glGetShaderInfoLog(C.GLuint(s.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0]))) C.glGetShaderInfoLog(C.GLuint(s.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0])))
return string(buf) return string(buf)
} }
func (f *Functions) GetStringi(pname gl.Enum, index int) string { func (f *Functions) GetStringi(pname Enum, index int) string {
str := C.gio_glGetStringi(C.GLenum(pname), C.GLuint(index)) str := C.gio_glGetStringi(C.GLenum(pname), C.GLuint(index))
if str == nil { if str == nil {
return "" return ""
@@ -415,15 +422,15 @@ func (f *Functions) GetStringi(pname gl.Enum, index int) string {
return C.GoString((*C.char)(unsafe.Pointer(str))) return C.GoString((*C.char)(unsafe.Pointer(str)))
} }
func (f *Functions) GetString(pname gl.Enum) string { func (f *Functions) GetString(pname Enum) string {
switch { switch {
case runtime.GOOS == "darwin" && pname == gl.EXTENSIONS: case runtime.GOOS == "darwin" && pname == EXTENSIONS:
// macOS OpenGL 3 core profile doesn't support glGetString(GL_EXTENSIONS). // macOS OpenGL 3 core profile doesn't support glGetString(GL_EXTENSIONS).
// Use glGetStringi(GL_EXTENSIONS, <index>). // Use glGetStringi(GL_EXTENSIONS, <index>).
var exts []string var exts []string
nexts := f.GetInteger(gl.NUM_EXTENSIONS) nexts := f.GetInteger(NUM_EXTENSIONS)
for i := 0; i < nexts; i++ { for i := 0; i < nexts; i++ {
ext := f.GetStringi(gl.EXTENSIONS, i) ext := f.GetStringi(EXTENSIONS, i)
exts = append(exts, ext) exts = append(exts, ext)
} }
return strings.Join(exts, " ") return strings.Join(exts, " ")
@@ -433,27 +440,27 @@ func (f *Functions) GetString(pname gl.Enum) string {
} }
} }
func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { func (f *Functions) GetUniformBlockIndex(p Program, name string) uint {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
return uint(C.gio_glGetUniformBlockIndex(C.GLuint(p.V), cname)) return uint(C.gio_glGetUniformBlockIndex(C.GLuint(p.V), cname))
} }
func (f *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { func (f *Functions) GetUniformLocation(p Program, name string) Uniform {
cname := C.CString(name) cname := C.CString(name)
defer C.free(unsafe.Pointer(cname)) defer C.free(unsafe.Pointer(cname))
return gl.Uniform{int(C.glGetUniformLocation(C.GLuint(p.V), cname))} return Uniform{int(C.glGetUniformLocation(C.GLuint(p.V), cname))}
} }
func (f *Functions) InvalidateFramebuffer(target, attachment gl.Enum) { func (f *Functions) InvalidateFramebuffer(target, attachment Enum) {
C.gio_glInvalidateFramebuffer(C.GLenum(target), C.GLenum(attachment)) C.gio_glInvalidateFramebuffer(C.GLenum(target), C.GLenum(attachment))
} }
func (f *Functions) LinkProgram(p gl.Program) { func (f *Functions) LinkProgram(p Program) {
C.glLinkProgram(C.GLuint(p.V)) C.glLinkProgram(C.GLuint(p.V))
} }
func (f *Functions) PixelStorei(pname gl.Enum, param int32) { func (f *Functions) PixelStorei(pname Enum, param int32) {
C.glPixelStorei(C.GLenum(pname), C.GLint(param)) C.glPixelStorei(C.GLenum(pname), C.GLint(param))
} }
@@ -461,7 +468,7 @@ func (f *Functions) Scissor(x, y, width, height int32) {
C.glScissor(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height)) C.glScissor(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height))
} }
func (f *Functions) ReadPixels(x, y, width, height int, format, ty gl.Enum, data []byte) { func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) {
var p unsafe.Pointer var p unsafe.Pointer
if len(data) > 0 { if len(data) > 0 {
p = unsafe.Pointer(&data[0]) p = unsafe.Pointer(&data[0])
@@ -469,18 +476,18 @@ func (f *Functions) ReadPixels(x, y, width, height int, format, ty gl.Enum, data
C.glReadPixels(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p) C.glReadPixels(C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p)
} }
func (f *Functions) RenderbufferStorage(target, internalformat gl.Enum, width, height int) { func (f *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) {
C.glRenderbufferStorage(C.GLenum(target), C.GLenum(internalformat), C.GLsizei(width), C.GLsizei(height)) C.glRenderbufferStorage(C.GLenum(target), C.GLenum(internalformat), C.GLsizei(width), C.GLsizei(height))
} }
func (f *Functions) ShaderSource(s gl.Shader, src string) { func (f *Functions) ShaderSource(s Shader, src string) {
csrc := C.CString(src) csrc := C.CString(src)
defer C.free(unsafe.Pointer(csrc)) defer C.free(unsafe.Pointer(csrc))
strlen := C.GLint(len(src)) strlen := C.GLint(len(src))
C.glShaderSource(C.GLuint(s.V), 1, &csrc, &strlen) C.glShaderSource(C.GLuint(s.V), 1, &csrc, &strlen)
} }
func (f *Functions) TexImage2D(target gl.Enum, level int, internalFormat int, width int, height int, format gl.Enum, ty gl.Enum, data []byte) { func (f *Functions) TexImage2D(target Enum, level int, internalFormat int, width int, height int, format Enum, ty Enum, data []byte) {
var p unsafe.Pointer var p unsafe.Pointer
if len(data) > 0 { if len(data) > 0 {
p = unsafe.Pointer(&data[0]) p = unsafe.Pointer(&data[0])
@@ -488,7 +495,7 @@ func (f *Functions) TexImage2D(target gl.Enum, level int, internalFormat int, wi
C.glTexImage2D(C.GLenum(target), C.GLint(level), C.GLint(internalFormat), C.GLsizei(width), C.GLsizei(height), 0, C.GLenum(format), C.GLenum(ty), p) C.glTexImage2D(C.GLenum(target), C.GLint(level), C.GLint(internalFormat), C.GLsizei(width), C.GLsizei(height), 0, C.GLenum(format), C.GLenum(ty), p)
} }
func (f *Functions) TexSubImage2D(target gl.Enum, level int, x int, y int, width int, height int, format gl.Enum, ty gl.Enum, data []byte) { func (f *Functions) TexSubImage2D(target Enum, level int, x int, y int, width int, height int, format Enum, ty Enum, data []byte) {
var p unsafe.Pointer var p unsafe.Pointer
if len(data) > 0 { if len(data) > 0 {
p = unsafe.Pointer(&data[0]) p = unsafe.Pointer(&data[0])
@@ -496,39 +503,39 @@ func (f *Functions) TexSubImage2D(target gl.Enum, level int, x int, y int, width
C.glTexSubImage2D(C.GLenum(target), C.GLint(level), C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p) C.glTexSubImage2D(C.GLenum(target), C.GLint(level), C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p)
} }
func (f *Functions) TexParameteri(target, pname gl.Enum, param int) { func (f *Functions) TexParameteri(target, pname Enum, param int) {
C.glTexParameteri(C.GLenum(target), C.GLenum(pname), C.GLint(param)) C.glTexParameteri(C.GLenum(target), C.GLenum(pname), C.GLint(param))
} }
func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) {
C.gio_glUniformBlockBinding(C.GLuint(p.V), C.GLuint(uniformBlockIndex), C.GLuint(uniformBlockBinding)) C.gio_glUniformBlockBinding(C.GLuint(p.V), C.GLuint(uniformBlockIndex), C.GLuint(uniformBlockBinding))
} }
func (f *Functions) Uniform1f(dst gl.Uniform, v float32) { func (f *Functions) Uniform1f(dst Uniform, v float32) {
C.glUniform1f(C.GLint(dst.V), C.GLfloat(v)) C.glUniform1f(C.GLint(dst.V), C.GLfloat(v))
} }
func (f *Functions) Uniform1i(dst gl.Uniform, v int) { func (f *Functions) Uniform1i(dst Uniform, v int) {
C.glUniform1i(C.GLint(dst.V), C.GLint(v)) C.glUniform1i(C.GLint(dst.V), C.GLint(v))
} }
func (f *Functions) Uniform2f(dst gl.Uniform, v0 float32, v1 float32) { func (f *Functions) Uniform2f(dst Uniform, v0 float32, v1 float32) {
C.glUniform2f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1)) C.glUniform2f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1))
} }
func (f *Functions) Uniform3f(dst gl.Uniform, v0 float32, v1 float32, v2 float32) { func (f *Functions) Uniform3f(dst Uniform, v0 float32, v1 float32, v2 float32) {
C.glUniform3f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2)) C.glUniform3f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2))
} }
func (f *Functions) Uniform4f(dst gl.Uniform, v0 float32, v1 float32, v2 float32, v3 float32) { func (f *Functions) Uniform4f(dst Uniform, v0 float32, v1 float32, v2 float32, v3 float32) {
C.glUniform4f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2), C.GLfloat(v3)) C.glUniform4f(C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2), C.GLfloat(v3))
} }
func (f *Functions) UseProgram(p gl.Program) { func (f *Functions) UseProgram(p Program) {
C.glUseProgram(C.GLuint(p.V)) C.glUseProgram(C.GLuint(p.V))
} }
func (f *Functions) VertexAttribPointer(dst gl.Attrib, size int, ty gl.Enum, normalized bool, stride int, offset int) { func (f *Functions) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride int, offset int) {
var n C.GLboolean = C.GL_FALSE var n C.GLboolean = C.GL_FALSE
if normalized { if normalized {
n = C.GL_TRUE n = C.GL_TRUE
@@ -10,7 +10,6 @@ import (
"golang.org/x/sys/windows" "golang.org/x/sys/windows"
"gioui.org/gpu/gl"
gunsafe "gioui.org/internal/unsafe" gunsafe "gioui.org/internal/unsafe"
) )
@@ -93,47 +92,56 @@ var (
) )
type Functions struct { type Functions struct {
// gl.Query caches. // Query caches.
int32s [100]int32 int32s [100]int32
} }
func (c *Functions) ActiveTexture(t gl.Enum) { type Context interface{}
func NewFunctions(ctx Context) (*Functions, error) {
if ctx != nil {
panic("non-nil context")
}
return new(Functions), nil
}
func (c *Functions) ActiveTexture(t Enum) {
syscall.Syscall(_glActiveTexture.Addr(), 1, uintptr(t), 0, 0) syscall.Syscall(_glActiveTexture.Addr(), 1, uintptr(t), 0, 0)
} }
func (c *Functions) AttachShader(p gl.Program, s gl.Shader) { func (c *Functions) AttachShader(p Program, s Shader) {
syscall.Syscall(_glAttachShader.Addr(), 2, uintptr(p.V), uintptr(s.V), 0) syscall.Syscall(_glAttachShader.Addr(), 2, uintptr(p.V), uintptr(s.V), 0)
} }
func (f *Functions) BeginQuery(target gl.Enum, query gl.Query) { func (f *Functions) BeginQuery(target Enum, query Query) {
syscall.Syscall(_glBeginQuery.Addr(), 2, uintptr(target), uintptr(query.V), 0) syscall.Syscall(_glBeginQuery.Addr(), 2, uintptr(target), uintptr(query.V), 0)
} }
func (c *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { func (c *Functions) BindAttribLocation(p Program, a Attrib, name string) {
cname := cString(name) cname := cString(name)
c0 := &cname[0] c0 := &cname[0]
syscall.Syscall(_glBindAttribLocation.Addr(), 3, uintptr(p.V), uintptr(a), uintptr(unsafe.Pointer(c0))) syscall.Syscall(_glBindAttribLocation.Addr(), 3, uintptr(p.V), uintptr(a), uintptr(unsafe.Pointer(c0)))
issue34474KeepAlive(c) issue34474KeepAlive(c)
} }
func (c *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { func (c *Functions) BindBuffer(target Enum, b Buffer) {
syscall.Syscall(_glBindBuffer.Addr(), 2, uintptr(target), uintptr(b.V), 0) syscall.Syscall(_glBindBuffer.Addr(), 2, uintptr(target), uintptr(b.V), 0)
} }
func (c *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { func (c *Functions) BindBufferBase(target Enum, index int, b Buffer) {
syscall.Syscall(_glBindBufferBase.Addr(), 3, uintptr(target), uintptr(index), uintptr(b.V)) syscall.Syscall(_glBindBufferBase.Addr(), 3, uintptr(target), uintptr(index), uintptr(b.V))
} }
func (c *Functions) BindFramebuffer(target gl.Enum, fb gl.Framebuffer) { func (c *Functions) BindFramebuffer(target Enum, fb Framebuffer) {
syscall.Syscall(_glBindFramebuffer.Addr(), 2, uintptr(target), uintptr(fb.V), 0) syscall.Syscall(_glBindFramebuffer.Addr(), 2, uintptr(target), uintptr(fb.V), 0)
} }
func (c *Functions) BindRenderbuffer(target gl.Enum, rb gl.Renderbuffer) { func (c *Functions) BindRenderbuffer(target Enum, rb Renderbuffer) {
syscall.Syscall(_glBindRenderbuffer.Addr(), 2, uintptr(target), uintptr(rb.V), 0) syscall.Syscall(_glBindRenderbuffer.Addr(), 2, uintptr(target), uintptr(rb.V), 0)
} }
func (c *Functions) BindTexture(target gl.Enum, t gl.Texture) { func (c *Functions) BindTexture(target Enum, t Texture) {
syscall.Syscall(_glBindTexture.Addr(), 2, uintptr(target), uintptr(t.V), 0) syscall.Syscall(_glBindTexture.Addr(), 2, uintptr(target), uintptr(t.V), 0)
} }
func (c *Functions) BlendEquation(mode gl.Enum) { func (c *Functions) BlendEquation(mode Enum) {
syscall.Syscall(_glBlendEquation.Addr(), 1, uintptr(mode), 0, 0) syscall.Syscall(_glBlendEquation.Addr(), 1, uintptr(mode), 0, 0)
} }
func (c *Functions) BlendFunc(sfactor, dfactor gl.Enum) { func (c *Functions) BlendFunc(sfactor, dfactor Enum) {
syscall.Syscall(_glBlendFunc.Addr(), 2, uintptr(sfactor), uintptr(dfactor), 0) syscall.Syscall(_glBlendFunc.Addr(), 2, uintptr(sfactor), uintptr(dfactor), 0)
} }
func (c *Functions) BufferData(target gl.Enum, src []byte, usage gl.Enum) { func (c *Functions) BufferData(target Enum, src []byte, usage Enum) {
if n := len(src); n == 0 { if n := len(src); n == 0 {
syscall.Syscall6(_glBufferData.Addr(), 4, uintptr(target), 0, 0, uintptr(usage), 0, 0) syscall.Syscall6(_glBufferData.Addr(), 4, uintptr(target), 0, 0, uintptr(usage), 0, 0)
} else { } else {
@@ -142,11 +150,11 @@ func (c *Functions) BufferData(target gl.Enum, src []byte, usage gl.Enum) {
issue34474KeepAlive(s0) issue34474KeepAlive(s0)
} }
} }
func (c *Functions) CheckFramebufferStatus(target gl.Enum) gl.Enum { func (c *Functions) CheckFramebufferStatus(target Enum) Enum {
s, _, _ := syscall.Syscall(_glCheckFramebufferStatus.Addr(), 1, uintptr(target), 0, 0) s, _, _ := syscall.Syscall(_glCheckFramebufferStatus.Addr(), 1, uintptr(target), 0, 0)
return gl.Enum(s) return Enum(s)
} }
func (c *Functions) Clear(mask gl.Enum) { func (c *Functions) Clear(mask Enum) {
syscall.Syscall(_glClear.Addr(), 1, uintptr(mask), 0, 0) syscall.Syscall(_glClear.Addr(), 1, uintptr(mask), 0, 0)
} }
func (c *Functions) ClearColor(red, green, blue, alpha float32) { func (c *Functions) ClearColor(red, green, blue, alpha float32) {
@@ -155,64 +163,64 @@ func (c *Functions) ClearColor(red, green, blue, alpha float32) {
func (c *Functions) ClearDepthf(d float32) { func (c *Functions) ClearDepthf(d float32) {
syscall.Syscall(_glClearDepthf.Addr(), 1, uintptr(math.Float32bits(d)), 0, 0) syscall.Syscall(_glClearDepthf.Addr(), 1, uintptr(math.Float32bits(d)), 0, 0)
} }
func (c *Functions) CompileShader(s gl.Shader) { func (c *Functions) CompileShader(s Shader) {
syscall.Syscall(_glCompileShader.Addr(), 1, uintptr(s.V), 0, 0) syscall.Syscall(_glCompileShader.Addr(), 1, uintptr(s.V), 0, 0)
} }
func (c *Functions) CreateBuffer() gl.Buffer { func (c *Functions) CreateBuffer() Buffer {
var buf uintptr var buf uintptr
syscall.Syscall(_glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&buf)), 0) syscall.Syscall(_glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&buf)), 0)
return gl.Buffer{uint(buf)} return Buffer{uint(buf)}
} }
func (c *Functions) CreateFramebuffer() gl.Framebuffer { func (c *Functions) CreateFramebuffer() Framebuffer {
var fb uintptr var fb uintptr
syscall.Syscall(_glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&fb)), 0) syscall.Syscall(_glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&fb)), 0)
return gl.Framebuffer{uint(fb)} return Framebuffer{uint(fb)}
} }
func (c *Functions) CreateProgram() gl.Program { func (c *Functions) CreateProgram() Program {
p, _, _ := syscall.Syscall(_glCreateProgram.Addr(), 0, 0, 0, 0) p, _, _ := syscall.Syscall(_glCreateProgram.Addr(), 0, 0, 0, 0)
return gl.Program{uint(p)} return Program{uint(p)}
} }
func (f *Functions) CreateQuery() gl.Query { func (f *Functions) CreateQuery() Query {
var q uintptr var q uintptr
syscall.Syscall(_glGenQueries.Addr(), 2, 1, uintptr(unsafe.Pointer(&q)), 0) syscall.Syscall(_glGenQueries.Addr(), 2, 1, uintptr(unsafe.Pointer(&q)), 0)
return gl.Query{uint(q)} return Query{uint(q)}
} }
func (c *Functions) CreateRenderbuffer() gl.Renderbuffer { func (c *Functions) CreateRenderbuffer() Renderbuffer {
var rb uintptr var rb uintptr
syscall.Syscall(_glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&rb)), 0) syscall.Syscall(_glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&rb)), 0)
return gl.Renderbuffer{uint(rb)} return Renderbuffer{uint(rb)}
} }
func (c *Functions) CreateShader(ty gl.Enum) gl.Shader { func (c *Functions) CreateShader(ty Enum) Shader {
s, _, _ := syscall.Syscall(_glCreateShader.Addr(), 1, uintptr(ty), 0, 0) s, _, _ := syscall.Syscall(_glCreateShader.Addr(), 1, uintptr(ty), 0, 0)
return gl.Shader{uint(s)} return Shader{uint(s)}
} }
func (c *Functions) CreateTexture() gl.Texture { func (c *Functions) CreateTexture() Texture {
var t uintptr var t uintptr
syscall.Syscall(_glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&t)), 0) syscall.Syscall(_glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&t)), 0)
return gl.Texture{uint(t)} return Texture{uint(t)}
} }
func (c *Functions) DeleteBuffer(v gl.Buffer) { func (c *Functions) DeleteBuffer(v Buffer) {
syscall.Syscall(_glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v)), 0) syscall.Syscall(_glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v)), 0)
} }
func (c *Functions) DeleteFramebuffer(v gl.Framebuffer) { func (c *Functions) DeleteFramebuffer(v Framebuffer) {
syscall.Syscall(_glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0) syscall.Syscall(_glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0)
} }
func (c *Functions) DeleteProgram(p gl.Program) { func (c *Functions) DeleteProgram(p Program) {
syscall.Syscall(_glDeleteProgram.Addr(), 1, uintptr(p.V), 0, 0) syscall.Syscall(_glDeleteProgram.Addr(), 1, uintptr(p.V), 0, 0)
} }
func (f *Functions) DeleteQuery(query gl.Query) { func (f *Functions) DeleteQuery(query Query) {
syscall.Syscall(_glDeleteQueries.Addr(), 2, 1, uintptr(unsafe.Pointer(&query.V)), 0) syscall.Syscall(_glDeleteQueries.Addr(), 2, 1, uintptr(unsafe.Pointer(&query.V)), 0)
} }
func (c *Functions) DeleteShader(s gl.Shader) { func (c *Functions) DeleteShader(s Shader) {
syscall.Syscall(_glDeleteShader.Addr(), 1, uintptr(s.V), 0, 0) syscall.Syscall(_glDeleteShader.Addr(), 1, uintptr(s.V), 0, 0)
} }
func (c *Functions) DeleteRenderbuffer(v gl.Renderbuffer) { func (c *Functions) DeleteRenderbuffer(v Renderbuffer) {
syscall.Syscall(_glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0) syscall.Syscall(_glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0)
} }
func (c *Functions) DeleteTexture(v gl.Texture) { func (c *Functions) DeleteTexture(v Texture) {
syscall.Syscall(_glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0) syscall.Syscall(_glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&v.V)), 0)
} }
func (c *Functions) DepthFunc(f gl.Enum) { func (c *Functions) DepthFunc(f Enum) {
syscall.Syscall(_glDepthFunc.Addr(), 1, uintptr(f), 0, 0) syscall.Syscall(_glDepthFunc.Addr(), 1, uintptr(f), 0, 0)
} }
func (c *Functions) DepthMask(mask bool) { func (c *Functions) DepthMask(mask bool) {
@@ -222,98 +230,98 @@ func (c *Functions) DepthMask(mask bool) {
} }
syscall.Syscall(_glDepthMask.Addr(), 1, m, 0, 0) syscall.Syscall(_glDepthMask.Addr(), 1, m, 0, 0)
} }
func (c *Functions) DisableVertexAttribArray(a gl.Attrib) { func (c *Functions) DisableVertexAttribArray(a Attrib) {
syscall.Syscall(_glDisableVertexAttribArray.Addr(), 1, uintptr(a), 0, 0) syscall.Syscall(_glDisableVertexAttribArray.Addr(), 1, uintptr(a), 0, 0)
} }
func (c *Functions) Disable(cap gl.Enum) { func (c *Functions) Disable(cap Enum) {
syscall.Syscall(_glDisable.Addr(), 1, uintptr(cap), 0, 0) syscall.Syscall(_glDisable.Addr(), 1, uintptr(cap), 0, 0)
} }
func (c *Functions) DrawArrays(mode gl.Enum, first, count int) { func (c *Functions) DrawArrays(mode Enum, first, count int) {
syscall.Syscall(_glDrawArrays.Addr(), 3, uintptr(mode), uintptr(first), uintptr(count)) syscall.Syscall(_glDrawArrays.Addr(), 3, uintptr(mode), uintptr(first), uintptr(count))
} }
func (c *Functions) DrawElements(mode gl.Enum, count int, ty gl.Enum, offset int) { func (c *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) {
syscall.Syscall6(_glDrawElements.Addr(), 4, uintptr(mode), uintptr(count), uintptr(ty), uintptr(offset), 0, 0) syscall.Syscall6(_glDrawElements.Addr(), 4, uintptr(mode), uintptr(count), uintptr(ty), uintptr(offset), 0, 0)
} }
func (c *Functions) Enable(cap gl.Enum) { func (c *Functions) Enable(cap Enum) {
syscall.Syscall(_glEnable.Addr(), 1, uintptr(cap), 0, 0) syscall.Syscall(_glEnable.Addr(), 1, uintptr(cap), 0, 0)
} }
func (c *Functions) EnableVertexAttribArray(a gl.Attrib) { func (c *Functions) EnableVertexAttribArray(a Attrib) {
syscall.Syscall(_glEnableVertexAttribArray.Addr(), 1, uintptr(a), 0, 0) syscall.Syscall(_glEnableVertexAttribArray.Addr(), 1, uintptr(a), 0, 0)
} }
func (f *Functions) EndQuery(target gl.Enum) { func (f *Functions) EndQuery(target Enum) {
syscall.Syscall(_glEndQuery.Addr(), 1, uintptr(target), 0, 0) syscall.Syscall(_glEndQuery.Addr(), 1, uintptr(target), 0, 0)
} }
func (c *Functions) Finish() { func (c *Functions) Finish() {
syscall.Syscall(_glFinish.Addr(), 0, 0, 0, 0) syscall.Syscall(_glFinish.Addr(), 0, 0, 0, 0)
} }
func (c *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget gl.Enum, renderbuffer gl.Renderbuffer) { func (c *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) {
syscall.Syscall6(_glFramebufferRenderbuffer.Addr(), 4, uintptr(target), uintptr(attachment), uintptr(renderbuffertarget), uintptr(renderbuffer.V), 0, 0) syscall.Syscall6(_glFramebufferRenderbuffer.Addr(), 4, uintptr(target), uintptr(attachment), uintptr(renderbuffertarget), uintptr(renderbuffer.V), 0, 0)
} }
func (c *Functions) FramebufferTexture2D(target, attachment, texTarget gl.Enum, t gl.Texture, level int) { func (c *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
syscall.Syscall6(_glFramebufferTexture2D.Addr(), 5, uintptr(target), uintptr(attachment), uintptr(texTarget), uintptr(t.V), uintptr(level), 0) syscall.Syscall6(_glFramebufferTexture2D.Addr(), 5, uintptr(target), uintptr(attachment), uintptr(texTarget), uintptr(t.V), uintptr(level), 0)
} }
func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { func (f *Functions) GetUniformBlockIndex(p Program, name string) uint {
cname := cString(name) cname := cString(name)
c0 := &cname[0] c0 := &cname[0]
u, _, _ := syscall.Syscall(_glGetUniformBlockIndex.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0) u, _, _ := syscall.Syscall(_glGetUniformBlockIndex.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0)
issue34474KeepAlive(c0) issue34474KeepAlive(c0)
return uint(u) return uint(u)
} }
func (c *Functions) GetBinding(pname gl.Enum) gl.Object { func (c *Functions) GetBinding(pname Enum) Object {
return gl.Object{uint(c.GetInteger(pname))} return Object{uint(c.GetInteger(pname))}
} }
func (c *Functions) GetError() gl.Enum { func (c *Functions) GetError() Enum {
e, _, _ := syscall.Syscall(_glGetError.Addr(), 0, 0, 0, 0) e, _, _ := syscall.Syscall(_glGetError.Addr(), 0, 0, 0, 0)
return gl.Enum(e) return Enum(e)
} }
func (c *Functions) GetRenderbufferParameteri(target, pname gl.Enum) int { func (c *Functions) GetRenderbufferParameteri(target, pname Enum) int {
p, _, _ := syscall.Syscall(_glGetRenderbufferParameteri.Addr(), 2, uintptr(target), uintptr(pname), 0) p, _, _ := syscall.Syscall(_glGetRenderbufferParameteri.Addr(), 2, uintptr(target), uintptr(pname), 0)
return int(p) return int(p)
} }
func (c *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname gl.Enum) int { func (c *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
p, _, _ := syscall.Syscall(_glGetFramebufferAttachmentParameteri.Addr(), 3, uintptr(target), uintptr(attachment), uintptr(pname)) p, _, _ := syscall.Syscall(_glGetFramebufferAttachmentParameteri.Addr(), 3, uintptr(target), uintptr(attachment), uintptr(pname))
return int(p) return int(p)
} }
func (c *Functions) GetInteger(pname gl.Enum) int { func (c *Functions) GetInteger(pname Enum) int {
syscall.Syscall(_glGetIntegerv.Addr(), 2, uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0])), 0) syscall.Syscall(_glGetIntegerv.Addr(), 2, uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0])), 0)
return int(c.int32s[0]) return int(c.int32s[0])
} }
func (c *Functions) GetProgrami(p gl.Program, pname gl.Enum) int { func (c *Functions) GetProgrami(p Program, pname Enum) int {
syscall.Syscall(_glGetProgramiv.Addr(), 3, uintptr(p.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0]))) syscall.Syscall(_glGetProgramiv.Addr(), 3, uintptr(p.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0])))
return int(c.int32s[0]) return int(c.int32s[0])
} }
func (c *Functions) GetProgramInfoLog(p gl.Program) string { func (c *Functions) GetProgramInfoLog(p Program) string {
n := c.GetProgrami(p, gl.INFO_LOG_LENGTH) n := c.GetProgrami(p, INFO_LOG_LENGTH)
buf := make([]byte, n) buf := make([]byte, n)
syscall.Syscall6(_glGetProgramInfoLog.Addr(), 4, uintptr(p.V), uintptr(len(buf)), 0, uintptr(unsafe.Pointer(&buf[0])), 0, 0) syscall.Syscall6(_glGetProgramInfoLog.Addr(), 4, uintptr(p.V), uintptr(len(buf)), 0, uintptr(unsafe.Pointer(&buf[0])), 0, 0)
return string(buf) return string(buf)
} }
func (c *Functions) GetQueryObjectuiv(query gl.Query, pname gl.Enum) uint { func (c *Functions) GetQueryObjectuiv(query Query, pname Enum) uint {
syscall.Syscall(_glGetQueryObjectuiv.Addr(), 3, uintptr(query.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0]))) syscall.Syscall(_glGetQueryObjectuiv.Addr(), 3, uintptr(query.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0])))
return uint(c.int32s[0]) return uint(c.int32s[0])
} }
func (c *Functions) GetShaderi(s gl.Shader, pname gl.Enum) int { func (c *Functions) GetShaderi(s Shader, pname Enum) int {
syscall.Syscall(_glGetShaderiv.Addr(), 3, uintptr(s.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0]))) syscall.Syscall(_glGetShaderiv.Addr(), 3, uintptr(s.V), uintptr(pname), uintptr(unsafe.Pointer(&c.int32s[0])))
return int(c.int32s[0]) return int(c.int32s[0])
} }
func (c *Functions) GetShaderInfoLog(s gl.Shader) string { func (c *Functions) GetShaderInfoLog(s Shader) string {
n := c.GetShaderi(s, gl.INFO_LOG_LENGTH) n := c.GetShaderi(s, INFO_LOG_LENGTH)
buf := make([]byte, n) buf := make([]byte, n)
syscall.Syscall6(_glGetShaderInfoLog.Addr(), 4, uintptr(s.V), uintptr(len(buf)), 0, uintptr(unsafe.Pointer(&buf[0])), 0, 0) syscall.Syscall6(_glGetShaderInfoLog.Addr(), 4, uintptr(s.V), uintptr(len(buf)), 0, uintptr(unsafe.Pointer(&buf[0])), 0, 0)
return string(buf) return string(buf)
} }
func (c *Functions) GetString(pname gl.Enum) string { func (c *Functions) GetString(pname Enum) string {
s, _, _ := syscall.Syscall(_glGetString.Addr(), 1, uintptr(pname), 0, 0) s, _, _ := syscall.Syscall(_glGetString.Addr(), 1, uintptr(pname), 0, 0)
return gunsafe.GoString(gunsafe.SliceOf(s)) return gunsafe.GoString(gunsafe.SliceOf(s))
} }
func (c *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { func (c *Functions) GetUniformLocation(p Program, name string) Uniform {
cname := cString(name) cname := cString(name)
c0 := &cname[0] c0 := &cname[0]
u, _, _ := syscall.Syscall(_glGetUniformLocation.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0) u, _, _ := syscall.Syscall(_glGetUniformLocation.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0)
issue34474KeepAlive(c0) issue34474KeepAlive(c0)
return gl.Uniform{int(u)} return Uniform{int(u)}
} }
func (c *Functions) InvalidateFramebuffer(target, attachment gl.Enum) { func (c *Functions) InvalidateFramebuffer(target, attachment Enum) {
addr := _glInvalidateFramebuffer.Addr() addr := _glInvalidateFramebuffer.Addr()
if addr == 0 { if addr == 0 {
// InvalidateFramebuffer is just a hint. Skip it if not supported. // InvalidateFramebuffer is just a hint. Skip it if not supported.
@@ -321,30 +329,30 @@ func (c *Functions) InvalidateFramebuffer(target, attachment gl.Enum) {
} }
syscall.Syscall(addr, 3, uintptr(target), 1, uintptr(unsafe.Pointer(&attachment))) syscall.Syscall(addr, 3, uintptr(target), 1, uintptr(unsafe.Pointer(&attachment)))
} }
func (c *Functions) LinkProgram(p gl.Program) { func (c *Functions) LinkProgram(p Program) {
syscall.Syscall(_glLinkProgram.Addr(), 1, uintptr(p.V), 0, 0) syscall.Syscall(_glLinkProgram.Addr(), 1, uintptr(p.V), 0, 0)
} }
func (c *Functions) PixelStorei(pname gl.Enum, param int32) { func (c *Functions) PixelStorei(pname Enum, param int32) {
syscall.Syscall(_glPixelStorei.Addr(), 2, uintptr(pname), uintptr(param), 0) syscall.Syscall(_glPixelStorei.Addr(), 2, uintptr(pname), uintptr(param), 0)
} }
func (f *Functions) ReadPixels(x, y, width, height int, format, ty gl.Enum, data []byte) { func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) {
d0 := &data[0] d0 := &data[0]
syscall.Syscall9(_glReadPixels.Addr(), 7, uintptr(x), uintptr(y), uintptr(width), uintptr(height), uintptr(format), uintptr(ty), uintptr(unsafe.Pointer(d0)), 0, 0) syscall.Syscall9(_glReadPixels.Addr(), 7, uintptr(x), uintptr(y), uintptr(width), uintptr(height), uintptr(format), uintptr(ty), uintptr(unsafe.Pointer(d0)), 0, 0)
issue34474KeepAlive(d0) issue34474KeepAlive(d0)
} }
func (c *Functions) RenderbufferStorage(target, internalformat gl.Enum, width, height int) { func (c *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) {
syscall.Syscall6(_glRenderbufferStorage.Addr(), 4, uintptr(target), uintptr(internalformat), uintptr(width), uintptr(height), 0, 0) syscall.Syscall6(_glRenderbufferStorage.Addr(), 4, uintptr(target), uintptr(internalformat), uintptr(width), uintptr(height), 0, 0)
} }
func (c *Functions) Scissor(x, y, width, height int32) { func (c *Functions) Scissor(x, y, width, height int32) {
syscall.Syscall6(_glScissor.Addr(), 4, uintptr(x), uintptr(y), uintptr(width), uintptr(height), 0, 0) syscall.Syscall6(_glScissor.Addr(), 4, uintptr(x), uintptr(y), uintptr(width), uintptr(height), 0, 0)
} }
func (c *Functions) ShaderSource(s gl.Shader, src string) { func (c *Functions) ShaderSource(s Shader, src string) {
var n uintptr = uintptr(len(src)) var n uintptr = uintptr(len(src))
psrc := &src psrc := &src
syscall.Syscall6(_glShaderSource.Addr(), 4, uintptr(s.V), 1, uintptr(unsafe.Pointer(psrc)), uintptr(unsafe.Pointer(&n)), 0, 0) syscall.Syscall6(_glShaderSource.Addr(), 4, uintptr(s.V), 1, uintptr(unsafe.Pointer(psrc)), uintptr(unsafe.Pointer(&n)), 0, 0)
issue34474KeepAlive(psrc) issue34474KeepAlive(psrc)
} }
func (c *Functions) TexImage2D(target gl.Enum, level int, internalFormat int, width, height int, format, ty gl.Enum, data []byte) { func (c *Functions) TexImage2D(target Enum, level int, internalFormat int, width, height int, format, ty Enum, data []byte) {
if len(data) == 0 { if len(data) == 0 {
syscall.Syscall9(_glTexImage2D.Addr(), 9, uintptr(target), uintptr(level), uintptr(internalFormat), uintptr(width), uintptr(height), 0, uintptr(format), uintptr(ty), 0) syscall.Syscall9(_glTexImage2D.Addr(), 9, uintptr(target), uintptr(level), uintptr(internalFormat), uintptr(width), uintptr(height), 0, uintptr(format), uintptr(ty), 0)
} else { } else {
@@ -353,36 +361,36 @@ func (c *Functions) TexImage2D(target gl.Enum, level int, internalFormat int, wi
issue34474KeepAlive(d0) issue34474KeepAlive(d0)
} }
} }
func (c *Functions) TexSubImage2D(target gl.Enum, level int, x, y, width, height int, format, ty gl.Enum, data []byte) { func (c *Functions) TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte) {
d0 := &data[0] d0 := &data[0]
syscall.Syscall9(_glTexSubImage2D.Addr(), 9, uintptr(target), uintptr(level), uintptr(x), uintptr(y), uintptr(width), uintptr(height), uintptr(format), uintptr(ty), uintptr(unsafe.Pointer(d0))) syscall.Syscall9(_glTexSubImage2D.Addr(), 9, uintptr(target), uintptr(level), uintptr(x), uintptr(y), uintptr(width), uintptr(height), uintptr(format), uintptr(ty), uintptr(unsafe.Pointer(d0)))
issue34474KeepAlive(d0) issue34474KeepAlive(d0)
} }
func (c *Functions) TexParameteri(target, pname gl.Enum, param int) { func (c *Functions) TexParameteri(target, pname Enum, param int) {
syscall.Syscall(_glTexParameteri.Addr(), 3, uintptr(target), uintptr(pname), uintptr(param)) syscall.Syscall(_glTexParameteri.Addr(), 3, uintptr(target), uintptr(pname), uintptr(param))
} }
func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) {
syscall.Syscall(_glUniformBlockBinding.Addr(), 3, uintptr(p.V), uintptr(uniformBlockIndex), uintptr(uniformBlockBinding)) syscall.Syscall(_glUniformBlockBinding.Addr(), 3, uintptr(p.V), uintptr(uniformBlockIndex), uintptr(uniformBlockBinding))
} }
func (c *Functions) Uniform1f(dst gl.Uniform, v float32) { func (c *Functions) Uniform1f(dst Uniform, v float32) {
syscall.Syscall(_glUniform1f.Addr(), 2, uintptr(dst.V), uintptr(math.Float32bits(v)), 0) syscall.Syscall(_glUniform1f.Addr(), 2, uintptr(dst.V), uintptr(math.Float32bits(v)), 0)
} }
func (c *Functions) Uniform1i(dst gl.Uniform, v int) { func (c *Functions) Uniform1i(dst Uniform, v int) {
syscall.Syscall(_glUniform1i.Addr(), 2, uintptr(dst.V), uintptr(v), 0) syscall.Syscall(_glUniform1i.Addr(), 2, uintptr(dst.V), uintptr(v), 0)
} }
func (c *Functions) Uniform2f(dst gl.Uniform, v0, v1 float32) { func (c *Functions) Uniform2f(dst Uniform, v0, v1 float32) {
syscall.Syscall(_glUniform2f.Addr(), 3, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1))) syscall.Syscall(_glUniform2f.Addr(), 3, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1)))
} }
func (c *Functions) Uniform3f(dst gl.Uniform, v0, v1, v2 float32) { func (c *Functions) Uniform3f(dst Uniform, v0, v1, v2 float32) {
syscall.Syscall6(_glUniform3f.Addr(), 4, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1)), uintptr(math.Float32bits(v2)), 0, 0) syscall.Syscall6(_glUniform3f.Addr(), 4, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1)), uintptr(math.Float32bits(v2)), 0, 0)
} }
func (c *Functions) Uniform4f(dst gl.Uniform, v0, v1, v2, v3 float32) { func (c *Functions) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) {
syscall.Syscall6(_glUniform4f.Addr(), 5, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1)), uintptr(math.Float32bits(v2)), uintptr(math.Float32bits(v3)), 0) syscall.Syscall6(_glUniform4f.Addr(), 5, uintptr(dst.V), uintptr(math.Float32bits(v0)), uintptr(math.Float32bits(v1)), uintptr(math.Float32bits(v2)), uintptr(math.Float32bits(v3)), 0)
} }
func (c *Functions) UseProgram(p gl.Program) { func (c *Functions) UseProgram(p Program) {
syscall.Syscall(_glUseProgram.Addr(), 1, uintptr(p.V), 0, 0) syscall.Syscall(_glUseProgram.Addr(), 1, uintptr(p.V), 0, 0)
} }
func (c *Functions) VertexAttribPointer(dst gl.Attrib, size int, ty gl.Enum, normalized bool, stride, offset int) { func (c *Functions) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) {
var norm uintptr var norm uintptr
if normalized { if normalized {
norm = 1 norm = 1
+4 -4
View File
@@ -1,6 +1,6 @@
// +build !js // +build !js
package gl package glimpl
type ( type (
Buffer struct{ V uint } Buffer struct{ V uint }
@@ -14,14 +14,14 @@ type (
Object struct{ V uint } Object struct{ V uint }
) )
func (u Uniform) valid() bool { func (u Uniform) Valid() bool {
return u.V != -1 return u.V != -1
} }
func (p Program) valid() bool { func (p Program) Valid() bool {
return p.V != 0 return p.V != 0
} }
func (s Shader) valid() bool { func (s Shader) Valid() bool {
return s.V != 0 return s.V != 0
} }
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: Unlicense OR MIT // SPDX-License-Identifier: Unlicense OR MIT
package gl package glimpl
import "syscall/js" import "syscall/js"
@@ -16,14 +16,14 @@ type (
Object js.Value Object js.Value
) )
func (p Program) valid() bool { func (p Program) Valid() bool {
return !js.Value(p).IsUndefined() && !js.Value(p).IsNull() return !js.Value(p).IsUndefined() && !js.Value(p).IsNull()
} }
func (s Shader) valid() bool { func (s Shader) Valid() bool {
return !js.Value(s).IsUndefined() && !js.Value(s).IsNull() return !js.Value(s).IsUndefined() && !js.Value(s).IsNull()
} }
func (u Uniform) valid() bool { func (u Uniform) Valid() bool {
return !js.Value(u).IsUndefined() && !js.Value(u).IsNull() return !js.Value(u).IsUndefined() && !js.Value(u).IsNull()
} }
+5 -5
View File
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: Unlicense OR MIT // SPDX-License-Identifier: Unlicense OR MIT
package gl package glimpl
import ( import (
"errors" "errors"
@@ -8,7 +8,7 @@ import (
"strings" "strings"
) )
func CreateProgram(ctx Functions, vsSrc, fsSrc string, attribs []string) (Program, error) { func CreateProgram(ctx *Functions, vsSrc, fsSrc string, attribs []string) (Program, error) {
vs, err := createShader(ctx, VERTEX_SHADER, vsSrc) vs, err := createShader(ctx, VERTEX_SHADER, vsSrc)
if err != nil { if err != nil {
return Program{}, err return Program{}, err
@@ -20,7 +20,7 @@ func CreateProgram(ctx Functions, vsSrc, fsSrc string, attribs []string) (Progra
} }
defer ctx.DeleteShader(fs) defer ctx.DeleteShader(fs)
prog := ctx.CreateProgram() prog := ctx.CreateProgram()
if !prog.valid() { if !prog.Valid() {
return Program{}, errors.New("glCreateProgram failed") return Program{}, errors.New("glCreateProgram failed")
} }
ctx.AttachShader(prog, vs) ctx.AttachShader(prog, vs)
@@ -37,9 +37,9 @@ func CreateProgram(ctx Functions, vsSrc, fsSrc string, attribs []string) (Progra
return prog, nil return prog, nil
} }
func createShader(ctx Functions, typ Enum, src string) (Shader, error) { func createShader(ctx *Functions, typ Enum, src string) (Shader, error) {
sh := ctx.CreateShader(typ) sh := ctx.CreateShader(typ)
if !sh.valid() { if !sh.Valid() {
return Shader{}, errors.New("glCreateShader failed") return Shader{}, errors.New("glCreateShader failed")
} }
ctx.ShaderSource(sh, src) ctx.ShaderSource(sh, src)