mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
637 lines
30 KiB
Diff
637 lines
30 KiB
Diff
From ce0a7dcf546461d3aa2bad522274f09def0e8daa Mon Sep 17 00:00:00 2001
|
|
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
|
|
Date: Wed, 10 Jan 2024 07:40:09 +1100
|
|
Subject: [PATCH] Updated vkd3d to bb64bfff6334c847d06d219840882ec75766b330.
|
|
|
|
---
|
|
libs/vkd3d/libs/vkd3d-shader/hlsl.c | 22 +++---
|
|
libs/vkd3d/libs/vkd3d-shader/hlsl.h | 22 +++---
|
|
libs/vkd3d/libs/vkd3d-shader/hlsl.y | 31 ++++-----
|
|
libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c | 22 +++---
|
|
libs/vkd3d/libs/vkd3d-shader/spirv.c | 15 ++++-
|
|
libs/vkd3d/libs/vkd3d/command.c | 3 +-
|
|
libs/vkd3d/libs/vkd3d/resource.c | 74 ++++++++++++++++-----
|
|
7 files changed, 125 insertions(+), 64 deletions(-)
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl.c b/libs/vkd3d/libs/vkd3d-shader/hlsl.c
|
|
index da3bbda1bc3..a41967876a2 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl.c
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl.c
|
|
@@ -920,7 +920,7 @@ bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2
|
|
}
|
|
|
|
struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
|
- unsigned int default_majority, unsigned int modifiers)
|
|
+ unsigned int default_majority, uint32_t modifiers)
|
|
{
|
|
struct hlsl_type *type;
|
|
|
|
@@ -1030,7 +1030,7 @@ struct hlsl_ir_node *hlsl_new_copy(struct hlsl_ctx *ctx, struct hlsl_ir_node *no
|
|
}
|
|
|
|
struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type,
|
|
- const struct vkd3d_shader_location *loc, const struct hlsl_semantic *semantic, unsigned int modifiers,
|
|
+ const struct vkd3d_shader_location *loc, const struct hlsl_semantic *semantic, uint32_t modifiers,
|
|
const struct hlsl_reg_reservation *reg_reservation)
|
|
{
|
|
struct hlsl_ir_var *var;
|
|
@@ -1505,7 +1505,7 @@ struct hlsl_ir_node *hlsl_new_resource_store(struct hlsl_ctx *ctx, const struct
|
|
return &store->node;
|
|
}
|
|
|
|
-struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components,
|
|
+struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, uint32_t s, unsigned int components,
|
|
struct hlsl_ir_node *val, const struct vkd3d_shader_location *loc)
|
|
{
|
|
struct hlsl_ir_swizzle *swizzle;
|
|
@@ -2246,7 +2246,7 @@ const char *debug_hlsl_type(struct hlsl_ctx *ctx, const struct hlsl_type *type)
|
|
return ret;
|
|
}
|
|
|
|
-struct vkd3d_string_buffer *hlsl_modifiers_to_string(struct hlsl_ctx *ctx, unsigned int modifiers)
|
|
+struct vkd3d_string_buffer *hlsl_modifiers_to_string(struct hlsl_ctx *ctx, uint32_t modifiers)
|
|
{
|
|
struct vkd3d_string_buffer *string;
|
|
|
|
@@ -2432,7 +2432,7 @@ const char *debug_hlsl_writemask(unsigned int writemask)
|
|
return vkd3d_dbg_sprintf(".%s", string);
|
|
}
|
|
|
|
-const char *debug_hlsl_swizzle(unsigned int swizzle, unsigned int size)
|
|
+const char *debug_hlsl_swizzle(uint32_t swizzle, unsigned int size)
|
|
{
|
|
static const char components[] = {'x', 'y', 'z', 'w'};
|
|
char string[5];
|
|
@@ -3147,9 +3147,10 @@ void hlsl_add_function(struct hlsl_ctx *ctx, char *name, struct hlsl_ir_function
|
|
rb_put(&ctx->functions, func->name, &func->entry);
|
|
}
|
|
|
|
-unsigned int hlsl_map_swizzle(unsigned int swizzle, unsigned int writemask)
|
|
+uint32_t hlsl_map_swizzle(uint32_t swizzle, unsigned int writemask)
|
|
{
|
|
- unsigned int i, ret = 0;
|
|
+ uint32_t ret = 0;
|
|
+ unsigned int i;
|
|
|
|
/* Leave replicate swizzles alone; some instructions need them. */
|
|
if (swizzle == HLSL_SWIZZLE(X, X, X, X)
|
|
@@ -3169,7 +3170,7 @@ unsigned int hlsl_map_swizzle(unsigned int swizzle, unsigned int writemask)
|
|
return ret;
|
|
}
|
|
|
|
-unsigned int hlsl_swizzle_from_writemask(unsigned int writemask)
|
|
+uint32_t hlsl_swizzle_from_writemask(unsigned int writemask)
|
|
{
|
|
static const unsigned int swizzles[16] =
|
|
{
|
|
@@ -3210,9 +3211,10 @@ unsigned int hlsl_combine_writemasks(unsigned int first, unsigned int second)
|
|
return ret;
|
|
}
|
|
|
|
-unsigned int hlsl_combine_swizzles(unsigned int first, unsigned int second, unsigned int dim)
|
|
+uint32_t hlsl_combine_swizzles(uint32_t first, uint32_t second, unsigned int dim)
|
|
{
|
|
- unsigned int ret = 0, i;
|
|
+ uint32_t ret = 0;
|
|
+ unsigned int i;
|
|
for (i = 0; i < dim; ++i)
|
|
{
|
|
unsigned int s = hlsl_swizzle_get_component(second, i);
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl.h b/libs/vkd3d/libs/vkd3d-shader/hlsl.h
|
|
index ca75a1936f1..b56dea10f4c 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl.h
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl.h
|
|
@@ -65,7 +65,7 @@
|
|
#define HLSL_SWIZZLE_MASK (0x3u)
|
|
#define HLSL_SWIZZLE_SHIFT(idx) (2u * (idx))
|
|
|
|
-static inline unsigned int hlsl_swizzle_get_component(unsigned int swizzle, unsigned int idx)
|
|
+static inline unsigned int hlsl_swizzle_get_component(uint32_t swizzle, unsigned int idx)
|
|
{
|
|
return (swizzle >> HLSL_SWIZZLE_SHIFT(idx)) & HLSL_SWIZZLE_MASK;
|
|
}
|
|
@@ -155,7 +155,7 @@ struct hlsl_type
|
|
/* Bitfield for storing type modifiers, subset of HLSL_TYPE_MODIFIERS_MASK.
|
|
* Modifiers that don't fall inside this mask are to be stored in the variable in
|
|
* hlsl_ir_var.modifiers, or in the struct field in hlsl_ir_field.modifiers. */
|
|
- unsigned int modifiers;
|
|
+ uint32_t modifiers;
|
|
/* Size of the type values on each dimension. For non-numeric types, they are set for the
|
|
* convenience of the sm1/sm4 backends.
|
|
* If type is HLSL_CLASS_SCALAR, then both dimx = 1 and dimy = 1.
|
|
@@ -234,7 +234,7 @@ struct hlsl_struct_field
|
|
/* Bitfield for storing modifiers that are not in HLSL_TYPE_MODIFIERS_MASK (these are stored in
|
|
* type->modifiers instead) and that also are specific to the field and not the whole variable.
|
|
* In particular, interpolation modifiers. */
|
|
- unsigned int storage_modifiers;
|
|
+ uint32_t storage_modifiers;
|
|
/* Offset of the field within the type it belongs to, in register components, for each regset. */
|
|
unsigned int reg_offset[HLSL_REGSET_LAST + 1];
|
|
|
|
@@ -392,7 +392,7 @@ struct hlsl_ir_var
|
|
/* Buffer where the variable's value is stored, in case it is uniform. */
|
|
struct hlsl_buffer *buffer;
|
|
/* Bitfield for storage modifiers (type modifiers are stored in data_type->modifiers). */
|
|
- unsigned int storage_modifiers;
|
|
+ uint32_t storage_modifiers;
|
|
/* Optional reservations of registers and/or offsets for variables within constant buffers. */
|
|
struct hlsl_reg_reservation reg_reservation;
|
|
|
|
@@ -622,7 +622,7 @@ struct hlsl_ir_swizzle
|
|
{
|
|
struct hlsl_ir_node node;
|
|
struct hlsl_src val;
|
|
- DWORD swizzle;
|
|
+ uint32_t swizzle;
|
|
};
|
|
|
|
struct hlsl_ir_index
|
|
@@ -1250,7 +1250,7 @@ struct hlsl_ir_node *hlsl_new_resource_store(struct hlsl_ctx *ctx, const struct
|
|
struct hlsl_ir_node *coords, struct hlsl_ir_node *value, const struct vkd3d_shader_location *loc);
|
|
struct hlsl_type *hlsl_new_struct_type(struct hlsl_ctx *ctx, const char *name,
|
|
struct hlsl_struct_field *fields, size_t field_count);
|
|
-struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, DWORD s, unsigned int components,
|
|
+struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, uint32_t s, unsigned int components,
|
|
struct hlsl_ir_node *val, const struct vkd3d_shader_location *loc);
|
|
struct hlsl_ir_var *hlsl_new_synthetic_var(struct hlsl_ctx *ctx, const char *template,
|
|
struct hlsl_type *type, const struct vkd3d_shader_location *loc);
|
|
@@ -1264,7 +1264,7 @@ struct hlsl_ir_node *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n
|
|
struct hlsl_ir_node *hlsl_new_unary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg,
|
|
const struct vkd3d_shader_location *loc);
|
|
struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type,
|
|
- const struct vkd3d_shader_location *loc, const struct hlsl_semantic *semantic, unsigned int modifiers,
|
|
+ const struct vkd3d_shader_location *loc, const struct hlsl_semantic *semantic, uint32_t modifiers,
|
|
const struct hlsl_reg_reservation *reg_reservation);
|
|
struct hlsl_ir_switch_case *hlsl_new_switch_case(struct hlsl_ctx *ctx, unsigned int value, bool is_default,
|
|
struct hlsl_block *body, const struct vkd3d_shader_location *loc);
|
|
@@ -1286,7 +1286,7 @@ void hlsl_pop_scope(struct hlsl_ctx *ctx);
|
|
bool hlsl_scope_add_type(struct hlsl_scope *scope, struct hlsl_type *type);
|
|
|
|
struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
|
- unsigned int default_majority, unsigned int modifiers);
|
|
+ unsigned int default_majority, uint32_t modifiers);
|
|
unsigned int hlsl_type_component_count(const struct hlsl_type *type);
|
|
unsigned int hlsl_type_get_array_element_reg_size(const struct hlsl_type *type, enum hlsl_regset regset);
|
|
struct hlsl_type *hlsl_type_get_component_type(struct hlsl_ctx *ctx, struct hlsl_type *type,
|
|
@@ -1304,10 +1304,10 @@ bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2
|
|
const struct hlsl_type *hlsl_get_multiarray_element_type(const struct hlsl_type *type);
|
|
unsigned int hlsl_get_multiarray_size(const struct hlsl_type *type);
|
|
|
|
-unsigned int hlsl_combine_swizzles(unsigned int first, unsigned int second, unsigned int dim);
|
|
+uint32_t hlsl_combine_swizzles(uint32_t first, uint32_t second, unsigned int dim);
|
|
unsigned int hlsl_combine_writemasks(unsigned int first, unsigned int second);
|
|
-unsigned int hlsl_map_swizzle(unsigned int swizzle, unsigned int writemask);
|
|
-unsigned int hlsl_swizzle_from_writemask(unsigned int writemask);
|
|
+uint32_t hlsl_map_swizzle(uint32_t swizzle, unsigned int writemask);
|
|
+uint32_t hlsl_swizzle_from_writemask(unsigned int writemask);
|
|
|
|
struct hlsl_type *hlsl_deref_get_type(struct hlsl_ctx *ctx, const struct hlsl_deref *deref);
|
|
enum hlsl_regset hlsl_deref_get_regset(struct hlsl_ctx *ctx, const struct hlsl_deref *deref);
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl.y b/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
|
index ed053f16312..26f9357419b 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl.y
|
|
@@ -40,7 +40,7 @@ struct parse_parameter
|
|
const char *name;
|
|
struct hlsl_semantic semantic;
|
|
struct hlsl_reg_reservation reg_reservation;
|
|
- unsigned int modifiers;
|
|
+ uint32_t modifiers;
|
|
};
|
|
|
|
struct parse_colon_attribute
|
|
@@ -75,7 +75,7 @@ struct parse_variable_def
|
|
struct parse_initializer initializer;
|
|
|
|
struct hlsl_type *basic_type;
|
|
- unsigned int modifiers;
|
|
+ uint32_t modifiers;
|
|
struct vkd3d_shader_location modifiers_loc;
|
|
};
|
|
|
|
@@ -405,7 +405,7 @@ static struct hlsl_ir_node *add_implicit_conversion(struct hlsl_ctx *ctx, struct
|
|
return add_cast(ctx, block, node, dst_type, loc);
|
|
}
|
|
|
|
-static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod,
|
|
+static uint32_t add_modifiers(struct hlsl_ctx *ctx, uint32_t modifiers, uint32_t mod,
|
|
const struct vkd3d_shader_location *loc)
|
|
{
|
|
if (modifiers & mod)
|
|
@@ -868,7 +868,7 @@ static const struct hlsl_struct_field *get_struct_field(const struct hlsl_struct
|
|
}
|
|
|
|
static struct hlsl_type *apply_type_modifiers(struct hlsl_ctx *ctx, struct hlsl_type *type,
|
|
- unsigned int *modifiers, bool force_majority, const struct vkd3d_shader_location *loc)
|
|
+ uint32_t *modifiers, bool force_majority, const struct vkd3d_shader_location *loc)
|
|
{
|
|
unsigned int default_majority = 0;
|
|
struct hlsl_type *new_type;
|
|
@@ -926,7 +926,7 @@ static bool shader_profile_version_lt(const struct hlsl_ctx *ctx, unsigned int m
|
|
}
|
|
|
|
static bool gen_struct_fields(struct hlsl_ctx *ctx, struct parse_fields *fields,
|
|
- struct hlsl_type *type, unsigned int modifiers, struct list *defs)
|
|
+ struct hlsl_type *type, uint32_t modifiers, struct list *defs)
|
|
{
|
|
struct parse_variable_def *v, *v_next;
|
|
size_t i = 0;
|
|
@@ -1019,7 +1019,7 @@ static bool add_typedef(struct hlsl_ctx *ctx, struct hlsl_type *const orig_type,
|
|
}
|
|
else
|
|
{
|
|
- unsigned int var_modifiers = 0;
|
|
+ uint32_t var_modifiers = 0;
|
|
|
|
if (!(type = apply_type_modifiers(ctx, orig_type, &var_modifiers, true, &v->loc)))
|
|
{
|
|
@@ -1717,7 +1717,7 @@ static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op)
|
|
return ops[op];
|
|
}
|
|
|
|
-static bool invert_swizzle(unsigned int *swizzle, unsigned int *writemask, unsigned int *ret_width)
|
|
+static bool invert_swizzle(uint32_t *swizzle, unsigned int *writemask, unsigned int *ret_width)
|
|
{
|
|
unsigned int i, j, bit = 0, inverted = 0, width, new_writemask = 0, new_swizzle = 0;
|
|
|
|
@@ -1791,8 +1791,9 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct hlsl_blo
|
|
else if (lhs->type == HLSL_IR_SWIZZLE)
|
|
{
|
|
struct hlsl_ir_swizzle *swizzle = hlsl_ir_swizzle(lhs);
|
|
- unsigned int width, s = swizzle->swizzle;
|
|
struct hlsl_ir_node *new_swizzle;
|
|
+ uint32_t s = swizzle->swizzle;
|
|
+ unsigned int width;
|
|
|
|
if (lhs->data_type->class == HLSL_CLASS_MATRIX)
|
|
hlsl_fixme(ctx, &lhs->loc, "Matrix assignment with a writemask.");
|
|
@@ -4844,7 +4845,7 @@ static void check_duplicated_switch_cases(struct hlsl_ctx *ctx, const struct hls
|
|
FLOAT floatval;
|
|
bool boolval;
|
|
char *name;
|
|
- DWORD modifiers;
|
|
+ uint32_t modifiers;
|
|
struct hlsl_ir_node *instr;
|
|
struct hlsl_block *block;
|
|
struct list *list;
|
|
@@ -5282,7 +5283,7 @@ field:
|
|
var_modifiers field_type variables_def ';'
|
|
{
|
|
struct hlsl_type *type;
|
|
- unsigned int modifiers = $1;
|
|
+ uint32_t modifiers = $1;
|
|
|
|
if (!(type = apply_type_modifiers(ctx, $2, &modifiers, true, &@1)))
|
|
YYABORT;
|
|
@@ -5435,7 +5436,7 @@ func_prototype_no_attrs:
|
|
/* var_modifiers is necessary to avoid shift/reduce conflicts. */
|
|
var_modifiers type var_identifier '(' parameters ')' colon_attribute
|
|
{
|
|
- unsigned int modifiers = $1;
|
|
+ uint32_t modifiers = $1;
|
|
struct hlsl_ir_var *var;
|
|
struct hlsl_type *type;
|
|
|
|
@@ -5709,7 +5710,7 @@ param_list:
|
|
parameter:
|
|
var_modifiers type_no_void any_identifier arrays colon_attribute
|
|
{
|
|
- unsigned int modifiers = $1;
|
|
+ uint32_t modifiers = $1;
|
|
struct hlsl_type *type;
|
|
unsigned int i;
|
|
|
|
@@ -6023,7 +6024,7 @@ typedef:
|
|
KW_TYPEDEF var_modifiers typedef_type type_specs ';'
|
|
{
|
|
struct parse_variable_def *v, *v_next;
|
|
- unsigned int modifiers = $2;
|
|
+ uint32_t modifiers = $2;
|
|
struct hlsl_type *type;
|
|
|
|
if (!(type = apply_type_modifiers(ctx, $3, &modifiers, false, &@2)))
|
|
@@ -6160,7 +6161,7 @@ variable_def:
|
|
variable_def_typed:
|
|
var_modifiers struct_spec variable_def
|
|
{
|
|
- unsigned int modifiers = $1;
|
|
+ uint32_t modifiers = $1;
|
|
struct hlsl_type *type;
|
|
|
|
if (!(type = apply_type_modifiers(ctx, $2, &modifiers, true, &@1)))
|
|
@@ -6175,7 +6176,7 @@ variable_def_typed:
|
|
}
|
|
| var_modifiers type variable_def
|
|
{
|
|
- unsigned int modifiers = $1;
|
|
+ uint32_t modifiers = $1;
|
|
struct hlsl_type *type;
|
|
|
|
if (!(type = apply_type_modifiers(ctx, $2, &modifiers, true, &@1)))
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
index 88cbef61d5f..acc19dd8ba5 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/hlsl_codegen.c
|
|
@@ -263,7 +263,7 @@ static bool types_are_semantic_equivalent(struct hlsl_ctx *ctx, const struct hls
|
|
}
|
|
|
|
static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
|
|
- struct hlsl_type *type, unsigned int modifiers, struct hlsl_semantic *semantic,
|
|
+ struct hlsl_type *type, uint32_t modifiers, struct hlsl_semantic *semantic,
|
|
uint32_t index, bool output, const struct vkd3d_shader_location *loc)
|
|
{
|
|
struct hlsl_semantic new_semantic;
|
|
@@ -331,7 +331,7 @@ static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir
|
|
}
|
|
|
|
static void prepend_input_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_ir_load *lhs,
|
|
- unsigned int modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
+ uint32_t modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
{
|
|
struct hlsl_type *type = lhs->node.data_type, *vector_type_src, *vector_type_dst;
|
|
struct vkd3d_shader_location *loc = &lhs->node.loc;
|
|
@@ -395,7 +395,7 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, s
|
|
}
|
|
|
|
static void prepend_input_copy_recurse(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_ir_load *lhs,
|
|
- unsigned int modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
+ uint32_t modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
{
|
|
struct vkd3d_shader_location *loc = &lhs->node.loc;
|
|
struct hlsl_type *type = lhs->node.data_type;
|
|
@@ -411,7 +411,7 @@ static void prepend_input_copy_recurse(struct hlsl_ctx *ctx, struct hlsl_block *
|
|
|
|
for (i = 0; i < hlsl_type_element_count(type); ++i)
|
|
{
|
|
- unsigned int element_modifiers = modifiers;
|
|
+ uint32_t element_modifiers = modifiers;
|
|
|
|
if (type->class == HLSL_CLASS_ARRAY)
|
|
{
|
|
@@ -473,7 +473,7 @@ static void prepend_input_var_copy(struct hlsl_ctx *ctx, struct hlsl_block *bloc
|
|
}
|
|
|
|
static void append_output_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_ir_load *rhs,
|
|
- unsigned int modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
+ uint32_t modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
{
|
|
struct hlsl_type *type = rhs->node.data_type, *vector_type;
|
|
struct vkd3d_shader_location *loc = &rhs->node.loc;
|
|
@@ -529,7 +529,7 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, s
|
|
}
|
|
|
|
static void append_output_copy_recurse(struct hlsl_ctx *ctx, struct hlsl_block *block, struct hlsl_ir_load *rhs,
|
|
- unsigned int modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
+ uint32_t modifiers, struct hlsl_semantic *semantic, uint32_t semantic_index)
|
|
{
|
|
struct vkd3d_shader_location *loc = &rhs->node.loc;
|
|
struct hlsl_type *type = rhs->node.data_type;
|
|
@@ -1519,7 +1519,7 @@ static void copy_propagation_set_value(struct hlsl_ctx *ctx, struct copy_propaga
|
|
|
|
static bool copy_propagation_replace_with_single_instr(struct hlsl_ctx *ctx,
|
|
const struct copy_propagation_state *state, const struct hlsl_ir_load *load,
|
|
- unsigned int swizzle, struct hlsl_ir_node *instr)
|
|
+ uint32_t swizzle, struct hlsl_ir_node *instr)
|
|
{
|
|
const unsigned int instr_component_count = hlsl_type_component_count(instr->data_type);
|
|
const struct hlsl_deref *deref = &load->src;
|
|
@@ -1527,7 +1527,7 @@ static bool copy_propagation_replace_with_single_instr(struct hlsl_ctx *ctx,
|
|
struct hlsl_ir_node *new_instr = NULL;
|
|
unsigned int time = load->node.index;
|
|
unsigned int start, count, i;
|
|
- unsigned int ret_swizzle = 0;
|
|
+ uint32_t ret_swizzle = 0;
|
|
|
|
if (!hlsl_component_index_range_from_deref(ctx, deref, &start, &count))
|
|
return false;
|
|
@@ -1573,7 +1573,7 @@ static bool copy_propagation_replace_with_single_instr(struct hlsl_ctx *ctx,
|
|
|
|
static bool copy_propagation_replace_with_constant_vector(struct hlsl_ctx *ctx,
|
|
const struct copy_propagation_state *state, const struct hlsl_ir_load *load,
|
|
- unsigned int swizzle, struct hlsl_ir_node *instr)
|
|
+ uint32_t swizzle, struct hlsl_ir_node *instr)
|
|
{
|
|
const unsigned int instr_component_count = hlsl_type_component_count(instr->data_type);
|
|
const struct hlsl_deref *deref = &load->src;
|
|
@@ -2239,7 +2239,7 @@ static bool fold_swizzle_chains(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
|
if (next_instr->type == HLSL_IR_SWIZZLE)
|
|
{
|
|
struct hlsl_ir_node *new_swizzle;
|
|
- unsigned int combined_swizzle;
|
|
+ uint32_t combined_swizzle;
|
|
|
|
combined_swizzle = hlsl_combine_swizzles(hlsl_ir_swizzle(next_instr)->swizzle,
|
|
swizzle->swizzle, instr->data_type->dimx);
|
|
@@ -3145,7 +3145,7 @@ static bool lower_int_dot(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru
|
|
|
|
for (i = 0; i < dimx; ++i)
|
|
{
|
|
- unsigned int s = hlsl_swizzle_from_writemask(1 << i);
|
|
+ uint32_t s = hlsl_swizzle_from_writemask(1 << i);
|
|
|
|
if (!(comps[i] = hlsl_new_swizzle(ctx, s, 1, mult, &instr->loc)))
|
|
return false;
|
|
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
index a5565d552c0..987197887de 100644
|
|
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
|
|
@@ -1764,6 +1764,15 @@ static uint32_t vkd3d_spirv_build_op_glsl_std450_max(struct vkd3d_spirv_builder
|
|
GLSLstd450NMax, operands, ARRAY_SIZE(operands));
|
|
}
|
|
|
|
+static uint32_t vkd3d_spirv_build_op_glsl_std450_umin(struct vkd3d_spirv_builder *builder,
|
|
+ uint32_t result_type, uint32_t x, uint32_t y)
|
|
+{
|
|
+ uint32_t glsl_std450_id = vkd3d_spirv_get_glsl_std450_instr_set(builder);
|
|
+ uint32_t operands[] = {x, y};
|
|
+ return vkd3d_spirv_build_op_ext_inst(builder, result_type, glsl_std450_id,
|
|
+ GLSLstd450UMin, operands, ARRAY_SIZE(operands));
|
|
+}
|
|
+
|
|
static uint32_t vkd3d_spirv_build_op_glsl_std450_nclamp(struct vkd3d_spirv_builder *builder,
|
|
uint32_t result_type, uint32_t x, uint32_t min, uint32_t max)
|
|
{
|
|
@@ -7355,7 +7364,7 @@ static void spirv_compiler_emit_ftou(struct spirv_compiler *compiler,
|
|
static void spirv_compiler_emit_bitfield_instruction(struct spirv_compiler *compiler,
|
|
const struct vkd3d_shader_instruction *instruction)
|
|
{
|
|
- uint32_t src_ids[4], constituents[VKD3D_VEC4_SIZE], type_id, mask_id;
|
|
+ uint32_t src_ids[4], constituents[VKD3D_VEC4_SIZE], type_id, mask_id, size_id, max_count_id;
|
|
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
|
|
const struct vkd3d_shader_dst_param *dst = instruction->dst;
|
|
const struct vkd3d_shader_src_param *src = instruction->src;
|
|
@@ -7370,6 +7379,7 @@ static void spirv_compiler_emit_bitfield_instruction(struct spirv_compiler *comp
|
|
component_type = vkd3d_component_type_from_data_type(dst->reg.data_type);
|
|
type_id = vkd3d_spirv_get_type_id(builder, component_type, 1);
|
|
mask_id = spirv_compiler_get_constant_uint(compiler, 0x1f);
|
|
+ size_id = spirv_compiler_get_constant_uint(compiler, 0x20);
|
|
|
|
switch (instruction->handler_idx)
|
|
{
|
|
@@ -7398,6 +7408,9 @@ static void spirv_compiler_emit_bitfield_instruction(struct spirv_compiler *comp
|
|
{
|
|
src_ids[j] = vkd3d_spirv_build_op_and(builder, type_id, src_ids[j], mask_id);
|
|
}
|
|
+ max_count_id = vkd3d_spirv_build_op_isub(builder, type_id, size_id, src_ids[src_count - 2]);
|
|
+ src_ids[src_count - 1] = vkd3d_spirv_build_op_glsl_std450_umin(builder, type_id,
|
|
+ src_ids[src_count - 1], max_count_id);
|
|
|
|
constituents[k++] = vkd3d_spirv_build_op_trv(builder, &builder->function_stream,
|
|
op, type_id, src_ids, src_count);
|
|
diff --git a/libs/vkd3d/libs/vkd3d/command.c b/libs/vkd3d/libs/vkd3d/command.c
|
|
index 549f6a45ffb..013b5d0751f 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/command.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/command.c
|
|
@@ -6512,7 +6512,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12Command
|
|
if (!(op = d3d12_command_queue_op_array_require_space(&command_queue->op_queue)))
|
|
{
|
|
ERR("Failed to add op.\n");
|
|
- return;
|
|
+ goto unlock_mutex;
|
|
}
|
|
op->opcode = VKD3D_CS_OP_COPY_MAPPINGS;
|
|
op->u.copy_mappings.dst_resource = dst_resource_impl;
|
|
@@ -6524,6 +6524,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_CopyTileMappings(ID3D12Command
|
|
|
|
d3d12_command_queue_submit_locked(command_queue);
|
|
|
|
+unlock_mutex:
|
|
vkd3d_mutex_unlock(&command_queue->op_mutex);
|
|
}
|
|
|
|
diff --git a/libs/vkd3d/libs/vkd3d/resource.c b/libs/vkd3d/libs/vkd3d/resource.c
|
|
index 609c67102a6..f4ce1ccaffa 100644
|
|
--- a/libs/vkd3d/libs/vkd3d/resource.c
|
|
+++ b/libs/vkd3d/libs/vkd3d/resource.c
|
|
@@ -3444,6 +3444,7 @@ static void vkd3d_create_null_uav(struct d3d12_desc *descriptor,
|
|
vkd3d_desc.miplevel_count = 1;
|
|
vkd3d_desc.layer_idx = 0;
|
|
vkd3d_desc.layer_count = 1;
|
|
+ vkd3d_desc.vk_image_aspect = VK_IMAGE_ASPECT_COLOR_BIT;
|
|
vkd3d_desc.components.r = VK_COMPONENT_SWIZZLE_R;
|
|
vkd3d_desc.components.g = VK_COMPONENT_SWIZZLE_G;
|
|
vkd3d_desc.components.b = VK_COMPONENT_SWIZZLE_B;
|
|
@@ -3661,11 +3662,27 @@ static VkSamplerAddressMode vk_address_mode_from_d3d12(const struct d3d12_device
|
|
}
|
|
}
|
|
|
|
+static VkBorderColor vk_border_colour_from_d3d12(D3D12_STATIC_BORDER_COLOR colour)
|
|
+{
|
|
+ switch (colour)
|
|
+ {
|
|
+ case D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK:
|
|
+ return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
|
+ case D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK:
|
|
+ return VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
|
|
+ case D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE:
|
|
+ return VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
|
|
+ default:
|
|
+ FIXME("Unhandled border colour %#x.\n", colour);
|
|
+ return VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
|
+ }
|
|
+}
|
|
+
|
|
static VkResult d3d12_create_sampler(struct d3d12_device *device, D3D12_FILTER filter,
|
|
D3D12_TEXTURE_ADDRESS_MODE address_u, D3D12_TEXTURE_ADDRESS_MODE address_v,
|
|
D3D12_TEXTURE_ADDRESS_MODE address_w, float mip_lod_bias, unsigned int max_anisotropy,
|
|
- D3D12_COMPARISON_FUNC comparison_func, float min_lod, float max_lod,
|
|
- VkSampler *vk_sampler)
|
|
+ D3D12_COMPARISON_FUNC comparison_func, D3D12_STATIC_BORDER_COLOR border_colour,
|
|
+ float min_lod, float max_lod, VkSampler *vk_sampler)
|
|
{
|
|
const struct vkd3d_vk_device_procs *vk_procs;
|
|
struct VkSamplerCreateInfo sampler_desc;
|
|
@@ -3695,15 +3712,48 @@ static VkResult d3d12_create_sampler(struct d3d12_device *device, D3D12_FILTER f
|
|
sampler_desc.maxLod = max_lod;
|
|
sampler_desc.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
|
sampler_desc.unnormalizedCoordinates = VK_FALSE;
|
|
+
|
|
+ if (address_u == D3D12_TEXTURE_ADDRESS_MODE_BORDER || address_v == D3D12_TEXTURE_ADDRESS_MODE_BORDER
|
|
+ || address_w == D3D12_TEXTURE_ADDRESS_MODE_BORDER)
|
|
+ sampler_desc.borderColor = vk_border_colour_from_d3d12(border_colour);
|
|
+
|
|
if ((vr = VK_CALL(vkCreateSampler(device->vk_device, &sampler_desc, NULL, vk_sampler))) < 0)
|
|
WARN("Failed to create Vulkan sampler, vr %d.\n", vr);
|
|
|
|
return vr;
|
|
}
|
|
|
|
+static D3D12_STATIC_BORDER_COLOR d3d12_static_border_colour(const float *colour)
|
|
+{
|
|
+ unsigned int i;
|
|
+
|
|
+ static const struct
|
|
+ {
|
|
+ float colour[4];
|
|
+ D3D12_STATIC_BORDER_COLOR static_colour;
|
|
+ }
|
|
+ colours[] =
|
|
+ {
|
|
+ {{0.0f, 0.0f, 0.0f, 0.0f}, D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK},
|
|
+ {{0.0f, 0.0f, 0.0f, 1.0f}, D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK},
|
|
+ {{1.0f, 1.0f, 1.0f, 1.0f}, D3D12_STATIC_BORDER_COLOR_OPAQUE_WHITE},
|
|
+ };
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE(colours); ++i)
|
|
+ {
|
|
+ if (!memcmp(colour, colours[i].colour, sizeof(colours[i].colour)))
|
|
+ return colours[i].static_colour;
|
|
+ }
|
|
+
|
|
+ FIXME("Unhandled border colour {%.8e, %.8e, %.8e, %.8e}.\n", colour[0], colour[1], colour[2], colour[3]);
|
|
+
|
|
+ return D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
|
|
+}
|
|
+
|
|
void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
|
|
struct d3d12_device *device, const D3D12_SAMPLER_DESC *desc)
|
|
{
|
|
+ D3D12_STATIC_BORDER_COLOR static_colour = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK;
|
|
struct vkd3d_view *view;
|
|
|
|
if (!desc)
|
|
@@ -3715,8 +3765,7 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
|
|
if (desc->AddressU == D3D12_TEXTURE_ADDRESS_MODE_BORDER
|
|
|| desc->AddressV == D3D12_TEXTURE_ADDRESS_MODE_BORDER
|
|
|| desc->AddressW == D3D12_TEXTURE_ADDRESS_MODE_BORDER)
|
|
- FIXME("Ignoring border color {%.8e, %.8e, %.8e, %.8e}.\n",
|
|
- desc->BorderColor[0], desc->BorderColor[1], desc->BorderColor[2], desc->BorderColor[3]);
|
|
+ static_colour = d3d12_static_border_colour(desc->BorderColor);
|
|
|
|
if (!(view = vkd3d_view_create(VKD3D_DESCRIPTOR_MAGIC_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLER,
|
|
VKD3D_VIEW_TYPE_SAMPLER, device)))
|
|
@@ -3724,9 +3773,9 @@ void d3d12_desc_create_sampler(struct d3d12_desc *sampler,
|
|
view->v.u.vk_sampler = VK_NULL_HANDLE;
|
|
view->v.format = NULL;
|
|
|
|
- if (d3d12_create_sampler(device, desc->Filter, desc->AddressU,
|
|
- desc->AddressV, desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy,
|
|
- desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, &view->v.u.vk_sampler) < 0)
|
|
+ if (d3d12_create_sampler(device, desc->Filter, desc->AddressU, desc->AddressV,
|
|
+ desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy, desc->ComparisonFunc,
|
|
+ static_colour, desc->MinLOD, desc->MaxLOD, &view->v.u.vk_sampler) < 0)
|
|
{
|
|
vkd3d_view_decref(view, device);
|
|
return;
|
|
@@ -3740,14 +3789,9 @@ HRESULT vkd3d_create_static_sampler(struct d3d12_device *device,
|
|
{
|
|
VkResult vr;
|
|
|
|
- if (desc->AddressU == D3D12_TEXTURE_ADDRESS_MODE_BORDER
|
|
- || desc->AddressV == D3D12_TEXTURE_ADDRESS_MODE_BORDER
|
|
- || desc->AddressW == D3D12_TEXTURE_ADDRESS_MODE_BORDER)
|
|
- FIXME("Ignoring border %#x.\n", desc->BorderColor);
|
|
-
|
|
- vr = d3d12_create_sampler(device, desc->Filter, desc->AddressU,
|
|
- desc->AddressV, desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy,
|
|
- desc->ComparisonFunc, desc->MinLOD, desc->MaxLOD, vk_sampler);
|
|
+ vr = d3d12_create_sampler(device, desc->Filter, desc->AddressU, desc->AddressV,
|
|
+ desc->AddressW, desc->MipLODBias, desc->MaxAnisotropy, desc->ComparisonFunc,
|
|
+ desc->BorderColor, desc->MinLOD, desc->MaxLOD, vk_sampler);
|
|
return hresult_from_vk_result(vr);
|
|
}
|
|
|
|
--
|
|
2.43.0
|
|
|