vkd3d: Make nameless unions really nameless

This makes it consistent across tests and vkd3d.

Signed-off-by: Joshua Ashton <joshua@froggi.es>
This commit is contained in:
Joshua Ashton 2020-06-11 19:46:27 +01:00 committed by Hans-Kristian Arntzen
parent cbdf6f88d2
commit b9909854fe
16 changed files with 484 additions and 492 deletions

View File

@ -117,7 +117,7 @@ struct vkd3d_shader_parameter_immediate_constant
union union
{ {
uint32_t u32; uint32_t u32;
} u; };
}; };
struct vkd3d_shader_parameter_specialization_constant struct vkd3d_shader_parameter_specialization_constant
@ -134,7 +134,7 @@ struct vkd3d_shader_parameter
{ {
struct vkd3d_shader_parameter_immediate_constant immediate_constant; struct vkd3d_shader_parameter_immediate_constant immediate_constant;
struct vkd3d_shader_parameter_specialization_constant specialization_constant; struct vkd3d_shader_parameter_specialization_constant specialization_constant;
} u; };
}; };
#define VKD3D_SHADER_DESCRIPTOR_RANGE_UNBOUNDED (~0u) #define VKD3D_SHADER_DESCRIPTOR_RANGE_UNBOUNDED (~0u)
@ -426,7 +426,7 @@ struct vkd3d_root_parameter
struct vkd3d_root_descriptor_table descriptor_table; struct vkd3d_root_descriptor_table descriptor_table;
struct vkd3d_root_constants constants; struct vkd3d_root_constants constants;
struct vkd3d_root_descriptor descriptor; struct vkd3d_root_descriptor descriptor;
} u; };
enum vkd3d_shader_visibility shader_visibility; enum vkd3d_shader_visibility shader_visibility;
}; };
@ -502,7 +502,7 @@ struct vkd3d_root_parameter1
struct vkd3d_root_descriptor_table1 descriptor_table; struct vkd3d_root_descriptor_table1 descriptor_table;
struct vkd3d_root_constants constants; struct vkd3d_root_constants constants;
struct vkd3d_root_descriptor1 descriptor; struct vkd3d_root_descriptor1 descriptor;
} u; };
enum vkd3d_shader_visibility shader_visibility; enum vkd3d_shader_visibility shader_visibility;
}; };
@ -530,7 +530,7 @@ struct vkd3d_versioned_root_signature_desc
{ {
struct vkd3d_root_signature_desc v_1_0; struct vkd3d_root_signature_desc v_1_0;
struct vkd3d_root_signature_desc1 v_1_1; struct vkd3d_root_signature_desc1 v_1_1;
} u; };
}; };
/* FIXME: Add support for 64 UAV bind slots. */ /* FIXME: Add support for 64 UAV bind slots. */

View File

@ -22,13 +22,8 @@
/* Nameless unions */ /* Nameless unions */
#ifndef __C89_NAMELESS #ifndef __C89_NAMELESS
# ifdef NONAMELESSUNION
# define __C89_NAMELESS
# define __C89_NAMELESSUNIONNAME u
# else
# define __C89_NAMELESS # define __C89_NAMELESS
# define __C89_NAMELESSUNIONNAME # define __C89_NAMELESSUNIONNAME
# endif /* NONAMELESSUNION */
#endif /* __C89_NAMELESS */ #endif /* __C89_NAMELESS */
#if !defined(_WIN32) || defined(__WIDL__) #if !defined(_WIN32) || defined(__WIDL__)

View File

