forked from eden-emu/eden
		
	vi: check layer state before opening or closing
This commit is contained in:
		
							parent
							
								
									5f9a3c23db
								
							
						
					
					
						commit
						c6dc206cd6
					
				
					 4 changed files with 27 additions and 12 deletions
				
			
		|  | @ -174,24 +174,28 @@ void Nvnflinger::CreateLayerAtId(VI::Display& display, u64 layer_id) { | |||
|     display.CreateLayer(layer_id, buffer_id, nvdrv->container); | ||||
| } | ||||
| 
 | ||||
| void Nvnflinger::OpenLayer(u64 layer_id) { | ||||
| bool Nvnflinger::OpenLayer(u64 layer_id) { | ||||
|     const auto lock_guard = Lock(); | ||||
| 
 | ||||
|     for (auto& display : displays) { | ||||
|         if (auto* layer = display.FindLayer(layer_id); layer) { | ||||
|             layer->Open(); | ||||
|             return layer->Open(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void Nvnflinger::CloseLayer(u64 layer_id) { | ||||
| bool Nvnflinger::CloseLayer(u64 layer_id) { | ||||
|     const auto lock_guard = Lock(); | ||||
| 
 | ||||
|     for (auto& display : displays) { | ||||
|         if (auto* layer = display.FindLayer(layer_id); layer) { | ||||
|             layer->Close(); | ||||
|             return layer->Close(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void Nvnflinger::DestroyLayer(u64 layer_id) { | ||||
|  |  | |||
|  | @ -74,10 +74,10 @@ public: | |||
|     [[nodiscard]] std::optional<u64> CreateLayer(u64 display_id); | ||||
| 
 | ||||
|     /// Opens a layer on all displays for the given layer ID.
 | ||||
|     void OpenLayer(u64 layer_id); | ||||
|     bool OpenLayer(u64 layer_id); | ||||
| 
 | ||||
|     /// Closes a layer on all displays for the given layer ID.
 | ||||
|     void CloseLayer(u64 layer_id); | ||||
|     bool CloseLayer(u64 layer_id); | ||||
| 
 | ||||
|     /// Destroys the given layer ID.
 | ||||
|     void DestroyLayer(u64 layer_id); | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <memory> | ||||
| #include <utility> | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| 
 | ||||
|  | @ -75,12 +76,12 @@ public: | |||
|         return open; | ||||
|     } | ||||
| 
 | ||||
|     void Close() { | ||||
|         open = false; | ||||
|     bool Close() { | ||||
|         return std::exchange(open, false); | ||||
|     } | ||||
| 
 | ||||
|     void Open() { | ||||
|         open = true; | ||||
|     bool Open() { | ||||
|         return !std::exchange(open, true); | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|  |  | |||
|  | @ -719,7 +719,12 @@ private: | |||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         nvnflinger.OpenLayer(layer_id); | ||||
|         if (!nvnflinger.OpenLayer(layer_id)) { | ||||
|             LOG_WARNING(Service_VI, "Tried to open layer which was already open"); | ||||
|             IPC::ResponseBuilder rb{ctx, 2}; | ||||
|             rb.Push(ResultOperationFailed); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         android::OutputParcel parcel; | ||||
|         parcel.WriteInterface(NativeWindow{*buffer_queue_id}); | ||||
|  | @ -737,7 +742,12 @@ private: | |||
| 
 | ||||
|         LOG_DEBUG(Service_VI, "called. layer_id=0x{:016X}", layer_id); | ||||
| 
 | ||||
|         nvnflinger.CloseLayer(layer_id); | ||||
|         if (!nvnflinger.CloseLayer(layer_id)) { | ||||
|             LOG_WARNING(Service_VI, "Tried to close layer which was not open"); | ||||
|             IPC::ResponseBuilder rb{ctx, 2}; | ||||
|             rb.Push(ResultOperationFailed); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         IPC::ResponseBuilder rb{ctx, 2}; | ||||
|         rb.Push(ResultSuccess); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Liam
						Liam