vkd3d-shader/hlsl: Allow memory barriers in SM4+ target profiles.

This commit is contained in:
Shaun Ren
2025-06-06 18:41:49 -04:00
committed by Henri Verbeet
parent 84a0a8ae86
commit 4ede2f1365
Notes: Henri Verbeet 2025-06-24 16:31:45 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1553
2 changed files with 54 additions and 7 deletions

View File

@@ -5144,10 +5144,10 @@ static bool intrinsic_InterlockedXor(struct hlsl_ctx *ctx,
static void validate_group_barrier_profile(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc) static void validate_group_barrier_profile(struct hlsl_ctx *ctx, const struct vkd3d_shader_location *loc)
{ {
if (ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE || hlsl_version_lt(ctx, 5, 0)) if (ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE)
{ {
hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE, hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE,
"Group barriers can only be used in compute shaders 5.0 or higher."); "Group barriers can only be used in compute shaders.");
} }
} }
@@ -5171,10 +5171,10 @@ static bool intrinsic_DeviceMemoryBarrier(struct hlsl_ctx *ctx,
const struct parse_initializer *params, const struct vkd3d_shader_location *loc) const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
{ {
if ((ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE && ctx->profile->type != VKD3D_SHADER_TYPE_PIXEL) if ((ctx->profile->type != VKD3D_SHADER_TYPE_COMPUTE && ctx->profile->type != VKD3D_SHADER_TYPE_PIXEL)
|| hlsl_version_lt(ctx, 5, 0)) || hlsl_version_lt(ctx, 4, 0))
{ {
hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE, hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_INCOMPATIBLE_PROFILE,
"DeviceMemoryBarrier() can only be used in pixel and compute shaders 5.0 or higher."); "DeviceMemoryBarrier() can only be used in compute and pixel shaders 4.0 or higher.");
} }
return !!hlsl_block_add_sync(ctx, params->instrs, VKD3DSSF_GLOBAL_UAV, loc); return !!hlsl_block_add_sync(ctx, params->instrs, VKD3DSSF_GLOBAL_UAV, loc);
} }

View File

@@ -1,9 +1,10 @@
[require] [require]
shader model >= 5.0 shader model >= 4.0
% These are just parsing tests.
% This is just a parsing test.
[compute shader] [compute shader]
[numthreads(1024, 1, 1)] [numthreads(768, 1, 1)]
void main(uint local_idx : SV_GroupIndex, uint group_id : SV_GroupID) void main(uint local_idx : SV_GroupIndex, uint group_id : SV_GroupID)
{ {
GroupMemoryBarrier(); GroupMemoryBarrier();
@@ -14,6 +15,52 @@ void main(uint local_idx : SV_GroupIndex, uint group_id : SV_GroupID)
AllMemoryBarrierWithGroupSync(); AllMemoryBarrierWithGroupSync();
} }
[pixel shader]
float4 main() : sv_target
{
DeviceMemoryBarrier();
return 0;
}
[pixel shader fail]
float4 main() : sv_target
{
DeviceMemoryBarrierWithGroupSync();
return 0;
}
[pixel shader fail]
float4 main() : sv_target
{
GroupMemoryBarrier();
return 0;
}
[pixel shader fail]
float4 main() : sv_target
{
GroupMemoryBarrierWithGroupSync();
return 0;
}
[pixel shader fail]
float4 main() : sv_target
{
AllMemoryBarrier();
return 0;
}
[pixel shader fail]
float4 main() : sv_target
{
AllMemoryBarrierWithGroupSync();
return 0;
}
[require]
shader model >= 5.0
[uav 2] [uav 2]
format r32g32b32a32-float format r32g32b32a32-float
size (buffer, 3) size (buffer, 3)