Francisco Jerez <curroje...@riseup.net> writes: > 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
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 <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