From ae5261b98b9bfdbf5e075a863ddad1b751efeb7e Mon Sep 17 00:00:00 2001 From: Shaun Ren Date: Tue, 4 Mar 2025 19:46:39 -0500 Subject: [PATCH] vkd3d-shader/hlsl: Forbid output parameters in geometry shaders. Outputs in geometry shaders must be written to streams. --- libs/vkd3d-shader/hlsl_codegen.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c index af19c6cb..09eab8e8 100644 --- a/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d-shader/hlsl_codegen.c @@ -12604,6 +12604,9 @@ static void process_entry_function(struct hlsl_ctx *ctx, if (profile->type == VKD3D_SHADER_TYPE_HULL && !ctx->is_patch_constant_func) hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER, "Output parameters are not supported in hull shader control point functions."); + else if (profile->type == VKD3D_SHADER_TYPE_GEOMETRY) + hlsl_error(ctx, &var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_MODIFIER, + "Output parameters are not allowed in geometry shaders."); else append_output_var_copy(ctx, entry_func, var); } @@ -12611,7 +12614,11 @@ static void process_entry_function(struct hlsl_ctx *ctx, } if (entry_func->return_var) { - if (entry_func->return_var->data_type->class != HLSL_CLASS_STRUCT && !entry_func->return_var->semantic.name) + if (profile->type == VKD3D_SHADER_TYPE_GEOMETRY) + hlsl_error(ctx, &entry_func->loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE, + "Geometry shaders cannot return values."); + else if (entry_func->return_var->data_type->class != HLSL_CLASS_STRUCT + && !entry_func->return_var->semantic.name) hlsl_error(ctx, &entry_func->loc, VKD3D_SHADER_ERROR_HLSL_MISSING_SEMANTIC, "Entry point \"%s\" is missing a return value semantic.", entry_func->func->name);