diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c index 8c3a1aeb7..5d83ce3c8 100644 --- a/libs/vkd3d-shader/hlsl.c +++ b/libs/vkd3d-shader/hlsl.c @@ -387,6 +387,9 @@ static enum hlsl_regset type_get_regset(const struct hlsl_type *type) case HLSL_CLASS_UAV: return HLSL_REGSET_UAVS; + case HLSL_CLASS_STREAM_OUTPUT: + return HLSL_REGSET_STREAM_OUTPUTS; + default: break; } @@ -493,6 +496,10 @@ static void hlsl_type_calculate_reg_size(struct hlsl_ctx *ctx, struct hlsl_type type->reg_size[HLSL_REGSET_UAVS] = 1; break; + case HLSL_CLASS_STREAM_OUTPUT: + type->reg_size[HLSL_REGSET_STREAM_OUTPUTS] = 1; + break; + case HLSL_CLASS_DEPTH_STENCIL_STATE: case HLSL_CLASS_DEPTH_STENCIL_VIEW: case HLSL_CLASS_EFFECT_GROUP: @@ -511,7 +518,6 @@ static void hlsl_type_calculate_reg_size(struct hlsl_ctx *ctx, struct hlsl_type case HLSL_CLASS_HULL_SHADER: case HLSL_CLASS_GEOMETRY_SHADER: case HLSL_CLASS_BLEND_STATE: - case HLSL_CLASS_STREAM_OUTPUT: case HLSL_CLASS_NULL: break; } @@ -984,6 +990,7 @@ struct hlsl_type *hlsl_new_stream_output_type(struct hlsl_ctx *ctx, type->class = HLSL_CLASS_STREAM_OUTPUT; type->e.so.so_type = so_type; type->e.so.type = data_type; + hlsl_type_calculate_reg_size(ctx, type); list_add_tail(&ctx->types, &type->entry); diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index 66cee60be..967433d03 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -141,7 +141,8 @@ enum hlsl_regset HLSL_REGSET_SAMPLERS, HLSL_REGSET_TEXTURES, HLSL_REGSET_UAVS, - HLSL_REGSET_LAST_OBJECT = HLSL_REGSET_UAVS, + HLSL_REGSET_STREAM_OUTPUTS, + HLSL_REGSET_LAST_OBJECT = HLSL_REGSET_STREAM_OUTPUTS, HLSL_REGSET_NUMERIC, HLSL_REGSET_LAST = HLSL_REGSET_NUMERIC, }; diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index f8fbcfc81..73a56a0a5 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -5191,6 +5191,8 @@ static char get_regset_name(enum hlsl_regset regset) return 't'; case HLSL_REGSET_UAVS: return 'u'; + case HLSL_REGSET_STREAM_OUTPUTS: + return 'm'; case HLSL_REGSET_NUMERIC: vkd3d_unreachable(); } @@ -13248,7 +13250,7 @@ static void process_entry_function(struct hlsl_ctx *ctx, validate_and_record_prim_type(ctx, var); prepend_input_var_copy(ctx, entry_func, var); } - else if (hlsl_get_stream_output_type(var->data_type)) + else if (var->data_type->reg_size[HLSL_REGSET_STREAM_OUTPUTS]) { if (profile->type != VKD3D_SHADER_TYPE_GEOMETRY) {