[Mesa-dev] [PATCH v2 1/2] isl: introduce depth pitch query function

Jason Ekstrand jason at jlekstrand.net
Fri Dec 9 17:07:20 UTC 2016


On Fri, Dec 9, 2016 at 8:45 AM, Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:

> On 08/12/16 19:19, Jason Ekstrand wrote:
>
> On Dec 8, 2016 8:48 AM, "Lionel Landwerlin" <llandwerlin at gmail.com> wrote:
>
> v2: add lod level argument (Jason)
>     return 0 for any lod level > 0 (Jason)
>     return 0 for any surface not 3D (Jason)
>
>
> I'd rather have ISL assert these than just silently return 0.  That way
> it's clear they make no sense.  We can have a dimension check in the Vulkan
> driver where it calls this function.
>
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> ---
>  src/intel/Makefile.isl.am                          |  10 +-
>  src/intel/isl/isl.c                                |  28 +++
>  src/intel/isl/isl.h                                |  11 +
>  src/intel/isl/tests/.gitignore                     |   1 +
>  .../tests/isl_surf_get_image_depth_pitch_test.c    | 245
> +++++++++++++++++++++
>  5 files changed, 294 insertions(+), 1 deletion(-)
>  create mode 100644 src/intel/isl/tests/isl_surf_g
> et_image_depth_pitch_test.c
>
> diff --git a/src/intel/Makefile.isl.am b/src/intel/Makefile.isl.am
> index 5a317f522b..eb788f4a13 100644
> --- a/src/intel/Makefile.isl.am
> +++ b/src/intel/Makefile.isl.am
> @@ -67,10 +67,18 @@ isl/isl_format_layout.c: isl/gen_format_layout.py \
>  #  Tests
>  # ------------------------------------------------------------
> ----------------
>
> -check_PROGRAMS += isl/tests/isl_surf_get_image_offset_test
> +check_PROGRAMS += \
> +       isl/tests/isl_surf_get_image_depth_pitch_test \
> +       isl/tests/isl_surf_get_image_offset_test
>
>  TESTS += $(check_PROGRAMS)
>
> +isl_tests_isl_surf_get_image_depth_pitch_test_LDADD = \
> +       common/libintel_common.la \
> +       isl/libisl.la \
> +       $(top_builddir)/src/mesa/drivers/dri/i965/libi965_compiler.la \
> +       -lm
> +
>  isl_tests_isl_surf_get_image_offset_test_LDADD = \
>         common/libintel_common.la \
>         isl/libisl.la \
> diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
> index 82ab68dc65..0d61cd7cdc 100644
> --- a/src/intel/isl/isl.c
> +++ b/src/intel/isl/isl.c
> @@ -1874,3 +1874,31 @@ isl_surf_get_depth_format(const struct isl_device
> *dev,
>        return 5; /* D16_UNORM */
>     }
>  }
> +
> +uint32_t
> +isl_surf_get_depth_pitch(const struct isl_device *device,
>
>
> Could you please put some units on this function?
>
> +                         const struct isl_surf *surf,
> +                         uint32_t level)
> +{
> +   switch (surf->dim_layout) {
> +   case ISL_DIM_LAYOUT_GEN9_1D:
> +   case ISL_DIM_LAYOUT_GEN4_2D:
> +      return 0;
>
>
> This isn't right.  On Sky Lake and above, 3D surfaces have the GEN4_2D
> layout.  The depth pitch does make sense here and it's equal to the array
> pitch for all miplevels.
>
>
> So should that return the array pitch for GEN4_2D layout just on Skylake
> or other generations too?
>

Anything that does GEN4_2D for 3D textures.  I think what I'd do is
something like this:

assert(surf->dim == ISL_SURF_DIM_3D);
switch (surf->dim_layout) {
case ISL_DIM_LAYOUT_GEN4_2D:
   return isl_surf_get_array_pitch(surf);
case ISL_DIM_LAYOUT_GEN4_3D:
   /* Depth pitch doesn't make sense for gen4 3D textures at LOD1 and above
*/
   assert(level == 0);
   return isl_align(isl_align_div_npot(surf->phys_level0_sa.h,

isl_format_get_layout(surf->format)->bh,
                            surf->image_align_el.h);
case ISL_DIM_LAYOUT_GEN9_1D:
default:
   unreachable("Invalid layout for a 3D texture");
}

or something along those lines.


>
>
> +   case ISL_DIM_LAYOUT_GEN4_3D: {
> +      if (level > 0)
> +         return 0;
> +
> +      if (surf->tiling == ISL_TILING_LINEAR)
> +         return surf->row_pitch * surf->phys_level0_sa.h;
> +
> +      struct isl_tile_info tile_info;
> +      isl_surf_get_tile_info(device, surf, &tile_info);
> +
> +      return surf->row_pitch * isl_align(surf->phys_level0_sa.h,
> +                                         surf->image_alignment_el.h);
>
>
> This calculation isn't right.  In both cases, it should simply be the
> height of lod0 aligned to the surface vertical alignment.  It has nothing
> to do with tiling so fat as I know.
>
> +      }
> +   default:
> +      unreachable("bad isl_dim_layout");
> +      break;
> +   }
> +}
> diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
> index 07368f9bcf..7c033f380c 100644
> --- a/src/intel/isl/isl.h
> +++ b/src/intel/isl/isl.h
> @@ -1388,10 +1388,21 @@ isl_surf_get_array_pitch_sa_rows(const struct
> isl_surf *surf)
>  static inline uint32_t
>  isl_surf_get_array_pitch(const struct isl_surf *surf)
>  {
> +   if (surf->dim_layout == ISL_DIM_LAYOUT_GEN4_3D)
> +      return 0;
>     return isl_surf_get_array_pitch_sa_rows(surf) * surf->row_pitch;
>  }
>
>  /**
> + * Pitch between depth slices, in bytes (for 2D images, this should be
> + * equivalent to isl_surf_get_array_pitch()).
> + */
> +uint32_t
> +isl_surf_get_depth_pitch(const struct isl_device *device,
> +                         const struct isl_surf *surf,
> +                         uint32_t level);
> +
> +/**
>   * Calculate the offset, in units of surface samples, to a subimage in the
>   * surface.
>   *
> diff --git a/src/intel/isl/tests/.gitignore b/src/intel/isl/tests/.gitigno
> re
> index ba70ecfbee..e90b4a4a97 100644
> --- a/src/intel/isl/tests/.gitignore
> +++ b/src/intel/isl/tests/.gitignore
> @@ -1 +1,2 @@
> +/isl_surf_get_image_depth_pitch_test
>  /isl_surf_get_image_offset_test
> diff --git a/src/intel/isl/tests/isl_surf_get_image_depth_pitch_test.c
> b/src/intel/isl/tests/isl_surf_get_image_depth_pitch_test.c
> new file mode 100644
> index 0000000000..d59ad9b2a9
> --- /dev/null
> +++ b/src/intel/isl/tests/isl_surf_get_image_depth_pitch_test.c
> @@ -0,0 +1,245 @@
> +/*
> + * Copyright 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"),
> + * to deal in the Software without restriction, including without
> limitation
> + * the rights to use, copy, modify, merge, publish, distribute,
> sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> next
> + * paragraph) shall be included in all copies or substantial portions of
> the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT
> SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> + * DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include <assert.h>
> +#include <stdbool.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +#include "common/gen_device_info.h"
> +#include "isl/isl.h"
> +#include "isl/isl_priv.h"
> +
> +#define BDW_GT2_DEVID 0x161a
> +
> +// An asssert that works regardless of NDEBUG.
> +#define t_assert(cond) \
> +   do { \
> +      if (!(cond)) { \
> +         fprintf(stderr, "%s:%d: assertion failed\n", __FILE__,
> __LINE__); \
> +         abort(); \
> +      } \
> +   } while (0)
> +
> +static void
> +test_bdw_2d_r8g8b8a8_unorm_42x43_levels09_tiley0(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_2D,
> +                      .format = ISL_FORMAT_R8G8B8A8_UNORM,
> +                      .width = 42,
> +                      .height = 43,
> +                      .depth = 1,
> +                      .levels = 9,
> +                      .array_len = 1,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_Y0_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch == 0);
> +}
> +
> +static void
> +test_bdw_3d_r8g8b8a8_unorm_256x256x256_levels09_tiley0(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_3D,
> +                      .format = ISL_FORMAT_R8G8B8A8_UNORM,
> +                      .width = 256,
> +                      .height = 256,
> +                      .depth = 256,
> +                      .levels = 9,
> +                      .array_len = 1,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_Y0_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch >= 256 * 256 * 4);
> +   t_assert(depth_pitch % 4096 == 0);
> +}
> +
> +static void
> +test_bdw_3d_r8g8b8a8_unorm_256x256x256_levels09_linear(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_3D,
> +                      .format = ISL_FORMAT_R8G8B8A8_UNORM,
> +                      .width = 256,
> +                      .height = 256,
> +                      .depth = 256,
> +                      .levels = 1,
> +                      .array_len = 1,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_LINEAR_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch >= 256 * 256 * 4);
> +}
> +
> +static void
> +test_bdw_3d_r8g8b8_unorm_256x256x256_levels09_linear(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_3D,
> +                      .format = ISL_FORMAT_R8G8B8_UNORM,
> +                      .width = 256,
> +                      .height = 256,
> +                      .depth = 256,
> +                      .levels = 1,
> +                      .array_len = 1,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_LINEAR_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch >= 256 * 256 * 3);
> +}
> +
> +static void
> +test_bdw_2d_r8g8b8a8_unorm_256x256x256_levels09_linear(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_2D,
> +                      .format = ISL_FORMAT_R8G8B8A8_UNORM,
> +                      .width = 256,
> +                      .height = 256,
> +                      .depth = 1,
> +                      .levels = 1,
> +                      .array_len = 256,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_LINEAR_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch == 0);
> +}
> +
> +static void
> +test_bdw_1d_r8g8b8a8_unorm_256_levels09_linear(void)
> +{
> +   bool ok;
> +
> +   struct gen_device_info devinfo;
> +   t_assert(gen_get_device_info(BDW_GT2_DEVID, &devinfo));
> +
> +   struct isl_device dev;
> +   isl_device_init(&dev, &devinfo, /*bit6_swizzle*/ false);
> +
> +   struct isl_surf surf;
> +   ok = isl_surf_init(&dev, &surf,
> +                      .dim = ISL_SURF_DIM_1D,
> +                      .format = ISL_FORMAT_R8G8B8A8_UNORM,
> +                      .width = 256,
> +                      .height = 1,
> +                      .depth = 1,
> +                      .levels = 1,
> +                      .array_len = 1,
> +                      .samples = 1,
> +                      .usage = ISL_SURF_USAGE_TEXTURE_BIT |
> +                               ISL_SURF_USAGE_DISABLE_AUX_BIT,
> +                      .tiling_flags = ISL_TILING_LINEAR_BIT);
> +   t_assert(ok);
> +
> +   uint32_t depth_pitch =
> +      isl_surf_get_depth_pitch(&dev, &surf, 0);
> +
> +   t_assert(depth_pitch == 0);
> +}
> +
> +int main(void)
> +{
> +   test_bdw_2d_r8g8b8a8_unorm_42x43_levels09_tiley0();
> +   test_bdw_3d_r8g8b8a8_unorm_256x256x256_levels09_tiley0();
> +   test_bdw_3d_r8g8b8a8_unorm_256x256x256_levels09_linear();
> +   test_bdw_3d_r8g8b8_unorm_256x256x256_levels09_linear();
> +   test_bdw_2d_r8g8b8a8_unorm_256x256x256_levels09_linear();
> +   test_bdw_1d_r8g8b8a8_unorm_256_levels09_linear();
> +}
> --
> 2.11.0
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20161209/0c0bca42/attachment-0001.html>


More information about the mesa-dev mailing list