From cba6657d8ba57fddf72bbe3c96e8aee997a1527d Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Tue, 19 Jul 2016 15:40:14 +1000 Subject: [PATCH] nir: add doubles component packing support MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This makes sure we give the correct driver location for doubles when using component packing. Specifically it handles packing a dvec3 with a double which is the only packing scenario allowed which spans across two locations. Acked-by: Kenneth Graunke Reviewed-by: Alejandro Piñeiro --- src/compiler/nir/nir_lower_io.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index 4d191feb53e..bf8296f5b12 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -74,6 +74,26 @@ nir_assign_var_locations(struct exec_list *var_list, unsigned *size, if (locations[idx][var->data.index] == -1) { var->data.driver_location = location; locations[idx][var->data.index] = location; + + /* A dvec3 can be packed with a double we need special handling + * for this as we are packing across two locations. + */ + if (glsl_get_base_type(var->type) == GLSL_TYPE_DOUBLE && + glsl_get_vector_elements(var->type) == 3) { + /* Hack around type_size functions that expect vectors to be + * padded out to vec4. If a float type is the same size as a + * double then the type size is padded to vec4, otherwise + * set the offset to two doubles which offsets the location + * past the first two components in dvec3 which were stored at + * the previous location. + */ + unsigned dsize = type_size(glsl_double_type()); + unsigned offset = + dsize == type_size(glsl_float_type()) ? dsize : dsize * 2; + + locations[idx + 1][var->data.index] = location + offset; + } + location += type_size(var->type); } else { var->data.driver_location = locations[idx][var->data.index]; -- 2.30.2