mirror of
https://github.com/yuzu-emu/yuzu.git
synced 2024-08-25 20:17:18 +02: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:
parent
494e34af6a
commit
2dbef58eeb
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user