0
0
mirror of https://github.com/Ishan09811/pine.git synced 2025-04-24 08:55:10 +00:00

Implement asynchronous shaders compiling (#58)

This commit is contained in:
Ishan09811 2025-01-16 16:34:51 +05:30 committed by GitHub
parent ddaf3008cb
commit 38c0d28c81
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 30 additions and 8 deletions

View File

@ -47,6 +47,7 @@ namespace skyline {
executorFlushThreshold = ktSettings.GetInt<u32>("executorFlushThreshold");
useDirectMemoryImport = ktSettings.GetBool("useDirectMemoryImport");
forceMaxGpuClocks = ktSettings.GetBool("forceMaxGpuClocks");
useAsyncShaders = ktSettings.GetBool("useAsyncShaders");
disableShaderCache = ktSettings.GetBool("disableShaderCache");
enableSampleShading = ktSettings.GetBool("enableSampleShading");
freeGuestTextureMemory = ktSettings.GetBool("freeGuestTextureMemory");

View File

@ -73,6 +73,7 @@ namespace skyline {
// Display
Setting<bool> forceTripleBuffering; //!< If the presentation engine should always triple buffer even if the swapchain supports double buffering
Setting<int> vsyncMode;
Setting<bool> useAsyncShaders;
Setting<bool> disableShaderCache; //!< Prevents cached shaders from being loaded and disables caching of new shaders
// CPU

View File

@ -2,6 +2,7 @@
// Copyright © 2021 Skyline Team and Contributors (https://github.com/skyline-emu/)
#include <fstream>
#include <future>
#include <range/v3/algorithm.hpp>
#include <boost/functional/hash.hpp>
#include <gpu.h>
@ -433,18 +434,27 @@ namespace skyline::gpu {
vk::ShaderModule ShaderManager::CompileShader(const Shader::RuntimeInfo &runtimeInfo, Shader::IR::Program &program, Shader::Backend::Bindings &bindings, u64 hash) {
std::scoped_lock lock{poolMutex};
if (program.info.loads.Legacy() || program.info.stores.Legacy())
if (program.info.loads.Legacy() || program.info.stores.Legacy()) {
Shader::Maxwell::ConvertLegacyToGeneric(program, runtimeInfo);
}
auto spirvEmitted{Shader::Backend::SPIRV::EmitSPIRV(profile, runtimeInfo, program, bindings)};
auto spirv{ProcessShaderBinary(true, hash, span<u32>{spirvEmitted}.cast<u8>()).cast<u32>()};
auto compileShader = [this, &runtimeInfo, &program, &bindings, hash]() {
auto spirvEmitted{Shader::Backend::SPIRV::EmitSPIRV(profile, runtimeInfo, program, bindings)};
auto spirv{ProcessShaderBinary(true, hash, span<u32>{spirvEmitted}.cast<u8>()).cast<u32>()};
vk::ShaderModuleCreateInfo createInfo{
.pCode = spirv.data(),
.codeSize = spirv.size_bytes(),
vk::ShaderModuleCreateInfo createInfo{
.pCode = spirv.data(),
.codeSize = spirv.size_bytes(),
};
return (*gpu.vkDevice).createShaderModule(createInfo, nullptr, *gpu.vkDevice.getDispatcher());
};
return (*gpu.vkDevice).createShaderModule(createInfo, nullptr, *gpu.vkDevice.getDispatcher());
if (*gpu.getState().settings->useAsyncShaders) {
auto future = std::async(std::launch::async, compileShader);
return future.get();
} else {
return compileShader();
}
}
void ShaderManager::ResetPools() {

View File

@ -61,6 +61,7 @@ class EmulationSettings private constructor(context : Context, prefName : String
var useDirectMemoryImport by sharedPreferences(context, false, prefName = prefName)
var forceMaxGpuClocks by sharedPreferences(context, false, prefName = prefName)
var freeGuestTextureMemory by sharedPreferences(context, true, prefName = prefName)
var useAsyncShaders by sharedPreferences(context, false, prefName = prefName)
var disableShaderCache by sharedPreferences(context, false, prefName = prefName)
var enableDynamicResolution by sharedPreferences(context, false, prefName = prefName)
var enableSampleShading by sharedPreferences(context, false, prefName = prefName)

View File

@ -39,6 +39,7 @@ data class NativeSettings(
var useDirectMemoryImport : Boolean,
var forceMaxGpuClocks : Boolean,
var freeGuestTextureMemory : Boolean,
var useAsyncShaders : Boolean,
var disableShaderCache : Boolean,
var enableSampleShading : Boolean,
@ -70,6 +71,7 @@ data class NativeSettings(
pref.useDirectMemoryImport,
pref.forceMaxGpuClocks,
pref.freeGuestTextureMemory,
pref.useAsyncShaders,
pref.disableShaderCache,
pref.enableSampleShading,
pref.enableFastGpuReadbackHack,

View File

@ -163,6 +163,8 @@
<string name="force_max_gpu_clocks_desc_unsupported">Your device does not support forcing maximum GPU clocks</string>
<string name="free_guest_texture_memory">Free Guest Texture Memory</string>
<string name="free_guest_texture_memory_desc">Allows guest texture data to be freed from memory when unneeded (Can rarely cause crashes)</string>
<string name="use_async_shaders">Use Asynchronous Shaders</string>
<string name="use_async_shaders_desc">Compiles shaders asynchronously</string>
<string name="shader_cache">Disable Shader Cache</string>
<string name="shader_cache_disabled">Cached shaders won\'t be loaded, will cause stutters</string>
<string name="shader_cache_enabled">Cached shaders will be loaded, can heavily reduce stuttering</string>

View File

@ -191,6 +191,11 @@
android:summary="@string/free_guest_texture_memory_desc"
app:key="free_guest_texture_memory"
app:title="@string/free_guest_texture_memory" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:summary="@string/use_async_shaders_desc"
app:key="use_async_shaders"
app:title="@string/use_async_shaders" />
<SwitchPreferenceCompat
android:defaultValue="false"
android:summaryOff="@string/shader_cache_enabled"