forked from joejulian/gio
internal/gl: [js] replace Call to Bind/Invoke
Before that patch, the Call function was used to call each JS function related to WebGL. The Call function contains strings, which is slow on most browsers. Now, it uses Bind on the initialization and re-use the same function, avoiding the usage of strings. Signed-off-by: Inkeliz <inkeliz@inkeliz.com>
This commit is contained in:
+272
-91
@@ -21,14 +21,188 @@ type Functions struct {
|
||||
int32Buf js.Value
|
||||
|
||||
isWebGL2 bool
|
||||
|
||||
_getExtension js.Value
|
||||
_activeTexture js.Value
|
||||
_attachShader js.Value
|
||||
_beginQuery js.Value
|
||||
_beginQueryEXT js.Value
|
||||
_bindAttribLocation js.Value
|
||||
_bindBuffer js.Value
|
||||
_bindBufferBase js.Value
|
||||
_bindFramebuffer js.Value
|
||||
_bindRenderbuffer js.Value
|
||||
_bindTexture js.Value
|
||||
_blendEquation js.Value
|
||||
_blendFunc js.Value
|
||||
_bufferData js.Value
|
||||
_bufferSubData js.Value
|
||||
_checkFramebufferStatus js.Value
|
||||
_clear js.Value
|
||||
_clearColor js.Value
|
||||
_clearDepth js.Value
|
||||
_compileShader js.Value
|
||||
_copyTexSubImage2D js.Value
|
||||
_createBuffer js.Value
|
||||
_createFramebuffer js.Value
|
||||
_createProgram js.Value
|
||||
_createQuery js.Value
|
||||
_createRenderbuffer js.Value
|
||||
_createShader js.Value
|
||||
_createTexture js.Value
|
||||
_deleteBuffer js.Value
|
||||
_deleteFramebuffer js.Value
|
||||
_deleteProgram js.Value
|
||||
_deleteQuery js.Value
|
||||
_deleteQueryEXT js.Value
|
||||
_deleteShader js.Value
|
||||
_deleteRenderbuffer js.Value
|
||||
_deleteTexture js.Value
|
||||
_depthFunc js.Value
|
||||
_depthMask js.Value
|
||||
_disableVertexAttribArray js.Value
|
||||
_disable js.Value
|
||||
_drawArrays js.Value
|
||||
_drawElements js.Value
|
||||
_enable js.Value
|
||||
_enableVertexAttribArray js.Value
|
||||
_endQuery js.Value
|
||||
_endQueryEXT js.Value
|
||||
_finish js.Value
|
||||
_flush js.Value
|
||||
_framebufferRenderbuffer js.Value
|
||||
_framebufferTexture2D js.Value
|
||||
_getRenderbufferParameteri js.Value
|
||||
_getFramebufferAttachmentParameter js.Value
|
||||
_getParameter js.Value
|
||||
_getIndexedParameter js.Value
|
||||
_getProgramParameter js.Value
|
||||
_getProgramInfoLog js.Value
|
||||
_getQueryParameter js.Value
|
||||
_getQueryObjectEXT js.Value
|
||||
_getShaderParameter js.Value
|
||||
_getShaderInfoLog js.Value
|
||||
_getSupportedExtensions js.Value
|
||||
_getUniformBlockIndex js.Value
|
||||
_getUniformLocation js.Value
|
||||
_getVertexAttrib js.Value
|
||||
_getVertexAttribOffset js.Value
|
||||
_invalidateFramebuffer js.Value
|
||||
_isEnabled js.Value
|
||||
_linkProgram js.Value
|
||||
_pixelStorei js.Value
|
||||
_renderbufferStorage js.Value
|
||||
_readPixels js.Value
|
||||
_scissor js.Value
|
||||
_shaderSource js.Value
|
||||
_texImage2D js.Value
|
||||
_texStorage2D js.Value
|
||||
_texSubImage2D js.Value
|
||||
_texParameteri js.Value
|
||||
_uniformBlockBinding js.Value
|
||||
_uniform1f js.Value
|
||||
_uniform1i js.Value
|
||||
_uniform2f js.Value
|
||||
_uniform3f js.Value
|
||||
_uniform4f js.Value
|
||||
_useProgram js.Value
|
||||
_vertexAttribPointer js.Value
|
||||
_viewport js.Value
|
||||
}
|
||||
|
||||
type Context js.Value
|
||||
|
||||
func NewFunctions(ctx Context, forceES bool) (*Functions, error) {
|
||||
webgl := js.Value(ctx)
|
||||
f := &Functions{
|
||||
Ctx: js.Value(ctx),
|
||||
uint8Array: js.Global().Get("Uint8Array"),
|
||||
Ctx: webgl,
|
||||
uint8Array: js.Global().Get("Uint8Array"),
|
||||
_getExtension: _bind(webgl, `getExtension`),
|
||||
_activeTexture: _bind(webgl, `activeTexture`),
|
||||
_attachShader: _bind(webgl, `attachShader`),
|
||||
_beginQuery: _bind(webgl, `beginQuery`),
|
||||
_beginQueryEXT: _bind(webgl, `beginQueryEXT`),
|
||||
_bindAttribLocation: _bind(webgl, `bindAttribLocation`),
|
||||
_bindBuffer: _bind(webgl, `bindBuffer`),
|
||||
_bindBufferBase: _bind(webgl, `bindBufferBase`),
|
||||
_bindFramebuffer: _bind(webgl, `bindFramebuffer`),
|
||||
_bindRenderbuffer: _bind(webgl, `bindRenderbuffer`),
|
||||
_bindTexture: _bind(webgl, `bindTexture`),
|
||||
_blendEquation: _bind(webgl, `blendEquation`),
|
||||
_blendFunc: _bind(webgl, `blendFunc`),
|
||||
_bufferData: _bind(webgl, `bufferData`),
|
||||
_bufferSubData: _bind(webgl, `bufferSubData`),
|
||||
_checkFramebufferStatus: _bind(webgl, `checkFramebufferStatus`),
|
||||
_clear: _bind(webgl, `clear`),
|
||||
_clearColor: _bind(webgl, `clearColor`),
|
||||
_clearDepth: _bind(webgl, `clearDepth`),
|
||||
_compileShader: _bind(webgl, `compileShader`),
|
||||
_copyTexSubImage2D: _bind(webgl, `copyTexSubImage2D`),
|
||||
_createBuffer: _bind(webgl, `createBuffer`),
|
||||
_createFramebuffer: _bind(webgl, `createFramebuffer`),
|
||||
_createProgram: _bind(webgl, `createProgram`),
|
||||
_createQuery: _bind(webgl, `createQuery`),
|
||||
_createRenderbuffer: _bind(webgl, `createRenderbuffer`),
|
||||
_createShader: _bind(webgl, `createShader`),
|
||||
_createTexture: _bind(webgl, `createTexture`),
|
||||
_deleteBuffer: _bind(webgl, `deleteBuffer`),
|
||||
_deleteFramebuffer: _bind(webgl, `deleteFramebuffer`),
|
||||
_deleteProgram: _bind(webgl, `deleteProgram`),
|
||||
_deleteQuery: _bind(webgl, `deleteQuery`),
|
||||
_deleteQueryEXT: _bind(webgl, `deleteQueryEXT`),
|
||||
_deleteShader: _bind(webgl, `deleteShader`),
|
||||
_deleteRenderbuffer: _bind(webgl, `deleteRenderbuffer`),
|
||||
_deleteTexture: _bind(webgl, `deleteTexture`),
|
||||
_depthFunc: _bind(webgl, `depthFunc`),
|
||||
_depthMask: _bind(webgl, `depthMask`),
|
||||
_disableVertexAttribArray: _bind(webgl, `disableVertexAttribArray`),
|
||||
_disable: _bind(webgl, `disable`),
|
||||
_drawArrays: _bind(webgl, `drawArrays`),
|
||||
_drawElements: _bind(webgl, `drawElements`),
|
||||
_enable: _bind(webgl, `enable`),
|
||||
_enableVertexAttribArray: _bind(webgl, `enableVertexAttribArray`),
|
||||
_endQuery: _bind(webgl, `endQuery`),
|
||||
_endQueryEXT: _bind(webgl, `endQueryEXT`),
|
||||
_finish: _bind(webgl, `finish`),
|
||||
_flush: _bind(webgl, `flush`),
|
||||
_framebufferRenderbuffer: _bind(webgl, `framebufferRenderbuffer`),
|
||||
_framebufferTexture2D: _bind(webgl, `framebufferTexture2D`),
|
||||
_getRenderbufferParameteri: _bind(webgl, `getRenderbufferParameteri`),
|
||||
_getFramebufferAttachmentParameter: _bind(webgl, `getFramebufferAttachmentParameter`),
|
||||
_getParameter: _bind(webgl, `getParameter`),
|
||||
_getIndexedParameter: _bind(webgl, `getIndexedParameter`),
|
||||
_getProgramParameter: _bind(webgl, `getProgramParameter`),
|
||||
_getProgramInfoLog: _bind(webgl, `getProgramInfoLog`),
|
||||
_getQueryParameter: _bind(webgl, `getQueryParameter`),
|
||||
_getQueryObjectEXT: _bind(webgl, `getQueryObjectEXT`),
|
||||
_getShaderParameter: _bind(webgl, `getShaderParameter`),
|
||||
_getShaderInfoLog: _bind(webgl, `getShaderInfoLog`),
|
||||
_getSupportedExtensions: _bind(webgl, `getSupportedExtensions`),
|
||||
_getUniformBlockIndex: _bind(webgl, `getUniformBlockIndex`),
|
||||
_getUniformLocation: _bind(webgl, `getUniformLocation`),
|
||||
_getVertexAttrib: _bind(webgl, `getVertexAttrib`),
|
||||
_getVertexAttribOffset: _bind(webgl, `getVertexAttribOffset`),
|
||||
_invalidateFramebuffer: _bind(webgl, `invalidateFramebuffer`),
|
||||
_isEnabled: _bind(webgl, `isEnabled`),
|
||||
_linkProgram: _bind(webgl, `linkProgram`),
|
||||
_pixelStorei: _bind(webgl, `pixelStorei`),
|
||||
_renderbufferStorage: _bind(webgl, `renderbufferStorage`),
|
||||
_readPixels: _bind(webgl, `readPixels`),
|
||||
_scissor: _bind(webgl, `scissor`),
|
||||
_shaderSource: _bind(webgl, `shaderSource`),
|
||||
_texImage2D: _bind(webgl, `texImage2D`),
|
||||
_texStorage2D: _bind(webgl, `texStorage2D`),
|
||||
_texSubImage2D: _bind(webgl, `texSubImage2D`),
|
||||
_texParameteri: _bind(webgl, `texParameteri`),
|
||||
_uniformBlockBinding: _bind(webgl, `uniformBlockBinding`),
|
||||
_uniform1f: _bind(webgl, `uniform1f`),
|
||||
_uniform1i: _bind(webgl, `uniform1i`),
|
||||
_uniform2f: _bind(webgl, `uniform2f`),
|
||||
_uniform3f: _bind(webgl, `uniform3f`),
|
||||
_uniform4f: _bind(webgl, `uniform4f`),
|
||||
_useProgram: _bind(webgl, `useProgram`),
|
||||
_vertexAttribPointer: _bind(webgl, `vertexAttribPointer`),
|
||||
_viewport: _bind(webgl, `viewport`),
|
||||
}
|
||||
if err := f.Init(); err != nil {
|
||||
return nil, err
|
||||
@@ -36,6 +210,13 @@ func NewFunctions(ctx Context, forceES bool) (*Functions, error) {
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func _bind(ctx js.Value, p string) js.Value {
|
||||
if o := ctx.Get(p); o.Truthy() {
|
||||
return o.Call("bind", ctx)
|
||||
}
|
||||
return js.Undefined()
|
||||
}
|
||||
|
||||
func (f *Functions) Init() error {
|
||||
webgl2Class := js.Global().Get("WebGL2RenderingContext")
|
||||
f.isWebGL2 = !webgl2Class.IsUndefined() && f.Ctx.InstanceOf(webgl2Class)
|
||||
@@ -58,39 +239,39 @@ func (f *Functions) Init() error {
|
||||
}
|
||||
|
||||
func (f *Functions) getExtension(name string) js.Value {
|
||||
return f.Ctx.Call("getExtension", name)
|
||||
return f._getExtension.Invoke(name)
|
||||
}
|
||||
|
||||
func (f *Functions) ActiveTexture(t Enum) {
|
||||
f.Ctx.Call("activeTexture", int(t))
|
||||
f._activeTexture.Invoke(int(t))
|
||||
}
|
||||
func (f *Functions) AttachShader(p Program, s Shader) {
|
||||
f.Ctx.Call("attachShader", js.Value(p), js.Value(s))
|
||||
f._attachShader.Invoke(js.Value(p), js.Value(s))
|
||||
}
|
||||
func (f *Functions) BeginQuery(target Enum, query Query) {
|
||||
if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
|
||||
f.Ctx.Call("beginQuery", int(target), js.Value(query))
|
||||
f._beginQuery.Invoke(int(target), js.Value(query))
|
||||
} else {
|
||||
f.EXT_disjoint_timer_query.Call("beginQueryEXT", int(target), js.Value(query))
|
||||
}
|
||||
}
|
||||
func (f *Functions) BindAttribLocation(p Program, a Attrib, name string) {
|
||||
f.Ctx.Call("bindAttribLocation", js.Value(p), int(a), name)
|
||||
f._bindAttribLocation.Invoke(js.Value(p), int(a), name)
|
||||
}
|
||||
func (f *Functions) BindBuffer(target Enum, b Buffer) {
|
||||
f.Ctx.Call("bindBuffer", int(target), js.Value(b))
|
||||
f._bindBuffer.Invoke(int(target), js.Value(b))
|
||||
}
|
||||
func (f *Functions) BindBufferBase(target Enum, index int, b Buffer) {
|
||||
f.Ctx.Call("bindBufferBase", int(target), index, js.Value(b))
|
||||
f._bindBufferBase.Invoke(int(target), index, js.Value(b))
|
||||
}
|
||||
func (f *Functions) BindFramebuffer(target Enum, fb Framebuffer) {
|
||||
f.Ctx.Call("bindFramebuffer", int(target), js.Value(fb))
|
||||
f._bindFramebuffer.Invoke(int(target), js.Value(fb))
|
||||
}
|
||||
func (f *Functions) BindRenderbuffer(target Enum, rb Renderbuffer) {
|
||||
f.Ctx.Call("bindRenderbuffer", int(target), js.Value(rb))
|
||||
f._bindRenderbuffer.Invoke(int(target), js.Value(rb))
|
||||
}
|
||||
func (f *Functions) BindTexture(target Enum, t Texture) {
|
||||
f.Ctx.Call("bindTexture", int(target), js.Value(t))
|
||||
f._bindTexture.Invoke(int(target), js.Value(t))
|
||||
}
|
||||
func (f *Functions) BindImageTexture(unit int, t Texture, level int, layered bool, layer int, access, format Enum) {
|
||||
panic("not implemented")
|
||||
@@ -99,163 +280,163 @@ func (f *Functions) BindVertexArray(a VertexArray) {
|
||||
panic("not supported")
|
||||
}
|
||||
func (f *Functions) BlendEquation(mode Enum) {
|
||||
f.Ctx.Call("blendEquation", int(mode))
|
||||
f._blendEquation.Invoke(int(mode))
|
||||
}
|
||||
func (f *Functions) BlendFuncSeparate(srcRGB, dstRGB, srcA, dstA Enum) {
|
||||
f.Ctx.Call("blendFunc", int(srcRGB), int(dstRGB), int(srcA), int(dstA))
|
||||
f._blendFunc.Invoke(int(srcRGB), int(dstRGB), int(srcA), int(dstA))
|
||||
}
|
||||
func (f *Functions) BufferData(target Enum, size int, usage Enum, data []byte) {
|
||||
if data == nil {
|
||||
f.Ctx.Call("bufferData", int(target), size, int(usage))
|
||||
f._bufferData.Invoke(int(target), size, int(usage))
|
||||
} else {
|
||||
if len(data) != size {
|
||||
panic("size mismatch")
|
||||
}
|
||||
f.Ctx.Call("bufferData", int(target), f.byteArrayOf(data), int(usage))
|
||||
f._bufferData.Invoke(int(target), f.byteArrayOf(data), int(usage))
|
||||
}
|
||||
}
|
||||
func (f *Functions) BufferSubData(target Enum, offset int, src []byte) {
|
||||
f.Ctx.Call("bufferSubData", int(target), offset, f.byteArrayOf(src))
|
||||
f._bufferSubData.Invoke(int(target), offset, f.byteArrayOf(src))
|
||||
}
|
||||
func (f *Functions) CheckFramebufferStatus(target Enum) Enum {
|
||||
return Enum(f.Ctx.Call("checkFramebufferStatus", int(target)).Int())
|
||||
return Enum(f._checkFramebufferStatus.Invoke(int(target)).Int())
|
||||
}
|
||||
func (f *Functions) Clear(mask Enum) {
|
||||
f.Ctx.Call("clear", int(mask))
|
||||
f._clear.Invoke(int(mask))
|
||||
}
|
||||
func (f *Functions) ClearColor(red, green, blue, alpha float32) {
|
||||
f.Ctx.Call("clearColor", red, green, blue, alpha)
|
||||
f._clearColor.Invoke(red, green, blue, alpha)
|
||||
}
|
||||
func (f *Functions) ClearDepthf(d float32) {
|
||||
f.Ctx.Call("clearDepth", d)
|
||||
f._clearDepth.Invoke(d)
|
||||
}
|
||||
func (f *Functions) CompileShader(s Shader) {
|
||||
f.Ctx.Call("compileShader", js.Value(s))
|
||||
f._compileShader.Invoke(js.Value(s))
|
||||
}
|
||||
func (f *Functions) CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) {
|
||||
f.Ctx.Call("copyTexSubImage2D", int(target), level, xoffset, yoffset, x, y, width, height)
|
||||
f._copyTexSubImage2D.Invoke(int(target), level, xoffset, yoffset, x, y, width, height)
|
||||
}
|
||||
func (f *Functions) CreateBuffer() Buffer {
|
||||
return Buffer(f.Ctx.Call("createBuffer"))
|
||||
return Buffer(f._createBuffer.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateFramebuffer() Framebuffer {
|
||||
return Framebuffer(f.Ctx.Call("createFramebuffer"))
|
||||
return Framebuffer(f._createFramebuffer.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateProgram() Program {
|
||||
return Program(f.Ctx.Call("createProgram"))
|
||||
return Program(f._createProgram.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateQuery() Query {
|
||||
return Query(f.Ctx.Call("createQuery"))
|
||||
return Query(f._createQuery.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateRenderbuffer() Renderbuffer {
|
||||
return Renderbuffer(f.Ctx.Call("createRenderbuffer"))
|
||||
return Renderbuffer(f._createRenderbuffer.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateShader(ty Enum) Shader {
|
||||
return Shader(f.Ctx.Call("createShader", int(ty)))
|
||||
return Shader(f._createShader.Invoke(int(ty)))
|
||||
}
|
||||
func (f *Functions) CreateTexture() Texture {
|
||||
return Texture(f.Ctx.Call("createTexture"))
|
||||
return Texture(f._createTexture.Invoke())
|
||||
}
|
||||
func (f *Functions) CreateVertexArray() VertexArray {
|
||||
panic("not supported")
|
||||
}
|
||||
func (f *Functions) DeleteBuffer(v Buffer) {
|
||||
f.Ctx.Call("deleteBuffer", js.Value(v))
|
||||
f._deleteBuffer.Invoke(js.Value(v))
|
||||
}
|
||||
func (f *Functions) DeleteFramebuffer(v Framebuffer) {
|
||||
f.Ctx.Call("deleteFramebuffer", js.Value(v))
|
||||
f._deleteFramebuffer.Invoke(js.Value(v))
|
||||
}
|
||||
func (f *Functions) DeleteProgram(p Program) {
|
||||
f.Ctx.Call("deleteProgram", js.Value(p))
|
||||
f._deleteProgram.Invoke(js.Value(p))
|
||||
}
|
||||
func (f *Functions) DeleteQuery(query Query) {
|
||||
if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
|
||||
f.Ctx.Call("deleteQuery", js.Value(query))
|
||||
f._deleteQuery.Invoke(js.Value(query))
|
||||
} else {
|
||||
f.EXT_disjoint_timer_query.Call("deleteQueryEXT", js.Value(query))
|
||||
}
|
||||
}
|
||||
func (f *Functions) DeleteShader(s Shader) {
|
||||
f.Ctx.Call("deleteShader", js.Value(s))
|
||||
f._deleteShader.Invoke(js.Value(s))
|
||||
}
|
||||
func (f *Functions) DeleteRenderbuffer(v Renderbuffer) {
|
||||
f.Ctx.Call("deleteRenderbuffer", js.Value(v))
|
||||
f._deleteRenderbuffer.Invoke(js.Value(v))
|
||||
}
|
||||
func (f *Functions) DeleteTexture(v Texture) {
|
||||
f.Ctx.Call("deleteTexture", js.Value(v))
|
||||
f._deleteTexture.Invoke(js.Value(v))
|
||||
}
|
||||
func (f *Functions) DeleteVertexArray(a VertexArray) {
|
||||
panic("not implemented")
|
||||
}
|
||||
func (f *Functions) DepthFunc(fn Enum) {
|
||||
f.Ctx.Call("depthFunc", int(fn))
|
||||
f._depthFunc.Invoke(int(fn))
|
||||
}
|
||||
func (f *Functions) DepthMask(mask bool) {
|
||||
f.Ctx.Call("depthMask", mask)
|
||||
f._depthMask.Invoke(mask)
|
||||
}
|
||||
func (f *Functions) DisableVertexAttribArray(a Attrib) {
|
||||
f.Ctx.Call("disableVertexAttribArray", int(a))
|
||||
f._disableVertexAttribArray.Invoke(int(a))
|
||||
}
|
||||
func (f *Functions) Disable(cap Enum) {
|
||||
f.Ctx.Call("disable", int(cap))
|
||||
f._disable.Invoke(int(cap))
|
||||
}
|
||||
func (f *Functions) DrawArrays(mode Enum, first, count int) {
|
||||
f.Ctx.Call("drawArrays", int(mode), first, count)
|
||||
f._drawArrays.Invoke(int(mode), first, count)
|
||||
}
|
||||
func (f *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) {
|
||||
f.Ctx.Call("drawElements", int(mode), count, int(ty), offset)
|
||||
f._drawElements.Invoke(int(mode), count, int(ty), offset)
|
||||
}
|
||||
func (f *Functions) DispatchCompute(x, y, z int) {
|
||||
panic("not implemented")
|
||||
}
|
||||
func (f *Functions) Enable(cap Enum) {
|
||||
f.Ctx.Call("enable", int(cap))
|
||||
f._enable.Invoke(int(cap))
|
||||
}
|
||||
func (f *Functions) EnableVertexAttribArray(a Attrib) {
|
||||
f.Ctx.Call("enableVertexAttribArray", int(a))
|
||||
f._enableVertexAttribArray.Invoke(int(a))
|
||||
}
|
||||
func (f *Functions) EndQuery(target Enum) {
|
||||
if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
|
||||
f.Ctx.Call("endQuery", int(target))
|
||||
f._endQuery.Invoke(int(target))
|
||||
} else {
|
||||
f.EXT_disjoint_timer_query.Call("endQueryEXT", int(target))
|
||||
}
|
||||
}
|
||||
func (f *Functions) Finish() {
|
||||
f.Ctx.Call("finish")
|
||||
f._finish.Invoke()
|
||||
}
|
||||
func (f *Functions) Flush() {
|
||||
f.Ctx.Call("flush")
|
||||
f._flush.Invoke()
|
||||
}
|
||||
func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) {
|
||||
f.Ctx.Call("framebufferRenderbuffer", int(target), int(attachment), int(renderbuffertarget), js.Value(renderbuffer))
|
||||
f._framebufferRenderbuffer.Invoke(int(target), int(attachment), int(renderbuffertarget), js.Value(renderbuffer))
|
||||
}
|
||||
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._framebufferTexture2D.Invoke(int(target), int(attachment), int(texTarget), js.Value(t), level)
|
||||
}
|
||||
func (f *Functions) GetError() Enum {
|
||||
// Avoid slow getError calls. See gio#179.
|
||||
return 0
|
||||
}
|
||||
func (f *Functions) GetRenderbufferParameteri(target, pname Enum) int {
|
||||
return paramVal(f.Ctx.Call("getRenderbufferParameteri", int(pname)))
|
||||
return paramVal(f._getRenderbufferParameteri.Invoke(int(pname)))
|
||||
}
|
||||
func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
|
||||
if !f.isWebGL2 && pname == FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING {
|
||||
// FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING is only available on WebGL 2
|
||||
return LINEAR
|
||||
}
|
||||
return paramVal(f.Ctx.Call("getFramebufferAttachmentParameter", int(target), int(attachment), int(pname)))
|
||||
return paramVal(f._getFramebufferAttachmentParameter.Invoke(int(target), int(attachment), int(pname)))
|
||||
}
|
||||
func (f *Functions) GetBinding(pname Enum) Object {
|
||||
obj := f.Ctx.Call("getParameter", int(pname))
|
||||
obj := f._getParameter.Invoke(int(pname))
|
||||
if !obj.Truthy() {
|
||||
return Object{}
|
||||
}
|
||||
return Object(obj)
|
||||
}
|
||||
func (f *Functions) GetBindingi(pname Enum, idx int) Object {
|
||||
obj := f.Ctx.Call("getIndexedParameter", int(pname), idx)
|
||||
obj := f._getIndexedParameter.Invoke(int(pname), idx)
|
||||
if !obj.Truthy() {
|
||||
return Object{}
|
||||
}
|
||||
@@ -268,13 +449,13 @@ func (f *Functions) GetInteger(pname Enum) int {
|
||||
return 0 // PACK_ROW_LENGTH and UNPACK_ROW_LENGTH is only available on WebGL 2
|
||||
}
|
||||
}
|
||||
return paramVal(f.Ctx.Call("getParameter", int(pname)))
|
||||
return paramVal(f._getParameter.Invoke(int(pname)))
|
||||
}
|
||||
func (f *Functions) GetFloat(pname Enum) float32 {
|
||||
return float32(f.Ctx.Call("getParameter", int(pname)).Float())
|
||||
return float32(f._getParameter.Invoke(int(pname)).Float())
|
||||
}
|
||||
func (f *Functions) GetInteger4(pname Enum) [4]int {
|
||||
arr := f.Ctx.Call("getParameter", int(pname))
|
||||
arr := f._getParameter.Invoke(int(pname))
|
||||
var res [4]int
|
||||
for i := range res {
|
||||
res[i] = arr.Index(i).Int()
|
||||
@@ -282,7 +463,7 @@ func (f *Functions) GetInteger4(pname Enum) [4]int {
|
||||
return res
|
||||
}
|
||||
func (f *Functions) GetFloat4(pname Enum) [4]float32 {
|
||||
arr := f.Ctx.Call("getParameter", int(pname))
|
||||
arr := f._getParameter.Invoke(int(pname))
|
||||
var res [4]float32
|
||||
for i := range res {
|
||||
res[i] = float32(arr.Index(i).Float())
|
||||
@@ -290,55 +471,55 @@ func (f *Functions) GetFloat4(pname Enum) [4]float32 {
|
||||
return res
|
||||
}
|
||||
func (f *Functions) GetProgrami(p Program, pname Enum) int {
|
||||
return paramVal(f.Ctx.Call("getProgramParameter", js.Value(p), int(pname)))
|
||||
return paramVal(f._getProgramParameter.Invoke(js.Value(p), int(pname)))
|
||||
}
|
||||
func (f *Functions) GetProgramInfoLog(p Program) string {
|
||||
return f.Ctx.Call("getProgramInfoLog", js.Value(p)).String()
|
||||
return f._getProgramInfoLog.Invoke(js.Value(p)).String()
|
||||
}
|
||||
func (f *Functions) GetQueryObjectuiv(query Query, pname Enum) uint {
|
||||
if !f.EXT_disjoint_timer_query_webgl2.IsNull() {
|
||||
return uint(paramVal(f.Ctx.Call("getQueryParameter", js.Value(query), int(pname))))
|
||||
return uint(paramVal(f._getQueryParameter.Invoke(js.Value(query), int(pname))))
|
||||
} else {
|
||||
return uint(paramVal(f.EXT_disjoint_timer_query.Call("getQueryObjectEXT", js.Value(query), int(pname))))
|
||||
}
|
||||
}
|
||||
func (f *Functions) GetShaderi(s Shader, pname Enum) int {
|
||||
return paramVal(f.Ctx.Call("getShaderParameter", js.Value(s), int(pname)))
|
||||
return paramVal(f._getShaderParameter.Invoke(js.Value(s), int(pname)))
|
||||
}
|
||||
func (f *Functions) GetShaderInfoLog(s Shader) string {
|
||||
return f.Ctx.Call("getShaderInfoLog", js.Value(s)).String()
|
||||
return f._getShaderInfoLog.Invoke(js.Value(s)).String()
|
||||
}
|
||||
func (f *Functions) GetString(pname Enum) string {
|
||||
switch pname {
|
||||
case EXTENSIONS:
|
||||
extsjs := f.Ctx.Call("getSupportedExtensions")
|
||||
extsjs := f._getSupportedExtensions.Invoke()
|
||||
var exts []string
|
||||
for i := 0; i < extsjs.Length(); i++ {
|
||||
exts = append(exts, "GL_"+extsjs.Index(i).String())
|
||||
}
|
||||
return strings.Join(exts, " ")
|
||||
default:
|
||||
return f.Ctx.Call("getParameter", int(pname)).String()
|
||||
return f._getParameter.Invoke(int(pname)).String()
|
||||
}
|
||||
}
|
||||
func (f *Functions) GetUniformBlockIndex(p Program, name string) uint {
|
||||
return uint(paramVal(f.Ctx.Call("getUniformBlockIndex", js.Value(p), name)))
|
||||
return uint(paramVal(f._getUniformBlockIndex.Invoke(js.Value(p), name)))
|
||||
}
|
||||
func (f *Functions) GetUniformLocation(p Program, name string) Uniform {
|
||||
return Uniform(f.Ctx.Call("getUniformLocation", js.Value(p), name))
|
||||
return Uniform(f._getUniformLocation.Invoke(js.Value(p), name))
|
||||
}
|
||||
func (f *Functions) GetVertexAttrib(index int, pname Enum) int {
|
||||
return paramVal(f.Ctx.Call("getVertexAttrib", index, int(pname)))
|
||||
return paramVal(f._getVertexAttrib.Invoke(index, int(pname)))
|
||||
}
|
||||
func (f *Functions) GetVertexAttribBinding(index int, pname Enum) Object {
|
||||
obj := f.Ctx.Call("getVertexAttrib", index, int(pname))
|
||||
obj := f._getVertexAttrib.Invoke(index, int(pname))
|
||||
if !obj.Truthy() {
|
||||
return Object{}
|
||||
}
|
||||
return Object(obj)
|
||||
}
|
||||
func (f *Functions) GetVertexAttribPointer(index int, pname Enum) uintptr {
|
||||
return uintptr(f.Ctx.Call("getVertexAttribOffset", index, int(pname)).Int())
|
||||
return uintptr(f._getVertexAttribOffset.Invoke(index, int(pname)).Int())
|
||||
}
|
||||
func (f *Functions) InvalidateFramebuffer(target, attachment Enum) {
|
||||
fn := f.Ctx.Get("invalidateFramebuffer")
|
||||
@@ -347,17 +528,17 @@ func (f *Functions) InvalidateFramebuffer(target, attachment Enum) {
|
||||
f.int32Buf = js.Global().Get("Int32Array").New(1)
|
||||
}
|
||||
f.int32Buf.SetIndex(0, int32(attachment))
|
||||
f.Ctx.Call("invalidateFramebuffer", int(target), f.int32Buf)
|
||||
f._invalidateFramebuffer.Invoke(int(target), f.int32Buf)
|
||||
}
|
||||
}
|
||||
func (f *Functions) IsEnabled(cap Enum) bool {
|
||||
return f.Ctx.Call("isEnabled", int(cap)).Truthy()
|
||||
return f._isEnabled.Invoke(int(cap)).Truthy()
|
||||
}
|
||||
func (f *Functions) LinkProgram(p Program) {
|
||||
f.Ctx.Call("linkProgram", js.Value(p))
|
||||
f._linkProgram.Invoke(js.Value(p))
|
||||
}
|
||||
func (f *Functions) PixelStorei(pname Enum, param int) {
|
||||
f.Ctx.Call("pixelStorei", int(pname), param)
|
||||
f._pixelStorei.Invoke(int(pname), param)
|
||||
}
|
||||
func (f *Functions) MemoryBarrier(barriers Enum) {
|
||||
panic("not implemented")
|
||||
@@ -366,60 +547,60 @@ func (f *Functions) MapBufferRange(target Enum, offset, length int, access Enum)
|
||||
panic("not implemented")
|
||||
}
|
||||
func (f *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) {
|
||||
f.Ctx.Call("renderbufferStorage", int(target), int(internalformat), width, height)
|
||||
f._renderbufferStorage.Invoke(int(target), int(internalformat), width, height)
|
||||
}
|
||||
func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) {
|
||||
ba := f.byteArrayOf(data)
|
||||
f.Ctx.Call("readPixels", x, y, width, height, int(format), int(ty), ba)
|
||||
f._readPixels.Invoke(x, y, width, height, int(format), int(ty), ba)
|
||||
js.CopyBytesToGo(data, ba)
|
||||
}
|
||||
func (f *Functions) Scissor(x, y, width, height int32) {
|
||||
f.Ctx.Call("scissor", x, y, width, height)
|
||||
f._scissor.Invoke(x, y, width, height)
|
||||
}
|
||||
func (f *Functions) ShaderSource(s Shader, src string) {
|
||||
f.Ctx.Call("shaderSource", js.Value(s), src)
|
||||
f._shaderSource.Invoke(js.Value(s), src)
|
||||
}
|
||||
func (f *Functions) TexImage2D(target Enum, level int, internalFormat Enum, width, height int, format, ty Enum) {
|
||||
f.Ctx.Call("texImage2D", int(target), int(level), int(internalFormat), int(width), int(height), 0, int(format), int(ty), nil)
|
||||
f._texImage2D.Invoke(int(target), int(level), int(internalFormat), int(width), int(height), 0, int(format), int(ty), nil)
|
||||
}
|
||||
func (f *Functions) TexStorage2D(target Enum, levels int, internalFormat Enum, width, height int) {
|
||||
f.Ctx.Call("texStorage2D", int(target), levels, int(internalFormat), width, height)
|
||||
f._texStorage2D.Invoke(int(target), levels, int(internalFormat), width, height)
|
||||
}
|
||||
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._texSubImage2D.Invoke(int(target), level, x, y, width, height, int(format), int(ty), f.byteArrayOf(data))
|
||||
}
|
||||
func (f *Functions) TexParameteri(target, pname Enum, param int) {
|
||||
f.Ctx.Call("texParameteri", int(target), int(pname), int(param))
|
||||
f._texParameteri.Invoke(int(target), int(pname), int(param))
|
||||
}
|
||||
func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) {
|
||||
f.Ctx.Call("uniformBlockBinding", js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding))
|
||||
f._uniformBlockBinding.Invoke(js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding))
|
||||
}
|
||||
func (f *Functions) Uniform1f(dst Uniform, v float32) {
|
||||
f.Ctx.Call("uniform1f", js.Value(dst), v)
|
||||
f._uniform1f.Invoke(js.Value(dst), v)
|
||||
}
|
||||
func (f *Functions) Uniform1i(dst Uniform, v int) {
|
||||
f.Ctx.Call("uniform1i", js.Value(dst), v)
|
||||
f._uniform1i.Invoke(js.Value(dst), v)
|
||||
}
|
||||
func (f *Functions) Uniform2f(dst Uniform, v0, v1 float32) {
|
||||
f.Ctx.Call("uniform2f", js.Value(dst), v0, v1)
|
||||
f._uniform2f.Invoke(js.Value(dst), v0, v1)
|
||||
}
|
||||
func (f *Functions) Uniform3f(dst Uniform, v0, v1, v2 float32) {
|
||||
f.Ctx.Call("uniform3f", js.Value(dst), v0, v1, v2)
|
||||
f._uniform3f.Invoke(js.Value(dst), v0, v1, v2)
|
||||
}
|
||||
func (f *Functions) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) {
|
||||
f.Ctx.Call("uniform4f", js.Value(dst), v0, v1, v2, v3)
|
||||
f._uniform4f.Invoke(js.Value(dst), v0, v1, v2, v3)
|
||||
}
|
||||
func (f *Functions) UseProgram(p Program) {
|
||||
f.Ctx.Call("useProgram", js.Value(p))
|
||||
f._useProgram.Invoke(js.Value(p))
|
||||
}
|
||||
func (f *Functions) UnmapBuffer(target Enum) bool {
|
||||
panic("not implemented")
|
||||
}
|
||||
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._vertexAttribPointer.Invoke(int(dst), size, int(ty), normalized, stride, offset)
|
||||
}
|
||||
func (f *Functions) Viewport(x, y, width, height int) {
|
||||
f.Ctx.Call("viewport", x, y, width, height)
|
||||
f._viewport.Invoke(x, y, width, height)
|
||||
}
|
||||
|
||||
func (f *Functions) byteArrayOf(data []byte) js.Value {
|
||||
|
||||
Reference in New Issue
Block a user