[Mesa-dev,08/14] i965: Define and initialize image parameter structure.

Submitted by Francisco Jerez on Feb. 6, 2015, 5:23 p.m.

Details

Message ID 1423243408-24744-8-git-send-email-currojerez@riseup.net
State New
Headers show

Not browsing as part of any series.

Commit Message

Francisco Jerez Feb. 6, 2015, 5:23 p.m.
This will be used to pass image meta-data to the shader when we cannot
use typed surface reads and writes.  All entries except surface_idx
and size are otherwise unused and will get eliminated by the uniform
packing pass.  size will be used for bounds checking with some image
formats and will be useful for ARB_shader_image_size too.  surface_idx
is always used.
---
 src/mesa/drivers/dri/i965/brw_context.h          | 50 +++++++++++++++
 src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 78 ++++++++++++++++++++++++
 2 files changed, 128 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 8cc54ad..e12528e 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -370,6 +370,52 @@  struct brw_stage_prog_data {
    const gl_constant_value **pull_param;
 };
 
+/*
+ * Image meta-data structure as laid out in the shader parameter
+ * buffer.  Entries have to be 16B-aligned for the vec4 back-end to be
+ * able to use them.  That's okay because the padding and any unused
+ * entries [most of them except when we're doing untyped surface
+ * access] will be removed by the uniform packing pass.
+ */
+#define BRW_IMAGE_PARAM_SURFACE_IDX_OFFSET      0
+#define BRW_IMAGE_PARAM_OFFSET_OFFSET           4
+#define BRW_IMAGE_PARAM_SIZE_OFFSET             8
+#define BRW_IMAGE_PARAM_STRIDE_OFFSET           12
+#define BRW_IMAGE_PARAM_TILING_OFFSET           16
+#define BRW_IMAGE_PARAM_SWIZZLING_OFFSET        20
+#define BRW_IMAGE_PARAM_SIZE                    24
+
+struct brw_image_param {
+   /** Surface binding table index. */
+   uint32_t surface_idx;
+
+   /** Surface X, Y and Z dimensions. */
+   uint32_t size[3];
+
+   /** Offset applied to the X and Y surface coordinates. */
+   uint32_t offset[2];
+
+   /** X-stride in bytes, Y-stride in bytes, horizontal slice stride in
+    * pixels, vertical slice stride in pixels.
+    */
+   uint32_t stride[4];
+
+   /** Log2 of the tiling modulus in the X, Y and Z dimension. */
+   uint32_t tiling[3];
+
+   /**
+    * Right shift to apply for bit 6 address swizzling.  Two different
+    * swizzles can be specified and will be applied one after the other.  The
+    * resulting address will be:
+    *
+    *  addr' = addr ^ ((1 << 6) & ((addr >> swizzling[0]) ^
+    *                              (addr >> swizzling[1])))
+    *
+    * Use \c 0xff if any of the swizzles is not required.
+    */
+   uint32_t swizzling[2];
+};
+
 /* Data about a particular attempt to compile a program.  Note that
  * there can be many of these, each in a different GL state
  * corresponding to a different brw_wm_prog_key struct, with different
@@ -944,6 +990,10 @@  struct brw_stage_state
    /** SAMPLER_STATE count and table offset */
    uint32_t sampler_count;
    uint32_t sampler_offset;
+
+   /** Metadata for images passed to the shader as uniforms. */
+   struct brw_image_param image_params[BRW_MAX_IMAGES];
+   uint32_t nr_image_params;
 };
 
 
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index 13755aa..50636aa 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -981,6 +981,79 @@  get_image_format(struct brw_context *brw, mesa_format format, GLenum access)
 }
 
 static void
