[Mesa-dev] [PATCH v2 28/31] glsl: lower bindless sampler/image packed varyings
Nicolai Hähnle
nhaehnle at gmail.com
Wed Apr 26 08:03:34 UTC 2017
On 24.04.2017 12:35, Samuel Pitoiset wrote:
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
> src/compiler/glsl/lower_packed_varyings.cpp | 24 ++++++++++++++++++++----
> 1 file changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/src/compiler/glsl/lower_packed_varyings.cpp b/src/compiler/glsl/lower_packed_varyings.cpp
> index b1a3b49b1d..c9e1c66d48 100644
> --- a/src/compiler/glsl/lower_packed_varyings.cpp
> +++ b/src/compiler/glsl/lower_packed_varyings.cpp
> @@ -383,6 +383,12 @@ lower_packed_varyings_visitor::bitwise_assign_pack(ir_rvalue *lhs,
> rhs = u2i(expr(ir_unop_unpack_uint_2x32, rhs));
> }
> break;
> + case GLSL_TYPE_SAMPLER:
> + rhs = u2i(expr(ir_unop_unpack_sampler_2x32, rhs));
> + break;
> + case GLSL_TYPE_IMAGE:
> + rhs = u2i(expr(ir_unop_unpack_image_2x32, rhs));
> + break;
> default:
> assert(!"Unexpected type conversion while lowering varyings");
> break;
> @@ -462,6 +468,14 @@ lower_packed_varyings_visitor::bitwise_assign_unpack(ir_rvalue *lhs,
> rhs = expr(ir_unop_pack_uint_2x32, i2u(rhs));
> }
> break;
> + case GLSL_TYPE_SAMPLER:
> + rhs = new(mem_ctx)
> + ir_expression(ir_unop_pack_sampler_2x32, lhs->type, i2u(rhs));
> + break;
> + case GLSL_TYPE_IMAGE:
> + rhs = new(mem_ctx)
> + ir_expression(ir_unop_pack_image_2x32, lhs->type, i2u(rhs));
> + break;
> default:
> assert(!"Unexpected type conversion while lowering varyings");
> break;
> @@ -501,6 +515,9 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> unsigned vertex_index)
> {
> unsigned dmul = rvalue->type->is_64bit() ? 2 : 1;
> + unsigned vector_elements =
> + rvalue->type->is_sampler() ? 1 : rvalue->type->vector_elements;
Same observation as in the previous patch.
Cheers,
Nicolai
> /* When gs_input_toplevel is set, we should be looking at a geometry shader
> * input array.
> */
> @@ -534,8 +551,7 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> return this->lower_arraylike(rvalue, rvalue->type->matrix_columns,
> fine_location, unpacked_var, name,
> false, vertex_index);
> - } else if (rvalue->type->vector_elements * dmul +
> - fine_location % 4 > 4) {
> + } else if (vector_elements * dmul + fine_location % 4 > 4) {
> /* This vector is going to be "double parked" across two varying slots,
> * so handle it as two separate assignments. For doubles, a dvec3/dvec4
> * can end up being spread over 3 slots. However the second splitting
> @@ -552,7 +568,7 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> /* We might actually end up with 0 left components! */
> left_components /= 2;
> }
> - right_components = rvalue->type->vector_elements - left_components;
> + right_components = vector_elements - left_components;
>
> for (unsigned i = 0; i < left_components; i++) {
> left_swizzle_values[i] = i;
> @@ -585,7 +601,7 @@ lower_packed_varyings_visitor::lower_rvalue(ir_rvalue *rvalue,
> * varying.
> */
> unsigned swizzle_values[4] = { 0, 0, 0, 0 };
> - unsigned components = rvalue->type->vector_elements * dmul;
> + unsigned components = vector_elements * dmul;
> unsigned location = fine_location / 4;
> unsigned location_frac = fine_location % 4;
> for (unsigned i = 0; i < components; ++i)
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list