mesa/st: enable GL_EXT_framebuffer_sRGB
authorDave Airlie <airlied@redhat.com>
Sun, 6 Feb 2011 09:01:58 +0000 (19:01 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 10 Feb 2011 00:14:27 +0000 (10:14 +1000)
If the formats don't match we need to update the surface with the new
format.

if we can render to SRGB formats, enable the extension

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/mesa/state_tracker/st_atom_framebuffer.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_extensions.c

index 2843b7b1764b321878f058bba1f833950d5eae73..76386fe017a9df28cf4cca42f9c8ccc8d58e9404 100644 (file)
@@ -39,7 +39,7 @@
 #include "cso_cache/cso_context.h"
 #include "util/u_math.h"
 #include "util/u_inlines.h"
-
+#include "util/u_format.h"
 
 
 /**
@@ -55,8 +55,10 @@ update_renderbuffer_surface(struct st_context *st,
    struct pipe_resource *resource = strb->rtt->pt;
    int rtt_width = strb->Base.Width;
    int rtt_height = strb->Base.Height;
+   enum pipe_format format = st->ctx->Color.sRGBEnabled ? resource->format : util_format_linear(resource->format);
 
    if (!strb->surface ||
+       strb->surface->format != format ||
        strb->surface->texture != resource ||
        strb->surface->width != rtt_width ||
        strb->surface->height != rtt_height) {
@@ -67,7 +69,7 @@ update_renderbuffer_surface(struct st_context *st,
              u_minify(resource->height0, level) == rtt_height) {
             struct pipe_surface surf_tmpl;
             memset(&surf_tmpl, 0, sizeof(surf_tmpl));
-            surf_tmpl.format = resource->format;
+            surf_tmpl.format = format;
             surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
             surf_tmpl.u.tex.level = level;
             surf_tmpl.u.tex.first_layer = strb->rtt_face + strb->rtt_slice;
index 52464707eaea0ea3008bb123ac8a6ffccac04bad..398e32a3459a0e5d74f14fbd704e3f7b1ad0956d 100644 (file)
@@ -390,7 +390,7 @@ st_render_texture(struct gl_context *ctx,
 
    /* new surface for rendering into the texture */
    memset(&surf_tmpl, 0, sizeof(surf_tmpl));
-   surf_tmpl.format = util_format_linear(strb->texture->format);
+   surf_tmpl.format = ctx->Color.sRGBEnabled ? strb->texture->format : util_format_linear(strb->texture->format);
    surf_tmpl.usage = PIPE_BIND_RENDER_TARGET;
    surf_tmpl.u.tex.level = strb->rtt_level;
    surf_tmpl.u.tex.first_layer = strb->rtt_face + strb->rtt_slice;
index a81cbe85d34a6481a6a350aa73c9d14b4e471bc6..d600edc48be798136413b9dac6b06440b507fbb1 100644 (file)
@@ -390,6 +390,15 @@ void st_init_extensions(struct st_context *st)
                                    PIPE_BIND_SAMPLER_VIEW, 0)) {
       ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
       ctx->Extensions.EXT_texture_sRGB_decode = GL_TRUE;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_RENDER_TARGET, 0) ||
+          screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_RENDER_TARGET, 0)) {
+         ctx->Extensions.EXT_framebuffer_sRGB = GL_TRUE;
+         ctx->Const.sRGBCapable = GL_TRUE;
+      }
    }
 
    if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM,