forked from joejulian/gio
ui/app/internal/gpu: move sRGBA feature detection to context
Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -14,12 +14,12 @@ type context struct {
|
|||||||
|
|
||||||
type caps struct {
|
type caps struct {
|
||||||
EXT_disjoint_timer_query bool
|
EXT_disjoint_timer_query bool
|
||||||
srgbMode srgbMode
|
|
||||||
// floatTriple holds the settings for floating point
|
// floatTriple holds the settings for floating point
|
||||||
// textures.
|
// textures.
|
||||||
floatTriple textureTriple
|
floatTriple textureTriple
|
||||||
// Single channel alpha textures.
|
// Single channel alpha textures.
|
||||||
alphaTriple textureTriple
|
alphaTriple textureTriple
|
||||||
|
srgbaTriple textureTriple
|
||||||
}
|
}
|
||||||
|
|
||||||
// textureTriple holds the type settings for
|
// textureTriple holds the type settings for
|
||||||
@@ -30,13 +30,6 @@ type textureTriple struct {
|
|||||||
typ gl.Enum
|
typ gl.Enum
|
||||||
}
|
}
|
||||||
|
|
||||||
type srgbMode uint8
|
|
||||||
|
|
||||||
const (
|
|
||||||
srgbES3 srgbMode = iota
|
|
||||||
srgbEXT
|
|
||||||
)
|
|
||||||
|
|
||||||
func newContext(glctx gl.Context) (*context, error) {
|
func newContext(glctx gl.Context) (*context, error) {
|
||||||
ctx := &context{
|
ctx := &context{
|
||||||
Functions: glctx.Functions(),
|
Functions: glctx.Functions(),
|
||||||
@@ -47,23 +40,34 @@ func newContext(glctx gl.Context) (*context, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
srgbMode, err := srgbModeFor(ver, exts)
|
floatTriple, err := floatTripleFor(ver, exts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
floatTriple, err := floatTripleFor(ver, exts)
|
srgbaTriple, err := srgbaTripleFor(ver, exts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ctx.caps = caps{
|
ctx.caps = caps{
|
||||||
EXT_disjoint_timer_query: strings.Contains(exts, "GL_EXT_disjoint_timer_query"),
|
EXT_disjoint_timer_query: strings.Contains(exts, "GL_EXT_disjoint_timer_query"),
|
||||||
srgbMode: srgbMode,
|
|
||||||
floatTriple: floatTriple,
|
floatTriple: floatTriple,
|
||||||
alphaTriple: alphaTripleFor(ver),
|
alphaTriple: alphaTripleFor(ver),
|
||||||
|
srgbaTriple: srgbaTriple,
|
||||||
}
|
}
|
||||||
return ctx, nil
|
return ctx, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func srgbaTripleFor(ver [2]int, exts string) (textureTriple, error) {
|
||||||
|
switch {
|
||||||
|
case ver[0] >= 3:
|
||||||
|
return textureTriple{gl.SRGB8_ALPHA8, gl.Enum(gl.RGBA), gl.Enum(gl.UNSIGNED_BYTE)}, nil
|
||||||
|
case strings.Contains(exts, "GL_EXT_sRGB"):
|
||||||
|
return textureTriple{gl.SRGB_ALPHA_EXT, gl.Enum(gl.SRGB_ALPHA_EXT), gl.Enum(gl.UNSIGNED_BYTE)}, nil
|
||||||
|
default:
|
||||||
|
return textureTriple{}, errors.New("no sRGB texture formats found")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func alphaTripleFor(ver [2]int) textureTriple {
|
func alphaTripleFor(ver [2]int) textureTriple {
|
||||||
intf, f := gl.R8, gl.Enum(gl.RED)
|
intf, f := gl.R8, gl.Enum(gl.RED)
|
||||||
if ver[0] < 3 {
|
if ver[0] < 3 {
|
||||||
@@ -85,14 +89,3 @@ func floatTripleFor(ver [2]int, exts string) (textureTriple, error) {
|
|||||||
return textureTriple{}, errors.New("floating point texture not supported")
|
return textureTriple{}, errors.New("floating point texture not supported")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func srgbModeFor(ver [2]int, exts string) (srgbMode, error) {
|
|
||||||
switch {
|
|
||||||
case ver[0] >= 3:
|
|
||||||
return srgbES3, nil
|
|
||||||
case strings.Contains(exts, "EXT_sRGB"):
|
|
||||||
return srgbEXT, nil
|
|
||||||
default:
|
|
||||||
return 0, errors.New("neither OpenGL ES 3 nor EXT_sRGB is supported")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -859,15 +859,8 @@ func (r *renderer) uploadTexture(img image.Image) {
|
|||||||
default:
|
default:
|
||||||
pixels = copyImage(img, b).Pix
|
pixels = copyImage(img, b).Pix
|
||||||
}
|
}
|
||||||
var internal int
|
tt := r.ctx.caps.srgbaTriple
|
||||||
var format gl.Enum
|
r.ctx.TexImage2D(gl.TEXTURE_2D, 0, tt.internalFormat, w, h, tt.format, tt.typ, pixels)
|
||||||
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)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user