diff options
| author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-06-04 16:10:07 -0400 | 
|---|---|---|
| committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-07-05 15:49:08 -0400 | 
| commit | ceb5f5079c3efd8046ccf35bbc3507a4c190f355 (patch) | |
| tree | dec175c503c14e47d5405808a51bec1fa83f5024 | |
| parent | 772c86a260eb446b0fe4232b0a50666511bef25c (diff) | |
nvflinger: Implement swap intervals
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.cpp | 3 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/buffer_queue.h | 3 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.cpp | 14 | ||||
| -rw-r--r-- | src/core/hle/service/nvflinger/nvflinger.h | 4 | ||||
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 5 | 
5 files changed, 21 insertions, 8 deletions
| diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp index 5731e815f..dca75c35e 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.cpp +++ b/src/core/hle/service/nvflinger/buffer_queue.cpp @@ -63,7 +63,7 @@ const IGBPBuffer& BufferQueue::RequestBuffer(u32 slot) const {  }  void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform, -                              const Common::Rectangle<int>& crop_rect) { +                              const Common::Rectangle<int>& crop_rect, u32 swap_interval) {      auto itr = std::find_if(queue.begin(), queue.end(),                              [&](const Buffer& buffer) { return buffer.slot == slot; });      ASSERT(itr != queue.end()); @@ -71,6 +71,7 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform,      itr->status = Buffer::Status::Queued;      itr->transform = transform;      itr->crop_rect = crop_rect; +    itr->swap_interval = swap_interval;  }  std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h index e1ccb6171..139b98b9f 100644 --- a/src/core/hle/service/nvflinger/buffer_queue.h +++ b/src/core/hle/service/nvflinger/buffer_queue.h @@ -68,13 +68,14 @@ public:          IGBPBuffer igbp_buffer;          BufferTransformFlags transform;          Common::Rectangle<int> crop_rect; +        u32 swap_interval;      };      void SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer);      std::optional<u32> DequeueBuffer(u32 width, u32 height);      const IGBPBuffer& RequestBuffer(u32 slot) const;      void QueueBuffer(u32 slot, BufferTransformFlags transform, -                     const Common::Rectangle<int>& crop_rect); +                     const Common::Rectangle<int>& crop_rect, u32 swap_interval);      std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();      void ReleaseBuffer(u32 slot);      u32 Query(QueryType type); diff --git a/src/core/hle/service/nvflinger/nvflinger.cpp b/src/core/hle/service/nvflinger/nvflinger.cpp index 3c5c53e24..6d83535e7 100644 --- a/src/core/hle/service/nvflinger/nvflinger.cpp +++ b/src/core/hle/service/nvflinger/nvflinger.cpp @@ -37,15 +37,16 @@ NVFlinger::NVFlinger(Core::Timing::CoreTiming& core_timing) : core_timing{core_t      displays.emplace_back(4, "Null");      // Schedule the screen composition events -    const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : frame_ticks; +    //const auto ticks = Settings::values.force_30fps_mode ? frame_ticks_30fps : frame_ticks;      composition_event = core_timing.RegisterEvent( -        "ScreenComposition", [this, ticks](u64 userdata, s64 cycles_late) { +        "ScreenComposition", [this](u64 userdata, s64 cycles_late) {              Compose(); -            this->core_timing.ScheduleEvent(ticks - cycles_late, composition_event); +            const auto ticks = GetNextTicks(); +            this->core_timing.ScheduleEvent(std::max(0LL,ticks - cycles_late), composition_event);          }); -    core_timing.ScheduleEvent(ticks, composition_event); +    core_timing.ScheduleEvent(frame_ticks, composition_event);  }  NVFlinger::~NVFlinger() { @@ -206,8 +207,13 @@ void NVFlinger::Compose() {                       igbp_buffer.width, igbp_buffer.height, igbp_buffer.stride,                       buffer->get().transform, buffer->get().crop_rect); +        swap_interval = buffer->get().swap_interval;          buffer_queue.ReleaseBuffer(buffer->get().slot);      }  } +s64 NVFlinger::GetNextTicks() { +    return (Core::Timing::BASE_CLOCK_RATE * (1LL << swap_interval)) / 120; +} +  } // namespace Service::NVFlinger diff --git a/src/core/hle/service/nvflinger/nvflinger.h b/src/core/hle/service/nvflinger/nvflinger.h index c0a83fffb..86b94302c 100644 --- a/src/core/hle/service/nvflinger/nvflinger.h +++ b/src/core/hle/service/nvflinger/nvflinger.h @@ -74,6 +74,8 @@ public:      /// finished.      void Compose(); +    s64 GetNextTicks(); +  private:      /// Finds the display identified by the specified ID.      VI::Display* FindDisplay(u64 display_id); @@ -98,6 +100,8 @@ private:      /// layers.      u32 next_buffer_queue_id = 1; +    u32 swap_interval = 1; +      /// Event that handles screen composition.      Core::Timing::EventType* composition_event; diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index f1fa6ccd1..55bd252c2 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp @@ -418,7 +418,8 @@ public:          s32_le scaling_mode;          NVFlinger::BufferQueue::BufferTransformFlags transform;          u32_le sticky_transform; -        INSERT_PADDING_WORDS(2); +        INSERT_PADDING_WORDS(1); +        u32_le swap_interval;          u32_le fence_is_valid;          std::array<Fence, 2> fences; @@ -582,7 +583,7 @@ private:              IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()};              buffer_queue.QueueBuffer(request.data.slot, request.data.transform, -                                     request.data.GetCropRect()); +                                     request.data.GetCropRect(), request.data.swap_interval);              IGBPQueueBufferResponseParcel response{1280, 720};              ctx.WriteBuffer(response.Serialize()); | 
