mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d-shader/sm4: Parse register modifiers separately from the extended operand type.
Signed-off-by: Conor McCarthy <cmccarthy@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
859f80930d
commit
cddd978be6
@ -1166,7 +1166,9 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
|
|||||||
enum vkd3d_shader_src_modifier *modifier)
|
enum vkd3d_shader_src_modifier *modifier)
|
||||||
{
|
{
|
||||||
enum vkd3d_sm4_register_type register_type;
|
enum vkd3d_sm4_register_type register_type;
|
||||||
DWORD token, order;
|
enum vkd3d_sm4_extended_operand_type type;
|
||||||
|
enum vkd3d_sm4_register_modifier m;
|
||||||
|
uint32_t token, order, extended;
|
||||||
|
|
||||||
if (*ptr >= end)
|
if (*ptr >= end)
|
||||||
{
|
{
|
||||||
@ -1188,42 +1190,49 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
|
|||||||
}
|
}
|
||||||
param->data_type = data_type;
|
param->data_type = data_type;
|
||||||
|
|
||||||
if (token & VKD3D_SM4_REGISTER_MODIFIER)
|
*modifier = VKD3DSPSM_NONE;
|
||||||
|
if (token & VKD3D_SM4_EXTENDED_OPERAND)
|
||||||
{
|
{
|
||||||
DWORD m;
|
|
||||||
|
|
||||||
if (*ptr >= end)
|
if (*ptr >= end)
|
||||||
{
|
{
|
||||||
WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
|
WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m = *(*ptr)++;
|
extended = *(*ptr)++;
|
||||||
|
|
||||||
switch (m)
|
type = extended & VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK;
|
||||||
|
if (type == VKD3D_SM4_EXTENDED_OPERAND_MODIFIER)
|
||||||
{
|
{
|
||||||
case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
|
m = (extended & VKD3D_SM4_REGISTER_MODIFIER_MASK) >> VKD3D_SM4_REGISTER_MODIFIER_SHIFT;
|
||||||
*modifier = VKD3DSPSM_NEG;
|
switch (m)
|
||||||
break;
|
{
|
||||||
|
case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
|
||||||
|
*modifier = VKD3DSPSM_NEG;
|
||||||
|
break;
|
||||||
|
|
||||||
case VKD3D_SM4_REGISTER_MODIFIER_ABS:
|
case VKD3D_SM4_REGISTER_MODIFIER_ABS:
|
||||||
*modifier = VKD3DSPSM_ABS;
|
*modifier = VKD3DSPSM_ABS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
|
case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
|
||||||
*modifier = VKD3DSPSM_ABSNEG;
|
*modifier = VKD3DSPSM_ABSNEG;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
FIXME("Skipping modifier 0x%08x.\n", m);
|
FIXME("Unhandled register modifier %#x.\n", m);
|
||||||
/* fall-through */
|
/* fall-through */
|
||||||
case VKD3D_SM4_REGISTER_MODIFIER_NONE:
|
case VKD3D_SM4_REGISTER_MODIFIER_NONE:
|
||||||
*modifier = VKD3DSPSM_NONE;
|
break;
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
extended &= ~(VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK | VKD3D_SM4_REGISTER_MODIFIER_MASK);
|
||||||
|
if (extended)
|
||||||
|
FIXME("Skipping unhandled extended operand bits 0x%08x.\n", extended);
|
||||||
|
}
|
||||||
|
else if (type)
|
||||||
|
{
|
||||||
|
FIXME("Skipping unhandled extended operand token 0x%08x (type %#x).\n", extended, type);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*modifier = VKD3DSPSM_NONE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
order = (token & VKD3D_SM4_REGISTER_ORDER_MASK) >> VKD3D_SM4_REGISTER_ORDER_SHIFT;
|
order = (token & VKD3D_SM4_REGISTER_ORDER_MASK) >> VKD3D_SM4_REGISTER_ORDER_SHIFT;
|
||||||
|
@ -750,11 +750,12 @@ static void write_sm4_instruction(struct vkd3d_bytecode_buffer *buffer, const st
|
|||||||
token |= sm4_swizzle_type(instr->srcs[i].reg.type) << VKD3D_SM4_SWIZZLE_TYPE_SHIFT;
|
token |= sm4_swizzle_type(instr->srcs[i].reg.type) << VKD3D_SM4_SWIZZLE_TYPE_SHIFT;
|
||||||
token |= instr->srcs[i].swizzle << VKD3D_SM4_SWIZZLE_SHIFT;
|
token |= instr->srcs[i].swizzle << VKD3D_SM4_SWIZZLE_SHIFT;
|
||||||
if (instr->srcs[i].reg.mod)
|
if (instr->srcs[i].reg.mod)
|
||||||
token |= VKD3D_SM4_REGISTER_MODIFIER;
|
token |= VKD3D_SM4_EXTENDED_OPERAND;
|
||||||
put_u32(buffer, token);
|
put_u32(buffer, token);
|
||||||
|
|
||||||
if (instr->srcs[i].reg.mod)
|
if (instr->srcs[i].reg.mod)
|
||||||
put_u32(buffer, instr->srcs[i].reg.mod);
|
put_u32(buffer, (instr->srcs[i].reg.mod << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
|
||||||
|
| VKD3D_SM4_EXTENDED_OPERAND_MODIFIER);
|
||||||
|
|
||||||
for (j = 0; j < instr->srcs[i].reg.idx_count; ++j)
|
for (j = 0; j < instr->srcs[i].reg.idx_count; ++j)
|
||||||
put_u32(buffer, instr->srcs[i].reg.idx[j]);
|
put_u32(buffer, instr->srcs[i].reg.idx[j]);
|
||||||
|
@ -94,7 +94,12 @@
|
|||||||
|
|
||||||
#define VKD3D_SM4_OPCODE_MASK 0xff
|
#define VKD3D_SM4_OPCODE_MASK 0xff
|
||||||
|
|
||||||
#define VKD3D_SM4_REGISTER_MODIFIER (0x1u << 31)
|
#define VKD3D_SM4_EXTENDED_OPERAND (0x1u << 31)
|
||||||
|
|
||||||
|
#define VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK 0x3fu
|
||||||
|
|
||||||
|
#define VKD3D_SM4_REGISTER_MODIFIER_SHIFT 6
|
||||||
|
#define VKD3D_SM4_REGISTER_MODIFIER_MASK (0xffu << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
|
||||||
|
|
||||||
#define VKD3D_SM4_ADDRESSING_SHIFT2 28
|
#define VKD3D_SM4_ADDRESSING_SHIFT2 28
|
||||||
#define VKD3D_SM4_ADDRESSING_MASK2 (0x3u << VKD3D_SM4_ADDRESSING_SHIFT2)
|
#define VKD3D_SM4_ADDRESSING_MASK2 (0x3u << VKD3D_SM4_ADDRESSING_SHIFT2)
|
||||||
@ -388,12 +393,18 @@ enum vkd3d_sm4_register_type
|
|||||||
VKD3D_SM5_RT_DEPTHOUT_LESS_EQUAL = 0x27,
|
VKD3D_SM5_RT_DEPTHOUT_LESS_EQUAL = 0x27,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum vkd3d_sm4_extended_operand_type
|
||||||
|
{
|
||||||
|
VKD3D_SM4_EXTENDED_OPERAND_NONE = 0x0,
|
||||||
|
VKD3D_SM4_EXTENDED_OPERAND_MODIFIER = 0x1,
|
||||||
|
};
|
||||||
|
|
||||||
enum vkd3d_sm4_register_modifier
|
enum vkd3d_sm4_register_modifier
|
||||||
{
|
{
|
||||||
VKD3D_SM4_REGISTER_MODIFIER_NONE = 0x01,
|
VKD3D_SM4_REGISTER_MODIFIER_NONE = 0x00,
|
||||||
VKD3D_SM4_REGISTER_MODIFIER_NEGATE = 0x41,
|
VKD3D_SM4_REGISTER_MODIFIER_NEGATE = 0x01,
|
||||||
VKD3D_SM4_REGISTER_MODIFIER_ABS = 0x81,
|
VKD3D_SM4_REGISTER_MODIFIER_ABS = 0x02,
|
||||||
VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE = 0xc1,
|
VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE = 0x03,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum vkd3d_sm4_output_primitive_type
|
enum vkd3d_sm4_output_primitive_type
|
||||||
|
Reference in New Issue
Block a user