diff options
| author | bunnei <bunneidev@gmail.com> | 2023-06-22 21:53:07 -0700 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-22 21:53:07 -0700 | 
| commit | 2fc5dedf6996d4a5c93ddf1ccd67a6963e4827e8 (patch) | |
| tree | d82f2cf4f7a5e9773616846c095a941b282a84f6 /src/core/hle/service | |
| parent | 3f3e4efb30de021fed52badc34808008276db9e7 (diff) | |
| parent | 5da70f719703084482933e103e561cc98163f370 (diff) | |
Merge pull request #10457 from Kelebek1/optimise
Remove memory allocations in some hot paths
Diffstat (limited to 'src/core/hle/service')
31 files changed, 253 insertions, 259 deletions
diff --git a/src/core/hle/service/audio/audin_u.cpp b/src/core/hle/service/audio/audin_u.cpp index f0640c64f..c8d574993 100644 --- a/src/core/hle/service/audio/audin_u.cpp +++ b/src/core/hle/service/audio/audin_u.cpp @@ -5,6 +5,7 @@  #include "audio_core/renderer/audio_device.h"  #include "common/common_funcs.h"  #include "common/logging/log.h" +#include "common/settings.h"  #include "common/string_util.h"  #include "core/core.h"  #include "core/hle/kernel/k_event.h" @@ -123,19 +124,13 @@ private:      void GetReleasedAudioInBuffer(HLERequestContext& ctx) {          const auto write_buffer_size = ctx.GetWriteBufferNumElements<u64>(); -        std::vector<u64> released_buffers(write_buffer_size); +        tmp_buffer.resize_destructive(write_buffer_size); +        tmp_buffer[0] = 0; -        const auto count = impl->GetReleasedBuffers(released_buffers); +        const auto count = impl->GetReleasedBuffers(tmp_buffer); -        [[maybe_unused]] std::string tags{}; -        for (u32 i = 0; i < count; i++) { -            tags += fmt::format("{:08X}, ", released_buffers[i]); -        } -        [[maybe_unused]] auto sessionid{impl->GetSystem().GetSessionId()}; -        LOG_TRACE(Service_Audio, "called. Session {} released {} buffers: {}", sessionid, count, -                  tags); +        ctx.WriteBuffer(tmp_buffer); -        ctx.WriteBuffer(released_buffers);          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(ResultSuccess);          rb.Push(count); @@ -200,6 +195,7 @@ private:      KernelHelpers::ServiceContext service_context;      Kernel::KEvent* event;      std::shared_ptr<AudioCore::AudioIn::In> impl; +    Common::ScratchBuffer<u64> tmp_buffer;  };  AudInU::AudInU(Core::System& system_) diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp index 3e62fa4fc..032c8c11f 100644 --- a/src/core/hle/service/audio/audout_u.cpp +++ b/src/core/hle/service/audio/audout_u.cpp @@ -123,19 +123,13 @@ private:      void GetReleasedAudioOutBuffers(HLERequestContext& ctx) {          const auto write_buffer_size = ctx.GetWriteBufferNumElements<u64>(); -        std::vector<u64> released_buffers(write_buffer_size); +        tmp_buffer.resize_destructive(write_buffer_size); +        tmp_buffer[0] = 0; -        const auto count = impl->GetReleasedBuffers(released_buffers); +        const auto count = impl->GetReleasedBuffers(tmp_buffer); -        [[maybe_unused]] std::string tags{}; -        for (u32 i = 0; i < count; i++) { -            tags += fmt::format("{:08X}, ", released_buffers[i]); -        } -        [[maybe_unused]] const auto sessionid{impl->GetSystem().GetSessionId()}; -        LOG_TRACE(Service_Audio, "called. Session {} released {} buffers: {}", sessionid, count, -                  tags); +        ctx.WriteBuffer(tmp_buffer); -        ctx.WriteBuffer(released_buffers);          IPC::ResponseBuilder rb{ctx, 3};          rb.Push(ResultSuccess);          rb.Push(count); @@ -211,6 +205,7 @@ private:      KernelHelpers::ServiceContext service_context;      Kernel::KEvent* event;      std::shared_ptr<AudioCore::AudioOut::Out> impl; +    Common::ScratchBuffer<u64> tmp_buffer;  };  AudOutU::AudOutU(Core::System& system_) diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 7086d4750..12845c23a 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -116,28 +116,26 @@ private:          // These buffers are written manually to avoid an issue with WriteBuffer throwing errors for          // checking size 0. Performance size is 0 for most games. -        std::vector<u8> output{}; -        std::vector<u8> performance{};          auto is_buffer_b{ctx.BufferDescriptorB()[0].Size() != 0};          if (is_buffer_b) {              const auto buffersB{ctx.BufferDescriptorB()}; -            output.resize(buffersB[0].Size(), 0); -            performance.resize(buffersB[1].Size(), 0); +            tmp_output.resize_destructive(buffersB[0].Size()); +            tmp_performance.resize_destructive(buffersB[1].Size());          } else {              const auto buffersC{ctx.BufferDescriptorC()}; -            output.resize(buffersC[0].Size(), 0); -            performance.resize(buffersC[1].Size(), 0); +            tmp_output.resize_destructive(buffersC[0].Size()); +            tmp_performance.resize_destructive(buffersC[1].Size());          } -        auto result = impl->RequestUpdate(input, performance, output); +        auto result = impl->RequestUpdate(input, tmp_performance, tmp_output);          if (result.IsSuccess()) {              if (is_buffer_b) { -                ctx.WriteBufferB(output.data(), output.size(), 0); -                ctx.WriteBufferB(performance.data(), performance.size(), 1); +                ctx.WriteBufferB(tmp_output.data(), tmp_output.size(), 0); +                ctx.WriteBufferB(tmp_performance.data(), tmp_performance.size(), 1);              } else { -                ctx.WriteBufferC(output.data(), output.size(), 0); -                ctx.WriteBufferC(performance.data(), performance.size(), 1); +                ctx.WriteBufferC(tmp_output.data(), tmp_output.size(), 0); +                ctx.WriteBufferC(tmp_performance.data(), tmp_performance.size(), 1);              }          } else {              LOG_ERROR(Service_Audio, "RequestUpdate failed error 0x{:02X}!", result.description); @@ -235,6 +233,8 @@ private:      Kernel::KEvent* rendered_event;      Manager& manager;      std::unique_ptr<Renderer> impl; +    Common::ScratchBuffer<u8> tmp_output; +    Common::ScratchBuffer<u8> tmp_performance;  };  class IAudioDevice final : public ServiceFramework<IAudioDevice> { diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 24ce37e87..d8e9c8719 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -4,6 +4,7 @@  #pragma once  #include "audio_core/audio_render_manager.h" +#include "common/scratch_buffer.h"  #include "core/hle/service/kernel_helpers.h"  #include "core/hle/service/service.h" diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp index 451ac224a..c835f6cb7 100644 --- a/src/core/hle/service/audio/hwopus.cpp +++ b/src/core/hle/service/audio/hwopus.cpp @@ -68,13 +68,13 @@ private:                                   ExtraBehavior extra_behavior) {          u32 consumed = 0;          u32 sample_count = 0; -        std::vector<opus_int16> samples(ctx.GetWriteBufferNumElements<opus_int16>()); +        tmp_samples.resize_destructive(ctx.GetWriteBufferNumElements<opus_int16>());          if (extra_behavior == ExtraBehavior::ResetContext) {              ResetDecoderContext();          } -        if (!DecodeOpusData(consumed, sample_count, ctx.ReadBuffer(), samples, performance)) { +        if (!DecodeOpusData(consumed, sample_count, ctx.ReadBuffer(), tmp_samples, performance)) {              LOG_ERROR(Audio, "Failed to decode opus data");              IPC::ResponseBuilder rb{ctx, 2};              // TODO(ogniK): Use correct error code @@ -90,11 +90,11 @@ private:          if (performance) {              rb.Push<u64>(*performance);          } -        ctx.WriteBuffer(samples); +        ctx.WriteBuffer(tmp_samples);      }      bool DecodeOpusData(u32& consumed, u32& sample_count, std::span<const u8> input, -                        std::vector<opus_int16>& output, u64* out_performance_time) const { +                        std::span<opus_int16> output, u64* out_performance_time) const {          const auto start_time = std::chrono::steady_clock::now();          const std::size_t raw_output_sz = output.size() * sizeof(opus_int16);          if (sizeof(OpusPacketHeader) > input.size()) { @@ -154,6 +154,7 @@ private:      OpusDecoderPtr decoder;      u32 sample_rate;      u32 channel_count; +    Common::ScratchBuffer<opus_int16> tmp_samples;  };  class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> { diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h index ab1f30f9e..a04538d5d 100644 --- a/src/core/hle/service/nvdrv/devices/nvdevice.h +++ b/src/core/hle/service/nvdrv/devices/nvdevice.h @@ -34,7 +34,7 @@ public:       * @returns The result code of the ioctl.       */      virtual NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output) = 0; +                            std::span<u8> output) = 0;      /**       * Handles an ioctl2 request. @@ -45,7 +45,7 @@ public:       * @returns The result code of the ioctl.       */      virtual NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::span<const u8> inline_input, std::vector<u8>& output) = 0; +                            std::span<const u8> inline_input, std::span<u8> output) = 0;      /**       * Handles an ioctl3 request. @@ -56,7 +56,7 @@ public:       * @returns The result code of the ioctl.       */      virtual NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output, std::vector<u8>& inline_output) = 0; +                            std::span<u8> output, std::span<u8> inline_output) = 0;      /**       * Called once a device is opened diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index 0fe242e9d..05a43d8dc 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp @@ -18,19 +18,19 @@ nvdisp_disp0::nvdisp_disp0(Core::System& system_, NvCore::Container& core)  nvdisp_disp0::~nvdisp_disp0() = default;  NvResult nvdisp_disp0::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output) { +                              std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvdisp_disp0::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::span<const u8> inline_input, std::vector<u8>& output) { +                              std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvdisp_disp0::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output, std::vector<u8>& inline_output) { +                              std::span<u8> output, std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h index bcd0e3ed5..daee05fe8 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h @@ -26,11 +26,11 @@ public:      ~nvdisp_disp0() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 681bd0867..07e570a9f 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -28,7 +28,7 @@ nvhost_as_gpu::nvhost_as_gpu(Core::System& system_, Module& module_, NvCore::Con  nvhost_as_gpu::~nvhost_as_gpu() = default;  NvResult nvhost_as_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                               std::vector<u8>& output) { +                               std::span<u8> output) {      switch (command.group) {      case 'A':          switch (command.cmd) { @@ -61,13 +61,13 @@ NvResult nvhost_as_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> i  }  NvResult nvhost_as_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                               std::span<const u8> inline_input, std::vector<u8>& output) { +                               std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_as_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                               std::vector<u8>& output, std::vector<u8>& inline_output) { +                               std::span<u8> output, std::span<u8> inline_output) {      switch (command.group) {      case 'A':          switch (command.cmd) { @@ -87,7 +87,7 @@ NvResult nvhost_as_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> i  void nvhost_as_gpu::OnOpen(DeviceFD fd) {}  void nvhost_as_gpu::OnClose(DeviceFD fd) {} -NvResult nvhost_as_gpu::AllocAsEx(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::AllocAsEx(std::span<const u8> input, std::span<u8> output) {      IoctlAllocAsEx params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -141,7 +141,7 @@ NvResult nvhost_as_gpu::AllocAsEx(std::span<const u8> input, std::vector<u8>& ou      return NvResult::Success;  } -NvResult nvhost_as_gpu::AllocateSpace(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::AllocateSpace(std::span<const u8> input, std::span<u8> output) {      IoctlAllocSpace params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -220,7 +220,7 @@ void nvhost_as_gpu::FreeMappingLocked(u64 offset) {      mapping_map.erase(offset);  } -NvResult nvhost_as_gpu::FreeSpace(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::FreeSpace(std::span<const u8> input, std::span<u8> output) {      IoctlFreeSpace params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -266,15 +266,14 @@ NvResult nvhost_as_gpu::FreeSpace(std::span<const u8> input, std::vector<u8>& ou      return NvResult::Success;  } -NvResult nvhost_as_gpu::Remap(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::Remap(std::span<const u8> input, std::span<u8> output) {      const auto num_entries = input.size() / sizeof(IoctlRemapEntry);      LOG_DEBUG(Service_NVDRV, "called, num_entries=0x{:X}", num_entries); -    std::vector<IoctlRemapEntry> entries(num_entries); -    std::memcpy(entries.data(), input.data(), input.size()); -      std::scoped_lock lock(mutex); +    entries.resize_destructive(num_entries); +    std::memcpy(entries.data(), input.data(), input.size());      if (!vm.initialised) {          return NvResult::BadValue; @@ -320,7 +319,7 @@ NvResult nvhost_as_gpu::Remap(std::span<const u8> input, std::vector<u8>& output      return NvResult::Success;  } -NvResult nvhost_as_gpu::MapBufferEx(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::MapBufferEx(std::span<const u8> input, std::span<u8> output) {      IoctlMapBufferEx params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -424,7 +423,7 @@ NvResult nvhost_as_gpu::MapBufferEx(std::span<const u8> input, std::vector<u8>&      return NvResult::Success;  } -NvResult nvhost_as_gpu::UnmapBuffer(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::UnmapBuffer(std::span<const u8> input, std::span<u8> output) {      IoctlUnmapBuffer params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -463,7 +462,7 @@ NvResult nvhost_as_gpu::UnmapBuffer(std::span<const u8> input, std::vector<u8>&      return NvResult::Success;  } -NvResult nvhost_as_gpu::BindChannel(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::BindChannel(std::span<const u8> input, std::span<u8> output) {      IoctlBindChannel params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, fd={:X}", params.fd); @@ -492,7 +491,7 @@ void nvhost_as_gpu::GetVARegionsImpl(IoctlGetVaRegions& params) {      };  } -NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::span<u8> output) {      IoctlGetVaRegions params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -511,8 +510,8 @@ NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>&      return NvResult::Success;  } -NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::vector<u8>& output, -                                     std::vector<u8>& inline_output) { +NvResult nvhost_as_gpu::GetVARegions(std::span<const u8> input, std::span<u8> output, +                                     std::span<u8> inline_output) {      IoctlGetVaRegions params{};      std::memcpy(¶ms, input.data(), input.size()); diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index 1aba8d579..2af3e1260 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h @@ -15,6 +15,7 @@  #include "common/address_space.h"  #include "common/common_funcs.h"  #include "common/common_types.h" +#include "common/scratch_buffer.h"  #include "common/swap.h"  #include "core/hle/service/nvdrv/core/nvmap.h"  #include "core/hle/service/nvdrv/devices/nvdevice.h" @@ -48,11 +49,11 @@ public:      ~nvhost_as_gpu() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -138,18 +139,18 @@ private:      static_assert(sizeof(IoctlGetVaRegions) == 16 + sizeof(VaRegion) * 2,                    "IoctlGetVaRegions is incorrect size"); -    NvResult AllocAsEx(std::span<const u8> input, std::vector<u8>& output); -    NvResult AllocateSpace(std::span<const u8> input, std::vector<u8>& output); -    NvResult Remap(std::span<const u8> input, std::vector<u8>& output); -    NvResult MapBufferEx(std::span<const u8> input, std::vector<u8>& output); -    NvResult UnmapBuffer(std::span<const u8> input, std::vector<u8>& output); -    NvResult FreeSpace(std::span<const u8> input, std::vector<u8>& output); -    NvResult BindChannel(std::span<const u8> input, std::vector<u8>& output); +    NvResult AllocAsEx(std::span<const u8> input, std::span<u8> output); +    NvResult AllocateSpace(std::span<const u8> input, std::span<u8> output); +    NvResult Remap(std::span<const u8> input, std::span<u8> output); +    NvResult MapBufferEx(std::span<const u8> input, std::span<u8> output); +    NvResult UnmapBuffer(std::span<const u8> input, std::span<u8> output); +    NvResult FreeSpace(std::span<const u8> input, std::span<u8> output); +    NvResult BindChannel(std::span<const u8> input, std::span<u8> output);      void GetVARegionsImpl(IoctlGetVaRegions& params); -    NvResult GetVARegions(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetVARegions(std::span<const u8> input, std::vector<u8>& output, -                          std::vector<u8>& inline_output); +    NvResult GetVARegions(std::span<const u8> input, std::span<u8> output); +    NvResult GetVARegions(std::span<const u8> input, std::span<u8> output, +                          std::span<u8> inline_output);      void FreeMappingLocked(u64 offset); @@ -212,6 +213,7 @@ private:          bool initialised{};      } vm;      std::shared_ptr<Tegra::MemoryManager> gmmu; +    Common::ScratchBuffer<IoctlRemapEntry> entries;      // s32 channel{};      // u32 big_page_size{VM::DEFAULT_BIG_PAGE_SIZE}; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index e12025560..4d55554b4 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp @@ -35,7 +35,7 @@ nvhost_ctrl::~nvhost_ctrl() {  }  NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                             std::vector<u8>& output) { +                             std::span<u8> output) {      switch (command.group) {      case 0x0:          switch (command.cmd) { @@ -64,13 +64,13 @@ NvResult nvhost_ctrl::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inp  }  NvResult nvhost_ctrl::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                             std::span<const u8> inline_input, std::vector<u8>& output) { +                             std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_ctrl::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                             std::vector<u8>& output, std::vector<u8>& inline_outpu) { +                             std::span<u8> output, std::span<u8> inline_outpu) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } @@ -79,7 +79,7 @@ void nvhost_ctrl::OnOpen(DeviceFD fd) {}  void nvhost_ctrl::OnClose(DeviceFD fd) {} -NvResult nvhost_ctrl::NvOsGetConfigU32(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl::NvOsGetConfigU32(std::span<const u8> input, std::span<u8> output) {      IocGetConfigParams params{};      std::memcpy(¶ms, input.data(), sizeof(params));      LOG_TRACE(Service_NVDRV, "called, setting={}!{}", params.domain_str.data(), @@ -87,7 +87,7 @@ NvResult nvhost_ctrl::NvOsGetConfigU32(std::span<const u8> input, std::vector<u8      return NvResult::ConfigVarNotFound; // Returns error on production mode  } -NvResult nvhost_ctrl::IocCtrlEventWait(std::span<const u8> input, std::vector<u8>& output, +NvResult nvhost_ctrl::IocCtrlEventWait(std::span<const u8> input, std::span<u8> output,                                         bool is_allocation) {      IocCtrlEventWaitParams params{};      std::memcpy(¶ms, input.data(), sizeof(params)); @@ -231,7 +231,7 @@ NvResult nvhost_ctrl::FreeEvent(u32 slot) {      return NvResult::Success;  } -NvResult nvhost_ctrl::IocCtrlEventRegister(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl::IocCtrlEventRegister(std::span<const u8> input, std::span<u8> output) {      IocCtrlEventRegisterParams params{};      std::memcpy(¶ms, input.data(), sizeof(params));      const u32 event_id = params.user_event_id; @@ -252,7 +252,7 @@ NvResult nvhost_ctrl::IocCtrlEventRegister(std::span<const u8> input, std::vecto      return NvResult::Success;  } -NvResult nvhost_ctrl::IocCtrlEventUnregister(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl::IocCtrlEventUnregister(std::span<const u8> input, std::span<u8> output) {      IocCtrlEventUnregisterParams params{};      std::memcpy(¶ms, input.data(), sizeof(params));      const u32 event_id = params.user_event_id & 0x00FF; @@ -262,8 +262,7 @@ NvResult nvhost_ctrl::IocCtrlEventUnregister(std::span<const u8> input, std::vec      return FreeEvent(event_id);  } -NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(std::span<const u8> input, -                                                  std::vector<u8>& output) { +NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(std::span<const u8> input, std::span<u8> output) {      IocCtrlEventUnregisterBatchParams params{};      std::memcpy(¶ms, input.data(), sizeof(params));      u64 event_mask = params.user_events; @@ -281,7 +280,7 @@ NvResult nvhost_ctrl::IocCtrlEventUnregisterBatch(std::span<const u8> input,      return NvResult::Success;  } -NvResult nvhost_ctrl::IocCtrlClearEventWait(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl::IocCtrlClearEventWait(std::span<const u8> input, std::span<u8> output) {      IocCtrlEventClearParams params{};      std::memcpy(¶ms, input.data(), sizeof(params)); diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h index dd2e7888a..2efed4862 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h @@ -26,11 +26,11 @@ public:      ~nvhost_ctrl() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -186,13 +186,12 @@ private:      static_assert(sizeof(IocCtrlEventUnregisterBatchParams) == 8,                    "IocCtrlEventKill is incorrect size"); -    NvResult NvOsGetConfigU32(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocCtrlEventWait(std::span<const u8> input, std::vector<u8>& output, -                              bool is_allocation); -    NvResult IocCtrlEventRegister(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocCtrlEventUnregister(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocCtrlEventUnregisterBatch(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocCtrlClearEventWait(std::span<const u8> input, std::vector<u8>& output); +    NvResult NvOsGetConfigU32(std::span<const u8> input, std::span<u8> output); +    NvResult IocCtrlEventWait(std::span<const u8> input, std::span<u8> output, bool is_allocation); +    NvResult IocCtrlEventRegister(std::span<const u8> input, std::span<u8> output); +    NvResult IocCtrlEventUnregister(std::span<const u8> input, std::span<u8> output); +    NvResult IocCtrlEventUnregisterBatch(std::span<const u8> input, std::span<u8> output); +    NvResult IocCtrlClearEventWait(std::span<const u8> input, std::span<u8> output);      NvResult FreeEvent(u32 slot); 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 be3c083db..6081d92e9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp @@ -22,7 +22,7 @@ nvhost_ctrl_gpu::~nvhost_ctrl_gpu() {  }  NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                                 std::vector<u8>& output) { +                                 std::span<u8> output) {      switch (command.group) {      case 'G':          switch (command.cmd) { @@ -54,13 +54,13 @@ NvResult nvhost_ctrl_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8>  }  NvResult nvhost_ctrl_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                                 std::span<const u8> inline_input, std::vector<u8>& output) { +                                 std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_ctrl_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                                 std::vector<u8>& output, std::vector<u8>& inline_output) { +                                 std::span<u8> output, std::span<u8> inline_output) {      switch (command.group) {      case 'G':          switch (command.cmd) { @@ -82,7 +82,7 @@ NvResult nvhost_ctrl_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8>  void nvhost_ctrl_gpu::OnOpen(DeviceFD fd) {}  void nvhost_ctrl_gpu::OnClose(DeviceFD fd) {} -NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlCharacteristics params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -127,8 +127,8 @@ NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vec      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vector<u8>& output, -                                             std::vector<u8>& inline_output) { +NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::span<u8> output, +                                             std::span<u8> inline_output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlCharacteristics params{};      std::memcpy(¶ms, input.data(), input.size()); @@ -175,7 +175,7 @@ NvResult nvhost_ctrl_gpu::GetCharacteristics(std::span<const u8> input, std::vec      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::span<u8> output) {      IoctlGpuGetTpcMasksArgs params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); @@ -186,8 +186,8 @@ NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>& output, -                                      std::vector<u8>& inline_output) { +NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::span<u8> output, +                                      std::span<u8> inline_output) {      IoctlGpuGetTpcMasksArgs params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, mask_buffer_size=0x{:X}", params.mask_buffer_size); @@ -199,7 +199,7 @@ NvResult nvhost_ctrl_gpu::GetTPCMasks(std::span<const u8> input, std::vector<u8>      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::GetActiveSlotMask(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::GetActiveSlotMask(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlActiveSlotMask params{}; @@ -212,7 +212,7 @@ NvResult nvhost_ctrl_gpu::GetActiveSlotMask(std::span<const u8> input, std::vect      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlZcullGetCtxSize params{}; @@ -224,7 +224,7 @@ NvResult nvhost_ctrl_gpu::ZCullGetCtxSize(std::span<const u8> input, std::vector      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::ZCullGetInfo(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::ZCullGetInfo(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlNvgpuGpuZcullGetInfoArgs params{}; @@ -247,7 +247,7 @@ NvResult nvhost_ctrl_gpu::ZCullGetInfo(std::span<const u8> input, std::vector<u8      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::ZBCSetTable(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::ZBCSetTable(std::span<const u8> input, std::span<u8> output) {      LOG_WARNING(Service_NVDRV, "(STUBBED) called");      IoctlZbcSetTable params{}; @@ -263,7 +263,7 @@ NvResult nvhost_ctrl_gpu::ZBCSetTable(std::span<const u8> input, std::vector<u8>      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::ZBCQueryTable(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::ZBCQueryTable(std::span<const u8> input, std::span<u8> output) {      LOG_WARNING(Service_NVDRV, "(STUBBED) called");      IoctlZbcQueryTable params{}; @@ -273,7 +273,7 @@ NvResult nvhost_ctrl_gpu::ZBCQueryTable(std::span<const u8> input, std::vector<u      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::FlushL2(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::FlushL2(std::span<const u8> input, std::span<u8> output) {      LOG_WARNING(Service_NVDRV, "(STUBBED) called");      IoctlFlushL2 params{}; @@ -283,7 +283,7 @@ NvResult nvhost_ctrl_gpu::FlushL2(std::span<const u8> input, std::vector<u8>& ou      return NvResult::Success;  } -NvResult nvhost_ctrl_gpu::GetGpuTime(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_ctrl_gpu::GetGpuTime(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlGetGpuTime params{}; 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 b9333d9d3..97995551c 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h @@ -22,11 +22,11 @@ public:      ~nvhost_ctrl_gpu() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -151,21 +151,21 @@ private:      };      static_assert(sizeof(IoctlGetGpuTime) == 0x10, "IoctlGetGpuTime is incorrect size"); -    NvResult GetCharacteristics(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetCharacteristics(std::span<const u8> input, std::vector<u8>& output, -                                std::vector<u8>& inline_output); - -    NvResult GetTPCMasks(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetTPCMasks(std::span<const u8> input, std::vector<u8>& output, -                         std::vector<u8>& inline_output); - -    NvResult GetActiveSlotMask(std::span<const u8> input, std::vector<u8>& output); -    NvResult ZCullGetCtxSize(std::span<const u8> input, std::vector<u8>& output); -    NvResult ZCullGetInfo(std::span<const u8> input, std::vector<u8>& output); -    NvResult ZBCSetTable(std::span<const u8> input, std::vector<u8>& output); -    NvResult ZBCQueryTable(std::span<const u8> input, std::vector<u8>& output); -    NvResult FlushL2(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetGpuTime(std::span<const u8> input, std::vector<u8>& output); +    NvResult GetCharacteristics(std::span<const u8> input, std::span<u8> output); +    NvResult GetCharacteristics(std::span<const u8> input, std::span<u8> output, +                                std::span<u8> inline_output); + +    NvResult GetTPCMasks(std::span<const u8> input, std::span<u8> output); +    NvResult GetTPCMasks(std::span<const u8> input, std::span<u8> output, +                         std::span<u8> inline_output); + +    NvResult GetActiveSlotMask(std::span<const u8> input, std::span<u8> output); +    NvResult ZCullGetCtxSize(std::span<const u8> input, std::span<u8> output); +    NvResult ZCullGetInfo(std::span<const u8> input, std::span<u8> output); +    NvResult ZBCSetTable(std::span<const u8> input, std::span<u8> output); +    NvResult ZBCQueryTable(std::span<const u8> input, std::span<u8> output); +    NvResult FlushL2(std::span<const u8> input, std::span<u8> output); +    NvResult GetGpuTime(std::span<const u8> input, std::span<u8> output);      EventInterface& events_interface; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 453a965dc..46a25fcab 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp @@ -47,7 +47,7 @@ nvhost_gpu::~nvhost_gpu() {  }  NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output) { +                            std::span<u8> output) {      switch (command.group) {      case 0x0:          switch (command.cmd) { @@ -99,7 +99,7 @@ NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu  };  NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::span<const u8> inline_input, std::vector<u8>& output) { +                            std::span<const u8> inline_input, std::span<u8> output) {      switch (command.group) {      case 'H':          switch (command.cmd) { @@ -113,7 +113,7 @@ NvResult nvhost_gpu::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> inpu  }  NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output, std::vector<u8>& inline_output) { +                            std::span<u8> output, std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } @@ -121,7 +121,7 @@ NvResult nvhost_gpu::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> inpu  void nvhost_gpu::OnOpen(DeviceFD fd) {}  void nvhost_gpu::OnClose(DeviceFD fd) {} -NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::span<u8> output) {      IoctlSetNvmapFD params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); @@ -130,7 +130,7 @@ NvResult nvhost_gpu::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& outp      return NvResult::Success;  } -NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlClientData params{}; @@ -139,7 +139,7 @@ NvResult nvhost_gpu::SetClientData(std::span<const u8> input, std::vector<u8>& o      return NvResult::Success;  } -NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::span<u8> output) {      LOG_DEBUG(Service_NVDRV, "called");      IoctlClientData params{}; @@ -149,7 +149,7 @@ NvResult nvhost_gpu::GetClientData(std::span<const u8> input, std::vector<u8>& o      return NvResult::Success;  } -NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::span<u8> output) {      std::memcpy(&zcull_params, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, gpu_va={:X}, mode={:X}", zcull_params.gpu_va,                zcull_params.mode); @@ -158,7 +158,7 @@ NvResult nvhost_gpu::ZCullBind(std::span<const u8> input, std::vector<u8>& outpu      return NvResult::Success;  } -NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::span<u8> output) {      IoctlSetErrorNotifier params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_WARNING(Service_NVDRV, "(STUBBED) called, offset={:X}, size={:X}, mem={:X}", params.offset, @@ -168,14 +168,14 @@ NvResult nvhost_gpu::SetErrorNotifier(std::span<const u8> input, std::vector<u8>      return NvResult::Success;  } -NvResult nvhost_gpu::SetChannelPriority(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::SetChannelPriority(std::span<const u8> input, std::span<u8> output) {      std::memcpy(&channel_priority, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "(STUBBED) called, priority={:X}", channel_priority);      return NvResult::Success;  } -NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::span<u8> output) {      IoctlAllocGpfifoEx2 params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_WARNING(Service_NVDRV, @@ -197,7 +197,7 @@ NvResult nvhost_gpu::AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>&      return NvResult::Success;  } -NvResult nvhost_gpu::AllocateObjectContext(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::AllocateObjectContext(std::span<const u8> input, std::span<u8> output) {      IoctlAllocObjCtx params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_WARNING(Service_NVDRV, "(STUBBED) called, class_num={:X}, flags={:X}", params.class_num, @@ -208,7 +208,8 @@ NvResult nvhost_gpu::AllocateObjectContext(std::span<const u8> input, std::vecto      return NvResult::Success;  } -static std::vector<Tegra::CommandHeader> BuildWaitCommandList(NvFence fence) { +static boost::container::small_vector<Tegra::CommandHeader, 512> BuildWaitCommandList( +    NvFence fence) {      return {          Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1,                                    Tegra::SubmissionMode::Increasing), @@ -219,35 +220,35 @@ static std::vector<Tegra::CommandHeader> BuildWaitCommandList(NvFence fence) {      };  } -static std::vector<Tegra::CommandHeader> BuildIncrementCommandList(NvFence fence) { -    std::vector<Tegra::CommandHeader> result{ +static boost::container::small_vector<Tegra::CommandHeader, 512> BuildIncrementCommandList( +    NvFence fence) { +    boost::container::small_vector<Tegra::CommandHeader, 512> result{          Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointPayload, 1,                                    Tegra::SubmissionMode::Increasing),          {}};      for (u32 count = 0; count < 2; ++count) { -        result.emplace_back(Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointOperation, 1, -                                                      Tegra::SubmissionMode::Increasing)); -        result.emplace_back( +        result.push_back(Tegra::BuildCommandHeader(Tegra::BufferMethods::SyncpointOperation, 1, +                                                   Tegra::SubmissionMode::Increasing)); +        result.push_back(              BuildFenceAction(Tegra::Engines::Puller::FenceOperation::Increment, fence.id));      }      return result;  } -static std::vector<Tegra::CommandHeader> BuildIncrementWithWfiCommandList(NvFence fence) { -    std::vector<Tegra::CommandHeader> result{ +static boost::container::small_vector<Tegra::CommandHeader, 512> BuildIncrementWithWfiCommandList( +    NvFence fence) { +    boost::container::small_vector<Tegra::CommandHeader, 512> result{          Tegra::BuildCommandHeader(Tegra::BufferMethods::WaitForIdle, 1,                                    Tegra::SubmissionMode::Increasing),          {}}; -    const std::vector<Tegra::CommandHeader> increment{BuildIncrementCommandList(fence)}; - -    result.insert(result.end(), increment.begin(), increment.end()); - +    auto increment_list{BuildIncrementCommandList(fence)}; +    result.insert(result.end(), increment_list.begin(), increment_list.end());      return result;  } -NvResult nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8>& output, +NvResult nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::span<u8> output,                                        Tegra::CommandList&& entries) {      LOG_TRACE(Service_NVDRV, "called, gpfifo={:X}, num_entries={:X}, flags={:X}", params.address,                params.num_entries, params.flags.raw); @@ -293,7 +294,7 @@ NvResult nvhost_gpu::SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8>      return NvResult::Success;  } -NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8>& output, +NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<u8> output,                                        bool kickoff) {      if (input.size() < sizeof(IoctlSubmitGpfifo)) {          UNIMPLEMENTED(); @@ -315,7 +316,7 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8>  }  NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, -                                      std::vector<u8>& output) { +                                      std::span<u8> output) {      if (input.size() < sizeof(IoctlSubmitGpfifo)) {          UNIMPLEMENTED();          return NvResult::InvalidSize; @@ -327,7 +328,7 @@ NvResult nvhost_gpu::SubmitGPFIFOBase(std::span<const u8> input, std::span<const      return SubmitGPFIFOImpl(params, output, std::move(entries));  } -NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::span<u8> output) {      IoctlGetWaitbase params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase));      LOG_INFO(Service_NVDRV, "called, unknown=0x{:X}", params.unknown); @@ -337,7 +338,7 @@ NvResult nvhost_gpu::GetWaitbase(std::span<const u8> input, std::vector<u8>& out      return NvResult::Success;  } -NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::span<u8> output) {      IoctlChannelSetTimeout params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlChannelSetTimeout));      LOG_INFO(Service_NVDRV, "called, timeout=0x{:X}", params.timeout); @@ -345,7 +346,7 @@ NvResult nvhost_gpu::ChannelSetTimeout(std::span<const u8> input, std::vector<u8      return NvResult::Success;  } -NvResult nvhost_gpu::ChannelSetTimeslice(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_gpu::ChannelSetTimeslice(std::span<const u8> input, std::span<u8> output) {      IoctlSetTimeslice params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlSetTimeslice));      LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index 3ca58202d..529c20526 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h @@ -41,11 +41,11 @@ public:      ~nvhost_gpu() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -186,23 +186,23 @@ private:      u32_le channel_priority{};      u32_le channel_timeslice{}; -    NvResult SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output); -    NvResult SetClientData(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetClientData(std::span<const u8> input, std::vector<u8>& output); -    NvResult ZCullBind(std::span<const u8> input, std::vector<u8>& output); -    NvResult SetErrorNotifier(std::span<const u8> input, std::vector<u8>& output); -    NvResult SetChannelPriority(std::span<const u8> input, std::vector<u8>& output); -    NvResult AllocGPFIFOEx2(std::span<const u8> input, std::vector<u8>& output); -    NvResult AllocateObjectContext(std::span<const u8> input, std::vector<u8>& output); -    NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::vector<u8>& output, +    NvResult SetNVMAPfd(std::span<const u8> input, std::span<u8> output); +    NvResult SetClientData(std::span<const u8> input, std::span<u8> output); +    NvResult GetClientData(std::span<const u8> input, std::span<u8> output); +    NvResult ZCullBind(std::span<const u8> input, std::span<u8> output); +    NvResult SetErrorNotifier(std::span<const u8> input, std::span<u8> output); +    NvResult SetChannelPriority(std::span<const u8> input, std::span<u8> output); +    NvResult AllocGPFIFOEx2(std::span<const u8> input, std::span<u8> output); +    NvResult AllocateObjectContext(std::span<const u8> input, std::span<u8> output); +    NvResult SubmitGPFIFOImpl(IoctlSubmitGpfifo& params, std::span<u8> output,                                Tegra::CommandList&& entries); -    NvResult SubmitGPFIFOBase(std::span<const u8> input, std::vector<u8>& output, +    NvResult SubmitGPFIFOBase(std::span<const u8> input, std::span<u8> output,                                bool kickoff = false);      NvResult SubmitGPFIFOBase(std::span<const u8> input, std::span<const u8> input_inline, -                              std::vector<u8>& output); -    NvResult GetWaitbase(std::span<const u8> input, std::vector<u8>& output); -    NvResult ChannelSetTimeout(std::span<const u8> input, std::vector<u8>& output); -    NvResult ChannelSetTimeslice(std::span<const u8> input, std::vector<u8>& output); +                              std::span<u8> output); +    NvResult GetWaitbase(std::span<const u8> input, std::span<u8> output); +    NvResult ChannelSetTimeout(std::span<const u8> input, std::span<u8> output); +    NvResult ChannelSetTimeslice(std::span<const u8> input, std::span<u8> output);      EventInterface& events_interface;      NvCore::Container& core; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index dc45169ad..a174442a6 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp @@ -16,7 +16,7 @@ nvhost_nvdec::nvhost_nvdec(Core::System& system_, NvCore::Container& core_)  nvhost_nvdec::~nvhost_nvdec() = default;  NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output) { +                              std::span<u8> output) {      switch (command.group) {      case 0x0:          switch (command.cmd) { @@ -56,13 +56,13 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> in  }  NvResult nvhost_nvdec::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::span<const u8> inline_input, std::vector<u8>& output) { +                              std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output, std::vector<u8>& inline_output) { +                              std::span<u8> output, std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h index 0d615bbcb..ad2233c49 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h @@ -14,11 +14,11 @@ public:      ~nvhost_nvdec() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp index 1ab51f10b..61649aa4a 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp @@ -36,7 +36,7 @@ std::size_t SliceVectors(std::span<const u8> input, std::vector<T>& dst, std::si  // Writes the data in src to an offset into the dst vector. The offset is specified in bytes  // Returns the number of bytes written into dst.  template <typename T> -std::size_t WriteVectors(std::vector<u8>& dst, const std::vector<T>& src, std::size_t offset) { +std::size_t WriteVectors(std::span<u8> dst, const std::vector<T>& src, std::size_t offset) {      if (src.empty()) {          return 0;      } @@ -72,8 +72,7 @@ NvResult nvhost_nvdec_common::SetNVMAPfd(std::span<const u8> input) {      return NvResult::Success;  } -NvResult nvhost_nvdec_common::Submit(DeviceFD fd, std::span<const u8> input, -                                     std::vector<u8>& output) { +NvResult nvhost_nvdec_common::Submit(DeviceFD fd, std::span<const u8> input, std::span<u8> output) {      IoctlSubmit params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlSubmit));      LOG_DEBUG(Service_NVDRV, "called NVDEC Submit, cmd_buffer_count={}", params.cmd_buffer_count); @@ -121,7 +120,7 @@ NvResult nvhost_nvdec_common::Submit(DeviceFD fd, std::span<const u8> input,      return NvResult::Success;  } -NvResult nvhost_nvdec_common::GetSyncpoint(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvdec_common::GetSyncpoint(std::span<const u8> input, std::span<u8> output) {      IoctlGetSyncpoint params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlGetSyncpoint));      LOG_DEBUG(Service_NVDRV, "called GetSyncpoint, id={}", params.param); @@ -133,7 +132,7 @@ NvResult nvhost_nvdec_common::GetSyncpoint(std::span<const u8> input, std::vecto      return NvResult::Success;  } -NvResult nvhost_nvdec_common::GetWaitbase(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvdec_common::GetWaitbase(std::span<const u8> input, std::span<u8> output) {      IoctlGetWaitbase params{};      LOG_CRITICAL(Service_NVDRV, "called WAITBASE");      std::memcpy(¶ms, input.data(), sizeof(IoctlGetWaitbase)); @@ -142,7 +141,7 @@ NvResult nvhost_nvdec_common::GetWaitbase(std::span<const u8> input, std::vector      return NvResult::Success;  } -NvResult nvhost_nvdec_common::MapBuffer(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvdec_common::MapBuffer(std::span<const u8> input, std::span<u8> output) {      IoctlMapBuffer params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlMapBuffer));      std::vector<MapBufferEntry> cmd_buffer_handles(params.num_entries); @@ -159,7 +158,7 @@ NvResult nvhost_nvdec_common::MapBuffer(std::span<const u8> input, std::vector<u      return NvResult::Success;  } -NvResult nvhost_nvdec_common::UnmapBuffer(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvdec_common::UnmapBuffer(std::span<const u8> input, std::span<u8> output) {      IoctlMapBuffer params{};      std::memcpy(¶ms, input.data(), sizeof(IoctlMapBuffer));      std::vector<MapBufferEntry> cmd_buffer_handles(params.num_entries); @@ -173,7 +172,7 @@ NvResult nvhost_nvdec_common::UnmapBuffer(std::span<const u8> input, std::vector      return NvResult::Success;  } -NvResult nvhost_nvdec_common::SetSubmitTimeout(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvdec_common::SetSubmitTimeout(std::span<const u8> input, std::span<u8> output) {      std::memcpy(&submit_timeout, input.data(), input.size());      LOG_WARNING(Service_NVDRV, "(STUBBED) called");      return NvResult::Success; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h index 5af26a26f..9bb573bfe 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h @@ -108,12 +108,12 @@ protected:      /// Ioctl command implementations      NvResult SetNVMAPfd(std::span<const u8> input); -    NvResult Submit(DeviceFD fd, std::span<const u8> input, std::vector<u8>& output); -    NvResult GetSyncpoint(std::span<const u8> input, std::vector<u8>& output); -    NvResult GetWaitbase(std::span<const u8> input, std::vector<u8>& output); -    NvResult MapBuffer(std::span<const u8> input, std::vector<u8>& output); -    NvResult UnmapBuffer(std::span<const u8> input, std::vector<u8>& output); -    NvResult SetSubmitTimeout(std::span<const u8> input, std::vector<u8>& output); +    NvResult Submit(DeviceFD fd, std::span<const u8> input, std::span<u8> output); +    NvResult GetSyncpoint(std::span<const u8> input, std::span<u8> output); +    NvResult GetWaitbase(std::span<const u8> input, std::span<u8> output); +    NvResult MapBuffer(std::span<const u8> input, std::span<u8> output); +    NvResult UnmapBuffer(std::span<const u8> input, std::span<u8> output); +    NvResult SetSubmitTimeout(std::span<const u8> input, std::span<u8> output);      Kernel::KEvent* QueryEvent(u32 event_id) override; diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp index 39f30e7c8..a05c8cdae 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp @@ -13,7 +13,7 @@ nvhost_nvjpg::nvhost_nvjpg(Core::System& system_) : nvdevice{system_} {}  nvhost_nvjpg::~nvhost_nvjpg() = default;  NvResult nvhost_nvjpg::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output) { +                              std::span<u8> output) {      switch (command.group) {      case 'H':          switch (command.cmd) { @@ -32,13 +32,13 @@ NvResult nvhost_nvjpg::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> in  }  NvResult nvhost_nvjpg::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::span<const u8> inline_input, std::vector<u8>& output) { +                              std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_nvjpg::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                              std::vector<u8>& output, std::vector<u8>& inline_output) { +                              std::span<u8> output, std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } @@ -46,7 +46,7 @@ NvResult nvhost_nvjpg::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> in  void nvhost_nvjpg::OnOpen(DeviceFD fd) {}  void nvhost_nvjpg::OnClose(DeviceFD fd) {} -NvResult nvhost_nvjpg::SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvhost_nvjpg::SetNVMAPfd(std::span<const u8> input, std::span<u8> output) {      IoctlSetNvmapFD params{};      std::memcpy(¶ms, input.data(), input.size());      LOG_DEBUG(Service_NVDRV, "called, fd={}", params.nvmap_fd); diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h index 41b57e872..5623e0d47 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h @@ -16,11 +16,11 @@ public:      ~nvhost_nvjpg() override;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -33,7 +33,7 @@ private:      s32_le nvmap_fd{}; -    NvResult SetNVMAPfd(std::span<const u8> input, std::vector<u8>& output); +    NvResult SetNVMAPfd(std::span<const u8> input, std::span<u8> output);  };  } // namespace Service::Nvidia::Devices diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp index b0ea402a7..c0b8684c3 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp @@ -16,7 +16,7 @@ nvhost_vic::nvhost_vic(Core::System& system_, NvCore::Container& core_)  nvhost_vic::~nvhost_vic() = default;  NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output) { +                            std::span<u8> output) {      switch (command.group) {      case 0x0:          switch (command.cmd) { @@ -56,13 +56,13 @@ NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> inpu  }  NvResult nvhost_vic::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::span<const u8> inline_input, std::vector<u8>& output) { +                            std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  }  NvResult nvhost_vic::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                            std::vector<u8>& output, std::vector<u8>& inline_output) { +                            std::span<u8> output, std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h index b5e350a83..cadbcb0a5 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.h @@ -13,11 +13,11 @@ public:      ~nvhost_vic();      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index 07417f045..e7f7e273b 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp @@ -26,7 +26,7 @@ nvmap::nvmap(Core::System& system_, NvCore::Container& container_)  nvmap::~nvmap() = default;  NvResult nvmap::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                       std::vector<u8>& output) { +                       std::span<u8> output) {      switch (command.group) {      case 0x1:          switch (command.cmd) { @@ -55,13 +55,13 @@ NvResult nvmap::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input,  }  NvResult nvmap::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                       std::span<const u8> inline_input, std::vector<u8>& output) { +                       std::span<const u8> inline_input, std::span<u8> output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } -NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                       std::vector<u8>& output, std::vector<u8>& inline_output) { +NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                       std::span<u8> inline_output) {      UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw);      return NvResult::NotImplemented;  } @@ -69,7 +69,7 @@ NvResult nvmap::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input,  void nvmap::OnOpen(DeviceFD fd) {}  void nvmap::OnClose(DeviceFD fd) {} -NvResult nvmap::IocCreate(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocCreate(std::span<const u8> input, std::span<u8> output) {      IocCreateParams params;      std::memcpy(¶ms, input.data(), sizeof(params));      LOG_DEBUG(Service_NVDRV, "called, size=0x{:08X}", params.size); @@ -89,7 +89,7 @@ NvResult nvmap::IocCreate(std::span<const u8> input, std::vector<u8>& output) {      return NvResult::Success;  } -NvResult nvmap::IocAlloc(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocAlloc(std::span<const u8> input, std::span<u8> output) {      IocAllocParams params;      std::memcpy(¶ms, input.data(), sizeof(params));      LOG_DEBUG(Service_NVDRV, "called, addr={:X}", params.address); @@ -137,7 +137,7 @@ NvResult nvmap::IocAlloc(std::span<const u8> input, std::vector<u8>& output) {      return result;  } -NvResult nvmap::IocGetId(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocGetId(std::span<const u8> input, std::span<u8> output) {      IocGetIdParams params;      std::memcpy(¶ms, input.data(), sizeof(params)); @@ -161,7 +161,7 @@ NvResult nvmap::IocGetId(std::span<const u8> input, std::vector<u8>& output) {      return NvResult::Success;  } -NvResult nvmap::IocFromId(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocFromId(std::span<const u8> input, std::span<u8> output) {      IocFromIdParams params;      std::memcpy(¶ms, input.data(), sizeof(params)); @@ -192,7 +192,7 @@ NvResult nvmap::IocFromId(std::span<const u8> input, std::vector<u8>& output) {      return NvResult::Success;  } -NvResult nvmap::IocParam(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocParam(std::span<const u8> input, std::span<u8> output) {      enum class ParamTypes { Size = 1, Alignment = 2, Base = 3, Heap = 4, Kind = 5, Compr = 6 };      IocParamParams params; @@ -241,7 +241,7 @@ NvResult nvmap::IocParam(std::span<const u8> input, std::vector<u8>& output) {      return NvResult::Success;  } -NvResult nvmap::IocFree(std::span<const u8> input, std::vector<u8>& output) { +NvResult nvmap::IocFree(std::span<const u8> input, std::span<u8> output) {      IocFreeParams params;      std::memcpy(¶ms, input.data(), sizeof(params)); diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h index 82bd3b118..40c65b430 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.h +++ b/src/core/hle/service/nvdrv/devices/nvmap.h @@ -27,11 +27,11 @@ public:      nvmap& operator=(const nvmap&) = delete;      NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::vector<u8>& output) override; +                    std::span<u8> output) override;      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output) override; -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output) override; +                    std::span<const u8> inline_input, std::span<u8> output) override; +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output) override;      void OnOpen(DeviceFD fd) override;      void OnClose(DeviceFD fd) override; @@ -106,12 +106,12 @@ private:      };      static_assert(sizeof(IocGetIdParams) == 8, "IocGetIdParams has wrong size"); -    NvResult IocCreate(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocAlloc(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocGetId(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocFromId(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocParam(std::span<const u8> input, std::vector<u8>& output); -    NvResult IocFree(std::span<const u8> input, std::vector<u8>& output); +    NvResult IocCreate(std::span<const u8> input, std::span<u8> output); +    NvResult IocAlloc(std::span<const u8> input, std::span<u8> output); +    NvResult IocGetId(std::span<const u8> input, std::span<u8> output); +    NvResult IocFromId(std::span<const u8> input, std::span<u8> output); +    NvResult IocParam(std::span<const u8> input, std::span<u8> output); +    NvResult IocFree(std::span<const u8> input, std::span<u8> output);      NvCore::Container& container;      NvCore::NvMap& file; diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 3d774eec4..9e46ee8dd 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -130,7 +130,7 @@ DeviceFD Module::Open(const std::string& device_name) {  }  NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, -                        std::vector<u8>& output) { +                        std::span<u8> output) {      if (fd < 0) {          LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd);          return NvResult::InvalidState; @@ -147,7 +147,7 @@ NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input,  }  NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                        std::span<const u8> inline_input, std::vector<u8>& output) { +                        std::span<const u8> inline_input, std::span<u8> output) {      if (fd < 0) {          LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd);          return NvResult::InvalidState; @@ -163,8 +163,8 @@ NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input,      return itr->second->Ioctl2(fd, command, input, inline_input, output);  } -NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, -                        std::vector<u8>& output, std::vector<u8>& inline_output) { +NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                        std::span<u8> inline_output) {      if (fd < 0) {          LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd);          return NvResult::InvalidState; diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index 668be742b..d8622b3ca 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h @@ -80,13 +80,13 @@ public:      DeviceFD Open(const std::string& device_name);      /// Sends an ioctl command to the specified file descriptor. -    NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output); +    NvResult Ioctl1(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output);      NvResult Ioctl2(DeviceFD fd, Ioctl command, std::span<const u8> input, -                    std::span<const u8> inline_input, std::vector<u8>& output); +                    std::span<const u8> inline_input, std::span<u8> output); -    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::vector<u8>& output, -                    std::vector<u8>& inline_output); +    NvResult Ioctl3(DeviceFD fd, Ioctl command, std::span<const u8> input, std::span<u8> output, +                    std::span<u8> inline_output);      /// Closes a device file descriptor and returns operation success.      NvResult Close(DeviceFD fd); diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.cpp b/src/core/hle/service/nvdrv/nvdrv_interface.cpp index d010a1e03..348207e25 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.cpp +++ b/src/core/hle/service/nvdrv/nvdrv_interface.cpp @@ -63,12 +63,12 @@ void NVDRV::Ioctl1(HLERequestContext& ctx) {      }      // Check device -    std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); +    tmp_output.resize_destructive(ctx.GetWriteBufferSize(0));      const auto input_buffer = ctx.ReadBuffer(0); -    const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, output_buffer); +    const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, tmp_output);      if (command.is_out != 0) { -        ctx.WriteBuffer(output_buffer); +        ctx.WriteBuffer(tmp_output);      }      IPC::ResponseBuilder rb{ctx, 3}; @@ -90,12 +90,12 @@ void NVDRV::Ioctl2(HLERequestContext& ctx) {      const auto input_buffer = ctx.ReadBuffer(0);      const auto input_inlined_buffer = ctx.ReadBuffer(1); -    std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); +    tmp_output.resize_destructive(ctx.GetWriteBufferSize(0));      const auto nv_result = -        nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, output_buffer); +        nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, tmp_output);      if (command.is_out != 0) { -        ctx.WriteBuffer(output_buffer); +        ctx.WriteBuffer(tmp_output);      }      IPC::ResponseBuilder rb{ctx, 3}; @@ -116,14 +116,12 @@ void NVDRV::Ioctl3(HLERequestContext& ctx) {      }      const auto input_buffer = ctx.ReadBuffer(0); -    std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); -    std::vector<u8> output_buffer_inline(ctx.GetWriteBufferSize(1)); - -    const auto nv_result = -        nvdrv->Ioctl3(fd, command, input_buffer, output_buffer, output_buffer_inline); +    tmp_output.resize_destructive(ctx.GetWriteBufferSize(0)); +    tmp_output_inline.resize_destructive(ctx.GetWriteBufferSize(1)); +    const auto nv_result = nvdrv->Ioctl3(fd, command, input_buffer, tmp_output, tmp_output_inline);      if (command.is_out != 0) { -        ctx.WriteBuffer(output_buffer, 0); -        ctx.WriteBuffer(output_buffer_inline, 1); +        ctx.WriteBuffer(tmp_output, 0); +        ctx.WriteBuffer(tmp_output_inline, 1);      }      IPC::ResponseBuilder rb{ctx, 3}; diff --git a/src/core/hle/service/nvdrv/nvdrv_interface.h b/src/core/hle/service/nvdrv/nvdrv_interface.h index 881ea1a6b..4b593ff90 100644 --- a/src/core/hle/service/nvdrv/nvdrv_interface.h +++ b/src/core/hle/service/nvdrv/nvdrv_interface.h @@ -4,6 +4,7 @@  #pragma once  #include <memory> +#include "common/scratch_buffer.h"  #include "core/hle/service/nvdrv/nvdrv.h"  #include "core/hle/service/service.h" @@ -33,6 +34,8 @@ private:      u64 pid{};      bool is_initialized{}; +    Common::ScratchBuffer<u8> tmp_output; +    Common::ScratchBuffer<u8> tmp_output_inline;  };  } // namespace Service::Nvidia diff --git a/src/core/hle/service/nvnflinger/parcel.h b/src/core/hle/service/nvnflinger/parcel.h index fb56d75d7..23ba315a0 100644 --- a/src/core/hle/service/nvnflinger/parcel.h +++ b/src/core/hle/service/nvnflinger/parcel.h @@ -6,6 +6,7 @@  #include <memory>  #include <span>  #include <vector> +#include <boost/container/small_vector.hpp>  #include "common/alignment.h"  #include "common/assert.h" @@ -167,7 +168,7 @@ public:  private:      template <typename T>          requires(std::is_trivially_copyable_v<T>) -    void WriteImpl(const T& val, std::vector<u8>& buffer) { +    void WriteImpl(const T& val, boost::container::small_vector<u8, 0x200>& buffer) {          const size_t aligned_size = Common::AlignUp(sizeof(T), 4);          const size_t old_size = buffer.size();          buffer.resize(old_size + aligned_size); @@ -176,8 +177,8 @@ private:      }  private: -    std::vector<u8> m_data_buffer; -    std::vector<u8> m_object_buffer; +    boost::container::small_vector<u8, 0x200> m_data_buffer; +    boost::container::small_vector<u8, 0x200> m_object_buffer;  };  } // namespace Service::android  | 
