[Mesa-dev] [PATCH 7/9] i965/fs: Handle VS inputs in the NIR backend.
Jason Ekstrand
jason at jlekstrand.net
Wed Mar 11 15:28:41 PDT 2015
I think I mentioned this at least once before, but I don't think that this
is a good long-term solution. The nir_lower_io function does two things
primarily. 1) It assigns each variable a "device location" and 2) changes
the variable loads to loads with an offset. In the long-term, I think we
want to split 1) out and let the backend control what "device location"
gets assigned to each input/output. Then, add a knob to 2) to select how
we want things packed. Doing this will let us avoid this whole re-mapping
mess and, in the case of uniforms, better control things so that we can
push some of them. That said, this is *not* a NAK of the current patch.
If you want to hold off on that for a while, this looks ok.
--Jason
On Mon, Mar 9, 2015 at 1:58 AM, Kenneth Graunke <kenneth at whitecape.org>
wrote:
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index 3baafc4..1734d03 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -199,11 +199,32 @@ fs_visitor::nir_setup_inputs(nir_shader *shader)
> struct hash_entry *entry;
> hash_table_foreach(shader->inputs, entry) {
> nir_variable *var = (nir_variable *) entry->data;
> + enum brw_reg_type type = brw_type_for_base_type(var->type);
> fs_reg input = offset(nir_inputs, var->data.driver_location);
>
> fs_reg reg;
> switch (stage) {
> - case MESA_SHADER_VERTEX:
> + case MESA_SHADER_VERTEX: {
> + /* Our ATTR file is indexed by VERT_ATTRIB_*, which is the value
> + * stored in nir_variable::location.
> + *
> + * However, NIR's load_input intrinsics use a different index -
> an
> + * offset into a single contiguous array containing all inputs.
> + * This index corresponds to the nir_variable::driver_location
> field.
> + *
> + * So, we need to copy from fs_reg(ATTR, var->location) to
> + * offset(nir_inputs, var->data.driver_location).
> + */
> + unsigned components = var->type->without_array()->components();
> + unsigned array_length = var->type->is_array() ?
> var->type->length : 1;
> + for (unsigned i = 0; i < array_length; i++) {
> + for (unsigned j = 0; j < components; j++) {
> + emit(MOV(retype(offset(input, components * i + j), type),
> + offset(fs_reg(ATTR, var->data.location + i,
> type), j)));
> + }
> + }
> + break;
> + }
> case MESA_SHADER_GEOMETRY:
> case MESA_SHADER_COMPUTE:
> unreachable("fs_visitor not used for these stages yet.");
> --
> 2.2.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150311/d8e108b7/attachment.html>
More information about the mesa-dev
mailing list