diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.h b/src/shader_recompiler/backend/spirv/spirv_emit_context.h index c73f54f3c..aa9dc4994 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.h +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.h @@ -179,8 +179,8 @@ public: const Id after_first_time_label = OpLabel(); const Id fallback_label = OpLabel(); const Id available_label = OpLabel(); - const Id save_unmasked_label = OpLabel(); - const Id after_save_unmasked_label = OpLabel(); + const Id save_masked_label = OpLabel(); + const Id after_save_masked_label = OpLabel(); const Id merge_label = OpLabel(); // Get page BDA @@ -225,22 +225,20 @@ public: // Value is available AddLabel(available_label); - const Id unmasked_bda = OpBitwiseAnd(U64, bda, bda_first_time_inv_mask); - - // Check if BDA was masked - const Id had_mask = OpIEqual(U1[1], bda, unmasked_bda); - OpSelectionMerge(save_unmasked_label, spv::SelectionControlMask::MaskNone); - OpBranchConditional(had_mask, save_unmasked_label, after_save_unmasked_label); - + OpSelectionMerge(after_save_masked_label, spv::SelectionControlMask::MaskNone); + OpBranchConditional(first_time, save_masked_label, after_save_masked_label); + // Save unmasked BDA - AddLabel(save_unmasked_label); - OpStore(bda_ptr, unmasked_bda); - OpBranch(after_save_unmasked_label); - + AddLabel(save_masked_label); + const Id masked_bda = OpBitwiseOr(U64, bda, bda_first_time_mask); + OpStore(bda_ptr, masked_bda); + OpBranch(after_save_masked_label); + // Load value - AddLabel(after_save_unmasked_label); + AddLabel(after_save_masked_label); + const Id unmasked_bda = OpBitwiseAnd(U64, bda, bda_first_time_inv_mask); const Id offset_in_bda = OpBitwiseAnd(U64, address, caching_pagemask_value); - const Id addr = OpIAdd(U64, bda, offset_in_bda); + const Id addr = OpIAdd(U64, unmasked_bda, offset_in_bda); const PointerType pointer_type = PointerTypeFromType(type); const Id pointer_type_id = physical_pointer_types[pointer_type]; const Id addr_ptr = OpConvertUToPtr(pointer_type_id, addr); diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index 5766f776a..0cb5b1c27 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -734,7 +734,7 @@ void Rasterizer::AddDmaSyncRanges(const boost::icl::interval_set& ranges) { std::scoped_lock lock{dma_sync_mapped_ranges_mutex}; std::shared_lock lock2(mapped_ranges_mutex); - dma_sync_mapped_ranges = mapped_ranges & ranges; + dma_sync_mapped_ranges = mapped_ranges & dma_sync_ranges; } }