+update_default_image_param(struct brw_context *brw,
+                           struct gl_image_unit *u,
+                           unsigned surface_idx,
+                           struct brw_image_param *param)
+{
+   memset(param, 0, sizeof(*param));
+   param->surface_idx = surface_idx;
+   param->swizzling[0] = 0xff;
+   param->swizzling[1] = 0xff;
+}
+
+static void
+update_buffer_image_param(struct brw_context *brw,
+                          struct gl_image_unit *u,
+                          unsigned surface_idx,
+                          struct brw_image_param *param)
+{
+   struct gl_buffer_object *obj = u->TexObj->BufferObject;
+
+   update_default_image_param(brw, u, surface_idx, param);
+
+   param->size[0] = obj->Size / _mesa_get_format_bytes(u->_ActualFormat);
+   param->stride[0] = _mesa_get_format_bytes(u->_ActualFormat);
+}
+
+static void
+update_texture_image_param(struct brw_context *brw,
+                           struct gl_image_unit *u,
+                           unsigned surface_idx,
+                           struct brw_image_param *param)
+{
+   struct intel_mipmap_tree *mt = intel_texture_object(u->TexObj)->mt;
+
+   update_default_image_param(brw, u, surface_idx, param);
+
+   param->size[0] = minify(mt->logical_width0, u->Level);
+   param->size[1] = minify(mt->logical_height0, u->Level);
+   param->size[2] = (!u->Layered ? 1 :
+                     u->TexObj->Target == GL_TEXTURE_CUBE_MAP ? 6 :
+                     u->TexObj->Target == GL_TEXTURE_3D ?
+                     minify(mt->logical_depth0, u->Level) :
+                     mt->logical_depth0);
+
+   intel_miptree_get_image_offset(mt, u->Level, u->Layer,
+                                  &param->offset[0],
+                                  &param->offset[1]);
+
+   param->stride[0] = mt->cpp;
+   param->stride[1] = mt->pitch / mt->cpp;
+   param->stride[2] =
+      brw_miptree_get_horizontal_slice_pitch(brw, mt, u->Level);
+   param->stride[3] =
+      brw_miptree_get_vertical_slice_pitch(brw, mt, u->Level);
+
+   if (mt->tiling == I915_TILING_X) {
+      param->tiling[0] = ffs(512 / mt->cpp) - 1;
+      param->tiling[1] = 3;
+      param->swizzling[0] = 3;
+      param->swizzling[1] = 4;
+   } else if (mt->tiling == I915_TILING_Y) {
+      param->tiling[0] = ffs(16 / mt->cpp) - 1;
+      param->tiling[1] = 5;
+      param->swizzling[0] = 3;
+      param->swizzling[1] = 0xff;
+   }
+
+   if (u->TexObj->Target == GL_TEXTURE_3D)
+      param->tiling[2] = u->Level;
+   else
+      param->tiling[2] = 0;
+}
+
+static void
 update_image_surface(struct brw_context *brw,
                      struct gl_image_unit *u,
                      GLenum access,
@@ -1003,6 +1076,8 @@  update_image_surface(struct brw_context *brw,
             format, intel_obj->Base.Size / texel_size, texel_size,
             access != GL_READ_ONLY);
 
+         update_buffer_image_param(brw, u, surface_idx, param);
+
       } else {
          struct intel_texture_object *intel_obj = intel_texture_object(obj);
          struct intel_mipmap_tree *mt = intel_obj->mt;
@@ -1030,10 +1105,13 @@  update_image_surface(struct brw_context *brw,
                format, SWIZZLE_XYZW,
                surf_offset, access != GL_READ_ONLY, false);
          }
+
+         update_texture_image_param(brw, u, surface_idx, param);
       }
 
    } else {
       brw->vtbl.emit_null_surface_state(brw, 1, 1, 1, surf_offset);
+      update_default_image_param(brw, u, surface_idx, param);
    }
 }
 

Comments

Ping.  Some 10-20 other ARB_shader_image_load_store patches are blocking
on this patch I've been carrying around since I originally sent it for
review in Dec 2013.

Francisco Jerez <currojerez@riseup.net> writes:

