mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-03 22:31:22 +01:00
606c18210d
The whole ownership model was getting a bit of a mess, with a some of special cases to deal with. And I'm planning to make it even more complex in the future. So here is some upfront work to convert it over to reference counted pointers.
133 lines
4.4 KiB
C++
133 lines
4.4 KiB
C++
// Copyright 2009 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "VideoBackends/Software/VideoBackend.h"
|
|
|
|
#include <cstring>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
#include "Common/Common.h"
|
|
#include "Common/CommonTypes.h"
|
|
#include "Common/GL/GLContext.h"
|
|
#include "Common/MsgHandler.h"
|
|
|
|
#include "VideoBackends/Software/Clipper.h"
|
|
#include "VideoBackends/Software/EfbInterface.h"
|
|
#include "VideoBackends/Software/Rasterizer.h"
|
|
#include "VideoBackends/Software/SWOGLWindow.h"
|
|
#include "VideoBackends/Software/SWRenderer.h"
|
|
#include "VideoBackends/Software/SWTexture.h"
|
|
#include "VideoBackends/Software/SWVertexLoader.h"
|
|
#include "VideoBackends/Software/TextureCache.h"
|
|
|
|
#include "VideoCommon/FramebufferManager.h"
|
|
#include "VideoCommon/TextureCacheBase.h"
|
|
#include "VideoCommon/VideoCommon.h"
|
|
#include "VideoCommon/VideoConfig.h"
|
|
|
|
namespace SW
|
|
{
|
|
class PerfQuery : public PerfQueryBase
|
|
{
|
|
public:
|
|
PerfQuery() {}
|
|
~PerfQuery() {}
|
|
void EnableQuery(PerfQueryGroup type) override {}
|
|
void DisableQuery(PerfQueryGroup type) override {}
|
|
void ResetQuery() override { EfbInterface::ResetPerfQuery(); }
|
|
u32 GetQueryResult(PerfQueryType type) override { return EfbInterface::GetPerfQueryResult(type); }
|
|
void FlushResults() override {}
|
|
bool IsFlushed() const override { return true; }
|
|
};
|
|
|
|
std::string VideoSoftware::GetName() const
|
|
{
|
|
return NAME;
|
|
}
|
|
|
|
std::string VideoSoftware::GetDisplayName() const
|
|
{
|
|
return _trans("Software Renderer");
|
|
}
|
|
|
|
std::optional<std::string> VideoSoftware::GetWarningMessage() const
|
|
{
|
|
return _trans("The software renderer is significantly slower than other "
|
|
"backends and is only recommended for debugging purposes.\n\nDo you "
|
|
"really want to enable software rendering? If unsure, select 'No'.");
|
|
}
|
|
|
|
void VideoSoftware::InitBackendInfo()
|
|
{
|
|
g_Config.backend_info.api_type = APIType::Nothing;
|
|
g_Config.backend_info.MaxTextureSize = 16384;
|
|
g_Config.backend_info.bUsesLowerLeftOrigin = false;
|
|
g_Config.backend_info.bSupports3DVision = false;
|
|
g_Config.backend_info.bSupportsDualSourceBlend = true;
|
|
g_Config.backend_info.bSupportsEarlyZ = true;
|
|
g_Config.backend_info.bSupportsPrimitiveRestart = false;
|
|
g_Config.backend_info.bSupportsMultithreading = false;
|
|
g_Config.backend_info.bSupportsComputeShaders = false;
|
|
g_Config.backend_info.bSupportsGPUTextureDecoding = false;
|
|
g_Config.backend_info.bSupportsST3CTextures = false;
|
|
g_Config.backend_info.bSupportsBPTCTextures = false;
|
|
g_Config.backend_info.bSupportsCopyToVram = false;
|
|
g_Config.backend_info.bSupportsLargePoints = false;
|
|
g_Config.backend_info.bSupportsDepthReadback = false;
|
|
g_Config.backend_info.bSupportsPartialDepthCopies = false;
|
|
g_Config.backend_info.bSupportsFramebufferFetch = false;
|
|
g_Config.backend_info.bSupportsBackgroundCompiling = false;
|
|
g_Config.backend_info.bSupportsLogicOp = true;
|
|
g_Config.backend_info.bSupportsShaderBinaries = false;
|
|
g_Config.backend_info.bSupportsPipelineCacheData = false;
|
|
g_Config.backend_info.bSupportsBBox = true;
|
|
g_Config.backend_info.bSupportsCoarseDerivatives = false;
|
|
g_Config.backend_info.bSupportsTextureQueryLevels = false;
|
|
g_Config.backend_info.bSupportsLodBiasInSampler = false;
|
|
g_Config.backend_info.bSupportsSettingObjectNames = false;
|
|
g_Config.backend_info.bSupportsPartialMultisampleResolve = true;
|
|
g_Config.backend_info.bSupportsDynamicVertexLoader = false;
|
|
|
|
// aamodes
|
|
g_Config.backend_info.AAModes = {1};
|
|
}
|
|
|
|
bool VideoSoftware::Initialize(const WindowSystemInfo& wsi)
|
|
{
|
|
InitializeShared();
|
|
|
|
std::unique_ptr<SWOGLWindow> window = SWOGLWindow::Create(wsi);
|
|
if (!window)
|
|
return false;
|
|
|
|
Clipper::Init();
|
|
Rasterizer::Init();
|
|
|
|
g_renderer = std::make_unique<SWRenderer>(std::move(window));
|
|
g_vertex_manager = std::make_unique<SWVertexLoader>();
|
|
g_shader_cache = std::make_unique<VideoCommon::ShaderCache>();
|
|
g_framebuffer_manager = std::make_unique<FramebufferManager>();
|
|
g_perf_query = std::make_unique<PerfQuery>();
|
|
g_texture_cache = std::make_unique<TextureCache>();
|
|
|
|
if (!g_vertex_manager->Initialize() || !g_shader_cache->Initialize() ||
|
|
!g_renderer->Initialize() || !g_framebuffer_manager->Initialize() ||
|
|
!g_texture_cache->Initialize())
|
|
{
|
|
PanicAlertFmt("Failed to initialize renderer classes");
|
|
Shutdown();
|
|
return false;
|
|
}
|
|
|
|
g_shader_cache->InitializeShaderCache();
|
|
return true;
|
|
}
|
|
|
|
void VideoSoftware::Shutdown()
|
|
{
|
|
ShutdownShared();
|
|
}
|
|
} // namespace SW
|