--- src/compiler/glsl/link_varyings.cpp | 16 +++++++++++++--- src/compiler/nir/nir_lower_io.c | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-)
diff --git a/src/compiler/glsl/link_varyings.cpp b/src/compiler/glsl/link_varyings.cpp index 35f97a9..31faaa1 100644 --- a/src/compiler/glsl/link_varyings.cpp +++ b/src/compiler/glsl/link_varyings.cpp @@ -1995,10 +1995,11 @@ set_num_packed_components(struct gl_shader *shader, ir_variable_mode io_mode, var->type->without_array()->is_matrix()) continue; + unsigned dfrac = var->type->without_array()->is_double() ? 2 : 1; if (var->type->is_array()) { const glsl_type *type = get_varying_type(var, shader->Stage); unsigned array_components = type->without_array()->vector_elements + - var->data.location_frac; + var->data.location_frac / dfrac; assert(type->arrays_of_arrays_size() + idx <= ARRAY_SIZE(num_components)); for (unsigned i = idx; i < type->arrays_of_arrays_size(); i++) { @@ -2006,7 +2007,7 @@ set_num_packed_components(struct gl_shader *shader, ir_variable_mode io_mode, } } else { unsigned comps = var->type->vector_elements + - var->data.location_frac; + var->data.location_frac / dfrac; num_components[idx] = MAX2(comps, num_components[idx]); } } @@ -2034,7 +2035,16 @@ set_num_packed_components(struct gl_shader *shader, ir_variable_mode io_mode, c = MAX2(c, num_components[i]); } } else { - c = num_components[idx]; + /* Handle special case of packing dvec3 with a double. The only + * valid scenario is packing a double in the 4th component of the + * double vector. + */ + if (var->type->is_double() && var->type->vector_elements == 3 && + num_components[idx+1] == 2) { + c = 4; + } else { + c = num_components[idx]; + } } var->data.num_packed_components = c; } diff --git a/src/compiler/nir/nir_lower_io.c b/src/compiler/nir/nir_lower_io.c index b966348..5566c83 100644 --- a/src/compiler/nir/nir_lower_io.c +++ b/src/compiler/nir/nir_lower_io.c @@ -104,6 +104,22 @@ 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. + */ + 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) + calc_type_size_offset(var->data.num_packed_components, var->type, type_size); -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev