|
|
@ -9,17 +9,20 @@
|
|
|
|
#include "core/core.h"
|
|
|
|
#include "core/core.h"
|
|
|
|
#include "core/hle/kernel/k_writable_event.h"
|
|
|
|
#include "core/hle/kernel/k_writable_event.h"
|
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
#include "core/hle/kernel/kernel.h"
|
|
|
|
|
|
|
|
#include "core/hle/service/kernel_helpers.h"
|
|
|
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
|
|
|
#include "core/hle/service/nvflinger/buffer_queue.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace Service::NVFlinger {
|
|
|
|
namespace Service::NVFlinger {
|
|
|
|
|
|
|
|
|
|
|
|
BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id_, u64 layer_id_)
|
|
|
|
BufferQueue::BufferQueue(Kernel::KernelCore& kernel, u32 id_, u64 layer_id_,
|
|
|
|
: id(id_), layer_id(layer_id_), buffer_wait_event{kernel} {
|
|
|
|
KernelHelpers::ServiceContext& service_context_)
|
|
|
|
Kernel::KAutoObject::Create(std::addressof(buffer_wait_event));
|
|
|
|
: id(id_), layer_id(layer_id_), service_context{service_context_} {
|
|
|
|
buffer_wait_event.Initialize("BufferQueue:WaitEvent");
|
|
|
|
buffer_wait_event = service_context.CreateEvent("BufferQueue:WaitEvent");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BufferQueue::~BufferQueue() = default;
|
|
|
|
BufferQueue::~BufferQueue() {
|
|
|
|
|
|
|
|
service_context.CloseEvent(buffer_wait_event);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) {
|
|
|
|
void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer) {
|
|
|
|
ASSERT(slot < buffer_slots);
|
|
|
|
ASSERT(slot < buffer_slots);
|
|
|
@ -41,7 +44,7 @@ void BufferQueue::SetPreallocatedBuffer(u32 slot, const IGBPBuffer& igbp_buffer)
|
|
|
|
.multi_fence = {},
|
|
|
|
.multi_fence = {},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
buffer_wait_event.GetWritableEvent().Signal();
|
|
|
|
buffer_wait_event->GetWritableEvent().Signal();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width,
|
|
|
|
std::optional<std::pair<u32, Service::Nvidia::MultiFence*>> BufferQueue::DequeueBuffer(u32 width,
|
|
|
@ -119,7 +122,7 @@ void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& mult
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
|
|
|
|
|
|
|
|
buffer_wait_event.GetWritableEvent().Signal();
|
|
|
|
buffer_wait_event->GetWritableEvent().Signal();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
|
|
|
|
std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
|
|
|
@ -154,7 +157,7 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
|
|
|
|
|
|
|
|
buffer_wait_event.GetWritableEvent().Signal();
|
|
|
|
buffer_wait_event->GetWritableEvent().Signal();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BufferQueue::Connect() {
|
|
|
|
void BufferQueue::Connect() {
|
|
|
@ -169,7 +172,7 @@ void BufferQueue::Disconnect() {
|
|
|
|
std::unique_lock lock{queue_sequence_mutex};
|
|
|
|
std::unique_lock lock{queue_sequence_mutex};
|
|
|
|
queue_sequence.clear();
|
|
|
|
queue_sequence.clear();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
buffer_wait_event.GetWritableEvent().Signal();
|
|
|
|
buffer_wait_event->GetWritableEvent().Signal();
|
|
|
|
is_connect = false;
|
|
|
|
is_connect = false;
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
free_buffers_condition.notify_one();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -189,11 +192,11 @@ u32 BufferQueue::Query(QueryType type) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Kernel::KWritableEvent& BufferQueue::GetWritableBufferWaitEvent() {
|
|
|
|
Kernel::KWritableEvent& BufferQueue::GetWritableBufferWaitEvent() {
|
|
|
|
return buffer_wait_event.GetWritableEvent();
|
|
|
|
return buffer_wait_event->GetWritableEvent();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Kernel::KReadableEvent& BufferQueue::GetBufferWaitEvent() {
|
|
|
|
Kernel::KReadableEvent& BufferQueue::GetBufferWaitEvent() {
|
|
|
|
return buffer_wait_event.GetReadableEvent();
|
|
|
|
return buffer_wait_event->GetReadableEvent();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace Service::NVFlinger
|
|
|
|
} // namespace Service::NVFlinger
|
|
|
|