> This will be used to pass image meta-data to the shader when we cannot
> use typed surface reads and writes.  All entries except surface_idx
> and size are otherwise unused and will get eliminated by the uniform
> packing pass.  size will be used for bounds checking with some image
> formats and will be useful for ARB_shader_image_size too.  surface_idx
> is always used.
> ---
>  src/mesa/drivers/dri/i965/brw_context.h          | 50 +++++++++++++++
>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 78 ++++++++++++++++++++++++
>  2 files changed, 128 insertions(+)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index 8cc54ad..e12528e 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -370,6 +370,52 @@ struct brw_stage_prog_data {
>     const gl_constant_value **pull_param;
>  };
>  
> +/*
> + * Image meta-data structure as laid out in the shader parameter
> + * buffer.  Entries have to be 16B-aligned for the vec4 back-end to be
> + * able to use them.  That's okay because the padding and any unused
> + * entries [most of them except when we're doing untyped surface
> + * access] will be removed by the uniform packing pass.
> + */
> +#define BRW_IMAGE_PARAM_SURFACE_IDX_OFFSET      0
> +#define BRW_IMAGE_PARAM_OFFSET_OFFSET           4
> +#define BRW_IMAGE_PARAM_SIZE_OFFSET             8
> +#define BRW_IMAGE_PARAM_STRIDE_OFFSET           12
> +#define BRW_IMAGE_PARAM_TILING_OFFSET           16
> +#define BRW_IMAGE_PARAM_SWIZZLING_OFFSET        20
> +#define BRW_IMAGE_PARAM_SIZE                    24
> +
> +struct brw_image_param {
> +   /** Surface binding table index. */
> +   uint32_t surface_idx;
> +
> +   /** Surface X, Y and Z dimensions. */
> +   uint32_t size[3];
> +
> +   /** Offset applied to the X and Y surface coordinates. */
> +   uint32_t offset[2];
> +
> +   /** X-stride in bytes, Y-stride in bytes, horizontal slice stride in
> +    * pixels, vertical slice stride in pixels.
> +    */
> +   uint32_t stride[4];
> +
> +   /** Log2 of the tiling modulus in the X, Y and Z dimension. */
> +   uint32_t tiling[3];
> +
> +   /**
> +    * Right shift to apply for bit 6 address swizzling.  Two different
> +    * swizzles can be specified and will be applied one after the other.  The
> +    * resulting address will be:
> +    *
> +    *  addr' = addr ^ ((1 << 6) & ((addr >> swizzling[0]) ^
> +    *                              (addr >> swizzling[1])))
> +    *
> +    * Use \c 0xff if any of the swizzles is not required.
> +    */
> +   uint32_t swizzling[2];
> +};
> +
>  /* Data about a particular attempt to compile a program.  Note that
>   * there can be many of these, each in a different GL state
>   * corresponding to a different brw_wm_prog_key struct, with different
> @@ -944,6 +990,10 @@ struct brw_stage_state
>     /** SAMPLER_STATE count and table offset */
>     uint32_t sampler_count;
>     uint32_t sampler_offset;
> +
> +   /** Metadata for images passed to the shader as uniforms. */
> +   struct brw_image_param image_params[BRW_MAX_IMAGES];
> +   uint32_t nr_image_params;
>  };
>  
>  
> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> index 13755aa..50636aa 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -981,6 +981,79 @@ get_image_format(struct brw_context *brw, mesa_format format, GLenum access)
>  }
>  
>  static void
> +update_default_image_param(struct brw_context *brw,
> +                           struct gl_image_unit *u,
> +                           unsigned surface_idx,
> +                           struct brw_image_param *param)
> +{
> +   memset(param, 0, sizeof(*param));
> +   param->surface_idx = surface_idx;
> +   param->swizzling[0] = 0xff;
> +   param->swizzling[1] = 0xff;
> +}
> +
> +static void
> +update_buffer_image_param(struct brw_context *brw,
> +                          struct gl_image_unit *u,
> +                          unsigned surface_idx,
> +                          struct brw_image_param *param)
> +{
> +   struct gl_buffer_object *obj = u->TexObj->BufferObject;
> +
> +   update_default_image_param(brw, u, surface_idx, param);
> +
> +   param->size[0] = obj->Size / _mesa_get_format_bytes(u->_ActualFormat);
> +   param->stride[0] = _mesa_get_format_bytes(u->_ActualFormat);
> +}
> +
> +static void
> +update_texture_image_param(struct brw_context *brw,
> +                           struct gl_image_unit *u,
> +                           unsigned surface_idx,
> +                           struct brw_image_param *param)
> +{
> +   struct intel_mipmap_tree *mt = intel_texture_object(u->TexObj)->mt;
> +
> +   update_default_image_param(brw, u, surface_idx, param);
> +
> +   param->size[0] = minify(mt->logical_width0, u->Level);
> +   param->size[1] = minify(mt->logical_height0, u->Level);
> +   param->size[2] = (!u->Layered ? 1 :
> +                     u->TexObj->Target == GL_TEXTURE_CUBE_MAP ? 6 :
> +                     u->TexObj->Target == GL_TEXTURE_3D ?
> +                     minify(mt->logical_depth0, u->Level) :
> +                     mt->logical_depth0);
> +
> +   intel_miptree_get_image_offset(mt, u->Level, u->Layer,
> +                                  &param->offset[0],
> +                                  &param->offset[1]);
> +
> +   param->stride[0] = mt->cpp;
> +   param->stride[1] = mt->pitch / mt->cpp;
> +   param->stride[2] =
> +      brw_miptree_get_horizontal_slice_pitch(brw, mt, u->Level);
> +   param->stride[3] =
> +      brw_miptree_get_vertical_slice_pitch(brw, mt, u->Level);
> +
> +   if (mt->tiling == I915_TILING_X) {
> +      param->tiling[0] = ffs(512 / mt->cpp) - 1;
> +      param->tiling[1] = 3;
> +      param->swizzling[0] = 3;
> +      param->swizzling[1] = 4;
> +   } else if (mt->tiling == I915_TILING_Y) {
> +      param->tiling[0] = ffs(16 / mt->cpp) - 1;
> +      param->tiling[1] = 5;
> +      param->swizzling[0] = 3;
> +      param->swizzling[1] = 0xff;
> +   }
> +
> +   if (u->TexObj->Target == GL_TEXTURE_3D)
> +      param->tiling[2] = u->Level;
> +   else
> +      param->tiling[2] = 0;
> +}
> +
> +static void
>  update_image_surface(struct brw_context *brw,
>                       struct gl_image_unit *u,
>                       GLenum access,
> @@ -1003,6 +1076,8 @@ update_image_surface(struct brw_context *brw,
>              format, intel_obj->Base.Size / texel_size, texel_size,
>              access != GL_READ_ONLY);
>  
> +         update_buffer_image_param(brw, u, surface_idx, param);
> +
>        } else {
>           struct intel_texture_object *intel_obj = intel_texture_object(obj);
>           struct intel_mipmap_tree *mt = intel_obj->mt;
> @@ -1030,10 +1105,13 @@ update_image_surface(struct brw_context *brw,
>                 format, SWIZZLE_XYZW,
>                 surf_offset, access != GL_READ_ONLY, false);
>           }
> +
> +         update_texture_image_param(brw, u, surface_idx, param);
>        }
>  
>     } else {
>        brw->vtbl.emit_null_surface_state(brw, 1, 1, 1, surf_offset);
> +      update_default_image_param(brw, u, surface_idx, param);
>     }
>  }
>  
> -- 
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Francisco Jerez <currojerez@riseup.net> writes:

