From d1ad5979392aa8bf00de4671a22dcd028d663a4b Mon Sep 17 00:00:00 2001 From: Gliniak <153369+Gliniak@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:52:00 +0100 Subject: [PATCH] [GPU] Vulkan: Fixed FSI render target path AlphaToMask was causing crashes on linux due to missing SelectionMerge --- src/xenia/gpu/spirv_shader_translator_rb.cc | 22 ++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/xenia/gpu/spirv_shader_translator_rb.cc b/src/xenia/gpu/spirv_shader_translator_rb.cc index 6a6cb9aa9..0d5e27fbd 100644 --- a/src/xenia/gpu/spirv_shader_translator_rb.cc +++ b/src/xenia/gpu/spirv_shader_translator_rb.cc @@ -3798,6 +3798,7 @@ void SpirvShaderTranslator::FSI_AlphaToMask() { spv::Block& block_msaa_4x = builder_->makeNewBlock(); spv::Block& block_msaa_check_2x = builder_->makeNewBlock(); spv::Block& block_msaa_merge = builder_->makeNewBlock(); + spv::Block& block_msaa_merge_2x_1x = builder_->makeNewBlock(); // Check if 4x MSAA spv::Id is_4x = builder_->createBinOp( @@ -3826,6 +3827,8 @@ void SpirvShaderTranslator::FSI_AlphaToMask() { builder_->setBuildPoint(&block_msaa_check_2x); spv::Id is_2x = builder_->createBinOp( spv::OpIEqual, type_bool_, msaa_samples, builder_->makeUintConstant(1)); + builder_->createSelectionMerge(&block_msaa_merge_2x_1x, + spv::SelectionControlDontFlattenMask); builder_->createConditionalBranch(is_2x, &block_msaa_2x_actual, &block_msaa_1x); @@ -3836,13 +3839,24 @@ void SpirvShaderTranslator::FSI_AlphaToMask() { coverage_2x); FSI_AlphaToMaskSample(false, 1, 1.0f, threshold_offset, 1.0f / 8.0f, alpha, coverage_2x); - builder_->createBranch(&block_msaa_merge); + builder_->createBranch(&block_msaa_merge_2x_1x); // 1x MSAA path builder_->setBuildPoint(&block_msaa_1x); spv::Id coverage_1x = main_fsi_sample_mask_; FSI_AlphaToMaskSample(false, 0, 1.0f, threshold_offset, 1.0f / 4.0f, alpha, coverage_1x); + builder_->createBranch(&block_msaa_merge_2x_1x); + + // Merge 2x/1x MSAA paths + builder_->setBuildPoint(&block_msaa_merge_2x_1x); + id_vector_temp_.clear(); + id_vector_temp_.push_back(coverage_2x); + id_vector_temp_.push_back(block_msaa_2x_actual.getId()); + id_vector_temp_.push_back(coverage_1x); + id_vector_temp_.push_back(block_msaa_1x.getId()); + spv::Id coverage_2x_1x = + builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_); builder_->createBranch(&block_msaa_merge); // Merge MSAA paths with PHI @@ -3850,10 +3864,8 @@ void SpirvShaderTranslator::FSI_AlphaToMask() { id_vector_temp_.clear(); id_vector_temp_.push_back(coverage_4x); id_vector_temp_.push_back(block_msaa_4x.getId()); - id_vector_temp_.push_back(coverage_2x); - id_vector_temp_.push_back(block_msaa_2x_actual.getId()); - id_vector_temp_.push_back(coverage_1x); - id_vector_temp_.push_back(block_msaa_1x.getId()); + id_vector_temp_.push_back(coverage_2x_1x); + id_vector_temp_.push_back(block_msaa_merge_2x_1x.getId()); spv::Id coverage_final = builder_->createOp(spv::OpPhi, type_uint_, id_vector_temp_);