i965/miptree: Add a colorspace parameter to create_for_dri_image
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 16 Jun 2017 18:35:32 +0000 (11:35 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Thu, 13 Jul 2017 04:15:46 +0000 (21:15 -0700)
The __DRI_FORMAT enums are all UNORM but we will frequently want sRGB
when creating miptrees for renderbuffers.  This lets us specify.

Reviewed-by: Chad Versace <chadversary@chromium.org>
src/mesa/drivers/dri/i965/intel_fbo.c
src/mesa/drivers/dri/i965/intel_mipmap_tree.c
src/mesa/drivers/dri/i965/intel_mipmap_tree.h
src/mesa/drivers/dri/i965/intel_tex_image.c

index 4003e288250b8be8390bcccbd2a45845011e7eff..3670c2a0b7f275b705d1a13e1eb2a8978de91345 100644 (file)
@@ -362,7 +362,8 @@ intel_image_target_renderbuffer_storage(struct gl_context *ctx,
     * buffer's content to the main buffer nor for invalidating the aux buffer's
     * content.
     */
-   irb->mt = intel_miptree_create_for_dri_image(brw, image, GL_TEXTURE_2D);
+   irb->mt = intel_miptree_create_for_dri_image(brw, image, GL_TEXTURE_2D,
+                                                ISL_COLORSPACE_NONE);
    if (!irb->mt)
       return;
 
index f1ac074fb506d1b87c73860de072265d3a563a76..6159fb31a25c1e978cec0b1f94178d079da1bb51 100644 (file)
@@ -1040,12 +1040,32 @@ miptree_create_for_planar_image(struct brw_context *brw,
 
 struct intel_mipmap_tree *
 intel_miptree_create_for_dri_image(struct brw_context *brw,
-                                   __DRIimage *image, GLenum target)
+                                   __DRIimage *image, GLenum target,
+                                   enum isl_colorspace colorspace)
 {
-   if (image->planar_format && image->planar_format->nplanes > 0)
+   if (image->planar_format && image->planar_format->nplanes > 0) {
+      assert(colorspace == ISL_COLORSPACE_NONE ||
+             colorspace == ISL_COLORSPACE_YUV);
       return miptree_create_for_planar_image(brw, image, target);
+   }
 
    mesa_format format = image->format;
+   switch (colorspace) {
+   case ISL_COLORSPACE_NONE:
+      /* Keep the image format unmodified */
+      break;
+
+   case ISL_COLORSPACE_LINEAR:
+      format =_mesa_get_srgb_format_linear(format);
+      break;
+
+   case ISL_COLORSPACE_SRGB:
+      format =_mesa_get_linear_format_srgb(format);
+      break;
+
+   default:
+      unreachable("Inalid colorspace for non-planar image");
+   }
 
    if (!brw->ctx.TextureFormatSupported[format]) {
       /* The texture storage paths in core Mesa detect if the driver does not
index 4cc5c3539ff518b6746ebc2dbf88062b1ad6524d..6668d317a26ad02d64366fc18cf8d2d89cb5f52a 100644 (file)
@@ -689,7 +689,8 @@ intel_miptree_create_for_bo(struct brw_context *brw,
 struct intel_mipmap_tree *
 intel_miptree_create_for_dri_image(struct brw_context *brw,
                                    __DRIimage *image,
-                                   GLenum target);
+                                   GLenum target,
+                                   enum isl_colorspace colorspace);
 
 bool
 intel_update_winsys_renderbuffer_miptree(struct brw_context *intel,
index abeb245373bf018768cd9d28d132afc205e1a0cb..7765d1bddf84abd6f8da6a661426dfa4cac7ff51 100644 (file)
@@ -356,7 +356,8 @@ intel_image_target_texture_2d(struct gl_context *ctx, GLenum target,
       return;
    }
 
-   mt = intel_miptree_create_for_dri_image(brw, image, target);
+   mt = intel_miptree_create_for_dri_image(brw, image, target,
+                                           ISL_COLORSPACE_NONE);
    if (mt == NULL)
       return;