vkd3d-shader/hlsl: Check MS texture declaration without sample count only for used variables.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
This commit is contained in:
Nikolay Sivov 2024-08-04 00:13:56 +02:00 committed by Henri Verbeet
parent 80b2a2eb55
commit d945d5e78c
Notes: Henri Verbeet 2024-08-13 21:26:02 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/980
3 changed files with 20 additions and 12 deletions

View File

@ -7304,12 +7304,6 @@ type_no_void:
{
validate_texture_format_type(ctx, $3, &@3);
if (hlsl_version_lt(ctx, 4, 1))
{
hlsl_error(ctx, &@1, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
"Multisampled texture object declaration needs sample count for profile %s.", ctx->profile->name);
}
$$ = hlsl_new_texture_type(ctx, $1, $3, 0);
}
| texture_ms_type '<' type ',' shift_expr '>'

View File

@ -3196,6 +3196,8 @@ struct extern_resource
enum hlsl_regset regset;
unsigned int id, space, index, bind_count;
struct vkd3d_shader_location loc;
};
static int sm4_compare_extern_resources(const void *a, const void *b)
@ -3298,6 +3300,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
extern_resources[*count].space = var->regs[regset].space;
extern_resources[*count].index = var->regs[regset].index + regset_offset;
extern_resources[*count].bind_count = 1;
extern_resources[*count].loc = var->loc;
++*count;
}
@ -3345,6 +3348,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
extern_resources[*count].space = var->regs[r].space;
extern_resources[*count].index = var->regs[r].index;
extern_resources[*count].bind_count = var->bind_count[r];
extern_resources[*count].loc = var->loc;
++*count;
}
@ -3383,6 +3387,7 @@ static struct extern_resource *sm4_get_extern_resources(struct hlsl_ctx *ctx, un
extern_resources[*count].space = buffer->reg.space;
extern_resources[*count].index = buffer->reg.index;
extern_resources[*count].bind_count = 1;
extern_resources[*count].loc = buffer->loc;
++*count;
}
@ -4318,6 +4323,7 @@ static void write_sm4_dcl_textures(const struct tpf_writer *tpf, const struct ex
enum hlsl_regset regset = uav ? HLSL_REGSET_UAVS : HLSL_REGSET_TEXTURES;
struct hlsl_type *component_type;
struct sm4_instruction instr;
bool multisampled;
unsigned int i;
VKD3D_ASSERT(resource->regset == regset);
@ -4340,6 +4346,16 @@ static void write_sm4_dcl_textures(const struct tpf_writer *tpf, const struct ex
.idx_count = 1,
};
multisampled = component_type->sampler_dim == HLSL_SAMPLER_DIM_2DMS
|| component_type->sampler_dim == HLSL_SAMPLER_DIM_2DMSARRAY;
if (hlsl_version_lt(tpf->ctx, 4, 1) && multisampled && !component_type->sample_count)
{
hlsl_error(tpf->ctx, &resource->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
"Multisampled texture object declaration needs sample count for profile %s.",
tpf->ctx->profile->name);
}
if (hlsl_version_ge(tpf->ctx, 5, 1))
{
VKD3D_ASSERT(!i);
@ -4379,11 +4395,8 @@ static void write_sm4_dcl_textures(const struct tpf_writer *tpf, const struct ex
}
instr.extra_bits |= (sm4_resource_dimension(component_type) << VKD3D_SM4_RESOURCE_TYPE_SHIFT);
if (component_type->sampler_dim == HLSL_SAMPLER_DIM_2DMS
|| component_type->sampler_dim == HLSL_SAMPLER_DIM_2DMSARRAY)
{
if (multisampled)
instr.extra_bits |= component_type->sample_count << VKD3D_SM4_RESOURCE_SAMPLE_COUNT_SHIFT;
}
write_sm4_instruction(tpf, &instr);
}

View File

@ -39,6 +39,7 @@ probe (1, 1) rgba (0.8, 0.0, 0.7, 1.0)
[pixel shader]
static const int size = 2;
Texture2DMS<float4, size - 1> t;
Texture2DMS<float4> t2;
float4 main(float4 pos : sv_position) : sv_target
{
@ -76,7 +77,7 @@ probe (1, 0) rgba (0.6, 0.5, 0.2, 0.1)
probe (0, 1) rgba (0.5, 0.7, 0.6, 0.8)
probe (1, 1) rgba (0.8, 0.0, 0.7, 1.0)
[pixel shader todo]
[pixel shader]
static const int size = 2;
Texture2DMS<float4, size - 1> t;
@ -87,7 +88,7 @@ float4 main(float4 pos : sv_position) : sv_target
}
[test]
todo draw quad
todo(glsl) draw quad
probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4)
probe (1, 0) rgba (0.6, 0.5, 0.2, 0.1)
probe (0, 1) rgba (0.5, 0.7, 0.6, 0.8)