mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Move the "base_type" member to the class-specific union.
This commit is contained in:
parent
4fd3f46109
commit
2480eec98b
Notes:
Alexandre Julliard
2024-05-06 22:37:26 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/831
@ -1540,7 +1540,7 @@ D3DXPARAMETER_TYPE hlsl_sm1_base_type(const struct hlsl_type *type)
|
|||||||
case HLSL_CLASS_SCALAR:
|
case HLSL_CLASS_SCALAR:
|
||||||
case HLSL_CLASS_VECTOR:
|
case HLSL_CLASS_VECTOR:
|
||||||
case HLSL_CLASS_MATRIX:
|
case HLSL_CLASS_MATRIX:
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
return D3DXPT_BOOL;
|
return D3DXPT_BOOL;
|
||||||
@ -2015,11 +2015,11 @@ static void write_sm1_cast(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
|
|||||||
/* Narrowing casts were already lowered. */
|
/* Narrowing casts were already lowered. */
|
||||||
assert(src_type->dimx == dst_type->dimx);
|
assert(src_type->dimx == dst_type->dimx);
|
||||||
|
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
case HLSL_TYPE_UINT:
|
case HLSL_TYPE_UINT:
|
||||||
@ -2041,7 +2041,7 @@ static void write_sm1_cast(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
|
|||||||
|
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
case HLSL_TYPE_UINT:
|
case HLSL_TYPE_UINT:
|
||||||
switch(src_type->base_type)
|
switch(src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
@ -2303,7 +2303,7 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instr->data_type->base_type != HLSL_TYPE_FLOAT)
|
if (instr->data_type->e.numeric.type != HLSL_TYPE_FLOAT)
|
||||||
{
|
{
|
||||||
/* These need to be lowered. */
|
/* These need to be lowered. */
|
||||||
hlsl_fixme(ctx, &instr->loc, "SM1 non-float expression.");
|
hlsl_fixme(ctx, &instr->loc, "SM1 non-float expression.");
|
||||||
|
@ -326,16 +326,16 @@ static uint32_t get_fx_4_numeric_type_description(const struct hlsl_type *type,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
case HLSL_TYPE_UINT:
|
case HLSL_TYPE_UINT:
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
value |= (numeric_base_type[type->base_type] << NUMERIC_BASE_TYPE_SHIFT);
|
value |= (numeric_base_type[type->e.numeric.type] << NUMERIC_BASE_TYPE_SHIFT);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
hlsl_fixme(ctx, &ctx->location, "Not implemented for base type %u.", type->base_type);
|
hlsl_fixme(ctx, &ctx->location, "Not implemented for base type %u.", type->e.numeric.type);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1028,7 +1028,7 @@ static void write_fx_4_object_variable(struct hlsl_ir_var *var, struct fx_write_
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
hlsl_fixme(ctx, &ctx->location, "Writing initializer for object type %u is not implemented.",
|
hlsl_fixme(ctx, &ctx->location, "Writing initializer for object type %u is not implemented.",
|
||||||
type->base_type);
|
type->e.numeric.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
put_u32(buffer, 0); /* Annotations count */
|
put_u32(buffer, 0); /* Annotations count */
|
||||||
|
@ -417,7 +417,7 @@ static struct hlsl_type *hlsl_new_type(struct hlsl_ctx *ctx, const char *name, e
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
type->class = type_class;
|
type->class = type_class;
|
||||||
type->base_type = base_type;
|
type->e.numeric.type = base_type;
|
||||||
type->dimx = dimx;
|
type->dimx = dimx;
|
||||||
type->dimy = dimy;
|
type->dimy = dimy;
|
||||||
hlsl_type_calculate_reg_size(ctx, type);
|
hlsl_type_calculate_reg_size(ctx, type);
|
||||||
@ -477,7 +477,7 @@ static unsigned int traverse_path_from_component_index(struct hlsl_ctx *ctx,
|
|||||||
{
|
{
|
||||||
case HLSL_CLASS_VECTOR:
|
case HLSL_CLASS_VECTOR:
|
||||||
assert(index < type->dimx);
|
assert(index < type->dimx);
|
||||||
*type_ptr = hlsl_get_scalar_type(ctx, type->base_type);
|
*type_ptr = hlsl_get_scalar_type(ctx, type->e.numeric.type);
|
||||||
*index_ptr = 0;
|
*index_ptr = 0;
|
||||||
return index;
|
return index;
|
||||||
|
|
||||||
@ -487,7 +487,7 @@ static unsigned int traverse_path_from_component_index(struct hlsl_ctx *ctx,
|
|||||||
bool row_major = hlsl_type_is_row_major(type);
|
bool row_major = hlsl_type_is_row_major(type);
|
||||||
|
|
||||||
assert(index < type->dimx * type->dimy);
|
assert(index < type->dimx * type->dimy);
|
||||||
*type_ptr = hlsl_get_vector_type(ctx, type->base_type, row_major ? type->dimx : type->dimy);
|
*type_ptr = hlsl_get_vector_type(ctx, type->e.numeric.type, row_major ? type->dimx : type->dimy);
|
||||||
*index_ptr = row_major ? x : y;
|
*index_ptr = row_major ? x : y;
|
||||||
return row_major ? y : x;
|
return row_major ? y : x;
|
||||||
}
|
}
|
||||||
@ -761,13 +761,13 @@ struct hlsl_type *hlsl_get_element_type_from_path_index(struct hlsl_ctx *ctx, co
|
|||||||
switch (type->class)
|
switch (type->class)
|
||||||
{
|
{
|
||||||
case HLSL_CLASS_VECTOR:
|
case HLSL_CLASS_VECTOR:
|
||||||
return hlsl_get_scalar_type(ctx, type->base_type);
|
return hlsl_get_scalar_type(ctx, type->e.numeric.type);
|
||||||
|
|
||||||
case HLSL_CLASS_MATRIX:
|
case HLSL_CLASS_MATRIX:
|
||||||
if (hlsl_type_is_row_major(type))
|
if (hlsl_type_is_row_major(type))
|
||||||
return hlsl_get_vector_type(ctx, type->base_type, type->dimx);
|
return hlsl_get_vector_type(ctx, type->e.numeric.type, type->dimx);
|
||||||
else
|
else
|
||||||
return hlsl_get_vector_type(ctx, type->base_type, type->dimy);
|
return hlsl_get_vector_type(ctx, type->e.numeric.type, type->dimy);
|
||||||
|
|
||||||
case HLSL_CLASS_ARRAY:
|
case HLSL_CLASS_ARRAY:
|
||||||
return type->e.array.type;
|
return type->e.array.type;
|
||||||
@ -985,7 +985,7 @@ bool hlsl_types_are_equal(const struct hlsl_type *t1, const struct hlsl_type *t2
|
|||||||
case HLSL_CLASS_SCALAR:
|
case HLSL_CLASS_SCALAR:
|
||||||
case HLSL_CLASS_VECTOR:
|
case HLSL_CLASS_VECTOR:
|
||||||
case HLSL_CLASS_MATRIX:
|
case HLSL_CLASS_MATRIX:
|
||||||
if (t1->base_type != t2->base_type)
|
if (t1->e.numeric.type != t2->e.numeric.type)
|
||||||
return false;
|
return false;
|
||||||
if ((t1->modifiers & HLSL_MODIFIER_ROW_MAJOR)
|
if ((t1->modifiers & HLSL_MODIFIER_ROW_MAJOR)
|
||||||
!= (t2->modifiers & HLSL_MODIFIER_ROW_MAJOR))
|
!= (t2->modifiers & HLSL_MODIFIER_ROW_MAJOR))
|
||||||
@ -1066,7 +1066,6 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
type->class = old->class;
|
type->class = old->class;
|
||||||
type->base_type = old->base_type;
|
|
||||||
type->dimx = old->dimx;
|
type->dimx = old->dimx;
|
||||||
type->dimy = old->dimy;
|
type->dimy = old->dimy;
|
||||||
type->modifiers = old->modifiers | modifiers;
|
type->modifiers = old->modifiers | modifiers;
|
||||||
@ -1078,6 +1077,12 @@ struct hlsl_type *hlsl_type_clone(struct hlsl_ctx *ctx, struct hlsl_type *old,
|
|||||||
|
|
||||||
switch (old->class)
|
switch (old->class)
|
||||||
{
|
{
|
||||||
|
case HLSL_CLASS_SCALAR:
|
||||||
|
case HLSL_CLASS_VECTOR:
|
||||||
|
case HLSL_CLASS_MATRIX:
|
||||||
|
type->e.numeric.type = old->e.numeric.type;
|
||||||
|
break;
|
||||||
|
|
||||||
case HLSL_CLASS_ARRAY:
|
case HLSL_CLASS_ARRAY:
|
||||||
if (!(type->e.array.type = hlsl_type_clone(ctx, old->e.array.type, default_majority, modifiers)))
|
if (!(type->e.array.type = hlsl_type_clone(ctx, old->e.array.type, default_majority, modifiers)))
|
||||||
{
|
{
|
||||||
@ -1665,10 +1670,11 @@ struct hlsl_ir_node *hlsl_new_swizzle(struct hlsl_ctx *ctx, uint32_t s, unsigned
|
|||||||
|
|
||||||
if (!(swizzle = hlsl_alloc(ctx, sizeof(*swizzle))))
|
if (!(swizzle = hlsl_alloc(ctx, sizeof(*swizzle))))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
assert(hlsl_is_numeric_type(val->data_type));
|
||||||
if (components == 1)
|
if (components == 1)
|
||||||
type = hlsl_get_scalar_type(ctx, val->data_type->base_type);
|
type = hlsl_get_scalar_type(ctx, val->data_type->e.numeric.type);
|
||||||
else
|
else
|
||||||
type = hlsl_get_vector_type(ctx, val->data_type->base_type, components);
|
type = hlsl_get_vector_type(ctx, val->data_type->e.numeric.type, components);
|
||||||
init_node(&swizzle->node, HLSL_IR_SWIZZLE, type, loc);
|
init_node(&swizzle->node, HLSL_IR_SWIZZLE, type, loc);
|
||||||
hlsl_src_from_node(&swizzle->val, val);
|
hlsl_src_from_node(&swizzle->val, val);
|
||||||
swizzle->swizzle = s;
|
swizzle->swizzle = s;
|
||||||
@ -1731,7 +1737,7 @@ struct hlsl_ir_node *hlsl_new_index(struct hlsl_ctx *ctx, struct hlsl_ir_node *v
|
|||||||
if (type->class == HLSL_CLASS_TEXTURE || type->class == HLSL_CLASS_UAV)
|
if (type->class == HLSL_CLASS_TEXTURE || type->class == HLSL_CLASS_UAV)
|
||||||
type = type->e.resource.format;
|
type = type->e.resource.format;
|
||||||
else if (type->class == HLSL_CLASS_MATRIX)
|
else if (type->class == HLSL_CLASS_MATRIX)
|
||||||
type = hlsl_get_vector_type(ctx, type->base_type, type->dimx);
|
type = hlsl_get_vector_type(ctx, type->e.numeric.type, type->dimx);
|
||||||
else
|
else
|
||||||
type = hlsl_get_element_type_from_path_index(ctx, type, idx);
|
type = hlsl_get_element_type_from_path_index(ctx, type, idx);
|
||||||
|
|
||||||
@ -2317,18 +2323,18 @@ struct vkd3d_string_buffer *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
|
|||||||
switch (type->class)
|
switch (type->class)
|
||||||
{
|
{
|
||||||
case HLSL_CLASS_SCALAR:
|
case HLSL_CLASS_SCALAR:
|
||||||
assert(type->base_type < ARRAY_SIZE(base_types));
|
assert(type->e.numeric.type < ARRAY_SIZE(base_types));
|
||||||
vkd3d_string_buffer_printf(string, "%s", base_types[type->base_type]);
|
vkd3d_string_buffer_printf(string, "%s", base_types[type->e.numeric.type]);
|
||||||
return string;
|
return string;
|
||||||
|
|
||||||
case HLSL_CLASS_VECTOR:
|
case HLSL_CLASS_VECTOR:
|
||||||
assert(type->base_type < ARRAY_SIZE(base_types));
|
assert(type->e.numeric.type < ARRAY_SIZE(base_types));
|
||||||
vkd3d_string_buffer_printf(string, "%s%u", base_types[type->base_type], type->dimx);
|
vkd3d_string_buffer_printf(string, "%s%u", base_types[type->e.numeric.type], type->dimx);
|
||||||
return string;
|
return string;
|
||||||
|
|
||||||
case HLSL_CLASS_MATRIX:
|
case HLSL_CLASS_MATRIX:
|
||||||
assert(type->base_type < ARRAY_SIZE(base_types));
|
assert(type->e.numeric.type < ARRAY_SIZE(base_types));
|
||||||
vkd3d_string_buffer_printf(string, "%s%ux%u", base_types[type->base_type], type->dimy, type->dimx);
|
vkd3d_string_buffer_printf(string, "%s%ux%u", base_types[type->e.numeric.type], type->dimy, type->dimx);
|
||||||
return string;
|
return string;
|
||||||
|
|
||||||
case HLSL_CLASS_ARRAY:
|
case HLSL_CLASS_ARRAY:
|
||||||
@ -2365,7 +2371,8 @@ struct vkd3d_string_buffer *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
|
|||||||
return string;
|
return string;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(type->e.resource.format->base_type < ARRAY_SIZE(base_types));
|
assert(hlsl_is_numeric_type(type->e.resource.format));
|
||||||
|
assert(type->e.resource.format->e.numeric.type < ARRAY_SIZE(base_types));
|
||||||
if (type->sampler_dim == HLSL_SAMPLER_DIM_BUFFER)
|
if (type->sampler_dim == HLSL_SAMPLER_DIM_BUFFER)
|
||||||
{
|
{
|
||||||
vkd3d_string_buffer_printf(string, "Buffer");
|
vkd3d_string_buffer_printf(string, "Buffer");
|
||||||
@ -2688,7 +2695,7 @@ static void dump_ir_constant(struct vkd3d_string_buffer *buffer, const struct hl
|
|||||||
{
|
{
|
||||||
const union hlsl_constant_value_component *value = &constant->value.u[x];
|
const union hlsl_constant_value_component *value = &constant->value.u[x];
|
||||||
|
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
vkd3d_string_buffer_printf(buffer, "%s ", value->u ? "true" : "false");
|
vkd3d_string_buffer_printf(buffer, "%s ", value->u ? "true" : "false");
|
||||||
|
@ -142,9 +142,6 @@ struct hlsl_type
|
|||||||
struct rb_entry scope_entry;
|
struct rb_entry scope_entry;
|
||||||
|
|
||||||
enum hlsl_type_class class;
|
enum hlsl_type_class class;
|
||||||
/* If class is <= HLSL_CLASS_LAST_NUMERIC, then base_type is <= HLSL_TYPE_LAST_SCALAR.
|
|
||||||
* Otherwise, base_type is not used. */
|
|
||||||
enum hlsl_base_type base_type;
|
|
||||||
|
|
||||||
/* If class is HLSL_CLASS_SAMPLER, then sampler_dim is <= HLSL_SAMPLER_DIM_LAST_SAMPLER.
|
/* If class is HLSL_CLASS_SAMPLER, then sampler_dim is <= HLSL_SAMPLER_DIM_LAST_SAMPLER.
|
||||||
* If class is HLSL_CLASS_TEXTURE, then sampler_dim can be any value of the enum except
|
* If class is HLSL_CLASS_TEXTURE, then sampler_dim can be any value of the enum except
|
||||||
@ -175,6 +172,11 @@ struct hlsl_type
|
|||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
|
/* Additional information if type is numeric. */
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
enum hlsl_base_type type;
|
||||||
|
} numeric;
|
||||||
/* Additional information if type is HLSL_CLASS_STRUCT. */
|
/* Additional information if type is HLSL_CLASS_STRUCT. */
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
|
@ -1352,9 +1352,6 @@ static unsigned int evaluate_static_expression_as_uint(struct hlsl_ctx *ctx, str
|
|||||||
|
|
||||||
static bool expr_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
|
static bool expr_compatible_data_types(struct hlsl_type *t1, struct hlsl_type *t2)
|
||||||
{
|
{
|
||||||
if (t1->base_type > HLSL_TYPE_LAST_SCALAR || t2->base_type > HLSL_TYPE_LAST_SCALAR)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* Scalar vars can be converted to pretty much everything */
|
/* Scalar vars can be converted to pretty much everything */
|
||||||
if ((t1->dimx == 1 && t1->dimy == 1) || (t2->dimx == 1 && t2->dimy == 1))
|
if ((t1->dimx == 1 && t1->dimy == 1) || (t2->dimx == 1 && t2->dimy == 1))
|
||||||
return true;
|
return true;
|
||||||
@ -1489,7 +1486,7 @@ static struct hlsl_ir_node *add_expr(struct hlsl_ctx *ctx, struct hlsl_block *bl
|
|||||||
struct hlsl_ir_node *load;
|
struct hlsl_ir_node *load;
|
||||||
struct hlsl_ir_var *var;
|
struct hlsl_ir_var *var;
|
||||||
|
|
||||||
scalar_type = hlsl_get_scalar_type(ctx, type->base_type);
|
scalar_type = hlsl_get_scalar_type(ctx, type->e.numeric.type);
|
||||||
|
|
||||||
if (!(var = hlsl_new_synthetic_var(ctx, "split_op", type, loc)))
|
if (!(var = hlsl_new_synthetic_var(ctx, "split_op", type, loc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1539,7 +1536,7 @@ static void check_integer_type(struct hlsl_ctx *ctx, const struct hlsl_ir_node *
|
|||||||
const struct hlsl_type *type = instr->data_type;
|
const struct hlsl_type *type = instr->data_type;
|
||||||
struct vkd3d_string_buffer *string;
|
struct vkd3d_string_buffer *string;
|
||||||
|
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
@ -1595,7 +1592,7 @@ static struct hlsl_type *get_common_numeric_type(struct hlsl_ctx *ctx, const str
|
|||||||
|
|
||||||
if (!expr_common_shape(ctx, arg1->data_type, arg2->data_type, loc, &type, &dimx, &dimy))
|
if (!expr_common_shape(ctx, arg1->data_type, arg2->data_type, loc, &type, &dimx, &dimy))
|
||||||
return NULL;
|
return NULL;
|
||||||
base = expr_common_base_type(arg1->data_type->base_type, arg2->data_type->base_type);
|
base = expr_common_base_type(arg1->data_type->e.numeric.type, arg2->data_type->e.numeric.type);
|
||||||
return hlsl_get_numeric_type(ctx, type, base, dimx, dimy);
|
return hlsl_get_numeric_type(ctx, type, base, dimx, dimy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1640,7 +1637,7 @@ static struct hlsl_ir_node *add_binary_comparison_expr(struct hlsl_ctx *ctx, str
|
|||||||
if (!expr_common_shape(ctx, arg1->data_type, arg2->data_type, loc, &type, &dimx, &dimy))
|
if (!expr_common_shape(ctx, arg1->data_type, arg2->data_type, loc, &type, &dimx, &dimy))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
base = expr_common_base_type(arg1->data_type->base_type, arg2->data_type->base_type);
|
base = expr_common_base_type(arg1->data_type->e.numeric.type, arg2->data_type->e.numeric.type);
|
||||||
common_type = hlsl_get_numeric_type(ctx, type, base, dimx, dimy);
|
common_type = hlsl_get_numeric_type(ctx, type, base, dimx, dimy);
|
||||||
return_type = hlsl_get_numeric_type(ctx, type, HLSL_TYPE_BOOL, dimx, dimy);
|
return_type = hlsl_get_numeric_type(ctx, type, HLSL_TYPE_BOOL, dimx, dimy);
|
||||||
|
|
||||||
@ -1680,7 +1677,7 @@ static struct hlsl_ir_node *add_binary_shift_expr(struct hlsl_ctx *ctx, struct h
|
|||||||
enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2,
|
enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2,
|
||||||
const struct vkd3d_shader_location *loc)
|
const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type base = arg1->data_type->base_type;
|
enum hlsl_base_type base = arg1->data_type->e.numeric.type;
|
||||||
struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
||||||
struct hlsl_type *return_type, *integer_type;
|
struct hlsl_type *return_type, *integer_type;
|
||||||
enum hlsl_type_class type;
|
enum hlsl_type_class type;
|
||||||
@ -1710,7 +1707,7 @@ static struct hlsl_ir_node *add_binary_shift_expr(struct hlsl_ctx *ctx, struct h
|
|||||||
static struct hlsl_ir_node *add_binary_dot_expr(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
static struct hlsl_ir_node *add_binary_dot_expr(struct hlsl_ctx *ctx, struct hlsl_block *instrs,
|
||||||
struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2, const struct vkd3d_shader_location *loc)
|
struct hlsl_ir_node *arg1, struct hlsl_ir_node *arg2, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type base = expr_common_base_type(arg1->data_type->base_type, arg2->data_type->base_type);
|
enum hlsl_base_type base = expr_common_base_type(arg1->data_type->e.numeric.type, arg2->data_type->e.numeric.type);
|
||||||
struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
||||||
struct hlsl_type *common_type, *ret_type;
|
struct hlsl_type *common_type, *ret_type;
|
||||||
enum hlsl_ir_expr_op op;
|
enum hlsl_ir_expr_op op;
|
||||||
@ -1961,7 +1958,7 @@ static struct hlsl_ir_node *add_assignment(struct hlsl_ctx *ctx, struct hlsl_blo
|
|||||||
"Resource store expressions must write to all components.");
|
"Resource store expressions must write to all components.");
|
||||||
|
|
||||||
assert(coords->data_type->class == HLSL_CLASS_VECTOR);
|
assert(coords->data_type->class == HLSL_CLASS_VECTOR);
|
||||||
assert(coords->data_type->base_type == HLSL_TYPE_UINT);
|
assert(coords->data_type->e.numeric.type == HLSL_TYPE_UINT);
|
||||||
assert(coords->data_type->dimx == dim_count);
|
assert(coords->data_type->dimx == dim_count);
|
||||||
|
|
||||||
if (!(store = hlsl_new_resource_store(ctx, &resource_deref, coords, rhs, &lhs->loc)))
|
if (!(store = hlsl_new_resource_store(ctx, &resource_deref, coords, rhs, &lhs->loc)))
|
||||||
@ -2600,7 +2597,7 @@ static struct hlsl_ir_node *intrinsic_float_convert_arg(struct hlsl_ctx *ctx,
|
|||||||
{
|
{
|
||||||
struct hlsl_type *type = arg->data_type;
|
struct hlsl_type *type = arg->data_type;
|
||||||
|
|
||||||
if (type->base_type == HLSL_TYPE_FLOAT || type->base_type == HLSL_TYPE_HALF)
|
if (type->e.numeric.type == HLSL_TYPE_FLOAT || type->e.numeric.type == HLSL_TYPE_HALF)
|
||||||
return arg;
|
return arg;
|
||||||
|
|
||||||
type = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_FLOAT, type->dimx, type->dimy);
|
type = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_FLOAT, type->dimx, type->dimy);
|
||||||
@ -2627,7 +2624,7 @@ static bool convert_args(struct hlsl_ctx *ctx, const struct parse_initializer *p
|
|||||||
static struct hlsl_type *elementwise_intrinsic_get_common_type(struct hlsl_ctx *ctx,
|
static struct hlsl_type *elementwise_intrinsic_get_common_type(struct hlsl_ctx *ctx,
|
||||||
const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
|
const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type base = params->args[0]->data_type->base_type;
|
enum hlsl_base_type base = params->args[0]->data_type->e.numeric.type;
|
||||||
bool vectors = false, matrices = false;
|
bool vectors = false, matrices = false;
|
||||||
unsigned int dimx = 4, dimy = 4;
|
unsigned int dimx = 4, dimy = 4;
|
||||||
struct hlsl_type *common_type;
|
struct hlsl_type *common_type;
|
||||||
@ -2637,7 +2634,7 @@ static struct hlsl_type *elementwise_intrinsic_get_common_type(struct hlsl_ctx *
|
|||||||
{
|
{
|
||||||
struct hlsl_type *arg_type = params->args[i]->data_type;
|
struct hlsl_type *arg_type = params->args[i]->data_type;
|
||||||
|
|
||||||
base = expr_common_base_type(base, arg_type->base_type);
|
base = expr_common_base_type(base, arg_type->e.numeric.type);
|
||||||
|
|
||||||
if (arg_type->class == HLSL_CLASS_VECTOR)
|
if (arg_type->class == HLSL_CLASS_VECTOR)
|
||||||
{
|
{
|
||||||
@ -2694,7 +2691,7 @@ static bool elementwise_intrinsic_float_convert_args(struct hlsl_ctx *ctx,
|
|||||||
if (!(type = elementwise_intrinsic_get_common_type(ctx, params, loc)))
|
if (!(type = elementwise_intrinsic_get_common_type(ctx, params, loc)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
base_type = type->base_type == HLSL_TYPE_HALF ? HLSL_TYPE_HALF : HLSL_TYPE_FLOAT;
|
base_type = type->e.numeric.type == HLSL_TYPE_HALF ? HLSL_TYPE_HALF : HLSL_TYPE_FLOAT;
|
||||||
type = hlsl_get_numeric_type(ctx, type->class, base_type, type->dimx, type->dimy);
|
type = hlsl_get_numeric_type(ctx, type->class, base_type, type->dimx, type->dimy);
|
||||||
|
|
||||||
return convert_args(ctx, params, type, loc);
|
return convert_args(ctx, params, type, loc);
|
||||||
@ -2918,7 +2915,7 @@ static bool intrinsic_asfloat(struct hlsl_ctx *ctx,
|
|||||||
struct hlsl_type *data_type;
|
struct hlsl_type *data_type;
|
||||||
|
|
||||||
data_type = params->args[0]->data_type;
|
data_type = params->args[0]->data_type;
|
||||||
if (data_type->base_type == HLSL_TYPE_BOOL || data_type->base_type == HLSL_TYPE_DOUBLE)
|
if (data_type->e.numeric.type == HLSL_TYPE_BOOL || data_type->e.numeric.type == HLSL_TYPE_DOUBLE)
|
||||||
{
|
{
|
||||||
struct vkd3d_string_buffer *string;
|
struct vkd3d_string_buffer *string;
|
||||||
|
|
||||||
@ -2954,7 +2951,7 @@ static bool intrinsic_asuint(struct hlsl_ctx *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
data_type = params->args[0]->data_type;
|
data_type = params->args[0]->data_type;
|
||||||
if (data_type->base_type == HLSL_TYPE_BOOL || data_type->base_type == HLSL_TYPE_DOUBLE)
|
if (data_type->e.numeric.type == HLSL_TYPE_BOOL || data_type->e.numeric.type == HLSL_TYPE_DOUBLE)
|
||||||
{
|
{
|
||||||
struct vkd3d_string_buffer *string;
|
struct vkd3d_string_buffer *string;
|
||||||
|
|
||||||
@ -3083,7 +3080,7 @@ static bool intrinsic_cross(struct hlsl_ctx *ctx,
|
|||||||
struct hlsl_type *cast_type;
|
struct hlsl_type *cast_type;
|
||||||
enum hlsl_base_type base;
|
enum hlsl_base_type base;
|
||||||
|
|
||||||
if (arg1->data_type->base_type == HLSL_TYPE_HALF && arg2->data_type->base_type == HLSL_TYPE_HALF)
|
if (arg1->data_type->e.numeric.type == HLSL_TYPE_HALF && arg2->data_type->e.numeric.type == HLSL_TYPE_HALF)
|
||||||
base = HLSL_TYPE_HALF;
|
base = HLSL_TYPE_HALF;
|
||||||
else
|
else
|
||||||
base = HLSL_TYPE_FLOAT;
|
base = HLSL_TYPE_FLOAT;
|
||||||
@ -3264,7 +3261,7 @@ static bool intrinsic_determinant(struct hlsl_ctx *ctx,
|
|||||||
return hlsl_add_load_component(ctx, params->instrs, arg, 0, loc);
|
return hlsl_add_load_component(ctx, params->instrs, arg, 0, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
typename = type->base_type == HLSL_TYPE_HALF ? "half" : "float";
|
typename = type->e.numeric.type == HLSL_TYPE_HALF ? "half" : "float";
|
||||||
template = templates[dim];
|
template = templates[dim];
|
||||||
|
|
||||||
switch (dim)
|
switch (dim)
|
||||||
@ -3618,7 +3615,7 @@ static bool intrinsic_mul(struct hlsl_ctx *ctx,
|
|||||||
const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
|
const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
struct hlsl_ir_node *arg1 = params->args[0], *arg2 = params->args[1], *cast1, *cast2;
|
struct hlsl_ir_node *arg1 = params->args[0], *arg2 = params->args[1], *cast1, *cast2;
|
||||||
enum hlsl_base_type base = expr_common_base_type(arg1->data_type->base_type, arg2->data_type->base_type);
|
enum hlsl_base_type base = expr_common_base_type(arg1->data_type->e.numeric.type, arg2->data_type->e.numeric.type);
|
||||||
struct hlsl_type *cast_type1 = arg1->data_type, *cast_type2 = arg2->data_type, *matrix_type, *ret_type;
|
struct hlsl_type *cast_type1 = arg1->data_type, *cast_type2 = arg2->data_type, *matrix_type, *ret_type;
|
||||||
unsigned int i, j, k, vect_count = 0;
|
unsigned int i, j, k, vect_count = 0;
|
||||||
struct hlsl_deref var_deref;
|
struct hlsl_deref var_deref;
|
||||||
@ -3821,7 +3818,7 @@ static bool intrinsic_refract(struct hlsl_ctx *ctx,
|
|||||||
if (!(res_type = elementwise_intrinsic_get_common_type(ctx, &mut_params, loc)))
|
if (!(res_type = elementwise_intrinsic_get_common_type(ctx, &mut_params, loc)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
base = expr_common_base_type(res_type->base_type, i_type->base_type);
|
base = expr_common_base_type(res_type->e.numeric.type, i_type->e.numeric.type);
|
||||||
base = base == HLSL_TYPE_HALF ? HLSL_TYPE_HALF : HLSL_TYPE_FLOAT;
|
base = base == HLSL_TYPE_HALF ? HLSL_TYPE_HALF : HLSL_TYPE_FLOAT;
|
||||||
res_type = convert_numeric_type(ctx, res_type, base);
|
res_type = convert_numeric_type(ctx, res_type, base);
|
||||||
idx_type = convert_numeric_type(ctx, i_type, base);
|
idx_type = convert_numeric_type(ctx, i_type, base);
|
||||||
@ -3881,7 +3878,7 @@ static bool intrinsic_sign(struct hlsl_ctx *ctx,
|
|||||||
struct hlsl_type *int_type = hlsl_get_numeric_type(ctx, arg->data_type->class, HLSL_TYPE_INT,
|
struct hlsl_type *int_type = hlsl_get_numeric_type(ctx, arg->data_type->class, HLSL_TYPE_INT,
|
||||||
arg->data_type->dimx, arg->data_type->dimy);
|
arg->data_type->dimx, arg->data_type->dimy);
|
||||||
|
|
||||||
if (!(zero = hlsl_new_constant(ctx, hlsl_get_scalar_type(ctx, arg->data_type->base_type), &zero_value, loc)))
|
if (!(zero = hlsl_new_constant(ctx, hlsl_get_scalar_type(ctx, arg->data_type->e.numeric.type), &zero_value, loc)))
|
||||||
return false;
|
return false;
|
||||||
hlsl_block_add_instr(params->instrs, zero);
|
hlsl_block_add_instr(params->instrs, zero);
|
||||||
|
|
||||||
@ -4254,7 +4251,7 @@ static bool intrinsic_transpose(struct hlsl_ctx *ctx,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
mat_type = hlsl_get_matrix_type(ctx, arg_type->base_type, arg_type->dimy, arg_type->dimx);
|
mat_type = hlsl_get_matrix_type(ctx, arg_type->e.numeric.type, arg_type->dimy, arg_type->dimx);
|
||||||
|
|
||||||
if (!(var = hlsl_new_synthetic_var(ctx, "transpose", mat_type, loc)))
|
if (!(var = hlsl_new_synthetic_var(ctx, "transpose", mat_type, loc)))
|
||||||
return false;
|
return false;
|
||||||
@ -4550,7 +4547,7 @@ static bool add_ternary(struct hlsl_ctx *ctx, struct hlsl_block *block,
|
|||||||
if (common_type->dimx == 1 && common_type->dimy == 1)
|
if (common_type->dimx == 1 && common_type->dimy == 1)
|
||||||
{
|
{
|
||||||
common_type = hlsl_get_numeric_type(ctx, cond_type->class,
|
common_type = hlsl_get_numeric_type(ctx, cond_type->class,
|
||||||
common_type->base_type, cond_type->dimx, cond_type->dimy);
|
common_type->e.numeric.type, cond_type->dimx, cond_type->dimy);
|
||||||
}
|
}
|
||||||
else if (cond_type->dimx != common_type->dimx || cond_type->dimy != common_type->dimy)
|
else if (cond_type->dimx != common_type->dimx || cond_type->dimy != common_type->dimy)
|
||||||
{
|
{
|
||||||
@ -4600,7 +4597,7 @@ static bool add_ternary(struct hlsl_ctx *ctx, struct hlsl_block *block,
|
|||||||
common_type = first->data_type;
|
common_type = first->data_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(cond->data_type->base_type == HLSL_TYPE_BOOL);
|
assert(cond->data_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
args[0] = cond;
|
args[0] = cond;
|
||||||
args[1] = first;
|
args[1] = first;
|
||||||
@ -4923,7 +4920,7 @@ static bool add_gather_method_call(struct hlsl_ctx *ctx, struct hlsl_block *bloc
|
|||||||
hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, sampler_dim), loc)))
|
hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, sampler_dim), loc)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
load_params.format = hlsl_get_vector_type(ctx, object_type->e.resource.format->base_type, 4);
|
load_params.format = hlsl_get_vector_type(ctx, object_type->e.resource.format->e.numeric.type, 4);
|
||||||
load_params.resource = object;
|
load_params.resource = object;
|
||||||
load_params.sampler = params->args[0];
|
load_params.sampler = params->args[0];
|
||||||
|
|
||||||
@ -6582,7 +6579,7 @@ type_no_void:
|
|||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
$$ = hlsl_type_clone(ctx, hlsl_get_vector_type(ctx, $3->base_type, $5), 0, 0);
|
$$ = hlsl_type_clone(ctx, hlsl_get_vector_type(ctx, $3->e.numeric.type, $5), 0, 0);
|
||||||
$$->is_minimum_precision = $3->is_minimum_precision;
|
$$->is_minimum_precision = $3->is_minimum_precision;
|
||||||
}
|
}
|
||||||
| KW_VECTOR
|
| KW_VECTOR
|
||||||
@ -6615,7 +6612,7 @@ type_no_void:
|
|||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
$$ = hlsl_type_clone(ctx, hlsl_get_matrix_type(ctx, $3->base_type, $7, $5), 0, 0);
|
$$ = hlsl_type_clone(ctx, hlsl_get_matrix_type(ctx, $3->e.numeric.type, $7, $5), 0, 0);
|
||||||
$$->is_minimum_precision = $3->is_minimum_precision;
|
$$->is_minimum_precision = $3->is_minimum_precision;
|
||||||
}
|
}
|
||||||
| KW_MATRIX
|
| KW_MATRIX
|
||||||
|
@ -263,8 +263,8 @@ static bool types_are_semantic_equivalent(struct hlsl_ctx *ctx, const struct hls
|
|||||||
if (type1->dimx != type2->dimx)
|
if (type1->dimx != type2->dimx)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return base_type_get_semantic_equivalent(type1->base_type)
|
return base_type_get_semantic_equivalent(type1->e.numeric.type)
|
||||||
== base_type_get_semantic_equivalent(type2->base_type);
|
== base_type_get_semantic_equivalent(type2->e.numeric.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
|
static struct hlsl_ir_var *add_semantic_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *var,
|
||||||
@ -355,10 +355,10 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, s
|
|||||||
if (!semantic->name)
|
if (!semantic->name)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vector_type_dst = hlsl_get_vector_type(ctx, type->base_type, hlsl_type_minor_size(type));
|
vector_type_dst = hlsl_get_vector_type(ctx, type->e.numeric.type, hlsl_type_minor_size(type));
|
||||||
vector_type_src = vector_type_dst;
|
vector_type_src = vector_type_dst;
|
||||||
if (ctx->profile->major_version < 4 && ctx->profile->type == VKD3D_SHADER_TYPE_VERTEX)
|
if (ctx->profile->major_version < 4 && ctx->profile->type == VKD3D_SHADER_TYPE_VERTEX)
|
||||||
vector_type_src = hlsl_get_vector_type(ctx, type->base_type, 4);
|
vector_type_src = hlsl_get_vector_type(ctx, type->e.numeric.type, 4);
|
||||||
|
|
||||||
for (i = 0; i < hlsl_type_major_size(type); ++i)
|
for (i = 0; i < hlsl_type_major_size(type); ++i)
|
||||||
{
|
{
|
||||||
@ -500,7 +500,7 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct hlsl_block *block, s
|
|||||||
if (!semantic->name)
|
if (!semantic->name)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
vector_type = hlsl_get_vector_type(ctx, type->base_type, hlsl_type_minor_size(type));
|
vector_type = hlsl_get_vector_type(ctx, type->e.numeric.type, hlsl_type_minor_size(type));
|
||||||
|
|
||||||
for (i = 0; i < hlsl_type_major_size(type); ++i)
|
for (i = 0; i < hlsl_type_major_size(type); ++i)
|
||||||
{
|
{
|
||||||
@ -1101,7 +1101,7 @@ static bool lower_index_loads(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
|||||||
struct hlsl_ir_node *resource_load;
|
struct hlsl_ir_node *resource_load;
|
||||||
|
|
||||||
assert(coords->data_type->class == HLSL_CLASS_VECTOR);
|
assert(coords->data_type->class == HLSL_CLASS_VECTOR);
|
||||||
assert(coords->data_type->base_type == HLSL_TYPE_UINT);
|
assert(coords->data_type->e.numeric.type == HLSL_TYPE_UINT);
|
||||||
assert(coords->data_type->dimx == dim_count);
|
assert(coords->data_type->dimx == dim_count);
|
||||||
|
|
||||||
if (!(coords = add_zero_mipmap_level(ctx, coords, &instr->loc)))
|
if (!(coords = add_zero_mipmap_level(ctx, coords, &instr->loc)))
|
||||||
@ -1191,7 +1191,7 @@ static bool lower_broadcasts(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, s
|
|||||||
{
|
{
|
||||||
struct hlsl_ir_node *new_cast, *swizzle;
|
struct hlsl_ir_node *new_cast, *swizzle;
|
||||||
|
|
||||||
dst_scalar_type = hlsl_get_scalar_type(ctx, dst_type->base_type);
|
dst_scalar_type = hlsl_get_scalar_type(ctx, dst_type->e.numeric.type);
|
||||||
/* We need to preserve the cast since it might be doing more than just
|
/* We need to preserve the cast since it might be doing more than just
|
||||||
* turning the scalar into a vector. */
|
* turning the scalar into a vector. */
|
||||||
if (!(new_cast = hlsl_new_cast(ctx, cast->operands[0].node, dst_scalar_type, &cast->node.loc)))
|
if (!(new_cast = hlsl_new_cast(ctx, cast->operands[0].node, dst_scalar_type, &cast->node.loc)))
|
||||||
@ -2065,7 +2065,7 @@ static bool fold_redundant_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *inst
|
|||||||
src_type = expr->operands[0].node->data_type;
|
src_type = expr->operands[0].node->data_type;
|
||||||
|
|
||||||
if (hlsl_types_are_equal(src_type, dst_type)
|
if (hlsl_types_are_equal(src_type, dst_type)
|
||||||
|| (src_type->base_type == dst_type->base_type && is_vec1(src_type) && is_vec1(dst_type)))
|
|| (src_type->e.numeric.type == dst_type->e.numeric.type && is_vec1(src_type) && is_vec1(dst_type)))
|
||||||
{
|
{
|
||||||
hlsl_replace_node(&expr->node, expr->operands[0].node);
|
hlsl_replace_node(&expr->node, expr->operands[0].node);
|
||||||
return true;
|
return true;
|
||||||
@ -2192,7 +2192,7 @@ static bool split_matrix_copies(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
|||||||
type = rhs->data_type;
|
type = rhs->data_type;
|
||||||
if (type->class != HLSL_CLASS_MATRIX)
|
if (type->class != HLSL_CLASS_MATRIX)
|
||||||
return false;
|
return false;
|
||||||
element_type = hlsl_get_vector_type(ctx, type->base_type, hlsl_type_minor_size(type));
|
element_type = hlsl_get_vector_type(ctx, type->e.numeric.type, hlsl_type_minor_size(type));
|
||||||
|
|
||||||
if (rhs->type != HLSL_IR_LOAD)
|
if (rhs->type != HLSL_IR_LOAD)
|
||||||
{
|
{
|
||||||
@ -2229,7 +2229,7 @@ static bool lower_narrowing_casts(struct hlsl_ctx *ctx, struct hlsl_ir_node *ins
|
|||||||
{
|
{
|
||||||
struct hlsl_ir_node *new_cast, *swizzle;
|
struct hlsl_ir_node *new_cast, *swizzle;
|
||||||
|
|
||||||
dst_vector_type = hlsl_get_vector_type(ctx, dst_type->base_type, src_type->dimx);
|
dst_vector_type = hlsl_get_vector_type(ctx, dst_type->e.numeric.type, src_type->dimx);
|
||||||
/* We need to preserve the cast since it might be doing more than just
|
/* We need to preserve the cast since it might be doing more than just
|
||||||
* narrowing the vector. */
|
* narrowing the vector. */
|
||||||
if (!(new_cast = hlsl_new_cast(ctx, cast->operands[0].node, dst_vector_type, &cast->node.loc)))
|
if (!(new_cast = hlsl_new_cast(ctx, cast->operands[0].node, dst_vector_type, &cast->node.loc)))
|
||||||
@ -2483,7 +2483,7 @@ static bool lower_nonconstant_vector_derefs(struct hlsl_ctx *ctx, struct hlsl_ir
|
|||||||
|
|
||||||
op = HLSL_OP2_DOT;
|
op = HLSL_OP2_DOT;
|
||||||
if (type->dimx == 1)
|
if (type->dimx == 1)
|
||||||
op = type->base_type == HLSL_TYPE_BOOL ? HLSL_OP2_LOGIC_AND : HLSL_OP2_MUL;
|
op = type->e.numeric.type == HLSL_TYPE_BOOL ? HLSL_OP2_LOGIC_AND : HLSL_OP2_MUL;
|
||||||
|
|
||||||
/* Note: We may be creating a DOT for bool vectors here, which we need to lower to
|
/* Note: We may be creating a DOT for bool vectors here, which we need to lower to
|
||||||
* LOGIC_OR + LOGIC_AND. */
|
* LOGIC_OR + LOGIC_AND. */
|
||||||
@ -2677,9 +2677,9 @@ static bool lower_casts_to_int(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
arg = expr->operands[0].node;
|
arg = expr->operands[0].node;
|
||||||
if (instr->data_type->base_type != HLSL_TYPE_INT && instr->data_type->base_type != HLSL_TYPE_UINT)
|
if (instr->data_type->e.numeric.type != HLSL_TYPE_INT && instr->data_type->e.numeric.type != HLSL_TYPE_UINT)
|
||||||
return false;
|
return false;
|
||||||
if (arg->data_type->base_type != HLSL_TYPE_FLOAT && arg->data_type->base_type != HLSL_TYPE_HALF)
|
if (arg->data_type->e.numeric.type != HLSL_TYPE_FLOAT && arg->data_type->e.numeric.type != HLSL_TYPE_HALF)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!(floor = hlsl_new_unary_expr(ctx, HLSL_OP1_FLOOR, arg, &instr->loc)))
|
if (!(floor = hlsl_new_unary_expr(ctx, HLSL_OP1_FLOOR, arg, &instr->loc)))
|
||||||
@ -2936,7 +2936,7 @@ static bool lower_logic_not(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, st
|
|||||||
float_type = hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, arg->data_type->dimx);
|
float_type = hlsl_get_vector_type(ctx, HLSL_TYPE_FLOAT, arg->data_type->dimx);
|
||||||
|
|
||||||
/* If this is happens, it means we failed to cast the argument to boolean somewhere. */
|
/* If this is happens, it means we failed to cast the argument to boolean somewhere. */
|
||||||
assert(arg->data_type->base_type == HLSL_TYPE_BOOL);
|
assert(arg->data_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
if (!(arg_cast = hlsl_new_cast(ctx, arg, float_type, &arg->loc)))
|
if (!(arg_cast = hlsl_new_cast(ctx, arg, float_type, &arg->loc)))
|
||||||
return false;
|
return false;
|
||||||
@ -2992,7 +2992,7 @@ static bool lower_ternary(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(cond->data_type->base_type == HLSL_TYPE_BOOL);
|
assert(cond->data_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
type = hlsl_get_numeric_type(ctx, instr->data_type->class, HLSL_TYPE_FLOAT,
|
type = hlsl_get_numeric_type(ctx, instr->data_type->class, HLSL_TYPE_FLOAT,
|
||||||
instr->data_type->dimx, instr->data_type->dimy);
|
instr->data_type->dimx, instr->data_type->dimy);
|
||||||
@ -3286,7 +3286,7 @@ static bool lower_casts_to_bool(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
|||||||
arg_type = expr->operands[0].node->data_type;
|
arg_type = expr->operands[0].node->data_type;
|
||||||
if (type->class > HLSL_CLASS_VECTOR || arg_type->class > HLSL_CLASS_VECTOR)
|
if (type->class > HLSL_CLASS_VECTOR || arg_type->class > HLSL_CLASS_VECTOR)
|
||||||
return false;
|
return false;
|
||||||
if (type->base_type != HLSL_TYPE_BOOL)
|
if (type->e.numeric.type != HLSL_TYPE_BOOL)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Narrowing casts should have already been lowered. */
|
/* Narrowing casts should have already been lowered. */
|
||||||
@ -3314,7 +3314,7 @@ struct hlsl_ir_node *hlsl_add_conditional(struct hlsl_ctx *ctx, struct hlsl_bloc
|
|||||||
|
|
||||||
assert(hlsl_types_are_equal(if_true->data_type, if_false->data_type));
|
assert(hlsl_types_are_equal(if_true->data_type, if_false->data_type));
|
||||||
|
|
||||||
if (cond_type->base_type != HLSL_TYPE_BOOL)
|
if (cond_type->e.numeric.type != HLSL_TYPE_BOOL)
|
||||||
{
|
{
|
||||||
cond_type = hlsl_get_numeric_type(ctx, cond_type->class, HLSL_TYPE_BOOL, cond_type->dimx, cond_type->dimy);
|
cond_type = hlsl_get_numeric_type(ctx, cond_type->class, HLSL_TYPE_BOOL, cond_type->dimx, cond_type->dimy);
|
||||||
|
|
||||||
@ -3350,7 +3350,7 @@ static bool lower_int_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
|||||||
return false;
|
return false;
|
||||||
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
||||||
return false;
|
return false;
|
||||||
if (type->base_type != HLSL_TYPE_INT)
|
if (type->e.numeric.type != HLSL_TYPE_INT)
|
||||||
return false;
|
return false;
|
||||||
utype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_UINT, type->dimx, type->dimy);
|
utype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_UINT, type->dimx, type->dimy);
|
||||||
|
|
||||||
@ -3416,7 +3416,7 @@ static bool lower_int_modulus(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
|
|||||||
return false;
|
return false;
|
||||||
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
||||||
return false;
|
return false;
|
||||||
if (type->base_type != HLSL_TYPE_INT)
|
if (type->e.numeric.type != HLSL_TYPE_INT)
|
||||||
return false;
|
return false;
|
||||||
utype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_UINT, type->dimx, type->dimy);
|
utype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_UINT, type->dimx, type->dimy);
|
||||||
|
|
||||||
@ -3475,7 +3475,7 @@ static bool lower_int_abs(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru
|
|||||||
return false;
|
return false;
|
||||||
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
||||||
return false;
|
return false;
|
||||||
if (type->base_type != HLSL_TYPE_INT)
|
if (type->e.numeric.type != HLSL_TYPE_INT)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
arg = expr->operands[0].node;
|
arg = expr->operands[0].node;
|
||||||
@ -3506,14 +3506,14 @@ static bool lower_int_dot(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, stru
|
|||||||
if (expr->op != HLSL_OP2_DOT)
|
if (expr->op != HLSL_OP2_DOT)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (type->base_type == HLSL_TYPE_INT || type->base_type == HLSL_TYPE_UINT
|
if (type->e.numeric.type == HLSL_TYPE_INT || type->e.numeric.type == HLSL_TYPE_UINT
|
||||||
|| type->base_type == HLSL_TYPE_BOOL)
|
|| type->e.numeric.type == HLSL_TYPE_BOOL)
|
||||||
{
|
{
|
||||||
arg1 = expr->operands[0].node;
|
arg1 = expr->operands[0].node;
|
||||||
arg2 = expr->operands[1].node;
|
arg2 = expr->operands[1].node;
|
||||||
assert(arg1->data_type->dimx == arg2->data_type->dimx);
|
assert(arg1->data_type->dimx == arg2->data_type->dimx);
|
||||||
dimx = arg1->data_type->dimx;
|
dimx = arg1->data_type->dimx;
|
||||||
is_bool = type->base_type == HLSL_TYPE_BOOL;
|
is_bool = type->e.numeric.type == HLSL_TYPE_BOOL;
|
||||||
|
|
||||||
if (!(mult = hlsl_new_binary_expr(ctx, is_bool ? HLSL_OP2_LOGIC_AND : HLSL_OP2_MUL, arg1, arg2)))
|
if (!(mult = hlsl_new_binary_expr(ctx, is_bool ? HLSL_OP2_LOGIC_AND : HLSL_OP2_MUL, arg1, arg2)))
|
||||||
return false;
|
return false;
|
||||||
@ -3559,7 +3559,7 @@ static bool lower_float_modulus(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr
|
|||||||
return false;
|
return false;
|
||||||
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
if (type->class != HLSL_CLASS_SCALAR && type->class != HLSL_CLASS_VECTOR)
|
||||||
return false;
|
return false;
|
||||||
if (type->base_type != HLSL_TYPE_FLOAT)
|
if (type->e.numeric.type != HLSL_TYPE_FLOAT)
|
||||||
return false;
|
return false;
|
||||||
btype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_BOOL, type->dimx, type->dimy);
|
btype = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_BOOL, type->dimx, type->dimy);
|
||||||
|
|
||||||
@ -3615,7 +3615,7 @@ static bool lower_nonfloat_exprs(struct hlsl_ctx *ctx, struct hlsl_ir_node *inst
|
|||||||
if (instr->type != HLSL_IR_EXPR)
|
if (instr->type != HLSL_IR_EXPR)
|
||||||
return false;
|
return false;
|
||||||
expr = hlsl_ir_expr(instr);
|
expr = hlsl_ir_expr(instr);
|
||||||
if (expr->op == HLSL_OP1_CAST || instr->data_type->base_type == HLSL_TYPE_FLOAT)
|
if (expr->op == HLSL_OP1_CAST || instr->data_type->e.numeric.type == HLSL_TYPE_FLOAT)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (expr->op)
|
switch (expr->op)
|
||||||
@ -4454,7 +4454,7 @@ static void allocate_const_registers_recurse(struct hlsl_ctx *ctx,
|
|||||||
continue;
|
continue;
|
||||||
value = &constant->value.u[i++];
|
value = &constant->value.u[i++];
|
||||||
|
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
f = !!value->u;
|
f = !!value->u;
|
||||||
@ -5047,7 +5047,7 @@ bool hlsl_component_index_range_from_deref(struct hlsl_ctx *ctx, const struct hl
|
|||||||
|
|
||||||
/* We should always have generated a cast to UINT. */
|
/* We should always have generated a cast to UINT. */
|
||||||
assert(path_node->data_type->class == HLSL_CLASS_SCALAR
|
assert(path_node->data_type->class == HLSL_CLASS_SCALAR
|
||||||
&& path_node->data_type->base_type == HLSL_TYPE_UINT);
|
&& path_node->data_type->e.numeric.type == HLSL_TYPE_UINT);
|
||||||
|
|
||||||
idx = hlsl_ir_constant(path_node)->value.u[0].u;
|
idx = hlsl_ir_constant(path_node)->value.u[0].u;
|
||||||
|
|
||||||
@ -5123,7 +5123,7 @@ bool hlsl_regset_index_from_deref(struct hlsl_ctx *ctx, const struct hlsl_deref
|
|||||||
|
|
||||||
/* We should always have generated a cast to UINT. */
|
/* We should always have generated a cast to UINT. */
|
||||||
assert(path_node->data_type->class == HLSL_CLASS_SCALAR
|
assert(path_node->data_type->class == HLSL_CLASS_SCALAR
|
||||||
&& path_node->data_type->base_type == HLSL_TYPE_UINT);
|
&& path_node->data_type->e.numeric.type == HLSL_TYPE_UINT);
|
||||||
|
|
||||||
idx = hlsl_ir_constant(path_node)->value.u[0].u;
|
idx = hlsl_ir_constant(path_node)->value.u[0].u;
|
||||||
|
|
||||||
@ -5163,7 +5163,7 @@ bool hlsl_offset_from_deref(struct hlsl_ctx *ctx, const struct hlsl_deref *deref
|
|||||||
{
|
{
|
||||||
/* We should always have generated a cast to UINT. */
|
/* We should always have generated a cast to UINT. */
|
||||||
assert(offset_node->data_type->class == HLSL_CLASS_SCALAR
|
assert(offset_node->data_type->class == HLSL_CLASS_SCALAR
|
||||||
&& offset_node->data_type->base_type == HLSL_TYPE_UINT);
|
&& offset_node->data_type->e.numeric.type == HLSL_TYPE_UINT);
|
||||||
assert(offset_node->type != HLSL_IR_CONSTANT);
|
assert(offset_node->type != HLSL_IR_CONSTANT);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -5230,7 +5230,7 @@ static void parse_numthreads_attribute(struct hlsl_ctx *ctx, const struct hlsl_a
|
|||||||
const struct hlsl_ir_constant *constant;
|
const struct hlsl_ir_constant *constant;
|
||||||
|
|
||||||
if (type->class != HLSL_CLASS_SCALAR
|
if (type->class != HLSL_CLASS_SCALAR
|
||||||
|| (type->base_type != HLSL_TYPE_INT && type->base_type != HLSL_TYPE_UINT))
|
|| (type->e.numeric.type != HLSL_TYPE_INT && type->e.numeric.type != HLSL_TYPE_UINT))
|
||||||
{
|
{
|
||||||
struct vkd3d_string_buffer *string;
|
struct vkd3d_string_buffer *string;
|
||||||
|
|
||||||
@ -5249,8 +5249,8 @@ static void parse_numthreads_attribute(struct hlsl_ctx *ctx, const struct hlsl_a
|
|||||||
}
|
}
|
||||||
constant = hlsl_ir_constant(instr);
|
constant = hlsl_ir_constant(instr);
|
||||||
|
|
||||||
if ((type->base_type == HLSL_TYPE_INT && constant->value.u[0].i <= 0)
|
if ((type->e.numeric.type == HLSL_TYPE_INT && constant->value.u[0].i <= 0)
|
||||||
|| (type->base_type == HLSL_TYPE_UINT && !constant->value.u[0].u))
|
|| (type->e.numeric.type == HLSL_TYPE_UINT && !constant->value.u[0].u))
|
||||||
hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_THREAD_COUNT,
|
hlsl_error(ctx, &instr->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_THREAD_COUNT,
|
||||||
"Thread count must be a positive integer.");
|
"Thread count must be a positive integer.");
|
||||||
|
|
||||||
|
@ -25,10 +25,10 @@
|
|||||||
static bool fold_abs(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_abs(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -116,10 +116,10 @@ static int32_t double_to_int(double x)
|
|||||||
static bool fold_bit_not(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_bit_not(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -158,7 +158,7 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (src->node.data_type->base_type)
|
switch (src->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -200,7 +200,7 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
vkd3d_unreachable();
|
vkd3d_unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -231,10 +231,10 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_ceil(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_ceil(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -257,10 +257,10 @@ static bool fold_ceil(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_exp2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_exp2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -283,10 +283,10 @@ static bool fold_exp2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_floor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_floor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -309,11 +309,11 @@ static bool fold_floor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_fract(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_fract(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
float i;
|
float i;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -336,10 +336,10 @@ static bool fold_fract(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_log2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_log2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -381,10 +381,10 @@ static bool fold_log2(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, con
|
|||||||
static bool fold_neg(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_neg(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -415,10 +415,10 @@ static bool fold_neg(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_not(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
static bool fold_not(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
||||||
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
const struct hlsl_type *dst_type, const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -439,10 +439,10 @@ static bool fold_not(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_rcp(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_rcp(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -484,10 +484,10 @@ static bool fold_rcp(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_rsq(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_rsq(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -524,10 +524,10 @@ static bool fold_rsq(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_sat(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_sat(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src)
|
const struct hlsl_ir_constant *src)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -550,10 +550,10 @@ static bool fold_sat(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_sqrt(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_sqrt(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
const struct hlsl_ir_constant *src, const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src->node.data_type->base_type);
|
assert(type == src->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -595,11 +595,11 @@ static bool fold_sqrt(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, con
|
|||||||
static bool fold_add(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_add(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -632,11 +632,11 @@ static bool fold_add(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_and(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_and(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -659,11 +659,11 @@ static bool fold_and(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_or(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_or(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -686,11 +686,11 @@ static bool fold_or(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const
|
|||||||
static bool fold_bit_xor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_bit_xor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -712,11 +712,11 @@ static bool fold_bit_xor(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
static bool fold_dot(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_dot(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
assert(src1->node.data_type->dimx == src2->node.data_type->dimx);
|
assert(src1->node.data_type->dimx == src2->node.data_type->dimx);
|
||||||
|
|
||||||
dst->u[0].f = 0.0f;
|
dst->u[0].f = 0.0f;
|
||||||
@ -740,12 +740,12 @@ static bool fold_dot(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_dp2add(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_dp2add(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2, const struct hlsl_ir_constant *src3)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2, const struct hlsl_ir_constant *src3)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
assert(type == src3->node.data_type->base_type);
|
assert(type == src3->node.data_type->e.numeric.type);
|
||||||
assert(src1->node.data_type->dimx == src2->node.data_type->dimx);
|
assert(src1->node.data_type->dimx == src2->node.data_type->dimx);
|
||||||
assert(src3->node.data_type->dimx == 1);
|
assert(src3->node.data_type->dimx == 1);
|
||||||
|
|
||||||
@ -771,11 +771,11 @@ static bool fold_div(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2,
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2,
|
||||||
const struct vkd3d_shader_location *loc)
|
const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -841,12 +841,12 @@ static bool fold_equal(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, co
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
assert(src1->node.data_type->base_type == src2->node.data_type->base_type);
|
assert(src1->node.data_type->e.numeric.type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -877,12 +877,12 @@ static bool fold_gequal(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, c
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
assert(src1->node.data_type->base_type == src2->node.data_type->base_type);
|
assert(src1->node.data_type->e.numeric.type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -916,12 +916,12 @@ static bool fold_less(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, con
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
assert(src1->node.data_type->base_type == src2->node.data_type->base_type);
|
assert(src1->node.data_type->e.numeric.type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -955,14 +955,14 @@ static bool fold_lshift(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, c
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == src1->node.data_type->base_type);
|
assert(dst_type->e.numeric.type == src1->node.data_type->e.numeric.type);
|
||||||
assert(src2->node.data_type->base_type == HLSL_TYPE_INT);
|
assert(src2->node.data_type->e.numeric.type == HLSL_TYPE_INT);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
unsigned int shift = src2->value.u[k].u % 32;
|
unsigned int shift = src2->value.u[k].u % 32;
|
||||||
|
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
dst->u[k].i = src1->value.u[k].i << shift;
|
dst->u[k].i = src1->value.u[k].i << shift;
|
||||||
@ -983,11 +983,11 @@ static bool fold_lshift(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, c
|
|||||||
static bool fold_max(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_max(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -1021,11 +1021,11 @@ static bool fold_max(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_min(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_min(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -1060,11 +1060,11 @@ static bool fold_mod(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2,
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2,
|
||||||
const struct vkd3d_shader_location *loc)
|
const struct vkd3d_shader_location *loc)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -1102,11 +1102,11 @@ static bool fold_mod(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, cons
|
|||||||
static bool fold_mul(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
static bool fold_mul(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, const struct hlsl_type *dst_type,
|
||||||
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
const struct hlsl_ir_constant *src1, const struct hlsl_ir_constant *src2)
|
||||||
{
|
{
|
||||||
enum hlsl_base_type type = dst_type->base_type;
|
enum hlsl_base_type type = dst_type->e.numeric.type;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(type == src1->node.data_type->base_type);
|
assert(type == src1->node.data_type->e.numeric.type);
|
||||||
assert(type == src2->node.data_type->base_type);
|
assert(type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
@ -1139,12 +1139,12 @@ static bool fold_nequal(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, c
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
assert(src1->node.data_type->base_type == src2->node.data_type->base_type);
|
assert(src1->node.data_type->e.numeric.type == src2->node.data_type->e.numeric.type);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -1175,9 +1175,9 @@ static bool fold_ternary(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst,
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == src2->node.data_type->base_type);
|
assert(dst_type->e.numeric.type == src2->node.data_type->e.numeric.type);
|
||||||
assert(dst_type->base_type == src3->node.data_type->base_type);
|
assert(dst_type->e.numeric.type == src3->node.data_type->e.numeric.type);
|
||||||
assert(src1->node.data_type->base_type == HLSL_TYPE_BOOL);
|
assert(src1->node.data_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
dst->u[k] = src1->value.u[k].u ? src2->value.u[k] : src3->value.u[k];
|
dst->u[k] = src1->value.u[k].u ? src2->value.u[k] : src3->value.u[k];
|
||||||
@ -1190,14 +1190,14 @@ static bool fold_rshift(struct hlsl_ctx *ctx, struct hlsl_constant_value *dst, c
|
|||||||
{
|
{
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
assert(dst_type->base_type == src1->node.data_type->base_type);
|
assert(dst_type->e.numeric.type == src1->node.data_type->e.numeric.type);
|
||||||
assert(src2->node.data_type->base_type == HLSL_TYPE_INT);
|
assert(src2->node.data_type->e.numeric.type == HLSL_TYPE_INT);
|
||||||
|
|
||||||
for (k = 0; k < dst_type->dimx; ++k)
|
for (k = 0; k < dst_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
unsigned int shift = src2->value.u[k].u % 32;
|
unsigned int shift = src2->value.u[k].u % 32;
|
||||||
|
|
||||||
switch (src1->node.data_type->base_type)
|
switch (src1->node.data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
dst->u[k].i = src1->value.u[k].i >> shift;
|
dst->u[k].i = src1->value.u[k].i >> shift;
|
||||||
@ -1403,7 +1403,7 @@ static bool constant_is_zero(struct hlsl_ir_constant *const_arg)
|
|||||||
|
|
||||||
for (k = 0; k < data_type->dimx; ++k)
|
for (k = 0; k < data_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (data_type->base_type)
|
switch (data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -1437,7 +1437,7 @@ static bool constant_is_one(struct hlsl_ir_constant *const_arg)
|
|||||||
|
|
||||||
for (k = 0; k < data_type->dimx; ++k)
|
for (k = 0; k < data_type->dimx; ++k)
|
||||||
{
|
{
|
||||||
switch (data_type->base_type)
|
switch (data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
|
@ -2744,7 +2744,7 @@ static void write_sm4_block(const struct tpf_writer *tpf, const struct hlsl_bloc
|
|||||||
|
|
||||||
static bool type_is_integer(const struct hlsl_type *type)
|
static bool type_is_integer(const struct hlsl_type *type)
|
||||||
{
|
{
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
@ -2933,7 +2933,7 @@ static void write_sm4_signature(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc,
|
|||||||
put_u32(&buffer, 0); /* name */
|
put_u32(&buffer, 0); /* name */
|
||||||
put_u32(&buffer, usage_idx);
|
put_u32(&buffer, usage_idx);
|
||||||
put_u32(&buffer, usage);
|
put_u32(&buffer, usage);
|
||||||
switch (var->data_type->base_type)
|
switch (var->data_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
@ -3026,7 +3026,7 @@ static D3D_SHADER_VARIABLE_CLASS sm4_class(const struct hlsl_type *type)
|
|||||||
|
|
||||||
static D3D_SHADER_VARIABLE_TYPE sm4_base_type(const struct hlsl_type *type)
|
static D3D_SHADER_VARIABLE_TYPE sm4_base_type(const struct hlsl_type *type)
|
||||||
{
|
{
|
||||||
switch (type->base_type)
|
switch (type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_BOOL:
|
case HLSL_TYPE_BOOL:
|
||||||
return D3D_SVT_BOOL;
|
return D3D_SVT_BOOL;
|
||||||
@ -3140,7 +3140,7 @@ static D3D_RESOURCE_RETURN_TYPE sm4_resource_format(const struct hlsl_type *type
|
|||||||
if (type->class == HLSL_CLASS_ARRAY)
|
if (type->class == HLSL_CLASS_ARRAY)
|
||||||
return sm4_resource_format(type->e.array.type);
|
return sm4_resource_format(type->e.array.type);
|
||||||
|
|
||||||
switch (type->e.resource.format->base_type)
|
switch (type->e.resource.format->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_DOUBLE:
|
case HLSL_TYPE_DOUBLE:
|
||||||
return D3D_RETURN_TYPE_DOUBLE;
|
return D3D_RETURN_TYPE_DOUBLE;
|
||||||
@ -4728,11 +4728,11 @@ static void write_sm4_sampleinfo(const struct tpf_writer *tpf, const struct hlsl
|
|||||||
const struct hlsl_ir_node *dst = &load->node;
|
const struct hlsl_ir_node *dst = &load->node;
|
||||||
struct sm4_instruction instr;
|
struct sm4_instruction instr;
|
||||||
|
|
||||||
assert(dst->data_type->base_type == HLSL_TYPE_UINT || dst->data_type->base_type == HLSL_TYPE_FLOAT);
|
assert(dst->data_type->e.numeric.type == HLSL_TYPE_UINT || dst->data_type->e.numeric.type == HLSL_TYPE_FLOAT);
|
||||||
|
|
||||||
memset(&instr, 0, sizeof(instr));
|
memset(&instr, 0, sizeof(instr));
|
||||||
instr.opcode = VKD3D_SM4_OP_SAMPLE_INFO;
|
instr.opcode = VKD3D_SM4_OP_SAMPLE_INFO;
|
||||||
if (dst->data_type->base_type == HLSL_TYPE_UINT)
|
if (dst->data_type->e.numeric.type == HLSL_TYPE_UINT)
|
||||||
instr.extra_bits |= VKD3DSI_SAMPLE_INFO_UINT << VKD3D_SM4_INSTRUCTION_FLAGS_SHIFT;
|
instr.extra_bits |= VKD3DSI_SAMPLE_INFO_UINT << VKD3D_SM4_INSTRUCTION_FLAGS_SHIFT;
|
||||||
|
|
||||||
sm4_dst_from_node(&instr.dsts[0], dst);
|
sm4_dst_from_node(&instr.dsts[0], dst);
|
||||||
@ -4757,11 +4757,11 @@ static void write_sm4_resinfo(const struct tpf_writer *tpf, const struct hlsl_ir
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(dst->data_type->base_type == HLSL_TYPE_UINT || dst->data_type->base_type == HLSL_TYPE_FLOAT);
|
assert(dst->data_type->e.numeric.type == HLSL_TYPE_UINT || dst->data_type->e.numeric.type == HLSL_TYPE_FLOAT);
|
||||||
|
|
||||||
memset(&instr, 0, sizeof(instr));
|
memset(&instr, 0, sizeof(instr));
|
||||||
instr.opcode = VKD3D_SM4_OP_RESINFO;
|
instr.opcode = VKD3D_SM4_OP_RESINFO;
|
||||||
if (dst->data_type->base_type == HLSL_TYPE_UINT)
|
if (dst->data_type->e.numeric.type == HLSL_TYPE_UINT)
|
||||||
instr.extra_bits |= VKD3DSI_RESINFO_UINT << VKD3D_SM4_INSTRUCTION_FLAGS_SHIFT;
|
instr.extra_bits |= VKD3DSI_RESINFO_UINT << VKD3D_SM4_INSTRUCTION_FLAGS_SHIFT;
|
||||||
|
|
||||||
sm4_dst_from_node(&instr.dsts[0], dst);
|
sm4_dst_from_node(&instr.dsts[0], dst);
|
||||||
@ -4776,7 +4776,7 @@ static void write_sm4_resinfo(const struct tpf_writer *tpf, const struct hlsl_ir
|
|||||||
|
|
||||||
static bool type_is_float(const struct hlsl_type *type)
|
static bool type_is_float(const struct hlsl_type *type)
|
||||||
{
|
{
|
||||||
return type->base_type == HLSL_TYPE_FLOAT || type->base_type == HLSL_TYPE_HALF;
|
return type->e.numeric.type == HLSL_TYPE_FLOAT || type->e.numeric.type == HLSL_TYPE_HALF;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void write_sm4_cast_from_bool(const struct tpf_writer *tpf, const struct hlsl_ir_expr *expr,
|
static void write_sm4_cast_from_bool(const struct tpf_writer *tpf, const struct hlsl_ir_expr *expr,
|
||||||
@ -4813,11 +4813,11 @@ static void write_sm4_cast(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
/* Narrowing casts were already lowered. */
|
/* Narrowing casts were already lowered. */
|
||||||
assert(src_type->dimx == dst_type->dimx);
|
assert(src_type->dimx == dst_type->dimx);
|
||||||
|
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
@ -4846,7 +4846,7 @@ static void write_sm4_cast(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_TYPE_INT:
|
case HLSL_TYPE_INT:
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
@ -4872,7 +4872,7 @@ static void write_sm4_cast(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_TYPE_UINT:
|
case HLSL_TYPE_UINT:
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_HALF:
|
case HLSL_TYPE_HALF:
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
@ -4942,7 +4942,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
switch (expr->op)
|
switch (expr->op)
|
||||||
{
|
{
|
||||||
case HLSL_OP1_ABS:
|
case HLSL_OP1_ABS:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_unary_op(tpf, VKD3D_SM4_OP_MOV, &expr->node, arg1, VKD3DSPSM_ABS);
|
write_sm4_unary_op(tpf, VKD3D_SM4_OP_MOV, &expr->node, arg1, VKD3DSPSM_ABS);
|
||||||
@ -5023,12 +5023,12 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP1_LOGIC_NOT:
|
case HLSL_OP1_LOGIC_NOT:
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
write_sm4_unary_op(tpf, VKD3D_SM4_OP_NOT, &expr->node, arg1, 0);
|
write_sm4_unary_op(tpf, VKD3D_SM4_OP_NOT, &expr->node, arg1, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP1_NEG:
|
case HLSL_OP1_NEG:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_unary_op(tpf, VKD3D_SM4_OP_MOV, &expr->node, arg1, VKD3DSPSM_NEG);
|
write_sm4_unary_op(tpf, VKD3D_SM4_OP_MOV, &expr->node, arg1, VKD3DSPSM_NEG);
|
||||||
@ -5081,7 +5081,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_ADD:
|
case HLSL_OP2_ADD:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_ADD, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_ADD, &expr->node, arg1, arg2);
|
||||||
@ -5113,7 +5113,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_DIV:
|
case HLSL_OP2_DIV:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_DIV, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_DIV, &expr->node, arg1, arg2);
|
||||||
@ -5129,7 +5129,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_DOT:
|
case HLSL_OP2_DOT:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
switch (arg1->data_type->dimx)
|
switch (arg1->data_type->dimx)
|
||||||
@ -5161,9 +5161,9 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
{
|
{
|
||||||
const struct hlsl_type *src_type = arg1->data_type;
|
const struct hlsl_type *src_type = arg1->data_type;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_EQ, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_EQ, &expr->node, arg1, arg2);
|
||||||
@ -5187,9 +5187,9 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
{
|
{
|
||||||
const struct hlsl_type *src_type = arg1->data_type;
|
const struct hlsl_type *src_type = arg1->data_type;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_GE, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_GE, &expr->node, arg1, arg2);
|
||||||
@ -5216,9 +5216,9 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
{
|
{
|
||||||
const struct hlsl_type *src_type = arg1->data_type;
|
const struct hlsl_type *src_type = arg1->data_type;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_LT, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_LT, &expr->node, arg1, arg2);
|
||||||
@ -5242,23 +5242,23 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
}
|
}
|
||||||
|
|
||||||
case HLSL_OP2_LOGIC_AND:
|
case HLSL_OP2_LOGIC_AND:
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_AND, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_AND, &expr->node, arg1, arg2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_LOGIC_OR:
|
case HLSL_OP2_LOGIC_OR:
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_OR, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_OR, &expr->node, arg1, arg2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_LSHIFT:
|
case HLSL_OP2_LSHIFT:
|
||||||
assert(type_is_integer(dst_type));
|
assert(type_is_integer(dst_type));
|
||||||
assert(dst_type->base_type != HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type != HLSL_TYPE_BOOL);
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_ISHL, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_ISHL, &expr->node, arg1, arg2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_MAX:
|
case HLSL_OP2_MAX:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MAX, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MAX, &expr->node, arg1, arg2);
|
||||||
@ -5278,7 +5278,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_MIN:
|
case HLSL_OP2_MIN:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MIN, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MIN, &expr->node, arg1, arg2);
|
||||||
@ -5298,7 +5298,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_MOD:
|
case HLSL_OP2_MOD:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_UINT:
|
case HLSL_TYPE_UINT:
|
||||||
write_sm4_binary_op_with_two_destinations(tpf, VKD3D_SM4_OP_UDIV, &expr->node, 1, arg1, arg2);
|
write_sm4_binary_op_with_two_destinations(tpf, VKD3D_SM4_OP_UDIV, &expr->node, 1, arg1, arg2);
|
||||||
@ -5310,7 +5310,7 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HLSL_OP2_MUL:
|
case HLSL_OP2_MUL:
|
||||||
switch (dst_type->base_type)
|
switch (dst_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MUL, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_MUL, &expr->node, arg1, arg2);
|
||||||
@ -5332,9 +5332,9 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
{
|
{
|
||||||
const struct hlsl_type *src_type = arg1->data_type;
|
const struct hlsl_type *src_type = arg1->data_type;
|
||||||
|
|
||||||
assert(dst_type->base_type == HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type == HLSL_TYPE_BOOL);
|
||||||
|
|
||||||
switch (src_type->base_type)
|
switch (src_type->e.numeric.type)
|
||||||
{
|
{
|
||||||
case HLSL_TYPE_FLOAT:
|
case HLSL_TYPE_FLOAT:
|
||||||
write_sm4_binary_op(tpf, VKD3D_SM4_OP_NE, &expr->node, arg1, arg2);
|
write_sm4_binary_op(tpf, VKD3D_SM4_OP_NE, &expr->node, arg1, arg2);
|
||||||
@ -5356,8 +5356,8 @@ static void write_sm4_expr(const struct tpf_writer *tpf, const struct hlsl_ir_ex
|
|||||||
|
|
||||||
case HLSL_OP2_RSHIFT:
|
case HLSL_OP2_RSHIFT:
|
||||||
assert(type_is_integer(dst_type));
|
assert(type_is_integer(dst_type));
|
||||||
assert(dst_type->base_type != HLSL_TYPE_BOOL);
|
assert(dst_type->e.numeric.type != HLSL_TYPE_BOOL);
|
||||||
write_sm4_binary_op(tpf, dst_type->base_type == HLSL_TYPE_INT ? VKD3D_SM4_OP_ISHR : VKD3D_SM4_OP_USHR,
|
write_sm4_binary_op(tpf, dst_type->e.numeric.type == HLSL_TYPE_INT ? VKD3D_SM4_OP_ISHR : VKD3D_SM4_OP_USHR,
|
||||||
&expr->node, arg1, arg2);
|
&expr->node, arg1, arg2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -5459,7 +5459,7 @@ static void write_sm4_load(const struct tpf_writer *tpf, const struct hlsl_ir_lo
|
|||||||
instr.dst_count = 1;
|
instr.dst_count = 1;
|
||||||
|
|
||||||
assert(hlsl_is_numeric_type(type));
|
assert(hlsl_is_numeric_type(type));
|
||||||
if (type->base_type == HLSL_TYPE_BOOL && var_is_user_input(tpf->ctx, load->src.var))
|
if (type->e.numeric.type == HLSL_TYPE_BOOL && var_is_user_input(tpf->ctx, load->src.var))
|
||||||
{
|
{
|
||||||
struct hlsl_constant_value value;
|
struct hlsl_constant_value value;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user