mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Fixup channel submit IOCTL syncpoint parameters
The current arguments worked by happenstance as games only ever submit one syncpoint and request one fence back, if a game were to do something other than this then the arguments would've been parsed entirely wrong.
This commit is contained in:
		@@ -69,8 +69,7 @@ NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u
 | 
			
		||||
    std::vector<Reloc> relocs(params.relocation_count);
 | 
			
		||||
    std::vector<u32> reloc_shifts(params.relocation_count);
 | 
			
		||||
    std::vector<SyncptIncr> syncpt_increments(params.syncpoint_count);
 | 
			
		||||
    std::vector<SyncptIncr> wait_checks(params.syncpoint_count);
 | 
			
		||||
    std::vector<Fence> fences(params.fence_count);
 | 
			
		||||
    std::vector<u32> fence_thresholds(params.fence_count);
 | 
			
		||||
 | 
			
		||||
    // Slice input into their respective buffers
 | 
			
		||||
    std::size_t offset = sizeof(IoctlSubmit);
 | 
			
		||||
@@ -78,15 +77,13 @@ NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u
 | 
			
		||||
    offset += SliceVectors(input, relocs, params.relocation_count, offset);
 | 
			
		||||
    offset += SliceVectors(input, reloc_shifts, params.relocation_count, offset);
 | 
			
		||||
    offset += SliceVectors(input, syncpt_increments, params.syncpoint_count, offset);
 | 
			
		||||
    offset += SliceVectors(input, wait_checks, params.syncpoint_count, offset);
 | 
			
		||||
    offset += SliceVectors(input, fences, params.fence_count, offset);
 | 
			
		||||
    offset += SliceVectors(input, fence_thresholds, params.fence_count, offset);
 | 
			
		||||
 | 
			
		||||
    auto& gpu = system.GPU();
 | 
			
		||||
    if (gpu.UseNvdec()) {
 | 
			
		||||
        for (std::size_t i = 0; i < syncpt_increments.size(); i++) {
 | 
			
		||||
            const SyncptIncr& syncpt_incr = syncpt_increments[i];
 | 
			
		||||
            fences[i].id = syncpt_incr.id;
 | 
			
		||||
            fences[i].value =
 | 
			
		||||
            fence_thresholds[i] =
 | 
			
		||||
                syncpoint_manager.IncreaseSyncpoint(syncpt_incr.id, syncpt_incr.increments);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -98,11 +95,6 @@ NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u
 | 
			
		||||
                                  cmdlist.size() * sizeof(u32));
 | 
			
		||||
        gpu.PushCommandBuffer(cmdlist);
 | 
			
		||||
    }
 | 
			
		||||
    if (gpu.UseNvdec()) {
 | 
			
		||||
        fences[0].value = syncpoint_manager.IncreaseSyncpoint(fences[0].id, 1);
 | 
			
		||||
        Tegra::ChCommandHeaderList cmdlist{{(4 << 28) | fences[0].id}};
 | 
			
		||||
        gpu.PushCommandBuffer(cmdlist);
 | 
			
		||||
    }
 | 
			
		||||
    std::memcpy(output.data(), ¶ms, sizeof(IoctlSubmit));
 | 
			
		||||
    // Some games expect command_buffers to be written back
 | 
			
		||||
    offset = sizeof(IoctlSubmit);
 | 
			
		||||
@@ -110,8 +102,7 @@ NvResult nvhost_nvdec_common::Submit(const std::vector<u8>& input, std::vector<u
 | 
			
		||||
    offset += WriteVectors(output, relocs, offset);
 | 
			
		||||
    offset += WriteVectors(output, reloc_shifts, offset);
 | 
			
		||||
    offset += WriteVectors(output, syncpt_increments, offset);
 | 
			
		||||
    offset += WriteVectors(output, wait_checks, offset);
 | 
			
		||||
    offset += WriteVectors(output, fences, offset);
 | 
			
		||||
    offset += WriteVectors(output, fence_thresholds, offset);
 | 
			
		||||
 | 
			
		||||
    return NvResult::Success;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -56,19 +56,16 @@ protected:
 | 
			
		||||
        s32 target{};
 | 
			
		||||
        s32 target_offset{};
 | 
			
		||||
    };
 | 
			
		||||
    static_assert(sizeof(Reloc) == 0x10, "CommandBuffer has incorrect size");
 | 
			
		||||
    static_assert(sizeof(Reloc) == 0x10, "Reloc has incorrect size");
 | 
			
		||||
 | 
			
		||||
    struct SyncptIncr {
 | 
			
		||||
        u32 id{};
 | 
			
		||||
        u32 increments{};
 | 
			
		||||
        u32 unk0{};
 | 
			
		||||
        u32 unk1{};
 | 
			
		||||
        u32 unk2{};
 | 
			
		||||
    };
 | 
			
		||||
    static_assert(sizeof(SyncptIncr) == 0x8, "CommandBuffer has incorrect size");
 | 
			
		||||
 | 
			
		||||
    struct Fence {
 | 
			
		||||
        u32 id{};
 | 
			
		||||
        u32 value{};
 | 
			
		||||
    };
 | 
			
		||||
    static_assert(sizeof(Fence) == 0x8, "CommandBuffer has incorrect size");
 | 
			
		||||
    static_assert(sizeof(SyncptIncr) == 0x14, "SyncptIncr has incorrect size");
 | 
			
		||||
 | 
			
		||||
    struct IoctlGetSyncpoint {
 | 
			
		||||
        // Input
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user