configuration: Add async ASTC decode setting
This commit is contained in:
parent
090bc588e5
commit
b5bcd8c71b
12 changed files with 49 additions and 8 deletions
|
@ -59,6 +59,7 @@ void LogSettings() {
|
||||||
values.use_asynchronous_gpu_emulation.GetValue());
|
values.use_asynchronous_gpu_emulation.GetValue());
|
||||||
log_setting("Renderer_NvdecEmulation", values.nvdec_emulation.GetValue());
|
log_setting("Renderer_NvdecEmulation", values.nvdec_emulation.GetValue());
|
||||||
log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue());
|
log_setting("Renderer_AccelerateASTC", values.accelerate_astc.GetValue());
|
||||||
|
log_setting("Renderer_AsyncASTC", values.async_astc.GetValue());
|
||||||
log_setting("Renderer_UseVsync", values.use_vsync.GetValue());
|
log_setting("Renderer_UseVsync", values.use_vsync.GetValue());
|
||||||
log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue());
|
log_setting("Renderer_ShaderBackend", values.shader_backend.GetValue());
|
||||||
log_setting("Renderer_UseAsynchronousShaders", values.use_asynchronous_shaders.GetValue());
|
log_setting("Renderer_UseAsynchronousShaders", values.use_asynchronous_shaders.GetValue());
|
||||||
|
@ -212,6 +213,7 @@ void RestoreGlobalState(bool is_powered_on) {
|
||||||
values.use_asynchronous_gpu_emulation.SetGlobal(true);
|
values.use_asynchronous_gpu_emulation.SetGlobal(true);
|
||||||
values.nvdec_emulation.SetGlobal(true);
|
values.nvdec_emulation.SetGlobal(true);
|
||||||
values.accelerate_astc.SetGlobal(true);
|
values.accelerate_astc.SetGlobal(true);
|
||||||
|
values.async_astc.SetGlobal(true);
|
||||||
values.use_vsync.SetGlobal(true);
|
values.use_vsync.SetGlobal(true);
|
||||||
values.shader_backend.SetGlobal(true);
|
values.shader_backend.SetGlobal(true);
|
||||||
values.use_asynchronous_shaders.SetGlobal(true);
|
values.use_asynchronous_shaders.SetGlobal(true);
|
||||||
|
|
|
@ -453,6 +453,7 @@ struct Values {
|
||||||
SwitchableSetting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"};
|
SwitchableSetting<bool> use_asynchronous_gpu_emulation{true, "use_asynchronous_gpu_emulation"};
|
||||||
SwitchableSetting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"};
|
SwitchableSetting<NvdecEmulation> nvdec_emulation{NvdecEmulation::GPU, "nvdec_emulation"};
|
||||||
SwitchableSetting<bool> accelerate_astc{true, "accelerate_astc"};
|
SwitchableSetting<bool> accelerate_astc{true, "accelerate_astc"};
|
||||||
|
SwitchableSetting<bool> async_astc{false, "async_astc"};
|
||||||
SwitchableSetting<bool> use_vsync{true, "use_vsync"};
|
SwitchableSetting<bool> use_vsync{true, "use_vsync"};
|
||||||
SwitchableSetting<ShaderBackend, true> shader_backend{ShaderBackend::GLSL, ShaderBackend::GLSL,
|
SwitchableSetting<ShaderBackend, true> shader_backend{ShaderBackend::GLSL, ShaderBackend::GLSL,
|
||||||
ShaderBackend::SPIRV, "shader_backend"};
|
ShaderBackend::SPIRV, "shader_backend"};
|
||||||
|
|
|
@ -228,8 +228,9 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
|
||||||
|
|
||||||
[[nodiscard]] bool CanBeAccelerated(const TextureCacheRuntime& runtime,
|
[[nodiscard]] bool CanBeAccelerated(const TextureCacheRuntime& runtime,
|
||||||
const VideoCommon::ImageInfo& info) {
|
const VideoCommon::ImageInfo& info) {
|
||||||
if (IsPixelFormatASTC(info.format)) {
|
if (IsPixelFormatASTC(info.format) && !runtime.HasNativeASTC()) {
|
||||||
return !runtime.HasNativeASTC() && Settings::values.accelerate_astc.GetValue();
|
return Settings::values.accelerate_astc.GetValue() &&
|
||||||
|
!Settings::values.async_astc.GetValue();
|
||||||
}
|
}
|
||||||
// Disable other accelerated uploads for now as they don't implement swizzled uploads
|
// Disable other accelerated uploads for now as they don't implement swizzled uploads
|
||||||
return false;
|
return false;
|
||||||
|
@ -258,6 +259,14 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4
|
||||||
return format_info.compatibility_class == store_class;
|
return format_info.compatibility_class == store_class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool CanBeDecodedAsync(const TextureCacheRuntime& runtime,
|
||||||
|
const VideoCommon::ImageInfo& info) {
|
||||||
|
if (IsPixelFormatASTC(info.format) && !runtime.HasNativeASTC()) {
|
||||||
|
return Settings::values.async_astc.GetValue();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]] CopyOrigin MakeCopyOrigin(VideoCommon::Offset3D offset,
|
[[nodiscard]] CopyOrigin MakeCopyOrigin(VideoCommon::Offset3D offset,
|
||||||
VideoCommon::SubresourceLayers subresource, GLenum target) {
|
VideoCommon::SubresourceLayers subresource, GLenum target) {
|
||||||
switch (target) {
|
switch (target) {
|
||||||
|
@ -721,7 +730,9 @@ std::optional<size_t> TextureCacheRuntime::StagingBuffers::FindBuffer(size_t req
|
||||||
Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_, GPUVAddr gpu_addr_,
|
Image::Image(TextureCacheRuntime& runtime_, const VideoCommon::ImageInfo& info_, GPUVAddr gpu_addr_,
|
||||||
VAddr cpu_addr_)
|
VAddr cpu_addr_)
|
||||||
: VideoCommon::ImageBase(info_, gpu_addr_, cpu_addr_), runtime{&runtime_} {
|
: VideoCommon::ImageBase(info_, gpu_addr_, cpu_addr_), runtime{&runtime_} {
|
||||||
if (CanBeAccelerated(*runtime, info)) {
|
if (CanBeDecodedAsync(*runtime, info)) {
|
||||||
|
flags |= ImageFlagBits::AsynchronousDecode;
|
||||||
|
} else if (CanBeAccelerated(*runtime, info)) {
|
||||||
flags |= ImageFlagBits::AcceleratedUpload;
|
flags |= ImageFlagBits::AcceleratedUpload;
|
||||||
}
|
}
|
||||||
if (IsConverted(runtime->device, info.format, info.type)) {
|
if (IsConverted(runtime->device, info.format, info.type)) {
|
||||||
|
|
|
@ -1256,11 +1256,12 @@ Image::Image(TextureCacheRuntime& runtime_, const ImageInfo& info_, GPUVAddr gpu
|
||||||
commit(runtime_.memory_allocator.Commit(original_image, MemoryUsage::DeviceLocal)),
|
commit(runtime_.memory_allocator.Commit(original_image, MemoryUsage::DeviceLocal)),
|
||||||
aspect_mask(ImageAspectMask(info.format)) {
|
aspect_mask(ImageAspectMask(info.format)) {
|
||||||
if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) {
|
if (IsPixelFormatASTC(info.format) && !runtime->device.IsOptimalAstcSupported()) {
|
||||||
if (Settings::values.accelerate_astc.GetValue()) {
|
if (Settings::values.async_astc.GetValue()) {
|
||||||
|
flags |= VideoCommon::ImageFlagBits::AsynchronousDecode;
|
||||||
|
} else if (Settings::values.accelerate_astc.GetValue()) {
|
||||||
flags |= VideoCommon::ImageFlagBits::AcceleratedUpload;
|
flags |= VideoCommon::ImageFlagBits::AcceleratedUpload;
|
||||||
} else {
|
|
||||||
flags |= VideoCommon::ImageFlagBits::Converted;
|
|
||||||
}
|
}
|
||||||
|
flags |= VideoCommon::ImageFlagBits::Converted;
|
||||||
flags |= VideoCommon::ImageFlagBits::CostlyLoad;
|
flags |= VideoCommon::ImageFlagBits::CostlyLoad;
|
||||||
}
|
}
|
||||||
if (runtime->device.HasDebuggingToolAttached()) {
|
if (runtime->device.HasDebuggingToolAttached()) {
|
||||||
|
|
|
@ -1003,6 +1003,7 @@ u64 TextureCache<P>::GetScaledImageSizeBytes(const ImageBase& image) {
|
||||||
template <class P>
|
template <class P>
|
||||||
void TextureCache<P>::QueueAsyncDecode(Image& image, ImageId image_id) {
|
void TextureCache<P>::QueueAsyncDecode(Image& image, ImageId image_id) {
|
||||||
UNIMPLEMENTED_IF(False(image.flags & ImageFlagBits::Converted));
|
UNIMPLEMENTED_IF(False(image.flags & ImageFlagBits::Converted));
|
||||||
|
LOG_INFO(HW_GPU, "Queuing async texture decode");
|
||||||
|
|
||||||
image.flags |= ImageFlagBits::IsDecoding;
|
image.flags |= ImageFlagBits::IsDecoding;
|
||||||
auto decode = std::make_unique<AsyncDecodeContext>();
|
auto decode = std::make_unique<AsyncDecodeContext>();
|
||||||
|
|
|
@ -1656,8 +1656,8 @@ void Decompress(std::span<const uint8_t> data, uint32_t width, uint32_t height,
|
||||||
const u32 rows = Common::DivideUp(height, block_height);
|
const u32 rows = Common::DivideUp(height, block_height);
|
||||||
const u32 cols = Common::DivideUp(width, block_width);
|
const u32 cols = Common::DivideUp(width, block_width);
|
||||||
|
|
||||||
Common::ThreadWorker workers{std::max(std::thread::hardware_concurrency(), 2U) / 2,
|
static Common::ThreadWorker workers{std::max(std::thread::hardware_concurrency(), 2U) / 2,
|
||||||
"ASTCDecompress"};
|
"ASTCDecompress"};
|
||||||
|
|
||||||
for (u32 z = 0; z < depth; ++z) {
|
for (u32 z = 0; z < depth; ++z) {
|
||||||
const u32 depth_offset = z * height * width * 4;
|
const u32 depth_offset = z * height * width * 4;
|
||||||
|
|
|
@ -707,6 +707,7 @@ void Config::ReadRendererValues() {
|
||||||
ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
|
ReadGlobalSetting(Settings::values.use_asynchronous_gpu_emulation);
|
||||||
ReadGlobalSetting(Settings::values.nvdec_emulation);
|
ReadGlobalSetting(Settings::values.nvdec_emulation);
|
||||||
ReadGlobalSetting(Settings::values.accelerate_astc);
|
ReadGlobalSetting(Settings::values.accelerate_astc);
|
||||||
|
ReadGlobalSetting(Settings::values.async_astc);
|
||||||
ReadGlobalSetting(Settings::values.use_vsync);
|
ReadGlobalSetting(Settings::values.use_vsync);
|
||||||
ReadGlobalSetting(Settings::values.shader_backend);
|
ReadGlobalSetting(Settings::values.shader_backend);
|
||||||
ReadGlobalSetting(Settings::values.use_asynchronous_shaders);
|
ReadGlobalSetting(Settings::values.use_asynchronous_shaders);
|
||||||
|
@ -1350,6 +1351,7 @@ void Config::SaveRendererValues() {
|
||||||
static_cast<u32>(Settings::values.nvdec_emulation.GetDefault()),
|
static_cast<u32>(Settings::values.nvdec_emulation.GetDefault()),
|
||||||
Settings::values.nvdec_emulation.UsingGlobal());
|
Settings::values.nvdec_emulation.UsingGlobal());
|
||||||
WriteGlobalSetting(Settings::values.accelerate_astc);
|
WriteGlobalSetting(Settings::values.accelerate_astc);
|
||||||
|
WriteGlobalSetting(Settings::values.async_astc);
|
||||||
WriteGlobalSetting(Settings::values.use_vsync);
|
WriteGlobalSetting(Settings::values.use_vsync);
|
||||||
WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()),
|
WriteSetting(QString::fromStdString(Settings::values.shader_backend.GetLabel()),
|
||||||
static_cast<u32>(Settings::values.shader_backend.GetValue(global)),
|
static_cast<u32>(Settings::values.shader_backend.GetValue(global)),
|
||||||
|
|
|
@ -23,11 +23,13 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {
|
||||||
const bool runtime_lock = !system.IsPoweredOn();
|
const bool runtime_lock = !system.IsPoweredOn();
|
||||||
ui->use_vsync->setEnabled(runtime_lock);
|
ui->use_vsync->setEnabled(runtime_lock);
|
||||||
ui->renderer_force_max_clock->setEnabled(runtime_lock);
|
ui->renderer_force_max_clock->setEnabled(runtime_lock);
|
||||||
|
ui->async_astc->setEnabled(runtime_lock);
|
||||||
ui->use_asynchronous_shaders->setEnabled(runtime_lock);
|
ui->use_asynchronous_shaders->setEnabled(runtime_lock);
|
||||||
ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);
|
ui->anisotropic_filtering_combobox->setEnabled(runtime_lock);
|
||||||
|
|
||||||
ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue());
|
ui->renderer_force_max_clock->setChecked(Settings::values.renderer_force_max_clock.GetValue());
|
||||||
ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue());
|
ui->use_vsync->setChecked(Settings::values.use_vsync.GetValue());
|
||||||
|
ui->async_astc->setChecked(Settings::values.async_astc.GetValue());
|
||||||
ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue());
|
ui->use_asynchronous_shaders->setChecked(Settings::values.use_asynchronous_shaders.GetValue());
|
||||||
ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue());
|
ui->use_fast_gpu_time->setChecked(Settings::values.use_fast_gpu_time.GetValue());
|
||||||
ui->use_pessimistic_flushes->setChecked(Settings::values.use_pessimistic_flushes.GetValue());
|
ui->use_pessimistic_flushes->setChecked(Settings::values.use_pessimistic_flushes.GetValue());
|
||||||
|
@ -60,6 +62,8 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {
|
||||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,
|
ConfigurationShared::ApplyPerGameSetting(&Settings::values.max_anisotropy,
|
||||||
ui->anisotropic_filtering_combobox);
|
ui->anisotropic_filtering_combobox);
|
||||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync);
|
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_vsync, ui->use_vsync, use_vsync);
|
||||||
|
ConfigurationShared::ApplyPerGameSetting(&Settings::values.async_astc, ui->async_astc,
|
||||||
|
async_astc);
|
||||||
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders,
|
ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_asynchronous_shaders,
|
||||||
ui->use_asynchronous_shaders,
|
ui->use_asynchronous_shaders,
|
||||||
use_asynchronous_shaders);
|
use_asynchronous_shaders);
|
||||||
|
@ -91,6 +95,7 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
|
||||||
ui->renderer_force_max_clock->setEnabled(
|
ui->renderer_force_max_clock->setEnabled(
|
||||||
Settings::values.renderer_force_max_clock.UsingGlobal());
|
Settings::values.renderer_force_max_clock.UsingGlobal());
|
||||||
ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal());
|
ui->use_vsync->setEnabled(Settings::values.use_vsync.UsingGlobal());
|
||||||
|
ui->async_astc->setEnabled(Settings::values.async_astc.UsingGlobal());
|
||||||
ui->use_asynchronous_shaders->setEnabled(
|
ui->use_asynchronous_shaders->setEnabled(
|
||||||
Settings::values.use_asynchronous_shaders.UsingGlobal());
|
Settings::values.use_asynchronous_shaders.UsingGlobal());
|
||||||
ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal());
|
ui->use_fast_gpu_time->setEnabled(Settings::values.use_fast_gpu_time.UsingGlobal());
|
||||||
|
@ -108,6 +113,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {
|
||||||
Settings::values.renderer_force_max_clock,
|
Settings::values.renderer_force_max_clock,
|
||||||
renderer_force_max_clock);
|
renderer_force_max_clock);
|
||||||
ConfigurationShared::SetColoredTristate(ui->use_vsync, Settings::values.use_vsync, use_vsync);
|
ConfigurationShared::SetColoredTristate(ui->use_vsync, Settings::values.use_vsync, use_vsync);
|
||||||
|
ConfigurationShared::SetColoredTristate(ui->async_astc, Settings::values.async_astc,
|
||||||
|
async_astc);
|
||||||
ConfigurationShared::SetColoredTristate(ui->use_asynchronous_shaders,
|
ConfigurationShared::SetColoredTristate(ui->use_asynchronous_shaders,
|
||||||
Settings::values.use_asynchronous_shaders,
|
Settings::values.use_asynchronous_shaders,
|
||||||
use_asynchronous_shaders);
|
use_asynchronous_shaders);
|
||||||
|
|
|
@ -38,6 +38,7 @@ private:
|
||||||
|
|
||||||
ConfigurationShared::CheckState renderer_force_max_clock;
|
ConfigurationShared::CheckState renderer_force_max_clock;
|
||||||
ConfigurationShared::CheckState use_vsync;
|
ConfigurationShared::CheckState use_vsync;
|
||||||
|
ConfigurationShared::CheckState async_astc;
|
||||||
ConfigurationShared::CheckState use_asynchronous_shaders;
|
ConfigurationShared::CheckState use_asynchronous_shaders;
|
||||||
ConfigurationShared::CheckState use_fast_gpu_time;
|
ConfigurationShared::CheckState use_fast_gpu_time;
|
||||||
ConfigurationShared::CheckState use_pessimistic_flushes;
|
ConfigurationShared::CheckState use_pessimistic_flushes;
|
||||||
|
|
|
@ -89,6 +89,16 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="async_astc">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Enables asynchronous ASTC texture decoding, which may reduce load time stutter. This feature is experimental.</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Decode ASTC textures asynchronously (Hack)</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="use_asynchronous_shaders">
|
<widget class="QCheckBox" name="use_asynchronous_shaders">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
|
|
|
@ -324,6 +324,7 @@ void Config::ReadValues() {
|
||||||
ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
|
ReadSetting("Renderer", Settings::values.use_asynchronous_shaders);
|
||||||
ReadSetting("Renderer", Settings::values.nvdec_emulation);
|
ReadSetting("Renderer", Settings::values.nvdec_emulation);
|
||||||
ReadSetting("Renderer", Settings::values.accelerate_astc);
|
ReadSetting("Renderer", Settings::values.accelerate_astc);
|
||||||
|
ReadSetting("Renderer", Settings::values.async_astc);
|
||||||
ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
|
ReadSetting("Renderer", Settings::values.use_fast_gpu_time);
|
||||||
ReadSetting("Renderer", Settings::values.use_pessimistic_flushes);
|
ReadSetting("Renderer", Settings::values.use_pessimistic_flushes);
|
||||||
ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
|
ReadSetting("Renderer", Settings::values.use_vulkan_driver_pipeline_cache);
|
||||||
|
|
|
@ -342,6 +342,10 @@ nvdec_emulation =
|
||||||
# 0: Off, 1 (default): On
|
# 0: Off, 1 (default): On
|
||||||
accelerate_astc =
|
accelerate_astc =
|
||||||
|
|
||||||
|
# Decode ASTC textures asynchronously.
|
||||||
|
# 0 (default): Off, 1: On
|
||||||
|
async_astc =
|
||||||
|
|
||||||
# Turns on the speed limiter, which will limit the emulation speed to the desired speed limit value
|
# Turns on the speed limiter, which will limit the emulation speed to the desired speed limit value
|
||||||
# 0: Off, 1: On (default)
|
# 0: Off, 1: On (default)
|
||||||
use_speed_limit =
|
use_speed_limit =
|
||||||
|
|
Loading…
Reference in a new issue