[Mesa-dev] [PATCH v3] i965: Fix calculation of layers array length for isl_view

Jason Ekstrand jason at jlekstrand.net
Tue Nov 13 21:53:25 UTC 2018


On Mon, Sep 10, 2018 at 10:21 AM Danylo Piliaiev <danylo.piliaiev at gmail.com>
wrote:

> Handle all cases in calculation of layers count for isl_view
> taking into account texture view and image unit.
> st_convert_image was taken as a reference.
>
> When u->Layered is true the whole level is taken with respect to
> image view. In other case only one layer is taken.
>
> v3: (Józef Kucia and Ilia Mirkin)
>     - Rewrote patch by taking st_convert_image as a reference
>     - Removed now unused get_image_num_layers function
>     - Changed commit message
>
> Fixes: 5a8c8903
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107856
>
> Signed-off-by: Danylo Piliaiev <danylo.piliaiev at globallogic.com>
> ---
>  .../drivers/dri/i965/brw_wm_surface_state.c   | 32 ++++++++++---------
>  1 file changed, 17 insertions(+), 15 deletions(-)
>
> 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 944762ec46..9bfe6e2037 100644
> --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
> @@ -1499,18 +1499,6 @@ update_buffer_image_param(struct brw_context *brw,
>     param->stride[0] = _mesa_get_format_bytes(u->_ActualFormat);
>  }
>
> -static unsigned
> -get_image_num_layers(const struct intel_mipmap_tree *mt, GLenum target,
> -                     unsigned level)
> -{
> -   if (target == GL_TEXTURE_CUBE_MAP)
> -      return 6;
> -
> -   return target == GL_TEXTURE_3D ?
> -      minify(mt->surf.logical_level0_px.depth, level) :
> -      mt->surf.logical_level0_px.array_len;
> -}
> -
>  static void
>  update_image_surface(struct brw_context *brw,
>                       struct gl_image_unit *u,
> @@ -1541,14 +1529,28 @@ update_image_surface(struct brw_context *brw,
>        } else {
>           struct intel_texture_object *intel_obj =
> intel_texture_object(obj);
>           struct intel_mipmap_tree *mt = intel_obj->mt;
> -         const unsigned num_layers = u->Layered ?
> -            get_image_num_layers(mt, obj->Target, u->Level) : 1;
> +
> +         unsigned base_layer, num_layers;
> +         if (u->Layered) {
> +            if (obj->Target == GL_TEXTURE_3D) {
> +               base_layer = 0;
> +               num_layers = minify(mt->surf.logical_level0_px.depth,
> u->Level);
> +            } else {
> +               base_layer = obj->MinLayer;
> +               num_layers = obj->Immutable ?
> +                                obj->NumLayers :
> +                                mt->surf.logical_level0_px.array_len;
>

Doesn't this need to be array_len - base_layer?  I'm not sure on the others
without digging.


> +            }
> +         } else {
> +            base_layer = obj->MinLayer + u->_Layer;
> +            num_layers = 1;
> +         }
>
>           struct isl_view view = {
>              .format = format,
>              .base_level = obj->MinLevel + u->Level,
>              .levels = 1,
> -            .base_array_layer = obj->MinLayer + u->_Layer,
> +            .base_array_layer = base_layer,
>              .array_len = num_layers,
>              .swizzle = ISL_SWIZZLE_IDENTITY,
>              .usage = ISL_SURF_USAGE_STORAGE_BIT,
> --
> 2.18.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20181113/d4740777/attachment.html>


More information about the mesa-dev mailing list