@ -804,7 +804,7 @@ static void shader_sm5_read_fcall(struct vkd3d_shader_instruction *ins,
DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
struct vkd3d_sm4_data *priv) struct vkd3d_sm4_data *priv)
{ {
priv->src_param[0].reg.u.fp_body_idx = *tokens++; priv->src_param[0].reg.fp_body_idx = *tokens++;
shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], VKD3D_DATA_OPAQUE, &priv->src_param[0]); shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], VKD3D_DATA_OPAQUE, &priv->src_param[0]);
} }
@ -1624,7 +1624,7 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
WARN("Invalid ptr %p, end %p.\n", *ptr, end); WARN("Invalid ptr %p, end %p.\n", *ptr, end);
return false; return false;
} }
memcpy(param->u.immconst_uint, *ptr, 1 * sizeof(DWORD)); memcpy(param->immconst_uint, *ptr, 1 * sizeof(DWORD));
*ptr += 1; *ptr += 1;
break; break;
@ -1635,7 +1635,7 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
WARN("Invalid ptr %p, end %p.\n", *ptr, end); WARN("Invalid ptr %p, end %p.\n", *ptr, end);
return false; return false;
} }
memcpy(param->u.immconst_uint, *ptr, VKD3D_VEC4_SIZE * sizeof(DWORD)); memcpy(param->immconst_uint, *ptr, VKD3D_VEC4_SIZE * sizeof(DWORD));
*ptr += 4; *ptr += 4;
break; break;
@ -2515,15 +2515,15 @@ static int shader_parse_root_parameters(struct root_signature_parser_context *co
switch (parameters[i].parameter_type) switch (parameters[i].parameter_type)
{ {
case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
ret = shader_parse_descriptor_table(context, offset, &parameters[i].u.descriptor_table); ret = shader_parse_descriptor_table(context, offset, &parameters[i].descriptor_table);
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
ret = shader_parse_root_constants(context, offset, &parameters[i].u.constants); ret = shader_parse_root_constants(context, offset, &parameters[i].constants);
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_CBV: case VKD3D_ROOT_PARAMETER_TYPE_CBV:
case VKD3D_ROOT_PARAMETER_TYPE_SRV: case VKD3D_ROOT_PARAMETER_TYPE_SRV:
case VKD3D_ROOT_PARAMETER_TYPE_UAV: case VKD3D_ROOT_PARAMETER_TYPE_UAV:
ret = shader_parse_root_descriptor(context, offset, &parameters[i].u.descriptor); ret = shader_parse_root_descriptor(context, offset, &parameters[i].descriptor);
break; break;
default: default:
FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type); FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
@ -2563,15 +2563,15 @@ static int shader_parse_root_parameters1(struct root_signature_parser_context *c
switch (parameters[i].parameter_type) switch (parameters[i].parameter_type)
{ {
case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
ret = shader_parse_descriptor_table1(context, offset, &parameters[i].u.descriptor_table); ret = shader_parse_descriptor_table1(context, offset, &parameters[i].descriptor_table);
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
ret = shader_parse_root_constants(context, offset, &parameters[i].u.constants); ret = shader_parse_root_constants(context, offset, &parameters[i].constants);
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_CBV: case VKD3D_ROOT_PARAMETER_TYPE_CBV:
case VKD3D_ROOT_PARAMETER_TYPE_SRV: case VKD3D_ROOT_PARAMETER_TYPE_SRV:
case VKD3D_ROOT_PARAMETER_TYPE_UAV: case VKD3D_ROOT_PARAMETER_TYPE_UAV:
ret = shader_parse_root_descriptor1(context, offset, &parameters[i].u.descriptor); ret = shader_parse_root_descriptor1(context, offset, &parameters[i].descriptor);
break; break;
default: default:
FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type); FIXME("Unrecognized type %#x.\n", parameters[i].parameter_type);
@ -2621,7 +2621,7 @@ static int shader_parse_static_samplers(struct root_signature_parser_context *co
static int shader_parse_root_signature(const char *data, unsigned int data_size, static int shader_parse_root_signature(const char *data, unsigned int data_size,
struct vkd3d_versioned_root_signature_desc *desc) struct vkd3d_versioned_root_signature_desc *desc)
{ {
struct vkd3d_root_signature_desc *v_1_0 = &desc->u.v_1_0; struct vkd3d_root_signature_desc *v_1_0 = &desc->v_1_0;
struct root_signature_parser_context context; struct root_signature_parser_context context;
unsigned int count, offset, version; unsigned int count, offset, version;
const char *ptr = data; const char *ptr = data;
@ -2664,7 +2664,7 @@ static int shader_parse_root_signature(const char *data, unsigned int data_size,
} }
else else
{ {
struct vkd3d_root_signature_desc1 *v_1_1 = &desc->u.v_1_1; struct vkd3d_root_signature_desc1 *v_1_1 = &desc->v_1_1;
assert(version == VKD3D_ROOT_SIGNATURE_VERSION_1_1); assert(version == VKD3D_ROOT_SIGNATURE_VERSION_1_1);
@ -2731,61 +2731,61 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
static unsigned int versioned_root_signature_get_parameter_count(const struct vkd3d_versioned_root_signature_desc *desc) static unsigned int versioned_root_signature_get_parameter_count(const struct vkd3d_versioned_root_signature_desc *desc)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.parameter_count; return desc->v_1_0.parameter_count;
else else
return desc->u.v_1_1.parameter_count; return desc->v_1_1.parameter_count;
} }
static enum vkd3d_root_parameter_type versioned_root_signature_get_parameter_type( static enum vkd3d_root_parameter_type versioned_root_signature_get_parameter_type(
const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i) const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.parameters[i].parameter_type; return desc->v_1_0.parameters[i].parameter_type;
else else
return desc->u.v_1_1.parameters[i].parameter_type; return desc->v_1_1.parameters[i].parameter_type;
} }
static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility( static enum vkd3d_shader_visibility versioned_root_signature_get_parameter_shader_visibility(
const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i) const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.parameters[i].shader_visibility; return desc->v_1_0.parameters[i].shader_visibility;
else else
return desc->u.v_1_1.parameters[i].shader_visibility; return desc->v_1_1.parameters[i].shader_visibility;
} }
static const struct vkd3d_root_constants *versioned_root_signature_get_root_constants( static const struct vkd3d_root_constants *versioned_root_signature_get_root_constants(
const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i) const struct vkd3d_versioned_root_signature_desc *desc, unsigned int i)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return &desc->u.v_1_0.parameters[i].u.constants; return &desc->v_1_0.parameters[i].constants;
else else
return &desc->u.v_1_1.parameters[i].u.constants; return &desc->v_1_1.parameters[i].constants;
} }
static unsigned int versioned_root_signature_get_static_sampler_count(const struct vkd3d_versioned_root_signature_desc *desc) static unsigned int versioned_root_signature_get_static_sampler_count(const struct vkd3d_versioned_root_signature_desc *desc)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.static_sampler_count; return desc->v_1_0.static_sampler_count;
else else
return desc->u.v_1_1.static_sampler_count; return desc->v_1_1.static_sampler_count;
} }
static const struct vkd3d_static_sampler_desc *versioned_root_signature_get_static_samplers( static const struct vkd3d_static_sampler_desc *versioned_root_signature_get_static_samplers(
const struct vkd3d_versioned_root_signature_desc *desc) const struct vkd3d_versioned_root_signature_desc *desc)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.static_samplers; return desc->v_1_0.static_samplers;
else else
return desc->u.v_1_1.static_samplers; return desc->v_1_1.static_samplers;
} }
static unsigned int versioned_root_signature_get_flags(const struct vkd3d_versioned_root_signature_desc *desc) static unsigned int versioned_root_signature_get_flags(const struct vkd3d_versioned_root_signature_desc *desc)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
return desc->u.v_1_0.flags; return desc->v_1_0.flags;
else else
return desc->u.v_1_1.flags; return desc->v_1_1.flags;
} }
struct root_signature_writer_context struct root_signature_writer_context
@ -2998,9 +2998,9 @@ static int shader_write_root_parameters(struct root_signature_writer_context *co
{ {
case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
ret = shader_write_descriptor_table(context, &desc->u.v_1_0.parameters[i].u.descriptor_table); ret = shader_write_descriptor_table(context, &desc->v_1_0.parameters[i].descriptor_table);
else else
ret = shader_write_descriptor_table1(context, &desc->u.v_1_1.parameters[i].u.descriptor_table); ret = shader_write_descriptor_table1(context, &desc->v_1_1.parameters[i].descriptor_table);
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
ret = shader_write_root_constants(context, versioned_root_signature_get_root_constants(desc, i)); ret = shader_write_root_constants(context, versioned_root_signature_get_root_constants(desc, i));
@ -3009,9 +3009,9 @@ static int shader_write_root_parameters(struct root_signature_writer_context *co
case VKD3D_ROOT_PARAMETER_TYPE_SRV: case VKD3D_ROOT_PARAMETER_TYPE_SRV:
case VKD3D_ROOT_PARAMETER_TYPE_UAV: case VKD3D_ROOT_PARAMETER_TYPE_UAV:
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
ret = shader_write_root_descriptor(context, &desc->u.v_1_0.parameters[i].u.descriptor); ret = shader_write_root_descriptor(context, &desc->v_1_0.parameters[i].descriptor);
else else
ret = shader_write_root_descriptor1(context, &desc->u.v_1_1.parameters[i].u.descriptor); ret = shader_write_root_descriptor1(context, &desc->v_1_1.parameters[i].descriptor);
break; break;
default: default:
FIXME("Unrecognized type %#x.\n", versioned_root_signature_get_parameter_type(desc, i)); FIXME("Unrecognized type %#x.\n", versioned_root_signature_get_parameter_type(desc, i));
@ -3179,9 +3179,9 @@ static int validate_root_signature_desc(const struct vkd3d_versioned_root_signat
if (type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) if (type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
ret = validate_descriptor_table_v_1_0(&desc->u.v_1_0.parameters[i].u.descriptor_table); ret = validate_descriptor_table_v_1_0(&desc->v_1_0.parameters[i].descriptor_table);
else else
ret = validate_descriptor_table_v_1_1(&desc->u.v_1_1.parameters[i].u.descriptor_table); ret = validate_descriptor_table_v_1_1(&desc->v_1_1.parameters[i].descriptor_table);
} }
if (ret < 0) if (ret < 0)
@ -3251,7 +3251,7 @@ static void free_descriptor_ranges(const struct vkd3d_root_parameter *parameters
const struct vkd3d_root_parameter *p = &parameters[i]; const struct vkd3d_root_parameter *p = &parameters[i];
if (p->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) if (p->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges); vkd3d_free((void *)p->descriptor_table.descriptor_ranges);
} }
} }
@ -3273,17 +3273,17 @@ static int convert_root_parameters_to_v_1_0(struct vkd3d_root_parameter *dst,
{ {
case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
ranges = NULL; ranges = NULL;
if ((p->u.descriptor_table.descriptor_range_count = p1->u.descriptor_table.descriptor_range_count)) if ((p->descriptor_table.descriptor_range_count = p1->descriptor_table.descriptor_range_count))
{ {
if (!(ranges = vkd3d_calloc(p->u.descriptor_table.descriptor_range_count, sizeof(*ranges)))) if (!(ranges = vkd3d_calloc(p->descriptor_table.descriptor_range_count, sizeof(*ranges))))
{ {
ret = VKD3D_ERROR_OUT_OF_MEMORY; ret = VKD3D_ERROR_OUT_OF_MEMORY;
goto fail; goto fail;
} }
} }
p->u.descriptor_table.descriptor_ranges = ranges; p->descriptor_table.descriptor_ranges = ranges;
ranges1 = p1->u.descriptor_table.descriptor_ranges; ranges1 = p1->descriptor_table.descriptor_ranges;
for (j = 0; j < p->u.descriptor_table.descriptor_range_count; ++j) for (j = 0; j < p->descriptor_table.descriptor_range_count; ++j)
{ {
ranges[j].range_type = ranges1[j].range_type; ranges[j].range_type = ranges1[j].range_type;
ranges[j].descriptor_count = ranges1[j].descriptor_count; ranges[j].descriptor_count = ranges1[j].descriptor_count;
@ -3293,13 +3293,13 @@ static int convert_root_parameters_to_v_1_0(struct vkd3d_root_parameter *dst,
} }
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
p->u.constants = p1->u.constants; p->constants = p1->constants;
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_CBV: case VKD3D_ROOT_PARAMETER_TYPE_CBV:
case VKD3D_ROOT_PARAMETER_TYPE_SRV: case VKD3D_ROOT_PARAMETER_TYPE_SRV:
case VKD3D_ROOT_PARAMETER_TYPE_UAV: case VKD3D_ROOT_PARAMETER_TYPE_UAV:
p->u.descriptor.shader_register = p1->u.descriptor.shader_register; p->descriptor.shader_register = p1->descriptor.shader_register;
p->u.descriptor.register_space = p1->u.descriptor.register_space; p->descriptor.register_space = p1->descriptor.register_space;
break; break;
default: default:
WARN("Invalid root parameter type %#x.\n", p->parameter_type); WARN("Invalid root parameter type %#x.\n", p->parameter_type);
@ -3320,8 +3320,8 @@ fail:
static int convert_root_signature_to_v1_0(struct vkd3d_versioned_root_signature_desc *dst, static int convert_root_signature_to_v1_0(struct vkd3d_versioned_root_signature_desc *dst,
const struct vkd3d_versioned_root_signature_desc *src) const struct vkd3d_versioned_root_signature_desc *src)
{ {
const struct vkd3d_root_signature_desc1 *src_desc = &src->u.v_1_1; const struct vkd3d_root_signature_desc1 *src_desc = &src->v_1_1;
struct vkd3d_root_signature_desc *dst_desc = &dst->u.v_1_0; struct vkd3d_root_signature_desc *dst_desc = &dst->v_1_0;
struct vkd3d_static_sampler_desc *samplers = NULL; struct vkd3d_static_sampler_desc *samplers = NULL;
struct vkd3d_root_parameter *parameters = NULL; struct vkd3d_root_parameter *parameters = NULL;
int ret; int ret;
@ -3370,7 +3370,7 @@ static void free_descriptor_ranges1(const struct vkd3d_root_parameter1 *paramete
const struct vkd3d_root_parameter1 *p = &parameters[i]; const struct vkd3d_root_parameter1 *p = &parameters[i];
if (p->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) if (p->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
vkd3d_free((void *)p->u.descriptor_table.descriptor_ranges); vkd3d_free((void *)p->descriptor_table.descriptor_ranges);
} }
} }
@ -3392,17 +3392,17 @@ static int convert_root_parameters_to_v_1_1(struct vkd3d_root_parameter1 *dst,
{ {
case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
ranges1 = NULL; ranges1 = NULL;
if ((p1->u.descriptor_table.descriptor_range_count = p->u.descriptor_table.descriptor_range_count)) if ((p1->descriptor_table.descriptor_range_count = p->descriptor_table.descriptor_range_count))
{ {
if (!(ranges1 = vkd3d_calloc(p1->u.descriptor_table.descriptor_range_count, sizeof(*ranges1)))) if (!(ranges1 = vkd3d_calloc(p1->descriptor_table.descriptor_range_count, sizeof(*ranges1))))
{ {
ret = VKD3D_ERROR_OUT_OF_MEMORY; ret = VKD3D_ERROR_OUT_OF_MEMORY;
goto fail; goto fail;
} }
} }
p1->u.descriptor_table.descriptor_ranges = ranges1; p1->descriptor_table.descriptor_ranges = ranges1;
ranges = p->u.descriptor_table.descriptor_ranges; ranges = p->descriptor_table.descriptor_ranges;
for (j = 0; j < p1->u.descriptor_table.descriptor_range_count; ++j) for (j = 0; j < p1->descriptor_table.descriptor_range_count; ++j)
{ {
ranges1[j].range_type = ranges[j].range_type; ranges1[j].range_type = ranges[j].range_type;
ranges1[j].descriptor_count = ranges[j].descriptor_count; ranges1[j].descriptor_count = ranges[j].descriptor_count;
@ -3413,14 +3413,14 @@ static int convert_root_parameters_to_v_1_1(struct vkd3d_root_parameter1 *dst,
} }
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case VKD3D_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
p1->u.constants = p->u.constants; p1->constants = p->constants;
break; break;
case VKD3D_ROOT_PARAMETER_TYPE_CBV: case VKD3D_ROOT_PARAMETER_TYPE_CBV:
case VKD3D_ROOT_PARAMETER_TYPE_SRV: case VKD3D_ROOT_PARAMETER_TYPE_SRV:
case VKD3D_ROOT_PARAMETER_TYPE_UAV: case VKD3D_ROOT_PARAMETER_TYPE_UAV:
p1->u.descriptor.shader_register = p->u.descriptor.shader_register; p1->descriptor.shader_register = p->descriptor.shader_register;
p1->u.descriptor.register_space = p->u.descriptor.register_space; p1->descriptor.register_space = p->descriptor.register_space;
p1->u.descriptor.flags = VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS; p1->descriptor.flags = VKD3D_ROOT_SIGNATURE_1_0_ROOT_DESCRIPTOR_FLAGS;
break; break;
default: default:
WARN("Invalid root parameter type %#x.\n", p1->parameter_type); WARN("Invalid root parameter type %#x.\n", p1->parameter_type);
@ -3441,8 +3441,8 @@ fail:
static int convert_root_signature_to_v1_1(struct vkd3d_versioned_root_signature_desc *dst, static int convert_root_signature_to_v1_1(struct vkd3d_versioned_root_signature_desc *dst,
const struct vkd3d_versioned_root_signature_desc *src) const struct vkd3d_versioned_root_signature_desc *src)
{ {
const struct vkd3d_root_signature_desc *src_desc = &src->u.v_1_0; const struct vkd3d_root_signature_desc *src_desc = &src->v_1_0;
struct vkd3d_root_signature_desc1 *dst_desc = &dst->u.v_1_1; struct vkd3d_root_signature_desc1 *dst_desc = &dst->v_1_1;
struct vkd3d_static_sampler_desc *samplers = NULL; struct vkd3d_static_sampler_desc *samplers = NULL;
struct vkd3d_root_parameter1 *parameters = NULL; struct vkd3d_root_parameter1 *parameters = NULL;
int ret; int ret;

View File

@ -501,7 +501,7 @@ int vkd3d_shader_compile_dxil(const struct vkd3d_shader_code *dxbc,
bool spec_constant = argument->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT; bool spec_constant = argument->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT;
const dxil_spv_option_rasterizer_sample_count helper = const dxil_spv_option_rasterizer_sample_count helper =
{ { DXIL_SPV_OPTION_RASTERIZER_SAMPLE_COUNT }, { { DXIL_SPV_OPTION_RASTERIZER_SAMPLE_COUNT },
spec_constant ? argument->u.specialization_constant.id : argument->u.immediate_constant.u.u32, spec_constant ? argument->specialization_constant.id : argument->immediate_constant.u32,
spec_constant ? DXIL_SPV_TRUE : DXIL_SPV_FALSE }; spec_constant ? DXIL_SPV_TRUE : DXIL_SPV_FALSE };
if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS) if (dxil_spv_converter_add_option(converter, &helper.base) != DXIL_SPV_SUCCESS)
{ {

View File

@ -2131,7 +2131,7 @@ struct vkd3d_control_flow_info
struct vkd3d_if_cf_info if_; struct vkd3d_if_cf_info if_;
struct vkd3d_loop_cf_info loop; struct vkd3d_loop_cf_info loop;
struct vkd3d_switch_cf_info switch_; struct vkd3d_switch_cf_info switch_;
} u; };
enum enum
{ {
@ -2813,7 +2813,7 @@ static uint32_t vkd3d_dxbc_compiler_alloc_spec_constant_id(struct vkd3d_dxbc_com
const struct vkd3d_shader_parameter *current = &compile_args->parameters[i]; const struct vkd3d_shader_parameter *current = &compile_args->parameters[i];
if (current->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT) if (current->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT)
id = max(current->u.specialization_constant.id + 1, id); id = max(current->specialization_constant.id + 1, id);
} }
compiler->current_spec_constant_id = id; compiler->current_spec_constant_id = id;
@ -2876,9 +2876,9 @@ static uint32_t vkd3d_dxbc_compiler_emit_uint_shader_parameter(struct vkd3d_dxbc
} }
if (parameter->type == VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT) if (parameter->type == VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT)
return vkd3d_dxbc_compiler_get_constant_uint(compiler, parameter->u.immediate_constant.u.u32); return vkd3d_dxbc_compiler_get_constant_uint(compiler, parameter->immediate_constant.u32);
if (parameter->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT) if (parameter->type == VKD3D_SHADER_PARAMETER_TYPE_SPECIALIZATION_CONSTANT)
return vkd3d_dxbc_compiler_get_spec_constant(compiler, name, parameter->u.specialization_constant.id); return vkd3d_dxbc_compiler_get_spec_constant(compiler, name, parameter->specialization_constant.id);
FIXME("Unhandled parameter type %#x.\n", parameter->type); FIXME("Unhandled parameter type %#x.\n", parameter->type);
@ -3182,14 +3182,14 @@ static uint32_t vkd3d_dxbc_compiler_emit_load_constant(struct vkd3d_dxbc_compile
if (reg->immconst_type == VKD3D_IMMCONST_SCALAR) if (reg->immconst_type == VKD3D_IMMCONST_SCALAR)
{ {
for (i = 0; i < component_count; ++i) for (i = 0; i < component_count; ++i)
values[i] = *reg->u.immconst_uint; values[i] = *reg->immconst_uint;
} }
else else
{ {
for (i = 0, j = 0; i < VKD3D_VEC4_SIZE; ++i) for (i = 0, j = 0; i < VKD3D_VEC4_SIZE; ++i)
{ {
if (write_mask & (VKD3DSP_WRITEMASK_0 << i)) if (write_mask & (VKD3DSP_WRITEMASK_0 << i))
values[j++] = reg->u.immconst_uint[vkd3d_swizzle_get_component(swizzle, i)]; values[j++] = reg->immconst_uint[vkd3d_swizzle_get_component(swizzle, i)];
} }
} }
@ -7328,14 +7328,14 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
true_label = vkd3d_spirv_alloc_id(builder); true_label = vkd3d_spirv_alloc_id(builder);
merge_block_id = vkd3d_spirv_alloc_id(builder); merge_block_id = vkd3d_spirv_alloc_id(builder);
vkd3d_spirv_build_op_selection_merge(builder, merge_block_id, SpvSelectionControlMaskNone); vkd3d_spirv_build_op_selection_merge(builder, merge_block_id, SpvSelectionControlMaskNone);
cf_info->u.if_.stream_location = vkd3d_spirv_stream_current_location(&builder->function_stream); cf_info->if_.stream_location = vkd3d_spirv_stream_current_location(&builder->function_stream);
vkd3d_spirv_build_op_branch_conditional(builder, condition_id, true_label, merge_block_id); vkd3d_spirv_build_op_branch_conditional(builder, condition_id, true_label, merge_block_id);
vkd3d_spirv_build_op_label(builder, true_label); vkd3d_spirv_build_op_label(builder, true_label);
cf_info->u.if_.id = compiler->branch_id; cf_info->if_.id = compiler->branch_id;
cf_info->u.if_.merge_block_id = merge_block_id; cf_info->if_.merge_block_id = merge_block_id;
cf_info->u.if_.else_block_id = 0; cf_info->if_.else_block_id = 0;
cf_info->inside_block = true; cf_info->inside_block = true;
cf_info->current_block = VKD3D_BLOCK_IF; cf_info->current_block = VKD3D_BLOCK_IF;
@ -7349,14 +7349,14 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
assert(cf_info->current_block == VKD3D_BLOCK_IF); assert(cf_info->current_block == VKD3D_BLOCK_IF);
if (cf_info->inside_block) if (cf_info->inside_block)
vkd3d_spirv_build_op_branch(builder, cf_info->u.if_.merge_block_id); vkd3d_spirv_build_op_branch(builder, cf_info->if_.merge_block_id);
cf_info->u.if_.else_block_id = vkd3d_spirv_alloc_id(builder); cf_info->if_.else_block_id = vkd3d_spirv_alloc_id(builder);
vkd3d_spirv_as_op_branch_conditional(&builder->function_stream, vkd3d_spirv_as_op_branch_conditional(&builder->function_stream,
cf_info->u.if_.stream_location)->false_label = cf_info->u.if_.else_block_id; cf_info->if_.stream_location)->false_label = cf_info->if_.else_block_id;
vkd3d_spirv_build_op_name(builder, vkd3d_spirv_build_op_name(builder,
cf_info->u.if_.else_block_id, "branch%u_false", cf_info->u.if_.id); cf_info->if_.else_block_id, "branch%u_false", cf_info->if_.id);
vkd3d_spirv_build_op_label(builder, cf_info->u.if_.else_block_id); vkd3d_spirv_build_op_label(builder, cf_info->if_.else_block_id);
cf_info->inside_block = true; cf_info->inside_block = true;
break; break;
@ -7365,9 +7365,9 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
assert(cf_info->current_block == VKD3D_BLOCK_IF); assert(cf_info->current_block == VKD3D_BLOCK_IF);
if (cf_info->inside_block) if (cf_info->inside_block)
vkd3d_spirv_build_op_branch(builder, cf_info->u.if_.merge_block_id); vkd3d_spirv_build_op_branch(builder, cf_info->if_.merge_block_id);
vkd3d_spirv_build_op_label(builder, cf_info->u.if_.merge_block_id); vkd3d_spirv_build_op_label(builder, cf_info->if_.merge_block_id);
vkd3d_dxbc_compiler_pop_control_flow_level(compiler); vkd3d_dxbc_compiler_pop_control_flow_level(compiler);
break; break;
@ -7388,9 +7388,9 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
vkd3d_spirv_build_op_label(builder, loop_body_block_id); vkd3d_spirv_build_op_label(builder, loop_body_block_id);
cf_info->u.loop.header_block_id = loop_header_block_id; cf_info->loop.header_block_id = loop_header_block_id;
cf_info->u.loop.continue_block_id = continue_block_id; cf_info->loop.continue_block_id = continue_block_id;
cf_info->u.loop.merge_block_id = merge_block_id; cf_info->loop.merge_block_id = merge_block_id;
cf_info->current_block = VKD3D_BLOCK_LOOP; cf_info->current_block = VKD3D_BLOCK_LOOP;
vkd3d_spirv_build_op_name(builder, loop_header_block_id, "loop%u_header", compiler->loop_id); vkd3d_spirv_build_op_name(builder, loop_header_block_id, "loop%u_header", compiler->loop_id);
@ -7404,11 +7404,11 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
assert(compiler->control_flow_depth); assert(compiler->control_flow_depth);
assert(cf_info->current_block == VKD3D_BLOCK_LOOP); assert(cf_info->current_block == VKD3D_BLOCK_LOOP);
vkd3d_spirv_build_op_branch(builder, cf_info->u.loop.continue_block_id); vkd3d_spirv_build_op_branch(builder, cf_info->loop.continue_block_id);
vkd3d_spirv_build_op_label(builder, cf_info->u.loop.continue_block_id); vkd3d_spirv_build_op_label(builder, cf_info->loop.continue_block_id);
vkd3d_spirv_build_op_branch(builder, cf_info->u.loop.header_block_id); vkd3d_spirv_build_op_branch(builder, cf_info->loop.header_block_id);
vkd3d_spirv_build_op_label(builder, cf_info->u.loop.merge_block_id); vkd3d_spirv_build_op_label(builder, cf_info->loop.merge_block_id);
vkd3d_dxbc_compiler_pop_control_flow_level(compiler); vkd3d_dxbc_compiler_pop_control_flow_level(compiler);
break; break;
@ -7424,14 +7424,14 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
vkd3d_spirv_build_op_selection_merge(builder, merge_block_id, SpvSelectionControlMaskNone); vkd3d_spirv_build_op_selection_merge(builder, merge_block_id, SpvSelectionControlMaskNone);
cf_info->u.switch_.id = compiler->switch_id; cf_info->switch_.id = compiler->switch_id;
cf_info->u.switch_.merge_block_id = merge_block_id; cf_info->switch_.merge_block_id = merge_block_id;
cf_info->u.switch_.stream_location = vkd3d_spirv_stream_current_location(&builder->function_stream); cf_info->switch_.stream_location = vkd3d_spirv_stream_current_location(&builder->function_stream);
cf_info->u.switch_.selector_id = val_id; cf_info->switch_.selector_id = val_id;
cf_info->u.switch_.case_blocks = NULL; cf_info->switch_.case_blocks = NULL;
cf_info->u.switch_.case_blocks_size = 0; cf_info->switch_.case_blocks_size = 0;
cf_info->u.switch_.case_block_count = 0; cf_info->switch_.case_block_count = 0;
cf_info->u.switch_.default_block_id = 0; cf_info->switch_.default_block_id = 0;
cf_info->inside_block = false; cf_info->inside_block = false;
cf_info->current_block = VKD3D_BLOCK_SWITCH; cf_info->current_block = VKD3D_BLOCK_SWITCH;
@ -7439,8 +7439,8 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
++compiler->switch_id; ++compiler->switch_id;
if (!vkd3d_array_reserve((void **)&cf_info->u.switch_.case_blocks, &cf_info->u.switch_.case_blocks_size, if (!vkd3d_array_reserve((void **)&cf_info->switch_.case_blocks, &cf_info->switch_.case_blocks_size,
10, sizeof(*cf_info->u.switch_.case_blocks))) 10, sizeof(*cf_info->switch_.case_blocks)))
return VKD3D_ERROR_OUT_OF_MEMORY; return VKD3D_ERROR_OUT_OF_MEMORY;
break; break;
@ -7450,21 +7450,21 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
assert(cf_info->current_block == VKD3D_BLOCK_SWITCH); assert(cf_info->current_block == VKD3D_BLOCK_SWITCH);
assert(!cf_info->inside_block); assert(!cf_info->inside_block);
if (!cf_info->u.switch_.default_block_id) if (!cf_info->switch_.default_block_id)
cf_info->u.switch_.default_block_id = cf_info->u.switch_.merge_block_id; cf_info->switch_.default_block_id = cf_info->switch_.merge_block_id;
vkd3d_spirv_build_op_label(builder, cf_info->u.switch_.merge_block_id); vkd3d_spirv_build_op_label(builder, cf_info->switch_.merge_block_id);
/* The OpSwitch instruction is inserted when the endswitch /* The OpSwitch instruction is inserted when the endswitch
* instruction is processed because we do not know the number * instruction is processed because we do not know the number
* of case statments in advance.*/ * of case statments in advance.*/
vkd3d_spirv_begin_function_stream_insertion(builder, cf_info->u.switch_.stream_location); vkd3d_spirv_begin_function_stream_insertion(builder, cf_info->switch_.stream_location);
vkd3d_spirv_build_op_switch(builder, cf_info->u.switch_.selector_id, vkd3d_spirv_build_op_switch(builder, cf_info->switch_.selector_id,
cf_info->u.switch_.default_block_id, cf_info->u.switch_.case_blocks, cf_info->switch_.default_block_id, cf_info->switch_.case_blocks,
cf_info->u.switch_.case_block_count); cf_info->switch_.case_block_count);
vkd3d_spirv_end_function_stream_insertion(builder); vkd3d_spirv_end_function_stream_insertion(builder);
vkd3d_free(cf_info->u.switch_.case_blocks); vkd3d_free(cf_info->switch_.case_blocks);
vkd3d_dxbc_compiler_pop_control_flow_level(compiler); vkd3d_dxbc_compiler_pop_control_flow_level(compiler);
break; break;
@ -7476,38 +7476,38 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
assert(cf_info->current_block == VKD3D_BLOCK_SWITCH); assert(cf_info->current_block == VKD3D_BLOCK_SWITCH);
assert(src->swizzle == VKD3D_NO_SWIZZLE && src->reg.type == VKD3DSPR_IMMCONST); assert(src->swizzle == VKD3D_NO_SWIZZLE && src->reg.type == VKD3DSPR_IMMCONST);
value = *src->reg.u.immconst_uint; value = *src->reg.immconst_uint;
if (!vkd3d_array_reserve((void **)&cf_info->u.switch_.case_blocks, &cf_info->u.switch_.case_blocks_size, if (!vkd3d_array_reserve((void **)&cf_info->switch_.case_blocks, &cf_info->switch_.case_blocks_size,
2 * (cf_info->u.switch_.case_block_count + 1), sizeof(*cf_info->u.switch_.case_blocks))) 2 * (cf_info->switch_.case_block_count + 1), sizeof(*cf_info->switch_.case_blocks)))
return VKD3D_ERROR_OUT_OF_MEMORY; return VKD3D_ERROR_OUT_OF_MEMORY;
label_id = vkd3d_spirv_alloc_id(builder); label_id = vkd3d_spirv_alloc_id(builder);
if (cf_info->inside_block) /* fall-through */ if (cf_info->inside_block) /* fall-through */
vkd3d_spirv_build_op_branch(builder, label_id); vkd3d_spirv_build_op_branch(builder, label_id);
cf_info->u.switch_.case_blocks[2 * cf_info->u.switch_.case_block_count + 0] = value; cf_info->switch_.case_blocks[2 * cf_info->switch_.case_block_count + 0] = value;
cf_info->u.switch_.case_blocks[2 * cf_info->u.switch_.case_block_count + 1] = label_id; cf_info->switch_.case_blocks[2 * cf_info->switch_.case_block_count + 1] = label_id;
++cf_info->u.switch_.case_block_count; ++cf_info->switch_.case_block_count;
vkd3d_spirv_build_op_label(builder, label_id); vkd3d_spirv_build_op_label(builder, label_id);
cf_info->inside_block = true; cf_info->inside_block = true;
vkd3d_spirv_build_op_name(builder, label_id, "switch%u_case%u", cf_info->u.switch_.id, value); vkd3d_spirv_build_op_name(builder, label_id, "switch%u_case%u", cf_info->switch_.id, value);
break; break;
} }
case VKD3DSIH_DEFAULT: case VKD3DSIH_DEFAULT:
assert(compiler->control_flow_depth); assert(compiler->control_flow_depth);
assert(cf_info->current_block == VKD3D_BLOCK_SWITCH); assert(cf_info->current_block == VKD3D_BLOCK_SWITCH);
assert(!cf_info->u.switch_.default_block_id); assert(!cf_info->switch_.default_block_id);
cf_info->u.switch_.default_block_id = vkd3d_spirv_alloc_id(builder); cf_info->switch_.default_block_id = vkd3d_spirv_alloc_id(builder);
if (cf_info->inside_block) /* fall-through */ if (cf_info->inside_block) /* fall-through */
vkd3d_spirv_build_op_branch(builder, cf_info->u.switch_.default_block_id); vkd3d_spirv_build_op_branch(builder, cf_info->switch_.default_block_id);
vkd3d_spirv_build_op_label(builder, cf_info->u.switch_.default_block_id); vkd3d_spirv_build_op_label(builder, cf_info->switch_.default_block_id);
vkd3d_spirv_build_op_name(builder, cf_info->u.switch_.default_block_id, vkd3d_spirv_build_op_name(builder, cf_info->switch_.default_block_id,
"switch%u_default", cf_info->u.switch_.id); "switch%u_default", cf_info->switch_.id);
cf_info->inside_block = true; cf_info->inside_block = true;
break; break;
@ -7525,12 +7525,12 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
if (breakable_cf_info->current_block == VKD3D_BLOCK_LOOP) if (breakable_cf_info->current_block == VKD3D_BLOCK_LOOP)
{ {
vkd3d_spirv_build_op_branch(builder, breakable_cf_info->u.loop.merge_block_id); vkd3d_spirv_build_op_branch(builder, breakable_cf_info->loop.merge_block_id);
} }
else if (breakable_cf_info->current_block == VKD3D_BLOCK_SWITCH) else if (breakable_cf_info->current_block == VKD3D_BLOCK_SWITCH)
{ {
assert(breakable_cf_info->inside_block); assert(breakable_cf_info->inside_block);
vkd3d_spirv_build_op_branch(builder, breakable_cf_info->u.switch_.merge_block_id); vkd3d_spirv_build_op_branch(builder, breakable_cf_info->switch_.merge_block_id);
} }
cf_info->inside_block = false; cf_info->inside_block = false;
@ -7550,7 +7550,7 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
} }
merge_block_id = vkd3d_dxbc_compiler_emit_conditional_branch(compiler, merge_block_id = vkd3d_dxbc_compiler_emit_conditional_branch(compiler,
instruction, loop_cf_info->u.loop.merge_block_id); instruction, loop_cf_info->loop.merge_block_id);
vkd3d_spirv_build_op_label(builder, merge_block_id); vkd3d_spirv_build_op_label(builder, merge_block_id);
break; break;
} }
@ -7567,7 +7567,7 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
return VKD3D_ERROR_INVALID_SHADER; return VKD3D_ERROR_INVALID_SHADER;
} }
vkd3d_spirv_build_op_branch(builder, loop_cf_info->u.loop.continue_block_id); vkd3d_spirv_build_op_branch(builder, loop_cf_info->loop.continue_block_id);
cf_info->inside_block = false; cf_info->inside_block = false;
break; break;
@ -7584,7 +7584,7 @@ static int vkd3d_dxbc_compiler_emit_control_flow_instruction(struct vkd3d_dxbc_c
} }
merge_block_id = vkd3d_dxbc_compiler_emit_conditional_branch(compiler, merge_block_id = vkd3d_dxbc_compiler_emit_conditional_branch(compiler,
instruction, loop_cf_info->u.loop.continue_block_id); instruction, loop_cf_info->loop.continue_block_id);
vkd3d_spirv_build_op_label(builder, merge_block_id); vkd3d_spirv_build_op_label(builder, merge_block_id);
break; break;
} }

View File

@ -970,15 +970,15 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
switch (reg->data_type) switch (reg->data_type)
{ {
case VKD3D_DATA_FLOAT: case VKD3D_DATA_FLOAT:
shader_addline(buffer, "%.8e", reg->u.immconst_float[0]); shader_addline(buffer, "%.8e", reg->immconst_float[0]);
break; break;
case VKD3D_DATA_INT: case VKD3D_DATA_INT:
shader_addline(buffer, "%d", reg->u.immconst_uint[0]); shader_addline(buffer, "%d", reg->immconst_uint[0]);
break; break;
case VKD3D_DATA_RESOURCE: case VKD3D_DATA_RESOURCE:
case VKD3D_DATA_SAMPLER: case VKD3D_DATA_SAMPLER:
case VKD3D_DATA_UINT: case VKD3D_DATA_UINT:
shader_addline(buffer, "%u", reg->u.immconst_uint[0]); shader_addline(buffer, "%u", reg->immconst_uint[0]);
break; break;
default: default:
shader_addline(buffer, "<unhandled data type %#x>", reg->data_type); shader_addline(buffer, "<unhandled data type %#x>", reg->data_type);
@ -991,20 +991,20 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
{ {
case VKD3D_DATA_FLOAT: case VKD3D_DATA_FLOAT:
shader_addline(buffer, "%.8e, %.8e, %.8e, %.8e", shader_addline(buffer, "%.8e, %.8e, %.8e, %.8e",
reg->u.immconst_float[0], reg->u.immconst_float[1], reg->immconst_float[0], reg->immconst_float[1],
reg->u.immconst_float[2], reg->u.immconst_float[3]); reg->immconst_float[2], reg->immconst_float[3]);
break; break;
case VKD3D_DATA_INT: case VKD3D_DATA_INT:
shader_addline(buffer, "%d, %d, %d, %d", shader_addline(buffer, "%d, %d, %d, %d",
reg->u.immconst_uint[0], reg->u.immconst_uint[1], reg->immconst_uint[0], reg->immconst_uint[1],
reg->u.immconst_uint[2], reg->u.immconst_uint[3]); reg->immconst_uint[2], reg->immconst_uint[3]);
break; break;
case VKD3D_DATA_RESOURCE: case VKD3D_DATA_RESOURCE:
case VKD3D_DATA_SAMPLER: case VKD3D_DATA_SAMPLER:
case VKD3D_DATA_UINT: case VKD3D_DATA_UINT:
shader_addline(buffer, "%u, %u, %u, %u", shader_addline(buffer, "%u, %u, %u, %u",
reg->u.immconst_uint[0], reg->u.immconst_uint[1], reg->immconst_uint[0], reg->immconst_uint[1],
reg->u.immconst_uint[2], reg->u.immconst_uint[3]); reg->immconst_uint[2], reg->immconst_uint[3]);
break; break;
default: default:
shader_addline(buffer, "<unhandled data type %#x>", reg->data_type); shader_addline(buffer, "<unhandled data type %#x>", reg->data_type);
@ -1056,7 +1056,7 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
} }
if (reg->type == VKD3DSPR_FUNCTIONPOINTER) if (reg->type == VKD3DSPR_FUNCTIONPOINTER)
shader_addline(buffer, "[%u]", reg->u.fp_body_idx); shader_addline(buffer, "[%u]", reg->fp_body_idx);
} }
} }
@ -1553,19 +1553,19 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DEF: case VKD3DSIH_DEF:
shader_addline(buffer, "def c%u = %.8e, %.8e, %.8e, %.8e", shader_addline(buffer, "def c%u = %.8e, %.8e, %.8e, %.8e",
shader_get_float_offset(ins->dst[0].reg.type, ins->dst[0].reg.idx[0].offset), shader_get_float_offset(ins->dst[0].reg.type, ins->dst[0].reg.idx[0].offset),
ins->src[0].reg.u.immconst_float[0], ins->src[0].reg.u.immconst_float[1], ins->src[0].reg.immconst_float[0], ins->src[0].reg.immconst_float[1],
ins->src[0].reg.u.immconst_float[2], ins->src[0].reg.u.immconst_float[3]); ins->src[0].reg.immconst_float[2], ins->src[0].reg.immconst_float[3]);
break; break;
case VKD3DSIH_DEFI: case VKD3DSIH_DEFI:
shader_addline(buffer, "defi i%u = %d, %d, %d, %d", ins->dst[0].reg.idx[0].offset, shader_addline(buffer, "defi i%u = %d, %d, %d, %d", ins->dst[0].reg.idx[0].offset,
ins->src[0].reg.u.immconst_uint[0], ins->src[0].reg.u.immconst_uint[1], ins->src[0].reg.immconst_uint[0], ins->src[0].reg.immconst_uint[1],
ins->src[0].reg.u.immconst_uint[2], ins->src[0].reg.u.immconst_uint[3]); ins->src[0].reg.immconst_uint[2], ins->src[0].reg.immconst_uint[3]);
break; break;
case VKD3DSIH_DEFB: case VKD3DSIH_DEFB:
shader_addline(buffer, "defb b%u = %s", shader_addline(buffer, "defb b%u = %s",
ins->dst[0].reg.idx[0].offset, ins->src[0].reg.u.immconst_uint[0] ? "true" : "false"); ins->dst[0].reg.idx[0].offset, ins->src[0].reg.immconst_uint[0] ? "true" : "false");
break; break;
default: default:

