wine-staging/patches/vkd3d-latest/0004-Updated-vkd3d-to-5c917552c927835c6f446dbecf1aa6ff2cc.patch
2024-02-10 18:55:27 +11:00

1668 lines
72 KiB
Diff

From a7881d22b7765f148af5eb1c9ebbf4eaace98f86 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Thu, 8 Feb 2024 12:06:22 +1100
Subject: [PATCH 4/5] Updated vkd3d to
5c917552c927835c6f446dbecf1aa6ff2cc30cbe.
---
libs/vkd3d/include/private/vkd3d_common.h | 12 -
libs/vkd3d/include/private/vkd3d_test.h | 40 +-
libs/vkd3d/libs/vkd3d-shader/d3d_asm.c | 6 +
libs/vkd3d/libs/vkd3d-shader/dxil.c | 232 ++++++++---
libs/vkd3d/libs/vkd3d-shader/ir.c | 384 +++++++++++++++++-
libs/vkd3d/libs/vkd3d-shader/spirv.c | 185 +++++----
.../libs/vkd3d-shader/vkd3d_shader_private.h | 6 +
libs/vkd3d/libs/vkd3d/command.c | 28 +-
libs/vkd3d/libs/vkd3d/device.c | 96 ++++-
libs/vkd3d/libs/vkd3d/resource.c | 10 +-
libs/vkd3d/libs/vkd3d/utils.c | 5 +
libs/vkd3d/libs/vkd3d/vkd3d_main.c | 8 +-
libs/vkd3d/libs/vkd3d/vkd3d_private.h | 29 +-
13 files changed, 831 insertions(+), 210 deletions(-)
diff --git a/libs/vkd3d/include/private/vkd3d_common.h b/libs/vkd3d/include/private/vkd3d_common.h
index 666bb80faf9..b5a8240d28e 100644
--- a/libs/vkd3d/include/private/vkd3d_common.h
+++ b/libs/vkd3d/include/private/vkd3d_common.h
@@ -304,18 +304,6 @@ static inline uint32_t vkd3d_atomic_increment_u32(uint32_t volatile *x)
return vkd3d_atomic_add_fetch_u32(x, 1);
}
-#ifndef _WIN32
-static inline LONG InterlockedIncrement(LONG volatile *x)
-{
- return vkd3d_atomic_increment_u32((uint32_t *)x);
-}
-
-static inline LONG InterlockedDecrement(LONG volatile *x)
-{
- return vkd3d_atomic_decrement_u32((uint32_t *)x);
-}
-#endif /* _WIN32 */
-
static inline void vkd3d_parse_version(const char *version, int *major, int *minor)
{
*major = atoi(version);
diff --git a/libs/vkd3d/include/private/vkd3d_test.h b/libs/vkd3d/include/private/vkd3d_test.h
index 081443c4fa6..a337ac07269 100644
--- a/libs/vkd3d/include/private/vkd3d_test.h
+++ b/libs/vkd3d/include/private/vkd3d_test.h
@@ -101,12 +101,12 @@ static void vkd3d_test_end_todo(void);
struct vkd3d_test_state
{
- LONG success_count;
- LONG failure_count;
- LONG skip_count;
- LONG todo_count;
- LONG todo_success_count;
- LONG bug_count;
+ unsigned int success_count;
+ unsigned int failure_count;
+ unsigned int skip_count;
+ unsigned int todo_count;
+ unsigned int todo_success_count;
+ unsigned int bug_count;
unsigned int debug_level;
@@ -150,13 +150,13 @@ vkd3d_test_check_assert_that(unsigned int line, bool result, const char *fmt, va
{
if (result)
{
- InterlockedIncrement(&vkd3d_test_state.success_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.success_count);
if (vkd3d_test_state.debug_level > 1)
vkd3d_test_printf(line, "Test succeeded.\n");
}
else
{
- InterlockedIncrement(&vkd3d_test_state.failure_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.failure_count);
vkd3d_test_printf(line, "Test failed: ");
vprintf(fmt, args);
}
@@ -180,7 +180,7 @@ vkd3d_test_check_ok(unsigned int line, bool result, const char *fmt, va_list arg
if (is_bug && vkd3d_test_state.bug_enabled)
{
- InterlockedIncrement(&vkd3d_test_state.bug_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.bug_count);
if (is_todo)
result = !result;
if (result)
@@ -193,12 +193,12 @@ vkd3d_test_check_ok(unsigned int line, bool result, const char *fmt, va_list arg
{
if (result)
{
- InterlockedIncrement(&vkd3d_test_state.todo_success_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.todo_success_count);
vkd3d_test_printf(line, "Todo succeeded: ");
}
else
{
- InterlockedIncrement(&vkd3d_test_state.todo_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.todo_count);
vkd3d_test_printf(line, "Todo: ");
}
vprintf(fmt, args);
@@ -227,7 +227,7 @@ vkd3d_test_skip(unsigned int line, const char *fmt, ...)
vkd3d_test_printf(line, "Test skipped: ");
vprintf(fmt, args);
va_end(args);
- InterlockedIncrement(&vkd3d_test_state.skip_count);
+ vkd3d_atomic_increment_u32(&vkd3d_test_state.skip_count);
}
static void VKD3D_PRINTF_FUNC(2, 3) VKD3D_UNUSED
@@ -293,16 +293,14 @@ int main(int argc, char **argv)
vkd3d_test_main(argc, argv);
- printf("%s: %lu tests executed (%lu failures, %lu skipped, %lu todo, %lu bugs).\n",
+ printf("%s: %u tests executed (%u failures, %u skipped, %u todo, %u bugs).\n",
vkd3d_test_name,
- (unsigned long)(vkd3d_test_state.success_count
- + vkd3d_test_state.failure_count + vkd3d_test_state.todo_count
- + vkd3d_test_state.todo_success_count),
- (unsigned long)(vkd3d_test_state.failure_count
- + vkd3d_test_state.todo_success_count),
- (unsigned long)vkd3d_test_state.skip_count,
- (unsigned long)vkd3d_test_state.todo_count,
- (unsigned long)vkd3d_test_state.bug_count);
+ vkd3d_test_state.success_count + vkd3d_test_state.failure_count
+ + vkd3d_test_state.todo_count + vkd3d_test_state.todo_success_count,
+ vkd3d_test_state.failure_count + vkd3d_test_state.todo_success_count,
+ vkd3d_test_state.skip_count,
+ vkd3d_test_state.todo_count,
+ vkd3d_test_state.bug_count);
if (test_platform)
free(test_platform);
diff --git a/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c
index dd96b7fa50b..3f86bd45960 100644
--- a/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c
+++ b/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c
@@ -30,8 +30,11 @@
static const char * const shader_opcode_names[] =
{
[VKD3DSIH_ABS ] = "abs",
+ [VKD3DSIH_ACOS ] = "acos",
[VKD3DSIH_ADD ] = "add",
[VKD3DSIH_AND ] = "and",
+ [VKD3DSIH_ASIN ] = "asin",
+ [VKD3DSIH_ATAN ] = "atan",
[VKD3DSIH_ATOMIC_AND ] = "atomic_and",
[VKD3DSIH_ATOMIC_CMP_STORE ] = "atomic_cmp_store",
[VKD3DSIH_ATOMIC_IADD ] = "atomic_iadd",
@@ -168,10 +171,13 @@ static const char * const shader_opcode_names[] =
[VKD3DSIH_GATHER4_S ] = "gather4_s",
[VKD3DSIH_GEO ] = "ge",
[VKD3DSIH_GEU ] = "ge_unord",
+ [VKD3DSIH_HCOS ] = "hcos",
[VKD3DSIH_HS_CONTROL_POINT_PHASE ] = "hs_control_point_phase",
[VKD3DSIH_HS_DECLS ] = "hs_decls",
[VKD3DSIH_HS_FORK_PHASE ] = "hs_fork_phase",
[VKD3DSIH_HS_JOIN_PHASE ] = "hs_join_phase",
+ [VKD3DSIH_HSIN ] = "hsin",
+ [VKD3DSIH_HTAN ] = "htan",
[VKD3DSIH_IADD ] = "iadd",
[VKD3DSIH_IBFE ] = "ibfe",
[VKD3DSIH_IDIV ] = "idiv",
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
index ba951a6e51b..a001f6f0642 100644
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
@@ -339,6 +339,12 @@ enum dx_intrinsic_opcode
DX_COS = 12,
DX_SIN = 13,
DX_TAN = 14,
+ DX_ACOS = 15,
+ DX_ASIN = 16,
+ DX_ATAN = 17,
+ DX_HCOS = 18,
+ DX_HSIN = 19,
+ DX_HTAN = 20,
DX_EXP = 21,
DX_FRC = 22,
DX_LOG = 23,
@@ -364,6 +370,7 @@ enum dx_intrinsic_opcode
DX_CREATE_HANDLE = 57,
DX_CBUFFER_LOAD_LEGACY = 59,
DX_TEXTURE_LOAD = 66,
+ DX_TEXTURE_STORE = 67,
DX_BUFFER_LOAD = 68,
DX_DERIV_COARSEX = 83,
DX_DERIV_COARSEY = 84,
@@ -2176,21 +2183,29 @@ static enum vkd3d_data_type vkd3d_data_type_from_sm6_type(const struct sm6_type
}
static void register_init_ssa_vector(struct vkd3d_shader_register *reg, const struct sm6_type *type,
- unsigned int component_count, struct sm6_parser *sm6)
+ unsigned int component_count, struct sm6_value *value, struct sm6_parser *sm6)
{
enum vkd3d_data_type data_type;
unsigned int id;
- id = sm6_parser_alloc_ssa_id(sm6);
+ if (value && register_is_ssa(&value->u.reg) && value->u.reg.idx[0].offset)
+ {
+ id = value->u.reg.idx[0].offset;
+ TRACE("Using forward-allocated id %u.\n", id);
+ }
+ else
+ {
+ id = sm6_parser_alloc_ssa_id(sm6);
+ }
data_type = vkd3d_data_type_from_sm6_type(sm6_type_get_scalar_type(type, 0));
register_init_with_id(reg, VKD3DSPR_SSA, data_type, id);
reg->dimension = component_count > 1 ? VSIR_DIMENSION_VEC4 : VSIR_DIMENSION_SCALAR;
}
static void register_init_ssa_scalar(struct vkd3d_shader_register *reg, const struct sm6_type *type,
- struct sm6_parser *sm6)
+ struct sm6_value *value, struct sm6_parser *sm6)
{
- register_init_ssa_vector(reg, type, 1, sm6);
+ register_init_ssa_vector(reg, sm6_type_get_scalar_type(type, 0), 1, value, sm6);
}
static void dst_param_init(struct vkd3d_shader_dst_param *param)
@@ -2200,6 +2215,13 @@ static void dst_param_init(struct vkd3d_shader_dst_param *param)
param->shift = 0;
}
+static void dst_param_init_with_mask(struct vkd3d_shader_dst_param *param, unsigned int mask)
+{
+ param->write_mask = mask;
+ param->modifiers = 0;
+ param->shift = 0;
+}
+
static inline void dst_param_init_scalar(struct vkd3d_shader_dst_param *param, unsigned int component_idx)
{
param->write_mask = 1u << component_idx;
@@ -2215,10 +2237,10 @@ static void dst_param_init_vector(struct vkd3d_shader_dst_param *param, unsigned
}
static void dst_param_init_ssa_scalar(struct vkd3d_shader_dst_param *param, const struct sm6_type *type,
- struct sm6_parser *sm6)
+ struct sm6_value *value, struct sm6_parser *sm6)
{
dst_param_init(param);
- register_init_ssa_scalar(&param->reg, type, sm6);
+ register_init_ssa_scalar(&param->reg, type, value, sm6);
}
static inline void src_param_init(struct vkd3d_shader_src_param *param)
@@ -2275,7 +2297,7 @@ static void instruction_dst_param_init_ssa_scalar(struct vkd3d_shader_instructio
struct vkd3d_shader_dst_param *param = instruction_dst_params_alloc(ins, 1, sm6);
struct sm6_value *dst = sm6_parser_get_current_value(sm6);
- dst_param_init_ssa_scalar(param, dst->type, sm6);
+ dst_param_init_ssa_scalar(param, dst->type, dst, sm6);
param->write_mask = VKD3DSP_WRITEMASK_0;
dst->u.reg = param->reg;
}
@@ -2287,7 +2309,7 @@ static void instruction_dst_param_init_ssa_vector(struct vkd3d_shader_instructio
struct sm6_value *dst = sm6_parser_get_current_value(sm6);
dst_param_init_vector(param, component_count);
- register_init_ssa_vector(&param->reg, sm6_type_get_scalar_type(dst->type, 0), component_count, sm6);
+ register_init_ssa_vector(&param->reg, sm6_type_get_scalar_type(dst->type, 0), component_count, dst, sm6);
dst->u.reg = param->reg;
}
@@ -2450,6 +2472,7 @@ static const struct sm6_value *sm6_parser_get_value_safe(struct sm6_parser *sm6,
static size_t sm6_parser_get_value_idx_by_ref(struct sm6_parser *sm6, const struct dxil_record *record,
const struct sm6_type *fwd_type, unsigned int *rec_idx)
{
+ struct sm6_value *value;
unsigned int idx;
uint64_t val_ref;
size_t operand;
@@ -2463,23 +2486,39 @@ static size_t sm6_parser_get_value_idx_by_ref(struct sm6_parser *sm6, const stru
if (operand == SIZE_MAX)
return SIZE_MAX;
- if (operand >= sm6->value_count)
+ if (operand >= sm6->value_count && !fwd_type)
{
- if (!fwd_type)
+ /* Forward references are followed by a type id unless an earlier operand set the type,
+ * or it is contained in a function declaration. */
+ if (!dxil_record_validate_operand_min_count(record, idx + 1, sm6))
+ return SIZE_MAX;
+ if (!(fwd_type = sm6_parser_get_type(sm6, record->operands[idx++])))
+ return SIZE_MAX;
+ }
+ *rec_idx = idx;
+
+ if (fwd_type)
+ {
+ value = &sm6->values[operand];
+ if (value->type)
{
- /* Forward references are followed by a type id unless an earlier operand set the type,
- * or it is contained in a function declaration. */
- if (!dxil_record_validate_operand_min_count(record, idx + 1, sm6))
- return SIZE_MAX;
- if (!(fwd_type = sm6_parser_get_type(sm6, record->operands[idx++])))
- return SIZE_MAX;
+ if (value->type != fwd_type)
+ {
+ WARN("Value already has a mismatching type.\n");
+ vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_TYPE_MISMATCH,
+ "The type of a source value does not match the predefined type.");
+ }
+ }
+ else
+ {
+ value->type = fwd_type;
+ value->value_type = VALUE_TYPE_REG;
+ register_init_with_id(&value->u.reg, VKD3DSPR_SSA, vkd3d_data_type_from_sm6_type(
+ sm6_type_get_scalar_type(fwd_type, 0)), sm6_parser_alloc_ssa_id(sm6));
+ value->u.reg.dimension = sm6_type_is_scalar(fwd_type) ? VSIR_DIMENSION_SCALAR
+ : VSIR_DIMENSION_VEC4;
}
- FIXME("Forward value references are not supported yet.\n");
- vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
- "Unsupported value forward reference.");
- return SIZE_MAX;
}
- *rec_idx = idx;
return operand;
}
@@ -3476,7 +3515,7 @@ static void sm6_parser_emit_binop(struct sm6_parser *sm6, const struct dxil_reco
dst_param_init(&dst_params[0]);
dst_param_init(&dst_params[1]);
- register_init_ssa_scalar(&dst_params[index].reg, a->type, sm6);
+ register_init_ssa_scalar(&dst_params[index].reg, a->type, dst, sm6);
vsir_register_init(&dst_params[index ^ 1].reg, VKD3DSPR_NULL, VKD3D_DATA_UNUSED, 0);
dst->u.reg = dst_params[index].reg;
}
@@ -3547,47 +3586,36 @@ static void sm6_parser_emit_br(struct sm6_parser *sm6, const struct dxil_record
ins->handler_idx = VKD3DSIH_NOP;
}
-static bool sm6_parser_emit_coordinate_construct(struct sm6_parser *sm6, const struct sm6_value **operands,
- const struct sm6_value *z_operand, struct function_emission_state *state,
- struct vkd3d_shader_register *reg)
+static bool sm6_parser_emit_reg_composite_construct(struct sm6_parser *sm6, const struct vkd3d_shader_register **operand_regs,
+ unsigned int component_count, struct function_emission_state *state, struct vkd3d_shader_register *reg)
{
- const struct vkd3d_shader_register *operand_regs[VKD3D_VEC4_SIZE];
struct vkd3d_shader_instruction *ins = state->ins;
struct vkd3d_shader_src_param *src_params;
struct vkd3d_shader_dst_param *dst_param;
- const unsigned int max_operands = 3;
- unsigned int i, component_count;
bool all_constant = true;
-
- for (component_count = 0; component_count < max_operands; ++component_count)
- {
- if (!z_operand && operands[component_count]->is_undefined)
- break;
- operand_regs[component_count] = &operands[component_count]->u.reg;
- all_constant &= register_is_constant_or_undef(operand_regs[component_count]);
- }
- if (z_operand)
- {
- all_constant &= register_is_constant(&z_operand->u.reg);
- operand_regs[component_count++] = &z_operand->u.reg;
- }
+ unsigned int i;
if (component_count == 1)
{
- *reg = operands[0]->u.reg;
+ *reg = *operand_regs[0];
return true;
}
+ for (i = 0; i < component_count; ++i)
+ all_constant &= register_is_constant(operand_regs[i]);
+
if (all_constant)
{
vsir_register_init(reg, VKD3DSPR_IMMCONST, operand_regs[0]->data_type, 0);
reg->dimension = VSIR_DIMENSION_VEC4;
for (i = 0; i < component_count; ++i)
reg->u.immconst_u32[i] = operand_regs[i]->u.immconst_u32[0];
+ for (; i < VKD3D_VEC4_SIZE; ++i)
+ reg->u.immconst_u32[i] = 0;
return true;
}
- register_init_with_id(reg, VKD3DSPR_TEMP, operands[0]->u.reg.data_type, state->temp_idx++);
+ register_init_with_id(reg, VKD3DSPR_TEMP, operand_regs[0]->data_type, state->temp_idx++);
reg->dimension = VSIR_DIMENSION_VEC4;
for (i = 0; i < component_count; ++i, ++ins)
@@ -3613,6 +3641,40 @@ static bool sm6_parser_emit_coordinate_construct(struct sm6_parser *sm6, const s
return true;
}
+static bool sm6_parser_emit_composite_construct(struct sm6_parser *sm6, const struct sm6_value **operands,
+ unsigned int component_count, struct function_emission_state *state, struct vkd3d_shader_register *reg)
+{
+ const struct vkd3d_shader_register *operand_regs[VKD3D_VEC4_SIZE];
+ unsigned int i;
+
+ for (i = 0; i < component_count; ++i)
+ operand_regs[i] = &operands[i]->u.reg;
+
+ return sm6_parser_emit_reg_composite_construct(sm6, operand_regs, component_count, state, reg);
+}
+
+static bool sm6_parser_emit_coordinate_construct(struct sm6_parser *sm6, const struct sm6_value **operands,
+ const struct sm6_value *z_operand, struct function_emission_state *state,
+ struct vkd3d_shader_register *reg)
+{
+ const struct vkd3d_shader_register *operand_regs[VKD3D_VEC4_SIZE];
+ const unsigned int max_operands = 3;
+ unsigned int component_count;
+
+ for (component_count = 0; component_count < max_operands; ++component_count)
+ {
+ if (!z_operand && operands[component_count]->is_undefined)
+ break;
+ operand_regs[component_count] = &operands[component_count]->u.reg;
+ }
+ if (z_operand)
+ {
+ operand_regs[component_count++] = &z_operand->u.reg;
+ }
+
+ return sm6_parser_emit_reg_composite_construct(sm6, operand_regs, component_count, state, reg);
+}
+
static enum vkd3d_shader_opcode map_dx_unary_op(enum dx_intrinsic_opcode op)
{
switch (op)
@@ -3625,6 +3687,18 @@ static enum vkd3d_shader_opcode map_dx_unary_op(enum dx_intrinsic_opcode op)
return VKD3DSIH_ISFINITE;
case DX_TAN:
return VKD3DSIH_TAN;
+ case DX_ACOS:
+ return VKD3DSIH_ACOS;
+ case DX_ASIN:
+ return VKD3DSIH_ASIN;
+ case DX_ATAN:
+ return VKD3DSIH_ATAN;
+ case DX_HCOS:
+ return VKD3DSIH_HCOS;
+ case DX_HSIN:
+ return VKD3DSIH_HSIN;
+ case DX_HTAN:
+ return VKD3DSIH_HTAN;
case DX_EXP:
return VKD3DSIH_EXP;
case DX_FRC:
@@ -3983,7 +4057,7 @@ static void sm6_parser_emit_dx_sincos(struct sm6_parser *sm6, enum dx_intrinsic_
dst_params = instruction_dst_params_alloc(ins, 2, sm6);
dst_param_init(&dst_params[0]);
dst_param_init(&dst_params[1]);
- register_init_ssa_scalar(&dst_params[index].reg, dst->type, sm6);
+ register_init_ssa_scalar(&dst_params[index].reg, dst->type, dst, sm6);
vsir_register_init(&dst_params[index ^ 1].reg, VKD3DSPR_NULL, VKD3D_DATA_UNUSED, 0);
dst->u.reg = dst_params[index].reg;
}
@@ -4099,6 +4173,56 @@ static void sm6_parser_emit_dx_texture_load(struct sm6_parser *sm6, enum dx_intr
instruction_dst_param_init_ssa_vector(ins, VKD3D_VEC4_SIZE, sm6);
}
+static void sm6_parser_emit_dx_texture_store(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
+ const struct sm6_value **operands, struct function_emission_state *state)
+{
+ struct vkd3d_shader_register coord, texel;
+ struct vkd3d_shader_src_param *src_params;
+ struct vkd3d_shader_dst_param *dst_param;
+ unsigned int write_mask, component_count;
+ struct vkd3d_shader_instruction *ins;
+ const struct sm6_value *resource;
+
+ resource = operands[0];
+ if (!sm6_value_validate_is_texture_handle(resource, op, sm6))
+ return;
+
+ if (!sm6_parser_emit_coordinate_construct(sm6, &operands[1], NULL, state, &coord))
+ return;
+
+ write_mask = sm6_value_get_constant_uint(operands[8]);
+ if (!write_mask || write_mask > VKD3DSP_WRITEMASK_ALL)
+ {
+ WARN("Invalid write mask %#x.\n", write_mask);
+ vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
+ "Write mask %#x for a texture store operation is invalid.", write_mask);
+ return;
+ }
+ else if (write_mask & (write_mask + 1))
+ {
+ /* In this case, it is unclear which source operands will be defined unless we encounter it in a shader. */
+ FIXME("Unhandled write mask %#x.\n", write_mask);
+ vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
+ "Write mask %#x for a texture store operation is unhandled.", write_mask);
+ }
+ component_count = vsir_write_mask_component_count(write_mask);
+
+ if (!sm6_parser_emit_composite_construct(sm6, &operands[4], component_count, state, &texel))
+ return;
+
+ ins = state->ins;
+ vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_STORE_UAV_TYPED);
+
+ if (!(src_params = instruction_src_params_alloc(ins, 2, sm6)))
+ return;
+ src_param_init_vector_from_reg(&src_params[0], &coord);
+ src_param_init_vector_from_reg(&src_params[1], &texel);
+
+ dst_param = instruction_dst_params_alloc(ins, 1, sm6);
+ dst_param->reg = resource->u.handle.reg;
+ dst_param_init_with_mask(dst_param, write_mask);
+}
+
struct sm6_dx_opcode_info
{
const char *ret_type;
@@ -4127,6 +4251,9 @@ struct sm6_dx_opcode_info
*/
static const struct sm6_dx_opcode_info sm6_dx_op_table[] =
{
+ [DX_ACOS ] = {"g", "R", sm6_parser_emit_dx_unary},
+ [DX_ASIN ] = {"g", "R", sm6_parser_emit_dx_unary},
+ [DX_ATAN ] = {"g", "R", sm6_parser_emit_dx_unary},
[DX_BFREV ] = {"m", "R", sm6_parser_emit_dx_unary},
[DX_BUFFER_LOAD ] = {"o", "Hii", sm6_parser_emit_dx_buffer_load},
[DX_CBUFFER_LOAD_LEGACY ] = {"o", "Hi", sm6_parser_emit_dx_cbuffer_load},
@@ -4145,6 +4272,9 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] =
[DX_FMIN ] = {"g", "RR", sm6_parser_emit_dx_binary},
[DX_FRC ] = {"g", "R", sm6_parser_emit_dx_unary},
[DX_IBFE ] = {"m", "iiR", sm6_parser_emit_dx_tertiary},
+ [DX_HCOS ] = {"g", "R", sm6_parser_emit_dx_unary},
+ [DX_HSIN ] = {"g", "R", sm6_parser_emit_dx_unary},
+ [DX_HTAN ] = {"g", "R", sm6_parser_emit_dx_unary},
[DX_IMAX ] = {"m", "RR", sm6_parser_emit_dx_binary},
[DX_IMIN ] = {"m", "RR", sm6_parser_emit_dx_binary},
[DX_ISFINITE ] = {"1", "g", sm6_parser_emit_dx_unary},
@@ -4166,6 +4296,7 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] =
[DX_STORE_OUTPUT ] = {"v", "ii8o", sm6_parser_emit_dx_store_output},
[DX_TAN ] = {"g", "R", sm6_parser_emit_dx_unary},
[DX_TEXTURE_LOAD ] = {"o", "HiiiiCCC", sm6_parser_emit_dx_texture_load},
+ [DX_TEXTURE_STORE ] = {"v", "Hiiiooooc", sm6_parser_emit_dx_texture_store},
[DX_UBFE ] = {"m", "iiR", sm6_parser_emit_dx_tertiary},
[DX_UMAX ] = {"m", "RR", sm6_parser_emit_dx_binary},
[DX_UMIN ] = {"m", "RR", sm6_parser_emit_dx_binary},
@@ -4725,8 +4856,8 @@ static void sm6_parser_emit_extractval(struct sm6_parser *sm6, const struct dxil
vsir_instruction_init(ins, &sm6->p.location, VKD3DSIH_MOV);
src_param = instruction_src_params_alloc(ins, 1, sm6);
- src_param_init_scalar(src_param, elem_idx);
src_param->reg = src->u.reg;
+ src_param_init_scalar(src_param, elem_idx);
instruction_dst_param_init_ssa_scalar(ins, sm6);
}
@@ -4919,7 +5050,7 @@ static void sm6_parser_emit_phi(struct sm6_parser *sm6, const struct dxil_record
}
dst->type = type;
- register_init_ssa_scalar(&dst->u.reg, type, sm6);
+ register_init_ssa_scalar(&dst->u.reg, type, dst, sm6);
if (!(phi = sm6_block_phi_require_space(code_block, sm6)))
return;
@@ -5492,6 +5623,7 @@ static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const
struct vkd3d_shader_instruction *ins;
size_t i, block_idx, block_count;
const struct dxil_record *record;
+ const struct sm6_type *fwd_type;
bool ret_found, is_terminator;
struct sm6_block *code_block;
struct sm6_value *dst;
@@ -5568,6 +5700,7 @@ static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const
ins->handler_idx = VKD3DSIH_INVALID;
dst = sm6_parser_get_current_value(sm6);
+ fwd_type = dst->type;
dst->type = NULL;
dst->value_type = VALUE_TYPE_REG;
is_terminator = false;
@@ -5647,6 +5780,13 @@ static enum vkd3d_result sm6_parser_function_init(struct sm6_parser *sm6, const
else
assert(ins->handler_idx == VKD3DSIH_NOP);
+ if (dst->type && fwd_type && dst->type != fwd_type)
+ {
+ WARN("Type mismatch.\n");
+ vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_TYPE_MISMATCH,
+ "The type of a result value does not match the type defined by a forward reference.");
+ }
+
sm6->value_count += !!dst->type;
}
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
index a0d6212cbf5..88634487482 100644
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
@@ -470,6 +470,25 @@ static void dst_param_init_ssa_bool(struct vkd3d_shader_dst_param *dst, unsigned
dst->reg.idx[0].offset = idx;
}
+static void dst_param_init_temp_uint(struct vkd3d_shader_dst_param *dst, unsigned int idx)
+{
+ vsir_dst_param_init(dst, VKD3DSPR_TEMP, VKD3D_DATA_UINT, 1);
+ dst->reg.idx[0].offset = idx;
+ dst->write_mask = VKD3DSP_WRITEMASK_0;
+}
+
+static void src_param_init_temp_uint(struct vkd3d_shader_src_param *src, unsigned int idx)
+{
+ vsir_src_param_init(src, VKD3DSPR_TEMP, VKD3D_DATA_UINT, 1);
+ src->reg.idx[0].offset = idx;
+}
+
+static void src_param_init_const_uint(struct vkd3d_shader_src_param *src, uint32_t value)
+{
+ vsir_src_param_init(src, VKD3DSPR_IMMCONST, VKD3D_DATA_UINT, 0);
+ src->reg.u.immconst_u32[0] = value;
+}
+
void vsir_instruction_init(struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_location *location,
enum vkd3d_shader_opcode handler_idx)
{
@@ -2637,6 +2656,359 @@ fail:
return VKD3D_ERROR_OUT_OF_MEMORY;
}
+static void materialize_ssas_to_temps_process_src_param(struct vkd3d_shader_parser *parser, struct vkd3d_shader_src_param *src);
+
+/* This is idempotent: it can be safely applied more than once on the
+ * same register. */
+static void materialize_ssas_to_temps_process_reg(struct vkd3d_shader_parser *parser, struct vkd3d_shader_register *reg)
+{
+ unsigned int i;
+
+ if (reg->type == VKD3DSPR_SSA)
+ {
+ reg->type = VKD3DSPR_TEMP;
+ reg->idx[0].offset += parser->program.temp_count;
+ }
+
+ for (i = 0; i < reg->idx_count; ++i)
+ if (reg->idx[i].rel_addr)
+ materialize_ssas_to_temps_process_src_param(parser, reg->idx[i].rel_addr);
+}
+
+static void materialize_ssas_to_temps_process_dst_param(struct vkd3d_shader_parser *parser, struct vkd3d_shader_dst_param *dst)
+{
+ materialize_ssas_to_temps_process_reg(parser, &dst->reg);
+}
+
+static void materialize_ssas_to_temps_process_src_param(struct vkd3d_shader_parser *parser, struct vkd3d_shader_src_param *src)
+{
+ materialize_ssas_to_temps_process_reg(parser, &src->reg);
+}
+
+static const struct vkd3d_shader_src_param *materialize_ssas_to_temps_compute_source(struct vkd3d_shader_instruction *ins,
+ unsigned int label)
+{
+ unsigned int i;
+
+ assert(ins->handler_idx == VKD3DSIH_PHI);
+
+ for (i = 0; i < ins->src_count; i += 2)
+ {
+ if (label_from_src_param(&ins->src[i + 1]) == label)
+ return &ins->src[i];
+ }
+
+ vkd3d_unreachable();
+}
+
+static bool materialize_ssas_to_temps_synthesize_mov(struct vkd3d_shader_parser *parser,
+ struct vkd3d_shader_instruction *instruction, const struct vkd3d_shader_location *loc,
+ const struct vkd3d_shader_dst_param *dest, const struct vkd3d_shader_src_param *cond,
+ const struct vkd3d_shader_src_param *source, bool invert)
+{
+ struct vkd3d_shader_src_param *src;
+ struct vkd3d_shader_dst_param *dst;
+
+ if (!vsir_instruction_init_with_params(&parser->program, instruction, loc,
+ cond ? VKD3DSIH_MOVC : VKD3DSIH_MOV, 1, cond ? 3 : 1))
+ return false;
+
+ dst = instruction->dst;
+ src = instruction->src;
+
+ dst[0] = *dest;
+ materialize_ssas_to_temps_process_dst_param(parser, &dst[0]);
+
+ assert(dst[0].write_mask == VKD3DSP_WRITEMASK_0);
+ assert(dst[0].modifiers == 0);
+ assert(dst[0].shift == 0);
+
+ if (cond)
+ {
+ src[0] = *cond;
+ src[1 + invert] = *source;
+ memset(&src[2 - invert], 0, sizeof(src[2 - invert]));
+ src[2 - invert].reg = dst[0].reg;
+ materialize_ssas_to_temps_process_src_param(parser, &src[1]);
+ materialize_ssas_to_temps_process_src_param(parser, &src[2]);
+ }
+ else
+ {
+ src[0] = *source;
+ materialize_ssas_to_temps_process_src_param(parser, &src[0]);
+ }
+
+ return true;
+}
+
+static enum vkd3d_result materialize_ssas_to_temps(struct vkd3d_shader_parser *parser)
+{
+ struct vkd3d_shader_instruction *instructions = NULL;
+ struct materialize_ssas_to_temps_block_data
+ {
+ size_t phi_begin;
+ size_t phi_count;
+ } *block_index = NULL;
+ size_t ins_capacity = 0, ins_count = 0, i;
+ unsigned int current_label = 0;
+
+ if (!reserve_instructions(&instructions, &ins_capacity, parser->program.instructions.count))
+ goto fail;
+
+ if (!(block_index = vkd3d_calloc(parser->program.block_count, sizeof(*block_index))))
+ {
+ ERR("Failed to allocate block index.\n");
+ goto fail;
+ }
+
+ for (i = 0; i < parser->program.instructions.count; ++i)
+ {
+ struct vkd3d_shader_instruction *ins = &parser->program.instructions.elements[i];
+
+ switch (ins->handler_idx)
+ {
+ case VKD3DSIH_LABEL:
+ current_label = label_from_src_param(&ins->src[0]);
+ break;
+
+ case VKD3DSIH_PHI:
+ assert(current_label != 0);
+ assert(i != 0);
+ if (block_index[current_label - 1].phi_begin == 0)
+ block_index[current_label - 1].phi_begin = i;
+ block_index[current_label - 1].phi_count += 1;
+ break;
+
+ default:
+ current_label = 0;
+ break;
+ }
+ }
+
+ for (i = 0; i < parser->program.instructions.count; ++i)
+ {
+ struct vkd3d_shader_instruction *ins = &parser->program.instructions.elements[i];
+ size_t j;
+
+ for (j = 0; j < ins->dst_count; ++j)
+ materialize_ssas_to_temps_process_dst_param(parser, &ins->dst[j]);
+
+ for (j = 0; j < ins->src_count; ++j)
+ materialize_ssas_to_temps_process_src_param(parser, &ins->src[j]);
+
+ switch (ins->handler_idx)
+ {
+ case VKD3DSIH_LABEL:
+ current_label = label_from_src_param(&ins->src[0]);
+ break;
+
+ case VKD3DSIH_BRANCH:
+ {
+ if (vsir_register_is_label(&ins->src[0].reg))
+ {
+ const struct materialize_ssas_to_temps_block_data *data = &block_index[label_from_src_param(&ins->src[0]) - 1];
+
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + data->phi_count))
+ goto fail;
+
+ for (j = data->phi_begin; j < data->phi_begin + data->phi_count; ++j)
+ {
+ const struct vkd3d_shader_src_param *source;
+
+ source = materialize_ssas_to_temps_compute_source(&parser->program.instructions.elements[j], current_label);
+ if (!materialize_ssas_to_temps_synthesize_mov(parser, &instructions[ins_count], &ins->location,
+ &parser->program.instructions.elements[j].dst[0], NULL, source, false))
+ goto fail;
+
+ ++ins_count;
+ }
+ }
+ else
+ {
+ struct materialize_ssas_to_temps_block_data *data_true = &block_index[label_from_src_param(&ins->src[1]) - 1],
+ *data_false = &block_index[label_from_src_param(&ins->src[2]) - 1];
+ const struct vkd3d_shader_src_param *cond = &ins->src[0];
+
+ if (!reserve_instructions(&instructions, &ins_capacity,
+ ins_count + data_true->phi_count + data_false->phi_count))
+ goto fail;
+
+ for (j = data_true->phi_begin; j < data_true->phi_begin + data_true->phi_count; ++j)
+ {
+ const struct vkd3d_shader_src_param *source;
+
+ source = materialize_ssas_to_temps_compute_source(&parser->program.instructions.elements[j], current_label);
+ if (!materialize_ssas_to_temps_synthesize_mov(parser, &instructions[ins_count], &ins->location,
+ &parser->program.instructions.elements[j].dst[0], cond, source, false))
+ goto fail;
+
+ ++ins_count;
+ }
+
+ for (j = data_false->phi_begin; j < data_false->phi_begin + data_false->phi_count; ++j)
+ {
+ const struct vkd3d_shader_src_param *source;
+
+ source = materialize_ssas_to_temps_compute_source(&parser->program.instructions.elements[j], current_label);
+ if (!materialize_ssas_to_temps_synthesize_mov(parser, &instructions[ins_count], &ins->location,
+ &parser->program.instructions.elements[j].dst[0], cond, source, true))
+ goto fail;
+
+ ++ins_count;
+ }
+ }
+ break;
+ }
+
+ case VKD3DSIH_PHI:
+ continue;
+
+ default:
+ break;
+ }
+
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + 1))
+ goto fail;
+
+ instructions[ins_count++] = *ins;
+ }
+
+ vkd3d_free(parser->program.instructions.elements);
+ vkd3d_free(block_index);
+ parser->program.instructions.elements = instructions;
+ parser->program.instructions.capacity = ins_capacity;
+ parser->program.instructions.count = ins_count;
+ parser->program.temp_count += parser->program.ssa_count;
+ parser->program.ssa_count = 0;
+
+ return VKD3D_OK;
+
+fail:
+ vkd3d_free(instructions);
+ vkd3d_free(block_index);
+
+ return VKD3D_ERROR_OUT_OF_MEMORY;
+}
+
+static enum vkd3d_result simple_structurizer_run(struct vkd3d_shader_parser *parser)
+{
+ const unsigned int block_temp_idx = parser->program.temp_count;
+ struct vkd3d_shader_instruction *instructions = NULL;
+ const struct vkd3d_shader_location no_loc = {0};
+ size_t ins_capacity = 0, ins_count = 0, i;
+ bool first_label_found = false;
+
+ if (!reserve_instructions(&instructions, &ins_capacity, parser->program.instructions.count))
+ goto fail;
+
+ for (i = 0; i < parser->program.instructions.count; ++i)
+ {
+ struct vkd3d_shader_instruction *ins = &parser->program.instructions.elements[i];
+
+ switch (ins->handler_idx)
+ {
+ case VKD3DSIH_PHI:
+ case VKD3DSIH_SWITCH_MONOLITHIC:
+ vkd3d_unreachable();
+
+ case VKD3DSIH_LABEL:
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + 4))
+ goto fail;
+
+ if (!first_label_found)
+ {
+ first_label_found = true;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_MOV, 1, 1))
+ goto fail;
+ dst_param_init_temp_uint(&instructions[ins_count].dst[0], block_temp_idx);
+ src_param_init_const_uint(&instructions[ins_count].src[0], label_from_src_param(&ins->src[0]));
+ ins_count++;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_LOOP, 0, 0))
+ goto fail;
+ ins_count++;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_SWITCH, 0, 1))
+ goto fail;
+ src_param_init_temp_uint(&instructions[ins_count].src[0], block_temp_idx);
+ ins_count++;
+ }
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_CASE, 0, 1))
+ goto fail;
+ src_param_init_const_uint(&instructions[ins_count].src[0], label_from_src_param(&ins->src[0]));
+ ins_count++;
+ break;
+
+ case VKD3DSIH_BRANCH:
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + 2))
+ goto fail;
+
+ if (vsir_register_is_label(&ins->src[0].reg))
+ {
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_MOV, 1, 1))
+ goto fail;
+ dst_param_init_temp_uint(&instructions[ins_count].dst[0], block_temp_idx);
+ src_param_init_const_uint(&instructions[ins_count].src[0], label_from_src_param(&ins->src[0]));
+ ins_count++;
+ }
+ else
+ {
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_MOVC, 1, 3))
+ goto fail;
+ dst_param_init_temp_uint(&instructions[ins_count].dst[0], block_temp_idx);
+ instructions[ins_count].src[0] = ins->src[0];
+ src_param_init_const_uint(&instructions[ins_count].src[1], label_from_src_param(&ins->src[1]));
+ src_param_init_const_uint(&instructions[ins_count].src[2], label_from_src_param(&ins->src[2]));
+ ins_count++;
+ }
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_BREAK, 0, 0))
+ goto fail;
+ ins_count++;
+ break;
+
+ case VKD3DSIH_RET:
+ default:
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + 1))
+ goto fail;
+
+ instructions[ins_count++] = *ins;
+ break;
+ }
+ }
+
+ assert(first_label_found);
+
+ if (!reserve_instructions(&instructions, &ins_capacity, ins_count + 3))
+ goto fail;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_ENDSWITCH, 0, 0))
+ goto fail;
+ ins_count++;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_ENDLOOP, 0, 0))
+ goto fail;
+ ins_count++;
+
+ if (!vsir_instruction_init_with_params(&parser->program, &instructions[ins_count], &no_loc, VKD3DSIH_RET, 0, 0))
+ goto fail;
+ ins_count++;
+
+ vkd3d_free(parser->program.instructions.elements);
+ parser->program.instructions.elements = instructions;
+ parser->program.instructions.capacity = ins_capacity;
+ parser->program.instructions.count = ins_count;
+ parser->program.temp_count += 1;
+
+ return VKD3D_OK;
+
+fail:
+ vkd3d_free(instructions);
+ return VKD3D_ERROR_OUT_OF_MEMORY;
+}
+
enum vkd3d_result vkd3d_shader_normalise(struct vkd3d_shader_parser *parser,
const struct vkd3d_shader_compile_info *compile_info)
{
@@ -2652,6 +3024,12 @@ enum vkd3d_result vkd3d_shader_normalise(struct vkd3d_shader_parser *parser,
{
if ((result = lower_switch_to_if_ladder(&parser->program)) < 0)
return result;
+
+ if ((result = materialize_ssas_to_temps(parser)) < 0)
+ return result;
+
+ if ((result = simple_structurizer_run(parser)) < 0)
+ return result;
}
else
{
@@ -2679,13 +3057,13 @@ enum vkd3d_result vkd3d_shader_normalise(struct vkd3d_shader_parser *parser,
remove_dead_code(&parser->program);
- if ((result = flatten_control_flow_constructs(parser)) < 0)
- return result;
-
if ((result = normalise_combined_samplers(parser)) < 0)
return result;
}
+ if ((result = flatten_control_flow_constructs(parser)) < 0)
+ return result;
+
if (TRACE_ON())
vkd3d_shader_trace(&parser->program);
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
index 9b6ce742976..6c92b03b216 100644
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
@@ -3669,6 +3669,73 @@ static uint32_t spirv_compiler_emit_vector_shuffle(struct spirv_compiler *compil
type_id, vector1_id, vector2_id, components, component_count);
}
+static uint32_t spirv_compiler_emit_int_to_bool(struct spirv_compiler *compiler,
+ enum vkd3d_shader_conditional_op condition, enum vkd3d_data_type data_type,
+ unsigned int component_count, uint32_t val_id)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id;
+ SpvOp op;
+
+ assert(!(condition & ~(VKD3D_SHADER_CONDITIONAL_OP_NZ | VKD3D_SHADER_CONDITIONAL_OP_Z)));
+
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_BOOL, component_count);
+ op = condition & VKD3D_SHADER_CONDITIONAL_OP_Z ? SpvOpIEqual : SpvOpINotEqual;
+ return vkd3d_spirv_build_op_tr2(builder, &builder->function_stream, op, type_id, val_id,
+ data_type == VKD3D_DATA_UINT64
+ ? spirv_compiler_get_constant_uint64_vector(compiler, 0, component_count)
+ : spirv_compiler_get_constant_uint_vector(compiler, 0, component_count));
+}
+
+static uint32_t spirv_compiler_emit_bool_to_int(struct spirv_compiler *compiler,
+ unsigned int component_count, uint32_t val_id, bool signedness)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id, true_id, false_id;
+
+ true_id = spirv_compiler_get_constant_uint_vector(compiler, signedness ? 0xffffffff : 1, component_count);
+ false_id = spirv_compiler_get_constant_uint_vector(compiler, 0, component_count);
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, component_count);
+ return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
+}
+
+static uint32_t spirv_compiler_emit_bool_to_int64(struct spirv_compiler *compiler,
+ unsigned int component_count, uint32_t val_id, bool signedness)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id, true_id, false_id;
+
+ true_id = spirv_compiler_get_constant_uint64_vector(compiler, signedness ? UINT64_MAX : 1,
+ component_count);
+ false_id = spirv_compiler_get_constant_uint64_vector(compiler, 0, component_count);
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT64, component_count);
+ return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
+}
+
+static uint32_t spirv_compiler_emit_bool_to_float(struct spirv_compiler *compiler,
+ unsigned int component_count, uint32_t val_id, bool signedness)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id, true_id, false_id;
+
+ true_id = spirv_compiler_get_constant_float_vector(compiler, signedness ? -1.0f : 1.0f, component_count);
+ false_id = spirv_compiler_get_constant_float_vector(compiler, 0.0f, component_count);
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_FLOAT, component_count);
+ return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
+}
+
+static uint32_t spirv_compiler_emit_bool_to_double(struct spirv_compiler *compiler,
+ unsigned int component_count, uint32_t val_id, bool signedness)
+{
+ struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
+ uint32_t type_id, true_id, false_id;
+
+ true_id = spirv_compiler_get_constant_double_vector(compiler, signedness ? -1.0 : 1.0, component_count);
+ false_id = spirv_compiler_get_constant_double_vector(compiler, 0.0, component_count);
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_DOUBLE, component_count);
+ return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
+}
+
static uint32_t spirv_compiler_emit_load_constant(struct spirv_compiler *compiler,
const struct vkd3d_shader_register *reg, uint32_t swizzle, uint32_t write_mask)
{
@@ -3777,8 +3844,21 @@ static uint32_t spirv_compiler_emit_load_scalar(struct spirv_compiler *compiler,
if (component_type != reg_info->component_type)
{
- type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
- val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ if (component_type == VKD3D_SHADER_COMPONENT_BOOL)
+ {
+ if (reg_info->component_type != VKD3D_SHADER_COMPONENT_UINT)
+ {
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, 1);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ }
+ val_id = spirv_compiler_emit_int_to_bool(compiler, VKD3D_SHADER_CONDITIONAL_OP_NZ,
+ VKD3D_DATA_UINT, 1, val_id);
+ }
+ else
+ {
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ }
}
return val_id;
@@ -3965,8 +4045,21 @@ static uint32_t spirv_compiler_emit_load_reg(struct spirv_compiler *compiler,
if (component_type != reg_info.component_type)
{
- type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
- val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ if (component_type == VKD3D_SHADER_COMPONENT_BOOL)
+ {
+ if (reg_info.component_type != VKD3D_SHADER_COMPONENT_UINT)
+ {
+ type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, component_count);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ }
+ val_id = spirv_compiler_emit_int_to_bool(compiler, VKD3D_SHADER_CONDITIONAL_OP_NZ,
+ VKD3D_DATA_UINT, component_count, val_id);
+ }
+ else
+ {
+ type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
+ val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
+ }
}
return val_id;
@@ -4160,6 +4253,9 @@ static void spirv_compiler_emit_store_reg(struct spirv_compiler *compiler,
{
if (data_type_is_64_bit(reg->data_type))
src_write_mask = vsir_write_mask_32_from_64(write_mask);
+ if (component_type == VKD3D_SHADER_COMPONENT_BOOL)
+ val_id = spirv_compiler_emit_bool_to_int(compiler,
+ vsir_write_mask_component_count(src_write_mask), val_id, false);
type_id = vkd3d_spirv_get_type_id(builder, reg_info.component_type,
vsir_write_mask_component_count(src_write_mask));
val_id = vkd3d_spirv_build_op_bitcast(builder, type_id, val_id);
@@ -4383,73 +4479,6 @@ static void spirv_compiler_emit_interpolation_decorations(struct spirv_compiler
}
}
-static uint32_t spirv_compiler_emit_int_to_bool(struct spirv_compiler *compiler,
- enum vkd3d_shader_conditional_op condition, enum vkd3d_data_type data_type,
- unsigned int component_count, uint32_t val_id)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id;
- SpvOp op;
-
- assert(!(condition & ~(VKD3D_SHADER_CONDITIONAL_OP_NZ | VKD3D_SHADER_CONDITIONAL_OP_Z)));
-
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_BOOL, component_count);
- op = condition & VKD3D_SHADER_CONDITIONAL_OP_Z ? SpvOpIEqual : SpvOpINotEqual;
- return vkd3d_spirv_build_op_tr2(builder, &builder->function_stream, op, type_id, val_id,
- data_type == VKD3D_DATA_UINT64
- ? spirv_compiler_get_constant_uint64_vector(compiler, 0, component_count)
- : spirv_compiler_get_constant_uint_vector(compiler, 0, component_count));
-}
-
-static uint32_t spirv_compiler_emit_bool_to_int(struct spirv_compiler *compiler,
- unsigned int component_count, uint32_t val_id, bool signedness)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, true_id, false_id;
-
- true_id = spirv_compiler_get_constant_uint_vector(compiler, signedness ? 0xffffffff : 1, component_count);
- false_id = spirv_compiler_get_constant_uint_vector(compiler, 0, component_count);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT, component_count);
- return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
-}
-
-static uint32_t spirv_compiler_emit_bool_to_int64(struct spirv_compiler *compiler,
- unsigned int component_count, uint32_t val_id, bool signedness)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, true_id, false_id;
-
- true_id = spirv_compiler_get_constant_uint64_vector(compiler, signedness ? UINT64_MAX : 1,
- component_count);
- false_id = spirv_compiler_get_constant_uint64_vector(compiler, 0, component_count);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_UINT64, component_count);
- return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
-}
-
-static uint32_t spirv_compiler_emit_bool_to_float(struct spirv_compiler *compiler,
- unsigned int component_count, uint32_t val_id, bool signedness)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, true_id, false_id;
-
- true_id = spirv_compiler_get_constant_float_vector(compiler, signedness ? -1.0f : 1.0f, component_count);
- false_id = spirv_compiler_get_constant_float_vector(compiler, 0.0f, component_count);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_FLOAT, component_count);
- return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
-}
-
-static uint32_t spirv_compiler_emit_bool_to_double(struct spirv_compiler *compiler,
- unsigned int component_count, uint32_t val_id, bool signedness)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, true_id, false_id;
-
- true_id = spirv_compiler_get_constant_double_vector(compiler, signedness ? -1.0 : 1.0, component_count);
- false_id = spirv_compiler_get_constant_double_vector(compiler, 0.0, component_count);
- type_id = vkd3d_spirv_get_type_id(builder, VKD3D_SHADER_COMPONENT_DOUBLE, component_count);
- return vkd3d_spirv_build_op_select(builder, type_id, val_id, true_id, false_id);
-}
-
typedef uint32_t (*vkd3d_spirv_builtin_fixup_pfn)(struct spirv_compiler *compiler,
uint32_t val_id);
@@ -6968,6 +6997,9 @@ static enum GLSLstd450 spirv_compiler_map_ext_glsl_instruction(
}
glsl_insts[] =
{
+ {VKD3DSIH_ACOS, GLSLstd450Acos},
+ {VKD3DSIH_ASIN, GLSLstd450Asin},
+ {VKD3DSIH_ATAN, GLSLstd450Atan},
{VKD3DSIH_DFMA, GLSLstd450Fma},
{VKD3DSIH_DMAX, GLSLstd450NMax},
{VKD3DSIH_DMIN, GLSLstd450NMin},
@@ -6976,6 +7008,9 @@ static enum GLSLstd450 spirv_compiler_map_ext_glsl_instruction(
{VKD3DSIH_FIRSTBIT_LO, GLSLstd450FindILsb},
{VKD3DSIH_FIRSTBIT_SHI, GLSLstd450FindSMsb},
{VKD3DSIH_FRC, GLSLstd450Fract},
+ {VKD3DSIH_HCOS, GLSLstd450Cosh},
+ {VKD3DSIH_HSIN, GLSLstd450Sinh},
+ {VKD3DSIH_HTAN, GLSLstd450Tanh},
{VKD3DSIH_IMAX, GLSLstd450SMax},
{VKD3DSIH_IMIN, GLSLstd450SMin},
{VKD3DSIH_LOG, GLSLstd450Log2},
@@ -7082,7 +7117,7 @@ static void spirv_compiler_emit_mov(struct spirv_compiler *compiler,
}
write_mask32 = data_type_is_64_bit(dst->reg.data_type) ? vsir_write_mask_32_from_64(dst->write_mask) : dst->write_mask;
- swizzle32 = data_type_is_64_bit(dst->reg.data_type) ? vsir_swizzle_32_from_64(src->swizzle) : src->swizzle;
+ swizzle32 = data_type_is_64_bit(src->reg.data_type) ? vsir_swizzle_32_from_64(src->swizzle) : src->swizzle;
component_count = vsir_write_mask_component_count(write_mask32);
if (component_count != 1 && component_count != VKD3D_VEC4_SIZE
&& dst_reg_info.write_mask == VKD3DSP_WRITEMASK_ALL)
@@ -9552,6 +9587,12 @@ static int spirv_compiler_handle_instruction(struct spirv_compiler *compiler,
case VKD3DSIH_ISFINITE:
spirv_compiler_emit_isfinite(compiler, instruction);
break;
+ case VKD3DSIH_ACOS:
+ case VKD3DSIH_ASIN:
+ case VKD3DSIH_ATAN:
+ case VKD3DSIH_HCOS:
+ case VKD3DSIH_HSIN:
+ case VKD3DSIH_HTAN:
case VKD3DSIH_DFMA:
case VKD3DSIH_DMAX:
case VKD3DSIH_DMIN:
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
index a709121f1a1..acfd39b7643 100644
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -225,8 +225,11 @@ enum vkd3d_shader_error
enum vkd3d_shader_opcode
{
VKD3DSIH_ABS,
+ VKD3DSIH_ACOS,
VKD3DSIH_ADD,
VKD3DSIH_AND,
+ VKD3DSIH_ASIN,
+ VKD3DSIH_ATAN,
VKD3DSIH_ATOMIC_AND,
VKD3DSIH_ATOMIC_CMP_STORE,
VKD3DSIH_ATOMIC_IADD,
@@ -363,10 +366,13 @@ enum vkd3d_shader_opcode
VKD3DSIH_GATHER4_S,
VKD3DSIH_GEO,
VKD3DSIH_GEU,
+ VKD3DSIH_HCOS,
VKD3DSIH_HS_CONTROL_POINT_PHASE,
VKD3DSIH_HS_DECLS,
VKD3DSIH_HS_FORK_PHASE,
VKD3DSIH_HS_JOIN_PHASE,
+ VKD3DSIH_HSIN,
+ VKD3DSIH_HTAN,
VKD3DSIH_IADD,
VKD3DSIH_IBFE,
VKD3DSIH_IDIV,
diff --git a/libs/vkd3d/libs/vkd3d/command.c b/libs/vkd3d/libs/vkd3d/command.c
index f9940b3d383..8a47dc494f7 100644
--- a/libs/vkd3d/libs/vkd3d/command.c
+++ b/libs/vkd3d/libs/vkd3d/command.c
@@ -1921,12 +1921,12 @@ HRESULT d3d12_command_allocator_create(struct d3d12_device *device,
static void d3d12_command_signature_incref(struct d3d12_command_signature *signature)
{
- vkd3d_atomic_increment(&signature->internal_refcount);
+ vkd3d_atomic_increment_u32(&signature->internal_refcount);
}
static void d3d12_command_signature_decref(struct d3d12_command_signature *signature)
{
- unsigned int refcount = vkd3d_atomic_decrement(&signature->internal_refcount);
+ unsigned int refcount = vkd3d_atomic_decrement_u32(&signature->internal_refcount);
if (!refcount)
{
@@ -4499,8 +4499,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetComputeRootDescriptorTable(I
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList5(iface);
- TRACE("iface %p, root_parameter_index %u, base_descriptor %#"PRIx64".\n",
- iface, root_parameter_index, base_descriptor.ptr);
+ TRACE("iface %p, root_parameter_index %u, base_descriptor %s.\n",
+ iface, root_parameter_index, debug_gpu_handle(base_descriptor));
d3d12_command_list_set_descriptor_table(list, VKD3D_PIPELINE_BIND_POINT_COMPUTE,
root_parameter_index, base_descriptor);
@@ -4511,8 +4511,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_SetGraphicsRootDescriptorTable(
{
struct d3d12_command_list *list = impl_from_ID3D12GraphicsCommandList5(iface);
- TRACE("iface %p, root_parameter_index %u, base_descriptor %#"PRIx64".\n",
- iface, root_parameter_index, base_descriptor.ptr);
+ TRACE("iface %p, root_parameter_index %u, base_descriptor %s.\n",
+ iface, root_parameter_index, debug_gpu_handle(base_descriptor));
d3d12_command_list_set_descriptor_table(list, VKD3D_PIPELINE_BIND_POINT_GRAPHICS,
root_parameter_index, base_descriptor);
@@ -5432,8 +5432,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewUint(ID
struct d3d12_resource *resource_impl;
VkClearColorValue colour;
- TRACE("iface %p, gpu_handle %#"PRIx64", cpu_handle %s, resource %p, values %p, rect_count %u, rects %p.\n",
- iface, gpu_handle.ptr, debug_cpu_handle(cpu_handle), resource, values, rect_count, rects);
+ TRACE("iface %p, gpu_handle %s, cpu_handle %s, resource %p, values %p, rect_count %u, rects %p.\n",
+ iface, debug_gpu_handle(gpu_handle), debug_cpu_handle(cpu_handle), resource, values, rect_count, rects);
resource_impl = unsafe_impl_from_ID3D12Resource(resource);
if (!(descriptor = d3d12_desc_from_cpu_handle(cpu_handle)->s.u.view))
@@ -5496,8 +5496,8 @@ static void STDMETHODCALLTYPE d3d12_command_list_ClearUnorderedAccessViewFloat(I
VkClearColorValue colour;
struct vkd3d_view *view;
- TRACE("iface %p, gpu_handle %#"PRIx64", cpu_handle %s, resource %p, values %p, rect_count %u, rects %p.\n",
- iface, gpu_handle.ptr, debug_cpu_handle(cpu_handle), resource, values, rect_count, rects);
+ TRACE("iface %p, gpu_handle %s, cpu_handle %s, resource %p, values %p, rect_count %u, rects %p.\n",
+ iface, debug_gpu_handle(gpu_handle), debug_cpu_handle(cpu_handle), resource, values, rect_count, rects);
resource_impl = unsafe_impl_from_ID3D12Resource(resource);
if (!(view = d3d12_desc_from_cpu_handle(cpu_handle)->s.u.view))
@@ -5963,15 +5963,15 @@ static void STDMETHODCALLTYPE d3d12_command_list_EndRenderPass(ID3D12GraphicsCom
static void STDMETHODCALLTYPE d3d12_command_list_InitializeMetaCommand(ID3D12GraphicsCommandList5 *iface,
ID3D12MetaCommand *meta_command, const void *parameters_data, SIZE_T data_size_in_bytes)
{
- FIXME("iface %p, meta_command %p, parameters_data %p, data_size_in_bytes %lu stub!\n", iface,
- meta_command, parameters_data, data_size_in_bytes);
+ FIXME("iface %p, meta_command %p, parameters_data %p, data_size_in_bytes %"PRIuPTR" stub!\n", iface,
+ meta_command, parameters_data, (uintptr_t)data_size_in_bytes);
}
static void STDMETHODCALLTYPE d3d12_command_list_ExecuteMetaCommand(ID3D12GraphicsCommandList5 *iface,
ID3D12MetaCommand *meta_command, const void *parameters_data, SIZE_T data_size_in_bytes)
{
- FIXME("iface %p, meta_command %p, parameters_data %p, data_size_in_bytes %lu stub!\n", iface,
- meta_command, parameters_data, data_size_in_bytes);
+ FIXME("iface %p, meta_command %p, parameters_data %p, data_size_in_bytes %"PRIuPTR" stub!\n", iface,
+ meta_command, parameters_data, (uintptr_t)data_size_in_bytes);
}
static void STDMETHODCALLTYPE d3d12_command_list_BuildRaytracingAccelerationStructure(ID3D12GraphicsCommandList5 *iface,
diff --git a/libs/vkd3d/libs/vkd3d/device.c b/libs/vkd3d/libs/vkd3d/device.c
index cf8b506fdf5..90272818b3d 100644
--- a/libs/vkd3d/libs/vkd3d/device.c
+++ b/libs/vkd3d/libs/vkd3d/device.c
@@ -3348,6 +3348,91 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CheckFeatureSupport(ID3D12Device7
return S_OK;
}
+ case D3D12_FEATURE_D3D12_OPTIONS6:
+ {
+ D3D12_FEATURE_DATA_D3D12_OPTIONS6 *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ data->AdditionalShadingRatesSupported = FALSE;
+ data->PerPrimitiveShadingRateSupportedWithViewportIndexing = FALSE;
+ data->VariableShadingRateTier = D3D12_VARIABLE_SHADING_RATE_TIER_NOT_SUPPORTED;
+ data->ShadingRateImageTileSize = 0;
+ data->BackgroundProcessingSupported = FALSE;
+
+ TRACE("Additional shading rates support %#x.\n", data->AdditionalShadingRatesSupported);
+ TRACE("Per-primitive shading rates with viewport indexing %#x.\n",
+ data->PerPrimitiveShadingRateSupportedWithViewportIndexing);
+ TRACE("Variable shading rate tier %#x.\n", data->VariableShadingRateTier);
+ TRACE("Shading rate image tile size %#x.\n", data->ShadingRateImageTileSize);
+ TRACE("Background processing support %#x.\n", data->BackgroundProcessingSupported);
+ return S_OK;
+ }
+
+ case D3D12_FEATURE_D3D12_OPTIONS7:
+ {
+ D3D12_FEATURE_DATA_D3D12_OPTIONS7 *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ data->MeshShaderTier = D3D12_MESH_SHADER_TIER_NOT_SUPPORTED;
+ data->SamplerFeedbackTier = D3D12_SAMPLER_FEEDBACK_TIER_NOT_SUPPORTED;
+
+ TRACE("Mesh shading tier %#x.\n", data->MeshShaderTier);
+ TRACE("Sampler feedback tier %#x.\n", data->SamplerFeedbackTier);
+ return S_OK;
+ }
+
+ case D3D12_FEATURE_D3D12_OPTIONS8:
+ {
+ D3D12_FEATURE_DATA_D3D12_OPTIONS8 *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ data->UnalignedBlockTexturesSupported = FALSE;
+
+ TRACE("Unaligned block texture support %#x.\n", data->UnalignedBlockTexturesSupported);
+ return S_OK;
+ }
+
+ case D3D12_FEATURE_D3D12_OPTIONS9:
+ {
+ D3D12_FEATURE_DATA_D3D12_OPTIONS9 *data = feature_data;
+
+ if (feature_data_size != sizeof(*data))
+ {
+ WARN("Invalid size %u.\n", feature_data_size);
+ return E_INVALIDARG;
+ }
+
+ data->MeshShaderPipelineStatsSupported = FALSE;
+ data->MeshShaderSupportsFullRangeRenderTargetArrayIndex = FALSE;
+ data->AtomicInt64OnTypedResourceSupported = FALSE;
+ data->AtomicInt64OnGroupSharedSupported = FALSE;
+ data->DerivativesInMeshAndAmplificationShadersSupported = FALSE;
+ data->WaveMMATier = D3D12_WAVE_MMA_TIER_NOT_SUPPORTED;
+
+ TRACE("Mesh shader pipeline stats support %#x.\n", data->MeshShaderPipelineStatsSupported);
+ TRACE("Mesh shader RT array index full range %#x.\n", data->MeshShaderSupportsFullRangeRenderTargetArrayIndex);
+ TRACE("Atomic int64 on typed resource %#x.\n", data->AtomicInt64OnTypedResourceSupported);
+ TRACE("Atomic int64 on group shared mem %#x.\n", data->AtomicInt64OnGroupSharedSupported);
+ TRACE("Derivatives in mesh and amp shaders %#x.\n", data->DerivativesInMeshAndAmplificationShadersSupported);
+ TRACE("Wave MMA tier %#x.\n", data->WaveMMATier);
+ return S_OK;
+ }
+
default:
FIXME("Unhandled feature %#x.\n", feature);
return E_NOTIMPL;
@@ -3402,8 +3487,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateRootSignature(ID3D12Device7
struct d3d12_root_signature *object;
HRESULT hr;
- TRACE("iface %p, node_mask 0x%08x, bytecode %p, bytecode_length %lu, riid %s, root_signature %p.\n",
- iface, node_mask, bytecode, bytecode_length, debugstr_guid(riid), root_signature);
+ TRACE("iface %p, node_mask 0x%08x, bytecode %p, bytecode_length %"PRIuPTR", riid %s, root_signature %p.\n",
+ iface, node_mask, bytecode, (uintptr_t)bytecode_length, debugstr_guid(riid), root_signature);
debug_ignored_node_mask(node_mask);
@@ -4040,7 +4125,8 @@ static LUID * STDMETHODCALLTYPE d3d12_device_GetAdapterLuid(ID3D12Device7 *iface
static HRESULT STDMETHODCALLTYPE d3d12_device_CreatePipelineLibrary(ID3D12Device7 *iface,
const void *blob, SIZE_T blob_size, REFIID iid, void **lib)
{
- FIXME("iface %p, blob %p, blob_size %lu, iid %s, lib %p stub!\n", iface, blob, blob_size, debugstr_guid(iid), lib);
+ FIXME("iface %p, blob %p, blob_size %"PRIuPTR", iid %s, lib %p stub!\n",
+ iface, blob, (uintptr_t)blob_size, debugstr_guid(iid), lib);
return DXGI_ERROR_UNSUPPORTED;
}
@@ -4237,9 +4323,9 @@ static HRESULT STDMETHODCALLTYPE d3d12_device_CreateMetaCommand(ID3D12Device7 *i
SIZE_T data_size_in_bytes, REFIID iid, void **meta_command)
{
FIXME("iface %p, command_id %s, node_mask %#x, parameters_data %p, "
- "data_size_in_bytes %lu, iid %s, meta_command %p stub!\n", iface,
+ "data_size_in_bytes %"PRIuPTR", iid %s, meta_command %p stub!\n", iface,
debugstr_guid(command_id), node_mask, parameters_data,
- data_size_in_bytes, debugstr_guid(iid), meta_command);
+ (uintptr_t)data_size_in_bytes, debugstr_guid(iid), meta_command);
return E_NOTIMPL;
}
diff --git a/libs/vkd3d/libs/vkd3d/resource.c b/libs/vkd3d/libs/vkd3d/resource.c
index c04f48702a0..8f4d18358d2 100644
--- a/libs/vkd3d/libs/vkd3d/resource.c
+++ b/libs/vkd3d/libs/vkd3d/resource.c
@@ -2314,14 +2314,14 @@ static void *vkd3d_desc_object_cache_get(struct vkd3d_desc_object_cache *cache)
STATIC_ASSERT(!(ARRAY_SIZE(cache->heads) & HEAD_INDEX_MASK));
- i = (vkd3d_atomic_increment(&cache->next_index)) & HEAD_INDEX_MASK;
+ i = vkd3d_atomic_increment_u32(&cache->next_index) & HEAD_INDEX_MASK;
for (;;)
{
if (vkd3d_atomic_compare_exchange(&cache->heads[i].spinlock, 0, 1))
{
if ((u.object = cache->heads[i].head))
{
- vkd3d_atomic_decrement(&cache->free_count);
+ vkd3d_atomic_decrement_u32(&cache->free_count);
cache->heads[i].head = u.header->next;
vkd3d_atomic_exchange(&cache->heads[i].spinlock, 0);
return u.object;
@@ -2345,7 +2345,7 @@ static void vkd3d_desc_object_cache_push(struct vkd3d_desc_object_cache *cache,
/* Using the same index as above may result in a somewhat uneven distribution,
* but the main objective is to avoid costly spinlock contention. */
- i = (vkd3d_atomic_increment(&cache->next_index)) & HEAD_INDEX_MASK;
+ i = vkd3d_atomic_increment_u32(&cache->next_index) & HEAD_INDEX_MASK;
for (;;)
{
if (vkd3d_atomic_compare_exchange(&cache->heads[i].spinlock, 0, 1))
@@ -2357,7 +2357,7 @@ static void vkd3d_desc_object_cache_push(struct vkd3d_desc_object_cache *cache,
u.header->next = head;
cache->heads[i].head = u.object;
vkd3d_atomic_exchange(&cache->heads[i].spinlock, 0);
- vkd3d_atomic_increment(&cache->free_count);
+ vkd3d_atomic_increment_u32(&cache->free_count);
}
#undef HEAD_INDEX_MASK
@@ -2429,7 +2429,7 @@ void vkd3d_view_decref(void *view, struct d3d12_device *device)
{
union d3d12_desc_object u = {view};
- if (vkd3d_atomic_decrement(&u.header->refcount))
+ if (vkd3d_atomic_decrement_u32(&u.header->refcount))
return;
if (u.header->magic != VKD3D_DESCRIPTOR_MAGIC_CBV)
diff --git a/libs/vkd3d/libs/vkd3d/utils.c b/libs/vkd3d/libs/vkd3d/utils.c
index 28913a83e8c..ac79ae5ddff 100644
--- a/libs/vkd3d/libs/vkd3d/utils.c
+++ b/libs/vkd3d/libs/vkd3d/utils.c
@@ -678,6 +678,11 @@ const char *debug_d3d12_shader_component_mapping(unsigned int mapping)
debug_d3d12_shader_component(D3D12_DECODE_SHADER_4_COMPONENT_MAPPING(3, mapping)));
}
+const char *debug_gpu_handle(D3D12_GPU_DESCRIPTOR_HANDLE handle)
+{
+ return vkd3d_dbg_sprintf("{%#"PRIx64"}", handle.ptr);
+}
+
const char *debug_vk_extent_3d(VkExtent3D extent)
{
return vkd3d_dbg_sprintf("(%u, %u, %u)",
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
index f71b370137f..7919b7d8760 100644
--- a/libs/vkd3d/libs/vkd3d/vkd3d_main.c
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
@@ -222,8 +222,8 @@ HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_s
struct d3d12_root_signature_deserializer *object;
HRESULT hr;
- TRACE("data %p, data_size %lu, iid %s, deserializer %p.\n",
- data, data_size, debugstr_guid(iid), deserializer);
+ TRACE("data %p, data_size %"PRIuPTR", iid %s, deserializer %p.\n",
+ data, (uintptr_t)data_size, debugstr_guid(iid), deserializer);
if (!(object = vkd3d_malloc(sizeof(*object))))
return E_OUTOFMEMORY;
@@ -406,8 +406,8 @@ HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZ
struct vkd3d_shader_code dxbc = {data, data_size};
HRESULT hr;
- TRACE("data %p, data_size %lu, iid %s, deserializer %p.\n",
- data, data_size, debugstr_guid(iid), deserializer);
+ TRACE("data %p, data_size %"PRIuPTR", iid %s, deserializer %p.\n",
+ data, (uintptr_t)data_size, debugstr_guid(iid), deserializer);
if (!(object = vkd3d_malloc(sizeof(*object))))
return E_OUTOFMEMORY;
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
index 8ecf6764ab6..78f4f3514e2 100644
--- a/libs/vkd3d/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_private.h
@@ -257,16 +257,6 @@ static inline void vkd3d_cond_destroy(struct vkd3d_cond *cond)
{
}
-static inline unsigned int vkd3d_atomic_increment(unsigned int volatile *x)
-{
- return InterlockedIncrement((LONG volatile *)x);
-}
-
-static inline unsigned int vkd3d_atomic_decrement(unsigned int volatile *x)
-{
- return InterlockedDecrement((LONG volatile *)x);
-}
-
static inline bool vkd3d_atomic_compare_exchange(unsigned int volatile *x, unsigned int cmp, unsigned int xchg)
{
return InterlockedCompareExchange((LONG volatile *)x, xchg, cmp) == cmp;
@@ -389,24 +379,6 @@ static inline void vkd3d_cond_destroy(struct vkd3d_cond *cond)
ERR("Could not destroy the condition variable, error %d.\n", ret);
}
-# if HAVE_SYNC_SUB_AND_FETCH
-static inline unsigned int vkd3d_atomic_decrement(unsigned int volatile *x)
-{
- return __sync_sub_and_fetch(x, 1);
-}
-# else
-# error "vkd3d_atomic_decrement() not implemented for this platform"
-# endif /* HAVE_SYNC_SUB_AND_FETCH */
-
-# if HAVE_SYNC_ADD_AND_FETCH
-static inline unsigned int vkd3d_atomic_increment(unsigned int volatile *x)
-{
- return __sync_add_and_fetch(x, 1);
-}
-# else
-# error "vkd3d_atomic_increment() not implemented for this platform"
-# endif /* HAVE_SYNC_ADD_AND_FETCH */
-
# if HAVE_SYNC_BOOL_COMPARE_AND_SWAP
static inline bool vkd3d_atomic_compare_exchange(unsigned int volatile *x, unsigned int cmp, unsigned int xchg)
{
@@ -1963,6 +1935,7 @@ HRESULT return_interface(void *iface, REFIID iface_iid, REFIID requested_iid, vo
const char *debug_cpu_handle(D3D12_CPU_DESCRIPTOR_HANDLE handle);
const char *debug_d3d12_box(const D3D12_BOX *box);
const char *debug_d3d12_shader_component_mapping(unsigned int mapping);
+const char *debug_gpu_handle(D3D12_GPU_DESCRIPTOR_HANDLE handle);
const char *debug_vk_extent_3d(VkExtent3D extent);
const char *debug_vk_memory_heap_flags(VkMemoryHeapFlags flags);
const char *debug_vk_memory_property_flags(VkMemoryPropertyFlags flags);
--
2.43.0