From baf7d943e5d50debf354d4cd5f951d442d4d9b4e Mon Sep 17 00:00:00 2001 From: Inkeliz Date: Mon, 21 Feb 2022 09:11:51 +0000 Subject: [PATCH] app,internal/gl: replace syscall/js to inkwasm Signed-off-by: Inkeliz --- app/gl_js.go | 17 +- go.mod | 2 +- go.sum | 38 +- internal/gl/gl_js.go | 858 ++++++++++++++++++++++------------------ internal/gl/types_js.go | 10 +- 5 files changed, 536 insertions(+), 389 deletions(-) diff --git a/app/gl_js.go b/app/gl_js.go index e3aee8d71..84ae1fe39 100644 --- a/app/gl_js.go +++ b/app/gl_js.go @@ -4,6 +4,7 @@ package app import ( "errors" + "github.com/inkeliz/go_inkwasm/inkwasm" "syscall/js" "gioui.org/gpu" @@ -11,8 +12,9 @@ import ( ) type glContext struct { - ctx js.Value - cnv js.Value + ctx js.Value + cnv js.Value + ictx inkwasm.Object } func newContext(w *window) (*glContext, error) { @@ -30,8 +32,9 @@ func newContext(w *window) (*glContext, error) { return nil, errors.New("app: webgl is not supported") } c := &glContext{ - ctx: ctx, - cnv: w.cnv, + ctx: ctx, + cnv: w.cnv, + ictx: inkwasm.NewObjectFromSyscall(ctx), } return c, nil } @@ -45,15 +48,19 @@ func (c *glContext) API() gpu.API { } func (c *glContext) Release() { + c.ictx.Free() } func (c *glContext) Present() error { - if c.ctx.Call("isContextLost").Bool() { + if isContextLost(c.ictx) { return errors.New("context lost") } return nil } +//inkwasm:func .isContextLost +func isContextLost(o inkwasm.Object) bool + func (c *glContext) Lock() error { return nil } diff --git a/go.mod b/go.mod index c1422ebc8..afad1bbae 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( golang.org/x/exp v0.0.0-20210722180016-6781d3edade3 golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c + golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 ) require ( diff --git a/go.sum b/go.sum index c96d3014a..783e597dc 100644 --- a/go.sum +++ b/go.sum @@ -34,6 +34,12 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chromedp/cdproto v0.0.0-20220131204822-e6abebe7b8cd h1:Ndx98cm/oI1Vwe1daFUDfkLHQ1NNvV1FWqVl7vDnGd8= +github.com/chromedp/cdproto v0.0.0-20220131204822-e6abebe7b8cd/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= +github.com/chromedp/chromedp v0.7.7 h1:kRN7G7v4cGpTV2Nth218YR2VOsbpHBN3qClYCb6CBnI= +github.com/chromedp/chromedp v0.7.7/go.mod h1:cqexhZWjEbF8/cETF57b5dQ3rqrY6q71HcfYQ5oAy3k= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -70,6 +76,12 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -125,6 +137,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -140,6 +154,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -180,6 +196,7 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/orisano/pixelmatch v0.0.0-20210112091706-4fa4c7ba91d5/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= @@ -241,6 +258,7 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -291,6 +309,8 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -308,6 +328,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -317,6 +338,8 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -334,14 +357,20 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -361,9 +390,12 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= diff --git a/internal/gl/gl_js.go b/internal/gl/gl_js.go index c2571fc9b..931f3f641 100644 --- a/internal/gl/gl_js.go +++ b/internal/gl/gl_js.go @@ -4,444 +4,296 @@ package gl import ( "errors" + "github.com/inkeliz/go_inkwasm/inkwasm" "strings" "syscall/js" ) type Functions struct { - Ctx js.Value - EXT_disjoint_timer_query js.Value - EXT_disjoint_timer_query_webgl2 js.Value - - // Cached reference to the Uint8Array JS type. - uint8Array js.Value - - // Cached JS arrays. - arrayBuf js.Value - int32Buf js.Value + Ctx inkwasm.Object + EXT_disjoint_timer_query inkwasm.Object + EXT_disjoint_timer_query_webgl2 inkwasm.Object 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: 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`), - } + f := &Functions{Ctx: inkwasm.NewObjectFromSyscall(js.Value(ctx))} if err := f.Init(); err != nil { return nil, err } 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) + webgl2Class := inkwasm.Global().GetProperty("WebGL2RenderingContext") + defer webgl2Class.Free() + + f.isWebGL2 = webgl2Class.Truthy() && f.Ctx.InstanceOf(webgl2Class) if !f.isWebGL2 { f.EXT_disjoint_timer_query = f.getExtension("EXT_disjoint_timer_query") - if f.getExtension("OES_texture_half_float").IsNull() && f.getExtension("OES_texture_float").IsNull() { + if !f.getExtension("OES_texture_half_float").Truthy() && !f.getExtension("OES_texture_float").Truthy() { return errors.New("gl: no support for neither OES_texture_half_float nor OES_texture_float") } - if f.getExtension("EXT_sRGB").IsNull() { + if !f.getExtension("EXT_sRGB").Truthy() { return errors.New("gl: EXT_sRGB not supported") } } else { // WebGL2 extensions. f.EXT_disjoint_timer_query_webgl2 = f.getExtension("EXT_disjoint_timer_query_webgl2") - if f.getExtension("EXT_color_buffer_half_float").IsNull() && f.getExtension("EXT_color_buffer_float").IsNull() { + if !f.getExtension("EXT_color_buffer_half_float").Truthy() && !f.getExtension("EXT_color_buffer_float").Truthy() { return errors.New("gl: no support for neither EXT_color_buffer_half_float nor EXT_color_buffer_float") } } return nil } -func (f *Functions) getExtension(name string) js.Value { - return f._getExtension.Invoke(name) +func (f *Functions) getExtension(s string) inkwasm.Object { + return asmGetExtension(f.Ctx, s) } func (f *Functions) ActiveTexture(t Enum) { - f._activeTexture.Invoke(int(t)) + asmActiveTexture(f.Ctx, uint(t)) } + func (f *Functions) AttachShader(p Program, s Shader) { - f._attachShader.Invoke(js.Value(p), js.Value(s)) + asmAttachShader(f.Ctx, inkwasm.Object(p), inkwasm.Object(s)) } + func (f *Functions) BeginQuery(target Enum, query Query) { - if !f.EXT_disjoint_timer_query_webgl2.IsNull() { - f._beginQuery.Invoke(int(target), js.Value(query)) - } else { - f.EXT_disjoint_timer_query.Call("beginQueryEXT", int(target), js.Value(query)) - } + asmBeginQuery(f.Ctx, uint(target), inkwasm.Object(query)) } + func (f *Functions) BindAttribLocation(p Program, a Attrib, name string) { - f._bindAttribLocation.Invoke(js.Value(p), int(a), name) + asmBindAttribLocation(f.Ctx, inkwasm.Object(p), uint(a), name) } + func (f *Functions) BindBuffer(target Enum, b Buffer) { - f._bindBuffer.Invoke(int(target), js.Value(b)) + asmBindBuffer(f.Ctx, uint(target), inkwasm.Object(b)) } + func (f *Functions) BindBufferBase(target Enum, index int, b Buffer) { - f._bindBufferBase.Invoke(int(target), index, js.Value(b)) + asmBindBufferBase(f.Ctx, uint(target), index, inkwasm.Object(b)) } + func (f *Functions) BindFramebuffer(target Enum, fb Framebuffer) { - f._bindFramebuffer.Invoke(int(target), js.Value(fb)) + asmBindFramebuffer(f.Ctx, uint(target), inkwasm.Object(fb)) } + func (f *Functions) BindRenderbuffer(target Enum, rb Renderbuffer) { - f._bindRenderbuffer.Invoke(int(target), js.Value(rb)) + asmBindRenderbuffer(f.Ctx, uint(target), inkwasm.Object(rb)) } + func (f *Functions) BindTexture(target Enum, t Texture) { - f._bindTexture.Invoke(int(target), js.Value(t)) + asmBindTexture(f.Ctx, uint(target), inkwasm.Object(t)) } + func (f *Functions) BindImageTexture(unit int, t Texture, level int, layered bool, layer int, access, format Enum) { panic("not implemented") } + func (f *Functions) BindVertexArray(a VertexArray) { - panic("not supported") + panic("not implemented") } + func (f *Functions) BlendEquation(mode Enum) { - f._blendEquation.Invoke(int(mode)) + asmBlendEquation(f.Ctx, uint(mode)) } + func (f *Functions) BlendFuncSeparate(srcRGB, dstRGB, srcA, dstA Enum) { - f._blendFunc.Invoke(int(srcRGB), int(dstRGB), int(srcA), int(dstA)) + asmBlendFuncSeparate(f.Ctx, uint(srcRGB), uint(dstRGB), uint(srcA), uint(dstA)) } + func (f *Functions) BufferData(target Enum, size int, usage Enum, data []byte) { if data == nil { - f._bufferData.Invoke(int(target), size, int(usage)) + asmBufferDataSize(f.Ctx, uint(target), size, uint(usage)) } else { - if len(data) != size { - panic("size mismatch") - } - f._bufferData.Invoke(int(target), f.byteArrayOf(data), int(usage)) + asmBufferData(f.Ctx, uint(target), data, uint(usage)) } } + func (f *Functions) BufferSubData(target Enum, offset int, src []byte) { - f._bufferSubData.Invoke(int(target), offset, f.byteArrayOf(src)) + asmBufferSubData(f.Ctx, uint(target), offset, src) } + func (f *Functions) CheckFramebufferStatus(target Enum) Enum { - return Enum(f._checkFramebufferStatus.Invoke(int(target)).Int()) + return Enum(asmCheckFramebufferStatus(f.Ctx, uint(target))) } + func (f *Functions) Clear(mask Enum) { - f._clear.Invoke(int(mask)) + asmClear(f.Ctx, uint(mask)) } + func (f *Functions) ClearColor(red, green, blue, alpha float32) { - f._clearColor.Invoke(red, green, blue, alpha) + asmClearColor(f.Ctx, float64(red), float64(green), float64(blue), float64(alpha)) } + func (f *Functions) ClearDepthf(d float32) { - f._clearDepth.Invoke(d) + asmClearDepthf(f.Ctx, float64(d)) } + func (f *Functions) CompileShader(s Shader) { - f._compileShader.Invoke(js.Value(s)) + asmCompileShader(f.Ctx, inkwasm.Object(s)) } + func (f *Functions) CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) { - f._copyTexSubImage2D.Invoke(int(target), level, xoffset, yoffset, x, y, width, height) + asmCopyTexSubImage2D(f.Ctx, uint(target), level, xoffset, yoffset, x, y, width, height) } + func (f *Functions) CreateBuffer() Buffer { - return Buffer(f._createBuffer.Invoke()) + return Buffer(asmCreateBuffer(f.Ctx)) } + func (f *Functions) CreateFramebuffer() Framebuffer { - return Framebuffer(f._createFramebuffer.Invoke()) + return Framebuffer(asmCreateFramebuffer(f.Ctx)) } + func (f *Functions) CreateProgram() Program { - return Program(f._createProgram.Invoke()) + return Program(asmCreateProgram(f.Ctx)) } + func (f *Functions) CreateQuery() Query { - return Query(f._createQuery.Invoke()) + return Query(asmCreateQuery(f.Ctx)) } + func (f *Functions) CreateRenderbuffer() Renderbuffer { - return Renderbuffer(f._createRenderbuffer.Invoke()) + return Renderbuffer(asmCreateRenderbuffer(f.Ctx)) } + func (f *Functions) CreateShader(ty Enum) Shader { - return Shader(f._createShader.Invoke(int(ty))) + return Shader(asmCreateShader(f.Ctx, uint(ty))) } + func (f *Functions) CreateTexture() Texture { - return Texture(f._createTexture.Invoke()) + return Texture(asmCreateTexture(f.Ctx)) } + func (f *Functions) CreateVertexArray() VertexArray { - panic("not supported") + panic("not implemented") } + func (f *Functions) DeleteBuffer(v Buffer) { - f._deleteBuffer.Invoke(js.Value(v)) + asmDeleteBuffer(f.Ctx, inkwasm.Object(v)) + inkwasm.Object(v).Free() } + func (f *Functions) DeleteFramebuffer(v Framebuffer) { - f._deleteFramebuffer.Invoke(js.Value(v)) + asmDeleteFramebuffer(f.Ctx, inkwasm.Object(v)) + inkwasm.Object(v).Free() } + func (f *Functions) DeleteProgram(p Program) { - f._deleteProgram.Invoke(js.Value(p)) + asmDeleteProgram(f.Ctx, inkwasm.Object(p)) + inkwasm.Object(p).Free() } + func (f *Functions) DeleteQuery(query Query) { - if !f.EXT_disjoint_timer_query_webgl2.IsNull() { - f._deleteQuery.Invoke(js.Value(query)) - } else { - f.EXT_disjoint_timer_query.Call("deleteQueryEXT", js.Value(query)) - } + asmDeleteQuery(f.Ctx, inkwasm.Object(query)) + inkwasm.Object(query).Free() } + func (f *Functions) DeleteShader(s Shader) { - f._deleteShader.Invoke(js.Value(s)) + asmDeleteShader(f.Ctx, inkwasm.Object(s)) + inkwasm.Object(s).Free() } + func (f *Functions) DeleteRenderbuffer(v Renderbuffer) { - f._deleteRenderbuffer.Invoke(js.Value(v)) + asmDeleteRenderbuffer(f.Ctx, inkwasm.Object(v)) + inkwasm.Object(v).Free() } + func (f *Functions) DeleteTexture(v Texture) { - f._deleteTexture.Invoke(js.Value(v)) + asmDeleteTexture(f.Ctx, inkwasm.Object(v)) + inkwasm.Object(v).Free() } + func (f *Functions) DeleteVertexArray(a VertexArray) { panic("not implemented") } + func (f *Functions) DepthFunc(fn Enum) { - f._depthFunc.Invoke(int(fn)) + asmDepthFunc(f.Ctx, uint(fn)) } + func (f *Functions) DepthMask(mask bool) { - f._depthMask.Invoke(mask) + asmDepthMask(f.Ctx, mask) } + func (f *Functions) DisableVertexAttribArray(a Attrib) { - f._disableVertexAttribArray.Invoke(int(a)) + asmDisableVertexAttribArray(f.Ctx, uint(a)) } + func (f *Functions) Disable(cap Enum) { - f._disable.Invoke(int(cap)) + asmDisable(f.Ctx, uint(cap)) } + func (f *Functions) DrawArrays(mode Enum, first, count int) { - f._drawArrays.Invoke(int(mode), first, count) + asmDrawArrays(f.Ctx, uint(mode), first, count) } + func (f *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) { - f._drawElements.Invoke(int(mode), count, int(ty), offset) + asmDrawElements(f.Ctx, uint(mode), count, uint(ty), offset) } + func (f *Functions) DispatchCompute(x, y, z int) { panic("not implemented") } + func (f *Functions) Enable(cap Enum) { - f._enable.Invoke(int(cap)) + asmEnable(f.Ctx, uint(cap)) } + func (f *Functions) EnableVertexAttribArray(a Attrib) { - f._enableVertexAttribArray.Invoke(int(a)) + asmEnableVertexAttribArray(f.Ctx, uint(a)) } + func (f *Functions) EndQuery(target Enum) { - if !f.EXT_disjoint_timer_query_webgl2.IsNull() { - f._endQuery.Invoke(int(target)) - } else { - f.EXT_disjoint_timer_query.Call("endQueryEXT", int(target)) - } + asmEndQuery(f.Ctx, uint(target)) } + func (f *Functions) Finish() { - f._finish.Invoke() + asmFinish(f.Ctx) } + func (f *Functions) Flush() { - f._flush.Invoke() + asmFlush(f.Ctx) } + func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) { - f._framebufferRenderbuffer.Invoke(int(target), int(attachment), int(renderbuffertarget), js.Value(renderbuffer)) + asmFramebufferRenderbuffer(f.Ctx, uint(target), uint(attachment), uint(renderbuffertarget), inkwasm.Object(renderbuffer)) } + func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) { - f._framebufferTexture2D.Invoke(int(target), int(attachment), int(texTarget), js.Value(t), level) + asmFramebufferTexture2D(f.Ctx, uint(target), uint(attachment), uint(texTarget), inkwasm.Object(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._getRenderbufferParameteri.Invoke(int(pname))) + return asmGetRenderbufferParameteri(f.Ctx, uint(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._getFramebufferAttachmentParameter.Invoke(int(target), int(attachment), int(pname))) + return asmGetFramebufferAttachmentParameteri(f.Ctx, uint(target), uint(attachment), uint(pname)) } + func (f *Functions) GetBinding(pname Enum) Object { - obj := f._getParameter.Invoke(int(pname)) - if !obj.Truthy() { - return Object{} - } - return Object(obj) + return Object(asmGetBinding(f.Ctx, uint(pname))) } + func (f *Functions) GetBindingi(pname Enum, idx int) Object { - obj := f._getIndexedParameter.Invoke(int(pname), idx) - if !obj.Truthy() { - return Object{} - } - return Object(obj) + return Object(asmGetBindingi(f.Ctx, uint(pname), idx)) } + func (f *Functions) GetInteger(pname Enum) int { if !f.isWebGL2 { switch pname { @@ -449,191 +301,445 @@ 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._getParameter.Invoke(int(pname))) + return asmGetInteger(f.Ctx, uint(pname)) } + func (f *Functions) GetFloat(pname Enum) float32 { - return float32(f._getParameter.Invoke(int(pname)).Float()) + return asmGetFloat(f.Ctx, uint(pname)) } -func (f *Functions) GetInteger4(pname Enum) [4]int { - arr := f._getParameter.Invoke(int(pname)) - var res [4]int - for i := range res { - res[i] = arr.Index(i).Int() - } - return res + +func (f *Functions) GetInteger4(pname Enum) (r [4]int) { + return asmGetInteger4(f.Ctx, uint(pname)) } + func (f *Functions) GetFloat4(pname Enum) [4]float32 { - arr := f._getParameter.Invoke(int(pname)) - var res [4]float32 - for i := range res { - res[i] = float32(arr.Index(i).Float()) - } - return res + return asmGetFloat4(f.Ctx, uint(pname)) } + func (f *Functions) GetProgrami(p Program, pname Enum) int { - return paramVal(f._getProgramParameter.Invoke(js.Value(p), int(pname))) + return asmGetProgrami(f.Ctx, inkwasm.Object(p), uint(pname)) } + func (f *Functions) GetProgramInfoLog(p Program) string { - return f._getProgramInfoLog.Invoke(js.Value(p)).String() + return asmGetProgramInfoLog(f.Ctx, inkwasm.Object(p)) } + func (f *Functions) GetQueryObjectuiv(query Query, pname Enum) uint { - if !f.EXT_disjoint_timer_query_webgl2.IsNull() { - 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)))) - } + return asmGetQueryObjectuiv(f.Ctx, inkwasm.Object(query), uint(pname)) } + func (f *Functions) GetShaderi(s Shader, pname Enum) int { - return paramVal(f._getShaderParameter.Invoke(js.Value(s), int(pname))) + return asmGetShaderi(f.Ctx, inkwasm.Object(s), uint(pname)) } + func (f *Functions) GetShaderInfoLog(s Shader) string { - return f._getShaderInfoLog.Invoke(js.Value(s)).String() + return asmGetShaderInfoLog(f.Ctx, inkwasm.Object(s)) } + func (f *Functions) GetString(pname Enum) string { switch pname { case EXTENSIONS: - extsjs := f._getSupportedExtensions.Invoke() + extsjs := asmGetSupportedExtensions(f.Ctx) + defer extsjs.Free() + var exts []string - for i := 0; i < extsjs.Length(); i++ { - exts = append(exts, "GL_"+extsjs.Index(i).String()) + for i := 0; i < int(extsjs.Length()); i++ { + o := extsjs.GetIndex(i) + v, err := o.String() + if err != nil { + continue + } + exts = append(exts, "GL_"+v) + o.Free() } return strings.Join(exts, " ") default: - return f._getParameter.Invoke(int(pname)).String() + return asmGetParameter(f.Ctx, uint(pname)) } } + func (f *Functions) GetUniformBlockIndex(p Program, name string) uint { - return uint(paramVal(f._getUniformBlockIndex.Invoke(js.Value(p), name))) + return asmGetUniformBlockIndex(f.Ctx, inkwasm.Object(p), name) } + func (f *Functions) GetUniformLocation(p Program, name string) Uniform { - return Uniform(f._getUniformLocation.Invoke(js.Value(p), name)) + return Uniform(asmGetUniformLocation(f.Ctx, inkwasm.Object(p), name)) } + func (f *Functions) GetVertexAttrib(index int, pname Enum) int { - return paramVal(f._getVertexAttrib.Invoke(index, int(pname))) + return asmGetVertexAttrib(f.Ctx, index, uint(pname)) } + func (f *Functions) GetVertexAttribBinding(index int, pname Enum) Object { - obj := f._getVertexAttrib.Invoke(index, int(pname)) - if !obj.Truthy() { - return Object{} - } - return Object(obj) + return Object(asmGetVertexAttribBinding(f.Ctx, index, uint(pname))) } + func (f *Functions) GetVertexAttribPointer(index int, pname Enum) uintptr { - return uintptr(f._getVertexAttribOffset.Invoke(index, int(pname)).Int()) + return asmGetVertexAttribPointer(f.Ctx, index, uint(pname)) } + func (f *Functions) InvalidateFramebuffer(target, attachment Enum) { - fn := f.Ctx.Get("invalidateFramebuffer") - if !fn.IsUndefined() { - if f.int32Buf.IsUndefined() { - f.int32Buf = js.Global().Get("Int32Array").New(1) - } - f.int32Buf.SetIndex(0, int32(attachment)) - f._invalidateFramebuffer.Invoke(int(target), f.int32Buf) + if !f.isWebGL2 { + return } + asmInvalidateFramebuffer(f.Ctx, uint(target), [1]int32{int32(attachment)}) } + func (f *Functions) IsEnabled(cap Enum) bool { - return f._isEnabled.Invoke(int(cap)).Truthy() + return asmIsEnabled(f.Ctx, uint(cap)) } + func (f *Functions) LinkProgram(p Program) { - f._linkProgram.Invoke(js.Value(p)) + asmLinkProgram(f.Ctx, inkwasm.Object(p)) } + func (f *Functions) PixelStorei(pname Enum, param int) { - f._pixelStorei.Invoke(int(pname), param) + asmPixelStorei(f.Ctx, uint(pname), param) } + func (f *Functions) MemoryBarrier(barriers Enum) { panic("not implemented") } + func (f *Functions) MapBufferRange(target Enum, offset, length int, access Enum) []byte { panic("not implemented") } + func (f *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) { - f._renderbufferStorage.Invoke(int(target), int(internalformat), width, height) + asmRenderbufferStorage(f.Ctx, uint(target), uint(internalformat), width, height) } + func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) { - ba := f.byteArrayOf(data) - f._readPixels.Invoke(x, y, width, height, int(format), int(ty), ba) - js.CopyBytesToGo(data, ba) + asmReadPixels(f.Ctx, x, y, width, height, uint(format), uint(ty), data) } + func (f *Functions) Scissor(x, y, width, height int32) { - f._scissor.Invoke(x, y, width, height) + asmScissor(f.Ctx, x, y, width, height) } + func (f *Functions) ShaderSource(s Shader, src string) { - f._shaderSource.Invoke(js.Value(s), src) + asmShaderSource(f.Ctx, inkwasm.Object(s), src) } + func (f *Functions) TexImage2D(target Enum, level int, internalFormat Enum, width, height int, format, ty Enum) { - f._texImage2D.Invoke(int(target), int(level), int(internalFormat), int(width), int(height), 0, int(format), int(ty), nil) + asmTexImage2D(f.Ctx, uint(target), level, uint(internalFormat), width, height, 0, uint(format), uint(ty), inkwasm.Undefined()) } + func (f *Functions) TexStorage2D(target Enum, levels int, internalFormat Enum, width, height int) { - f._texStorage2D.Invoke(int(target), levels, int(internalFormat), width, height) + asmTexStorage2D(f.Ctx, uint(target), levels, uint(internalFormat), width, height) } + func (f *Functions) TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte) { - f._texSubImage2D.Invoke(int(target), level, x, y, width, height, int(format), int(ty), f.byteArrayOf(data)) + asmTexSubImage2D(f.Ctx, uint(target), level, x, y, width, height, uint(format), uint(ty), data) } + func (f *Functions) TexParameteri(target, pname Enum, param int) { - f._texParameteri.Invoke(int(target), int(pname), int(param)) + asmTexParameteri(f.Ctx, uint(target), uint(pname), param) } + func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) { - f._uniformBlockBinding.Invoke(js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding)) + asmUniformBlockBinding(f.Ctx, inkwasm.Object(p), uniformBlockIndex, uniformBlockBinding) } + func (f *Functions) Uniform1f(dst Uniform, v float32) { - f._uniform1f.Invoke(js.Value(dst), v) + asmUniform1f(f.Ctx, inkwasm.Object(dst), v) } + func (f *Functions) Uniform1i(dst Uniform, v int) { - f._uniform1i.Invoke(js.Value(dst), v) + asmUniform1i(f.Ctx, inkwasm.Object(dst), v) } + func (f *Functions) Uniform2f(dst Uniform, v0, v1 float32) { - f._uniform2f.Invoke(js.Value(dst), v0, v1) + asmUniform2f(f.Ctx, inkwasm.Object(dst), v0, v1) } + func (f *Functions) Uniform3f(dst Uniform, v0, v1, v2 float32) { - f._uniform3f.Invoke(js.Value(dst), v0, v1, v2) + asmUniform3f(f.Ctx, inkwasm.Object(dst), v0, v1, v2) } + func (f *Functions) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) { - f._uniform4f.Invoke(js.Value(dst), v0, v1, v2, v3) + asmUniform4f(f.Ctx, inkwasm.Object(dst), v0, v1, v2, v3) } + func (f *Functions) UseProgram(p Program) { - f._useProgram.Invoke(js.Value(p)) + asmUseProgram(f.Ctx, inkwasm.Object(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._vertexAttribPointer.Invoke(int(dst), size, int(ty), normalized, stride, offset) + asmVertexAttribPointer(f.Ctx, uint(dst), size, uint(ty), normalized, stride, offset) } + func (f *Functions) Viewport(x, y, width, height int) { - f._viewport.Invoke(x, y, width, height) + asmViewport(f.Ctx, x, y, width, height) } -func (f *Functions) byteArrayOf(data []byte) js.Value { - if len(data) == 0 { - return js.Null() - } - f.resizeByteBuffer(len(data)) - ba := f.uint8Array.New(f.arrayBuf, int(0), int(len(data))) - js.CopyBytesToJS(ba, data) - return ba -} +//inkwasm:func .getExtension +func asmGetExtension(o inkwasm.Object, s string) inkwasm.Object -func (f *Functions) resizeByteBuffer(n int) { - if n == 0 { - return - } - if !f.arrayBuf.IsUndefined() && f.arrayBuf.Length() >= n { - return - } - f.arrayBuf = js.Global().Get("ArrayBuffer").New(n) -} +//inkwasm:func .activeTexture +func asmActiveTexture(o inkwasm.Object, t uint) -func paramVal(v js.Value) int { - switch v.Type() { - case js.TypeBoolean: - if b := v.Bool(); b { - return 1 - } else { - return 0 - } - case js.TypeNumber: - return v.Int() - default: - panic("unknown parameter type") - } -} +//inkwasm:func .attachShader +func asmAttachShader(o inkwasm.Object, p inkwasm.Object, s inkwasm.Object) + +//inkwasm:func .beginQuery +func asmBeginQuery(o inkwasm.Object, target uint, query inkwasm.Object) + +//inkwasm:func .bindAttribLocation +func asmBindAttribLocation(o inkwasm.Object, p inkwasm.Object, a uint, name string) + +//inkwasm:func .bindBuffer +func asmBindBuffer(o inkwasm.Object, target uint, b inkwasm.Object) + +//inkwasm:func .bindBufferBase +func asmBindBufferBase(o inkwasm.Object, target uint, index int, b inkwasm.Object) + +//inkwasm:func .bindFramebuffer +func asmBindFramebuffer(o inkwasm.Object, target uint, fb inkwasm.Object) + +//inkwasm:func .bindRenderbuffer +func asmBindRenderbuffer(o inkwasm.Object, target uint, rb inkwasm.Object) + +//inkwasm:func .bindTexture +func asmBindTexture(o inkwasm.Object, target uint, t inkwasm.Object) + +//inkwasm:func .blendEquation +func asmBlendEquation(o inkwasm.Object, mode uint) + +//inkwasm:func .blendFunc +func asmBlendFuncSeparate(o inkwasm.Object, srcRGB uint, dstRGB uint, srcA uint, dstA uint) + +//inkwasm:func .bufferData +func asmBufferDataSize(o inkwasm.Object, target uint, size int, usage uint) + +//inkwasm:func .bufferData +func asmBufferData(o inkwasm.Object, target uint, data []byte, usage uint) + +//inkwasm:func .bufferSubData +func asmBufferSubData(o inkwasm.Object, target uint, offset int, src []byte) + +//inkwasm:func .checkFramebufferStatus +func asmCheckFramebufferStatus(o inkwasm.Object, target uint) uint + +//inkwasm:func .clear +func asmClear(o inkwasm.Object, mask uint) + +//inkwasm:func .clearColor +func asmClearColor(o inkwasm.Object, red float64, green float64, blue float64, alpha float64) + +//inkwasm:func .clearDepth +func asmClearDepthf(o inkwasm.Object, d float64) + +//inkwasm:func .compileShader +func asmCompileShader(o inkwasm.Object, s inkwasm.Object) + +//inkwasm:func .copyTexSubImage2D +func asmCopyTexSubImage2D(o inkwasm.Object, target uint, level int, xoffset int, yoffset int, x int, y int, width int, height int) + +//inkwasm:func .createBuffer +func asmCreateBuffer(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .createFramebuffer +func asmCreateFramebuffer(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .createProgram +func asmCreateProgram(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .createQuery +func asmCreateQuery(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .createRenderbuffer +func asmCreateRenderbuffer(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .createShader +func asmCreateShader(o inkwasm.Object, ty uint) inkwasm.Object + +//inkwasm:func .createTexture +func asmCreateTexture(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .deleteBuffer +func asmDeleteBuffer(o inkwasm.Object, v inkwasm.Object) + +//inkwasm:func .deleteFramebuffer +func asmDeleteFramebuffer(o inkwasm.Object, v inkwasm.Object) + +//inkwasm:func .deleteProgram +func asmDeleteProgram(o inkwasm.Object, p inkwasm.Object) + +//inkwasm:func .deleteQuery +func asmDeleteQuery(o inkwasm.Object, query inkwasm.Object) + +//inkwasm:func .deleteShader +func asmDeleteShader(o inkwasm.Object, s inkwasm.Object) + +//inkwasm:func .deleteRenderbuffer +func asmDeleteRenderbuffer(o inkwasm.Object, v inkwasm.Object) + +//inkwasm:func .deleteTexture +func asmDeleteTexture(o inkwasm.Object, v inkwasm.Object) + +//inkwasm:func .depthFunc +func asmDepthFunc(o inkwasm.Object, fn uint) + +//inkwasm:func .depthMask +func asmDepthMask(o inkwasm.Object, mask bool) + +//inkwasm:func .disableVertexAttribArray +func asmDisableVertexAttribArray(o inkwasm.Object, a uint) + +//inkwasm:func .disable +func asmDisable(o inkwasm.Object, cap uint) + +//inkwasm:func .drawArrays +func asmDrawArrays(o inkwasm.Object, mode uint, first int, count int) + +//inkwasm:func .drawElements +func asmDrawElements(o inkwasm.Object, mode uint, count int, ty uint, offset int) + +//inkwasm:func .enable +func asmEnable(o inkwasm.Object, cap uint) + +//inkwasm:func .enableVertexAttribArray +func asmEnableVertexAttribArray(o inkwasm.Object, a uint) + +//inkwasm:func .endQuery +func asmEndQuery(o inkwasm.Object, target uint) + +//inkwasm:func .finish +func asmFinish(o inkwasm.Object) + +//inkwasm:func .flush +func asmFlush(o inkwasm.Object) + +//inkwasm:func .framebufferRenderbuffer +func asmFramebufferRenderbuffer(o inkwasm.Object, target uint, attachment uint, renderbuffertarget uint, renderbuffer inkwasm.Object) + +//inkwasm:func .framebufferTexture2D +func asmFramebufferTexture2D(o inkwasm.Object, target uint, attachment uint, texTarget uint, t inkwasm.Object, level int) + +//inkwasm:func .getRenderbufferParameteri +func asmGetRenderbufferParameteri(o inkwasm.Object, pname uint) int + +//inkwasm:func .getFramebufferAttachmentParameter +func asmGetFramebufferAttachmentParameteri(o inkwasm.Object, target uint, attachment uint, pname uint) int + +//inkwasm:func .getParameter +func asmGetParameter(o inkwasm.Object, pname uint) string + +//inkwasm:func .getParameter +func asmGetBinding(o inkwasm.Object, pname uint) inkwasm.Object + +//inkwasm:func .getIndexedParameter +func asmGetBindingi(o inkwasm.Object, pname uint, idx int) inkwasm.Object + +//inkwasm:func .getParameter +func asmGetInteger(o inkwasm.Object, pname uint) int + +//inkwasm:func .getParameter +func asmGetFloat(o inkwasm.Object, pname uint) float32 + +//inkwasm:func .getParameter +func asmGetInteger4(o inkwasm.Object, pname uint) [4]int + +//inkwasm:func .getParameter +func asmGetFloat4(o inkwasm.Object, pname uint) [4]float32 + +//inkwasm:func .getProgramParameter +func asmGetProgrami(o inkwasm.Object, p inkwasm.Object, pname uint) int + +//inkwasm:func .getProgramInfoLog +func asmGetProgramInfoLog(o inkwasm.Object, p inkwasm.Object) string + +//inkwasm:func .getQueryParameter +func asmGetQueryObjectuiv(o inkwasm.Object, query inkwasm.Object, pname uint) uint + +//inkwasm:func .getShaderParameter +func asmGetShaderi(o inkwasm.Object, s inkwasm.Object, pname uint) int + +//inkwasm:func .getShaderInfoLog +func asmGetShaderInfoLog(o inkwasm.Object, s inkwasm.Object) string + +//inkwasm:func .getSupportedExtensions +func asmGetSupportedExtensions(o inkwasm.Object) inkwasm.Object + +//inkwasm:func .getUniformBlockIndex +func asmGetUniformBlockIndex(o inkwasm.Object, p inkwasm.Object, name string) uint + +//inkwasm:func .getUniformLocation +func asmGetUniformLocation(o inkwasm.Object, p inkwasm.Object, name string) inkwasm.Object + +//inkwasm:func .getVertexAttrib +func asmGetVertexAttrib(o inkwasm.Object, index int, pname uint) int + +//inkwasm:func .getVertexAttrib +func asmGetVertexAttribBinding(o inkwasm.Object, index int, pname uint) inkwasm.Object + +//inkwasm:func .getVertexAttribOffset +func asmGetVertexAttribPointer(o inkwasm.Object, index int, pname uint) uintptr + +//inkwasm:func .invalidateFramebuffer +func asmInvalidateFramebuffer(o inkwasm.Object, target uint, attachment [1]int32) + +//inkwasm:func .isEnabled +func asmIsEnabled(o inkwasm.Object, cap uint) bool + +//inkwasm:func .linkProgram +func asmLinkProgram(o inkwasm.Object, p inkwasm.Object) + +//inkwasm:func .pixelStorei +func asmPixelStorei(o inkwasm.Object, pname uint, param int) + +//inkwasm:func .renderbufferStorage +func asmRenderbufferStorage(o inkwasm.Object, target uint, internalformat uint, width int, height int) + +//inkwasm:func .readPixels +func asmReadPixels(o inkwasm.Object, x int, y int, width int, height int, format uint, ty uint, data []byte) + +//inkwasm:func .scissor +func asmScissor(o inkwasm.Object, x int32, y int32, width int32, height int32) + +//inkwasm:func .shaderSource +func asmShaderSource(o inkwasm.Object, s inkwasm.Object, src string) + +//inkwasm:func .texImage2D +func asmTexImage2D(o inkwasm.Object, target uint, level int, internalFormat uint, width int, height int, border, format uint, ty uint, data inkwasm.Object) + +//inkwasm:func .texStorage2D +func asmTexStorage2D(o inkwasm.Object, target uint, levels int, internalFormat uint, width int, height int) + +//inkwasm:func .texSubImage2D +func asmTexSubImage2D(o inkwasm.Object, target uint, level int, x int, y int, width int, height int, format uint, ty uint, data []byte) + +//inkwasm:func .texParameteri +func asmTexParameteri(o inkwasm.Object, target uint, pname uint, param int) + +//inkwasm:func .uniformBlockBinding +func asmUniformBlockBinding(o inkwasm.Object, p inkwasm.Object, uniformBlockIndex uint, uniformBlockBinding uint) + +//inkwasm:func .uniform1f +func asmUniform1f(o inkwasm.Object, dst inkwasm.Object, v float32) + +//inkwasm:func .uniform1i +func asmUniform1i(o inkwasm.Object, dst inkwasm.Object, v int) + +//inkwasm:func .uniform2f +func asmUniform2f(o inkwasm.Object, dst inkwasm.Object, v0 float32, v1 float32) + +//inkwasm:func .uniform3f +func asmUniform3f(o inkwasm.Object, dst inkwasm.Object, v0 float32, v1 float32, v2 float32) + +//inkwasm:func .uniform4f +func asmUniform4f(o inkwasm.Object, dst inkwasm.Object, v0 float32, v1 float32, v2 float32, v3 float32) + +//inkwasm:func .useProgram +func asmUseProgram(o inkwasm.Object, p inkwasm.Object) + +//inkwasm:func .vertexAttribPointer +func asmVertexAttribPointer(o inkwasm.Object, dst uint, size int, ty uint, normalized bool, stride int, offset int) + +//inkwasm:func .viewport +func asmViewport(o inkwasm.Object, x int, y int, width int, height int) diff --git a/internal/gl/types_js.go b/internal/gl/types_js.go index 8d91a6bd1..dba917e32 100644 --- a/internal/gl/types_js.go +++ b/internal/gl/types_js.go @@ -2,10 +2,12 @@ package gl -import "syscall/js" +import ( + "github.com/inkeliz/go_inkwasm/inkwasm" +) type ( - Object js.Value + Object inkwasm.Object Buffer Object Framebuffer Object Program Object @@ -18,11 +20,11 @@ type ( ) func (o Object) valid() bool { - return js.Value(o).Truthy() + return inkwasm.Object(o).Truthy() } func (o Object) equal(o2 Object) bool { - return js.Value(o).Equal(js.Value(o2)) + return inkwasm.Object(o).Equal(inkwasm.Object(o2)) } func (b Buffer) Valid() bool {