summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/telemetry.cpp60
-rw-r--r--src/common/telemetry.h7
-rw-r--r--src/common/x64/cpu_detect.cpp30
-rw-r--r--src/common/x64/cpu_detect.h21
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp4
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_64.cpp4
-rw-r--r--src/shader_recompiler/backend/spirv/emit_spirv.h2
-rw-r--r--src/shader_recompiler/frontend/maxwell/translate_program.cpp4
-rw-r--r--src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp3
-rw-r--r--src/video_core/renderer_vulkan/vk_compute_pass.cpp3
-rw-r--r--src/yuzu/configuration/config.cpp2
-rw-r--r--src/yuzu/main.cpp4
12 files changed, 103 insertions, 41 deletions
diff --git a/src/common/telemetry.cpp b/src/common/telemetry.cpp
index 6241d08b3..98c82cd17 100644
--- a/src/common/telemetry.cpp
+++ b/src/common/telemetry.cpp
@@ -55,22 +55,50 @@ void AppendBuildInfo(FieldCollection& fc) {
55 55
56void AppendCPUInfo(FieldCollection& fc) { 56void AppendCPUInfo(FieldCollection& fc) {
57#ifdef ARCHITECTURE_x86_64 57#ifdef ARCHITECTURE_x86_64
58 fc.AddField(FieldType::UserSystem, "CPU_Model", Common::GetCPUCaps().cpu_string); 58
59 fc.AddField(FieldType::UserSystem, "CPU_BrandString", Common::GetCPUCaps().brand_string); 59 const auto& caps = Common::GetCPUCaps();
60 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); 60 const auto add_field = [&fc](std::string_view field_name, const auto& field_value) {
61 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx); 61 fc.AddField(FieldType::UserSystem, field_name, field_value);
62 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); 62 };
63 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512); 63 add_field("CPU_Model", caps.cpu_string);
64 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1); 64 add_field("CPU_BrandString", caps.brand_string);
65 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2); 65
66 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); 66 add_field("CPU_Extension_x64_SSE", caps.sse);
67 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA4", Common::GetCPUCaps().fma4); 67 add_field("CPU_Extension_x64_SSE2", caps.sse2);
68 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE", Common::GetCPUCaps().sse); 68 add_field("CPU_Extension_x64_SSE3", caps.sse3);
69 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE2", Common::GetCPUCaps().sse2); 69 add_field("CPU_Extension_x64_SSSE3", caps.ssse3);
70 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE3", Common::GetCPUCaps().sse3); 70 add_field("CPU_Extension_x64_SSE41", caps.sse4_1);
71 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSSE3", Common::GetCPUCaps().ssse3); 71 add_field("CPU_Extension_x64_SSE42", caps.sse4_2);
72 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE41", Common::GetCPUCaps().sse4_1); 72
73 fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_SSE42", Common::GetCPUCaps().sse4_2); 73 add_field("CPU_Extension_x64_AVX", caps.avx);
74 add_field("CPU_Extension_x64_AVX_VNNI", caps.avx_vnni);
75 add_field("CPU_Extension_x64_AVX2", caps.avx2);
76
77 // Skylake-X/SP level AVX512, for compatibility with the previous telemetry field
78 add_field("CPU_Extension_x64_AVX512",
79 caps.avx512f && caps.avx512cd && caps.avx512vl && caps.avx512dq && caps.avx512bw);
80
81 add_field("CPU_Extension_x64_AVX512F", caps.avx512f);
82 add_field("CPU_Extension_x64_AVX512CD", caps.avx512cd);
83 add_field("CPU_Extension_x64_AVX512VL", caps.avx512vl);
84 add_field("CPU_Extension_x64_AVX512DQ", caps.avx512dq);
85 add_field("CPU_Extension_x64_AVX512BW", caps.avx512bw);
86 add_field("CPU_Extension_x64_AVX512BITALG", caps.avx512bitalg);
87 add_field("CPU_Extension_x64_AVX512VBMI", caps.avx512vbmi);
88
89 add_field("CPU_Extension_x64_AES", caps.aes);
90 add_field("CPU_Extension_x64_BMI1", caps.bmi1);
91 add_field("CPU_Extension_x64_BMI2", caps.bmi2);
92 add_field("CPU_Extension_x64_F16C", caps.f16c);
93 add_field("CPU_Extension_x64_FMA", caps.fma);
94 add_field("CPU_Extension_x64_FMA4", caps.fma4);
95 add_field("CPU_Extension_x64_GFNI", caps.gfni);
96 add_field("CPU_Extension_x64_INVARIANT_TSC", caps.invariant_tsc);
97 add_field("CPU_Extension_x64_LZCNT", caps.lzcnt);
98 add_field("CPU_Extension_x64_MOVBE", caps.movbe);
99 add_field("CPU_Extension_x64_PCLMULQDQ", caps.pclmulqdq);
100 add_field("CPU_Extension_x64_POPCNT", caps.popcnt);
101 add_field("CPU_Extension_x64_SHA", caps.sha);
74#else 102#else
75 fc.AddField(FieldType::UserSystem, "CPU_Model", "Other"); 103 fc.AddField(FieldType::UserSystem, "CPU_Model", "Other");
76#endif 104#endif
diff --git a/src/common/telemetry.h b/src/common/telemetry.h
index 4d632f7eb..3524c857e 100644
--- a/src/common/telemetry.h
+++ b/src/common/telemetry.h
@@ -8,6 +8,7 @@
8#include <map> 8#include <map>
9#include <memory> 9#include <memory>
10#include <string> 10#include <string>
11#include <string_view>
11#include "common/common_funcs.h" 12#include "common/common_funcs.h"
12#include "common/common_types.h" 13#include "common/common_types.h"
13 14
@@ -55,8 +56,8 @@ class Field : public FieldInterface {
55public: 56public:
56 YUZU_NON_COPYABLE(Field); 57 YUZU_NON_COPYABLE(Field);
57 58
58 Field(FieldType type_, std::string name_, T value_) 59 Field(FieldType type_, std::string_view name_, T value_)
59 : name(std::move(name_)), type(type_), value(std::move(value_)) {} 60 : name(name_), type(type_), value(std::move(value_)) {}
60 61
61 ~Field() override = default; 62 ~Field() override = default;
62 63
@@ -123,7 +124,7 @@ public:
123 * @param value Value for the field to add. 124 * @param value Value for the field to add.
124 */ 125 */
125 template <typename T> 126 template <typename T>
126 void AddField(FieldType type, const char* name, T value) { 127 void AddField(FieldType type, std::string_view name, T value) {
127 return AddField(std::make_unique<Field<T>>(type, name, std::move(value))); 128 return AddField(std::make_unique<Field<T>>(type, name, std::move(value)));
128 } 129 }
129 130
diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp
index 99d87f586..d81edb140 100644
--- a/src/common/x64/cpu_detect.cpp
+++ b/src/common/x64/cpu_detect.cpp
@@ -93,10 +93,14 @@ static CPUCaps Detect() {
93 caps.sse = Common::Bit<25>(cpu_id[3]); 93 caps.sse = Common::Bit<25>(cpu_id[3]);
94 caps.sse2 = Common::Bit<26>(cpu_id[3]); 94 caps.sse2 = Common::Bit<26>(cpu_id[3]);
95 caps.sse3 = Common::Bit<0>(cpu_id[2]); 95 caps.sse3 = Common::Bit<0>(cpu_id[2]);
96 caps.pclmulqdq = Common::Bit<1>(cpu_id[2]);
96 caps.ssse3 = Common::Bit<9>(cpu_id[2]); 97 caps.ssse3 = Common::Bit<9>(cpu_id[2]);
97 caps.sse4_1 = Common::Bit<19>(cpu_id[2]); 98 caps.sse4_1 = Common::Bit<19>(cpu_id[2]);
98 caps.sse4_2 = Common::Bit<20>(cpu_id[2]); 99 caps.sse4_2 = Common::Bit<20>(cpu_id[2]);
100 caps.movbe = Common::Bit<22>(cpu_id[2]);
101 caps.popcnt = Common::Bit<23>(cpu_id[2]);
99 caps.aes = Common::Bit<25>(cpu_id[2]); 102 caps.aes = Common::Bit<25>(cpu_id[2]);
103 caps.f16c = Common::Bit<29>(cpu_id[2]);
100 104
101 // AVX support requires 3 separate checks: 105 // AVX support requires 3 separate checks:
102 // - Is the AVX bit set in CPUID? 106 // - Is the AVX bit set in CPUID?
@@ -112,16 +116,26 @@ static CPUCaps Detect() {
112 116
113 if (max_std_fn >= 7) { 117 if (max_std_fn >= 7) {
114 __cpuidex(cpu_id, 0x00000007, 0x00000000); 118 __cpuidex(cpu_id, 0x00000007, 0x00000000);
115 // Can't enable AVX2 unless the XSAVE/XGETBV checks above passed 119 // Can't enable AVX{2,512} unless the XSAVE/XGETBV checks above passed
116 caps.avx2 = caps.avx && Common::Bit<5>(cpu_id[1]); 120 if (caps.avx) {
121 caps.avx2 = Common::Bit<5>(cpu_id[1]);
122 caps.avx512f = Common::Bit<16>(cpu_id[1]);
123 caps.avx512dq = Common::Bit<17>(cpu_id[1]);
124 caps.avx512cd = Common::Bit<28>(cpu_id[1]);
125 caps.avx512bw = Common::Bit<30>(cpu_id[1]);
126 caps.avx512vl = Common::Bit<31>(cpu_id[1]);
127 caps.avx512vbmi = Common::Bit<1>(cpu_id[2]);
128 caps.avx512bitalg = Common::Bit<12>(cpu_id[2]);
129 }
130
117 caps.bmi1 = Common::Bit<3>(cpu_id[1]); 131 caps.bmi1 = Common::Bit<3>(cpu_id[1]);
118 caps.bmi2 = Common::Bit<8>(cpu_id[1]); 132 caps.bmi2 = Common::Bit<8>(cpu_id[1]);
119 // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP) 133 caps.sha = Common::Bit<29>(cpu_id[1]);
120 if (Common::Bit<16>(cpu_id[1]) && Common::Bit<28>(cpu_id[1]) && 134
121 Common::Bit<31>(cpu_id[1]) && Common::Bit<17>(cpu_id[1]) && 135 caps.gfni = Common::Bit<8>(cpu_id[2]);
122 Common::Bit<30>(cpu_id[1])) { 136
123 caps.avx512 = caps.avx2; 137 __cpuidex(cpu_id, 0x00000007, 0x00000001);
124 } 138 caps.avx_vnni = caps.avx && Common::Bit<4>(cpu_id[0]);
125 } 139 }
126 } 140 }
127 141
diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h
index 3e6d808f3..40c48b132 100644
--- a/src/common/x64/cpu_detect.h
+++ b/src/common/x64/cpu_detect.h
@@ -35,16 +35,31 @@ struct CPUCaps {
35 bool ssse3 : 1; 35 bool ssse3 : 1;
36 bool sse4_1 : 1; 36 bool sse4_1 : 1;
37 bool sse4_2 : 1; 37 bool sse4_2 : 1;
38 bool lzcnt : 1; 38
39 bool avx : 1; 39 bool avx : 1;
40 bool avx_vnni : 1;
40 bool avx2 : 1; 41 bool avx2 : 1;
41 bool avx512 : 1; 42 bool avx512f : 1;
43 bool avx512dq : 1;
44 bool avx512cd : 1;
45 bool avx512bw : 1;
46 bool avx512vl : 1;
47 bool avx512vbmi : 1;
48 bool avx512bitalg : 1;
49
50 bool aes : 1;
42 bool bmi1 : 1; 51 bool bmi1 : 1;
43 bool bmi2 : 1; 52 bool bmi2 : 1;
53 bool f16c : 1;
44 bool fma : 1; 54 bool fma : 1;
45 bool fma4 : 1; 55 bool fma4 : 1;
46 bool aes : 1; 56 bool gfni : 1;
47 bool invariant_tsc : 1; 57 bool invariant_tsc : 1;
58 bool lzcnt : 1;
59 bool movbe : 1;
60 bool pclmulqdq : 1;
61 bool popcnt : 1;
62 bool sha : 1;
48}; 63};
49 64
50/** 65/**
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index 286976623..c1c843b8f 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -148,8 +148,8 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable*
148 config.wall_clock_cntpct = uses_wall_clock; 148 config.wall_clock_cntpct = uses_wall_clock;
149 149
150 // Code cache size 150 // Code cache size
151 config.code_cache_size = 512_MiB; 151 config.code_cache_size = 128_MiB;
152 config.far_code_offset = 400_MiB; 152 config.far_code_offset = 100_MiB;
153 153
154 // Safe optimizations 154 // Safe optimizations
155 if (Settings::values.cpu_debug_mode) { 155 if (Settings::values.cpu_debug_mode) {
diff --git a/src/core/arm/dynarmic/arm_dynarmic_64.cpp b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
index d96226c41..aa74fce4d 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_64.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_64.cpp
@@ -208,8 +208,8 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable*
208 config.wall_clock_cntpct = uses_wall_clock; 208 config.wall_clock_cntpct = uses_wall_clock;
209 209
210 // Code cache size 210 // Code cache size
211 config.code_cache_size = 512_MiB; 211 config.code_cache_size = 128_MiB;
212 config.far_code_offset = 400_MiB; 212 config.far_code_offset = 100_MiB;
213 213
214 // Safe optimizations 214 // Safe optimizations
215 if (Settings::values.cpu_debug_mode) { 215 if (Settings::values.cpu_debug_mode) {
diff --git a/src/shader_recompiler/backend/spirv/emit_spirv.h b/src/shader_recompiler/backend/spirv/emit_spirv.h
index b412957c7..2b360e073 100644
--- a/src/shader_recompiler/backend/spirv/emit_spirv.h
+++ b/src/shader_recompiler/backend/spirv/emit_spirv.h
@@ -22,7 +22,7 @@ constexpr u32 NUM_TEXTURE_AND_IMAGE_SCALING_WORDS =
22struct RescalingLayout { 22struct RescalingLayout {
23 alignas(16) std::array<u32, NUM_TEXTURE_SCALING_WORDS> rescaling_textures; 23 alignas(16) std::array<u32, NUM_TEXTURE_SCALING_WORDS> rescaling_textures;
24 alignas(16) std::array<u32, NUM_IMAGE_SCALING_WORDS> rescaling_images; 24 alignas(16) std::array<u32, NUM_IMAGE_SCALING_WORDS> rescaling_images;
25 alignas(16) u32 down_factor; 25 u32 down_factor;
26}; 26};
27constexpr u32 RESCALING_LAYOUT_WORDS_OFFSET = offsetof(RescalingLayout, rescaling_textures); 27constexpr u32 RESCALING_LAYOUT_WORDS_OFFSET = offsetof(RescalingLayout, rescaling_textures);
28constexpr u32 RESCALING_LAYOUT_DOWN_FACTOR_OFFSET = offsetof(RescalingLayout, down_factor); 28constexpr u32 RESCALING_LAYOUT_DOWN_FACTOR_OFFSET = offsetof(RescalingLayout, down_factor);
diff --git a/src/shader_recompiler/frontend/maxwell/translate_program.cpp b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
index 248ad3ced..b22725584 100644
--- a/src/shader_recompiler/frontend/maxwell/translate_program.cpp
+++ b/src/shader_recompiler/frontend/maxwell/translate_program.cpp
@@ -212,11 +212,11 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo
212 } 212 }
213 Optimization::SsaRewritePass(program); 213 Optimization::SsaRewritePass(program);
214 214
215 Optimization::ConstantPropagationPass(program);
216
215 Optimization::GlobalMemoryToStorageBufferPass(program); 217 Optimization::GlobalMemoryToStorageBufferPass(program);
216 Optimization::TexturePass(env, program); 218 Optimization::TexturePass(env, program);
217 219
218 Optimization::ConstantPropagationPass(program);
219
220 if (Settings::values.resolution_info.active) { 220 if (Settings::values.resolution_info.active) {
221 Optimization::RescalingPass(program); 221 Optimization::RescalingPass(program);
222 } 222 }
diff --git a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp
index 38592afd0..ddf497e32 100644
--- a/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp
+++ b/src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp
@@ -334,7 +334,8 @@ std::optional<LowAddrInfo> TrackLowAddress(IR::Inst* inst) {
334/// Tries to track the storage buffer address used by a global memory instruction 334/// Tries to track the storage buffer address used by a global memory instruction
335std::optional<StorageBufferAddr> Track(const IR::Value& value, const Bias* bias) { 335std::optional<StorageBufferAddr> Track(const IR::Value& value, const Bias* bias) {
336 const auto pred{[bias](const IR::Inst* inst) -> std::optional<StorageBufferAddr> { 336 const auto pred{[bias](const IR::Inst* inst) -> std::optional<StorageBufferAddr> {
337 if (inst->GetOpcode() != IR::Opcode::GetCbufU32) { 337 if (inst->GetOpcode() != IR::Opcode::GetCbufU32 &&
338 inst->GetOpcode() != IR::Opcode::GetCbufU32x2) {
338 return std::nullopt; 339 return std::nullopt;
339 } 340 }
340 const IR::Value index{inst->Arg(0)}; 341 const IR::Value index{inst->Arg(0)};
diff --git a/src/video_core/renderer_vulkan/vk_compute_pass.cpp b/src/video_core/renderer_vulkan/vk_compute_pass.cpp
index 3e96c0f60..4d73427b4 100644
--- a/src/video_core/renderer_vulkan/vk_compute_pass.cpp
+++ b/src/video_core/renderer_vulkan/vk_compute_pass.cpp
@@ -2,6 +2,7 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include <array>
5#include <cstring> 6#include <cstring>
6#include <memory> 7#include <memory>
7#include <optional> 8#include <optional>
@@ -292,7 +293,7 @@ std::pair<VkBuffer, VkDeviceSize> QuadIndexedPass::Assemble(
292 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT, 293 .srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT,
293 .dstAccessMask = VK_ACCESS_INDEX_READ_BIT, 294 .dstAccessMask = VK_ACCESS_INDEX_READ_BIT,
294 }; 295 };
295 const std::array push_constants{base_vertex, index_shift}; 296 const std::array<u32, 2> push_constants{base_vertex, index_shift};
296 const VkDescriptorSet set = descriptor_allocator.Commit(); 297 const VkDescriptorSet set = descriptor_allocator.Commit();
297 device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data); 298 device.GetLogical().UpdateDescriptorSet(set, *descriptor_template, descriptor_data);
298 cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline); 299 cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, *pipeline);
diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp
index c2b66ff14..4b943c6ba 100644
--- a/src/yuzu/configuration/config.cpp
+++ b/src/yuzu/configuration/config.cpp
@@ -1155,6 +1155,8 @@ void Config::SaveCpuValues() {
1155 WriteBasicSetting(Settings::values.cpuopt_misc_ir); 1155 WriteBasicSetting(Settings::values.cpuopt_misc_ir);
1156 WriteBasicSetting(Settings::values.cpuopt_reduce_misalign_checks); 1156 WriteBasicSetting(Settings::values.cpuopt_reduce_misalign_checks);
1157 WriteBasicSetting(Settings::values.cpuopt_fastmem); 1157 WriteBasicSetting(Settings::values.cpuopt_fastmem);
1158 WriteBasicSetting(Settings::values.cpuopt_fastmem_exclusives);
1159 WriteBasicSetting(Settings::values.cpuopt_recompile_exclusives);
1158 } 1160 }
1159 1161
1160 qt_config->endGroup(); 1162 qt_config->endGroup();
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index b3a8da0ea..1d459bdb3 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -249,9 +249,9 @@ GMainWindow::GMainWindow()
249#ifdef ARCHITECTURE_x86_64 249#ifdef ARCHITECTURE_x86_64
250 const auto& caps = Common::GetCPUCaps(); 250 const auto& caps = Common::GetCPUCaps();
251 std::string cpu_string = caps.cpu_string; 251 std::string cpu_string = caps.cpu_string;
252 if (caps.avx || caps.avx2 || caps.avx512) { 252 if (caps.avx || caps.avx2 || caps.avx512f) {
253 cpu_string += " | AVX"; 253 cpu_string += " | AVX";
254 if (caps.avx512) { 254 if (caps.avx512f) {
255 cpu_string += "512"; 255 cpu_string += "512";
256 } else if (caps.avx2) { 256 } else if (caps.avx2) {
257 cpu_string += '2'; 257 cpu_string += '2';