summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2020-04-12 17:44:48 +0200
committerGitHub <noreply@github.com>2020-04-12 17:44:48 +0200
commita9f866264dd80aa7115e54404093a7666c425c55 (patch)
tree594a37578141e3db010dc02ba90c5c4776003622 /src
parentMerge pull request #3578 from ReinUsesLisp/vmnmx (diff)
parentservice/vi: Partially implement BufferQueue disconnect (diff)
downloadyuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.gz
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.bz2
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.lz
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.xz
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.tar.zst
yuzu-a9f866264dd80aa7115e54404093a7666c425c55.zip
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp7
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h1
-rw-r--r--src/core/hle/service/vi/vi.cpp46
3 files changed, 44 insertions, 10 deletions
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp
index 9bcafa5fc..f1e3d832a 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue.cpp
@@ -126,6 +126,13 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
buffer_wait_event.writable->Signal();
}
+void BufferQueue::Disconnect() {
+ queue.clear();
+ queue_sequence.clear();
+ id = 1;
+ layer_id = 1;
+}
+
u32 BufferQueue::Query(QueryType type) {
LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type));
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h
index f674823b0..d5f31e567 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -87,6 +87,7 @@ public:
Service::Nvidia::MultiFence& multi_fence);
std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
void ReleaseBuffer(u32 slot);
+ void Disconnect();
u32 Query(QueryType type);
u32 GetId() const {
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index 519da74e0..fdc62d05b 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -513,7 +513,8 @@ private:
auto& buffer_queue = nv_flinger->FindBufferQueue(id);
- if (transaction == TransactionId::Connect) {
+ switch (transaction) {
+ case TransactionId::Connect: {
IGBPConnectRequestParcel request{ctx.ReadBuffer()};
IGBPConnectResponseParcel response{
static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedWidth) *
@@ -521,14 +522,18 @@ private:
static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedHeight) *
Settings::values.resolution_factor)};
ctx.WriteBuffer(response.Serialize());
- } else if (transaction == TransactionId::SetPreallocatedBuffer) {
+ break;
+ }
+ case TransactionId::SetPreallocatedBuffer: {
IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()};
buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer);
IGBPSetPreallocatedBufferResponseParcel response{};
ctx.WriteBuffer(response.Serialize());
- } else if (transaction == TransactionId::DequeueBuffer) {
+ break;
+ }
+ case TransactionId::DequeueBuffer: {
IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()};
const u32 width{request.data.width};
const u32 height{request.data.height};
@@ -556,14 +561,18 @@ private:
},
buffer_queue.GetWritableBufferWaitEvent());
}
- } else if (transaction == TransactionId::RequestBuffer) {
+ break;
+ }
+ case TransactionId::RequestBuffer: {
IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()};
auto& buffer = buffer_queue.RequestBuffer(request.slot);
IGBPRequestBufferResponseParcel response{buffer};
ctx.WriteBuffer(response.Serialize());
- } else if (transaction == TransactionId::QueueBuffer) {
+ break;
+ }
+ case TransactionId::QueueBuffer: {
IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()};
buffer_queue.QueueBuffer(request.data.slot, request.data.transform,
@@ -572,7 +581,9 @@ private:
IGBPQueueBufferResponseParcel response{1280, 720};
ctx.WriteBuffer(response.Serialize());
- } else if (transaction == TransactionId::Query) {
+ break;
+ }
+ case TransactionId::Query: {
IGBPQueryRequestParcel request{ctx.ReadBuffer()};
const u32 value =
@@ -580,15 +591,30 @@ private:
IGBPQueryResponseParcel response{value};
ctx.WriteBuffer(response.Serialize());
- } else if (transaction == TransactionId::CancelBuffer) {
+ break;
+ }
+ case TransactionId::CancelBuffer: {
LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer");
- } else if (transaction == TransactionId::Disconnect ||
- transaction == TransactionId::DetachBuffer) {
+ break;
+ }
+ case TransactionId::Disconnect: {
+ LOG_WARNING(Service_VI, "(STUBBED) called, transaction=Disconnect");
+ const auto buffer = ctx.ReadBuffer();
+
+ buffer_queue.Disconnect();
+
+ IGBPEmptyResponseParcel response{};
+ ctx.WriteBuffer(response.Serialize());
+ break;
+ }
+ case TransactionId::DetachBuffer: {
const auto buffer = ctx.ReadBuffer();
IGBPEmptyResponseParcel response{};
ctx.WriteBuffer(response.Serialize());
- } else {
+ break;
+ }
+ default:
ASSERT_MSG(false, "Unimplemented");
}