> Ping.  Some 10-20 other ARB_shader_image_load_store patches are blocking
> on this patch I've been carrying around since I originally sent it for
> review in Dec 2013.
>
Hint for reviewers:  A quick comparison with "i965/fs: Import image
memory offset calculation code." [1] should be enough to convince
oneself that it's sensible.

[1] http://lists.freedesktop.org/archives/mesa-dev/2015-July/089793.html

> Francisco Jerez <currojerez@riseup.net> writes:
>
>> This will be used to pass image meta-data to the shader when we cannot
>> use typed surface reads and writes.  All entries except surface_idx
>> and size are otherwise unused and will get eliminated by the uniform
>> packing pass.  size will be used for bounds checking with some image
>> formats and will be useful for ARB_shader_image_size too.  surface_idx
>> is always used.
>> ---
>>  src/mesa/drivers/dri/i965/brw_context.h          | 50 +++++++++++++++
>>  src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 78 ++++++++++++++++++++++++
>>  2 files changed, 128 insertions(+)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
>> index 8cc54ad..e12528e 100644
>> --- a/src/mesa/drivers/dri/i965/brw_context.h
>> +++ b/src/mesa/drivers/dri/i965/brw_context.h
>> @@ -370,6 +370,52 @@ struct brw_stage_prog_data {
>>     const gl_constant_value **pull_param;
>>  };
>>  
>> +/*
>> + * Image meta-data structure as laid out in the shader parameter
>> + * buffer.  Entries have to be 16B-aligned for the vec4 back-end to be
>> + * able to use them.  That's okay because the padding and any unused
>> + * entries [most of them except when we're doing untyped surface
>> + * access] will be removed by the uniform packing pass.
>> + */
>> +#define BRW_IMAGE_PARAM_SURFACE_IDX_OFFSET      0
>> +#define BRW_IMAGE_PARAM_OFFSET_OFFSET           4
>> +#define BRW_IMAGE_PARAM_SIZE_OFFSET             8
>> +#define BRW_IMAGE_PARAM_STRIDE_OFFSET           12
>> +#define BRW_IMAGE_PARAM_TILING_OFFSET           16
>> +#define BRW_IMAGE_PARAM_SWIZZLING_OFFSET        20
>> +#define BRW_IMAGE_PARAM_SIZE                    24
>> +
>> +struct brw_image_param {
>> +   /** Surface binding table index. */
>> +   uint32_t surface_idx;
>> +
>> +   /** Surface X, Y and Z dimensions. */
>> +   uint32_t size[3];
>> +
>> +   /** Offset applied to the X and Y surface coordinates. */
>> +   uint32_t offset[2];
>> +
>> +   /** X-stride in bytes, Y-stride in bytes, horizontal slice stride in
>> +    * pixels, vertical slice stride in pixels.
>> +    */
>> +   uint32_t stride[4];
>> +
>> +   /** Log2 of the tiling modulus in the X, Y and Z dimension. */
>> +   uint32_t tiling[3];
>> +
>> +   /**
>> +    * Right shift to apply for bit 6 address swizzling.  Two different
>> +    * swizzles can be specified and will be applied one after the other.  The
>> +    * resulting address will be:
>> +    *
>> +    *  addr' = addr ^ ((1 << 6) & ((addr >> swizzling[0]) ^
>> +    *                              (addr >> swizzling[1])))
>> +    *
>> +    * Use \c 0xff if any of the swizzles is not required.
>> +    */
>> +   uint32_t swizzling[2];
>> +};
>> +
>>  /* Data about a particular attempt to compile a program.  Note that
>>   * there can be many of these, each in a different GL state
>>   * corresponding to a different brw_wm_prog_key struct, with different
>> @@ -944,6 +990,10 @@ struct brw_stage_state
>>     /** SAMPLER_STATE count and table offset */
>>     uint32_t sampler_count;
>>     uint32_t sampler_offset;
>> +
>> +   /** Metadata for images passed to the shader as uniforms. */
>> +   struct brw_image_param image_params[BRW_MAX_IMAGES];
>> +   uint32_t nr_image_params;
>>  };
>>  
>>  
>> diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> index 13755aa..50636aa 100644
>> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
>> @@ -981,6 +981,79 @@ get_image_format(struct brw_context *brw, mesa_format format, GLenum access)
>>  }
>>  
>>  static void
>> +update_default_image_param(struct brw_context *brw,
>> +                           struct gl_image_unit *u,
>> +                           unsigned surface_idx,
>> +                           struct brw_image_param *param)
>> +{
>> +   memset(param, 0, sizeof(*param));
>> +   param->surface_idx = surface_idx;
>> +   param->swizzling[0] = 0xff;
>> +   param->swizzling[1] = 0xff;
>> +}
>> +
>> +static void
>> +update_buffer_image_param(struct brw_context *brw,
>> +                          struct gl_image_unit *u,
>> +                          unsigned surface_idx,
>> +                          struct brw_image_param *param)
>> +{
>> +   struct gl_buffer_object *obj = u->TexObj->BufferObject;
>> +
>> +   update_default_image_param(brw, u, surface_idx, param);
>> +
>> +   param->size[0] = obj->Size / _mesa_get_format_bytes(u->_ActualFormat);
>> +   param->stride[0] = _mesa_get_format_bytes(u->_ActualFormat);
>> +}
>> +
>> +static void
>> +update_texture_image_param(struct brw_context *brw,
>> +                           struct gl_image_unit *u,
>> +                           unsigned surface_idx,
>> +                           struct brw_image_param *param)
>> +{
>> +   struct intel_mipmap_tree *mt = intel_texture_object(u->TexObj)->mt;
>> +
>> +   update_default_image_param(brw, u, surface_idx, param);
>> +
>> +   param->size[0] = minify(mt->logical_width0, u->Level);
>> +   param->size[1] = minify(mt->logical_height0, u->Level);
>> +   param->size[2] = (!u->Layered ? 1 :
>> +                     u->TexObj->Target == GL_TEXTURE_CUBE_MAP ? 6 :
>> +                     u->TexObj->Target == GL_TEXTURE_3D ?
>> +                     minify(mt->logical_depth0, u->Level) :
>> +                     mt->logical_depth0);
>> +
>> +   intel_miptree_get_image_offset(mt, u->Level, u->Layer,
>> +                                  &param->offset[0],
>> +                                  &param->offset[1]);
>> +
>> +   param->stride[0] = mt->cpp;
>> +   param->stride[1] = mt->pitch / mt->cpp;
>> +   param->stride[2] =
>> +      brw_miptree_get_horizontal_slice_pitch(brw, mt, u->Level);
>> +   param->stride[3] =
>> +      brw_miptree_get_vertical_slice_pitch(brw, mt, u->Level);
>> +
>> +   if (mt->tiling == I915_TILING_X) {
>> +      param->tiling[0] = ffs(512 / mt->cpp) - 1;
>> +      param->tiling[1] = 3;
>> +      param->swizzling[0] = 3;
>> +      param->swizzling[1] = 4;
>> +   } else if (mt->tiling == I915_TILING_Y) {
>> +      param->tiling[0] = ffs(16 / mt->cpp) - 1;
>> +      param->tiling[1] = 5;
>> +      param->swizzling[0] = 3;
>> +      param->swizzling[1] = 0xff;
>> +   }
>> +
>> +   if (u->TexObj->Target == GL_TEXTURE_3D)
>> +      param->tiling[2] = u->Level;
>> +   else
>> +      param->tiling[2] = 0;
>> +}
>> +
>> +static void
>>  update_image_surface(struct brw_context *brw,
>>                       struct gl_image_unit *u,
>>                       GLenum access,
>> @@ -1003,6 +1076,8 @@ update_image_surface(struct brw_context *brw,
>>              format, intel_obj->Base.Size / texel_size, texel_size,
>>              access != GL_READ_ONLY);
>>  
>> +         update_buffer_image_param(brw, u, surface_idx, param);
>> +
>>        } else {
>>           struct intel_texture_object *intel_obj = intel_texture_object(obj);
>>           struct intel_mipmap_tree *mt = intel_obj->mt;
>> @@ -1030,10 +1105,13 @@ update_image_surface(struct brw_context *brw,
>>                 format, SWIZZLE_XYZW,
>>                 surf_offset, access != GL_READ_ONLY, false);
>>           }
>> +
>> +         update_texture_image_param(brw, u, surface_idx, param);
>>        }
>>  
>>     } else {
>>        brw->vtbl.emit_null_surface_state(brw, 1, 1, 1, surf_offset);
>> +      update_default_image_param(brw, u, surface_idx, param);
>>     }
>>  }
>>  
>> -- 
>> 2.1.3
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev