[GPU] Vulkan: Fixed FSI render target path

AlphaToMask was causing crashes on linux due to missing SelectionMerge
This commit is contained in:
Gliniak
2026-03-09 21:52:00 +01:00
parent ce94f7fc03
commit d1ad597939

View File

@@ -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_);