+static char *dump_write_mask(char buffer[5], uint32_t write_mask) +{ + unsigned int i = 0; + + if (write_mask & VKD3DSP_WRITEMASK_0) + buffer[i++] = 'x'; + if (write_mask & VKD3DSP_WRITEMASK_1) + buffer[i++] = 'y'; + if (write_mask & VKD3DSP_WRITEMASK_2) + buffer[i++] = 'z'; + if (write_mask & VKD3DSP_WRITEMASK_3) + buffer[i++] = 'w'; + + buffer[i++] = '\0'; + + return buffer; +}
Could we do something like this?: ```c static void shader_print_write_mask(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, uint32_t mask, const char *suffix) { unsigned int i = 0; char buffer[5];
if (mask & VKD3DSP_WRITEMASK_0) buffer[i++] = 'x'; if (mask & VKD3DSP_WRITEMASK_1) buffer[i++] = 'y'; if (mask & VKD3DSP_WRITEMASK_2) buffer[i++] = 'z'; if (mask & VKD3DSP_WRITEMASK_3) buffer[i++] = 'w'; buffer[i++] = '\0';
vkd3d_string_buffer_printf(&compiler->buffer, "%s.%s%s%s%s", prefix, compiler->colours.write_mask, buffer, compiler->colours.reset, suffix); } ```
In particular, I don't think this works:
+ if (element->register_index != -1) + { + vkd3d_string_buffer_printf(buffer, ".%s, v%d.%s", + dump_write_mask(tmp, element->mask), + element->register_index, dump_write_mask(tmp, element->used_mask)); + }
"tmp" would be overwritten before the vkd3d_string_buffer_printf() gets a chance to use it.
I think the shader_print_*() model would largely work well for outputting the actual signatures as well.
+ /** + * If \a value is nonzero, emit the input and output signature + * when disassembling a shader. + * + * This option is supported by vkd3d_shader_compile() when using + * D3D_BYTECODE, DXBC_TPF or DXBC_DXIL as source and D3D_ASM as + * target; it should not be enabled otherwise. + * + * \since 1.12 + */ + VKD3D_SHADER_COMPILE_OPTION_EMIT_SIGNATURE = 0x0000000b,
Do we need a new compilation option for that? I.e., could this be something like VKD3D_SHADER_COMPILE_OPTION_FORMATTING_IO_SIGNATURES instead?
+ if (flags & VSIR_ASM_FLAG_EMIT_SIGNATURE) + { + if ((result = dump_signatures(shader_desc, buffer)) < 0) + { + vkd3d_string_buffer_cleanup(buffer); + return result; + } + } + compiler.shader_version = *shader_version; shader_version = &compiler.shader_version; vkd3d_string_buffer_printf(buffer, "%s%s_%u_%u%s\n", compiler.colours.version,
I think it would make sense to keep the version as the first line of the output.