mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/dxil: Load sampler descriptors.
This commit is contained in:
committed by
Alexandre Julliard
parent
0f3a42c34b
commit
0a3eb61170
Notes:
Alexandre Julliard
2024-02-14 23:26:52 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/643
@ -228,6 +228,13 @@ enum dxil_component_type
|
|||||||
COMPONENT_TYPE_PACKEDU8X32 = 18,
|
COMPONENT_TYPE_PACKEDU8X32 = 18,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum dxil_sampler_kind
|
||||||
|
{
|
||||||
|
SAMPLER_KIND_DEFAULT = 0,
|
||||||
|
SAMPLER_KIND_COMPARISON = 1,
|
||||||
|
SAMPLER_KIND_MONO = 2,
|
||||||
|
};
|
||||||
|
|
||||||
enum dxil_semantic_kind
|
enum dxil_semantic_kind
|
||||||
{
|
{
|
||||||
SEMANTIC_KIND_ARBITRARY = 0,
|
SEMANTIC_KIND_ARBITRARY = 0,
|
||||||
@ -6755,6 +6762,70 @@ static enum vkd3d_result sm6_parser_resources_load_cbv(struct sm6_parser *sm6,
|
|||||||
return VKD3D_OK;
|
return VKD3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum vkd3d_result sm6_parser_resources_load_sampler(struct sm6_parser *sm6,
|
||||||
|
const struct sm6_metadata_node *node, struct sm6_descriptor_info *d, struct vkd3d_shader_instruction *ins)
|
||||||
|
{
|
||||||
|
struct vkd3d_shader_register *reg;
|
||||||
|
unsigned int kind;
|
||||||
|
|
||||||
|
if (node->operand_count < 7)
|
||||||
|
{
|
||||||
|
WARN("Invalid operand count %u.\n", node->operand_count);
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND_COUNT,
|
||||||
|
"Invalid operand count %u for a sampler descriptor.", node->operand_count);
|
||||||
|
return VKD3D_ERROR_INVALID_SHADER;
|
||||||
|
}
|
||||||
|
if (node->operand_count > 7 && node->operands[7])
|
||||||
|
{
|
||||||
|
WARN("Ignoring %u extra operands.\n", node->operand_count - 7);
|
||||||
|
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS,
|
||||||
|
"Ignoring %u extra operands for a sampler descriptor.", node->operand_count - 7);
|
||||||
|
}
|
||||||
|
|
||||||
|
vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_DCL_SAMPLER);
|
||||||
|
ins->resource_type = VKD3D_SHADER_RESOURCE_NONE;
|
||||||
|
|
||||||
|
if (!sm6_metadata_get_uint_value(sm6, node->operands[6], &kind))
|
||||||
|
{
|
||||||
|
WARN("Failed to load sampler mode.\n");
|
||||||
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
|
||||||
|
"Sampler mode metadata value is not an integer.");
|
||||||
|
return VKD3D_ERROR_INVALID_SHADER;
|
||||||
|
}
|
||||||
|
switch (kind)
|
||||||
|
{
|
||||||
|
case SAMPLER_KIND_DEFAULT:
|
||||||
|
break;
|
||||||
|
case SAMPLER_KIND_COMPARISON:
|
||||||
|
ins->flags = VKD3DSI_SAMPLER_COMPARISON_MODE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("Ignoring sampler kind %u.\n", kind);
|
||||||
|
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS,
|
||||||
|
"Ignoring sampler kind %u.", kind);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ins->declaration.sampler.src.swizzle = VKD3D_SHADER_NO_SWIZZLE;
|
||||||
|
ins->declaration.sampler.src.modifiers = VKD3DSPSM_NONE;
|
||||||
|
|
||||||
|
reg = &ins->declaration.sampler.src.reg;
|
||||||
|
vsir_register_init(reg, VKD3DSPR_SAMPLER, VKD3D_DATA_UNUSED, 3);
|
||||||
|
reg->idx[0].offset = d->id;
|
||||||
|
reg->idx[1].offset = d->range.first;
|
||||||
|
reg->idx[2].offset = d->range.last;
|
||||||
|
|
||||||
|
ins->declaration.sampler.range = d->range;
|
||||||
|
|
||||||
|
d->resource_type = ins->resource_type;
|
||||||
|
d->kind = RESOURCE_KIND_SAMPLER;
|
||||||
|
d->reg_type = VKD3DSPR_SAMPLER;
|
||||||
|
d->reg_data_type = VKD3D_DATA_UNUSED;
|
||||||
|
d->resource_data_type = VKD3D_DATA_UNUSED;
|
||||||
|
|
||||||
|
return VKD3D_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6,
|
static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6,
|
||||||
enum vkd3d_shader_descriptor_type type, const struct sm6_metadata_node *descriptor_node)
|
enum vkd3d_shader_descriptor_type type, const struct sm6_metadata_node *descriptor_node)
|
||||||
{
|
{
|
||||||
@ -6831,6 +6902,10 @@ static enum vkd3d_result sm6_parser_descriptor_type_init(struct sm6_parser *sm6,
|
|||||||
if ((ret = sm6_parser_resources_load_uav(sm6, node, d, ins)) < 0)
|
if ((ret = sm6_parser_resources_load_uav(sm6, node, d, ins)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
break;
|
break;
|
||||||
|
case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER:
|
||||||
|
if ((ret = sm6_parser_resources_load_sampler(sm6, node, d, ins)) < 0)
|
||||||
|
return ret;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("Unsupported descriptor type %u.\n", type);
|
FIXME("Unsupported descriptor type %u.\n", type);
|
||||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
|
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_RESOURCES,
|
||||||
|
Reference in New Issue
Block a user