diff options
Diffstat (limited to 'src/core/hle/service')
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 25 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | 18 | 
2 files changed, 22 insertions, 21 deletions
| diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index cc2192e5c..0d913334e 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -25,7 +25,7 @@ u32 nvhost_ctrl_gpu::ioctl(Ioctl command, const std::vector<u8>& input,      case IoctlCommand::IocGetCharacteristicsCommand:          return GetCharacteristics(input, output, output2, version);      case IoctlCommand::IocGetTPCMasksCommand: -        return GetTPCMasks(input, output); +        return GetTPCMasks(input, output, output2, version);      case IoctlCommand::IocGetActiveSlotMaskCommand:          return GetActiveSlotMask(input, output);      case IoctlCommand::IocZcullGetCtxSizeCommand: @@ -98,17 +98,22 @@ u32 nvhost_ctrl_gpu::GetCharacteristics(const std::vector<u8>& input, std::vecto      return 0;  } -u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output) { +u32 nvhost_ctrl_gpu::GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, +                                 std::vector<u8>& output2, IoctlVersion version) {      IoctlGpuGetTpcMasksArgs params{};      std::memcpy(¶ms, input.data(), input.size()); -    LOG_INFO(Service_NVDRV, "called, mask=0x{:X}, mask_buf_addr=0x{:X}", params.mask_buf_size, -             params.mask_buf_addr); -    // TODO(ogniK): Confirm value on hardware -    if (params.mask_buf_size) -        params.tpc_mask_size = 4 * 1; // 4 * num_gpc -    else -        params.tpc_mask_size = 0; -    std::memcpy(output.data(), ¶ms, sizeof(params)); +    LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); +    if (params.mask_buffer_size != 0) { +        params.tcp_mask = 3; +    } + +    if (version == IoctlVersion::Version3) { +        std::memcpy(output.data(), input.data(), output.size()); +        std::memcpy(output2.data(), ¶ms.tcp_mask, output2.size()); +    } else { +        std::memcpy(output.data(), ¶ms, output.size()); +    } +      return 0;  } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h index 07b644ec5..ef60f72ce 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h @@ -92,16 +92,11 @@ private:                    "IoctlCharacteristics is incorrect size");      struct IoctlGpuGetTpcMasksArgs { -        /// [in]  TPC mask buffer size reserved by userspace. Should be at least -        /// sizeof(__u32) * fls(gpc_mask) to receive TPC mask for each GPC. -        /// [out] full kernel buffer size -        u32_le mask_buf_size; -        u32_le reserved; - -        /// [in]  pointer to TPC mask buffer. It will receive one 32-bit TPC mask per GPC or 0 if -        /// GPC is not enabled or not present. This parameter is ignored if mask_buf_size is 0. -        u64_le mask_buf_addr; -        u64_le tpc_mask_size; // Nintendo add this? +        u32_le mask_buffer_size{}; +        INSERT_PADDING_WORDS(1); +        u64_le mask_buffer_address{}; +        u32_le tcp_mask{}; +        INSERT_PADDING_WORDS(1);      };      static_assert(sizeof(IoctlGpuGetTpcMasksArgs) == 24,                    "IoctlGpuGetTpcMasksArgs is incorrect size"); @@ -166,7 +161,8 @@ private:      u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output,                             std::vector<u8>& output2, IoctlVersion version); -    u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); +    u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output, std::vector<u8>& output2, +                    IoctlVersion version);      u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output);      u32 ZCullGetCtxSize(const std::vector<u8>& input, std::vector<u8>& output);      u32 ZCullGetInfo(const std::vector<u8>& input, std::vector<u8>& output); | 
