mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	Merge pull request #7218 from bylaws/aswdqdsam
Fixup channel submit IOCTL syncpoint parameters
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<Reloc> relocs(params.relocation_count);
 | 
				
			||||||
    std::vector<u32> reloc_shifts(params.relocation_count);
 | 
					    std::vector<u32> reloc_shifts(params.relocation_count);
 | 
				
			||||||
    std::vector<SyncptIncr> syncpt_increments(params.syncpoint_count);
 | 
					    std::vector<SyncptIncr> syncpt_increments(params.syncpoint_count);
 | 
				
			||||||
    std::vector<SyncptIncr> wait_checks(params.syncpoint_count);
 | 
					    std::vector<u32> fence_thresholds(params.fence_count);
 | 
				
			||||||
    std::vector<Fence> fences(params.fence_count);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Slice input into their respective buffers
 | 
					    // Slice input into their respective buffers
 | 
				
			||||||
    std::size_t offset = sizeof(IoctlSubmit);
 | 
					    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, relocs, params.relocation_count, offset);
 | 
				
			||||||
    offset += SliceVectors(input, reloc_shifts, 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, syncpt_increments, params.syncpoint_count, offset);
 | 
				
			||||||
    offset += SliceVectors(input, wait_checks, params.syncpoint_count, offset);
 | 
					    offset += SliceVectors(input, fence_thresholds, params.fence_count, offset);
 | 
				
			||||||
    offset += SliceVectors(input, fences, params.fence_count, offset);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    auto& gpu = system.GPU();
 | 
					    auto& gpu = system.GPU();
 | 
				
			||||||
    if (gpu.UseNvdec()) {
 | 
					    if (gpu.UseNvdec()) {
 | 
				
			||||||
        for (std::size_t i = 0; i < syncpt_increments.size(); i++) {
 | 
					        for (std::size_t i = 0; i < syncpt_increments.size(); i++) {
 | 
				
			||||||
            const SyncptIncr& syncpt_incr = syncpt_increments[i];
 | 
					            const SyncptIncr& syncpt_incr = syncpt_increments[i];
 | 
				
			||||||
            fences[i].id = syncpt_incr.id;
 | 
					            fence_thresholds[i] =
 | 
				
			||||||
            fences[i].value =
 | 
					 | 
				
			||||||
                syncpoint_manager.IncreaseSyncpoint(syncpt_incr.id, syncpt_incr.increments);
 | 
					                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));
 | 
					                                  cmdlist.size() * sizeof(u32));
 | 
				
			||||||
        gpu.PushCommandBuffer(cmdlist);
 | 
					        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));
 | 
					    std::memcpy(output.data(), ¶ms, sizeof(IoctlSubmit));
 | 
				
			||||||
    // Some games expect command_buffers to be written back
 | 
					    // Some games expect command_buffers to be written back
 | 
				
			||||||
    offset = sizeof(IoctlSubmit);
 | 
					    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, relocs, offset);
 | 
				
			||||||
    offset += WriteVectors(output, reloc_shifts, offset);
 | 
					    offset += WriteVectors(output, reloc_shifts, offset);
 | 
				
			||||||
    offset += WriteVectors(output, syncpt_increments, offset);
 | 
					    offset += WriteVectors(output, syncpt_increments, offset);
 | 
				
			||||||
    offset += WriteVectors(output, wait_checks, offset);
 | 
					    offset += WriteVectors(output, fence_thresholds, offset);
 | 
				
			||||||
    offset += WriteVectors(output, fences, offset);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return NvResult::Success;
 | 
					    return NvResult::Success;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -56,19 +56,16 @@ protected:
 | 
				
			|||||||
        s32 target{};
 | 
					        s32 target{};
 | 
				
			||||||
        s32 target_offset{};
 | 
					        s32 target_offset{};
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(Reloc) == 0x10, "CommandBuffer has incorrect size");
 | 
					    static_assert(sizeof(Reloc) == 0x10, "Reloc has incorrect size");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct SyncptIncr {
 | 
					    struct SyncptIncr {
 | 
				
			||||||
        u32 id{};
 | 
					        u32 id{};
 | 
				
			||||||
        u32 increments{};
 | 
					        u32 increments{};
 | 
				
			||||||
 | 
					        u32 unk0{};
 | 
				
			||||||
 | 
					        u32 unk1{};
 | 
				
			||||||
 | 
					        u32 unk2{};
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(SyncptIncr) == 0x8, "CommandBuffer has incorrect size");
 | 
					    static_assert(sizeof(SyncptIncr) == 0x14, "SyncptIncr has incorrect size");
 | 
				
			||||||
 | 
					 | 
				
			||||||
    struct Fence {
 | 
					 | 
				
			||||||
        u32 id{};
 | 
					 | 
				
			||||||
        u32 value{};
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    static_assert(sizeof(Fence) == 0x8, "CommandBuffer has incorrect size");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    struct IoctlGetSyncpoint {
 | 
					    struct IoctlGetSyncpoint {
 | 
				
			||||||
        // Input
 | 
					        // Input
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user