mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/hlsl: Support dot() for SM1.
This commit is contained in:
committed by
Alexandre Julliard
parent
68c232cfab
commit
06f300ec59
Notes:
Alexandre Julliard
2023-02-02 22:14:28 +01:00
Approved-by: Zebediah Figura (@zfigura) Approved-by: Francisco Casas (@fcasas) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/74
@@ -422,7 +422,7 @@ struct sm1_instruction
|
||||
D3DSHADER_PARAM_SRCMOD_TYPE mod;
|
||||
unsigned int swizzle;
|
||||
uint32_t reg;
|
||||
} srcs[2];
|
||||
} srcs[3];
|
||||
unsigned int src_count;
|
||||
|
||||
unsigned int has_dst;
|
||||
@@ -459,6 +459,33 @@ static void write_sm1_instruction(struct hlsl_ctx *ctx, struct vkd3d_bytecode_bu
|
||||
write_sm1_src_register(buffer, &instr->srcs[i], instr->dst.writemask);
|
||||
};
|
||||
|
||||
static void write_sm1_ternary_op(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer,
|
||||
D3DSHADER_INSTRUCTION_OPCODE_TYPE opcode, const struct hlsl_reg *dst,
|
||||
const struct hlsl_reg *src1, const struct hlsl_reg *src2, const struct hlsl_reg *src3)
|
||||
{
|
||||
const struct sm1_instruction instr =
|
||||
{
|
||||
.opcode = opcode,
|
||||
|
||||
.dst.type = D3DSPR_TEMP,
|
||||
.dst.writemask = dst->writemask,
|
||||
.dst.reg = dst->id,
|
||||
.has_dst = 1,
|
||||
|
||||
.srcs[0].type = D3DSPR_TEMP,
|
||||
.srcs[0].swizzle = hlsl_swizzle_from_writemask(src1->writemask),
|
||||
.srcs[0].reg = src1->id,
|
||||
.srcs[1].type = D3DSPR_TEMP,
|
||||
.srcs[1].swizzle = hlsl_swizzle_from_writemask(src2->writemask),
|
||||
.srcs[1].reg = src2->id,
|
||||
.srcs[2].type = D3DSPR_TEMP,
|
||||
.srcs[2].swizzle = hlsl_swizzle_from_writemask(src3->writemask),
|
||||
.srcs[2].reg = src3->id,
|
||||
.src_count = 3,
|
||||
};
|
||||
write_sm1_instruction(ctx, buffer, &instr);
|
||||
}
|
||||
|
||||
static void write_sm1_binary_op(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer,
|
||||
D3DSHADER_INSTRUCTION_OPCODE_TYPE opcode, const struct hlsl_reg *dst,
|
||||
const struct hlsl_reg *src1, const struct hlsl_reg *src2)
|
||||
@@ -631,6 +658,7 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
|
||||
struct hlsl_ir_expr *expr = hlsl_ir_expr(instr);
|
||||
struct hlsl_ir_node *arg1 = expr->operands[0].node;
|
||||
struct hlsl_ir_node *arg2 = expr->operands[1].node;
|
||||
struct hlsl_ir_node *arg3 = expr->operands[2].node;
|
||||
|
||||
assert(instr->reg.allocated);
|
||||
|
||||
@@ -679,6 +707,26 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b
|
||||
write_sm1_unary_op(ctx, buffer, D3DSIO_FRC, &instr->reg, &arg1->reg, D3DSPSM_NONE);
|
||||
break;
|
||||
|
||||
case HLSL_OP2_DOT:
|
||||
switch (arg1->data_type->dimx)
|
||||
{
|
||||
case 4:
|
||||
write_sm1_binary_op(ctx, buffer, D3DSIO_DP4, &instr->reg, &arg1->reg, &arg2->reg);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
write_sm1_binary_op(ctx, buffer, D3DSIO_DP3, &instr->reg, &arg1->reg, &arg2->reg);
|
||||
break;
|
||||
|
||||
default:
|
||||
vkd3d_unreachable();
|
||||
}
|
||||
break;
|
||||
|
||||
case HLSL_OP3_DP2ADD:
|
||||
write_sm1_ternary_op(ctx, buffer, D3DSIO_DP2ADD, &instr->reg, &arg1->reg, &arg2->reg, &arg3->reg);
|
||||
break;
|
||||
|
||||
default:
|
||||
hlsl_fixme(ctx, &instr->loc, "SM1 \"%s\" expression.", debug_hlsl_expr_op(expr->op));
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user