mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	citra-qt: Improve shader debugger.
Now supports dumping the current shader and recognizes a larger number of output semantics.
This commit is contained in:
		@@ -131,11 +131,14 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
 | 
			
		||||
    // into shbin format (separate type and component mask).
 | 
			
		||||
    union OutputRegisterInfo {
 | 
			
		||||
        enum Type : u64 {
 | 
			
		||||
            POSITION = 0,
 | 
			
		||||
            COLOR = 2,
 | 
			
		||||
            TEXCOORD0 = 3,
 | 
			
		||||
            TEXCOORD1 = 5,
 | 
			
		||||
            TEXCOORD2 = 6,
 | 
			
		||||
            POSITION   = 0,
 | 
			
		||||
            QUATERNION = 1,
 | 
			
		||||
            COLOR      = 2,
 | 
			
		||||
            TEXCOORD0  = 3,
 | 
			
		||||
            TEXCOORD1  = 5,
 | 
			
		||||
            TEXCOORD2  = 6,
 | 
			
		||||
 | 
			
		||||
            VIEW       = 8,
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        BitField< 0, 64, u64> hex;
 | 
			
		||||
@@ -157,6 +160,10 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
 | 
			
		||||
                { OutputAttributes::POSITION_Y, { OutputRegisterInfo::POSITION, 2} },
 | 
			
		||||
                { OutputAttributes::POSITION_Z, { OutputRegisterInfo::POSITION, 4} },
 | 
			
		||||
                { OutputAttributes::POSITION_W, { OutputRegisterInfo::POSITION, 8} },
 | 
			
		||||
                { OutputAttributes::QUATERNION_X, { OutputRegisterInfo::QUATERNION, 1} },
 | 
			
		||||
                { OutputAttributes::QUATERNION_Y, { OutputRegisterInfo::QUATERNION, 2} },
 | 
			
		||||
                { OutputAttributes::QUATERNION_Z, { OutputRegisterInfo::QUATERNION, 4} },
 | 
			
		||||
                { OutputAttributes::QUATERNION_W, { OutputRegisterInfo::QUATERNION, 8} },
 | 
			
		||||
                { OutputAttributes::COLOR_R, { OutputRegisterInfo::COLOR, 1} },
 | 
			
		||||
                { OutputAttributes::COLOR_G, { OutputRegisterInfo::COLOR, 2} },
 | 
			
		||||
                { OutputAttributes::COLOR_B, { OutputRegisterInfo::COLOR, 4} },
 | 
			
		||||
@@ -166,7 +173,10 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
 | 
			
		||||
                { OutputAttributes::TEXCOORD1_U, { OutputRegisterInfo::TEXCOORD1, 1} },
 | 
			
		||||
                { OutputAttributes::TEXCOORD1_V, { OutputRegisterInfo::TEXCOORD1, 2} },
 | 
			
		||||
                { OutputAttributes::TEXCOORD2_U, { OutputRegisterInfo::TEXCOORD2, 1} },
 | 
			
		||||
                { OutputAttributes::TEXCOORD2_V, { OutputRegisterInfo::TEXCOORD2, 2} }
 | 
			
		||||
                { OutputAttributes::TEXCOORD2_V, { OutputRegisterInfo::TEXCOORD2, 2} },
 | 
			
		||||
                { OutputAttributes::VIEW_X, { OutputRegisterInfo::VIEW, 1} },
 | 
			
		||||
                { OutputAttributes::VIEW_Y, { OutputRegisterInfo::VIEW, 2} },
 | 
			
		||||
                { OutputAttributes::VIEW_Z, { OutputRegisterInfo::VIEW, 4} }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            for (const auto& semantic : std::vector<OutputAttributes::Semantic>{
 | 
			
		||||
@@ -239,6 +249,7 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
 | 
			
		||||
 | 
			
		||||
    // TODO: Create a label table for "main"
 | 
			
		||||
 | 
			
		||||
    // TODO: Write uniforms as constants
 | 
			
		||||
 | 
			
		||||
    // Write data to file
 | 
			
		||||
    static int dump_index = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -158,7 +158,6 @@ extern std::shared_ptr<DebugContext> g_debug_context; // TODO: Get rid of this g
 | 
			
		||||
namespace DebugUtils {
 | 
			
		||||
 | 
			
		||||
#define PICA_DUMP_GEOMETRY 0
 | 
			
		||||
#define PICA_DUMP_SHADERS 0
 | 
			
		||||
#define PICA_DUMP_TEXTURES 0
 | 
			
		||||
#define PICA_LOG_TEV 0
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -80,6 +80,11 @@ struct Regs {
 | 
			
		||||
            POSITION_Z   =  2,
 | 
			
		||||
            POSITION_W   =  3,
 | 
			
		||||
 | 
			
		||||
            QUATERNION_X =  4,
 | 
			
		||||
            QUATERNION_Y =  5,
 | 
			
		||||
            QUATERNION_Z =  6,
 | 
			
		||||
            QUATERNION_W =  7,
 | 
			
		||||
 | 
			
		||||
            COLOR_R      =  8,
 | 
			
		||||
            COLOR_G      =  9,
 | 
			
		||||
            COLOR_B      = 10,
 | 
			
		||||
@@ -89,6 +94,12 @@ struct Regs {
 | 
			
		||||
            TEXCOORD0_V  = 13,
 | 
			
		||||
            TEXCOORD1_U  = 14,
 | 
			
		||||
            TEXCOORD1_V  = 15,
 | 
			
		||||
 | 
			
		||||
            // TODO: Not verified
 | 
			
		||||
            VIEW_X       = 18,
 | 
			
		||||
            VIEW_Y       = 19,
 | 
			
		||||
            VIEW_Z       = 20,
 | 
			
		||||
 | 
			
		||||
            TEXCOORD2_U  = 22,
 | 
			
		||||
            TEXCOORD2_V  = 23,
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,12 +96,6 @@ OutputVertex Run(UnitState& state, const InputVertex& input, int num_attributes)
 | 
			
		||||
    RunInterpreter(state);
 | 
			
		||||
#endif // ARCHITECTURE_x86_64
 | 
			
		||||
 | 
			
		||||
#if PICA_DUMP_SHADERS
 | 
			
		||||
    DebugUtils::DumpShader(setup.program_code.data(), state.debug.max_offset, setup.swizzle_data.data(),
 | 
			
		||||
        state.debug.max_opdesc_id, config.main_offset,
 | 
			
		||||
        g_state.regs.vs_output_attributes); // TODO: Don't hardcode VS here
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    // Setup output data
 | 
			
		||||
    OutputVertex ret;
 | 
			
		||||
    // TODO(neobrain): Under some circumstances, up to 16 attributes may be output. We need to
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user