vkd3d-shader/d3d-asm: Emit precise flags for a number of opcodes.

I've seen them specifically on RESINFO, but it general it makes
sense to print them for any opcode that expects a bit field in
the flags.
This commit is contained in:
Giovanni Mascellani
2025-07-25 12:03:30 +02:00
committed by Henri Verbeet
parent f7866df201
commit bdccdd9996
Notes: Henri Verbeet 2025-07-29 13:34:53 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1654

View File

@@ -156,6 +156,8 @@ static void shader_dump_atomic_op_flags(struct vkd3d_d3d_asm_compiler *compiler,
atomic_flags &= ~VKD3DARF_VOLATILE; atomic_flags &= ~VKD3DARF_VOLATILE;
} }
atomic_flags &= ~VKD3DSI_PRECISE_XYZW;
if (atomic_flags) if (atomic_flags)
vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", atomic_flags); vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", atomic_flags);
} }
@@ -183,6 +185,8 @@ static void shader_dump_sync_flags(struct vkd3d_d3d_asm_compiler *compiler, uint
sync_flags &= ~VKD3DSSF_THREAD_GROUP; sync_flags &= ~VKD3DSSF_THREAD_GROUP;
} }
sync_flags &= ~VKD3DSI_PRECISE_XYZW;
if (sync_flags) if (sync_flags)
vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", sync_flags); vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", sync_flags);
} }
@@ -1332,7 +1336,7 @@ static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compile
break; break;
case VSIR_OP_RESINFO: case VSIR_OP_RESINFO:
switch (ins->flags) switch (ins->flags & ~VKD3DSI_PRECISE_XYZW)
{ {
case VKD3DSI_NONE: case VKD3DSI_NONE:
break; break;
@@ -1349,7 +1353,7 @@ static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compile
break; break;
case VSIR_OP_SAMPLE_INFO: case VSIR_OP_SAMPLE_INFO:
switch (ins->flags) switch (ins->flags & ~VKD3DSI_PRECISE_XYZW)
{ {
case VKD3DSI_NONE: case VKD3DSI_NONE:
break; break;
@@ -1405,9 +1409,9 @@ static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compile
case VSIR_OP_USHR: case VSIR_OP_USHR:
if (ins->flags & VKD3DSI_SHIFT_UNMASKED) if (ins->flags & VKD3DSI_SHIFT_UNMASKED)
vkd3d_string_buffer_printf(buffer, "_unmasked"); vkd3d_string_buffer_printf(buffer, "_unmasked");
/* fall through */ break;
default: default:
shader_dump_precise_flags(compiler, ins->flags);
break; break;
} }
} }
@@ -1664,9 +1668,14 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
default: default:
shader_dump_instruction_flags(compiler, ins); shader_dump_instruction_flags(compiler, ins);
if (ins->resource_type != VKD3D_SHADER_RESOURCE_NONE)
vkd3d_string_buffer_printf(buffer, "_indexable");
shader_dump_precise_flags(compiler, ins->flags);
if (ins->resource_type != VKD3D_SHADER_RESOURCE_NONE) if (ins->resource_type != VKD3D_SHADER_RESOURCE_NONE)
{ {
vkd3d_string_buffer_printf(buffer, "_indexable("); vkd3d_string_buffer_printf(buffer, "(");
if (ins->raw) if (ins->raw)
vkd3d_string_buffer_printf(buffer, "raw_"); vkd3d_string_buffer_printf(buffer, "raw_");
if (ins->structured) if (ins->structured)