forked from eden-emu/eden
		
	vi: Remove DequeueBuffer and wait until next available buffer.
This commit is contained in:
		
							parent
							
								
									7750edae39
								
							
						
					
					
						commit
						bae5ccd6d2
					
				
					 3 changed files with 48 additions and 11 deletions
				
			
		|  | @ -486,12 +486,30 @@ private: | |||
|             ctx.WriteBuffer(response.Serialize()); | ||||
|         } else if (transaction == TransactionId::DequeueBuffer) { | ||||
|             IGBPDequeueBufferRequestParcel request{ctx.ReadBuffer()}; | ||||
|             const u32 width{request.data.width}; | ||||
|             const u32 height{request.data.height}; | ||||
|             boost::optional<u32> slot = buffer_queue->DequeueBuffer(width, height); | ||||
| 
 | ||||
|             u32 slot = buffer_queue->DequeueBuffer(request.data.pixel_format, request.data.width, | ||||
|                                                    request.data.height); | ||||
| 
 | ||||
|             IGBPDequeueBufferResponseParcel response{slot}; | ||||
|             ctx.WriteBuffer(response.Serialize()); | ||||
|             if (slot != boost::none) { | ||||
|                 // Buffer is available
 | ||||
|                 IGBPDequeueBufferResponseParcel response{*slot}; | ||||
|                 ctx.WriteBuffer(response.Serialize()); | ||||
|             } else { | ||||
|                 // Wait the current thread until a buffer becomes available
 | ||||
|                 auto wait_event = ctx.SleepClientThread( | ||||
|                     Kernel::GetCurrentThread(), "IHOSBinderDriver::DequeueBuffer", -1, | ||||
|                     [=](Kernel::SharedPtr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx, | ||||
|                         ThreadWakeupReason reason) { | ||||
|                         // Repeat TransactParcel DequeueBuffer when a buffer is available
 | ||||
|                         auto buffer_queue = nv_flinger->GetBufferQueue(id); | ||||
|                         boost::optional<u32> slot = buffer_queue->DequeueBuffer(width, height); | ||||
|                         IGBPDequeueBufferResponseParcel response{*slot}; | ||||
|                         ctx.WriteBuffer(response.Serialize()); | ||||
|                         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|                         rb.Push(RESULT_SUCCESS); | ||||
|                     }); | ||||
|                 buffer_queue->SetBufferWaitEvent(std::move(wait_event)); | ||||
|             } | ||||
|         } else if (transaction == TransactionId::RequestBuffer) { | ||||
|             IGBPRequestBufferRequestParcel request{ctx.ReadBuffer()}; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bunnei
						bunnei