Martin Peres <martin.pe...@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.pe...@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 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 <curroje...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev