[Mesa-dev] [Mesa-stable] [PATCH] i965/fs: Fix hang on IVB and VLV with image format mismatch.
Emil Velikov
emil.l.velikov at gmail.com
Thu Sep 24 03:50:44 PDT 2015
Hi Francisco,
On 9 September 2015 at 18:04, Ian Romanick <idr at freedesktop.org> wrote:
> On 09/09/2015 05:30 AM, Francisco Jerez wrote:
>> Ian Romanick <idr at freedesktop.org> writes:
>>
>>> On 09/03/2015 06:03 AM, Francisco Jerez wrote:
>>>> IVB and VLV hang sporadically when an untyped surface read or write
>>>> message is used to access a surface of format other than RAW, as may
>>>> happen when there is a mismatch between the format qualifier of the
>>>> image uniform and the format of the actual image bound to the
>>>> pipeline. According to the spec this condition gives undefined
>>>> results but may not lead to program termination (which is one of the
>>>> possible outcomes of the hang). Fix it by checking at runtime whether
>>>> the surface is of the right type.
>>>>
>>>> Fixes the "arb_shader_image_load_store.invalid/format mismatch" piglit
>>>> subtest.
>>>>
>>>> Reported-by: Mark Janes <mark.a.janes at intel.com>
>>>> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=91718
>>>> CC: mesa-stable at lists.freedesktop.org
>>>> ---
>>>> .../drivers/dri/i965/brw_fs_surface_builder.cpp | 42 +++++++++++++++++++---
>>>> 1 file changed, 38 insertions(+), 4 deletions(-)
>>>>
>>>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>>>> index f60afc9..57ce87f 100644
>>>> --- a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>>>> +++ b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>>>> @@ -313,12 +313,42 @@ namespace {
>>>>
>>>> namespace image_validity {
>>>> /**
>>>> + * Check whether the bound image is suitable for untyped access.
>>>> + */
>>>> + brw_predicate
>>>> + emit_untyped_image_check(const fs_builder &bld, const fs_reg &image,
>>>> + brw_predicate pred)
>>>> + {
>>>> + const brw_device_info *devinfo = bld.shader->devinfo;
>>>> + const fs_reg stride = offset(image, bld, BRW_IMAGE_PARAM_STRIDE_OFFSET);
>>>> +
>>>> + if (devinfo->gen == 7 && !devinfo->is_haswell) {
>>>> + /* Check whether the first stride component (i.e. the Bpp value)
>>>> + * is greater than four, what on Gen7 indicates that a surface of
>>>> + * type RAW has been bound for untyped access. Reading or writing
>>>> + * to a surface of type other than RAW using untyped surface
>>>> + * messages causes a hang on IVB and VLV.
>>>> + */
>>>> + set_predicate(pred,
>>>> + bld.CMP(bld.null_reg_ud(), stride, fs_reg(4),
>>>> + BRW_CONDITIONAL_G));
>>>> +
>>>> + return BRW_PREDICATE_NORMAL;
>>>> + } else {
>>>> + /* More recent generations handle the format mismatch
>>>> + * gracefully.
>>>> + */
>>>> + return pred;
>>>> + }
>>>> + }
>>>> +
>>>> + /**
>>>> * Check whether there is an image bound at the given index and write
>>>> * the comparison result to f0.0. Returns an appropriate predication
>>>> * mode to use on subsequent image operations.
>>>> */
>>>> brw_predicate
>>>> - emit_surface_check(const fs_builder &bld, const fs_reg &image)
>>>> + emit_typed_atomic_check(const fs_builder &bld, const fs_reg &image)
>>>
>>> This change seems spurious (and also reasonable).
>>>
>> The problem is that this patch introduces a new kind of surface check
>> applicable to untyped surface reads and writes only, so it would have
>> been confusing to keep the other surface check which is applicable to
>> atomics only with its previous rather unspecific name.
>>
>>>> {
>>>> const brw_device_info *devinfo = bld.shader->devinfo;
>>>> const fs_reg size = offset(image, bld, BRW_IMAGE_PARAM_SIZE_OFFSET);
>>>> @@ -895,7 +925,9 @@ namespace brw {
>>>> * surface read on the result,
>>>> */
>>>> const brw_predicate pred =
>>>> - emit_bounds_check(bld, image, saddr, dims);
>>>> + emit_untyped_image_check(bld, image,
>>>> + emit_bounds_check(bld, image,
>>>> + saddr, dims));
>>>
>>> These appear to be the only two users of emit_bounds_check... shouldn't
>>> the bounds still be tested?
>>>
>> Yes, they are still.
>
> Ah... I completely missed that emit_bounds_check was moved into a
> parameter of the call to emit_untyped_image_check.
>
> Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
>
Considering Ian's r-b, are there any obstacles why this hasn't landed
in master yet ?
Thanks
Emil
More information about the mesa-dev
mailing list