summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.cpp14
-rw-r--r--src/core/hle/service/nvflinger/buffer_queue.h1
-rw-r--r--src/core/hle/service/vi/vi.cpp52
3 files changed, 53 insertions, 14 deletions
diff --git a/src/core/hle/service/nvflinger/buffer_queue.cpp b/src/core/hle/service/nvflinger/buffer_queue.cpp
index 637b310d7..4f1e210b1 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.cpp
+++ b/src/core/hle/service/nvflinger/buffer_queue.cpp
@@ -99,6 +99,20 @@ void BufferQueue::QueueBuffer(u32 slot, BufferTransformFlags transform,
99 queue_sequence.push_back(slot); 99 queue_sequence.push_back(slot);
100} 100}
101 101
102void BufferQueue::CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence) {
103 const auto itr = std::find_if(queue.begin(), queue.end(),
104 [slot](const Buffer& buffer) { return buffer.slot == slot; });
105 ASSERT(itr != queue.end());
106 ASSERT(itr->status != Buffer::Status::Free);
107 itr->status = Buffer::Status::Free;
108 itr->multi_fence = multi_fence;
109 itr->swap_interval = 0;
110
111 free_buffers.push_back(slot);
112
113 buffer_wait_event.writable->Signal();
114}
115
102std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() { 116std::optional<std::reference_wrapper<const BufferQueue::Buffer>> BufferQueue::AcquireBuffer() {
103 auto itr = queue.end(); 117 auto itr = queue.end();
104 // Iterate to find a queued buffer matching the requested slot. 118 // Iterate to find a queued buffer matching the requested slot.
diff --git a/src/core/hle/service/nvflinger/buffer_queue.h b/src/core/hle/service/nvflinger/buffer_queue.h
index 8a837e5aa..e7517c7e1 100644
--- a/src/core/hle/service/nvflinger/buffer_queue.h
+++ b/src/core/hle/service/nvflinger/buffer_queue.h
@@ -95,6 +95,7 @@ public:
95 void QueueBuffer(u32 slot, BufferTransformFlags transform, 95 void QueueBuffer(u32 slot, BufferTransformFlags transform,
96 const Common::Rectangle<int>& crop_rect, u32 swap_interval, 96 const Common::Rectangle<int>& crop_rect, u32 swap_interval,
97 Service::Nvidia::MultiFence& multi_fence); 97 Service::Nvidia::MultiFence& multi_fence);
98 void CancelBuffer(u32 slot, const Service::Nvidia::MultiFence& multi_fence);
98 std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer(); 99 std::optional<std::reference_wrapper<const Buffer>> AcquireBuffer();
99 void ReleaseBuffer(u32 slot); 100 void ReleaseBuffer(u32 slot);
100 void Disconnect(); 101 void Disconnect();
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp
index d380c60fb..5b0e371fe 100644
--- a/src/core/hle/service/vi/vi.cpp
+++ b/src/core/hle/service/vi/vi.cpp
@@ -215,10 +215,9 @@ public:
215 explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { 215 explicit IGBPConnectRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
216 Deserialize(); 216 Deserialize();
217 } 217 }
218 ~IGBPConnectRequestParcel() override = default;
219 218
220 void DeserializeData() override { 219 void DeserializeData() override {
221 std::u16string token = ReadInterfaceToken(); 220 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
222 data = Read<Data>(); 221 data = Read<Data>();
223 } 222 }
224 223
@@ -279,10 +278,9 @@ public:
279 : Parcel(std::move(buffer)) { 278 : Parcel(std::move(buffer)) {
280 Deserialize(); 279 Deserialize();
281 } 280 }
282 ~IGBPSetPreallocatedBufferRequestParcel() override = default;
283 281
284 void DeserializeData() override { 282 void DeserializeData() override {
285 std::u16string token = ReadInterfaceToken(); 283 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
286 data = Read<Data>(); 284 data = Read<Data>();
287 buffer = Read<NVFlinger::IGBPBuffer>(); 285 buffer = Read<NVFlinger::IGBPBuffer>();
288 } 286 }
@@ -306,15 +304,40 @@ protected:
306 } 304 }
307}; 305};
308 306
307class IGBPCancelBufferRequestParcel : public Parcel {
308public:
309 explicit IGBPCancelBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
310 Deserialize();
311 }
312
313 void DeserializeData() override {
314 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
315 data = Read<Data>();
316 }
317
318 struct Data {
319 u32_le slot;
320 Service::Nvidia::MultiFence multi_fence;
321 };
322
323 Data data;
324};
325
326class IGBPCancelBufferResponseParcel : public Parcel {
327protected:
328 void SerializeData() override {
329 Write<u32>(0); // Success
330 }
331};
332
309class IGBPDequeueBufferRequestParcel : public Parcel { 333class IGBPDequeueBufferRequestParcel : public Parcel {
310public: 334public:
311 explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { 335 explicit IGBPDequeueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
312 Deserialize(); 336 Deserialize();
313 } 337 }
314 ~IGBPDequeueBufferRequestParcel() override = default;
315 338
316 void DeserializeData() override { 339 void DeserializeData() override {
317 std::u16string token = ReadInterfaceToken(); 340 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
318 data = Read<Data>(); 341 data = Read<Data>();
319 } 342 }
320 343
@@ -333,7 +356,6 @@ class IGBPDequeueBufferResponseParcel : public Parcel {
333public: 356public:
334 explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence) 357 explicit IGBPDequeueBufferResponseParcel(u32 slot, Service::Nvidia::MultiFence& multi_fence)
335 : slot(slot), multi_fence(multi_fence) {} 358 : slot(slot), multi_fence(multi_fence) {}
336 ~IGBPDequeueBufferResponseParcel() override = default;
337 359
338protected: 360protected:
339 void SerializeData() override { 361 void SerializeData() override {
@@ -352,10 +374,9 @@ public:
352 explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { 374 explicit IGBPRequestBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
353 Deserialize(); 375 Deserialize();
354 } 376 }
355 ~IGBPRequestBufferRequestParcel() override = default;
356 377
357 void DeserializeData() override { 378 void DeserializeData() override {
358 std::u16string token = ReadInterfaceToken(); 379 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
359 slot = Read<u32_le>(); 380 slot = Read<u32_le>();
360 } 381 }
361 382
@@ -384,10 +405,9 @@ public:
384 explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { 405 explicit IGBPQueueBufferRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
385 Deserialize(); 406 Deserialize();
386 } 407 }
387 ~IGBPQueueBufferRequestParcel() override = default;
388 408
389 void DeserializeData() override { 409 void DeserializeData() override {
390 std::u16string token = ReadInterfaceToken(); 410 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
391 data = Read<Data>(); 411 data = Read<Data>();
392 } 412 }
393 413
@@ -447,10 +467,9 @@ public:
447 explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) { 467 explicit IGBPQueryRequestParcel(std::vector<u8> buffer) : Parcel(std::move(buffer)) {
448 Deserialize(); 468 Deserialize();
449 } 469 }
450 ~IGBPQueryRequestParcel() override = default;
451 470
452 void DeserializeData() override { 471 void DeserializeData() override {
453 std::u16string token = ReadInterfaceToken(); 472 [[maybe_unused]] const std::u16string token = ReadInterfaceToken();
454 type = Read<u32_le>(); 473 type = Read<u32_le>();
455 } 474 }
456 475
@@ -596,7 +615,12 @@ private:
596 break; 615 break;
597 } 616 }
598 case TransactionId::CancelBuffer: { 617 case TransactionId::CancelBuffer: {
599 LOG_CRITICAL(Service_VI, "(STUBBED) called, transaction=CancelBuffer"); 618 IGBPCancelBufferRequestParcel request{ctx.ReadBuffer()};
619
620 buffer_queue.CancelBuffer(request.data.slot, request.data.multi_fence);
621
622 IGBPCancelBufferResponseParcel response{};
623 ctx.WriteBuffer(response.Serialize());
600 break; 624 break;
601 } 625 }
602 case TransactionId::Disconnect: { 626 case TransactionId::Disconnect: {