View File

@ -372,7 +372,7 @@ static void vkd3d_shader_free_root_signature_v_1_0(struct vkd3d_root_signature_d
const struct vkd3d_root_parameter *parameter = &root_signature->parameters[i]; const struct vkd3d_root_parameter *parameter = &root_signature->parameters[i];
if (parameter->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) if (parameter->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
vkd3d_free((void *)parameter->u.descriptor_table.descriptor_ranges); vkd3d_free((void *)parameter->descriptor_table.descriptor_ranges);
} }
vkd3d_free((void *)root_signature->parameters); vkd3d_free((void *)root_signature->parameters);
vkd3d_free((void *)root_signature->static_samplers); vkd3d_free((void *)root_signature->static_samplers);
@ -389,7 +389,7 @@ static void vkd3d_shader_free_root_signature_v_1_1(struct vkd3d_root_signature_d
const struct vkd3d_root_parameter1 *parameter = &root_signature->parameters[i]; const struct vkd3d_root_parameter1 *parameter = &root_signature->parameters[i];
if (parameter->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE) if (parameter->parameter_type == VKD3D_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE)
vkd3d_free((void *)parameter->u.descriptor_table.descriptor_ranges); vkd3d_free((void *)parameter->descriptor_table.descriptor_ranges);
} }
vkd3d_free((void *)root_signature->parameters); vkd3d_free((void *)root_signature->parameters);
vkd3d_free((void *)root_signature->static_samplers); vkd3d_free((void *)root_signature->static_samplers);
@ -401,11 +401,11 @@ void vkd3d_shader_free_root_signature(struct vkd3d_versioned_root_signature_desc
{ {
if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0) if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_0)
{ {
vkd3d_shader_free_root_signature_v_1_0(&desc->u.v_1_0); vkd3d_shader_free_root_signature_v_1_0(&desc->v_1_0);
} }
else if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_1) else if (desc->version == VKD3D_ROOT_SIGNATURE_VERSION_1_1)
{ {
vkd3d_shader_free_root_signature_v_1_1(&desc->u.v_1_1); vkd3d_shader_free_root_signature_v_1_1(&desc->v_1_1);
} }
else if (desc->version) else if (desc->version)
{ {

View File

@ -45,7 +45,6 @@
#ifndef __VKD3D_SHADER_PRIVATE_H #ifndef __VKD3D_SHADER_PRIVATE_H
#define __VKD3D_SHADER_PRIVATE_H #define __VKD3D_SHADER_PRIVATE_H
#define NONAMELESSUNION
#include "vkd3d_common.h" #include "vkd3d_common.h"
#include "vkd3d_memory.h" #include "vkd3d_memory.h"
#include "vkd3d_shader.h" #include "vkd3d_shader.h"
@ -589,7 +588,7 @@ struct vkd3d_shader_register
DWORD immconst_uint[VKD3D_VEC4_SIZE]; DWORD immconst_uint[VKD3D_VEC4_SIZE];
float immconst_float[VKD3D_VEC4_SIZE]; float immconst_float[VKD3D_VEC4_SIZE];
unsigned fp_body_idx; unsigned fp_body_idx;
} u; };
}; };
struct vkd3d_shader_dst_param struct vkd3d_shader_dst_param

View File

@ -20,7 +20,6 @@
#define __VKD3D_UTILS_PRIVATE_H #define __VKD3D_UTILS_PRIVATE_H
#define COBJMACROS #define COBJMACROS
#define NONAMELESSUNION
#define VK_NO_PROTOTYPES #define VK_NO_PROTOTYPES
#include "vkd3d_threads.h" #include "vkd3d_threads.h"

View File

