mesa/965: add support for GL_EXT_framebuffer_sRGB (v2)
[mesa.git] / src / mesa / drivers / dri / i965 / brw_wm_surface_state.c
index 233fe3b731065d2c5cae1b8cb8340c192674f1ed..c931df3c605cf9f1268e4ef9f66c9bec0a004e4a 100644 (file)
@@ -120,7 +120,8 @@ brw_render_target_supported(gl_format format)
 
 static GLuint translate_tex_format( gl_format mesa_format,
                                     GLenum internal_format,
-                                   GLenum depth_mode )
+                                   GLenum depth_mode, 
+                                   GLenum srgb_decode )
 {
    switch( mesa_format ) {
 
@@ -146,7 +147,14 @@ static GLuint translate_tex_format( gl_format mesa_format,
          return BRW_SURFACEFORMAT_R24_UNORM_X8_TYPELESS;
       else
          return BRW_SURFACEFORMAT_L24X8_UNORM;
-
+      
+   case MESA_FORMAT_SARGB8:
+   case MESA_FORMAT_SLA8:
+   case MESA_FORMAT_SL8:
+      if (srgb_decode == GL_DECODE_EXT)
+        return brw_format_for_mesa_format[mesa_format];
+      else if (srgb_decode == GL_SKIP_DECODE_EXT)
+        return brw_format_for_mesa_format[_mesa_get_srgb_format_linear(mesa_format)];
    default:
       assert(brw_format_for_mesa_format[mesa_format] != 0);
       return brw_format_for_mesa_format[mesa_format];
@@ -189,7 +197,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
    surf.ss0.surface_type = translate_tex_target(tObj->Target);
    surf.ss0.surface_format = translate_tex_format(firstImage->TexFormat,
                                                  firstImage->InternalFormat,
-                                                 tObj->DepthMode);
+                                                 tObj->DepthMode, tObj->sRGBDecode);
 
    /* This is ok for all textures with channel width 8bit or less:
     */
@@ -438,7 +446,10 @@ brw_update_renderbuffer_surface(struct brw_context *brw,
    case MESA_FORMAT_SARGB8:
       /* without GL_EXT_framebuffer_sRGB we shouldn't bind sRGB
         surfaces to the blend/update as sRGB */
-      surf.ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
+      if (ctx->Color.sRGBEnabled)
+        surf.ss0.surface_format = brw_format_for_mesa_format[irb->Base.Format];
+      else
+        surf.ss0.surface_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
       break;
    default:
       surf.ss0.surface_format = brw_format_for_mesa_format[irb->Base.Format];