mirror of
				https://github.com/N64Recomp/N64ModernRuntime.git
				synced 2025-10-30 08:02:29 +00:00 
			
		
		
		
	Allow renderers to pick the graphics API (#96)
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / ubuntu (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / windows (x64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (arm64, Release) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Debug) (push) Has been cancelled
				
			
		
			
				
	
				validate / macos (x64, Release) (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	validate / ubuntu (arm64, Debug) (push) Has been cancelled
				
			validate / ubuntu (arm64, Release) (push) Has been cancelled
				
			validate / ubuntu (x64, Debug) (push) Has been cancelled
				
			validate / ubuntu (x64, Release) (push) Has been cancelled
				
			validate / windows (x64, Debug) (push) Has been cancelled
				
			validate / windows (x64, Release) (push) Has been cancelled
				
			validate / macos (arm64, Debug) (push) Has been cancelled
				
			validate / macos (arm64, Release) (push) Has been cancelled
				
			validate / macos (x64, Debug) (push) Has been cancelled
				
			validate / macos (x64, Release) (push) Has been cancelled
				
			This commit is contained in:
		
							parent
							
								
									2ed84f46c5
								
							
						
					
					
						commit
						6f8393f691
					
				
					 4 changed files with 23 additions and 36 deletions
				
			
		|  | @ -74,8 +74,6 @@ namespace ultramodern { | |||
| 
 | ||||
|             virtual ~GraphicsConfig() = default; | ||||
| 
 | ||||
|             std::string get_graphics_api_name() const; | ||||
| 
 | ||||
|             auto operator<=>(const GraphicsConfig& rhs) const = default; | ||||
|         }; | ||||
| 
 | ||||
|  | @ -103,6 +101,7 @@ namespace ultramodern { | |||
|             {ultramodern::renderer::GraphicsApi::Auto, "Auto"}, | ||||
|             {ultramodern::renderer::GraphicsApi::D3D12, "D3D12"}, | ||||
|             {ultramodern::renderer::GraphicsApi::Vulkan, "Vulkan"}, | ||||
|             {ultramodern::renderer::GraphicsApi::Metal, "Metal"}, | ||||
|         }); | ||||
| 
 | ||||
|         NLOHMANN_JSON_SERIALIZE_ENUM(ultramodern::renderer::AspectRatio, { | ||||
|  |  | |||
|  | @ -62,6 +62,7 @@ namespace ultramodern { | |||
| 
 | ||||
|                 virtual bool valid() = 0; | ||||
|                 virtual SetupResult get_setup_result() const { return setup_result; } | ||||
|                 virtual GraphicsApi get_chosen_api() const { return chosen_api; } | ||||
| 
 | ||||
|                 virtual bool update_config(const GraphicsConfig& old_config, const GraphicsConfig& new_config) = 0; | ||||
| 
 | ||||
|  | @ -74,11 +75,12 @@ namespace ultramodern { | |||
| 
 | ||||
|             protected: | ||||
|                 SetupResult setup_result; | ||||
|                 GraphicsApi chosen_api; | ||||
|         }; | ||||
| 
 | ||||
|         struct callbacks_t { | ||||
|             using create_render_context_t = std::unique_ptr<RendererContext>(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); | ||||
|             using get_graphics_api_name_t = std::string(const GraphicsConfig& config); | ||||
|             using get_graphics_api_name_t = std::string(GraphicsApi api); | ||||
| 
 | ||||
|             /**
 | ||||
|              * Instances a subclass of RendererContext that is used to render the game. | ||||
|  | @ -97,7 +99,7 @@ namespace ultramodern { | |||
| 
 | ||||
|         std::unique_ptr<RendererContext> create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); | ||||
| 
 | ||||
|         std::string get_graphics_api_name(const GraphicsConfig& config); | ||||
|         std::string get_graphics_api_name(GraphicsApi api); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -249,6 +249,7 @@ void ultramodern::trigger_config_action() { | |||
| } | ||||
| 
 | ||||
| std::atomic<ultramodern::renderer::SetupResult> renderer_setup_result = ultramodern::renderer::SetupResult::Success; | ||||
| std::atomic<ultramodern::renderer::GraphicsApi> renderer_chosen_api = ultramodern::renderer::GraphicsApi::Auto; | ||||
| 
 | ||||
| void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) { | ||||
|     bool enabled_instant_present = false; | ||||
|  | @ -261,6 +262,7 @@ void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_re | |||
| 
 | ||||
|     auto renderer_context = ultramodern::renderer::create_render_context(rdram, window_handle, ultramodern::renderer::get_graphics_config().developer_mode); | ||||
| 
 | ||||
|     renderer_chosen_api.store(renderer_context->get_chosen_api()); | ||||
|     if (!renderer_context->valid()) { | ||||
|         renderer_setup_result.store(renderer_context->get_setup_result()); | ||||
|         // Notify the caller thread that this thread is ready.
 | ||||
|  | @ -534,10 +536,10 @@ void ultramodern::init_events(RDRAM_ARG ultramodern::renderer::WindowHandle wind | |||
|                 show_renderer_error("Failed to load dynamic libraries. Make sure the DLLs are next to the recomp executable."); | ||||
|                 break; | ||||
|             case ultramodern::renderer::SetupResult::InvalidGraphicsAPI: | ||||
|                 show_renderer_error(ultramodern::renderer::get_graphics_api_name(ultramodern::renderer::get_graphics_config()) + " is not supported on this platform. Please select a different graphics API."); | ||||
|                 show_renderer_error(ultramodern::renderer::get_graphics_api_name(renderer_chosen_api.load()) + " is not supported on this platform. Please select a different graphics API."); | ||||
|                 break; | ||||
|             case ultramodern::renderer::SetupResult::GraphicsAPINotFound: | ||||
|                 show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(ultramodern::renderer::get_graphics_config()) + "." + driver_os_suffix); | ||||
|                 show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(renderer_chosen_api.load()) + "." + driver_os_suffix); | ||||
|                 break; | ||||
|             case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound: | ||||
|                 show_renderer_error("Unable to find compatible graphics device." + driver_os_suffix); | ||||
|  |  | |||
|  | @ -20,11 +20,22 @@ std::unique_ptr<ultramodern::renderer::RendererContext> ultramodern::renderer::c | |||
|     return render_callbacks.create_render_context(rdram, window_handle, developer_mode); | ||||
| } | ||||
| 
 | ||||
| std::string ultramodern::renderer::get_graphics_api_name(const GraphicsConfig& config) { | ||||
| std::string ultramodern::renderer::get_graphics_api_name(GraphicsApi api) { | ||||
|     if (render_callbacks.get_graphics_api_name != nullptr) { | ||||
|         return render_callbacks.get_graphics_api_name(config); | ||||
|         return render_callbacks.get_graphics_api_name(api); | ||||
|     } | ||||
|     switch (api) { | ||||
|     case ultramodern::renderer::GraphicsApi::Auto: | ||||
|         return "Auto"; | ||||
|     case ultramodern::renderer::GraphicsApi::D3D12: | ||||
|         return "D3D12"; | ||||
|     case ultramodern::renderer::GraphicsApi::Vulkan: | ||||
|         return "Vulkan"; | ||||
|     case ultramodern::renderer::GraphicsApi::Metal: | ||||
|         return "Metal"; | ||||
|     default: | ||||
|         return "[Unknown graphics API]"; | ||||
|     } | ||||
|     return config.get_graphics_api_name(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -41,30 +52,3 @@ const ultramodern::renderer::GraphicsConfig& ultramodern::renderer::get_graphics | |||
|     std::lock_guard<std::mutex> lock(graphic_config_mutex); | ||||
|     return graphic_config; | ||||
| } | ||||
| 
 | ||||
| std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const { | ||||
|     ultramodern::renderer::GraphicsApi api = api_option; | ||||
| 
 | ||||
|     if (api == ultramodern::renderer::GraphicsApi::Auto) { | ||||
| #if defined(_WIN32) | ||||
|         api = ultramodern::renderer::GraphicsApi::D3D12; | ||||
| #elif defined(__gnu_linux__) | ||||
|         api = ultramodern::renderer::GraphicsApi::Vulkan; | ||||
| #elif defined(__APPLE__) | ||||
|         api = ultramodern::renderer::GraphicsApi::Metal; | ||||
| #else | ||||
|         static_assert(false && "Unimplemented") | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     switch (api) { | ||||
|         case ultramodern::renderer::GraphicsApi::D3D12: | ||||
|             return "D3D12"; | ||||
|         case ultramodern::renderer::GraphicsApi::Vulkan: | ||||
|             return "Vulkan"; | ||||
|         case ultramodern::renderer::GraphicsApi::Metal: | ||||
|             return "Metal"; | ||||
|         default: | ||||
|             return "[Unknown graphics API]"; | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Wiseguy
						Wiseguy