diff options
| -rw-r--r-- | src/audio_core/device/audio_buffers.h | 8 | ||||
| -rw-r--r-- | src/audio_core/device/device_session.cpp | 6 | ||||
| -rw-r--r-- | src/audio_core/device/device_session.h | 5 | ||||
| -rw-r--r-- | src/audio_core/in/audio_in_system.cpp | 7 | ||||
| -rw-r--r-- | src/audio_core/out/audio_out_system.cpp | 7 | ||||
| -rw-r--r-- | src/core/hle/kernel/hle_ipc.cpp | 14 | ||||
| -rw-r--r-- | src/input_common/drivers/camera.cpp | 2 | ||||
| -rw-r--r-- | src/input_common/drivers/camera.h | 4 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/bootmanager.cpp | 19 | ||||
| -rw-r--r-- | src/yuzu/bootmanager.h | 3 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 3 | 
12 files changed, 52 insertions, 29 deletions
| diff --git a/src/audio_core/device/audio_buffers.h b/src/audio_core/device/audio_buffers.h index 3dae1a3b7..15082f6c6 100644 --- a/src/audio_core/device/audio_buffers.h +++ b/src/audio_core/device/audio_buffers.h @@ -91,9 +91,10 @@ public:       * @param core_timing - The CoreTiming instance       * @param session     - The device session       * -     * @return Is the buffer was released. +     * @return If any buffer was released.       */ -    bool ReleaseBuffers(const Core::Timing::CoreTiming& core_timing, const DeviceSession& session) { +    bool ReleaseBuffers(const Core::Timing::CoreTiming& core_timing, const DeviceSession& session, +                        bool force) {          std::scoped_lock l{lock};          bool buffer_released{false};          while (registered_count > 0) { @@ -103,7 +104,8 @@ public:              }              // Check with the backend if this buffer can be released yet. -            if (!session.IsBufferConsumed(buffers[index])) { +            // If we're shutting down, we don't care if it's been played or not. +            if (!force && !session.IsBufferConsumed(buffers[index])) {                  break;              } diff --git a/src/audio_core/device/device_session.cpp b/src/audio_core/device/device_session.cpp index 995060414..5a327a606 100644 --- a/src/audio_core/device/device_session.cpp +++ b/src/audio_core/device/device_session.cpp @@ -73,6 +73,12 @@ void DeviceSession::Stop() {      }  } +void DeviceSession::ClearBuffers() { +    if (stream) { +        stream->ClearQueue(); +    } +} +  void DeviceSession::AppendBuffers(std::span<const AudioBuffer> buffers) const {      for (const auto& buffer : buffers) {          Sink::SinkBuffer new_buffer{ diff --git a/src/audio_core/device/device_session.h b/src/audio_core/device/device_session.h index 74f4dc085..75f766c68 100644 --- a/src/audio_core/device/device_session.h +++ b/src/audio_core/device/device_session.h @@ -91,6 +91,11 @@ public:      void Stop();      /** +     * Clear out the underlying audio buffers in the backend stream. +     */ +    void ClearBuffers(); + +    /**       * Set this device session's volume.       *       * @param volume - New volume for this session. diff --git a/src/audio_core/in/audio_in_system.cpp b/src/audio_core/in/audio_in_system.cpp index 4324cafd8..934ef8c1c 100644 --- a/src/audio_core/in/audio_in_system.cpp +++ b/src/audio_core/in/audio_in_system.cpp @@ -23,7 +23,6 @@ System::~System() {  void System::Finalize() {      Stop();      session->Finalize(); -    buffer_event->Signal();  }  void System::StartSession() { @@ -102,6 +101,10 @@ Result System::Stop() {      if (state == State::Started) {          session->Stop();          session->SetVolume(0.0f); +        session->ClearBuffers(); +        if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) { +            buffer_event->Signal(); +        }          state = State::Stopped;      } @@ -138,7 +141,7 @@ void System::RegisterBuffers() {  }  void System::ReleaseBuffers() { -    bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; +    bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)};      if (signal) {          // Signal if any buffer was released, or if none are registered, we need more. diff --git a/src/audio_core/out/audio_out_system.cpp b/src/audio_core/out/audio_out_system.cpp index a66208ed9..e096a1dac 100644 --- a/src/audio_core/out/audio_out_system.cpp +++ b/src/audio_core/out/audio_out_system.cpp @@ -24,7 +24,6 @@ System::~System() {  void System::Finalize() {      Stop();      session->Finalize(); -    buffer_event->Signal();  }  std::string_view System::GetDefaultOutputDeviceName() const { @@ -102,6 +101,10 @@ Result System::Stop() {      if (state == State::Started) {          session->Stop();          session->SetVolume(0.0f); +        session->ClearBuffers(); +        if (buffers.ReleaseBuffers(system.CoreTiming(), *session, true)) { +            buffer_event->Signal(); +        }          state = State::Stopped;      } @@ -138,7 +141,7 @@ void System::RegisterBuffers() {  }  void System::ReleaseBuffers() { -    bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session)}; +    bool signal{buffers.ReleaseBuffers(system.CoreTiming(), *session, false)};      if (signal) {          // Signal if any buffer was released, or if none are registered, we need more.          buffer_event->Signal(); diff --git a/src/core/hle/kernel/hle_ipc.cpp b/src/core/hle/kernel/hle_ipc.cpp index e6479c131..738b6d0f1 100644 --- a/src/core/hle/kernel/hle_ipc.cpp +++ b/src/core/hle/kernel/hle_ipc.cpp @@ -326,25 +326,23 @@ Result HLERequestContext::WriteToOutgoingCommandBuffer(KThread& requesting_threa  }  std::vector<u8> HLERequestContext::ReadBuffer(std::size_t buffer_index) const { -    std::vector<u8> buffer{};      const bool is_buffer_a{BufferDescriptorA().size() > buffer_index &&                             BufferDescriptorA()[buffer_index].Size()}; -      if (is_buffer_a) {          ASSERT_OR_EXECUTE_MSG( -            BufferDescriptorA().size() > buffer_index, { return buffer; }, +            BufferDescriptorA().size() > buffer_index, { return {}; },              "BufferDescriptorA invalid buffer_index {}", buffer_index); -        buffer.resize(BufferDescriptorA()[buffer_index].Size()); +        std::vector<u8> buffer(BufferDescriptorA()[buffer_index].Size());          memory.ReadBlock(BufferDescriptorA()[buffer_index].Address(), buffer.data(), buffer.size()); +        return buffer;      } else {          ASSERT_OR_EXECUTE_MSG( -            BufferDescriptorX().size() > buffer_index, { return buffer; }, +            BufferDescriptorX().size() > buffer_index, { return {}; },              "BufferDescriptorX invalid buffer_index {}", buffer_index); -        buffer.resize(BufferDescriptorX()[buffer_index].Size()); +        std::vector<u8> buffer(BufferDescriptorX()[buffer_index].Size());          memory.ReadBlock(BufferDescriptorX()[buffer_index].Address(), buffer.data(), buffer.size()); +        return buffer;      } - -    return buffer;  }  std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, diff --git a/src/input_common/drivers/camera.cpp b/src/input_common/drivers/camera.cpp index dceea67e0..fad9177dc 100644 --- a/src/input_common/drivers/camera.cpp +++ b/src/input_common/drivers/camera.cpp @@ -17,7 +17,7 @@ Camera::Camera(std::string input_engine_) : InputEngine(std::move(input_engine_)      PreSetController(identifier);  } -void Camera::SetCameraData(std::size_t width, std::size_t height, std::vector<u32> data) { +void Camera::SetCameraData(std::size_t width, std::size_t height, std::span<const u32> data) {      const std::size_t desired_width = getImageWidth();      const std::size_t desired_height = getImageHeight();      status.data.resize(desired_width * desired_height); diff --git a/src/input_common/drivers/camera.h b/src/input_common/drivers/camera.h index b8a7c75e5..38fb1ae4c 100644 --- a/src/input_common/drivers/camera.h +++ b/src/input_common/drivers/camera.h @@ -3,6 +3,8 @@  #pragma once +#include <span> +  #include "input_common/input_engine.h"  namespace InputCommon { @@ -15,7 +17,7 @@ class Camera final : public InputEngine {  public:      explicit Camera(std::string input_engine_); -    void SetCameraData(std::size_t width, std::size_t height, std::vector<u32> data); +    void SetCameraData(std::size_t width, std::size_t height, std::span<const u32> data);      std::size_t getImageWidth() const;      std::size_t getImageHeight() const; diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index a8b82abae..4b7126c30 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -658,8 +658,7 @@ void RasterizerVulkan::BeginTransformFeedback() {          return;      }      UNIMPLEMENTED_IF(regs.IsShaderConfigEnabled(Maxwell::ShaderType::TessellationInit) || -                     regs.IsShaderConfigEnabled(Maxwell::ShaderType::Tessellation) || -                     regs.IsShaderConfigEnabled(Maxwell::ShaderType::Geometry)); +                     regs.IsShaderConfigEnabled(Maxwell::ShaderType::Tessellation));      scheduler.Record(          [](vk::CommandBuffer cmdbuf) { cmdbuf.BeginTransformFeedbackEXT(0, 0, nullptr, nullptr); });  } diff --git a/src/yuzu/bootmanager.cpp b/src/yuzu/bootmanager.cpp index 7147c6aaa..682b37f47 100644 --- a/src/yuzu/bootmanager.cpp +++ b/src/yuzu/bootmanager.cpp @@ -278,12 +278,14 @@ static Core::Frontend::WindowSystemType GetWindowSystemType() {          return Core::Frontend::WindowSystemType::X11;      else if (platform_name == QStringLiteral("wayland"))          return Core::Frontend::WindowSystemType::Wayland; +    else if (platform_name == QStringLiteral("wayland-egl")) +        return Core::Frontend::WindowSystemType::Wayland;      else if (platform_name == QStringLiteral("cocoa"))          return Core::Frontend::WindowSystemType::Cocoa;      else if (platform_name == QStringLiteral("android"))          return Core::Frontend::WindowSystemType::Android; -    LOG_CRITICAL(Frontend, "Unknown Qt platform!"); +    LOG_CRITICAL(Frontend, "Unknown Qt platform {}!", platform_name.toStdString());      return Core::Frontend::WindowSystemType::Windows;  } @@ -323,7 +325,8 @@ GRenderWindow::GRenderWindow(GMainWindow* parent, EmuThread* emu_thread_,      input_subsystem->Initialize();      this->setMouseTracking(true); -    strict_context_required = QGuiApplication::platformName() == QStringLiteral("wayland"); +    strict_context_required = QGuiApplication::platformName() == QStringLiteral("wayland") || +                              QGuiApplication::platformName() == QStringLiteral("wayland-egl");      connect(this, &GRenderWindow::FirstFrameDisplayed, parent, &GMainWindow::OnLoadComplete);      connect(this, &GRenderWindow::ExecuteProgramSignal, parent, &GMainWindow::OnExecuteProgram, @@ -761,6 +764,7 @@ void GRenderWindow::InitializeCamera() {          return;      } +    camera_data.resize(CAMERA_WIDTH * CAMERA_HEIGHT);      camera_capture->setCaptureDestination(QCameraImageCapture::CaptureDestination::CaptureToBuffer);      connect(camera_capture.get(), &QCameraImageCapture::imageCaptured, this,              &GRenderWindow::OnCameraCapture); @@ -816,16 +820,13 @@ void GRenderWindow::RequestCameraCapture() {  }  void GRenderWindow::OnCameraCapture(int requestId, const QImage& img) { -    constexpr std::size_t camera_width = 320; -    constexpr std::size_t camera_height = 240; +    // TODO: Capture directly in the format and resolution needed      const auto converted = -        img.scaled(camera_width, camera_height, Qt::AspectRatioMode::IgnoreAspectRatio, +        img.scaled(CAMERA_WIDTH, CAMERA_HEIGHT, Qt::AspectRatioMode::IgnoreAspectRatio,                     Qt::TransformationMode::SmoothTransformation)              .mirrored(false, true); -    std::vector<u32> camera_data{}; -    camera_data.resize(camera_width * camera_height); -    std::memcpy(camera_data.data(), converted.bits(), camera_width * camera_height * sizeof(u32)); -    input_subsystem->GetCamera()->SetCameraData(camera_width, camera_height, camera_data); +    std::memcpy(camera_data.data(), converted.bits(), CAMERA_WIDTH * CAMERA_HEIGHT * sizeof(u32)); +    input_subsystem->GetCamera()->SetCameraData(CAMERA_WIDTH, CAMERA_HEIGHT, camera_data);      pending_camera_snapshots = 0;  } diff --git a/src/yuzu/bootmanager.h b/src/yuzu/bootmanager.h index f0edad6e4..5bbcf61f7 100644 --- a/src/yuzu/bootmanager.h +++ b/src/yuzu/bootmanager.h @@ -247,6 +247,9 @@ private:  #if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && YUZU_USE_QT_MULTIMEDIA      std::unique_ptr<QCamera> camera;      std::unique_ptr<QCameraImageCapture> camera_capture; +    static constexpr std::size_t CAMERA_WIDTH = 320; +    static constexpr std::size_t CAMERA_HEIGHT = 240; +    std::vector<u32> camera_data;  #endif      std::unique_ptr<QTimer> camera_timer; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 70552bdb8..2e6c2311a 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -3067,7 +3067,8 @@ static QScreen* GuessCurrentScreen(QWidget* window) {  bool GMainWindow::UsingExclusiveFullscreen() {      return Settings::values.fullscreen_mode.GetValue() == Settings::FullscreenMode::Exclusive || -           QGuiApplication::platformName() == QStringLiteral("wayland"); +           QGuiApplication::platformName() == QStringLiteral("wayland") || +           QGuiApplication::platformName() == QStringLiteral("wayland-egl");  }  void GMainWindow::ShowFullscreen() { | 
