wined3d: Read the SM5 resource type instruction modifier.

Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2020-09-02 18:40:35 -05:00 committed by Alexandre Julliard
parent a963947322
commit 9610e71f34
3 changed files with 83 additions and 69 deletions

View File

@ -2042,6 +2042,29 @@ static void shader_dump_shader_input_sysval_semantic(struct wined3d_string_buffe
shader_addline(buffer, "unknown_shader_input_sysval_semantic(%#x)", semantic);
}
static void shader_dump_resource_type(struct wined3d_string_buffer *buffer, enum wined3d_shader_resource_type type)
{
static const char *const resource_type_names[] =
{
/* WINED3D_SHADER_RESOURCE_NONE */ "none",
/* WINED3D_SHADER_RESOURCE_BUFFER */ "buffer",
/* WINED3D_SHADER_RESOURCE_TEXTURE_1D */ "texture1d",
/* WINED3D_SHADER_RESOURCE_TEXTURE_2D */ "texture2d",
/* WINED3D_SHADER_RESOURCE_TEXTURE_2DMS */ "texture2dms",
/* WINED3D_SHADER_RESOURCE_TEXTURE_3D */ "texture3d",
/* WINED3D_SHADER_RESOURCE_TEXTURE_CUBE */ "texturecube",
/* WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY */ "texture1darray",
/* WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY */ "texture2darray",
/* WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY */ "texture2dmsarray",
/* WINED3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY */ "texturecubearray",
};
if (type <= ARRAY_SIZE(resource_type_names))
shader_addline(buffer, "%s", resource_type_names[type]);
else
shader_addline(buffer, "unknown");
}
static void shader_dump_decl_usage(struct wined3d_string_buffer *buffer,
const struct wined3d_shader_semantic *semantic, unsigned int flags,
const struct wined3d_shader_version *shader_version)
@ -2075,52 +2098,7 @@ static void shader_dump_decl_usage(struct wined3d_string_buffer *buffer,
shader_addline(buffer, "_resource_");
else
shader_addline(buffer, "_uav_");
switch (semantic->resource_type)
{
case WINED3D_SHADER_RESOURCE_BUFFER:
shader_addline(buffer, "buffer");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_1D:
shader_addline(buffer, "texture1d");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_2D:
shader_addline(buffer, "texture2d");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_2DMS:
shader_addline(buffer, "texture2dms");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_3D:
shader_addline(buffer, "texture3d");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_CUBE:
shader_addline(buffer, "texturecube");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY:
shader_addline(buffer, "texture1darray");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY:
shader_addline(buffer, "texture2darray");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY:
shader_addline(buffer, "texture2dmsarray");
break;
case WINED3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY:
shader_addline(buffer, "texturecubearray");
break;
default:
shader_addline(buffer, "unknown");
break;
}
shader_dump_resource_type(buffer, semantic->resource_type);
if (semantic->reg.reg.type == WINED3DSPR_UAV)
shader_dump_uav_flags(buffer, flags);
switch (semantic->resource_data_type)
@ -3116,6 +3094,13 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
if (wined3d_shader_instruction_has_texel_offset(&ins))
shader_addline(&buffer, "(%d,%d,%d)", ins.texel_offset.u, ins.texel_offset.v, ins.texel_offset.w);
if (ins.resource_type != WINED3D_SHADER_RESOURCE_NONE)
{
shader_addline(&buffer, "(");
shader_dump_resource_type(&buffer, ins.resource_type);
shader_addline(&buffer, ")");
}
for (i = 0; i < ins.dst_count; ++i)
{
shader_dump_ins_modifiers(&buffer, &ins.dst[i]);

View File

@ -26,7 +26,11 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode);
#define WINED3D_SM4_INSTRUCTION_MODIFIER (0x1u << 31)
#define WINED3D_SM4_MODIFIER_AOFFIMMI 0x1
#define WINED3D_SM4_MODIFIER_MASK 0x3fu
#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT 6
#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_MASK (0xfu << WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT)
#define WINED3D_SM4_AOFFIMMI_U_SHIFT 9
#define WINED3D_SM4_AOFFIMMI_U_MASK (0xfu << WINED3D_SM4_AOFFIMMI_U_SHIFT)
#define WINED3D_SM4_AOFFIMMI_V_SHIFT 13
@ -304,6 +308,12 @@ enum wined3d_sm4_opcode
WINED3D_SM5_OP_DCL_GS_INSTANCES = 0xce,
};
enum wined3d_sm4_instruction_modifier
{
WINED3D_SM4_MODIFIER_AOFFIMMI = 0x1,
WINED3D_SM5_MODIFIER_RESOURCE_TYPE = 0x2,
};
enum wined3d_sm4_register_type
{
WINED3D_SM4_RT_TEMP = 0x00,
@ -1609,32 +1619,49 @@ static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD
static void shader_sm4_read_instruction_modifier(DWORD modifier, struct wined3d_shader_instruction *ins)
{
static const DWORD recognized_bits = WINED3D_SM4_INSTRUCTION_MODIFIER
| WINED3D_SM4_MODIFIER_AOFFIMMI
| WINED3D_SM4_AOFFIMMI_U_MASK
| WINED3D_SM4_AOFFIMMI_V_MASK
| WINED3D_SM4_AOFFIMMI_W_MASK;
enum wined3d_sm4_instruction_modifier modifier_type = modifier & WINED3D_SM4_MODIFIER_MASK;
if (modifier & ~recognized_bits)
switch (modifier_type)
{
FIXME("Unhandled modifier 0x%08x.\n", modifier);
}
else
{
/* Bit fields are used for sign extension */
struct
case WINED3D_SM4_MODIFIER_AOFFIMMI:
{
int u : 4;
int v : 4;
int w : 4;
static const DWORD recognized_bits = WINED3D_SM4_INSTRUCTION_MODIFIER
| WINED3D_SM4_MODIFIER_MASK
| WINED3D_SM4_AOFFIMMI_U_MASK
| WINED3D_SM4_AOFFIMMI_V_MASK
| WINED3D_SM4_AOFFIMMI_W_MASK;
/* Bit fields are used for sign extension. */
struct
{
int u : 4;
int v : 4;
int w : 4;
} aoffimmi;
if (modifier & ~recognized_bits)
FIXME("Unhandled instruction modifier %#x.\n", modifier);
aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
ins->texel_offset.u = aoffimmi.u;
ins->texel_offset.v = aoffimmi.v;
ins->texel_offset.w = aoffimmi.w;
break;
}
aoffimmi;
aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
ins->texel_offset.u = aoffimmi.u;
ins->texel_offset.v = aoffimmi.v;
ins->texel_offset.w = aoffimmi.w;
case WINED3D_SM5_MODIFIER_RESOURCE_TYPE:
{
enum wined3d_sm4_resource_type resource_type
= (modifier & WINED3D_SM5_MODIFIER_RESOURCE_TYPE_MASK) >> WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT;
ins->resource_type = resource_type_table[resource_type];
break;
}
default:
FIXME("Unhandled instruction modifier %#x.\n", modifier);
}
}
@ -1703,6 +1730,7 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
ins->dst = priv->dst_param;
ins->src_count = strlen(opcode_info->src_info);
ins->src = priv->src_param;
ins->resource_type = WINED3D_SHADER_RESOURCE_NONE;
memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
p = *ptr;

View File

@ -1246,6 +1246,7 @@ struct wined3d_shader_instruction
const struct wined3d_shader_dst_param *dst;
const struct wined3d_shader_src_param *src;
struct wined3d_shader_texel_offset texel_offset;
enum wined3d_shader_resource_type resource_type;
BOOL coissue;
const struct wined3d_shader_src_param *predicate;
union