[Mesa-dev] [PATCH] intel: Use a URB start offset of 0 for disabled stages.
Jordan Justen
jordan.l.justen at intel.com
Fri Nov 2 07:38:25 UTC 2018
Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
On 2018-11-01 20:01:36, Kenneth Graunke wrote:
> There are some cases where the VS is the only stage enabled, it uses the
> entire URB, and the URB is large enough that placing later stages after
> the VS exceeds the number of bits for "URB Starting Address".
>
> For example, on Icelake GT2, "varying-packing-simple mat2x4 array" from
> Piglit is getting a starting offset of 128 for the GS/HS/DS. But the
> field is only large enough to hold an offset of 127.
>
> i965 doesn't hit any genxml assertions because it's still using the old
> OUT_BATCH mechanism. 128 << GEN7_URB_STARTING_ADDRESS_SHIFT (57) == 0,
> with the extra bit falling off the end. So we place the disabled stage
> at the beginning of the URB (overlapping with push constants). This is
> likely okay since it's a zero size region (0 entries).
>
> It seems like the Vulkan driver might hit this assertion, however, and
> the situation seems harmless. To work around this, always place
> disabled stages at the start of the URB, so the last enabled stage can
> fill the remaining space without overflowing the field.
> ---
> src/intel/common/gen_urb_config.c | 12 +++++++++---
> 1 file changed, 9 insertions(+), 3 deletions(-)
>
> diff --git a/src/intel/common/gen_urb_config.c b/src/intel/common/gen_urb_config.c
> index 0b632149cd9..1440dd713e9 100644
> --- a/src/intel/common/gen_urb_config.c
> +++ b/src/intel/common/gen_urb_config.c
> @@ -195,8 +195,14 @@ gen_get_urb_config(const struct gen_device_info *devinfo,
> }
>
> /* Lay out the URB in pipeline order: push constants, VS, HS, DS, GS. */
> - start[0] = push_constant_chunks;
> - for (int i = MESA_SHADER_TESS_CTRL; i <= MESA_SHADER_GEOMETRY; i++) {
> - start[i] = start[i - 1] + chunks[i - 1];
> + int next = push_constant_chunks;
> + for (int i = MESA_SHADER_VERTEX; i <= MESA_SHADER_GEOMETRY; i++) {
> + if (entries[i]) {
> + start[i] = next;
> + next += chunks[i];
> + } else {
> + /* Just put disabled stages at the beginning. */
> + start[i] = 0;
> + }
> }
> }
> --
> 2.19.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list