mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Pica/DebugUtils: Include uniform information into shader dumps.
This commit is contained in:
		@@ -14,6 +14,7 @@
 | 
			
		||||
#include <png.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <nihstro/float24.h>
 | 
			
		||||
#include <nihstro/shader_binary.h>
 | 
			
		||||
 | 
			
		||||
#include "common/assert.h"
 | 
			
		||||
@@ -110,8 +111,7 @@ void GeometryDumper::Dump() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data, u32 swizzle_size,
 | 
			
		||||
                u32 main_offset, const Regs::VSOutputAttributes* output_attributes)
 | 
			
		||||
void DumpShader(const Regs::ShaderConfig& config, const State::ShaderSetup& setup, const Regs::VSOutputAttributes* output_attributes)
 | 
			
		||||
{
 | 
			
		||||
    struct StuffToWrite {
 | 
			
		||||
        u8* pointer;
 | 
			
		||||
@@ -231,25 +231,66 @@ void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data
 | 
			
		||||
 | 
			
		||||
    // TODO: Reduce the amount of binary code written to relevant portions
 | 
			
		||||
    dvlp.binary_offset = write_offset - dvlp_offset;
 | 
			
		||||
    dvlp.binary_size_words = binary_size;
 | 
			
		||||
    QueueForWriting((u8*)binary_data, binary_size * sizeof(u32));
 | 
			
		||||
    dvlp.binary_size_words = setup.program_code.size();
 | 
			
		||||
    QueueForWriting((u8*)setup.program_code.data(), setup.program_code.size() * sizeof(u32));
 | 
			
		||||
 | 
			
		||||
    dvlp.swizzle_info_offset = write_offset - dvlp_offset;
 | 
			
		||||
    dvlp.swizzle_info_num_entries = swizzle_size;
 | 
			
		||||
    dvlp.swizzle_info_num_entries = setup.swizzle_data.size();
 | 
			
		||||
    u32 dummy = 0;
 | 
			
		||||
    for (unsigned int i = 0; i < swizzle_size; ++i) {
 | 
			
		||||
        QueueForWriting((u8*)&swizzle_data[i], sizeof(swizzle_data[i]));
 | 
			
		||||
    for (unsigned int i = 0; i < setup.swizzle_data.size(); ++i) {
 | 
			
		||||
        QueueForWriting((u8*)&setup.swizzle_data[i], sizeof(setup.swizzle_data[i]));
 | 
			
		||||
        QueueForWriting((u8*)&dummy, sizeof(dummy));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dvle.main_offset_words = main_offset;
 | 
			
		||||
    dvle.main_offset_words = config.main_offset;
 | 
			
		||||
    dvle.output_register_table_offset = write_offset - dvlb.dvle_offset;
 | 
			
		||||
    dvle.output_register_table_size = static_cast<u32>(output_info_table.size());
 | 
			
		||||
    QueueForWriting((u8*)output_info_table.data(), static_cast<u32>(output_info_table.size() * sizeof(OutputRegisterInfo)));
 | 
			
		||||
 | 
			
		||||
    // TODO: Create a label table for "main"
 | 
			
		||||
 | 
			
		||||
    // TODO: Write uniforms as constants
 | 
			
		||||
    std::vector<nihstro::ConstantInfo> constant_table;
 | 
			
		||||
    for (unsigned i = 0; i < setup.uniforms.b.size(); ++i) {
 | 
			
		||||
        nihstro::ConstantInfo constant;
 | 
			
		||||
        memset(&constant, 0, sizeof(constant));
 | 
			
		||||
        constant.type = nihstro::ConstantInfo::Bool;
 | 
			
		||||
        constant.regid = i;
 | 
			
		||||
        constant.b = setup.uniforms.b[i];
 | 
			
		||||
        constant_table.emplace_back(constant);
 | 
			
		||||
    }
 | 
			
		||||
    for (unsigned i = 0; i < setup.uniforms.i.size(); ++i) {
 | 
			
		||||
        nihstro::ConstantInfo constant;
 | 
			
		||||
        memset(&constant, 0, sizeof(constant));
 | 
			
		||||
        constant.type = nihstro::ConstantInfo::Int;
 | 
			
		||||
        constant.regid = i;
 | 
			
		||||
        constant.i.x = setup.uniforms.i[i].x;
 | 
			
		||||
        constant.i.y = setup.uniforms.i[i].y;
 | 
			
		||||
        constant.i.z = setup.uniforms.i[i].z;
 | 
			
		||||
        constant.i.w = setup.uniforms.i[i].w;
 | 
			
		||||
        constant_table.emplace_back(constant);
 | 
			
		||||
    }
 | 
			
		||||
    for (unsigned i = 0; i < sizeof(setup.uniforms.f) / sizeof(setup.uniforms.f[0]); ++i) {
 | 
			
		||||
        nihstro::ConstantInfo constant;
 | 
			
		||||
        memset(&constant, 0, sizeof(constant));
 | 
			
		||||
        constant.type = nihstro::ConstantInfo::Float;
 | 
			
		||||
        constant.regid = i;
 | 
			
		||||
        constant.f.x = nihstro::to_float24(setup.uniforms.f[i].x.ToFloat32());
 | 
			
		||||
        constant.f.y = nihstro::to_float24(setup.uniforms.f[i].y.ToFloat32());
 | 
			
		||||
        constant.f.z = nihstro::to_float24(setup.uniforms.f[i].z.ToFloat32());
 | 
			
		||||
        constant.f.w = nihstro::to_float24(setup.uniforms.f[i].w.ToFloat32());
 | 
			
		||||
 | 
			
		||||
        // Store constant if it's different from zero..
 | 
			
		||||
        if (setup.uniforms.f[i].x.ToFloat32() != 0.0 ||
 | 
			
		||||
            setup.uniforms.f[i].y.ToFloat32() != 0.0 ||
 | 
			
		||||
            setup.uniforms.f[i].z.ToFloat32() != 0.0 ||
 | 
			
		||||
            setup.uniforms.f[i].w.ToFloat32() != 0.0)
 | 
			
		||||
            constant_table.emplace_back(constant);
 | 
			
		||||
    }
 | 
			
		||||
    dvle.constant_table_offset = write_offset - dvlb.dvle_offset;
 | 
			
		||||
    dvle.constant_table_size = constant_table.size();
 | 
			
		||||
    for (const auto& constant : constant_table) {
 | 
			
		||||
        QueueForWriting((uint8_t*)&constant, sizeof(constant));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Write data to file
 | 
			
		||||
    static int dump_index = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -181,8 +181,7 @@ private:
 | 
			
		||||
    std::vector<Face> faces;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void DumpShader(const u32* binary_data, u32 binary_size, const u32* swizzle_data, u32 swizzle_size,
 | 
			
		||||
                u32 main_offset, const Regs::VSOutputAttributes* output_attributes);
 | 
			
		||||
void DumpShader(const Regs::ShaderConfig& config, const State::ShaderSetup& setup, const Regs::VSOutputAttributes* output_attributes);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Utility class to log Pica commands.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user