forked from eden-emu/eden
		
	Merge pull request #3606 from ReinUsesLisp/nvflinger
service/vi: Partially implement BufferQueue disconnect
This commit is contained in:
		
						commit
						bd114e97fc
					
				
					 3 changed files with 44 additions and 10 deletions
				
			
		|  | @ -126,6 +126,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)); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 { | ||||||
|  |  | ||||||
|  | @ -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 || |             break; | ||||||
|                    transaction == TransactionId::DetachBuffer) { |         } | ||||||
|  |         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"); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei