[Mesa-dev] [PATCH 7.5/20] i965/fs: Import code to transform image coordinates into surface coordinates.

Francisco Jerez currojerez at riseup.net
Thu Jul 23 11:52:37 PDT 2015


Jason Ekstrand <jason at jlekstrand.net> writes:

> This moves the calculations to near other stuff.  Can't we make
> emit_image_load/store() take both dims and is_array parameters and
> have it do the adjustment?

Yeah, that's sort of what I did, see v4 of PATCH 10/20.

> --Jason
>
> On Thu, Jul 23, 2015 at 10:33 AM, Francisco Jerez <currojerez at riseup.net> wrote:
>> Accounting for the padding required for 1D arrays in certain cases.
>> ---
>>  .../drivers/dri/i965/brw_fs_surface_builder.cpp    | 52 ++++++++++++++++++++++
>>  1 file changed, 52 insertions(+)
>>
>> 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 0c879db..e6a3115 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_surface_builder.cpp
>> @@ -218,6 +218,58 @@ namespace {
>>
>>     namespace image_coordinates {
>>        /**
>> +       * Return the total number of coordinates needed to address a texel of
>> +       * the surface, which may be more than the sum of \p surf_dims and \p
>> +       * arr_dims if padding is required.
>> +       */
>> +      unsigned
>> +      num_image_coordinates(const fs_builder &bld,
>> +                            unsigned surf_dims, unsigned arr_dims,
>> +                            mesa_format format)
>> +      {
>> +         /* HSW in vec4 mode and our software coordinate handling for untyped
>> +          * reads want the array index to be at the Z component.
>> +          */
>> +         const bool array_index_at_z =
>> +            !image_format_info::has_matching_typed_format(
>> +               bld.shader->devinfo, format);
>> +         const unsigned zero_dims =
>> +            (surf_dims == 1 && arr_dims == 1 && array_index_at_z ? 1 : 0);
>> +
>> +         return surf_dims + zero_dims + arr_dims;
>> +      }
>> +
>> +      /**
>> +       * Transform image coordinates into the form expected by the
>> +       * implementation.
>> +       */
>> +      fs_reg
>> +      emit_image_coordinates(const fs_builder &bld, const fs_reg &addr,
>> +                             unsigned surf_dims, unsigned arr_dims,
>> +                             mesa_format format)
>> +      {
>> +         const unsigned dims =
>> +            num_image_coordinates(bld, surf_dims, arr_dims, format);
>> +
>> +         if (dims > surf_dims + arr_dims) {
>> +            assert(surf_dims == 1 && arr_dims == 1 && dims == 3);
>> +            /* The array index is required to be passed in as the Z component,
>> +             * insert a zero at the Y component to shift it to the right
>> +             * position.
>> +             *
>> +             * FINISHME: Factor out this frequently recurring pattern into a
>> +             * helper function.
>> +             */
>> +            const fs_reg srcs[] = { addr, fs_reg(0), offset(addr, bld, 1) };
>> +            const fs_reg dst = bld.vgrf(addr.type, dims);
>> +            bld.LOAD_PAYLOAD(dst, srcs, dims, 0);
>> +            return dst;
>> +         } else {
>> +            return addr;
>> +         }
>> +      }
>> +
>> +      /**
>>         * Calculate the offset in memory of the texel given by \p coord.
>>         *
>>         * This is meant to be used with untyped surface messages to access a
>> --
>> 2.4.3
>>
-------------- 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/20150723/f4092d55/attachment.sig>


More information about the mesa-dev mailing list