@ -458,7 +458,7 @@ static const struct d3d12_root_descriptor_table *root_signature_get_descriptor_t
{ {
const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index); const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index);
assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE); assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE);
return &p->u.descriptor_table; return &p->descriptor_table;
} }
static const struct d3d12_root_constant *root_signature_get_32bit_constants( static const struct d3d12_root_constant *root_signature_get_32bit_constants(
@ -466,7 +466,7 @@ static const struct d3d12_root_constant *root_signature_get_32bit_constants(
{ {
const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index); const struct d3d12_root_parameter *p = root_signature_get_parameter(root_signature, index);
assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS); assert(p->parameter_type == D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS);
return &p->u.constant; return &p->constant;
} }
static const struct d3d12_root_parameter *root_signature_get_root_descriptor( static const struct d3d12_root_parameter *root_signature_get_root_descriptor(
@ -1935,7 +1935,7 @@ static void d3d12_command_list_clear_attachment_pass(struct d3d12_command_list *
extent.height = d3d12_resource_desc_get_height(&resource->desc, view->info.texture.miplevel_idx); extent.height = d3d12_resource_desc_get_height(&resource->desc, view->info.texture.miplevel_idx);
extent.depth = view->info.texture.layer_count; extent.depth = view->info.texture.layer_count;
if (!d3d12_command_list_create_framebuffer(list, vk_render_pass, 1, &view->u.vk_image_view, extent, &vk_framebuffer)) if (!d3d12_command_list_create_framebuffer(list, vk_render_pass, 1, &view->vk_image_view, extent, &vk_framebuffer))
{ {
ERR("Failed to create framebuffer.\n"); ERR("Failed to create framebuffer.\n");
return; return;
@ -1992,7 +1992,7 @@ static bool d3d12_command_list_has_render_pass_rtv_clear(struct d3d12_command_li
if (!d3d12_pipeline_state_is_graphics(list->state)) if (!d3d12_pipeline_state_is_graphics(list->state))
return false; return false;
graphics = &list->state->u.graphics; graphics = &list->state->graphics;
return attachment_idx < graphics->rt_count && return attachment_idx < graphics->rt_count &&
!(graphics->null_attachment_mask & (1 << attachment_idx)) && !(graphics->null_attachment_mask & (1 << attachment_idx)) &&
@ -2146,7 +2146,7 @@ static VkPipelineStageFlags vk_render_pass_barrier_from_view(const struct vkd3d_
vk_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_barrier->image = resource->u.vk_image; vk_barrier->image = resource->vk_image;
vk_barrier->subresourceRange = vk_subresource_range_from_view(view); vk_barrier->subresourceRange = vk_subresource_range_from_view(view);
return stages; return stages;
} }
@ -2419,7 +2419,7 @@ static void d3d12_command_list_transition_resource_to_initial_state(struct d3d12
barrier.newLayout = resource->common_layout; barrier.newLayout = resource->common_layout;
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
barrier.image = resource->u.vk_image; barrier.image = resource->vk_image;
barrier.subresourceRange.aspectMask = format->vk_aspect_mask; barrier.subresourceRange.aspectMask = format->vk_aspect_mask;
barrier.subresourceRange.baseMipLevel = 0; barrier.subresourceRange.baseMipLevel = 0;
barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; barrier.subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS;
@ -2712,7 +2712,7 @@ static bool d3d12_command_list_has_depth_stencil_view(struct d3d12_command_list
struct d3d12_graphics_pipeline_state *graphics; struct d3d12_graphics_pipeline_state *graphics;
assert(d3d12_pipeline_state_is_graphics(list->state)); assert(d3d12_pipeline_state_is_graphics(list->state));
graphics = &list->state->u.graphics; graphics = &list->state->graphics;
return graphics->dsv_format || (d3d12_pipeline_state_has_unknown_dsv_format(list->state) && list->dsv.format); return graphics->dsv_format || (d3d12_pipeline_state_has_unknown_dsv_format(list->state) && list->dsv.format);
} }
@ -2720,7 +2720,7 @@ static bool d3d12_command_list_has_depth_stencil_view(struct d3d12_command_list
static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list, static void d3d12_command_list_get_fb_extent(struct d3d12_command_list *list,
uint32_t *width, uint32_t *height, uint32_t *layer_count) uint32_t *width, uint32_t *height, uint32_t *layer_count)
{ {
struct d3d12_graphics_pipeline_state *graphics = &list->state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &list->state->graphics;
struct d3d12_device *device = list->device; struct d3d12_device *device = list->device;
if (graphics->rt_count || d3d12_command_list_has_depth_stencil_view(list)) if (graphics->rt_count || d3d12_command_list_has_depth_stencil_view(list))
@ -2785,7 +2785,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
if (list->current_framebuffer != VK_NULL_HANDLE) if (list->current_framebuffer != VK_NULL_HANDLE)
return true; return true;
graphics = &list->state->u.graphics; graphics = &list->state->graphics;
for (i = 0, view_count = 0; i < graphics->rt_count; ++i) for (i = 0, view_count = 0; i < graphics->rt_count; ++i)
{ {
@ -2802,7 +2802,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
return false; return false;
} }
views[view_count++] = list->rtvs[i].view->u.vk_image_view; views[view_count++] = list->rtvs[i].view->vk_image_view;
} }
if (d3d12_command_list_has_depth_stencil_view(list)) if (d3d12_command_list_has_depth_stencil_view(list))
@ -2813,7 +2813,7 @@ static bool d3d12_command_list_update_current_framebuffer(struct d3d12_command_l
return false; return false;
} }
views[view_count++] = list->dsv.view->u.vk_image_view; views[view_count++] = list->dsv.view->vk_image_view;
} }
d3d12_command_list_get_fb_extent(list, &extent.width, &extent.height, &extent.depth); d3d12_command_list_get_fb_extent(list, &extent.width, &extent.height, &extent.depth);
@ -2842,8 +2842,8 @@ static bool d3d12_command_list_update_compute_pipeline(struct d3d12_command_list
return false; return false;
} }
VK_CALL(vkCmdBindPipeline(list->vk_command_buffer, list->state->vk_bind_point, list->state->u.compute.vk_pipeline)); VK_CALL(vkCmdBindPipeline(list->vk_command_buffer, list->state->vk_bind_point, list->state->compute.vk_pipeline));
list->current_pipeline = list->state->u.compute.vk_pipeline; list->current_pipeline = list->state->compute.vk_pipeline;
return true; return true;
} }
@ -2881,7 +2881,7 @@ static bool d3d12_command_list_update_graphics_pipeline(struct d3d12_command_lis
if (list->current_render_pass || list->render_pass_suspended) if (list->current_render_pass || list->render_pass_suspended)
d3d12_command_list_invalidate_current_render_pass(list); d3d12_command_list_invalidate_current_render_pass(list);
/* Only override this after ending the render pass. */ /* Only override this after ending the render pass. */
list->dsv_layout = list->state->u.graphics.dsv_layout; list->dsv_layout = list->state->graphics.dsv_layout;
} }
VK_CALL(vkCmdBindPipeline(list->vk_command_buffer, list->state->vk_bind_point, vk_pipeline)); VK_CALL(vkCmdBindPipeline(list->vk_command_buffer, list->state->vk_bind_point, vk_pipeline));
@ -2900,7 +2900,7 @@ static bool vkd3d_descriptor_info_from_d3d12_desc(struct d3d12_device *device,
if (desc->magic != VKD3D_DESCRIPTOR_MAGIC_CBV) if (desc->magic != VKD3D_DESCRIPTOR_MAGIC_CBV)
return false; return false;
vk_descriptor->buffer = desc->u.vk_cbv_info; vk_descriptor->buffer = desc->info.vk_cbv_info;
return true; return true;
case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV: case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV:
@ -2908,17 +2908,17 @@ static bool vkd3d_descriptor_info_from_d3d12_desc(struct d3d12_device *device,
return false; return false;
if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_IMAGE) if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_IMAGE)
&& (desc->u.view->type == VKD3D_VIEW_TYPE_IMAGE)) && (desc->info.view->type == VKD3D_VIEW_TYPE_IMAGE))
{ {
vk_descriptor->image.imageView = desc->u.view->u.vk_image_view; vk_descriptor->image.imageView = desc->info.view->vk_image_view;
vk_descriptor->image.sampler = VK_NULL_HANDLE; vk_descriptor->image.sampler = VK_NULL_HANDLE;
vk_descriptor->image.imageLayout = desc->u.view->info.texture.vk_layout; vk_descriptor->image.imageLayout = desc->info.view->info.texture.vk_layout;
return true; return true;
} }
else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_BUFFER) else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_BUFFER)
&& (desc->u.view->type == VKD3D_VIEW_TYPE_BUFFER)) && (desc->info.view->type == VKD3D_VIEW_TYPE_BUFFER))
{ {
vk_descriptor->buffer_view = desc->u.view->u.vk_buffer_view; vk_descriptor->buffer_view = desc->info.view->vk_buffer_view;
return true; return true;
} }
break; break;
@ -2928,23 +2928,23 @@ static bool vkd3d_descriptor_info_from_d3d12_desc(struct d3d12_device *device,
return false; return false;
if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_IMAGE) if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_IMAGE)
&& (desc->u.view->type == VKD3D_VIEW_TYPE_IMAGE)) && (desc->info.view->type == VKD3D_VIEW_TYPE_IMAGE))
{ {
vk_descriptor->image.imageView = desc->u.view->u.vk_image_view; vk_descriptor->image.imageView = desc->info.view->vk_image_view;
vk_descriptor->image.sampler = VK_NULL_HANDLE; vk_descriptor->image.sampler = VK_NULL_HANDLE;
vk_descriptor->image.imageLayout = desc->u.view->info.texture.vk_layout; vk_descriptor->image.imageLayout = desc->info.view->info.texture.vk_layout;
return true; return true;
} }
else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_BUFFER) else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_BUFFER)
&& (desc->u.view->type == VKD3D_VIEW_TYPE_BUFFER)) && (desc->info.view->type == VKD3D_VIEW_TYPE_BUFFER))
{ {
vk_descriptor->buffer_view = desc->u.view->u.vk_buffer_view; vk_descriptor->buffer_view = desc->info.view->vk_buffer_view;
return true; return true;
} }
else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_COUNTER) else if ((binding->flags & VKD3D_SHADER_BINDING_FLAG_COUNTER)
&& desc->u.view->vk_counter_view) && desc->info.view->vk_counter_view)
{ {
vk_descriptor->buffer_view = desc->u.view->vk_counter_view; vk_descriptor->buffer_view = desc->info.view->vk_counter_view;
return true; return true;
} }
break; break;
@ -2953,7 +2953,7 @@ static bool vkd3d_descriptor_info_from_d3d12_desc(struct d3d12_device *device,
if (desc->magic != VKD3D_DESCRIPTOR_MAGIC_SAMPLER) if (desc->magic != VKD3D_DESCRIPTOR_MAGIC_SAMPLER)
return false; return false;
vk_descriptor->image.sampler = desc->u.view->u.vk_sampler; vk_descriptor->image.sampler = desc->info.view->vk_sampler;
vk_descriptor->image.imageView = VK_NULL_HANDLE; vk_descriptor->image.imageView = VK_NULL_HANDLE;
vk_descriptor->image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED; vk_descriptor->image.imageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
return true; return true;
@ -3178,7 +3178,7 @@ static bool vk_write_descriptor_set_from_root_descriptor(VkWriteDescriptorSet *v
{ {
const union vkd3d_descriptor_info *descriptor; const union vkd3d_descriptor_info *descriptor;
descriptor = &descriptors[root_parameter->u.descriptor.packed_descriptor]; descriptor = &descriptors[root_parameter->descriptor.packed_descriptor];
switch (root_parameter->parameter_type) switch (root_parameter->parameter_type)
{ {
@ -3208,7 +3208,7 @@ static bool vk_write_descriptor_set_from_root_descriptor(VkWriteDescriptorSet *v
vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; vk_descriptor_write->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
vk_descriptor_write->pNext = NULL; vk_descriptor_write->pNext = NULL;
vk_descriptor_write->dstSet = vk_descriptor_set; vk_descriptor_write->dstSet = vk_descriptor_set;
vk_descriptor_write->dstBinding = root_parameter->u.descriptor.binding->binding.binding; vk_descriptor_write->dstBinding = root_parameter->descriptor.binding->binding.binding;
vk_descriptor_write->dstArrayElement = 0; vk_descriptor_write->dstArrayElement = 0;
vk_descriptor_write->descriptorCount = 1; vk_descriptor_write->descriptorCount = 1;
vk_descriptor_write->pImageInfo = NULL; vk_descriptor_write->pImageInfo = NULL;
@ -3499,7 +3499,7 @@ static void d3d12_command_list_update_dynamic_state(struct d3d12_command_list *l
struct vkd3d_dynamic_state *dyn_state = &list->dynamic_state; struct vkd3d_dynamic_state *dyn_state = &list->dynamic_state;
/* Make sure we only update states that are dynamic in the pipeline */ /* Make sure we only update states that are dynamic in the pipeline */
dyn_state->dirty_flags &= list->state->u.graphics.dynamic_state_flags; dyn_state->dirty_flags &= list->state->graphics.dynamic_state_flags;
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT) if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
{ {
@ -3582,7 +3582,7 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
/* Emit deferred clears with vkCmdClearAttachment */ /* Emit deferred clears with vkCmdClearAttachment */
d3d12_command_list_emit_render_pass_clears(list, false); d3d12_command_list_emit_render_pass_clears(list, false);
graphics = &list->state->u.graphics; graphics = &list->state->graphics;
if (graphics->xfb_enabled) if (graphics->xfb_enabled)
{ {
VK_CALL(vkCmdBeginTransformFeedbackEXT(list->vk_command_buffer, 0, ARRAY_SIZE(list->so_counter_buffers), VK_CALL(vkCmdBeginTransformFeedbackEXT(list->vk_command_buffer, 0, ARRAY_SIZE(list->so_counter_buffers),
@ -3596,7 +3596,7 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
static void d3d12_command_list_check_index_buffer_strip_cut_value(struct d3d12_command_list *list) static void d3d12_command_list_check_index_buffer_strip_cut_value(struct d3d12_command_list *list)
{ {
struct d3d12_graphics_pipeline_state *graphics = &list->state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &list->state->graphics;
if (TRACE_ON()) if (TRACE_ON())
{ {
/* In Vulkan, the strip cut value is derived from the index buffer format. */ /* In Vulkan, the strip cut value is derived from the index buffer format. */
@ -3722,7 +3722,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyBufferRegion(d3d12_command_
buffer_copy.size = byte_count; buffer_copy.size = byte_count;
VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer, VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer,
src_resource->u.vk_buffer, dst_resource->u.vk_buffer, 1, &buffer_copy)); src_resource->vk_buffer, dst_resource->vk_buffer, 1, &buffer_copy));
} }
static void vk_image_subresource_layers_from_d3d12(VkImageSubresourceLayers *subresource, static void vk_image_subresource_layers_from_d3d12(VkImageSubresourceLayers *subresource,
@ -3913,14 +3913,14 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
vk_image_barriers[0].dstAccessMask = dst_access; vk_image_barriers[0].dstAccessMask = dst_access;
vk_image_barriers[0].oldLayout = dst_resource->common_layout; vk_image_barriers[0].oldLayout = dst_resource->common_layout;
vk_image_barriers[0].newLayout = dst_layout; vk_image_barriers[0].newLayout = dst_layout;
vk_image_barriers[0].image = dst_resource->u.vk_image; vk_image_barriers[0].image = dst_resource->vk_image;
vk_image_barriers[0].subresourceRange = vk_subresource_range_from_layers(&region->dstSubresource); vk_image_barriers[0].subresourceRange = vk_subresource_range_from_layers(&region->dstSubresource);
vk_image_barriers[1].srcAccessMask = 0; vk_image_barriers[1].srcAccessMask = 0;
vk_image_barriers[1].dstAccessMask = src_access; vk_image_barriers[1].dstAccessMask = src_access;
vk_image_barriers[1].oldLayout = src_resource->common_layout; vk_image_barriers[1].oldLayout = src_resource->common_layout;
vk_image_barriers[1].newLayout = src_layout; vk_image_barriers[1].newLayout = src_layout;
vk_image_barriers[1].image = src_resource->u.vk_image; vk_image_barriers[1].image = src_resource->vk_image;
vk_image_barriers[1].subresourceRange = vk_subresource_range_from_layers(&region->srcSubresource); vk_image_barriers[1].subresourceRange = vk_subresource_range_from_layers(&region->srcSubresource);
VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
@ -3931,8 +3931,8 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
if (use_copy) if (use_copy)
{ {
VK_CALL(vkCmdCopyImage(list->vk_command_buffer, VK_CALL(vkCmdCopyImage(list->vk_command_buffer,
src_resource->u.vk_image, src_layout, src_resource->vk_image, src_layout,
dst_resource->u.vk_image, dst_layout, dst_resource->vk_image, dst_layout,
1, region)); 1, region));
} }
else else
@ -3979,8 +3979,8 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
src_view_desc.layer_count = region->srcSubresource.layerCount; src_view_desc.layer_count = region->srcSubresource.layerCount;
src_view_desc.allowed_swizzle = false; src_view_desc.allowed_swizzle = false;
if (!vkd3d_create_texture_view(list->device, dst_resource->u.vk_image, &dst_view_desc, &dst_view) || if (!vkd3d_create_texture_view(list->device, dst_resource->vk_image, &dst_view_desc, &dst_view) ||
!vkd3d_create_texture_view(list->device, src_resource->u.vk_image, &src_view_desc, &src_view)) !vkd3d_create_texture_view(list->device, src_resource->vk_image, &src_view_desc, &src_view))
{ {
ERR("Failed to create image views.\n"); ERR("Failed to create image views.\n");
goto cleanup; goto cleanup;
@ -3997,7 +3997,7 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
extent.height = d3d12_resource_desc_get_height(&dst_resource->desc, dst_view_desc.miplevel_idx); extent.height = d3d12_resource_desc_get_height(&dst_resource->desc, dst_view_desc.miplevel_idx);
extent.depth = dst_view_desc.layer_count; extent.depth = dst_view_desc.layer_count;
if (!d3d12_command_list_create_framebuffer(list, pipeline_info.vk_render_pass, 1, &dst_view->u.vk_image_view, extent, &vk_framebuffer)) if (!d3d12_command_list_create_framebuffer(list, pipeline_info.vk_render_pass, 1, &dst_view->vk_image_view, extent, &vk_framebuffer))
{ {
ERR("Failed to create framebuffer.\n"); ERR("Failed to create framebuffer.\n");
goto cleanup; goto cleanup;
@ -4040,7 +4040,7 @@ static void d3d12_command_list_copy_image(struct d3d12_command_list *list,
} }
vk_image_info.sampler = VK_NULL_HANDLE; vk_image_info.sampler = VK_NULL_HANDLE;
vk_image_info.imageView = src_view->u.vk_image_view; vk_image_info.imageView = src_view->vk_image_view;
vk_image_info.imageLayout = src_view_desc.layout; vk_image_info.imageLayout = src_view_desc.layout;
vk_descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; vk_descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@ -4159,9 +4159,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command
assert(d3d12_resource_is_texture(src_resource)); assert(d3d12_resource_is_texture(src_resource));
if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(list->device, if (!(dst_format = vkd3d_format_from_d3d12_resource_desc(list->device,
&src_resource->desc, dst->u.PlacedFootprint.Footprint.Format))) &src_resource->desc, dst->PlacedFootprint.Footprint.Format)))
{ {
WARN("Invalid format %#x.\n", dst->u.PlacedFootprint.Footprint.Format); WARN("Invalid format %#x.\n", dst->PlacedFootprint.Footprint.Format);
return; return;
} }
@ -4175,22 +4175,22 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command
&& (dst_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) && (dst_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT))
FIXME("Depth-stencil format %#x not fully supported yet.\n", dst_format->dxgi_format); FIXME("Depth-stencil format %#x not fully supported yet.\n", dst_format->dxgi_format);
vk_image_buffer_copy_from_d3d12(&buffer_image_copy, &dst->u.PlacedFootprint, vk_image_buffer_copy_from_d3d12(&buffer_image_copy, &dst->PlacedFootprint,
src->u.SubresourceIndex, &src_resource->desc, dst_format, src_box, dst_x, dst_y, dst_z); src->SubresourceIndex, &src_resource->desc, dst_format, src_box, dst_x, dst_y, dst_z);
buffer_image_copy.bufferOffset += dst_resource->heap_offset; buffer_image_copy.bufferOffset += dst_resource->heap_offset;
vk_layout = d3d12_resource_pick_layout(src_resource, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); vk_layout = d3d12_resource_pick_layout(src_resource, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
d3d12_command_list_transition_image_layout(list, src_resource->u.vk_image, d3d12_command_list_transition_image_layout(list, src_resource->vk_image,
&buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, &buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, src_resource->common_layout, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, src_resource->common_layout, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_READ_BIT, vk_layout); VK_ACCESS_TRANSFER_READ_BIT, vk_layout);
VK_CALL(vkCmdCopyImageToBuffer(list->vk_command_buffer, VK_CALL(vkCmdCopyImageToBuffer(list->vk_command_buffer,
src_resource->u.vk_image, vk_layout, src_resource->vk_image, vk_layout,
dst_resource->u.vk_buffer, 1, &buffer_image_copy)); dst_resource->vk_buffer, 1, &buffer_image_copy));
d3d12_command_list_transition_image_layout(list, src_resource->u.vk_image, d3d12_command_list_transition_image_layout(list, src_resource->vk_image,
&buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, &buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, 0,
vk_layout, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, src_resource->common_layout); vk_layout, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, src_resource->common_layout);
} }
@ -4201,9 +4201,9 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command
assert(d3d12_resource_is_buffer(src_resource)); assert(d3d12_resource_is_buffer(src_resource));
if (!(src_format = vkd3d_format_from_d3d12_resource_desc(list->device, if (!(src_format = vkd3d_format_from_d3d12_resource_desc(list->device,
&dst_resource->desc, src->u.PlacedFootprint.Footprint.Format))) &dst_resource->desc, src->PlacedFootprint.Footprint.Format)))
{ {
WARN("Invalid format %#x.\n", src->u.PlacedFootprint.Footprint.Format); WARN("Invalid format %#x.\n", src->PlacedFootprint.Footprint.Format);
return; return;
} }
@ -4217,22 +4217,22 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command
&& (src_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) && (src_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT))
FIXME("Depth-stencil format %#x not fully supported yet.\n", src_format->dxgi_format); FIXME("Depth-stencil format %#x not fully supported yet.\n", src_format->dxgi_format);
vk_buffer_image_copy_from_d3d12(&buffer_image_copy, &src->u.PlacedFootprint, vk_buffer_image_copy_from_d3d12(&buffer_image_copy, &src->PlacedFootprint,
dst->u.SubresourceIndex, &dst_resource->desc, src_format, src_box, dst_x, dst_y, dst_z); dst->SubresourceIndex, &dst_resource->desc, src_format, src_box, dst_x, dst_y, dst_z);
buffer_image_copy.bufferOffset += src_resource->heap_offset; buffer_image_copy.bufferOffset += src_resource->heap_offset;
vk_layout = d3d12_resource_pick_layout(dst_resource, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); vk_layout = d3d12_resource_pick_layout(dst_resource, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
d3d12_command_list_transition_image_layout(list, dst_resource->u.vk_image, d3d12_command_list_transition_image_layout(list, dst_resource->vk_image,
&buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, &buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, dst_resource->common_layout, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, dst_resource->common_layout, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, vk_layout); VK_ACCESS_TRANSFER_WRITE_BIT, vk_layout);
VK_CALL(vkCmdCopyBufferToImage(list->vk_command_buffer, VK_CALL(vkCmdCopyBufferToImage(list->vk_command_buffer,
src_resource->u.vk_buffer, dst_resource->u.vk_image, src_resource->vk_buffer, dst_resource->vk_image,
vk_layout, 1, &buffer_image_copy)); vk_layout, 1, &buffer_image_copy));
d3d12_command_list_transition_image_layout(list, dst_resource->u.vk_image, d3d12_command_list_transition_image_layout(list, dst_resource->vk_image,
&buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT, &buffer_image_copy.imageSubresource, VK_PIPELINE_STAGE_TRANSFER_BIT,
VK_ACCESS_TRANSFER_WRITE_BIT, vk_layout, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, vk_layout, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, dst_resource->common_layout); 0, dst_resource->common_layout);
@ -4263,7 +4263,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTextureRegion(d3d12_command
&& (src_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) && (src_format->vk_aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT))
FIXME("Depth-stencil format %#x not fully supported yet.\n", src_format->dxgi_format); FIXME("Depth-stencil format %#x not fully supported yet.\n", src_format->dxgi_format);
vk_image_copy_from_d3d12(&image_copy, src->u.SubresourceIndex, dst->u.SubresourceIndex, vk_image_copy_from_d3d12(&image_copy, src->SubresourceIndex, dst->SubresourceIndex,
&src_resource->desc, &dst_resource->desc, src_format, dst_format, &src_resource->desc, &dst_resource->desc, src_format, dst_format,
src_box, dst_x, dst_y, dst_z); src_box, dst_x, dst_y, dst_z);
@ -4309,7 +4309,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyResource(d3d12_command_list
vk_buffer_copy.dstOffset = dst_resource->heap_offset; vk_buffer_copy.dstOffset = dst_resource->heap_offset;
vk_buffer_copy.size = dst_resource->desc.Width; vk_buffer_copy.size = dst_resource->desc.Width;
VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer, VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer,
src_resource->u.vk_buffer, dst_resource->u.vk_buffer, 1, &vk_buffer_copy)); src_resource->vk_buffer, dst_resource->vk_buffer, 1, &vk_buffer_copy));
} }
else else
{ {
@ -4406,7 +4406,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTiles(d3d12_command_list_if
vk_image_barrier.dstAccessMask = copy_to_buffer ? VK_ACCESS_TRANSFER_READ_BIT : VK_ACCESS_TRANSFER_WRITE_BIT; vk_image_barrier.dstAccessMask = copy_to_buffer ? VK_ACCESS_TRANSFER_READ_BIT : VK_ACCESS_TRANSFER_WRITE_BIT;
vk_image_barrier.oldLayout = tiled_res->common_layout; vk_image_barrier.oldLayout = tiled_res->common_layout;
vk_image_barrier.newLayout = vk_image_layout; vk_image_barrier.newLayout = vk_image_layout;
vk_image_barrier.image = tiled_res->u.vk_image; vk_image_barrier.image = tiled_res->vk_image;
/* The entire resource must be in the appropriate copy state */ /* The entire resource must be in the appropriate copy state */
vk_image_barrier.subresourceRange.aspectMask = format->vk_aspect_mask; vk_image_barrier.subresourceRange.aspectMask = format->vk_aspect_mask;
@ -4425,7 +4425,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTiles(d3d12_command_list_if
for (i = 0; i < region_size->NumTiles; i++) for (i = 0; i < region_size->NumTiles; i++)
{ {
unsigned int tile_index = vkd3d_get_tile_index_from_region(&tiled_res->sparse, region_coord, region_size, i); unsigned int tile_index = vkd3d_get_tile_index_from_region(&tiled_res->sparse, region_coord, region_size, i);
const struct d3d12_sparse_image_region *region = &tiled_res->sparse.tiles[tile_index].u.image; const struct d3d12_sparse_image_region *region = &tiled_res->sparse.tiles[tile_index].image;
buffer_image_copy.bufferOffset = buffer_offset + VKD3D_TILE_SIZE * i; buffer_image_copy.bufferOffset = buffer_offset + VKD3D_TILE_SIZE * i;
buffer_image_copy.imageSubresource = vk_subresource_layers_from_subresource(&region->subresource); buffer_image_copy.imageSubresource = vk_subresource_layers_from_subresource(&region->subresource);
@ -4435,13 +4435,13 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTiles(d3d12_command_list_if
if (copy_to_buffer) if (copy_to_buffer)
{ {
VK_CALL(vkCmdCopyImageToBuffer(list->vk_command_buffer, VK_CALL(vkCmdCopyImageToBuffer(list->vk_command_buffer,
tiled_res->u.vk_image, vk_image_layout, linear_res->u.vk_buffer, tiled_res->vk_image, vk_image_layout, linear_res->vk_buffer,
1, &buffer_image_copy)); 1, &buffer_image_copy));
} }
else else
{ {
VK_CALL(vkCmdCopyBufferToImage(list->vk_command_buffer, VK_CALL(vkCmdCopyBufferToImage(list->vk_command_buffer,
linear_res->u.vk_buffer, tiled_res->u.vk_image, vk_image_layout, linear_res->vk_buffer, tiled_res->vk_image, vk_image_layout,
1, &buffer_image_copy)); 1, &buffer_image_copy));
} }
} }
@ -4471,8 +4471,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_CopyTiles(d3d12_command_list_if
} }
VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer, VK_CALL(vkCmdCopyBuffer(list->vk_command_buffer,
copy_to_buffer ? tiled_res->u.vk_buffer : linear_res->u.vk_buffer, copy_to_buffer ? tiled_res->vk_buffer : linear_res->vk_buffer,
copy_to_buffer ? linear_res->u.vk_buffer : tiled_res->u.vk_buffer, copy_to_buffer ? linear_res->vk_buffer : tiled_res->vk_buffer,
1, &buffer_copy)); 1, &buffer_copy));
} }
} }
@ -4565,22 +4565,22 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveSubresource(d3d12_comman
vk_image_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; vk_image_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
vk_image_barriers[0].oldLayout = dst_resource->common_layout; vk_image_barriers[0].oldLayout = dst_resource->common_layout;
vk_image_barriers[0].newLayout = dst_layout; vk_image_barriers[0].newLayout = dst_layout;
vk_image_barriers[0].image = dst_resource->u.vk_image; vk_image_barriers[0].image = dst_resource->vk_image;
vk_image_barriers[0].subresourceRange = vk_subresource_range_from_layers(&vk_image_resolve.dstSubresource); vk_image_barriers[0].subresourceRange = vk_subresource_range_from_layers(&vk_image_resolve.dstSubresource);
vk_image_barriers[1].srcAccessMask = 0; vk_image_barriers[1].srcAccessMask = 0;
vk_image_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; vk_image_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
vk_image_barriers[1].oldLayout = src_resource->common_layout; vk_image_barriers[1].oldLayout = src_resource->common_layout;
vk_image_barriers[1].newLayout = src_layout; vk_image_barriers[1].newLayout = src_layout;
vk_image_barriers[1].image = src_resource->u.vk_image; vk_image_barriers[1].image = src_resource->vk_image;
vk_image_barriers[1].subresourceRange = vk_subresource_range_from_layers(&vk_image_resolve.srcSubresource); vk_image_barriers[1].subresourceRange = vk_subresource_range_from_layers(&vk_image_resolve.srcSubresource);
VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer, VK_CALL(vkCmdPipelineBarrier(list->vk_command_buffer,
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
0, 0, NULL, 0, NULL, ARRAY_SIZE(vk_image_barriers), vk_image_barriers)); 0, 0, NULL, 0, NULL, ARRAY_SIZE(vk_image_barriers), vk_image_barriers));
VK_CALL(vkCmdResolveImage(list->vk_command_buffer, src_resource->u.vk_image, VK_CALL(vkCmdResolveImage(list->vk_command_buffer, src_resource->vk_image,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_resource->u.vk_image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_resource->vk_image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &vk_image_resolve)); VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &vk_image_resolve));
vk_image_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; vk_image_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
@ -4734,11 +4734,11 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetPipelineState(d3d12_command_
if (d3d12_pipeline_state_is_graphics(state)) if (d3d12_pipeline_state_is_graphics(state))
{ {
uint32_t old_dynamic_state_flags = d3d12_pipeline_state_is_graphics(list->state) uint32_t old_dynamic_state_flags = d3d12_pipeline_state_is_graphics(list->state)
? list->state->u.graphics.dynamic_state_flags ? list->state->graphics.dynamic_state_flags
: 0u; : 0u;
/* Reapply all dynamic states that were not dynamic in previously bound pipeline */ /* Reapply all dynamic states that were not dynamic in previously bound pipeline */
list->dynamic_state.dirty_flags |= state->u.graphics.dynamic_state_flags & ~old_dynamic_state_flags; list->dynamic_state.dirty_flags |= state->graphics.dynamic_state_flags & ~old_dynamic_state_flags;
} }
list->state = state; list->state = state;
@ -4778,7 +4778,7 @@ static bool vk_image_memory_barrier_from_d3d12_transition(const struct d3d12_dev
vk_barrier->newLayout = vk_image_layout_from_d3d12_resource_state(resource, transition->StateAfter); vk_barrier->newLayout = vk_image_layout_from_d3d12_resource_state(resource, transition->StateAfter);
vk_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier->srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; vk_barrier->dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
vk_barrier->image = resource->u.vk_image; vk_barrier->image = resource->vk_image;
vk_barrier->subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; vk_barrier->subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
if (transition->Subresource == D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES) if (transition->Subresource == D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES)
@ -4843,7 +4843,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l
{ {
case D3D12_RESOURCE_BARRIER_TYPE_TRANSITION: case D3D12_RESOURCE_BARRIER_TYPE_TRANSITION:
{ {
const D3D12_RESOURCE_TRANSITION_BARRIER *transition = &current->u.Transition; const D3D12_RESOURCE_TRANSITION_BARRIER *transition = &current->Transition;
VkPipelineStageFlags src_image_stage_mask = 0, dst_image_stage_mask = 0; VkPipelineStageFlags src_image_stage_mask = 0, dst_image_stage_mask = 0;
if (!is_valid_resource_state(transition->StateBefore)) if (!is_valid_resource_state(transition->StateBefore))
@ -4890,7 +4890,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResourceBarrier(d3d12_command_l
case D3D12_RESOURCE_BARRIER_TYPE_UAV: case D3D12_RESOURCE_BARRIER_TYPE_UAV:
{ {
const D3D12_RESOURCE_UAV_BARRIER *uav = &current->u.UAV; const D3D12_RESOURCE_UAV_BARRIER *uav = &current->UAV;
resource = unsafe_impl_from_ID3D12Resource(uav->pResource); resource = unsafe_impl_from_ID3D12Resource(uav->pResource);
vk_access_and_stage_flags_from_d3d12_resource_state(list->device, resource, vk_access_and_stage_flags_from_d3d12_resource_state(list->device, resource,
@ -5146,14 +5146,14 @@ static void d3d12_command_list_set_root_descriptor(struct d3d12_command_list *li
VkBufferView vk_buffer_view; VkBufferView vk_buffer_view;
root_parameter = root_signature_get_root_descriptor(root_signature, index); root_parameter = root_signature_get_root_descriptor(root_signature, index);
descriptor = &bindings->root_descriptors[root_parameter->u.descriptor.packed_descriptor]; descriptor = &bindings->root_descriptors[root_parameter->descriptor.packed_descriptor];
if (root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV) if (root_parameter->parameter_type == D3D12_ROOT_PARAMETER_TYPE_CBV)
{ {
if (gpu_address) if (gpu_address)
{ {
resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, gpu_address); resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, gpu_address);
descriptor->buffer.buffer = resource->u.vk_buffer; descriptor->buffer.buffer = resource->vk_buffer;
descriptor->buffer.offset = gpu_address - resource->gpu_address; descriptor->buffer.offset = gpu_address - resource->gpu_address;
descriptor->buffer.range = min(resource->desc.Width - descriptor->buffer.offset, descriptor->buffer.range = min(resource->desc.Width - descriptor->buffer.offset,
vk_info->device_limits.maxUniformBufferRange); vk_info->device_limits.maxUniformBufferRange);
@ -5302,7 +5302,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetIndexBuffer(d3d12_command_
list->index_buffer_format = view->Format; list->index_buffer_format = view->Format;
resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, view->BufferLocation); resource = vkd3d_gpu_va_allocator_dereference(&list->device->gpu_va_allocator, view->BufferLocation);
VK_CALL(vkCmdBindIndexBuffer(list->vk_command_buffer, resource->u.vk_buffer, VK_CALL(vkCmdBindIndexBuffer(list->vk_command_buffer, resource->vk_buffer,
view->BufferLocation - resource->gpu_address, index_type)); view->BufferLocation - resource->gpu_address, index_type));
} }
@ -5338,7 +5338,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_IASetVertexBuffers(d3d12_comman
if (views[i].BufferLocation) if (views[i].BufferLocation)
{ {
resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferLocation); resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferLocation);
buffers[i] = resource->u.vk_buffer; buffers[i] = resource->vk_buffer;
offsets[i] = views[i].BufferLocation - resource->gpu_address; offsets[i] = views[i].BufferLocation - resource->gpu_address;
stride = views[i].StrideInBytes; stride = views[i].StrideInBytes;
} }
@ -5398,12 +5398,12 @@ static void STDMETHODCALLTYPE d3d12_command_list_SOSetTargets(d3d12_command_list
if (views[i].BufferLocation && views[i].SizeInBytes) if (views[i].BufferLocation && views[i].SizeInBytes)
{ {
resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferLocation); resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferLocation);
buffers[count] = resource->u.vk_buffer; buffers[count] = resource->vk_buffer;
offsets[count] = views[i].BufferLocation - resource->gpu_address; offsets[count] = views[i].BufferLocation - resource->gpu_address;
sizes[count] = views[i].SizeInBytes; sizes[count] = views[i].SizeInBytes;
resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferFilledSizeLocation); resource = vkd3d_gpu_va_allocator_dereference(gpu_va_allocator, views[i].BufferFilledSizeLocation);
list->so_counter_buffers[start_slot + i] = resource->u.vk_buffer; list->so_counter_buffers[start_slot + i] = resource->vk_buffer;
list->so_counter_buffer_offsets[start_slot + i] = views[i].BufferFilledSizeLocation - resource->gpu_address; list->so_counter_buffer_offsets[start_slot + i] = views[i].BufferFilledSizeLocation - resource->gpu_address;
++count; ++count;
} }
@ -5673,7 +5673,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list,
if (d3d12_resource_is_texture(resource)) if (d3d12_resource_is_texture(resource))
{ {
image_info.sampler = VK_NULL_HANDLE; image_info.sampler = VK_NULL_HANDLE;
image_info.imageView = view->u.vk_image_view; image_info.imageView = view->vk_image_view;
image_info.imageLayout = view->info.texture.vk_layout; image_info.imageLayout = view->info.texture.vk_layout;
write_set.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; write_set.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
@ -5695,7 +5695,7 @@ static void d3d12_command_list_clear_uav(struct d3d12_command_list *list,
write_set.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; write_set.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
write_set.pImageInfo = NULL; write_set.pImageInfo = NULL;
write_set.pBufferInfo = NULL; write_set.pBufferInfo = NULL;
write_set.pTexelBufferView = &view->u.vk_buffer_view; write_set.pTexelBufferView = &view->vk_buffer_view;
miplevel_idx = 0; miplevel_idx = 0;
layer_count = 1; layer_count = 1;
@ -5792,7 +5792,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
resource_impl = unsafe_impl_from_ID3D12Resource(resource); resource_impl = unsafe_impl_from_ID3D12Resource(resource);
base_view = d3d12_desc_from_cpu_handle(cpu_handle)->u.view; base_view = d3d12_desc_from_cpu_handle(cpu_handle)->info.view;
uint_view = NULL; uint_view = NULL;
if (base_view->format->type != VKD3D_FORMAT_TYPE_UINT) if (base_view->format->type != VKD3D_FORMAT_TYPE_UINT)
@ -5818,7 +5818,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
view_desc.layer_count = base_view->info.texture.layer_count; view_desc.layer_count = base_view->info.texture.layer_count;
view_desc.allowed_swizzle = false; view_desc.allowed_swizzle = false;
if (!vkd3d_create_texture_view(list->device, resource_impl->u.vk_image, &view_desc, &uint_view)) if (!vkd3d_create_texture_view(list->device, resource_impl->vk_image, &view_desc, &uint_view))
{ {
ERR("Failed to create image view.\n"); ERR("Failed to create image view.\n");
return; return;
@ -5826,7 +5826,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(d3
} }
else else
{ {
if (!vkd3d_create_buffer_view(list->device, resource_impl->u.vk_buffer, uint_format, if (!vkd3d_create_buffer_view(list->device, resource_impl->vk_buffer, uint_format,
base_view->info.buffer.offset, base_view->info.buffer.size, &uint_view)) base_view->info.buffer.offset, base_view->info.buffer.size, &uint_view))
{ {
ERR("Failed to create buffer view.\n"); ERR("Failed to create buffer view.\n");
@ -5857,7 +5857,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(d
memcpy(color.float32, values, sizeof(color.float32)); memcpy(color.float32, values, sizeof(color.float32));
resource_impl = unsafe_impl_from_ID3D12Resource(resource); resource_impl = unsafe_impl_from_ID3D12Resource(resource);
view = d3d12_desc_from_cpu_handle(cpu_handle)->u.view; view = d3d12_desc_from_cpu_handle(cpu_handle)->info.view;
d3d12_command_list_clear_uav(list, resource_impl, view, &color, rect_count, rects); d3d12_command_list_clear_uav(list, resource_impl, view, &color, rect_count, rects);
} }
@ -5995,7 +5995,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_
if (count) if (count)
{ {
VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer, VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer,
query_heap->vk_query_pool, first, count, buffer->u.vk_buffer, query_heap->vk_query_pool, first, count, buffer->vk_buffer,
buffer->heap_offset + offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); buffer->heap_offset + offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT));
} }
count = 0; count = 0;
@ -6009,7 +6009,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_
* a VK_ERROR_DEVICE_LOST error may occur." * a VK_ERROR_DEVICE_LOST error may occur."
*/ */
VK_CALL(vkCmdFillBuffer(list->vk_command_buffer, VK_CALL(vkCmdFillBuffer(list->vk_command_buffer,
buffer->u.vk_buffer, buffer->heap_offset + offset, stride, 0x00000000)); buffer->vk_buffer, buffer->heap_offset + offset, stride, 0x00000000));
++first; ++first;
offset += stride; offset += stride;
@ -6019,7 +6019,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ResolveQueryData(d3d12_command_
if (count) if (count)
{ {
VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer, VK_CALL(vkCmdCopyQueryPoolResults(list->vk_command_buffer,
query_heap->vk_query_pool, first, count, buffer->u.vk_buffer, query_heap->vk_query_pool, first, count, buffer->vk_buffer,
buffer->heap_offset + offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT)); buffer->heap_offset + offset, stride, VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT));
} }
} }
@ -6066,7 +6066,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetPredication(d3d12_command_li
cond_info.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT; cond_info.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
cond_info.pNext = NULL; cond_info.pNext = NULL;
cond_info.buffer = resource->u.vk_buffer; cond_info.buffer = resource->vk_buffer;
cond_info.offset = aligned_buffer_offset; cond_info.offset = aligned_buffer_offset;
switch (operation) switch (operation)
{ {
@ -6249,14 +6249,14 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(d3d12_command_l
if (count_buffer) if (count_buffer)
{ {
VK_CALL(vkCmdDrawIndirectCountKHR(list->vk_command_buffer, arg_impl->u.vk_buffer, VK_CALL(vkCmdDrawIndirectCountKHR(list->vk_command_buffer, arg_impl->vk_buffer,
arg_buffer_offset + arg_impl->heap_offset, count_impl->u.vk_buffer, arg_buffer_offset + arg_impl->heap_offset, count_impl->vk_buffer,
count_buffer_offset + count_impl->heap_offset, count_buffer_offset + count_impl->heap_offset,
max_command_count, signature_desc->ByteStride)); max_command_count, signature_desc->ByteStride));
} }
else else
{ {
VK_CALL(vkCmdDrawIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer, VK_CALL(vkCmdDrawIndirect(list->vk_command_buffer, arg_impl->vk_buffer,
arg_buffer_offset + arg_impl->heap_offset, max_command_count, signature_desc->ByteStride)); arg_buffer_offset + arg_impl->heap_offset, max_command_count, signature_desc->ByteStride));
} }
break; break;
@ -6272,14 +6272,14 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(d3d12_command_l
if (count_buffer) if (count_buffer)
{ {
VK_CALL(vkCmdDrawIndexedIndirectCountKHR(list->vk_command_buffer, arg_impl->u.vk_buffer, VK_CALL(vkCmdDrawIndexedIndirectCountKHR(list->vk_command_buffer, arg_impl->vk_buffer,
arg_buffer_offset + arg_impl->heap_offset, count_impl->u.vk_buffer, arg_buffer_offset + arg_impl->heap_offset, count_impl->vk_buffer,
count_buffer_offset + count_impl->heap_offset, count_buffer_offset + count_impl->heap_offset,
max_command_count, signature_desc->ByteStride)); max_command_count, signature_desc->ByteStride));
} }
else else
{ {
VK_CALL(vkCmdDrawIndexedIndirect(list->vk_command_buffer, arg_impl->u.vk_buffer, VK_CALL(vkCmdDrawIndexedIndirect(list->vk_command_buffer, arg_impl->vk_buffer,
arg_buffer_offset + arg_impl->heap_offset, max_command_count, signature_desc->ByteStride)); arg_buffer_offset + arg_impl->heap_offset, max_command_count, signature_desc->ByteStride));
} }
break; break;
@ -6301,7 +6301,7 @@ static void STDMETHODCALLTYPE d3d12_command_list_ExecuteIndirect(d3d12_command_l
} }
VK_CALL(vkCmdDispatchIndirect(list->vk_command_buffer, VK_CALL(vkCmdDispatchIndirect(list->vk_command_buffer,
arg_impl->u.vk_buffer, arg_buffer_offset + arg_impl->heap_offset)); arg_impl->vk_buffer, arg_buffer_offset + arg_impl->heap_offset));
break; break;
default: default:
@ -6821,11 +6821,11 @@ static void STDMETHODCALLTYPE d3d12_command_queue_UpdateTileMappings(ID3D12Comma
return; return;
sub.type = VKD3D_SUBMISSION_BIND_SPARSE; sub.type = VKD3D_SUBMISSION_BIND_SPARSE;
sub.u.bind_sparse.mode = VKD3D_SPARSE_MEMORY_BIND_MODE_UPDATE; sub.bind_sparse.mode = VKD3D_SPARSE_MEMORY_BIND_MODE_UPDATE;
sub.u.bind_sparse.bind_count = 0; sub.bind_sparse.bind_count = 0;
sub.u.bind_sparse.bind_infos = NULL; sub.bind_sparse.bind_infos = NULL;
sub.u.bind_sparse.dst_resource = res; sub.bind_sparse.dst_resource = res;
sub.u.bind_sparse.src_resource = NULL; sub.bind_sparse.src_resource = NULL;
if (region_coords) if (region_coords)
region_coord = region_coords[0]; region_coord = region_coords[0];
@ -6866,14 +6866,14 @@ static void STDMETHODCALLTYPE d3d12_command_queue_UpdateTileMappings(ID3D12Comma
if (!(bind = bound_tiles[tile_index])) if (!(bind = bound_tiles[tile_index]))
{ {
if (!vkd3d_array_reserve((void **)&sub.u.bind_sparse.bind_infos, &bind_infos_size, if (!vkd3d_array_reserve((void **)&sub.bind_sparse.bind_infos, &bind_infos_size,
sub.u.bind_sparse.bind_count + 1, sizeof(*sub.u.bind_sparse.bind_infos))) sub.bind_sparse.bind_count + 1, sizeof(*sub.bind_sparse.bind_infos)))
{ {
ERR("Failed to allocate bind info array.\n"); ERR("Failed to allocate bind info array.\n");
goto fail; goto fail;
} }
bind = &sub.u.bind_sparse.bind_infos[sub.u.bind_sparse.bind_count++]; bind = &sub.bind_sparse.bind_infos[sub.bind_sparse.bind_count++];
bound_tiles[tile_index] = bind; bound_tiles[tile_index] = bind;
} }
@ -6926,7 +6926,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_UpdateTileMappings(ID3D12Comma
fail: fail:
vkd3d_free(bound_tiles); vkd3d_free(bound_tiles);
vkd3d_free(sub.u.bind_sparse.bind_infos); vkd3d_free(sub.bind_sparse.bind_infos);
} }
static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12CommandQueue *iface, static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12CommandQueue *iface,
@ -6947,13 +6947,13 @@ static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12Command
src_region_start_coordinate, region_size, flags); src_region_start_coordinate, region_size, flags);
sub.type = VKD3D_SUBMISSION_BIND_SPARSE; sub.type = VKD3D_SUBMISSION_BIND_SPARSE;
sub.u.bind_sparse.mode = VKD3D_SPARSE_MEMORY_BIND_MODE_COPY; sub.bind_sparse.mode = VKD3D_SPARSE_MEMORY_BIND_MODE_COPY;
sub.u.bind_sparse.bind_count = region_size->NumTiles; sub.bind_sparse.bind_count = region_size->NumTiles;
sub.u.bind_sparse.bind_infos = vkd3d_malloc(region_size->NumTiles * sizeof(*sub.u.bind_sparse.bind_infos)); sub.bind_sparse.bind_infos = vkd3d_malloc(region_size->NumTiles * sizeof(*sub.bind_sparse.bind_infos));
sub.u.bind_sparse.dst_resource = dst_res; sub.bind_sparse.dst_resource = dst_res;
sub.u.bind_sparse.src_resource = src_res; sub.bind_sparse.src_resource = src_res;
if (!sub.u.bind_sparse.bind_infos) if (!sub.bind_sparse.bind_infos)
{ {
ERR("Failed to allocate bind info array.\n"); ERR("Failed to allocate bind info array.\n");
return; return;
@ -6961,7 +6961,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12Command
for (i = 0; i < region_size->NumTiles; i++) for (i = 0; i < region_size->NumTiles; i++)
{ {
bind = &sub.u.bind_sparse.bind_infos[i]; bind = &sub.bind_sparse.bind_infos[i];
bind->dst_tile = vkd3d_get_tile_index_from_region(&dst_res->sparse, dst_region_start_coordinate, region_size, i); bind->dst_tile = vkd3d_get_tile_index_from_region(&dst_res->sparse, dst_region_start_coordinate, region_size, i);
bind->src_tile = vkd3d_get_tile_index_from_region(&src_res->sparse, src_region_start_coordinate, region_size, i); bind->src_tile = vkd3d_get_tile_index_from_region(&src_res->sparse, src_region_start_coordinate, region_size, i);
bind->vk_memory = VK_NULL_HANDLE; bind->vk_memory = VK_NULL_HANDLE;
@ -7017,9 +7017,9 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
} }
sub.type = VKD3D_SUBMISSION_EXECUTE; sub.type = VKD3D_SUBMISSION_EXECUTE;
sub.u.execute.cmd = buffers; sub.execute.cmd = buffers;
sub.u.execute.count = command_list_count; sub.execute.count = command_list_count;
sub.u.execute.outstanding_submissions_count = outstanding; sub.execute.outstanding_submissions_count = outstanding;
d3d12_command_queue_add_submission(command_queue, &sub); d3d12_command_queue_add_submission(command_queue, &sub);
} }
@ -7054,8 +7054,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Signal(ID3D12CommandQueue *
fence = unsafe_impl_from_ID3D12Fence(fence_iface); fence = unsafe_impl_from_ID3D12Fence(fence_iface);
sub.type = VKD3D_SUBMISSION_SIGNAL; sub.type = VKD3D_SUBMISSION_SIGNAL;
sub.u.signal.fence = fence; sub.signal.fence = fence;
sub.u.signal.value = value; sub.signal.value = value;
d3d12_command_queue_add_submission(command_queue, &sub); d3d12_command_queue_add_submission(command_queue, &sub);
return S_OK; return S_OK;
} }
@ -7072,8 +7072,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Wait(ID3D12CommandQueue *if
fence = unsafe_impl_from_ID3D12Fence(fence_iface); fence = unsafe_impl_from_ID3D12Fence(fence_iface);
sub.type = VKD3D_SUBMISSION_WAIT; sub.type = VKD3D_SUBMISSION_WAIT;
sub.u.wait.fence = fence; sub.wait.fence = fence;
sub.u.wait.value = value; sub.wait.value = value;
d3d12_command_queue_add_submission(command_queue, &sub); d3d12_command_queue_add_submission(command_queue, &sub);
return S_OK; return S_OK;
} }
@ -7423,7 +7423,7 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
goto cleanup; goto cleanup;
} }
buffer_info.buffer = dst_resource->u.vk_buffer; buffer_info.buffer = dst_resource->vk_buffer;
buffer_info.bindCount = count; buffer_info.bindCount = count;
buffer_info.pBinds = memory_binds; buffer_info.pBinds = memory_binds;
@ -7456,7 +7456,7 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
goto cleanup; goto cleanup;
} }
opaque_info.image = dst_resource->u.vk_image; opaque_info.image = dst_resource->vk_image;
opaque_info.bindCount = opaque_bind_count; opaque_info.bindCount = opaque_bind_count;
opaque_info.pBinds = memory_binds; opaque_info.pBinds = memory_binds;
@ -7472,7 +7472,7 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
goto cleanup; goto cleanup;
} }
image_info.image = dst_resource->u.vk_image; image_info.image = dst_resource->vk_image;
image_info.bindCount = image_bind_count; image_info.bindCount = image_bind_count;
image_info.pBinds = image_binds; image_info.pBinds = image_binds;
@ -7501,9 +7501,9 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
if (d3d12_resource_is_texture(dst_resource) && bind->dst_tile < first_packed_tile) if (d3d12_resource_is_texture(dst_resource) && bind->dst_tile < first_packed_tile)
{ {
VkSparseImageMemoryBind *vk_bind = &image_binds[j++]; VkSparseImageMemoryBind *vk_bind = &image_binds[j++];
vk_bind->subresource = tile->u.image.subresource; vk_bind->subresource = tile->image.subresource;
vk_bind->offset = tile->u.image.offset; vk_bind->offset = tile->image.offset;
vk_bind->extent = tile->u.image.extent; vk_bind->extent = tile->image.extent;
vk_bind->memory = vk_memory; vk_bind->memory = vk_memory;
vk_bind->memoryOffset = vk_offset; vk_bind->memoryOffset = vk_offset;
vk_bind->flags = 0; vk_bind->flags = 0;
@ -7511,8 +7511,8 @@ static void d3d12_command_queue_bind_sparse(struct d3d12_command_queue *command_
else else
{ {
VkSparseMemoryBind *vk_bind = &memory_binds[k++]; VkSparseMemoryBind *vk_bind = &memory_binds[k++];
vk_bind->resourceOffset = tile->u.buffer.offset; vk_bind->resourceOffset = tile->buffer.offset;
vk_bind->size = tile->u.buffer.length; vk_bind->size = tile->buffer.length;
vk_bind->memory = vk_memory; vk_bind->memory = vk_memory;
vk_bind->memoryOffset = vk_offset; vk_bind->memoryOffset = vk_offset;
vk_bind->flags = 0; vk_bind->flags = 0;
@ -7617,27 +7617,27 @@ static void *d3d12_command_queue_submission_worker_main(void *userdata)
return NULL; return NULL;
case VKD3D_SUBMISSION_WAIT: case VKD3D_SUBMISSION_WAIT:
d3d12_command_queue_wait(queue, submission.u.wait.fence, submission.u.wait.value); d3d12_command_queue_wait(queue, submission.wait.fence, submission.wait.value);
break; break;
case VKD3D_SUBMISSION_SIGNAL: case VKD3D_SUBMISSION_SIGNAL:
d3d12_command_queue_signal(queue, submission.u.signal.fence, submission.u.signal.value); d3d12_command_queue_signal(queue, submission.signal.fence, submission.signal.value);
break; break;
case VKD3D_SUBMISSION_EXECUTE: case VKD3D_SUBMISSION_EXECUTE:
d3d12_command_queue_execute(queue, submission.u.execute.cmd, submission.u.execute.count); d3d12_command_queue_execute(queue, submission.execute.cmd, submission.execute.count);
vkd3d_free(submission.u.execute.cmd); vkd3d_free(submission.execute.cmd);
/* TODO: The correct place to do this would be in a fence handler, but this is good enough for now. */ /* TODO: The correct place to do this would be in a fence handler, but this is good enough for now. */
for (i = 0; i < submission.u.execute.count; i++) for (i = 0; i < submission.execute.count; i++)
InterlockedDecrement(submission.u.execute.outstanding_submissions_count[i]); InterlockedDecrement(submission.execute.outstanding_submissions_count[i]);
vkd3d_free(submission.u.execute.outstanding_submissions_count); vkd3d_free(submission.execute.outstanding_submissions_count);
break; break;
case VKD3D_SUBMISSION_BIND_SPARSE: case VKD3D_SUBMISSION_BIND_SPARSE:
d3d12_command_queue_bind_sparse(queue, submission.u.bind_sparse.mode, d3d12_command_queue_bind_sparse(queue, submission.bind_sparse.mode,
submission.u.bind_sparse.dst_resource, submission.u.bind_sparse.src_resource, submission.bind_sparse.dst_resource, submission.bind_sparse.src_resource,
submission.u.bind_sparse.bind_count, submission.u.bind_sparse.bind_infos); submission.bind_sparse.bind_count, submission.bind_sparse.bind_infos);
vkd3d_free(submission.u.bind_sparse.bind_infos); vkd3d_free(submission.bind_sparse.bind_infos);
break; break;
case VKD3D_SUBMISSION_DRAIN: case VKD3D_SUBMISSION_DRAIN:

View File

@ -650,13 +650,13 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
{ {
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
{ {
hr = vkd3d_allocate_buffer_memory(device, resource->u.vk_buffer, hr = vkd3d_allocate_buffer_memory(device, resource->vk_buffer,
&heap->desc.Properties, heap->desc.Flags | D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS, &heap->desc.Properties, heap->desc.Flags | D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS,
&heap->vk_memory, &heap->vk_memory_type, &vk_memory_size); &heap->vk_memory, &heap->vk_memory_type, &vk_memory_size);
} }
else else
{ {
hr = vkd3d_allocate_image_memory(device, resource->u.vk_image, hr = vkd3d_allocate_image_memory(device, resource->vk_image,
&heap->desc.Properties, heap->desc.Flags, &heap->desc.Properties, heap->desc.Flags,
&heap->vk_memory, &heap->vk_memory_type, &vk_memory_size); &heap->vk_memory, &heap->vk_memory_type, &vk_memory_size);
} }
@ -665,7 +665,7 @@ static HRESULT d3d12_heap_init(struct d3d12_heap *heap,
} }
else if (heap->buffer_resource) else if (heap->buffer_resource)
{ {
hr = vkd3d_allocate_buffer_memory(device, heap->buffer_resource->u.vk_buffer, hr = vkd3d_allocate_buffer_memory(device, heap->buffer_resource->vk_buffer,
&heap->desc.Properties, heap->desc.Flags, &heap->desc.Properties, heap->desc.Flags,
&heap->vk_memory, &heap->vk_memory_type, &vk_memory_size); &heap->vk_memory, &heap->vk_memory_type, &vk_memory_size);
} }
@ -1246,7 +1246,7 @@ static void d3d12_resource_get_tiling(struct d3d12_device *device, struct d3d12_
else else
{ {
VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device, VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device,
resource->u.vk_image, &memory_requirement_count, NULL)); resource->vk_image, &memory_requirement_count, NULL));
if (!memory_requirement_count) if (!memory_requirement_count)
{ {
@ -1257,7 +1257,7 @@ static void d3d12_resource_get_tiling(struct d3d12_device *device, struct d3d12_
memory_requirements = vkd3d_malloc(memory_requirement_count * sizeof(*memory_requirements)); memory_requirements = vkd3d_malloc(memory_requirement_count * sizeof(*memory_requirements));
VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device, VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device,
resource->u.vk_image, &memory_requirement_count, memory_requirements)); resource->vk_image, &memory_requirement_count, memory_requirements));
for (i = 0; i < memory_requirement_count; i++) for (i = 0; i < memory_requirement_count; i++)
{ {
@ -1353,9 +1353,9 @@ static void d3d12_resource_destroy(struct d3d12_resource *resource, struct d3d12
vkd3d_gpu_va_allocator_free(&device->gpu_va_allocator, resource->gpu_address); vkd3d_gpu_va_allocator_free(&device->gpu_va_allocator, resource->gpu_address);
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
VK_CALL(vkDestroyBuffer(device->vk_device, resource->u.vk_buffer, NULL)); VK_CALL(vkDestroyBuffer(device->vk_device, resource->vk_buffer, NULL));
else else
VK_CALL(vkDestroyImage(device->vk_device, resource->u.vk_image, NULL)); VK_CALL(vkDestroyImage(device->vk_device, resource->vk_image, NULL));
} }
if (resource->flags & VKD3D_RESOURCE_DEDICATED_HEAP) if (resource->flags & VKD3D_RESOURCE_DEDICATED_HEAP)
@ -1540,10 +1540,10 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_SetName(d3d12_resource_iface *if
} }
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->u.vk_buffer, return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->vk_buffer,
VK_OBJECT_TYPE_BUFFER, name); VK_OBJECT_TYPE_BUFFER, name);
else else
return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->u.vk_image, return vkd3d_set_vk_object_name(resource->device, (uint64_t)resource->vk_image,
VK_OBJECT_TYPE_IMAGE, name); VK_OBJECT_TYPE_IMAGE, name);
} }
@ -1775,7 +1775,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_WriteToSubresource(d3d12_resourc
return E_NOTIMPL; return E_NOTIMPL;
} }
VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->u.vk_image, &vk_sub_resource, &vk_layout)); VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->vk_image, &vk_sub_resource, &vk_layout));
TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n", TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n",
vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch); vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch);
@ -1860,7 +1860,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_resource_ReadFromSubresource(d3d12_resour
return E_NOTIMPL; return E_NOTIMPL;
} }
VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->u.vk_image, &vk_sub_resource, &vk_layout)); VK_CALL(vkGetImageSubresourceLayout(device->vk_device, resource->vk_image, &vk_sub_resource, &vk_layout));
TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n", TRACE("Offset %#"PRIx64", size %#"PRIx64", row pitch %#"PRIx64", depth pitch %#"PRIx64".\n",
vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch); vk_layout.offset, vk_layout.size, vk_layout.rowPitch, vk_layout.depthPitch);
@ -2143,7 +2143,7 @@ static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resour
* drivers, so most of the time we'll just return early. The implementation * drivers, so most of the time we'll just return early. The implementation
* is therefore aimed at simplicity, and not very well tested in practice. */ * is therefore aimed at simplicity, and not very well tested in practice. */
VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device, VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device,
resource->u.vk_image, &sparse_requirement_count, NULL)); resource->vk_image, &sparse_requirement_count, NULL));
if (!(sparse_requirements = vkd3d_malloc(sparse_requirement_count * sizeof(*sparse_requirements)))) if (!(sparse_requirements = vkd3d_malloc(sparse_requirement_count * sizeof(*sparse_requirements))))
{ {
@ -2153,7 +2153,7 @@ static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resour
} }
VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device, VK_CALL(vkGetImageSparseMemoryRequirements(device->vk_device,
resource->u.vk_image, &sparse_requirement_count, sparse_requirements)); resource->vk_image, &sparse_requirement_count, sparse_requirements));
/* Find out how much memory and how many bind infos we need */ /* Find out how much memory and how many bind infos we need */
metadata_size = 0; metadata_size = 0;
@ -2181,7 +2181,7 @@ static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resour
/* Allocate memory for metadata mip tail */ /* Allocate memory for metadata mip tail */
TRACE("Allocating sparse metadata for resource %p.\n", resource); TRACE("Allocating sparse metadata for resource %p.\n", resource);
VK_CALL(vkGetImageMemoryRequirements(device->vk_device, resource->u.vk_image, &memory_requirements)); VK_CALL(vkGetImageMemoryRequirements(device->vk_device, resource->vk_image, &memory_requirements));
if ((vr = vkd3d_allocate_memory(device, metadata_size, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, if ((vr = vkd3d_allocate_memory(device, metadata_size, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
memory_requirements.memoryTypeBits, NULL, &sparse->vk_metadata_memory, NULL))) memory_requirements.memoryTypeBits, NULL, &sparse->vk_metadata_memory, NULL)))
@ -2227,7 +2227,7 @@ static HRESULT d3d12_resource_bind_sparse_metadata(struct d3d12_resource *resour
} }
/* Bind metadata memory to the image */ /* Bind metadata memory to the image */
opaque_bind.image = resource->u.vk_image; opaque_bind.image = resource->vk_image;
opaque_bind.bindCount = bind_count; opaque_bind.bindCount = bind_count;
opaque_bind.pBinds = memory_binds; opaque_bind.pBinds = memory_binds;
@ -2318,18 +2318,18 @@ static HRESULT d3d12_resource_init_sparse_info(struct d3d12_resource *resource,
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
{ {
VkDeviceSize offset = VKD3D_TILE_SIZE * i; VkDeviceSize offset = VKD3D_TILE_SIZE * i;
sparse->tiles[i].u.buffer.offset = offset; sparse->tiles[i].buffer.offset = offset;
sparse->tiles[i].u.buffer.length = min(VKD3D_TILE_SIZE, resource->desc.Width - offset); sparse->tiles[i].buffer.length = min(VKD3D_TILE_SIZE, resource->desc.Width - offset);
} }
else if (sparse->packed_mips.NumPackedMips && i >= sparse->packed_mips.StartTileIndexInOverallResource) else if (sparse->packed_mips.NumPackedMips && i >= sparse->packed_mips.StartTileIndexInOverallResource)
{ {
VkDeviceSize offset = VKD3D_TILE_SIZE * (i - sparse->packed_mips.StartTileIndexInOverallResource); VkDeviceSize offset = VKD3D_TILE_SIZE * (i - sparse->packed_mips.StartTileIndexInOverallResource);
sparse->tiles[i].u.buffer.offset = vk_memory_requirements.imageMipTailOffset + offset; sparse->tiles[i].buffer.offset = vk_memory_requirements.imageMipTailOffset + offset;
sparse->tiles[i].u.buffer.length = min(VKD3D_TILE_SIZE, vk_memory_requirements.imageMipTailSize - offset); sparse->tiles[i].buffer.length = min(VKD3D_TILE_SIZE, vk_memory_requirements.imageMipTailSize - offset);
} }
else else
{ {
struct d3d12_sparse_image_region *region = &sparse->tiles[i].u.image; struct d3d12_sparse_image_region *region = &sparse->tiles[i].image;
VkExtent3D block_extent = vk_memory_requirements.formatProperties.imageGranularity; VkExtent3D block_extent = vk_memory_requirements.formatProperties.imageGranularity;
VkExtent3D mip_extent; VkExtent3D mip_extent;
@ -2430,12 +2430,12 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
/* We'll inherit a VkBuffer reference from the heap with an implied offset. */ /* We'll inherit a VkBuffer reference from the heap with an implied offset. */
if (placed) if (placed)
{ {
resource->u.vk_buffer = VK_NULL_HANDLE; resource->vk_buffer = VK_NULL_HANDLE;
break; break;
} }
if (FAILED(hr = vkd3d_create_buffer(device, heap_properties, heap_flags, if (FAILED(hr = vkd3d_create_buffer(device, heap_properties, heap_flags,
&resource->desc, &resource->u.vk_buffer))) &resource->desc, &resource->vk_buffer)))
return hr; return hr;
if (!(resource->gpu_address = vkd3d_gpu_va_allocator_allocate(&device->gpu_va_allocator, if (!(resource->gpu_address = vkd3d_gpu_va_allocator_allocate(&device->gpu_va_allocator,
desc->Alignment ? desc->Alignment : D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, desc->Alignment ? desc->Alignment : D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
@ -2454,7 +2454,7 @@ static HRESULT d3d12_resource_init(struct d3d12_resource *resource, struct d3d12
resource->desc.MipLevels = max_miplevel_count(desc); resource->desc.MipLevels = max_miplevel_count(desc);
resource->flags |= VKD3D_RESOURCE_INITIAL_STATE_TRANSITION; resource->flags |= VKD3D_RESOURCE_INITIAL_STATE_TRANSITION;
if (FAILED(hr = vkd3d_create_image(device, heap_properties, heap_flags, if (FAILED(hr = vkd3d_create_image(device, heap_properties, heap_flags,
&resource->desc, resource, &resource->u.vk_image))) &resource->desc, resource, &resource->vk_image)))
return hr; return hr;
break; break;
@ -2566,7 +2566,7 @@ static HRESULT vkd3d_bind_heap_memory(struct d3d12_device *device,
if (resource->flags & VKD3D_RESOURCE_PLACED_BUFFER) if (resource->flags & VKD3D_RESOURCE_PLACED_BUFFER)
{ {
/* Just inherit the buffer from the heap. */ /* Just inherit the buffer from the heap. */
resource->u.vk_buffer = heap->buffer_resource->u.vk_buffer; resource->vk_buffer = heap->buffer_resource->vk_buffer;
resource->heap = heap; resource->heap = heap;
resource->heap_offset = heap_offset; resource->heap_offset = heap_offset;
resource->gpu_address = heap->buffer_resource->gpu_address + heap_offset; resource->gpu_address = heap->buffer_resource->gpu_address + heap_offset;
@ -2574,9 +2574,9 @@ static HRESULT vkd3d_bind_heap_memory(struct d3d12_device *device,
} }
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
VK_CALL(vkGetBufferMemoryRequirements(vk_device, resource->u.vk_buffer, &requirements)); VK_CALL(vkGetBufferMemoryRequirements(vk_device, resource->vk_buffer, &requirements));
else else
VK_CALL(vkGetImageMemoryRequirements(vk_device, resource->u.vk_image, &requirements)); VK_CALL(vkGetImageMemoryRequirements(vk_device, resource->vk_image, &requirements));
if (heap_offset % requirements.alignment) if (heap_offset % requirements.alignment)
{ {
@ -2593,9 +2593,9 @@ static HRESULT vkd3d_bind_heap_memory(struct d3d12_device *device,
} }
if (d3d12_resource_is_buffer(resource)) if (d3d12_resource_is_buffer(resource))
vr = VK_CALL(vkBindBufferMemory(vk_device, resource->u.vk_buffer, heap->vk_memory, heap_offset)); vr = VK_CALL(vkBindBufferMemory(vk_device, resource->vk_buffer, heap->vk_memory, heap_offset));
else else
vr = VK_CALL(vkBindImageMemory(vk_device, resource->u.vk_image, heap->vk_memory, heap_offset)); vr = VK_CALL(vkBindImageMemory(vk_device, resource->vk_image, heap->vk_memory, heap_offset));
if (vr == VK_SUCCESS) if (vr == VK_SUCCESS)
{ {
@ -2687,7 +2687,7 @@ HRESULT vkd3d_create_image_resource(ID3D12Device *device,
object->refcount = 1; object->refcount = 1;
object->internal_refcount = 1; object->internal_refcount = 1;
object->desc = create_info->desc; object->desc = create_info->desc;
object->u.vk_image = create_info->vk_image; object->vk_image = create_info->vk_image;
object->flags = VKD3D_RESOURCE_EXTERNAL; object->flags = VKD3D_RESOURCE_EXTERNAL;
object->flags |= create_info->flags & VKD3D_RESOURCE_PUBLIC_FLAGS; object->flags |= create_info->flags & VKD3D_RESOURCE_PUBLIC_FLAGS;
object->initial_state = D3D12_RESOURCE_STATE_COMMON; object->initial_state = D3D12_RESOURCE_STATE_COMMON;
@ -2760,13 +2760,13 @@ static void vkd3d_view_destroy(struct vkd3d_view *view, struct d3d12_device *dev
switch (view->type) switch (view->type)
{ {
case VKD3D_VIEW_TYPE_BUFFER: case VKD3D_VIEW_TYPE_BUFFER:
VK_CALL(vkDestroyBufferView(device->vk_device, view->u.vk_buffer_view, NULL)); VK_CALL(vkDestroyBufferView(device->vk_device, view->vk_buffer_view, NULL));
break; break;
case VKD3D_VIEW_TYPE_IMAGE: case VKD3D_VIEW_TYPE_IMAGE:
VK_CALL(vkDestroyImageView(device->vk_device, view->u.vk_image_view, NULL)); VK_CALL(vkDestroyImageView(device->vk_device, view->vk_image_view, NULL));
break; break;
case VKD3D_VIEW_TYPE_SAMPLER: case VKD3D_VIEW_TYPE_SAMPLER:
VK_CALL(vkDestroySampler(device->vk_device, view->u.vk_sampler, NULL)); VK_CALL(vkDestroySampler(device->vk_device, view->vk_sampler, NULL));
break; break;
default: default:
WARN("Unhandled view type %d.\n", view->type); WARN("Unhandled view type %d.\n", view->type);
@ -2800,12 +2800,12 @@ static void d3d12_desc_update_bindless_descriptor(struct d3d12_desc *dst)
{ {
dst->heap->uav_counters.data[descriptor_index] = dst->heap->uav_counters.data[descriptor_index] =
(dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW) (dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
? dst->u.view->vk_counter_address : 0; ? dst->info.view->vk_counter_address : 0;
} }
/* update the actual descriptor */ /* update the actual descriptor */
is_buffer = dst->magic == VKD3D_DESCRIPTOR_MAGIC_CBV || is_buffer = dst->magic == VKD3D_DESCRIPTOR_MAGIC_CBV ||
dst->u.view->type == VKD3D_VIEW_TYPE_BUFFER; dst->info.view->type == VKD3D_VIEW_TYPE_BUFFER;
set_index = d3d12_descriptor_heap_set_index_from_magic(dst->magic, is_buffer); set_index = d3d12_descriptor_heap_set_index_from_magic(dst->magic, is_buffer);
@ -2814,17 +2814,17 @@ static void d3d12_desc_update_bindless_descriptor(struct d3d12_desc *dst)
if (dst->magic == VKD3D_DESCRIPTOR_MAGIC_CBV) if (dst->magic == VKD3D_DESCRIPTOR_MAGIC_CBV)
{ {
descriptor_info.buffer = dst->u.vk_cbv_info; descriptor_info.buffer = dst->info.vk_cbv_info;
} }
else if (is_buffer) else if (is_buffer)
{ {
descriptor_info.buffer_view = dst->u.view->u.vk_buffer_view; descriptor_info.buffer_view = dst->info.view->vk_buffer_view;
} }
else else
{ {
descriptor_info.image.sampler = dst->u.view->u.vk_sampler; descriptor_info.image.sampler = dst->info.view->vk_sampler;
descriptor_info.image.imageView = dst->u.view->u.vk_image_view; descriptor_info.image.imageView = dst->info.view->vk_image_view;
descriptor_info.image.imageLayout = dst->u.view->info.texture.vk_layout; descriptor_info.image.imageLayout = dst->info.view->info.texture.vk_layout;
} }
vk_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; vk_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@ -2846,12 +2846,12 @@ static inline void d3d12_desc_write(struct d3d12_desc *dst, const struct d3d12_d
{ {
/* Nothing to do for VKD3D_DESCRIPTOR_MAGIC_CBV. */ /* Nothing to do for VKD3D_DESCRIPTOR_MAGIC_CBV. */
if ((dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW) if ((dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
&& !InterlockedDecrement(&dst->u.view->refcount)) && !InterlockedDecrement(&dst->info.view->refcount))
*destroy_view = dst->u.view; *destroy_view = dst->info.view;
dst->magic = src->magic; dst->magic = src->magic;
dst->vk_descriptor_type = src->vk_descriptor_type; dst->vk_descriptor_type = src->vk_descriptor_type;
dst->u = src->u; dst->info = src->info;
if (dst->magic != VKD3D_DESCRIPTOR_MAGIC_FREE) if (dst->magic != VKD3D_DESCRIPTOR_MAGIC_FREE)
d3d12_desc_update_bindless_descriptor(dst); d3d12_desc_update_bindless_descriptor(dst);
@ -2897,13 +2897,13 @@ void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
{ {
if (dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW) if (dst->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
{ {
needs_update = dst->u.view != src->u.view; needs_update = dst->info.view != src->info.view;
} }
else if (dst->magic != VKD3D_DESCRIPTOR_MAGIC_FREE) else if (dst->magic != VKD3D_DESCRIPTOR_MAGIC_FREE)
{ {
needs_update = dst->u.vk_cbv_info.buffer != src->u.vk_cbv_info.buffer || needs_update = dst->info.vk_cbv_info.buffer != src->info.vk_cbv_info.buffer ||
dst->u.vk_cbv_info.offset != src->u.vk_cbv_info.offset || dst->info.vk_cbv_info.offset != src->info.vk_cbv_info.offset ||
dst->u.vk_cbv_info.range != src->u.vk_cbv_info.range; dst->info.vk_cbv_info.range != src->info.vk_cbv_info.range;
} }
} }
@ -2911,7 +2911,7 @@ void d3d12_desc_copy(struct d3d12_desc *dst, struct d3d12_desc *src,
{ {
/* Perform the actual descriptor update */ /* Perform the actual descriptor update */
if (src->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW) if (src->magic & VKD3D_DESCRIPTOR_MAGIC_HAS_VIEW)
InterlockedIncrement(&src->u.view->refcount); InterlockedIncrement(&src->info.view->refcount);
d3d12_desc_write(dst, src, &destroy_view); d3d12_desc_write(dst, src, &destroy_view);
} }
@ -3030,7 +3030,7 @@ bool vkd3d_create_buffer_view(struct d3d12_device *device, VkBuffer vk_buffer, c
return false; return false;
} }
object->u.vk_buffer_view = vk_view; object->vk_buffer_view = vk_view;
object->format = format; object->format = format;
object->info.buffer.offset = offset; object->info.buffer.offset = offset;
object->info.buffer.size = size; object->info.buffer.size = size;
@ -3070,7 +3070,7 @@ static bool vkd3d_create_buffer_view_for_resource(struct d3d12_device *device,
assert(d3d12_resource_is_buffer(resource)); assert(d3d12_resource_is_buffer(resource));
return vkd3d_create_buffer_view(device, resource->u.vk_buffer, return vkd3d_create_buffer_view(device, resource->vk_buffer,
format, resource->heap_offset + offset * element_size, size * element_size, view); format, resource->heap_offset + offset * element_size, size * element_size, view);
} }
@ -3297,7 +3297,7 @@ bool vkd3d_create_texture_view(struct d3d12_device *device, VkImage vk_image,
return false; return false;
} }
object->u.vk_image_view = vk_view; object->vk_image_view = vk_view;
object->format = format; object->format = format;
object->info.texture.vk_view_type = desc->view_type; object->info.texture.vk_view_type = desc->view_type;
object->info.texture.vk_layout = desc->layout; object->info.texture.vk_layout = desc->layout;
@ -3326,11 +3326,11 @@ void d3d12_desc_create_cbv(struct d3d12_desc *descriptor,
return; return;
} }
buffer_info = &descriptor->u.vk_cbv_info; buffer_info = &descriptor->info.vk_cbv_info;
if (desc->BufferLocation) if (desc->BufferLocation)
{ {
resource = vkd3d_gpu_va_allocator_dereference(&device->gpu_va_allocator, desc->BufferLocation); resource = vkd3d_gpu_va_allocator_dereference(&device->gpu_va_allocator, desc->BufferLocation);
buffer_info->buffer = resource->u.vk_buffer; buffer_info->buffer = resource->vk_buffer;
buffer_info->offset = desc->BufferLocation - resource->gpu_address; buffer_info->offset = desc->BufferLocation - resource->gpu_address;
buffer_info->range = min(desc->SizeInBytes, resource->desc.Width - buffer_info->offset); buffer_info->range = min(desc->SizeInBytes, resource->desc.Width - buffer_info->offset);
} }
@ -3380,7 +3380,7 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
{ {
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
descriptor->u.view = view; descriptor->info.view = view;
} }
return; return;
@ -3417,7 +3417,7 @@ static void vkd3d_create_null_srv(struct d3d12_desc *descriptor,
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
descriptor->u.view = view; descriptor->info.view = view;
} }
static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor, static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
@ -3439,15 +3439,15 @@ static void vkd3d_create_buffer_srv(struct d3d12_desc *descriptor,
return; return;
} }
flags = vkd3d_view_flags_from_d3d12_buffer_srv_flags(desc->u.Buffer.Flags); flags = vkd3d_view_flags_from_d3d12_buffer_srv_flags(desc->Buffer.Flags);
if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format, if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format,
desc->u.Buffer.FirstElement, desc->u.Buffer.NumElements, desc->Buffer.FirstElement, desc->Buffer.NumElements,
desc->u.Buffer.StructureByteStride, flags, &view)) desc->Buffer.StructureByteStride, flags, &view))
return; return;
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
descriptor->u.view = view; descriptor->info.view = view;
} }
void d3d12_desc_create_srv(struct d3d12_desc *descriptor, void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
@ -3489,37 +3489,37 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
{ {
case D3D12_SRV_DIMENSION_TEXTURE1D: case D3D12_SRV_DIMENSION_TEXTURE1D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
vkd3d_desc.miplevel_idx = desc->u.Texture1D.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->Texture1D.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.Texture1D.MipLevels; vkd3d_desc.miplevel_count = desc->Texture1D.MipLevels;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
break; break;
case D3D12_SRV_DIMENSION_TEXTURE1DARRAY: case D3D12_SRV_DIMENSION_TEXTURE1DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture1DArray.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->Texture1DArray.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.Texture1DArray.MipLevels; vkd3d_desc.miplevel_count = desc->Texture1DArray.MipLevels;
vkd3d_desc.layer_idx = desc->u.Texture1DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture1DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture1DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture1DArray.ArraySize;
break; break;
case D3D12_SRV_DIMENSION_TEXTURE2D: case D3D12_SRV_DIMENSION_TEXTURE2D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
vkd3d_desc.miplevel_idx = desc->u.Texture2D.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->Texture2D.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.Texture2D.MipLevels; vkd3d_desc.miplevel_count = desc->Texture2D.MipLevels;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
if (desc->u.Texture2D.PlaneSlice) if (desc->Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2D.PlaneSlice);
if (desc->u.Texture2D.ResourceMinLODClamp) if (desc->Texture2D.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2D.ResourceMinLODClamp); FIXME("Unhandled min LOD clamp %.8e.\n", desc->Texture2D.ResourceMinLODClamp);
break; break;
case D3D12_SRV_DIMENSION_TEXTURE2DARRAY: case D3D12_SRV_DIMENSION_TEXTURE2DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->Texture2DArray.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.Texture2DArray.MipLevels; vkd3d_desc.miplevel_count = desc->Texture2DArray.MipLevels;
vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DArray.ArraySize;
if (desc->u.Texture2DArray.PlaneSlice) if (desc->Texture2DArray.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2DArray.PlaneSlice);
if (desc->u.Texture2DArray.ResourceMinLODClamp) if (desc->Texture2DArray.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2DArray.ResourceMinLODClamp); FIXME("Unhandled min LOD clamp %.8e.\n", desc->Texture2DArray.ResourceMinLODClamp);
break; break;
case D3D12_SRV_DIMENSION_TEXTURE2DMS: case D3D12_SRV_DIMENSION_TEXTURE2DMS:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
@ -3527,46 +3527,46 @@ void d3d12_desc_create_srv(struct d3d12_desc *descriptor,
break; break;
case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY: case D3D12_SRV_DIMENSION_TEXTURE2DMSARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.layer_idx = desc->u.Texture2DMSArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DMSArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DMSArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DMSArray.ArraySize;
break; break;
case D3D12_SRV_DIMENSION_TEXTURE3D: case D3D12_SRV_DIMENSION_TEXTURE3D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
vkd3d_desc.miplevel_idx = desc->u.Texture3D.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->Texture3D.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.Texture3D.MipLevels; vkd3d_desc.miplevel_count = desc->Texture3D.MipLevels;
if (desc->u.Texture3D.ResourceMinLODClamp) if (desc->Texture3D.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.Texture2D.ResourceMinLODClamp); FIXME("Unhandled min LOD clamp %.8e.\n", desc->Texture2D.ResourceMinLODClamp);
break; break;
case D3D12_SRV_DIMENSION_TEXTURECUBE: case D3D12_SRV_DIMENSION_TEXTURECUBE:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE;
vkd3d_desc.miplevel_idx = desc->u.TextureCube.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->TextureCube.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.TextureCube.MipLevels; vkd3d_desc.miplevel_count = desc->TextureCube.MipLevels;
vkd3d_desc.layer_count = 6; vkd3d_desc.layer_count = 6;
if (desc->u.TextureCube.ResourceMinLODClamp) if (desc->TextureCube.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCube.ResourceMinLODClamp); FIXME("Unhandled min LOD clamp %.8e.\n", desc->TextureCube.ResourceMinLODClamp);
break; break;
case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY: case D3D12_SRV_DIMENSION_TEXTURECUBEARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.TextureCubeArray.MostDetailedMip; vkd3d_desc.miplevel_idx = desc->TextureCubeArray.MostDetailedMip;
vkd3d_desc.miplevel_count = desc->u.TextureCubeArray.MipLevels; vkd3d_desc.miplevel_count = desc->TextureCubeArray.MipLevels;
vkd3d_desc.layer_idx = desc->u.TextureCubeArray.First2DArrayFace; vkd3d_desc.layer_idx = desc->TextureCubeArray.First2DArrayFace;
vkd3d_desc.layer_count = desc->u.TextureCubeArray.NumCubes; vkd3d_desc.layer_count = desc->TextureCubeArray.NumCubes;
if (vkd3d_desc.layer_count != VK_REMAINING_ARRAY_LAYERS) if (vkd3d_desc.layer_count != VK_REMAINING_ARRAY_LAYERS)
vkd3d_desc.layer_count *= 6; vkd3d_desc.layer_count *= 6;
if (desc->u.TextureCubeArray.ResourceMinLODClamp) if (desc->TextureCubeArray.ResourceMinLODClamp)
FIXME("Unhandled min LOD clamp %.8e.\n", desc->u.TextureCubeArray.ResourceMinLODClamp); FIXME("Unhandled min LOD clamp %.8e.\n", desc->TextureCubeArray.ResourceMinLODClamp);
break; break;
default: default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
} }
} }
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view)) if (!vkd3d_create_texture_view(device, resource->vk_image, &vkd3d_desc, &view))
return; return;
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_SRV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
descriptor->u.view = view; descriptor->info.view = view;
} }
static unsigned int vkd3d_view_flags_from_d3d12_buffer_uav_flags(D3D12_BUFFER_UAV_FLAGS flags) static unsigned int vkd3d_view_flags_from_d3d12_buffer_uav_flags(D3D12_BUFFER_UAV_FLAGS flags)
@ -3603,7 +3603,7 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
{ {
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
descriptor->u.view = view; descriptor->info.view = view;
} }
return; return;
@ -3640,7 +3640,7 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
descriptor->u.view = view; descriptor->info.view = view;
} }
static VkDeviceAddress vkd3d_get_buffer_device_address(struct d3d12_device *device, VkBuffer vk_buffer) static VkDeviceAddress vkd3d_get_buffer_device_address(struct d3d12_device *device, VkBuffer vk_buffer)
@ -3674,37 +3674,37 @@ static void vkd3d_create_buffer_uav(struct d3d12_desc *descriptor, struct d3d12_
return; return;
} }
if (desc->u.Buffer.CounterOffsetInBytes) if (desc->Buffer.CounterOffsetInBytes)
FIXME("Ignoring counter offset %"PRIu64".\n", desc->u.Buffer.CounterOffsetInBytes); FIXME("Ignoring counter offset %"PRIu64".\n", desc->Buffer.CounterOffsetInBytes);
flags = vkd3d_view_flags_from_d3d12_buffer_uav_flags(desc->u.Buffer.Flags); flags = vkd3d_view_flags_from_d3d12_buffer_uav_flags(desc->Buffer.Flags);
if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format, if (!vkd3d_create_buffer_view_for_resource(device, resource, desc->Format,
desc->u.Buffer.FirstElement, desc->u.Buffer.NumElements, desc->Buffer.FirstElement, desc->Buffer.NumElements,
desc->u.Buffer.StructureByteStride, flags, &view)) desc->Buffer.StructureByteStride, flags, &view))
return; return;
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
descriptor->u.view = view; descriptor->info.view = view;
if (counter_resource) if (counter_resource)
{ {
assert(d3d12_resource_is_buffer(counter_resource)); assert(d3d12_resource_is_buffer(counter_resource));
assert(desc->u.Buffer.StructureByteStride); assert(desc->Buffer.StructureByteStride);
if (device->bindless_state.flags & VKD3D_BINDLESS_UAV_COUNTER) if (device->bindless_state.flags & VKD3D_BINDLESS_UAV_COUNTER)
{ {
VkDeviceAddress address = vkd3d_get_buffer_device_address(device, counter_resource->u.vk_buffer); VkDeviceAddress address = vkd3d_get_buffer_device_address(device, counter_resource->vk_buffer);
view->vk_counter_view = VK_NULL_HANDLE; view->vk_counter_view = VK_NULL_HANDLE;
view->vk_counter_address = address + counter_resource->heap_offset + desc->u.Buffer.CounterOffsetInBytes; view->vk_counter_address = address + counter_resource->heap_offset + desc->Buffer.CounterOffsetInBytes;
} }
else else
{ {
const struct vkd3d_format *format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false); const struct vkd3d_format *format = vkd3d_get_format(device, DXGI_FORMAT_R32_UINT, false);
if (!vkd3d_create_vk_buffer_view(device, counter_resource->u.vk_buffer, format, if (!vkd3d_create_vk_buffer_view(device, counter_resource->vk_buffer, format,
desc->u.Buffer.CounterOffsetInBytes + resource->heap_offset, sizeof(uint32_t), &view->vk_counter_view)) desc->Buffer.CounterOffsetInBytes + resource->heap_offset, sizeof(uint32_t), &view->vk_counter_view))
{ {
WARN("Failed to create counter buffer view.\n"); WARN("Failed to create counter buffer view.\n");
view->vk_counter_view = VK_NULL_HANDLE; view->vk_counter_view = VK_NULL_HANDLE;
@ -3736,38 +3736,38 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
{ {
case D3D12_UAV_DIMENSION_TEXTURE1D: case D3D12_UAV_DIMENSION_TEXTURE1D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
vkd3d_desc.miplevel_idx = desc->u.Texture1D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
break; break;
case D3D12_UAV_DIMENSION_TEXTURE1DARRAY: case D3D12_UAV_DIMENSION_TEXTURE1DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture1DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture1DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture1DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture1DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture1DArray.ArraySize;
break; break;
case D3D12_UAV_DIMENSION_TEXTURE2D: case D3D12_UAV_DIMENSION_TEXTURE2D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
if (desc->u.Texture2D.PlaneSlice) if (desc->Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2D.PlaneSlice);
break; break;
case D3D12_UAV_DIMENSION_TEXTURE2DARRAY: case D3D12_UAV_DIMENSION_TEXTURE2DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DArray.ArraySize;
if (desc->u.Texture2DArray.PlaneSlice) if (desc->Texture2DArray.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2DArray.PlaneSlice);
break; break;
case D3D12_UAV_DIMENSION_TEXTURE3D: case D3D12_UAV_DIMENSION_TEXTURE3D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_3D;
vkd3d_desc.miplevel_idx = desc->u.Texture3D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture3D.MipSlice;
if (desc->u.Texture3D.FirstWSlice || if (desc->Texture3D.FirstWSlice ||
((desc->u.Texture3D.WSize != resource->desc.DepthOrArraySize) && (desc->u.Texture3D.WSize != UINT_MAX))) ((desc->Texture3D.WSize != resource->desc.DepthOrArraySize) && (desc->Texture3D.WSize != UINT_MAX)))
{ {
FIXME("Unhandled depth view %u-%u.\n", FIXME("Unhandled depth view %u-%u.\n",
desc->u.Texture3D.FirstWSlice, desc->u.Texture3D.WSize); desc->Texture3D.FirstWSlice, desc->Texture3D.WSize);
} }
break; break;
default: default:
@ -3775,12 +3775,12 @@ static void vkd3d_create_texture_uav(struct d3d12_desc *descriptor,
} }
} }
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view)) if (!vkd3d_create_texture_view(device, resource->vk_image, &vkd3d_desc, &view))
return; return;
descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV; descriptor->magic = VKD3D_DESCRIPTOR_MAGIC_UAV;
descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; descriptor->vk_descriptor_type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
descriptor->u.view = view; descriptor->info.view = view;
} }
void d3d12_desc_create_uav(struct d3d12_desc *descriptor, struct d3d12_device *device, void d3d12_desc_create_uav(struct d3d12_desc *descriptor, struct d3d12_device *device,
@ -3822,7 +3822,7 @@ bool vkd3d_create_raw_buffer_view(struct d3d12_device *device,
offset = gpu_address - resource->gpu_address; offset = gpu_address - resource->gpu_address;
range = min(resource->desc.Width - offset, device->vk_info.device_limits.maxStorageBufferRange); range = min(resource->desc.Width - offset, device->vk_info.device_limits.maxStorageBufferRange);
return vkd3d_create_vk_buffer_view(device, resource->u.vk_buffer, format, return vkd3d_create_vk_buffer_view(device, resource->vk_buffer, format,
offset, range, vk_buffer_view); offset, range, vk_buffer_view);
} }
@ -4056,7 +4056,7 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
if (!(view = vkd3d_view_create(VKD3D_VIEW_TYPE_SAMPLER))) if (!(view = vkd3d_view_create(VKD3D_VIEW_TYPE_SAMPLER)))
return; return;
if (FAILED(d3d12_create_sampler(device, desc, &view->u.vk_sampler))) if (FAILED(d3d12_create_sampler(device, desc, &view->vk_sampler)))
{ {
vkd3d_free(view); vkd3d_free(view);
return; return;
@ -4064,7 +4064,7 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
sampler->magic = VKD3D_DESCRIPTOR_MAGIC_SAMPLER; sampler->magic = VKD3D_DESCRIPTOR_MAGIC_SAMPLER;
sampler->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLER; sampler->vk_descriptor_type = VK_DESCRIPTOR_TYPE_SAMPLER;
sampler->u.view = view; sampler->info.view = view;
} }
/* RTVs */ /* RTVs */
@ -4108,29 +4108,29 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
{ {
case D3D12_RTV_DIMENSION_TEXTURE1D: case D3D12_RTV_DIMENSION_TEXTURE1D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D;
vkd3d_desc.miplevel_idx = desc->u.Texture1D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
break; break;
case D3D12_RTV_DIMENSION_TEXTURE1DARRAY: case D3D12_RTV_DIMENSION_TEXTURE1DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture1DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture1DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture1DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture1DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture1DArray.ArraySize;
break; break;
case D3D12_RTV_DIMENSION_TEXTURE2D: case D3D12_RTV_DIMENSION_TEXTURE2D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
if (desc->u.Texture2D.PlaneSlice) if (desc->Texture2D.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2D.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2D.PlaneSlice);
break; break;
case D3D12_RTV_DIMENSION_TEXTURE2DARRAY: case D3D12_RTV_DIMENSION_TEXTURE2DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DArray.ArraySize;
if (desc->u.Texture2DArray.PlaneSlice) if (desc->Texture2DArray.PlaneSlice)
FIXME("Ignoring plane slice %u.\n", desc->u.Texture2DArray.PlaneSlice); FIXME("Ignoring plane slice %u.\n", desc->Texture2DArray.PlaneSlice);
break; break;
case D3D12_RTV_DIMENSION_TEXTURE2DMS: case D3D12_RTV_DIMENSION_TEXTURE2DMS:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
@ -4138,14 +4138,14 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
break; break;
case D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY: case D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.layer_idx = desc->u.Texture2DMSArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DMSArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DMSArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DMSArray.ArraySize;
break; break;
case D3D12_RTV_DIMENSION_TEXTURE3D: case D3D12_RTV_DIMENSION_TEXTURE3D:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture3D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture3D.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture3D.FirstWSlice; vkd3d_desc.layer_idx = desc->Texture3D.FirstWSlice;
vkd3d_desc.layer_count = desc->u.Texture3D.WSize; vkd3d_desc.layer_count = desc->Texture3D.WSize;
break; break;
default: default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
@ -4163,7 +4163,7 @@ void d3d12_rtv_desc_create_rtv(struct d3d12_rtv_desc *rtv_desc, struct d3d12_dev
assert(d3d12_resource_is_texture(resource)); assert(d3d12_resource_is_texture(resource));
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view)) if (!vkd3d_create_texture_view(device, resource->vk_image, &vkd3d_desc, &view))
return; return;
rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV; rtv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_RTV;
@ -4240,24 +4240,24 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
switch (desc->ViewDimension) switch (desc->ViewDimension)
{ {
case D3D12_DSV_DIMENSION_TEXTURE1D: case D3D12_DSV_DIMENSION_TEXTURE1D:
vkd3d_desc.miplevel_idx = desc->u.Texture1D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
break; break;
case D3D12_DSV_DIMENSION_TEXTURE1DARRAY: case D3D12_DSV_DIMENSION_TEXTURE1DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture1DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture1DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture1DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture1DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture1DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture1DArray.ArraySize;
break; break;
case D3D12_DSV_DIMENSION_TEXTURE2D: case D3D12_DSV_DIMENSION_TEXTURE2D:
vkd3d_desc.miplevel_idx = desc->u.Texture2D.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2D.MipSlice;
vkd3d_desc.layer_count = 1; vkd3d_desc.layer_count = 1;
break; break;
case D3D12_DSV_DIMENSION_TEXTURE2DARRAY: case D3D12_DSV_DIMENSION_TEXTURE2DARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.miplevel_idx = desc->u.Texture2DArray.MipSlice; vkd3d_desc.miplevel_idx = desc->Texture2DArray.MipSlice;
vkd3d_desc.layer_idx = desc->u.Texture2DArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DArray.ArraySize;
break; break;
case D3D12_DSV_DIMENSION_TEXTURE2DMS: case D3D12_DSV_DIMENSION_TEXTURE2DMS:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D;
@ -4265,8 +4265,8 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
break; break;
case D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY: case D3D12_DSV_DIMENSION_TEXTURE2DMSARRAY:
vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkd3d_desc.view_type = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
vkd3d_desc.layer_idx = desc->u.Texture2DMSArray.FirstArraySlice; vkd3d_desc.layer_idx = desc->Texture2DMSArray.FirstArraySlice;
vkd3d_desc.layer_count = desc->u.Texture2DMSArray.ArraySize; vkd3d_desc.layer_count = desc->Texture2DMSArray.ArraySize;
break; break;
default: default:
FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension); FIXME("Unhandled view dimension %#x.\n", desc->ViewDimension);
@ -4280,7 +4280,7 @@ void d3d12_dsv_desc_create_dsv(struct d3d12_dsv_desc *dsv_desc, struct d3d12_dev
assert(d3d12_resource_is_texture(resource)); assert(d3d12_resource_is_texture(resource));
if (!vkd3d_create_texture_view(device, resource->u.vk_image, &vkd3d_desc, &view)) if (!vkd3d_create_texture_view(device, resource->vk_image, &vkd3d_desc, &view))
return; return;
dsv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_DSV; dsv_desc->magic = VKD3D_DESCRIPTOR_MAGIC_DSV;

View File

@ -489,9 +489,9 @@ static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_i
switch (p->ParameterType) switch (p->ParameterType)
{ {
case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE: case D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE:
for (j = 0; j < p->u.DescriptorTable.NumDescriptorRanges; ++j) for (j = 0; j < p->DescriptorTable.NumDescriptorRanges; ++j)
if (FAILED(hr = d3d12_root_signature_info_count_descriptors(info, if (FAILED(hr = d3d12_root_signature_info_count_descriptors(info,
device, &p->u.DescriptorTable.pDescriptorRanges[j]))) device, &p->DescriptorTable.pDescriptorRanges[j])))
return hr; return hr;
info->cost += 1; info->cost += 1;
break; break;
@ -506,7 +506,7 @@ static HRESULT d3d12_root_signature_info_from_desc(struct d3d12_root_signature_i
case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS: case D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS:
info->root_constant_count += 1; info->root_constant_count += 1;
info->cost += p->u.Constants.Num32BitValues; info->cost += p->Constants.Num32BitValues;
break; break;
default: default:
@ -544,16 +544,16 @@ static HRESULT d3d12_root_signature_init_push_constants(struct d3d12_root_signat
root_signature->root_constant_mask |= 1ull << i; root_signature->root_constant_mask |= 1ull << i;
root_signature->parameters[i].parameter_type = p->ParameterType; root_signature->parameters[i].parameter_type = p->ParameterType;
root_signature->parameters[i].u.constant.constant_index = push_constant_range->size / sizeof(uint32_t); root_signature->parameters[i].constant.constant_index = push_constant_range->size / sizeof(uint32_t);
root_signature->parameters[i].u.constant.constant_count = p->u.Constants.Num32BitValues; root_signature->parameters[i].constant.constant_count = p->Constants.Num32BitValues;
root_signature->root_constants[j].register_space = p->u.Constants.RegisterSpace; root_signature->root_constants[j].register_space = p->Constants.RegisterSpace;
root_signature->root_constants[j].register_index = p->u.Constants.ShaderRegister; root_signature->root_constants[j].register_index = p->Constants.ShaderRegister;
root_signature->root_constants[j].shader_visibility = vkd3d_shader_visibility_from_d3d12(p->ShaderVisibility); root_signature->root_constants[j].shader_visibility = vkd3d_shader_visibility_from_d3d12(p->ShaderVisibility);
root_signature->root_constants[j].offset = push_constant_range->size; root_signature->root_constants[j].offset = push_constant_range->size;
root_signature->root_constants[j].size = p->u.Constants.Num32BitValues * sizeof(uint32_t); root_signature->root_constants[j].size = p->Constants.Num32BitValues * sizeof(uint32_t);
push_constant_range->size += p->u.Constants.Num32BitValues * sizeof(uint32_t); push_constant_range->size += p->Constants.Num32BitValues * sizeof(uint32_t);
++j; ++j;
} }
@ -609,8 +609,8 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
root_signature->descriptor_table_mask |= 1ull << i; root_signature->descriptor_table_mask |= 1ull << i;
table = &root_signature->parameters[i].u.descriptor_table; table = &root_signature->parameters[i].descriptor_table;
range_count = p->u.DescriptorTable.NumDescriptorRanges; range_count = p->DescriptorTable.NumDescriptorRanges;
range_descriptor_offset = 0; range_descriptor_offset = 0;
root_signature->parameters[i].parameter_type = p->ParameterType; root_signature->parameters[i].parameter_type = p->ParameterType;
@ -623,7 +623,7 @@ static HRESULT d3d12_root_signature_init_root_descriptor_tables(struct d3d12_roo
for (j = 0; j < range_count; ++j) for (j = 0; j < range_count; ++j)
{ {
const D3D12_DESCRIPTOR_RANGE *range = &p->u.DescriptorTable.pDescriptorRanges[j]; const D3D12_DESCRIPTOR_RANGE *range = &p->DescriptorTable.pDescriptorRanges[j];
bool is_srv = range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV; bool is_srv = range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
bool is_uav = range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV; bool is_uav = range->RangeType == D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
@ -795,8 +795,8 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
binding = &root_signature->bindings[context->binding_index]; binding = &root_signature->bindings[context->binding_index];
binding->type = vkd3d_descriptor_type_from_d3d12_root_parameter_type(p->ParameterType); binding->type = vkd3d_descriptor_type_from_d3d12_root_parameter_type(p->ParameterType);
binding->register_space = p->u.Descriptor.RegisterSpace; binding->register_space = p->Descriptor.RegisterSpace;
binding->register_index = p->u.Descriptor.ShaderRegister; binding->register_index = p->Descriptor.ShaderRegister;
binding->register_count = 1; binding->register_count = 1;
binding->descriptor_table = 0; /* ignored */ binding->descriptor_table = 0; /* ignored */
binding->descriptor_offset = 0; /* ignored */ binding->descriptor_offset = 0; /* ignored */
@ -807,8 +807,8 @@ static HRESULT d3d12_root_signature_init_root_descriptors(struct d3d12_root_sign
param = &root_signature->parameters[i]; param = &root_signature->parameters[i];
param->parameter_type = p->ParameterType; param->parameter_type = p->ParameterType;
param->u.descriptor.binding = binding; param->descriptor.binding = binding;
param->u.descriptor.packed_descriptor = context->packed_descriptor_index; param->descriptor.packed_descriptor = context->packed_descriptor_index;
context->packed_descriptor_index += 1; context->packed_descriptor_index += 1;
context->binding_index += 1; context->binding_index += 1;
@ -1076,7 +1076,7 @@ HRESULT d3d12_root_signature_create(struct d3d12_device *device,
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
} }
hr = d3d12_root_signature_init(object, device, &root_signature_desc.d3d12.u.Desc_1_0); hr = d3d12_root_signature_init(object, device, &root_signature_desc.d3d12.Desc_1_0);
vkd3d_shader_free_root_signature(&root_signature_desc.vkd3d); vkd3d_shader_free_root_signature(&root_signature_desc.vkd3d);
if (FAILED(hr)) if (FAILED(hr))
{ {
@ -1377,7 +1377,7 @@ static ULONG STDMETHODCALLTYPE d3d12_pipeline_state_AddRef(ID3D12PipelineState *
static void d3d12_pipeline_state_destroy_graphics(struct d3d12_pipeline_state *state, static void d3d12_pipeline_state_destroy_graphics(struct d3d12_pipeline_state *state,
struct d3d12_device *device) struct d3d12_device *device)
{ {
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
struct vkd3d_compiled_pipeline *current, *e; struct vkd3d_compiled_pipeline *current, *e;
unsigned int i; unsigned int i;
@ -1411,7 +1411,7 @@ static ULONG STDMETHODCALLTYPE d3d12_pipeline_state_Release(ID3D12PipelineState
if (d3d12_pipeline_state_is_graphics(state)) if (d3d12_pipeline_state_is_graphics(state))
d3d12_pipeline_state_destroy_graphics(state, device); d3d12_pipeline_state_destroy_graphics(state, device);
else if (d3d12_pipeline_state_is_compute(state)) else if (d3d12_pipeline_state_is_compute(state))
VK_CALL(vkDestroyPipeline(device->vk_device, state->u.compute.vk_pipeline, NULL)); VK_CALL(vkDestroyPipeline(device->vk_device, state->compute.vk_pipeline, NULL));
vkd3d_free(state); vkd3d_free(state);
@ -1459,7 +1459,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_pipeline_state_SetName(ID3D12PipelineStat
if (d3d12_pipeline_state_is_compute(state)) if (d3d12_pipeline_state_is_compute(state))
{ {
return vkd3d_set_vk_object_name(state->device, (uint64_t)state->u.compute.vk_pipeline, return vkd3d_set_vk_object_name(state->device, (uint64_t)state->compute.vk_pipeline,
VK_OBJECT_TYPE_PIPELINE, name); VK_OBJECT_TYPE_PIPELINE, name);
} }
@ -1621,7 +1621,7 @@ static HRESULT d3d12_pipeline_state_init_compute(struct d3d12_pipeline_state *st
shader_interface.push_constant_ubo_binding = &root_signature->push_constant_ubo_binding; shader_interface.push_constant_ubo_binding = &root_signature->push_constant_ubo_binding;
if (FAILED(hr = vkd3d_create_compute_pipeline(device, &desc->cs, &shader_interface, if (FAILED(hr = vkd3d_create_compute_pipeline(device, &desc->cs, &shader_interface,
root_signature->vk_pipeline_layout, &state->u.compute.vk_pipeline))) root_signature->vk_pipeline_layout, &state->compute.vk_pipeline)))
{ {
WARN("Failed to create Vulkan compute pipeline, hr %#x.\n", hr); WARN("Failed to create Vulkan compute pipeline, hr %#x.\n", hr);
return hr; return hr;
@ -1629,7 +1629,7 @@ static HRESULT d3d12_pipeline_state_init_compute(struct d3d12_pipeline_state *st
if (FAILED(hr = vkd3d_private_store_init(&state->private_store))) if (FAILED(hr = vkd3d_private_store_init(&state->private_store)))
{ {
VK_CALL(vkDestroyPipeline(device->vk_device, state->u.compute.vk_pipeline, NULL)); VK_CALL(vkDestroyPipeline(device->vk_device, state->compute.vk_pipeline, NULL));
return hr; return hr;
} }
@ -2161,7 +2161,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
{ {
const VkPhysicalDeviceFeatures *features = &device->device_info.features2.features; const VkPhysicalDeviceFeatures *features = &device->device_info.features2.features;
unsigned int ps_output_swizzle[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT]; unsigned int ps_output_swizzle[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
const D3D12_STREAM_OUTPUT_DESC *so_desc = &desc->stream_output; const D3D12_STREAM_OUTPUT_DESC *so_desc = &desc->stream_output;
VkVertexInputBindingDivisorDescriptionEXT *binding_divisor; VkVertexInputBindingDivisorDescriptionEXT *binding_divisor;
@ -2332,7 +2332,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
ps_shader_parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT; ps_shader_parameters[0].name = VKD3D_SHADER_PARAMETER_NAME_RASTERIZER_SAMPLE_COUNT;
ps_shader_parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT; ps_shader_parameters[0].type = VKD3D_SHADER_PARAMETER_TYPE_IMMEDIATE_CONSTANT;
ps_shader_parameters[0].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32; ps_shader_parameters[0].data_type = VKD3D_SHADER_PARAMETER_DATA_TYPE_UINT32;
ps_shader_parameters[0].u.immediate_constant.u.u32 = sample_count; ps_shader_parameters[0].immediate_constant.u32 = sample_count;
ps_compile_args.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_ARGUMENTS; ps_compile_args.type = VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_ARGUMENTS;
ps_compile_args.next = NULL; ps_compile_args.next = NULL;
@ -2638,7 +2638,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
fail: fail:
for (i = 0; i < graphics->stage_count; ++i) for (i = 0; i < graphics->stage_count; ++i)
{ {
VK_CALL(vkDestroyShaderModule(device->vk_device, state->u.graphics.stages[i].module, NULL)); VK_CALL(vkDestroyShaderModule(device->vk_device, state->graphics.stages[i].module, NULL));
} }
vkd3d_shader_free_shader_signature(&input_signature); vkd3d_shader_free_shader_signature(&input_signature);
@ -2754,7 +2754,7 @@ static enum VkPrimitiveTopology vk_topology_from_d3d12_topology(D3D12_PRIMITIVE_
static VkPipeline d3d12_pipeline_state_find_compiled_pipeline(const struct d3d12_pipeline_state *state, static VkPipeline d3d12_pipeline_state_find_compiled_pipeline(const struct d3d12_pipeline_state *state,
const struct vkd3d_pipeline_key *key, VkRenderPass *vk_render_pass) const struct vkd3d_pipeline_key *key, VkRenderPass *vk_render_pass)
{ {
const struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; const struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
struct d3d12_device *device = state->device; struct d3d12_device *device = state->device;
VkPipeline vk_pipeline = VK_NULL_HANDLE; VkPipeline vk_pipeline = VK_NULL_HANDLE;
struct vkd3d_compiled_pipeline *current; struct vkd3d_compiled_pipeline *current;
@ -2786,7 +2786,7 @@ static VkPipeline d3d12_pipeline_state_find_compiled_pipeline(const struct d3d12
static bool d3d12_pipeline_state_put_pipeline_to_cache(struct d3d12_pipeline_state *state, static bool d3d12_pipeline_state_put_pipeline_to_cache(struct d3d12_pipeline_state *state,
const struct vkd3d_pipeline_key *key, VkPipeline vk_pipeline, VkRenderPass vk_render_pass) const struct vkd3d_pipeline_key *key, VkPipeline vk_pipeline, VkRenderPass vk_render_pass)
{ {
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
struct vkd3d_compiled_pipeline *compiled_pipeline, *current; struct vkd3d_compiled_pipeline *compiled_pipeline, *current;
struct d3d12_device *device = state->device; struct d3d12_device *device = state->device;
int rc; int rc;
@ -2827,7 +2827,7 @@ VkPipeline d3d12_pipeline_state_get_or_create_pipeline(struct d3d12_pipeline_sta
{ {
VkVertexInputBindingDescription bindings[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT]; VkVertexInputBindingDescription bindings[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs; const struct vkd3d_vk_device_procs *vk_procs = &state->device->vk_procs;
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
VkPipelineVertexInputDivisorStateCreateInfoEXT input_divisor_info; VkPipelineVertexInputDivisorStateCreateInfoEXT input_divisor_info;
VkPipelineTessellationStateCreateInfo tessellation_info; VkPipelineTessellationStateCreateInfo tessellation_info;
VkPipelineVertexInputStateCreateInfo input_desc; VkPipelineVertexInputStateCreateInfo input_desc;

View File

@ -950,15 +950,15 @@ static HRESULT vkd3d_private_store_set_private_data(struct vkd3d_private_store *
ptr = &data; ptr = &data;
} }
if (!(d = vkd3d_malloc(offsetof(struct vkd3d_private_data, u.data[data_size])))) if (!(d = vkd3d_malloc(offsetof(struct vkd3d_private_data, data[data_size]))))
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
d->tag = *tag; d->tag = *tag;
d->size = data_size; d->size = data_size;
d->is_object = is_object; d->is_object = is_object;
memcpy(d->u.data, ptr, data_size); memcpy(d->data, ptr, data_size);
if (is_object) if (is_object)
IUnknown_AddRef(d->u.object); IUnknown_AddRef(d->object);
if ((old_data = vkd3d_private_store_get_private_data(store, tag))) if ((old_data = vkd3d_private_store_get_private_data(store, tag)))
vkd3d_private_data_destroy(old_data); vkd3d_private_data_destroy(old_data);
@ -1003,8 +1003,8 @@ HRESULT vkd3d_get_private_data(struct vkd3d_private_store *store,
} }
if (data->is_object) if (data->is_object)
IUnknown_AddRef(data->u.object); IUnknown_AddRef(data->object);
memcpy(out, data->u.data, data->size); memcpy(out, data->data, data->size);
done: done:
pthread_mutex_unlock(&store->mutex); pthread_mutex_unlock(&store->mutex);

View File

@ -155,7 +155,7 @@ static const D3D12_ROOT_SIGNATURE_DESC * STDMETHODCALLTYPE d3d12_root_signature_
TRACE("iface %p.\n", iface); TRACE("iface %p.\n", iface);
assert(deserializer->desc.d3d12.Version == D3D_ROOT_SIGNATURE_VERSION_1_0); assert(deserializer->desc.d3d12.Version == D3D_ROOT_SIGNATURE_VERSION_1_0);
return &deserializer->desc.d3d12.u.Desc_1_0; return &deserializer->desc.d3d12.Desc_1_0;
} }
static const struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signature_deserializer_vtbl = static const struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signature_deserializer_vtbl =
@ -449,7 +449,7 @@ HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc,
*error_blob = NULL; *error_blob = NULL;
vkd3d_desc.version = VKD3D_ROOT_SIGNATURE_VERSION_1_0; vkd3d_desc.version = VKD3D_ROOT_SIGNATURE_VERSION_1_0;
vkd3d_desc.u.v_1_0 = *(const struct vkd3d_root_signature_desc *)desc; vkd3d_desc.v_1_0 = *(const struct vkd3d_root_signature_desc *)desc;
if ((ret = vkd3d_shader_serialize_root_signature(&vkd3d_desc, &dxbc)) < 0) if ((ret = vkd3d_shader_serialize_root_signature(&vkd3d_desc, &dxbc)) < 0)
{ {
WARN("Failed to serialize root signature, vkd3d result %d.\n", ret); WARN("Failed to serialize root signature, vkd3d result %d.\n", ret);

View File

@ -20,7 +20,6 @@
#define __VKD3D_PRIVATE_H #define __VKD3D_PRIVATE_H
#define COBJMACROS #define COBJMACROS
#define NONAMELESSUNION
#define VK_NO_PROTOTYPES #define VK_NO_PROTOTYPES
#include "vkd3d_common.h" #include "vkd3d_common.h"
@ -309,13 +308,13 @@ struct vkd3d_private_data
{ {
BYTE data[1]; BYTE data[1];
IUnknown *object; IUnknown *object;
} u; };
}; };
static inline void vkd3d_private_data_destroy(struct vkd3d_private_data *data) static inline void vkd3d_private_data_destroy(struct vkd3d_private_data *data)
{ {
if (data->is_object) if (data->is_object)
IUnknown_Release(data->u.object); IUnknown_Release(data->object);
list_remove(&data->entry); list_remove(&data->entry);
vkd3d_free(data); vkd3d_free(data);
} }
@ -438,7 +437,7 @@ struct d3d12_sparse_tile
{ {
struct d3d12_sparse_image_region image; struct d3d12_sparse_image_region image;
struct d3d12_sparse_buffer_region buffer; struct d3d12_sparse_buffer_region buffer;
} u; };
VkDeviceMemory vk_memory; VkDeviceMemory vk_memory;
VkDeviceSize vk_offset; VkDeviceSize vk_offset;
}; };
@ -470,7 +469,7 @@ struct d3d12_resource
{ {
VkBuffer vk_buffer; VkBuffer vk_buffer;
VkImage vk_image; VkImage vk_image;
} u; };
unsigned int flags; unsigned int flags;
struct d3d12_heap *heap; struct d3d12_heap *heap;
@ -542,7 +541,7 @@ struct vkd3d_view
VkBufferView vk_buffer_view; VkBufferView vk_buffer_view;
VkImageView vk_image_view; VkImageView vk_image_view;
VkSampler vk_sampler; VkSampler vk_sampler;
} u; };
VkBufferView vk_counter_view; VkBufferView vk_counter_view;
VkDeviceAddress vk_counter_address; VkDeviceAddress vk_counter_address;
const struct vkd3d_format *format; const struct vkd3d_format *format;
@ -596,7 +595,7 @@ struct d3d12_desc
{ {
VkDescriptorBufferInfo vk_cbv_info; VkDescriptorBufferInfo vk_cbv_info;
struct vkd3d_view *view; struct vkd3d_view *view;
} u; } info;
}; };
static inline struct d3d12_desc *d3d12_desc_from_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle) static inline struct d3d12_desc *d3d12_desc_from_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE cpu_handle)
@ -807,7 +806,7 @@ struct d3d12_root_parameter
struct d3d12_root_constant constant; struct d3d12_root_constant constant;
struct d3d12_root_descriptor descriptor; struct d3d12_root_descriptor descriptor;
struct d3d12_root_descriptor_table descriptor_table; struct d3d12_root_descriptor_table descriptor_table;
} u; };
}; };
/* ID3D12RootSignature */ /* ID3D12RootSignature */
@ -938,7 +937,7 @@ struct d3d12_pipeline_state
{ {
struct d3d12_graphics_pipeline_state graphics; struct d3d12_graphics_pipeline_state graphics;
struct d3d12_compute_pipeline_state compute; struct d3d12_compute_pipeline_state compute;
} u; };
VkPipelineBindPoint vk_bind_point; VkPipelineBindPoint vk_bind_point;
struct d3d12_device *device; struct d3d12_device *device;
@ -960,7 +959,7 @@ static inline bool d3d12_pipeline_state_has_unknown_dsv_format(struct d3d12_pipe
{ {
if (d3d12_pipeline_state_is_graphics(state)) if (d3d12_pipeline_state_is_graphics(state))
{ {
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics; struct d3d12_graphics_pipeline_state *graphics = &state->graphics;
return graphics->null_attachment_mask & dsv_attachment_mask(graphics); return graphics->null_attachment_mask & dsv_attachment_mask(graphics);
} }
@ -1311,7 +1310,7 @@ struct d3d12_command_queue_submission
struct d3d12_command_queue_submission_signal signal; struct d3d12_command_queue_submission_signal signal;
struct d3d12_command_queue_submission_execute execute; struct d3d12_command_queue_submission_execute execute;
struct d3d12_command_queue_submission_bind_sparse bind_sparse; struct d3d12_command_queue_submission_bind_sparse bind_sparse;
} u; };
}; };
struct vkd3d_timeline_semaphore struct vkd3d_timeline_semaphore

View File

@ -9974,7 +9974,7 @@ static void test_shader_instructions(void)
struct uvec4 src0; struct uvec4 src0;
struct uvec4 src1; struct uvec4 src1;
struct uvec4 src2; struct uvec4 src2;
} u; };
struct struct
{ {
struct ivec4 src0; struct ivec4 src0;