From fd9eb029c83927d44108bc68e0cdeb61fc8c893f Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 4 May 2019 15:43:22 +0200 Subject: [PATCH] ui/app/internal/gpu: drop opaque texture optimization It doesn't seem worth the trouble: images must be scanned for alpha != 1 and GPUs don't like RGB formats. Use RGBA always. Signed-off-by: Elias Naur --- ui/app/internal/gpu/gpu.go | 48 ++++++++++---------------------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/ui/app/internal/gpu/gpu.go b/ui/app/internal/gpu/gpu.go index f1de9cd5..dea59aab 100644 --- a/ui/app/internal/gpu/gpu.go +++ b/ui/app/internal/gpu/gpu.go @@ -118,9 +118,8 @@ type resource interface { } type texture struct { - src image.Image - opaque bool - id gl.Texture + src image.Image + id gl.Texture } type blitter struct { @@ -319,7 +318,7 @@ func (r *renderer) texHandle(t *texture) gl.Texture { } t.id = createTexture(r.ctx) r.ctx.BindTexture(gl.TEXTURE_2D, t.id) - r.uploadTexture(t.src, t.opaque) + r.uploadTexture(t.src) return t.id } @@ -764,9 +763,6 @@ func materialFor(cache *resourceCache, op gdraw.OpImage, off f32.Point, clip ima t := &texture{ src: op.Src, } - if img, ok := op.Src.(interface{ Opaque() bool }); ok { - t.opaque = img.Opaque() - } cache.put(op.Src, t) tex = t } @@ -847,7 +843,7 @@ func (r *renderer) drawOps(ops []imageOp) { r.ctx.Disable(gl.DEPTH_TEST) } -func (r *renderer) uploadTexture(img image.Image, opaque bool) { +func (r *renderer) uploadTexture(img image.Image) { var pixels []byte b := img.Bounds() w, h := b.Dx(), b.Dy() @@ -863,35 +859,15 @@ func (r *renderer) uploadTexture(img image.Image, opaque bool) { default: pixels = copyImage(img, b).Pix } - if opaque { - rgb := make([]uint8, w*h*3) - for i := 0; i < w*h; i++ { - rgb[i*3+0] = pixels[i*4+0] - rgb[i*3+1] = pixels[i*4+1] - rgb[i*3+2] = pixels[i*4+2] - } - r.ctx.PixelStorei(gl.UNPACK_ALIGNMENT, 1) - var internal int - var format gl.Enum - switch r.ctx.caps.srgbMode { - case srgbES3: - internal, format = gl.SRGB8, gl.RGB - case srgbEXT: - internal, format = gl.SRGB, gl.SRGB - } - r.ctx.TexImage2D(gl.TEXTURE_2D, 0, internal, w, h, format, gl.UNSIGNED_BYTE, rgb) - r.ctx.PixelStorei(gl.UNPACK_ALIGNMENT, 4) - } else { - var internal int - var format gl.Enum - switch r.ctx.caps.srgbMode { - case srgbES3: - internal, format = gl.SRGB8_ALPHA8, gl.RGBA - case srgbEXT: - internal, format = gl.SRGB_ALPHA_EXT, gl.SRGB_ALPHA_EXT - } - r.ctx.TexImage2D(gl.TEXTURE_2D, 0, internal, w, h, format, gl.UNSIGNED_BYTE, pixels) + var internal int + var format gl.Enum + switch r.ctx.caps.srgbMode { + case srgbES3: + internal, format = gl.SRGB8_ALPHA8, gl.RGBA + case srgbEXT: + internal, format = gl.SRGB_ALPHA_EXT, gl.SRGB_ALPHA_EXT } + r.ctx.TexImage2D(gl.TEXTURE_2D, 0, internal, w, h, format, gl.UNSIGNED_BYTE, pixels) }