Kaynağa Gözat

service/vi: Partially implement BufferQueue disconnect

ReinUsesLisp 6 yıl önce
ebeveyn
işleme
8c0ba9c6fe

+ 7 - 0
src/core/hle/service/nvflinger/buffer_queue.cpp

@@ -103,6 +103,13 @@ void BufferQueue::ReleaseBuffer(u32 slot) {
     buffer_wait_event.writable->Signal();
     buffer_wait_event.writable->Signal();
 }
 }
 
 
+void BufferQueue::Disconnect() {
+    queue.clear();
+    queue_sequence.clear();
+    id = 1;
+    layer_id = 1;
+}
+
 u32 BufferQueue::Query(QueryType type) {
 u32 BufferQueue::Query(QueryType type) {
     LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type));
     LOG_WARNING(Service, "(STUBBED) called type={}", static_cast<u32>(type));
 
 

+ 1 - 0
src/core/hle/service/nvflinger/buffer_queue.h

@@ -87,6 +87,7 @@ public:
                      Service::Nvidia::MultiFence& multi_fence);
                      Service::Nvidia::MultiFence& multi_fence);
     std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
     std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
     void ReleaseBuffer(u32 slot);
     void ReleaseBuffer(u32 slot);
+    void Disconnect();
     u32 Query(QueryType type);
     u32 Query(QueryType type);
 
 
     u32 GetId() const {
     u32 GetId() const {

+ 36 - 10
src/core/hle/service/vi/vi.cpp

@@ -513,7 +513,8 @@ private:
 
 
         auto& buffer_queue = nv_flinger->FindBufferQueue(id);
         auto& buffer_queue = nv_flinger->FindBufferQueue(id);
 
 
-        if (transaction == TransactionId::Connect) {
+        switch (transaction) {
+        case TransactionId::Connect: {
             IGBPConnectRequestParcel request{ctx.ReadBuffer()};
             IGBPConnectRequestParcel request{ctx.ReadBuffer()};
             IGBPConnectResponseParcel response{
             IGBPConnectResponseParcel response{
                 static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedWidth) *
                 static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedWidth) *
@@ -521,14 +522,18 @@ private:
                 static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedHeight) *
                 static_cast<u32>(static_cast<u32>(DisplayResolution::UndockedHeight) *
                                  Settings::values.resolution_factor)};
                                  Settings::values.resolution_factor)};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else if (transaction == TransactionId::SetPreallocatedBuffer) {
+            break;
+        }
+        case TransactionId::SetPreallocatedBuffer: {
             IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()};
             IGBPSetPreallocatedBufferRequestParcel request{ctx.ReadBuffer()};
 
 
             buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer);
             buffer_queue.SetPreallocatedBuffer(request.data.slot, request.buffer);
 
 
             IGBPSetPreallocatedBufferResponseParcel response{};
             IGBPSetPreallocatedBufferResponseParcel response{};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else if (transaction == TransactionId::DequeueBuffer) {
+            break;
+        }
+        case TransactionId::DequeueBuffer: {
             IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()};
             IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()};
             const u32 width{request.data.width};
             const u32 width{request.data.width};
             const u32 height{request.data.height};
             const u32 height{request.data.height};
@@ -556,14 +561,18 @@ private:
                     },
                     },
                     buffer_queue.GetWritableBufferWaitEvent());
                     buffer_queue.GetWritableBufferWaitEvent());
             }
             }
-        } else if (transaction == TransactionId::RequestBuffer) {
+            break;
+        }
+        case TransactionId::RequestBuffer: {
             IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()};
             IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()};
 
 
             auto& buffer = buffer_queue.RequestBuffer(request.slot);
             auto& buffer = buffer_queue.RequestBuffer(request.slot);
 
 
             IGBPRequestBufferResponseParcel response{buffer};
             IGBPRequestBufferResponseParcel response{buffer};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else if (transaction == TransactionId::QueueBuffer) {
+            break;
+        }
+        case TransactionId::QueueBuffer: {
             IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()};
             IGBPQueueBufferRequestParcel request{ctx.ReadBuffer()};
 
 
             buffer_queue.QueueBuffer(request.data.slot, request.data.transform,
             buffer_queue.QueueBuffer(request.data.slot, request.data.transform,
@@ -572,7 +581,9 @@ private:
 
 
             IGBPQueueBufferResponseParcel response{1280, 720};
             IGBPQueueBufferResponseParcel response{1280, 720};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else if (transaction == TransactionId::Query) {
+            break;
+        }
+        case TransactionId::Query: {
             IGBPQueryRequestParcel request{ctx.ReadBuffer()};
             IGBPQueryRequestParcel request{ctx.ReadBuffer()};
 
 
             const u32 value =
             const u32 value =
@@ -580,15 +591,30 @@ private:
 
 
             IGBPQueryResponseParcel response{value};
             IGBPQueryResponseParcel response{value};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else if (transaction == TransactionId::CancelBuffer) {
+            break;
+        }
+        case TransactionId::CancelBuffer: {
             LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=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();
             const auto buffer = ctx.ReadBuffer();
 
 
             IGBPEmptyResponseParcel response{};
             IGBPEmptyResponseParcel response{};
             ctx.WriteBuffer(response.Serialize());
             ctx.WriteBuffer(response.Serialize());
-        } else {
+            break;
+        }
+        default:
             ASSERT_MSG(false, "Unimplemented");
             ASSERT_MSG(false, "Unimplemented");
         }
         }