vkd3d-shader/fx: Implement ConstructGSWithSO().

This commit is contained in:
Anna (navi) Figueiredo Gomes
2025-01-14 23:24:48 +01:00
committed by Henri Verbeet
parent 38e6ba2d58
commit 7658f03883
Notes: Henri Verbeet 2025-12-09 17:21:48 +01:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Nikolay Sivov (@nsivov)
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1340
3 changed files with 74 additions and 23 deletions

View File

@@ -132,6 +132,7 @@ struct type_entry
uint32_t unpacked_size;
uint32_t modifiers;
uint32_t offset;
enum fx_shader_type shader_type;
};
static int string_storage_compare(const void *key, const struct rb_entry *entry)
@@ -394,6 +395,9 @@ static uint32_t write_type(const struct type_entry *type, struct fx_write_contex
if (type_entry->modifiers != type->modifiers)
continue;
if (type_entry->shader_type != type->shader_type)
continue;
return type_entry->offset;
}
}
@@ -428,12 +432,60 @@ static void type_entry_from_type(struct type_entry *e, const struct hlsl_type *t
};
}
static enum fx_shader_type get_shader_type(struct hlsl_ir_var *shader, struct fx_write_context *fx)
{
const struct hlsl_type *type = hlsl_get_multiarray_element_type(shader->data_type);
uint32_t elements_count = hlsl_get_multiarray_size(shader->data_type);
enum fx_shader_type shader_type = FX4_SHADER;
struct hlsl_ctx *ctx = fx->ctx;
switch (type->class)
{
case HLSL_CLASS_PIXEL_SHADER:
case HLSL_CLASS_VERTEX_SHADER:
return FX4_SHADER;
case HLSL_CLASS_HULL_SHADER:
case HLSL_CLASS_COMPUTE_SHADER:
case HLSL_CLASS_DOMAIN_SHADER:
return FX5_SHADER;
case HLSL_CLASS_GEOMETRY_SHADER:
break;
default:
return FX_SHADER_NONE;
}
for (size_t i = 0; i < elements_count; ++i)
{
struct hlsl_ir_compile *compile;
if (!shader->default_values || !(compile = shader->default_values[i].shader) || !compile->output.count)
continue;
if (compile->output.count > 1)
{
shader_type = FX5_SHADER;
break;
}
shader_type = FX4_SHADER_SO;
}
if (shader_type == FX5_SHADER && hlsl_version_lt(ctx, 5, 0))
hlsl_error(ctx, &shader->loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE,
"Multi-stream output is not supported by the fx_4_0 profile.");
return shader_type;
}
static uint32_t write_var_type(struct hlsl_ir_var *var, struct fx_write_context *fx)
{
struct type_entry entry;
type_entry_from_type(&entry, var->data_type, fx);
entry.shader_type = get_shader_type(var, fx);
return write_type(&entry, fx);
}
@@ -1434,6 +1486,23 @@ static uint32_t write_fx_4_type(const struct type_entry *type, struct fx_write_c
{
put_u32_unaligned(buffer, FX_4_OBJECT_TYPE_VERTEX_SHADER);
}
else if (element_type->class == HLSL_CLASS_GEOMETRY_SHADER)
{
switch (type->shader_type)
{
case FX4_SHADER:
put_u32_unaligned(buffer, FX_4_OBJECT_TYPE_GEOMETRY_SHADER);
break;
case FX4_SHADER_SO:
put_u32_unaligned(buffer, FX_4_OBJECT_TYPE_GEOMETRY_SHADER_SO);
break;
case FX5_SHADER:
put_u32_unaligned(buffer, FX_5_OBJECT_TYPE_GEOMETRY_SHADER);
break;
case FX_SHADER_NONE:
vkd3d_unreachable();
}
}
else if (element_type->class == HLSL_CLASS_RASTERIZER_STATE)
{
put_u32_unaligned(buffer, FX_4_OBJECT_TYPE_RASTERIZER_STATE);
@@ -3315,27 +3384,8 @@ static void write_fx_4_state_object_initializer(struct hlsl_ir_var *var, struct
static void write_fx_shader_initializer(struct hlsl_ir_var *var, struct fx_write_context *fx)
{
const struct hlsl_type *var_type = hlsl_get_multiarray_element_type(var->data_type);
uint32_t elements_count = hlsl_get_multiarray_size(var->data_type);
enum fx_shader_type shader_type;
switch (var_type->class)
{
case HLSL_CLASS_PIXEL_SHADER:
case HLSL_CLASS_VERTEX_SHADER:
case HLSL_CLASS_GEOMETRY_SHADER:
shader_type = FX4_SHADER;
break;
case HLSL_CLASS_HULL_SHADER:
case HLSL_CLASS_COMPUTE_SHADER:
case HLSL_CLASS_DOMAIN_SHADER:
shader_type = FX5_SHADER;
break;
default:
vkd3d_unreachable();
}
enum fx_shader_type shader_type = get_shader_type(var, fx);
for (size_t i = 0; i < elements_count; ++i)
{
@@ -3389,6 +3439,7 @@ static void write_fx_4_object_variable(struct hlsl_ir_var *var, struct fx_write_
case HLSL_CLASS_HULL_SHADER:
case HLSL_CLASS_COMPUTE_SHADER:
case HLSL_CLASS_DOMAIN_SHADER:
case HLSL_CLASS_GEOMETRY_SHADER:
write_fx_shader_initializer(var, fx);
fx->shader_count += elements_count;
break;

View File

@@ -2,7 +2,7 @@
shader model >= 4.0
shader model < 6.0
[effect todo]
[effect]
float4 main() : sv_position { return 0; }
VertexShader vs = CompileShader(vs_4_0, main());
@@ -21,7 +21,7 @@ technique11
}
}
[effect todo]
[effect]
float4 main() : sv_position { return 0; }
GeometryShader chain = ConstructGSWithSO(CompileShader(vs_4_0, main()), "foo");
GeometryShader chained = ConstructGSWithSO(ConstructGSWithSO(chain, "nya"), "mew");

View File

@@ -2,7 +2,7 @@
shader model >= 5.0
shader model < 6.0
[effect todo]
[effect]
float4 main() : sv_position { return 0; }
VertexShader vs = CompileShader(vs_4_0, main());