*/
if (ctx->sinfo)
emit_so_outputs(ctx, ctx->sinfo);
- spirv_builder_emit_vertex(&ctx->builder, nir_intrinsic_stream_id(intr));
+ spirv_builder_emit_vertex(&ctx->builder, nir_intrinsic_stream_id(intr),
+ ctx->nir->info.stage == MESA_SHADER_GEOMETRY && util_bitcount(ctx->nir->info.gs.active_stream_mask) > 1);
break;
case nir_intrinsic_set_vertex_and_primitive_count:
break;
case nir_intrinsic_end_primitive_with_counter:
- spirv_builder_end_primitive(&ctx->builder, nir_intrinsic_stream_id(intr));
+ spirv_builder_end_primitive(&ctx->builder, nir_intrinsic_stream_id(intr),
+ ctx->nir->info.stage == MESA_SHADER_GEOMETRY && util_bitcount(ctx->nir->info.gs.active_stream_mask) > 1);
break;
case nir_intrinsic_load_helper_invocation:
}
void
-spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream)
+spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream, bool multistream)
{
unsigned words = 1;
SpvOp op = SpvOpEmitVertex;
- if (stream > 0) {
+ if (multistream) {
op = SpvOpEmitStreamVertex;
words++;
}
spirv_buffer_prepare(&b->instructions, b->mem_ctx, words);
spirv_buffer_emit_word(&b->instructions, op | (words << 16));
- if (stream)
+ if (multistream)
spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, stream));
}
void
-spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream)
+spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream, bool multistream)
{
unsigned words = 1;
SpvOp op = SpvOpEndPrimitive;
- if (stream > 0) {
+ if (multistream || stream > 0) {
op = SpvOpEndStreamPrimitive;
words++;
}
spirv_buffer_prepare(&b->instructions, b->mem_ctx, words);
spirv_buffer_emit_word(&b->instructions, op | (words << 16));
- if (stream)
+ if (multistream || stream > 0)
spirv_buffer_emit_word(&b->instructions, spirv_builder_const_uint(b, 32, stream));
}
uint32_t *tcs_vertices_out_word);
void
-spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream);
+spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream, bool multistream);
void
-spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream);
+spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream, bool multistream);
#endif