kernel/event: Reference ReadableEvent from WritableEvent

This commit is contained in:
Zach Hilman 2018-11-27 09:18:29 -05:00
parent ff610103b5
commit a342bcc9b1
32 changed files with 175 additions and 317 deletions

View file

@ -16,8 +16,8 @@ namespace Service::NVFlinger {
BufferQueue::BufferQueue(u32 id, u64 layer_id) : id(id), layer_id(layer_id) {
auto& kernel = Core::System::GetInstance().Kernel();
buffer_wait_event = Kernel::WritableEvent::CreateRegisteredEventPair(
kernel, Kernel::ResetType::Sticky, "BufferQueue NativeHandle");
buffer_wait_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Sticky,
"BufferQueue NativeHandle");
}
BufferQueue::~BufferQueue() = default;
@ -31,7 +31,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer)
buffer.status = Buffer::Status::Free;
queue.emplace_back(buffer);
buffer_wait_event->Signal();
buffer_wait_event.writable->Signal();
}
std::optional<u32> BufferQueue::DequeueBuffer(u32 width, u32 height) {
@ -90,7 +90,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
ASSERT(itr->status == Buffer::Status::Acquired);
itr->status = Buffer::Status::Free;
buffer_wait_event->Signal();
buffer_wait_event.writable->Signal();
}
u32 BufferQueue::Query(QueryType type) {
@ -108,13 +108,11 @@ u32 BufferQueue::Query(QueryType type) {
}
Kernel::SharedPtr<Kernel::WritableEvent> BufferQueue::GetWritableBufferWaitEvent() const {
return buffer_wait_event;
return buffer_wait_event.writable;
}
Kernel::SharedPtr<Kernel::ReadableEvent> BufferQueue::GetBufferWaitEvent() const {
const auto& event{
Core::System::GetInstance().Kernel().FindNamedEvent("BufferQueue NativeHandle")};
return event->second;
return buffer_wait_event.readable;
}
} // namespace Service::NVFlinger

View file

@ -11,16 +11,12 @@
#include "common/math_util.h"
#include "common/swap.h"
#include "core/hle/kernel/object.h"
#include "core/hle/kernel/writable_event.h"
namespace CoreTiming {
struct EventType;
}
namespace Kernel {
class ReadableEvent;
class WritableEvent;
} // namespace Kernel
namespace Service::NVFlinger {
struct IGBPBuffer {
@ -100,7 +96,7 @@ private:
u64 layer_id;
std::vector<Buffer> queue;
Kernel::SharedPtr<Kernel::WritableEvent> buffer_wait_event;
Kernel::EventPair buffer_wait_event;
};
} // namespace Service::NVFlinger

View file

@ -87,9 +87,7 @@ u32 NVFlinger::GetBufferQueueId(u64 display_id, u64 layer_id) {
}
Kernel::SharedPtr<Kernel::ReadableEvent> NVFlinger::GetVsyncEvent(u64 display_id) {
const auto& event{Core::System::GetInstance().Kernel().FindNamedEvent(
fmt::format("Display VSync Event {}", display_id))};
return event->second;
return GetDisplay(display_id).vsync_event.readable;
}
std::shared_ptr<BufferQueue> NVFlinger::GetBufferQueue(u32 id) const {
@ -121,7 +119,7 @@ Layer& NVFlinger::GetLayer(u64 display_id, u64 layer_id) {
void NVFlinger::Compose() {
for (auto& display : displays) {
// Trigger vsync for this display at the end of drawing
SCOPE_EXIT({ display.vsync_event->Signal(); });
SCOPE_EXIT({ display.vsync_event.writable->Signal(); });
// Don't do anything for displays without layers.
if (display.layers.empty())
@ -168,8 +166,8 @@ Layer::~Layer() = default;
Display::Display(u64 id, std::string name) : id(id), name(std::move(name)) {
auto& kernel = Core::System::GetInstance().Kernel();
vsync_event = Kernel::WritableEvent::CreateRegisteredEventPair(
kernel, Kernel::ResetType::Pulse, fmt::format("Display VSync Event {}", id));
vsync_event = Kernel::WritableEvent::CreateEventPair(kernel, Kernel::ResetType::Pulse,
fmt::format("Display VSync Event {}", id));
}
Display::~Display() = default;

View file

@ -45,7 +45,7 @@ struct Display {
std::string name;
std::vector<Layer> layers;
Kernel::SharedPtr<Kernel::WritableEvent> vsync_event;
Kernel::EventPair vsync_event;
};
class NVFlinger final {