From c47787abcf2dc7c91ca0789a9024280ed88e9f39 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Fri, 14 Nov 2025 08:07:32 +1100 Subject: [PATCH] Updated vkd3d to 7f377879fc526dfb69966ed1672d3036e807235c. --- libs/vkd3d/include/private/vkd3d_common.h | 20 +++++++----- libs/vkd3d/libs/vkd3d-common/debug.c | 9 +++--- libs/vkd3d/libs/vkd3d-shader/d3d_asm.c | 31 ++++++++++++++++++- libs/vkd3d/libs/vkd3d-shader/dxil.c | 13 +++++--- libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c | 8 +++-- libs/vkd3d/libs/vkd3d-shader/spirv.c | 13 +++++--- .../libs/vkd3d-shader/vkd3d_shader_main.c | 4 +-- .../libs/vkd3d-shader/vkd3d_shader_private.h | 1 + .../vkd3d/libs/vkd3d-utils/vkd3d_utils_main.c | 2 -- libs/vkd3d/libs/vkd3d/vkd3d_main.c | 2 -- 10 files changed, 71 insertions(+), 32 deletions(-) diff --git a/libs/vkd3d/include/private/vkd3d_common.h b/libs/vkd3d/include/private/vkd3d_common.h index c2e957a2fea..56f8ad4ee25 100644 --- a/libs/vkd3d/include/private/vkd3d_common.h +++ b/libs/vkd3d/include/private/vkd3d_common.h @@ -19,6 +19,11 @@ #ifndef __VKD3D_COMMON_H #define __VKD3D_COMMON_H +#ifndef VKD3D_DEBUG_ENV +#define VKD3D_DEBUG_ENV VKD3D_DEBUG +#endif +#define VKD3D_DEBUG_ENV_NAME VKD3D_EXPAND_AND_STRINGIFY(VKD3D_DEBUG_ENV) + #include "config.h" #define WIN32_LEAN_AND_MEAN #include "windows.h" @@ -149,9 +154,10 @@ enum vkd3d_dbg_level VKD3D_DBG_LEVEL_TRACE, }; -enum vkd3d_dbg_level vkd3d_dbg_get_level(void); +enum vkd3d_dbg_level vkd3d_dbg_get_level(const char *vkd3d_dbg_env_name); -void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(3, 4); +void vkd3d_dbg_printf(const char *vkd3d_dbg_env_name, enum vkd3d_dbg_level level, + const char *function, const char *fmt, ...) VKD3D_PRINTF_FUNC(4, 5); void vkd3d_dbg_set_log_callback(PFN_vkd3d_log callback); const char *vkd3d_dbg_sprintf(const char *fmt, ...) VKD3D_PRINTF_FUNC(1, 2); @@ -174,7 +180,7 @@ const char *debugstr_w(const WCHAR *wstr, size_t wchar_size); VKD3D_DBG_PRINTF_##level #define VKD3D_DBG_PRINTF(...) \ - vkd3d_dbg_printf(vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); } while (0) + vkd3d_dbg_printf(VKD3D_DEBUG_ENV_NAME, vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); } while (0) #define VKD3D_DBG_PRINTF_TRACE(...) VKD3D_DBG_PRINTF(__VA_ARGS__) #define VKD3D_DBG_PRINTF_WARN(...) VKD3D_DBG_PRINTF(__VA_ARGS__) @@ -183,7 +189,7 @@ const char *debugstr_w(const WCHAR *wstr, size_t wchar_size); #ifdef VKD3D_ABORT_ON_ERR #define VKD3D_DBG_PRINTF_ERR(...) \ - vkd3d_dbg_printf(vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); \ + vkd3d_dbg_printf(VKD3D_DEBUG_ENV_NAME, vkd3d_dbg_level, __FUNCTION__, __VA_ARGS__); \ abort(); \ } while (0) #else @@ -217,19 +223,17 @@ const char *debugstr_w(const WCHAR *wstr, size_t wchar_size); #endif #ifndef TRACE_ON -#define TRACE_ON() (vkd3d_dbg_get_level() == VKD3D_DBG_LEVEL_TRACE) +#define TRACE_ON() (vkd3d_dbg_get_level(VKD3D_DEBUG_ENV_NAME) == VKD3D_DBG_LEVEL_TRACE) #endif #ifndef WARN_ON -#define WARN_ON() (vkd3d_dbg_get_level() >= VKD3D_DBG_LEVEL_WARN) +#define WARN_ON() (vkd3d_dbg_get_level(VKD3D_DEBUG_ENV_NAME) >= VKD3D_DBG_LEVEL_WARN) #endif #ifndef FIXME_ONCE #define FIXME_ONCE VKD3D_DBG_LOG_ONCE(FIXME, WARN) #endif -#define VKD3D_DEBUG_ENV_NAME(name) const char *const vkd3d_dbg_env_name = name - static inline const char *debugstr_guid(const GUID *guid) { if (!guid) diff --git a/libs/vkd3d/libs/vkd3d-common/debug.c b/libs/vkd3d/libs/vkd3d-common/debug.c index 32862024b90..b5d74ca3dc7 100644 --- a/libs/vkd3d/libs/vkd3d-common/debug.c +++ b/libs/vkd3d/libs/vkd3d-common/debug.c @@ -40,8 +40,6 @@ #define VKD3D_DEBUG_BUFFER_COUNT 64 #define VKD3D_DEBUG_BUFFER_SIZE 512 -extern const char *const vkd3d_dbg_env_name; - static const char *const debug_level_names[] = { [VKD3D_DBG_LEVEL_NONE ] = "none", @@ -52,7 +50,7 @@ static const char *const debug_level_names[] = [VKD3D_DBG_LEVEL_TRACE] = "trace", }; -enum vkd3d_dbg_level vkd3d_dbg_get_level(void) +enum vkd3d_dbg_level vkd3d_dbg_get_level(const char *vkd3d_dbg_env_name) { static unsigned int level = ~0u; const char *vkd3d_debug; @@ -108,11 +106,12 @@ static uint64_t get_pthread_threadid(void) } #endif -void vkd3d_dbg_printf(enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) +void vkd3d_dbg_printf(const char *vkd3d_dbg_env_name, + enum vkd3d_dbg_level level, const char *function, const char *fmt, ...) { va_list args; - if (vkd3d_dbg_get_level() < level) + if (vkd3d_dbg_get_level(vkd3d_dbg_env_name) < level) return; #ifdef _WIN32 diff --git a/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c b/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c index 4573cb67fb5..b316f6c8830 100644 --- a/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c +++ b/libs/vkd3d/libs/vkd3d-shader/d3d_asm.c @@ -398,12 +398,41 @@ static void shader_dump_resource_data_type(struct vkd3d_d3d_asm_compiler *compil { int i; + /* We want the D3D names here, not the vsir ones. */ + static const char * const names[] = + { + [VSIR_DATA_BOOL ] = "bool", + [VSIR_DATA_F16 ] = "half", + [VSIR_DATA_F32 ] = "float", + [VSIR_DATA_F64 ] = "double", + [VSIR_DATA_I8 ] = "int8", + [VSIR_DATA_I16 ] = "int16", + [VSIR_DATA_I32 ] = "int", + [VSIR_DATA_I64 ] = "int64", + [VSIR_DATA_U8 ] = "uint8", + [VSIR_DATA_U16 ] = "uint16", + [VSIR_DATA_U32 ] = "uint", + [VSIR_DATA_U64 ] = "uint64", + [VSIR_DATA_SNORM ] = "snorm", + [VSIR_DATA_UNORM ] = "unorm", + [VSIR_DATA_OPAQUE ] = "opaque", + [VSIR_DATA_MIXED ] = "mixed", + [VSIR_DATA_CONTINUED] = "", + [VSIR_DATA_UNUSED ] = "", + }; + vkd3d_string_buffer_printf(&compiler->buffer, "("); for (i = 0; i < 4; i++) { + size_t t = type[i]; + vkd3d_string_buffer_printf(&compiler->buffer, "%s", i == 0 ? "" : ","); - shader_print_data_type(compiler, type[i]); + if (t < ARRAY_SIZE(names) && names[t]) + vkd3d_string_buffer_printf(&compiler->buffer, "%s", names[t]); + else + vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", + compiler->colours.error, t, compiler->colours.reset); } vkd3d_string_buffer_printf(&compiler->buffer, ")"); diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c index 8d803b91f7a..9f25ae8334b 100644 --- a/libs/vkd3d/libs/vkd3d-shader/dxil.c +++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c @@ -6142,11 +6142,14 @@ static unsigned int sm6_value_get_texel_offset(const struct sm6_value *value, st } static void instruction_set_texel_offset(struct vkd3d_shader_instruction *ins, - const struct sm6_value **operands, struct sm6_parser *sm6) + const struct sm6_value **operands, unsigned int count, struct sm6_parser *sm6) { ins->texel_offset.u = sm6_value_get_texel_offset(operands[0], sm6); ins->texel_offset.v = sm6_value_get_texel_offset(operands[1], sm6); - ins->texel_offset.w = sm6_value_get_texel_offset(operands[2], sm6); + if (count == 3) + ins->texel_offset.w = sm6_value_get_texel_offset(operands[2], sm6); + else + ins->texel_offset.w = 0; } static void sm6_parser_emit_dx_sample(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, @@ -6228,7 +6231,7 @@ static void sm6_parser_emit_dx_sample(struct sm6_parser *sm6, enum dx_intrinsic_ src_param_init_vector_from_reg(&src_params[0], &coord); src_param_init_vector_from_handle(sm6, &src_params[1], &resource->u.handle); src_param_init_vector_from_handle(sm6, &src_params[2], &sampler->u.handle); - instruction_set_texel_offset(ins, &operands[6], sm6); + instruction_set_texel_offset(ins, &operands[6], 3, sm6); instruction_dst_param_init_ssa_vector(ins, component_count, sm6); } @@ -6402,7 +6405,7 @@ static void sm6_parser_emit_dx_texture_gather(struct sm6_parser *sm6, enum dx_in if (extended_offset) src_param_init_vector_from_reg(&src_params[1], &offset); else - instruction_set_texel_offset(ins, &operands[6], sm6); + instruction_set_texel_offset(ins, &operands[6], 2, sm6); src_param_init_vector_from_handle(sm6, &src_params[1 + extended_offset], &resource->u.handle); src_param_init_vector_from_handle(sm6, &src_params[2 + extended_offset], &sampler->u.handle); /* Swizzle stored in the sampler parameter is the scalar component index to be gathered. */ @@ -6448,7 +6451,7 @@ static void sm6_parser_emit_dx_texture_load(struct sm6_parser *sm6, enum dx_intr ins = state->ins; instruction_init_with_resource(ins, is_uav ? VSIR_OP_LD_UAV_TYPED : is_multisample ? VSIR_OP_LD2DMS : VSIR_OP_LD, resource, sm6); - instruction_set_texel_offset(ins, &operands[5], sm6); + instruction_set_texel_offset(ins, &operands[5], 3, sm6); for (i = 0; i < VKD3D_VEC4_SIZE; ++i) ins->resource_data_type[i] = resource->u.handle.d->resource_data_type; diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c index 8bb23e0690d..f1368b151aa 100644 --- a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c +++ b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c @@ -5490,10 +5490,14 @@ static struct hlsl_ir_node *lower_casts_to_bool(struct hlsl_ctx *ctx, struct hlsl_ir_node *hlsl_add_conditional(struct hlsl_ctx *ctx, struct hlsl_block *instrs, struct hlsl_ir_node *condition, struct hlsl_ir_node *if_true, struct hlsl_ir_node *if_false) { + struct hlsl_type *false_type = if_false->data_type; struct hlsl_type *cond_type = condition->data_type; struct hlsl_ir_node *operands[HLSL_MAX_OPERANDS]; + struct hlsl_type *true_type = if_true->data_type; - VKD3D_ASSERT(hlsl_types_are_equal(if_true->data_type, if_false->data_type)); + VKD3D_ASSERT(hlsl_types_are_equal(true_type, false_type) + || (hlsl_is_vec1(true_type) && hlsl_is_vec1(false_type) + && true_type->e.numeric.type == false_type->e.numeric.type)); if (cond_type->e.numeric.type != HLSL_TYPE_BOOL) { @@ -5505,7 +5509,7 @@ struct hlsl_ir_node *hlsl_add_conditional(struct hlsl_ctx *ctx, struct hlsl_bloc operands[0] = condition; operands[1] = if_true; operands[2] = if_false; - return hlsl_block_add_expr(ctx, instrs, HLSL_OP3_TERNARY, operands, if_true->data_type, &condition->loc); + return hlsl_block_add_expr(ctx, instrs, HLSL_OP3_TERNARY, operands, true_type, &condition->loc); } static struct hlsl_ir_node *lower_int_division_sm4(struct hlsl_ctx *ctx, diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c index 3950021a2ef..87ec827b420 100644 --- a/libs/vkd3d/libs/vkd3d-shader/spirv.c +++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c @@ -6668,13 +6668,18 @@ static void spirv_compiler_emit_cbv_declaration(struct spirv_compiler *compiler, /* Push constant buffers are handled in * spirv_compiler_emit_push_constant_buffers(). */ - push_cb->reg = reg; - push_cb->size = size; if (size_in_bytes > push_cb->pc.size) { - WARN("Constant buffer size %u exceeds push constant size %u.\n", - size_in_bytes, push_cb->pc.size); + spirv_compiler_warning(compiler, VKD3D_SHADER_WARNING_SPV_INVALID_SIZE, + "Constant buffer cb%u, space %u, has size %u which exceeds the push constant size %u.", + push_cb->pc.register_index, push_cb->pc.register_space, size_in_bytes, push_cb->pc.size); + size_in_bytes = push_cb->pc.size; + size = align(size_in_bytes, VKD3D_VEC4_SIZE * sizeof(uint32_t)); + size /= VKD3D_VEC4_SIZE * sizeof(uint32_t); } + + push_cb->reg = reg; + push_cb->size = size; return; } diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c index c0faa30f14a..ee113f57736 100644 --- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c +++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c @@ -23,8 +23,6 @@ #include #include -/* VKD3D_DEBUG_ENV_NAME("VKD3D_SHADER_DEBUG"); */ - static inline int char_to_int(char c) { if ('0' <= c && c <= '9') @@ -268,7 +266,7 @@ void vkd3d_shader_trace_text_(const char *text, size_t size, const char *functio q = end; else ++q; - vkd3d_dbg_printf(VKD3D_DBG_LEVEL_TRACE, function, "%.*s", (int)(q - p), p); + vkd3d_dbg_printf(VKD3D_DEBUG_ENV_NAME, VKD3D_DBG_LEVEL_TRACE, function, "%.*s", (int)(q - p), p); } } diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h index 763a4906919..97fe5238046 100644 --- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h @@ -110,6 +110,7 @@ enum vkd3d_shader_error VKD3D_SHADER_WARNING_SPV_INVALID_SWIZZLE = 2300, VKD3D_SHADER_WARNING_SPV_INVALID_UAV_FLAGS = 2301, VKD3D_SHADER_WARNING_SPV_IGNORING_FLAG = 2302, + VKD3D_SHADER_WARNING_SPV_INVALID_SIZE = 2303, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY = 3000, VKD3D_SHADER_ERROR_RS_INVALID_VERSION = 3001, diff --git a/libs/vkd3d/libs/vkd3d-utils/vkd3d_utils_main.c b/libs/vkd3d/libs/vkd3d-utils/vkd3d_utils_main.c index fea8c2440d1..6e90b48e877 100644 --- a/libs/vkd3d/libs/vkd3d-utils/vkd3d_utils_main.c +++ b/libs/vkd3d/libs/vkd3d-utils/vkd3d_utils_main.c @@ -19,8 +19,6 @@ #include "vkd3d_utils_private.h" #undef D3D12CreateDevice -/* VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG"); */ - static const char *debug_d3d_blob_part(D3D_BLOB_PART part) { switch (part) diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/libs/vkd3d/vkd3d_main.c index 5215cf8ef86..4c58f0a1787 100644 --- a/libs/vkd3d/libs/vkd3d/vkd3d_main.c +++ b/libs/vkd3d/libs/vkd3d/vkd3d_main.c @@ -18,8 +18,6 @@ #include "vkd3d_private.h" -VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG"); - HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info, REFIID iid, void **device) { -- 2.51.0