zink: fix streamout emission for super-enhanced layouts

if we get some crazy matrix types in here then we need to ensure that
we accurately unwrap them and copy the components

fixes KHR-GL46.enhanced_layouts.xfb_stride

Fixes: 1b130c42b8 ("zink: implement streamout and xfb handling in ntv")

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9271>
This commit is contained in:
Mike Blumenkrantz 2021-02-23 11:27:20 -05:00 committed by Marge Bot
parent 9ff01d724a
commit 1b25e3a701
1 changed files with 10 additions and 4 deletions

View File

@ -1343,12 +1343,18 @@ emit_so_outputs(struct ntv_context *ctx,
* and re-pack them into the desired output type
*/
for (unsigned c = 0; c < so_output.num_components; c++) {
uint32_t member[] = { so_output.start_component + c };
SpvId base_type = get_glsl_type(ctx, glsl_without_array(out_type));
uint32_t member[2];
unsigned member_idx = 0;
if (glsl_type_is_matrix(out_type)) {
member_idx = 1;
member[0] = so_output.register_index;
}
member[member_idx] = so_output.start_component + c;
SpvId base_type = get_glsl_basetype(ctx, glsl_get_base_type(glsl_without_array_or_matrix(out_type)));
if (slot == VARYING_SLOT_CLIP_DIST1)
member[0] += 4;
components[c] = spirv_builder_emit_composite_extract(&ctx->builder, base_type, src, member, 1);
member[member_idx] += 4;
components[c] = spirv_builder_emit_composite_extract(&ctx->builder, base_type, src, member, 1 + member_idx);
}
result = spirv_builder_emit_composite_construct(&ctx->builder, type, components, so_output.num_components);
}