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? --Jason
On Thu, Jul 23, 2015 at 10:33 AM, Francisco Jerez <curroje...@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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev