diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 4 | ||||
| -rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_64.cpp | 4 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv.h | 2 | ||||
| -rw-r--r-- | src/shader_recompiler/frontend/maxwell/translate_program.cpp | 4 | ||||
| -rw-r--r-- | src/shader_recompiler/ir_opt/global_memory_to_storage_buffer_pass.cpp | 3 | ||||
| -rw-r--r-- | src/shader_recompiler/ir_opt/rescaling_pass.cpp | 29 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.cpp | 42 | ||||
| -rw-r--r-- | src/video_core/engines/maxwell_3d.h | 35 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_compute_pass.cpp | 3 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/configuration/config.cpp | 2 |
11 files changed, 117 insertions, 14 deletions
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 = | |||
| 22 | struct RescalingLayout { | 22 | struct 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 | }; |
| 27 | constexpr u32 RESCALING_LAYOUT_WORDS_OFFSET = offsetof(RescalingLayout, rescaling_textures); | 27 | constexpr u32 RESCALING_LAYOUT_WORDS_OFFSET = offsetof(RescalingLayout, rescaling_textures); |
| 28 | constexpr u32 RESCALING_LAYOUT_DOWN_FACTOR_OFFSET = offsetof(RescalingLayout, down_factor); | 28 | constexpr 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 |
| 335 | std::optional<StorageBufferAddr> Track(const IR::Value& value, const Bias* bias) { | 335 | std::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/shader_recompiler/ir_opt/rescaling_pass.cpp b/src/shader_recompiler/ir_opt/rescaling_pass.cpp index c28500dd1..496d4667e 100644 --- a/src/shader_recompiler/ir_opt/rescaling_pass.cpp +++ b/src/shader_recompiler/ir_opt/rescaling_pass.cpp | |||
| @@ -183,6 +183,31 @@ void ScaleIntegerComposite(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_s | |||
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | void ScaleIntegerOffsetComposite(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_scaled, | ||
| 187 | size_t index) { | ||
| 188 | const IR::Value composite{inst.Arg(index)}; | ||
| 189 | if (composite.IsEmpty()) { | ||
| 190 | return; | ||
| 191 | } | ||
| 192 | const auto info{inst.Flags<IR::TextureInstInfo>()}; | ||
| 193 | const IR::U32 x{Scale(ir, is_scaled, IR::U32{ir.CompositeExtract(composite, 0)})}; | ||
| 194 | const IR::U32 y{Scale(ir, is_scaled, IR::U32{ir.CompositeExtract(composite, 1)})}; | ||
| 195 | switch (info.type) { | ||
| 196 | case TextureType::ColorArray2D: | ||
| 197 | case TextureType::Color2D: | ||
| 198 | inst.SetArg(index, ir.CompositeConstruct(x, y)); | ||
| 199 | break; | ||
| 200 | case TextureType::Color1D: | ||
| 201 | case TextureType::ColorArray1D: | ||
| 202 | case TextureType::Color3D: | ||
| 203 | case TextureType::ColorCube: | ||
| 204 | case TextureType::ColorArrayCube: | ||
| 205 | case TextureType::Buffer: | ||
| 206 | // Nothing to patch here | ||
| 207 | break; | ||
| 208 | } | ||
| 209 | } | ||
| 210 | |||
| 186 | void SubScaleCoord(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_scaled) { | 211 | void SubScaleCoord(IR::IREmitter& ir, IR::Inst& inst, const IR::U1& is_scaled) { |
| 187 | const auto info{inst.Flags<IR::TextureInstInfo>()}; | 212 | const auto info{inst.Flags<IR::TextureInstInfo>()}; |
| 188 | const IR::Value coord{inst.Arg(1)}; | 213 | const IR::Value coord{inst.Arg(1)}; |
| @@ -220,7 +245,7 @@ void SubScaleImageFetch(IR::Block& block, IR::Inst& inst) { | |||
| 220 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; | 245 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; |
| 221 | SubScaleCoord(ir, inst, is_scaled); | 246 | SubScaleCoord(ir, inst, is_scaled); |
| 222 | // Scale ImageFetch offset | 247 | // Scale ImageFetch offset |
| 223 | ScaleIntegerComposite(ir, inst, is_scaled, 2); | 248 | ScaleIntegerOffsetComposite(ir, inst, is_scaled, 2); |
| 224 | } | 249 | } |
| 225 | 250 | ||
| 226 | void SubScaleImageRead(IR::Block& block, IR::Inst& inst) { | 251 | void SubScaleImageRead(IR::Block& block, IR::Inst& inst) { |
| @@ -242,7 +267,7 @@ void PatchImageFetch(IR::Block& block, IR::Inst& inst) { | |||
| 242 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; | 267 | const IR::U1 is_scaled{ir.IsTextureScaled(ir.Imm32(info.descriptor_index))}; |
| 243 | ScaleIntegerComposite(ir, inst, is_scaled, 1); | 268 | ScaleIntegerComposite(ir, inst, is_scaled, 1); |
| 244 | // Scale ImageFetch offset | 269 | // Scale ImageFetch offset |
| 245 | ScaleIntegerComposite(ir, inst, is_scaled, 2); | 270 | ScaleIntegerOffsetComposite(ir, inst, is_scaled, 2); |
| 246 | } | 271 | } |
| 247 | 272 | ||
| 248 | void PatchImageRead(IR::Block& block, IR::Inst& inst) { | 273 | void PatchImageRead(IR::Block& block, IR::Inst& inst) { |
diff --git a/src/video_core/engines/maxwell_3d.cpp b/src/video_core/engines/maxwell_3d.cpp index 5d6d217bb..8f2fd28c2 100644 --- a/src/video_core/engines/maxwell_3d.cpp +++ b/src/video_core/engines/maxwell_3d.cpp | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include "common/assert.h" | 7 | #include "common/assert.h" |
| 8 | #include "core/core.h" | 8 | #include "core/core.h" |
| 9 | #include "core/core_timing.h" | 9 | #include "core/core_timing.h" |
| 10 | #include "video_core/dirty_flags.h" | ||
| 10 | #include "video_core/engines/maxwell_3d.h" | 11 | #include "video_core/engines/maxwell_3d.h" |
| 11 | #include "video_core/gpu.h" | 12 | #include "video_core/gpu.h" |
| 12 | #include "video_core/memory_manager.h" | 13 | #include "video_core/memory_manager.h" |
| @@ -208,6 +209,14 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume | |||
| 208 | return ProcessCBBind(4); | 209 | return ProcessCBBind(4); |
| 209 | case MAXWELL3D_REG_INDEX(draw.vertex_end_gl): | 210 | case MAXWELL3D_REG_INDEX(draw.vertex_end_gl): |
| 210 | return DrawArrays(); | 211 | return DrawArrays(); |
| 212 | case MAXWELL3D_REG_INDEX(small_index): | ||
| 213 | regs.index_array.count = regs.small_index.count; | ||
| 214 | regs.index_array.first = regs.small_index.first; | ||
| 215 | dirty.flags[VideoCommon::Dirty::IndexBuffer] = true; | ||
| 216 | return DrawArrays(); | ||
| 217 | case MAXWELL3D_REG_INDEX(topology_override): | ||
| 218 | use_topology_override = true; | ||
| 219 | return; | ||
| 211 | case MAXWELL3D_REG_INDEX(clear_buffers): | 220 | case MAXWELL3D_REG_INDEX(clear_buffers): |
| 212 | return ProcessClearBuffers(); | 221 | return ProcessClearBuffers(); |
| 213 | case MAXWELL3D_REG_INDEX(query.query_get): | 222 | case MAXWELL3D_REG_INDEX(query.query_get): |
| @@ -360,6 +369,35 @@ void Maxwell3D::CallMethodFromMME(u32 method, u32 method_argument) { | |||
| 360 | } | 369 | } |
| 361 | } | 370 | } |
| 362 | 371 | ||
| 372 | void Maxwell3D::ProcessTopologyOverride() { | ||
| 373 | using PrimitiveTopology = Maxwell3D::Regs::PrimitiveTopology; | ||
| 374 | using PrimitiveTopologyOverride = Maxwell3D::Regs::PrimitiveTopologyOverride; | ||
| 375 | |||
| 376 | PrimitiveTopology topology{}; | ||
| 377 | |||
| 378 | switch (regs.topology_override) { | ||
| 379 | case PrimitiveTopologyOverride::None: | ||
| 380 | topology = regs.draw.topology; | ||
| 381 | break; | ||
| 382 | case PrimitiveTopologyOverride::Points: | ||
| 383 | topology = PrimitiveTopology::Points; | ||
| 384 | break; | ||
| 385 | case PrimitiveTopologyOverride::Lines: | ||
| 386 | topology = PrimitiveTopology::Lines; | ||
| 387 | break; | ||
| 388 | case PrimitiveTopologyOverride::LineStrip: | ||
| 389 | topology = PrimitiveTopology::LineStrip; | ||
| 390 | break; | ||
| 391 | default: | ||
| 392 | topology = static_cast<PrimitiveTopology>(regs.topology_override); | ||
| 393 | break; | ||
| 394 | } | ||
| 395 | |||
| 396 | if (use_topology_override) { | ||
| 397 | regs.draw.topology.Assign(topology); | ||
| 398 | } | ||
| 399 | } | ||
| 400 | |||
| 363 | void Maxwell3D::FlushMMEInlineDraw() { | 401 | void Maxwell3D::FlushMMEInlineDraw() { |
| 364 | LOG_TRACE(HW_GPU, "called, topology={}, count={}", regs.draw.topology.Value(), | 402 | LOG_TRACE(HW_GPU, "called, topology={}, count={}", regs.draw.topology.Value(), |
| 365 | regs.vertex_buffer.count); | 403 | regs.vertex_buffer.count); |
| @@ -370,6 +408,8 @@ void Maxwell3D::FlushMMEInlineDraw() { | |||
| 370 | ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, | 408 | ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, |
| 371 | "Illegal combination of instancing parameters"); | 409 | "Illegal combination of instancing parameters"); |
| 372 | 410 | ||
| 411 | ProcessTopologyOverride(); | ||
| 412 | |||
| 373 | const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed; | 413 | const bool is_indexed = mme_draw.current_mode == MMEDrawMode::Indexed; |
| 374 | if (ShouldExecute()) { | 414 | if (ShouldExecute()) { |
| 375 | rasterizer->Draw(is_indexed, true); | 415 | rasterizer->Draw(is_indexed, true); |
| @@ -529,6 +569,8 @@ void Maxwell3D::DrawArrays() { | |||
| 529 | ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, | 569 | ASSERT_MSG(!regs.draw.instance_next || !regs.draw.instance_cont, |
| 530 | "Illegal combination of instancing parameters"); | 570 | "Illegal combination of instancing parameters"); |
| 531 | 571 | ||
| 572 | ProcessTopologyOverride(); | ||
| 573 | |||
| 532 | if (regs.draw.instance_next) { | 574 | if (regs.draw.instance_next) { |
| 533 | // Increment the current instance *before* drawing. | 575 | // Increment the current instance *before* drawing. |
| 534 | state.current_instance += 1; | 576 | state.current_instance += 1; |
diff --git a/src/video_core/engines/maxwell_3d.h b/src/video_core/engines/maxwell_3d.h index dc9df6c8b..6d34da046 100644 --- a/src/video_core/engines/maxwell_3d.h +++ b/src/video_core/engines/maxwell_3d.h | |||
| @@ -367,6 +367,22 @@ public: | |||
| 367 | Patches = 0xe, | 367 | Patches = 0xe, |
| 368 | }; | 368 | }; |
| 369 | 369 | ||
| 370 | // Constants as from NVC0_3D_UNK1970_D3D | ||
| 371 | // https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/gallium/drivers/nouveau/nvc0/nvc0_3d.xml.h#L1598 | ||
| 372 | enum class PrimitiveTopologyOverride : u32 { | ||
| 373 | None = 0x0, | ||
| 374 | Points = 0x1, | ||
| 375 | Lines = 0x2, | ||
| 376 | LineStrip = 0x3, | ||
| 377 | Triangles = 0x4, | ||
| 378 | TriangleStrip = 0x5, | ||
| 379 | LinesAdjacency = 0xa, | ||
| 380 | LineStripAdjacency = 0xb, | ||
| 381 | TrianglesAdjacency = 0xc, | ||
| 382 | TriangleStripAdjacency = 0xd, | ||
| 383 | Patches = 0xe, | ||
| 384 | }; | ||
| 385 | |||
| 370 | enum class IndexFormat : u32 { | 386 | enum class IndexFormat : u32 { |
| 371 | UnsignedByte = 0x0, | 387 | UnsignedByte = 0x0, |
| 372 | UnsignedShort = 0x1, | 388 | UnsignedShort = 0x1, |
| @@ -1200,7 +1216,12 @@ public: | |||
| 1200 | } | 1216 | } |
| 1201 | } index_array; | 1217 | } index_array; |
| 1202 | 1218 | ||
| 1203 | INSERT_PADDING_WORDS_NOINIT(0x7); | 1219 | union { |
| 1220 | BitField<0, 16, u32> first; | ||
| 1221 | BitField<16, 16, u32> count; | ||
| 1222 | } small_index; | ||
| 1223 | |||
| 1224 | INSERT_PADDING_WORDS_NOINIT(0x6); | ||
| 1204 | 1225 | ||
| 1205 | INSERT_PADDING_WORDS_NOINIT(0x1F); | 1226 | INSERT_PADDING_WORDS_NOINIT(0x1F); |
| 1206 | 1227 | ||
| @@ -1244,7 +1265,11 @@ public: | |||
| 1244 | BitField<11, 1, u32> depth_clamp_disabled; | 1265 | BitField<11, 1, u32> depth_clamp_disabled; |
| 1245 | } view_volume_clip_control; | 1266 | } view_volume_clip_control; |
| 1246 | 1267 | ||
| 1247 | INSERT_PADDING_WORDS_NOINIT(0x1F); | 1268 | INSERT_PADDING_WORDS_NOINIT(0xC); |
| 1269 | |||
| 1270 | PrimitiveTopologyOverride topology_override; | ||
| 1271 | |||
| 1272 | INSERT_PADDING_WORDS_NOINIT(0x12); | ||
| 1248 | 1273 | ||
| 1249 | u32 depth_bounds_enable; | 1274 | u32 depth_bounds_enable; |
| 1250 | 1275 | ||
| @@ -1531,6 +1556,9 @@ private: | |||
| 1531 | /// Handles a write to the VERTEX_END_GL register, triggering a draw. | 1556 | /// Handles a write to the VERTEX_END_GL register, triggering a draw. |
| 1532 | void DrawArrays(); | 1557 | void DrawArrays(); |
| 1533 | 1558 | ||
| 1559 | /// Handles use of topology overrides (e.g., to avoid using a topology assigned from a macro) | ||
| 1560 | void ProcessTopologyOverride(); | ||
| 1561 | |||
| 1534 | // Handles a instance drawcall from MME | 1562 | // Handles a instance drawcall from MME |
| 1535 | void StepInstance(MMEDrawMode expected_mode, u32 count); | 1563 | void StepInstance(MMEDrawMode expected_mode, u32 count); |
| 1536 | 1564 | ||
| @@ -1569,6 +1597,7 @@ private: | |||
| 1569 | Upload::State upload_state; | 1597 | Upload::State upload_state; |
| 1570 | 1598 | ||
| 1571 | bool execute_on{true}; | 1599 | bool execute_on{true}; |
| 1600 | bool use_topology_override{false}; | ||
| 1572 | }; | 1601 | }; |
| 1573 | 1602 | ||
| 1574 | #define ASSERT_REG_POSITION(field_name, position) \ | 1603 | #define ASSERT_REG_POSITION(field_name, position) \ |
| @@ -1685,6 +1714,7 @@ ASSERT_REG_POSITION(draw, 0x585); | |||
| 1685 | ASSERT_REG_POSITION(primitive_restart, 0x591); | 1714 | ASSERT_REG_POSITION(primitive_restart, 0x591); |
| 1686 | ASSERT_REG_POSITION(provoking_vertex_last, 0x5A1); | 1715 | ASSERT_REG_POSITION(provoking_vertex_last, 0x5A1); |
| 1687 | ASSERT_REG_POSITION(index_array, 0x5F2); | 1716 | ASSERT_REG_POSITION(index_array, 0x5F2); |
| 1717 | ASSERT_REG_POSITION(small_index, 0x5F9); | ||
| 1688 | ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); | 1718 | ASSERT_REG_POSITION(polygon_offset_clamp, 0x61F); |
| 1689 | ASSERT_REG_POSITION(instanced_arrays, 0x620); | 1719 | ASSERT_REG_POSITION(instanced_arrays, 0x620); |
| 1690 | ASSERT_REG_POSITION(vp_point_size, 0x644); | 1720 | ASSERT_REG_POSITION(vp_point_size, 0x644); |
| @@ -1694,6 +1724,7 @@ ASSERT_REG_POSITION(cull_face, 0x648); | |||
| 1694 | ASSERT_REG_POSITION(pixel_center_integer, 0x649); | 1724 | ASSERT_REG_POSITION(pixel_center_integer, 0x649); |
| 1695 | ASSERT_REG_POSITION(viewport_transform_enabled, 0x64B); | 1725 | ASSERT_REG_POSITION(viewport_transform_enabled, 0x64B); |
| 1696 | ASSERT_REG_POSITION(view_volume_clip_control, 0x64F); | 1726 | ASSERT_REG_POSITION(view_volume_clip_control, 0x64F); |
| 1727 | ASSERT_REG_POSITION(topology_override, 0x65C); | ||
| 1697 | ASSERT_REG_POSITION(depth_bounds_enable, 0x66F); | 1728 | ASSERT_REG_POSITION(depth_bounds_enable, 0x66F); |
| 1698 | ASSERT_REG_POSITION(logic_op, 0x671); | 1729 | ASSERT_REG_POSITION(logic_op, 0x671); |
| 1699 | ASSERT_REG_POSITION(clear_buffers, 0x674); | 1730 | ASSERT_REG_POSITION(clear_buffers, 0x674); |
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/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 0f62779de..ca6019a3a 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -1067,7 +1067,8 @@ void TextureCacheRuntime::ConvertImage(Framebuffer* dst, ImageView& dst_view, Im | |||
| 1067 | } | 1067 | } |
| 1068 | break; | 1068 | break; |
| 1069 | case PixelFormat::A8B8G8R8_UNORM: | 1069 | case PixelFormat::A8B8G8R8_UNORM: |
| 1070 | if (src_view.format == PixelFormat::S8_UINT_D24_UNORM) { | 1070 | if (src_view.format == PixelFormat::S8_UINT_D24_UNORM || |
| 1071 | src_view.format == PixelFormat::D24_UNORM_S8_UINT) { | ||
| 1071 | return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view); | 1072 | return blit_image_helper.ConvertD24S8ToABGR8(dst, src_view); |
| 1072 | } | 1073 | } |
| 1073 | break; | 1074 | break; |
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(); |