[Mesa-dev] [Mesa-stable] [PATCH] i965/fs: Fix hang on IVB and VLV with image format mismatch.
Francisco Jerez
currojerez at riseup.net
Sat Sep 26 13:28:28 PDT 2015
Emil Velikov <emil.l.velikov at gmail.com> writes:
> 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 ?
>
Nope, sorry, I've been on vacation and with intermittent connectivity
since it was reviewed, I'll push the patch on Monday if no-one beats me
to it.
> Thanks
> Emil
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150926/6e06d62d/attachment.sig>
More information about the mesa-dev
mailing list