[Mesa-dev] [PATCH 6/9] isl: Validate the calculated row pitch (v2)
Jason Ekstrand
jason at jlekstrand.net
Thu Mar 23 19:22:27 UTC 2017
On Wed, Mar 22, 2017 at 6:04 PM, Chad Versace <chadversary at chromium.org>
wrote:
> Validate that isl_surf::row_pitch fits in the below bitfields,
> if applicable based on isl_surf::usage.
>
> RENDER_SURFACE_STATE::SurfacePitch
> RENDER_SURFACE_STATE::AuxiliarySurfacePitch
> 3DSTATE_DEPTH_BUFFER::SurfacePitch
> 3DSTATE_HIER_DEPTH_BUFFER::SurfacePitch
>
> v2: Add a Makefile dependency on generated header genX_bits.h.
> ---
> src/intel/Makefile.isl.am | 3 ++
> src/intel/isl/isl.c | 72 ++++++++++++++++++++++++++++++
> +++++++++++++----
> 2 files changed, 69 insertions(+), 6 deletions(-)
>
> diff --git a/src/intel/Makefile.isl.am b/src/intel/Makefile.isl.am
> index ee2215df1d1..09a10281b45 100644
> --- a/src/intel/Makefile.isl.am
> +++ b/src/intel/Makefile.isl.am
> @@ -63,6 +63,9 @@ isl/isl_format_layout.c: isl/gen_format_layout.py \
> $(PYTHON_GEN) $(srcdir)/isl/gen_format_layout.py \
> --csv $(srcdir)/isl/isl_format_layout.csv --out $@
>
> +# Dependencies on generated files
> +$(builddir)/isl/isl.o: $(srcdir)/genxml/genX_bits.h
> +
> # ------------------------------------------------------------
> ----------------
> # Tests
> # ------------------------------------------------------------
> ----------------
> diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
> index 81f40b6a6fb..f86ca4f9212 100644
> --- a/src/intel/isl/isl.c
> +++ b/src/intel/isl/isl.c
> @@ -25,6 +25,8 @@
> #include <stdarg.h>
> #include <stdio.h>
>
> +#include "genxml/genX_bits.h"
> +
> #include "isl.h"
> #include "isl_gen4.h"
> #include "isl_gen6.h"
> @@ -1089,18 +1091,74 @@ isl_calc_min_row_pitch(const struct isl_device
> *dev,
> }
> }
>
> -static uint32_t
> +/**
> + * Is `pitch` in the valid range for a hardware bitfield, if the
> bitfield's
> + * size is `bits` bits?
> + *
> + * Hardware pitch fields are offset by 1. For example, if the size of
> + * RENDER_SURFACE_STATE::SurfacePitch is B bits, then the range of valid
> + * pitches is [1, 2^b] inclusive. If the surface pitch is N, then
> + * RENDER_SURFACE_STATE::SurfacePitch must be set to N-1.
> + */
> +static bool
> +pitch_in_range(uint32_t n, uint32_t bits)
> +{
> + assert(n != 0);
> + return likely(bits != 0 && 1 <= n && n <= (1 << bits));
> +}
> +
> +static bool
> isl_calc_row_pitch(const struct isl_device *dev,
> const struct isl_surf_init_info *surf_info,
> const struct isl_tile_info *tile_info,
> enum isl_dim_layout dim_layout,
> - const struct isl_extent2d *phys_slice0_sa)
> + const struct isl_extent2d *phys_slice0_sa,
> + uint32_t *out_row_pitch)
> {
> + const int gen_10x = gen_get_version_10x(dev->info);
> +
> const uint32_t alignment =
> isl_calc_row_pitch_alignment(surf_info, tile_info);
>
> - return isl_calc_min_row_pitch(dev, surf_info, tile_info,
> phys_slice0_sa,
> - alignment);
> + const uint32_t row_pitch =
> + isl_calc_min_row_pitch(dev, surf_info, tile_info, phys_slice0_sa,
> + alignment);
> +
> + const uint32_t row_pitch_tiles = row_pitch / tile_info->phys_extent_B.
> width;
> +
> + if (row_pitch == 0)
> + return false;
> +
> + if (dim_layout == ISL_DIM_LAYOUT_GEN9_1D) {
> + /* SurfacePitch is ignored for this layout.How should we validate
> it? */
> + isl_finishme("validate row pitch for ISL_DIM_LAYOUT_GEN9_1D");
> + goto done;
> + }
> +
> + if (((surf_info->usage & ISL_SURF_USAGE_RENDER_TARGET_BIT) ||
> + (surf_info->usage & ISL_SURF_USAGE_TEXTURE_BIT)) &&
>
We also want to handle STORAGE_BIT
> + !pitch_in_range(row_pitch, RENDER_SURFACE_STATE_
> SurfacePitch_bits(gen_10x)))
> + return false;
> +
> + if (((surf_info->usage & ISL_SURF_USAGE_CCS_BIT) ||
> + (surf_info->usage & ISL_SURF_USAGE_MCS_BIT)) &&
> + !pitch_in_range(row_pitch_tiles, RENDER_SURFACE_STATE_
> AuxiliarySurfacePitch_bits(gen_10x)))
> + return false;
> +
> + if ((surf_info->usage & ISL_SURF_USAGE_DEPTH_BIT) &&
> + !pitch_in_range(row_pitch, _3DSTATE_DEPTH_BUFFER_
> SurfacePitch_bits(gen_10x)))
> + return false;
> +
> + if ((surf_info->usage & ISL_SURF_USAGE_HIZ_BIT) &&
> + !pitch_in_range(row_pitch, _3DSTATE_HIER_DEPTH_BUFFER_
> SurfacePitch_bits(gen_10x)))
> + return false;
> +
> + if (surf_info->usage & ISL_SURF_USAGE_STENCIL_BIT)
> + isl_finishme("validate row pitch of stencil surfaces");
>
How hard is this? I assume it's not trivial or you would have done it.
> +
> + done:
> + *out_row_pitch = row_pitch;
> + return true;
> }
>
> /**
> @@ -1275,8 +1333,10 @@ isl_surf_init_s(const struct isl_device *dev,
> uint32_t pad_bytes;
> isl_apply_surface_padding(dev, info, &tile_info, &total_h_el,
> &pad_bytes);
>
> - const uint32_t row_pitch = isl_calc_row_pitch(dev, info, &tile_info,
> - dim_layout,
> &phys_slice0_sa);
> + uint32_t row_pitch;
> + if (!isl_calc_row_pitch(dev, info, &tile_info, dim_layout,
> + &phys_slice0_sa, &row_pitch))
> + return false;
>
> uint32_t size, base_alignment;
> if (tiling == ISL_TILING_LINEAR) {
> --
> 2.12.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/20170323/45a92a7a/attachment.html>
More information about the mesa-dev
mailing list