Skip to content

Commit bde046d

Browse files
committed
gpu/internal/opengl: avoid PACK/UNPACK_ROW_LENGTH on WebGL 1
Fixes gio#259 Signed-off-by: Elias Naur <[email protected]>
1 parent 0403b1f commit bde046d

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

gpu/internal/opengl/opengl.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -1200,8 +1200,14 @@ func (f *framebuffer) ReadPixels(src image.Rectangle, pixels []byte, stride int)
12001200
if len(pixels) < src.Dx()*src.Dy()*4 {
12011201
return errors.New("unexpected RGBA size")
12021202
}
1203-
f.backend.glstate.pixelStorei(f.backend.funcs, gl.PACK_ROW_LENGTH, stride/4)
1204-
f.backend.funcs.ReadPixels(src.Min.X, src.Min.Y, src.Dx(), src.Dy(), gl.RGBA, gl.UNSIGNED_BYTE, pixels)
1203+
w, h := src.Dx(), src.Dy()
1204+
// WebGL 1 doesn't support PACK_ROW_LENGTH != 0. Avoid it if possible.
1205+
rowLen := 0
1206+
if n := stride / 4; n != w {
1207+
rowLen = n
1208+
}
1209+
f.backend.glstate.pixelStorei(f.backend.funcs, gl.PACK_ROW_LENGTH, rowLen)
1210+
f.backend.funcs.ReadPixels(src.Min.X, src.Min.Y, w, h, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
12051211
return glErr(f.backend.funcs)
12061212
}
12071213

@@ -1262,7 +1268,12 @@ func (t *texture) Upload(offset, size image.Point, pixels []byte, stride int) {
12621268
panic(fmt.Errorf("size %d larger than data %d", min, len(pixels)))
12631269
}
12641270
t.backend.BindTexture(0, t)
1265-
t.backend.glstate.pixelStorei(t.backend.funcs, gl.UNPACK_ROW_LENGTH, stride/4)
1271+
// WebGL 1 doesn't support UNPACK_ROW_LENGTH != 0. Avoid it if possible.
1272+
rowLen := 0
1273+
if n := stride / 4; n != size.X {
1274+
rowLen = n
1275+
}
1276+
t.backend.glstate.pixelStorei(t.backend.funcs, gl.UNPACK_ROW_LENGTH, rowLen)
12661277
t.backend.funcs.TexSubImage2D(gl.TEXTURE_2D, 0, offset.X, offset.Y, size.X, size.Y, t.triple.format, t.triple.typ, pixels)
12671278
}
12681279

internal/gl/gl_js.go

+6
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ func (f *Functions) GetBindingi(pname Enum, idx int) Object {
262262
return Object(obj)
263263
}
264264
func (f *Functions) GetInteger(pname Enum) int {
265+
if !f.isWebGL2 {
266+
switch pname {
267+
case PACK_ROW_LENGTH, UNPACK_ROW_LENGTH:
268+
return 0 // PACK_ROW_LENGTH and UNPACK_ROW_LENGTH is only available on WebGL 2
269+
}
270+
}
265271
return paramVal(f.Ctx.Call("getParameter", int(pname)))
266272
}
267273
func (f *Functions) GetFloat(pname Enum) float32 {

0 commit comments

Comments
 (0)