diff options
| -rw-r--r-- | src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp | 3 | ||||
| -rw-r--r-- | src/shader_recompiler/backend/spirv/spirv_emit_context.cpp | 3 | ||||
| -rw-r--r-- | src/yuzu/main.cpp | 33 | ||||
| -rw-r--r-- | src/yuzu/main.h | 1 | 
4 files changed, 38 insertions, 2 deletions
| diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp index 0cd87a48f..fee510f7b 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp @@ -473,7 +473,8 @@ void EmitSetFragColor(EmitContext& ctx, u32 index, u32 component, Id value) {  }  void EmitSetSampleMask(EmitContext& ctx, Id value) { -    ctx.OpStore(ctx.sample_mask, value); +    const Id pointer{ctx.OpAccessChain(ctx.output_u32, ctx.sample_mask, ctx.u32_zero_value)}; +    ctx.OpStore(pointer, value);  }  void EmitSetFragDepth(EmitContext& ctx, Id value) { diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index d48d4860e..47739794f 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -1572,7 +1572,8 @@ void EmitContext::DefineOutputs(const IR::Program& program) {              Decorate(frag_depth, spv::Decoration::BuiltIn, spv::BuiltIn::FragDepth);          }          if (info.stores_sample_mask) { -            sample_mask = DefineOutput(*this, U32[1], std::nullopt); +            const Id array_type{TypeArray(U32[1], Const(1U))}; +            sample_mask = DefineOutput(*this, array_type, std::nullopt);              Decorate(sample_mask, spv::Decoration::BuiltIn, spv::BuiltIn::SampleMask);          }          break; diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index b79409a68..ba9eece1d 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -27,6 +27,7 @@  #include "configuration/configure_input.h"  #include "configuration/configure_per_game.h"  #include "configuration/configure_tas.h" +#include "core/file_sys/romfs_factory.h"  #include "core/file_sys/vfs.h"  #include "core/file_sys/vfs_real.h"  #include "core/frontend/applets/cabinet.h" @@ -4171,6 +4172,8 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {      }      Core::Crypto::KeyManager& keys = Core::Crypto::KeyManager::Instance(); +    bool all_keys_present{true}; +      if (keys.BaseDeriveNecessary()) {          Core::Crypto::PartitionDataManager pdm{vfs->OpenDirectory("", FileSys::Mode::Read)}; @@ -4195,6 +4198,7 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {              errors += tr(" - Missing PRODINFO");          }          if (!errors.isEmpty()) { +            all_keys_present = false;              QMessageBox::warning(                  this, tr("Derivation Components Missing"),                  tr("Encryption keys are missing. " @@ -4222,11 +4226,40 @@ void GMainWindow::OnReinitializeKeys(ReinitializeKeyBehavior behavior) {      system->GetFileSystemController().CreateFactories(*vfs); +    if (all_keys_present && !this->CheckSystemArchiveDecryption()) { +        LOG_WARNING(Frontend, "Mii model decryption failed"); +        QMessageBox::warning( +            this, tr("System Archive Decryption Failed"), +            tr("Encryption keys failed to decrypt firmware. " +               "<br>Please follow <a href='https://yuzu-emu.org/help/quickstart/'>the yuzu " +               "quickstart guide</a> to get all your keys, firmware and " +               "games.")); +    } +      if (behavior == ReinitializeKeyBehavior::Warning) {          game_list->PopulateAsync(UISettings::values.game_dirs);      }  } +bool GMainWindow::CheckSystemArchiveDecryption() { +    constexpr u64 MiiModelId = 0x0100000000000802; + +    auto bis_system = system->GetFileSystemController().GetSystemNANDContents(); +    if (!bis_system) { +        // Not having system BIS files is not an error. +        return true; +    } + +    auto mii_nca = bis_system->GetEntry(MiiModelId, FileSys::ContentRecordType::Data); +    if (!mii_nca) { +        // Not having the Mii model is not an error. +        return true; +    } + +    // Return whether we are able to decrypt the RomFS of the Mii model. +    return mii_nca->GetRomFS().get() != nullptr; +} +  std::optional<u64> GMainWindow::SelectRomFSDumpTarget(const FileSys::ContentProvider& installed,                                                        u64 program_id) {      const auto dlc_entries = diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 8b5c1d747..3bbc31ada 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -392,6 +392,7 @@ private:      void LoadTranslation();      void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);      bool CheckDarkMode(); +    bool CheckSystemArchiveDecryption();      QString GetTasStateDescription() const;      bool CreateShortcut(const std::string& shortcut_path, const std::string& title, | 
