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:
parent
ddaf3008cb
commit
38c0d28c81
@ -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");
|
||||
|
@ -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
|
||||
|
@ -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() {
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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"
|
||||
|
Loading…
x
Reference in New Issue
Block a user