| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/Clipper.h"
 | 
					
						
							|  |  |  | #include "VideoBackends/Software/DebugUtil.h"
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | #include "VideoBackends/Software/EfbCopy.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #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"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoBackends/Software/SWVertexLoader.h"
 | 
					
						
							|  |  |  | #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)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   u32 GetQueryResult(PerfQueryType type) override { return EfbInterface::perf_values[type]; }; | 
					
						
							|  |  |  |   void FlushResults() override {} | 
					
						
							|  |  |  |   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
										 |  |  | class TextureCache : public TextureCacheBase | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2016-08-13 22:56:01 +10:00
										 |  |  |   bool CompileShaders() override { return true; } | 
					
						
							|  |  |  |   void DeleteShaders() override {} | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void ConvertTexture(TCacheEntryBase* entry, TCacheEntryBase* unconverted, void* palette, | 
					
						
							| 
									
										
										
										
											2016-08-13 22:56:01 +10:00
										 |  |  |                       TlutFormat format) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void CopyEFB(u8* dst, u32 format, u32 native_width, u32 bytes_per_row, u32 num_blocks_y, | 
					
						
							| 
									
										
										
										
											2016-12-26 20:54:37 +01:00
										 |  |  |                u32 memory_stride, bool is_depth_copy, const EFBRectangle& srcRect, bool isIntensity, | 
					
						
							|  |  |  |                bool scaleByHalf) override | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   { | 
					
						
							|  |  |  |     EfbCopy::CopyEfb(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   struct TCacheEntry : TCacheEntryBase | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     TCacheEntry(const TCacheEntryConfig& _config) : TCacheEntryBase(_config) {} | 
					
						
							|  |  |  |     ~TCacheEntry() {} | 
					
						
							| 
									
										
										
										
											2016-09-06 18:57:58 -04:00
										 |  |  |     void Load(const u8* buffer, u32 width, u32 height, u32 expanded_width, u32 level) override {} | 
					
						
							| 
									
										
										
										
											2016-12-26 21:33:57 +01:00
										 |  |  |     void FromRenderTarget(bool is_depth_copy, const EFBRectangle& srcRect, bool scaleByHalf, | 
					
						
							|  |  |  |                           unsigned int cbufid, const float* colmat) override | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |       EfbCopy::CopyEfb(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void CopyRectangleFromTexture(const TCacheEntryBase* source, | 
					
						
							|  |  |  |                                   const MathUtil::Rectangle<int>& srcrect, | 
					
						
							|  |  |  |                                   const MathUtil::Rectangle<int>& dstrect) override | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void Bind(unsigned int stage) override {} | 
					
						
							|  |  |  |     bool Save(const std::string& filename, unsigned int level) override { return false; } | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   TCacheEntryBase* CreateTexture(const TCacheEntryConfig& config) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return new TCacheEntry(config); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | class XFBSource : public XFBSourceBase | 
					
						
							| 
									
										
										
										
											2011-02-08 11:02:34 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) override {} | 
					
						
							|  |  |  |   void CopyEFB(float Gamma) override {} | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | class FramebufferManager : public FramebufferManagerBase | 
					
						
							| 
									
										
										
										
											2010-06-24 20:54:03 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   std::unique_ptr<XFBSourceBase> CreateXFBSource(unsigned int target_width, | 
					
						
							|  |  |  |                                                  unsigned int target_height, | 
					
						
							|  |  |  |                                                  unsigned int layers) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return std::make_unique<XFBSource>(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-02-03 12:31:20 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   std::pair<u32, u32> GetTargetSize() const override { return std::make_pair(0, 0); } | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   void CopyToRealXFB(u32 xfbAddr, u32 fbStride, u32 fbHeight, const EFBRectangle& sourceRc, | 
					
						
							|  |  |  |                      float Gamma = 1.0f) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     EfbCopy::CopyEfb(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2013-04-13 00:48:53 -05: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; | 
					
						
							| 
									
										
										
										
											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-10 23:26:57 +10:00
										 |  |  |   g_Config.backend_info.bSupportsInternalResolutionFrameDumps = 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(); | 
					
						
							|  |  |  |   SWRenderer::Init(); | 
					
						
							|  |  |  |   DebugUtil::Init(); | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return true; | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   SWOGLWindow::Shutdown(); | 
					
						
							| 
									
										
										
										
											2016-01-13 21:14:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   ShutdownShared(); | 
					
						
							| 
									
										
										
										
											2013-08-20 23:51:39 +12:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | void VideoSoftware::Video_Cleanup() | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-01-13 21:14:20 +01:00
										 |  |  |   CleanupShared(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SWRenderer::Shutdown(); | 
					
						
							|  |  |  |   DebugUtil::Shutdown(); | 
					
						
							|  |  |  |   // The following calls are NOT Thread Safe
 | 
					
						
							|  |  |  |   // And need to be called from the video thread
 | 
					
						
							|  |  |  |   SWRenderer::Shutdown(); | 
					
						
							|  |  |  |   g_framebuffer_manager.reset(); | 
					
						
							|  |  |  |   g_texture_cache.reset(); | 
					
						
							|  |  |  |   g_perf_query.reset(); | 
					
						
							|  |  |  |   g_vertex_manager.reset(); | 
					
						
							|  |  |  |   g_renderer.reset(); | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-09 20:50:36 +02:00
										 |  |  | // This is called after Video_Initialize() from the Core
 | 
					
						
							|  |  |  | void VideoSoftware::Video_Prepare() | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   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>(); | 
					
						
							|  |  |  |   SWRenderer::Init(); | 
					
						
							|  |  |  |   g_framebuffer_manager = std::make_unique<FramebufferManager>(); | 
					
						
							| 
									
										
										
										
											2014-02-02 14:16:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-16 22:48:17 +00:00
										 |  |  | unsigned int VideoSoftware::PeekMessages() | 
					
						
							| 
									
										
										
										
											2011-02-07 22:01:08 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   return SWOGLWindow::s_instance->PeekMessages(); | 
					
						
							| 
									
										
										
										
											2011-02-07 22:01:08 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-03-16 22:58:24 +00:00
										 |  |  | } |