[Mesa-dev] [PATCH v3 4/5] i965: handle nir_intrinsic_image_size

Francisco Jerez currojerez at riseup.net
Wed Aug 19 08:11:10 PDT 2015


Francisco Jerez <currojerez at riseup.net> writes:

> Martin Peres <martin.peres at linux.intel.com> writes:
>
>> v2, Review from Francisco Jerez:
>> - avoid the camelCase for the booleans
>> - init the booleans using the sampler type
>> - force the initialization of all the components of the output register
>>
>> Signed-off-by: Martin Peres <martin.peres at linux.intel.com>
>> ---
>>  src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 48 ++++++++++++++++++++++++++++++++
>>  1 file changed, 48 insertions(+)
>>
>> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> index ce4153d..cc0a5a6 100644
>> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
>> @@ -1406,6 +1406,54 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
>>        break;
>>     }
>>  
>> +   case nir_intrinsic_image_size: {
>> +      /* Get the referenced image variable and type. */
>> +      const nir_variable *var = instr->variables[0]->var;
>> +      const glsl_type *type = var->type->without_array();
>> +      const brw_reg_type base_type = get_image_base_type(type);
>> +
>> +      /* Get the size of the image. */
>> +      const fs_reg image = get_nir_image_deref(instr->variables[0]);
>> +      const fs_reg size = offset(image, bld, BRW_IMAGE_PARAM_SIZE_OFFSET);
>> +
>> +      /*
>> +       * For 1DArray image types, the array index is stored in the Z component.
>> +       * Fix this by swizzling the Z component to the Y component.
>> +       */
>> +      const bool is_1d_array_image =
>> +              (type->sampler_dimensionality == GLSL_SAMPLER_DIM_1D &&
>> +               type->sampler_array);
>> +
>> +      /*
>> +       * For CubeMapArray images, we should count the number of cubes instead
>> +       * of the number of faces. Fix it by dividing the (Z component) by 6.
>> +       */
>> +      const bool is_cube_map_array_image =
>> +              (type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE &&
>> +               type->sampler_array);
>> +
>> +      /* Copy all the components. */
>> +      const nir_intrinsic_info *info = &nir_intrinsic_infos[instr->intrinsic];
>> +      for (int c = 0; c < info->dest_components; ++c) {
>> +         if (c > type->coordinate_components()) {
>
> Off by one, "c > type->coordinate_components()" is what you probably

Typo -- ">=" is of course what I meant to write. :P

> meant to avoid reading past the end of the size array.
>
>> +             bld.MOV(offset(retype(dest, base_type), bld, c),
>
> base_type is the base data type of the image, i.e. float for
> floating-point or fixed-point normalized image formats.  imageSize
> always returns integer results regardless of the image data type, so
> BRW_REGISTER_TYPE_D is what you want (feel free to factor out the
> offset(retype(dest...)...) expression to a local variable if it gets too
> long).  I guess you were only testing imageSize with integer formats?
>
> With these and the comments from other people addressed this patch is:
>
> Reviewed-by: Francisco Jerez <currojerez at riseup.net>
>
>
>> +                     fs_reg(1));
>> +         } else if (c == 1 && is_1d_array_image) {
>> +            bld.MOV(offset(retype(dest, base_type), bld, c),
>> +                    offset(size, bld, 2));
>> +         } else if (c == 2 && is_cube_map_array_image) {
>> +            bld.emit(SHADER_OPCODE_INT_QUOTIENT,
>> +                     offset(retype(dest, base_type), bld, c),
>> +                     offset(size, bld, c), fs_reg(6));
>> +         } else {
>> +            bld.MOV(offset(retype(dest, base_type), bld, c),
>> +                    offset(size, bld, c));
>> +         }
>> +       }
>> +
>> +      break;
>> +   }
>> +
>>     case nir_intrinsic_load_front_face:
>>        bld.MOV(retype(dest, BRW_REGISTER_TYPE_D),
>>                *emit_frontfacing_interpolation());
>> -- 
>> 2.5.0
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
-------------- 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/20150819/4c633379/attachment.sig>


More information about the mesa-dev mailing list