| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:29:41 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 15:52:35 -04:00
										 |  |  | #include <cstring>
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | #include <memory>
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2017-02-03 12:31:20 -05:00
										 |  |  | #include <utility>
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-07 20:06:58 -05:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2017-05-29 17:02:09 -05:00
										 |  |  | #include "Common/GL/GLInterfaceBase.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/Clipper.h"
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/DebugUtil.h"
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/EfbInterface.h"
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/Rasterizer.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-26 10:07:48 +02:00
										 |  |  | #include "VideoBackends/Software/SWOGLWindow.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-19 12:14:09 +01:00
										 |  |  | #include "VideoBackends/Software/SWRenderer.h"
 | 
					
						
							| 
									
										
										
										
											2017-04-22 23:44:34 -05:00
										 |  |  | #include "VideoBackends/Software/SWTexture.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoBackends/Software/SWVertexLoader.h"
 | 
					
						
							| 
									
										
										
										
											2017-05-29 17:02:09 -05:00
										 |  |  | #include "VideoBackends/Software/TextureCache.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoBackends/Software/VideoBackend.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-17 16:54:31 -05:00
										 |  |  | #include "VideoCommon/FramebufferManagerBase.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoCommon/OnScreenDisplay.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | #include "VideoCommon/TextureCacheBase.h"
 | 
					
						
							| 
									
										
										
										
											2016-07-21 19:04:57 -04:00
										 |  |  | #include "VideoCommon/VideoCommon.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | #include "VideoCommon/VideoConfig.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-17 14:54:20 -06:00
										 |  |  | #define VSYNC_ENABLED 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-31 01:28:32 +00:00
										 |  |  | namespace SW | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | class PerfQuery : public PerfQueryBase | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   PerfQuery() {} | 
					
						
							|  |  |  |   ~PerfQuery() {} | 
					
						
							|  |  |  |   void EnableQuery(PerfQueryGroup type) override {} | 
					
						
							|  |  |  |   void DisableQuery(PerfQueryGroup type) override {} | 
					
						
							|  |  |  |   void ResetQuery() override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     memset(EfbInterface::perf_values, 0, sizeof(EfbInterface::perf_values)); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-07-30 15:56:12 -04:00
										 |  |  |   u32 GetQueryResult(PerfQueryType type) override { return EfbInterface::perf_values[type]; } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void FlushResults() override {} | 
					
						
							| 
									
										
										
										
											2017-07-30 15:56:12 -04:00
										 |  |  |   bool IsFlushed() const override { return true; } | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | std::string VideoSoftware::GetName() const | 
					
						
							| 
									
										
										
										
											2013-02-26 16:42:32 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return "Software Renderer"; | 
					
						
							| 
									
										
										
										
											2013-02-26 16:42:32 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | std::string VideoSoftware::GetDisplayName() const | 
					
						
							| 
									
										
										
										
											2012-12-17 14:54:20 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return "Software Renderer"; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-13 21:38:11 +01:00
										 |  |  | void VideoSoftware::InitBackendInfo() | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-07-21 19:04:57 -04:00
										 |  |  |   g_Config.backend_info.api_type = APIType::Nothing; | 
					
						
							| 
									
										
										
										
											2017-03-10 00:01:23 +10:00
										 |  |  |   g_Config.backend_info.MaxTextureSize = 16384; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   g_Config.backend_info.bSupports3DVision = false; | 
					
						
							|  |  |  |   g_Config.backend_info.bSupportsDualSourceBlend = true; | 
					
						
							|  |  |  |   g_Config.backend_info.bSupportsEarlyZ = true; | 
					
						
							|  |  |  |   g_Config.backend_info.bSupportsOversizedViewports = true; | 
					
						
							|  |  |  |   g_Config.backend_info.bSupportsPrimitiveRestart = false; | 
					
						
							| 
									
										
										
										
											2016-08-13 22:08:46 +10:00
										 |  |  |   g_Config.backend_info.bSupportsMultithreading = false; | 
					
						
							| 
									
										
										
										
											2016-11-27 18:14:55 +10:00
										 |  |  |   g_Config.backend_info.bSupportsComputeShaders = false; | 
					
						
							| 
									
										
										
										
											2016-11-27 18:14:57 +10:00
										 |  |  |   g_Config.backend_info.bSupportsGPUTextureDecoding = false; | 
					
						
							| 
									
										
										
										
											2017-04-16 19:30:11 +10:00
										 |  |  |   g_Config.backend_info.bSupportsST3CTextures = false; | 
					
						
							| 
									
										
										
										
											2017-07-27 22:00:04 +10:00
										 |  |  |   g_Config.backend_info.bSupportsBPTCTextures = false; | 
					
						
							| 
									
										
										
										
											2017-05-29 17:02:09 -05:00
										 |  |  |   g_Config.backend_info.bSupportsCopyToVram = false; | 
					
						
							| 
									
										
										
										
											2017-10-25 22:44:39 -07:00
										 |  |  |   g_Config.backend_info.bSupportsFramebufferFetch = false; | 
					
						
							| 
									
										
										
										
											2018-02-25 17:56:09 +10:00
										 |  |  |   g_Config.backend_info.bSupportsBackgroundCompiling = false; | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // aamodes
 | 
					
						
							|  |  |  |   g_Config.backend_info.AAModes = {1}; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | bool VideoSoftware::Initialize(void* window_handle) | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   InitBackendInfo(); | 
					
						
							| 
									
										
										
										
											2016-01-13 21:14:20 +01:00
										 |  |  |   InitializeShared(); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   SWOGLWindow::Init(window_handle); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   Clipper::Init(); | 
					
						
							|  |  |  |   Rasterizer::Init(); | 
					
						
							|  |  |  |   DebugUtil::Init(); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-26 15:09:07 +10:00
										 |  |  |   GLInterface->MakeCurrent(); | 
					
						
							|  |  |  |   SWOGLWindow::s_instance->Prepare(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_renderer = std::make_unique<SWRenderer>(); | 
					
						
							|  |  |  |   g_vertex_manager = std::make_unique<SWVertexLoader>(); | 
					
						
							|  |  |  |   g_perf_query = std::make_unique<PerfQuery>(); | 
					
						
							|  |  |  |   g_texture_cache = std::make_unique<TextureCache>(); | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   g_shader_cache = std::make_unique<VideoCommon::ShaderCache>(); | 
					
						
							|  |  |  |   return g_shader_cache->Initialize(); | 
					
						
							| 
									
										
										
										
											2013-02-16 17:50:40 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | void VideoSoftware::Shutdown() | 
					
						
							| 
									
										
										
										
											2014-11-13 23:26:49 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-25 01:15:35 +10:00
										 |  |  |   if (g_shader_cache) | 
					
						
							|  |  |  |     g_shader_cache->Shutdown(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-26 15:09:07 +10:00
										 |  |  |   if (g_renderer) | 
					
						
							|  |  |  |     g_renderer->Shutdown(); | 
					
						
							| 
									
										
										
										
											2016-01-13 21:14:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   DebugUtil::Shutdown(); | 
					
						
							| 
									
										
										
										
											2018-01-26 15:09:07 +10:00
										 |  |  |   SWOGLWindow::Shutdown(); | 
					
						
							| 
									
										
										
										
											2016-01-13 21:14:20 +01:00
										 |  |  |   g_framebuffer_manager.reset(); | 
					
						
							|  |  |  |   g_texture_cache.reset(); | 
					
						
							|  |  |  |   g_perf_query.reset(); | 
					
						
							|  |  |  |   g_vertex_manager.reset(); | 
					
						
							|  |  |  |   g_renderer.reset(); | 
					
						
							| 
									
										
										
										
											2018-01-26 15:09:07 +10:00
										 |  |  |   ShutdownShared(); | 
					
						
							| 
									
										
										
										
											2014-02-02 14:16:43 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-16 22:58:24 +00:00
										 |  |  | } |