The caller does so by setting the new field
isl_surf_init_info::row_pitch, which overrides isl's row pitch
calculation.
---
 src/intel/isl/isl.c | 11 ++++++++++-
 src/intel/isl/isl.h |  9 +++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
index a91c3f92bcf..b3ac305b81b 100644
--- a/src/intel/isl/isl.c
+++ b/src/intel/isl/isl.c
@@ -1005,6 +1005,9 @@ isl_calc_linear_row_pitch(const struct isl_device *dev,
 {
    const struct isl_format_layout *fmtl = isl_format_get_layout(info->format);
 
+   /* Any override of row_pitch should happen earlier. */
+   assert(info->row_pitch == 0);
+
    uint32_t row_pitch = info->min_row_pitch;
 
    /* First, align the surface to a cache line boundary, as the PRM explains
@@ -1088,6 +1091,9 @@ isl_calc_tiled_row_pitch(const struct isl_device *dev,
 {
    const struct isl_format_layout *fmtl = isl_format_get_layout(info->format);
 
+   /* Any override of row_pitch should happen earlier. */
+   assert(info->row_pitch == 0);
+
    assert(fmtl->bpb % tile_info->format_bpb == 0);
    assert(phys_slice0_sa->w % fmtl->bw == 0);
 
@@ -1112,7 +1118,10 @@ isl_calc_row_pitch(const struct isl_device *dev,
                    const struct isl_tile_info *tile_info,
                    const struct isl_extent2d *phys_slice0_sa)
 {
-   if (tile_info->tiling == ISL_TILING_LINEAR) {
+   if (info->row_pitch != 0) {
+      /* Override the usual calculation and validation. */
+      return info->row_pitch;
+   } else if (tile_info->tiling == ISL_TILING_LINEAR) {
       return isl_calc_linear_row_pitch(dev, info, phys_slice0_sa);
    } else {
       return isl_calc_tiled_row_pitch(dev, info, tile_info, phys_slice0_sa);
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index e517f11cf5e..5f73639fb48 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -813,6 +813,15 @@ struct isl_surf_init_info {
    /** Lower bound for isl_surf::row_pitch, in bytes. */
    uint32_t min_row_pitch;
 
+   /**
+    * Exact value for isl_surf::row_pitch. Ignored if zero.
+    *
+    * WARNING: If set, then isl_surf_init() skips many calculations and
+    * validations. If the given row pitch is incompatible with the requested
+    * surface, then behavior is undefined.
+    */
+   uint32_t row_pitch;
+
    isl_surf_usage_flags_t usage;
 
    /** Flags that alter how ISL selects isl_surf::tiling.  */
-- 
2.12.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to