libretro: Re-enable hw context switch, add auto option

This commit is contained in:
Connor McLaughlin 2020-08-23 14:42:53 +10:00
parent df14519a97
commit 17b5c749bf
6 changed files with 42 additions and 33 deletions

View File

@ -49,6 +49,7 @@ add_library(common
jit_code_buffer.h jit_code_buffer.h
log.cpp log.cpp
log.h log.h
make_array.h
md5_digest.cpp md5_digest.cpp
md5_digest.h md5_digest.h
minizip_helpers.cpp minizip_helpers.cpp

View File

@ -66,6 +66,7 @@
<ClInclude Include="iso_reader.h" /> <ClInclude Include="iso_reader.h" />
<ClInclude Include="jit_code_buffer.h" /> <ClInclude Include="jit_code_buffer.h" />
<ClInclude Include="log.h" /> <ClInclude Include="log.h" />
<ClInclude Include="make_array.h" />
<ClInclude Include="md5_digest.h" /> <ClInclude Include="md5_digest.h" />
<ClInclude Include="null_audio_stream.h" /> <ClInclude Include="null_audio_stream.h" />
<ClInclude Include="progress_callback.h" /> <ClInclude Include="progress_callback.h" />

View File

@ -101,6 +101,7 @@
<ClInclude Include="image.h" /> <ClInclude Include="image.h" />
<ClInclude Include="minizip_helpers.h" /> <ClInclude Include="minizip_helpers.h" />
<ClInclude Include="win32_progress_callback.h" /> <ClInclude Include="win32_progress_callback.h" />
<ClInclude Include="make_array.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="jit_code_buffer.cpp" /> <ClCompile Include="jit_code_buffer.cpp" />
@ -210,4 +211,4 @@
<UniqueIdentifier>{642ff5eb-af39-4aab-a42f-6eb8188a11d7}</UniqueIdentifier> <UniqueIdentifier>{642ff5eb-af39-4aab-a42f-6eb8188a11d7}</UniqueIdentifier>
</Filter> </Filter>
</ItemGroup> </ItemGroup>
</Project> </Project>

12
src/common/make_array.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include <array>
#include <type_traits>
// Source: https://gist.github.com/klmr/2775736#file-make_array-hpp
template<typename... T>
constexpr auto make_array(T&&... values)
-> std::array<typename std::decay<typename std::common_type<T...>::type>::type, sizeof...(T)>
{
return {std::forward<T>(values)...};
}

View File

@ -1,4 +1,5 @@
#include "settings.h" #include "settings.h"
#include "common/make_array.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "host_interface.h" #include "host_interface.h"
#include <algorithm> #include <algorithm>
@ -380,7 +381,8 @@ const char* Settings::GetDiscRegionDisplayName(DiscRegion region)
static std::array<const char*, 3> s_cpu_execution_mode_names = {{"Interpreter", "CachedInterpreter", "Recompiler"}}; static std::array<const char*, 3> s_cpu_execution_mode_names = {{"Interpreter", "CachedInterpreter", "Recompiler"}};
static std::array<const char*, 3> s_cpu_execution_mode_display_names = { static std::array<const char*, 3> s_cpu_execution_mode_display_names = {
{TRANSLATABLE("CPUExecutionMode", "Intepreter (Slowest)"), TRANSLATABLE("CPUExecutionMode", "Cached Interpreter (Faster)"), {TRANSLATABLE("CPUExecutionMode", "Intepreter (Slowest)"),
TRANSLATABLE("CPUExecutionMode", "Cached Interpreter (Faster)"),
TRANSLATABLE("CPUExecutionMode", "Recompiler (Fastest)")}}; TRANSLATABLE("CPUExecutionMode", "Recompiler (Fastest)")}};
std::optional<CPUExecutionMode> Settings::ParseCPUExecutionMode(const char* str) std::optional<CPUExecutionMode> Settings::ParseCPUExecutionMode(const char* str)
@ -407,17 +409,17 @@ const char* Settings::GetCPUExecutionModeDisplayName(CPUExecutionMode mode)
return s_cpu_execution_mode_display_names[static_cast<u8>(mode)]; return s_cpu_execution_mode_display_names[static_cast<u8>(mode)];
} }
static std::array<const char*, 4> s_gpu_renderer_names = {{ static constexpr auto s_gpu_renderer_names = make_array(
#ifdef WIN32 #ifdef WIN32
"D3D11", "D3D11",
#endif #endif
"Vulkan", "OpenGL", "Software"}}; "Vulkan", "OpenGL", "Software");
static std::array<const char*, 4> s_gpu_renderer_display_names = {{ static constexpr auto s_gpu_renderer_display_names = make_array(
#ifdef WIN32 #ifdef WIN32
TRANSLATABLE("GPURenderer", "Hardware (D3D11)"), TRANSLATABLE("GPURenderer", "Hardware (D3D11)"),
#endif #endif
TRANSLATABLE("GPURenderer", "Hardware (Vulkan)"), TRANSLATABLE("GPURenderer", "Hardware (OpenGL)"), TRANSLATABLE("GPURenderer", "Hardware (Vulkan)"), TRANSLATABLE("GPURenderer", "Hardware (OpenGL)"),
TRANSLATABLE("GPURenderer", "Software")}}; TRANSLATABLE("GPURenderer", "Software"));
std::optional<GPURenderer> Settings::ParseRendererName(const char* str) std::optional<GPURenderer> Settings::ParseRendererName(const char* str)
{ {
@ -444,9 +446,9 @@ const char* Settings::GetRendererDisplayName(GPURenderer renderer)
} }
static std::array<const char*, 3> s_display_crop_mode_names = {{"None", "Overscan", "Borders"}}; static std::array<const char*, 3> s_display_crop_mode_names = {{"None", "Overscan", "Borders"}};
static std::array<const char*, 3> s_display_crop_mode_display_names = {{TRANSLATABLE("DisplayCropMode", "None"), static std::array<const char*, 3> s_display_crop_mode_display_names = {
TRANSLATABLE("DisplayCropMode", "Only Overscan Area"), {TRANSLATABLE("DisplayCropMode", "None"), TRANSLATABLE("DisplayCropMode", "Only Overscan Area"),
TRANSLATABLE("DisplayCropMode", "All Borders")}}; TRANSLATABLE("DisplayCropMode", "All Borders")}};
std::optional<DisplayCropMode> Settings::ParseDisplayCropMode(const char* str) std::optional<DisplayCropMode> Settings::ParseDisplayCropMode(const char* str)
{ {
@ -502,8 +504,9 @@ float Settings::GetDisplayAspectRatioValue(DisplayAspectRatio ar)
} }
static std::array<const char*, 3> s_audio_backend_names = {{"Null", "Cubeb", "SDL"}}; static std::array<const char*, 3> s_audio_backend_names = {{"Null", "Cubeb", "SDL"}};
static std::array<const char*, 3> s_audio_backend_display_names = { static std::array<const char*, 3> s_audio_backend_display_names = {{TRANSLATABLE("AudioBackend", "Null (No Output)"),
{TRANSLATABLE("AudioBackend", "Null (No Output)"), TRANSLATABLE("AudioBackend", "Cubeb"), TRANSLATABLE("AudioBackend", "SDL")}}; TRANSLATABLE("AudioBackend", "Cubeb"),
TRANSLATABLE("AudioBackend", "SDL")}};
std::optional<AudioBackend> Settings::ParseAudioBackend(const char* str) std::optional<AudioBackend> Settings::ParseAudioBackend(const char* str)
{ {

View File

@ -409,13 +409,13 @@ static std::array<retro_core_option_definition, 31> s_option_definitions = {{
{"duckstation_GPU.Renderer", {"duckstation_GPU.Renderer",
"GPU Renderer", "GPU Renderer",
"Which renderer to use to emulate the GPU", "Which renderer to use to emulate the GPU",
{ {{"Auto", "Hardware (Auto)"},
#ifdef WIN32 #ifdef WIN32
{"D3D11", "Hardware (D3D11)"}, {"D3D11", "Hardware (D3D11)"},
#endif #endif
{"OpenGL", "Hardware (OpenGL)"}, {"OpenGL", "Hardware (OpenGL)"},
{"Vulkan", "Hardware (Vulkan)"}, {"Vulkan", "Hardware (Vulkan)"},
{"Software", "Software"}}, {"Software", "Software"}},
#ifdef WIN32 #ifdef WIN32
"D3D11" "D3D11"
#else #else
@ -849,32 +849,23 @@ static std::optional<GPURenderer> RenderAPIToRenderer(HostDisplay::RenderAPI api
bool LibretroHostInterface::RequestHardwareRendererContext() bool LibretroHostInterface::RequestHardwareRendererContext()
{ {
GPURenderer renderer = Settings::DEFAULT_GPU_RENDERER;
retro_variable renderer_variable{"duckstation_GPU.Renderer", retro_variable renderer_variable{"duckstation_GPU.Renderer",
Settings::GetRendererName(Settings::DEFAULT_GPU_RENDERER)}; Settings::GetRendererName(Settings::DEFAULT_GPU_RENDERER)};
if (g_retro_environment_callback(RETRO_ENVIRONMENT_GET_VARIABLE, &renderer_variable) && renderer_variable.value) if (!g_retro_environment_callback(RETRO_ENVIRONMENT_GET_VARIABLE, &renderer_variable) || !renderer_variable.value)
renderer = Settings::ParseRendererName(renderer_variable.value).value_or(Settings::DEFAULT_GPU_RENDERER); renderer_variable.value = Settings::GetRendererName(Settings::DEFAULT_GPU_RENDERER);
Log_InfoPrintf("Renderer = %s", Settings::GetRendererName(renderer));
GPURenderer renderer = Settings::ParseRendererName(renderer_variable.value).value_or(Settings::DEFAULT_GPU_RENDERER);
unsigned preferred_renderer = 0; unsigned preferred_renderer = 0;
if (g_retro_environment_callback(RETRO_ENVIRONMENT_GET_PREFERRED_HW_RENDER, &preferred_renderer)) g_retro_environment_callback(RETRO_ENVIRONMENT_GET_PREFERRED_HW_RENDER, &preferred_renderer);
if (std::strcmp(renderer_variable.value, "Auto") == 0)
{ {
std::optional<GPURenderer> preferred_gpu_renderer = std::optional<GPURenderer> preferred_gpu_renderer =
RetroHwContextToRenderer(static_cast<retro_hw_context_type>(preferred_renderer)); RetroHwContextToRenderer(static_cast<retro_hw_context_type>(preferred_renderer));
if (!preferred_gpu_renderer.has_value() || preferred_gpu_renderer.value() != renderer) if (preferred_gpu_renderer.has_value())
{ renderer = preferred_gpu_renderer.value();
const char* preferred_name =
preferred_gpu_renderer.has_value() ? Settings::GetRendererName(preferred_gpu_renderer.value()) : "Unknown";
const char* config_name = Settings::GetRendererName(renderer);
renderer = preferred_gpu_renderer.value_or(GPURenderer::Software);
ReportFormattedError(
"Mismatch between frontend's preferred GPU renderer '%s' and configured renderer '%s'. Please "
"change your video driver to '%s'. Using '%s' renderer for now.",
preferred_name, config_name, config_name, Settings::GetRendererName(renderer));
}
} }
Log_InfoPrintf("Renderer = %s", Settings::GetRendererName(renderer));
if (renderer == GPURenderer::Software) if (renderer == GPURenderer::Software)
{ {
m_hw_render_callback_valid = false; m_hw_render_callback_valid = false;