Compare commits
16 Commits
android-19
...
android-25
Author | SHA1 | Date | |
---|---|---|---|
ff3fba0610 | |||
689dc4a17b | |||
9352a0f2e6 | |||
b1730d3c72 | |||
4007142b91 | |||
a1c355051e | |||
d3da1e6517 | |||
6ffcc3d5d2 | |||
01b379fe20 | |||
4742627744 | |||
43920aa1a0 | |||
e2ea46f6ef | |||
07f71e2620 | |||
a0ed0e4e10 | |||
c067046387 | |||
d7c532d889 |
@ -136,6 +136,22 @@ if (YUZU_USE_BUNDLED_VCPKG)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (MSVC)
|
||||
set(VCPKG_DOWNLOADS_PATH ${PROJECT_SOURCE_DIR}/externals/vcpkg/downloads)
|
||||
set(NASM_VERSION "2.16.01")
|
||||
set(NASM_DESTINATION_PATH ${VCPKG_DOWNLOADS_PATH}/nasm-${NASM_VERSION}-win64.zip)
|
||||
set(NASM_DOWNLOAD_URL "https://github.com/yuzu-emu/ext-windows-bin/raw/master/nasm/nasm-${NASM_VERSION}-win64.zip")
|
||||
|
||||
if (NOT EXISTS ${NASM_DESTINATION_PATH})
|
||||
file(DOWNLOAD ${NASM_DOWNLOAD_URL} ${NASM_DESTINATION_PATH} SHOW_PROGRESS STATUS NASM_STATUS)
|
||||
|
||||
if (NOT NASM_STATUS EQUAL 0)
|
||||
# Warn and not fail since vcpkg is supposed to download this package for us in the first place
|
||||
message(WARNING "External nasm vcpkg package download from ${NASM_DOWNLOAD_URL} failed with status ${NASM_STATUS}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (YUZU_TESTS)
|
||||
list(APPEND VCPKG_MANIFEST_FEATURES "yuzu-tests")
|
||||
endif()
|
||||
|
@ -1,3 +1,11 @@
|
||||
| Pull Request | Commit | Title | Author | Merged? |
|
||||
|----|----|----|----|----|
|
||||
|
||||
|
||||
End of merge log. You can find the original README.md below the break.
|
||||
|
||||
-----
|
||||
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
@ -235,26 +235,6 @@
|
||||
<string name="region_korea">Korea</string>
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japanisch (日本語)</string>
|
||||
<string name="language_english">Englisch</string>
|
||||
<string name="language_french">Französisch (Français)</string>
|
||||
<string name="langauge_german">Deutsch (German)</string>
|
||||
<string name="language_italian">Italienisch (Italiano)</string>
|
||||
<string name="language_spanish">Spanisch (Español)</string>
|
||||
<string name="language_chinese">Chinesisch (简体中文)</string>
|
||||
<string name="language_korean">Koreanisch (한국어)</string>
|
||||
<string name="language_dutch">Niederländisch (Nederlands)</string>
|
||||
<string name="language_portuguese">Portugiesisch (Português)</string>
|
||||
<string name="language_russian">Russisch (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanesisch (台湾)</string>
|
||||
<string name="language_british_english">Britisches Englisch</string>
|
||||
<string name="language_canadian_french">Kanadisches Französisch (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Lateinamerikanisches Spanisch (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Vereinfachtes Chinesisch (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Traditionelles Chinesisch (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Brasilianisches Portugiesisch (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Keiner</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taiwán</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japonés (日本語)</string>
|
||||
<string name="language_english">Inglés (English)</string>
|
||||
<string name="language_french">Francés (Français)</string>
|
||||
<string name="langauge_german">Alemán (deutsch)</string>
|
||||
<string name="language_italian">Italiano (Italiano)</string>
|
||||
<string name="language_spanish">Español (Español)</string>
|
||||
<string name="language_chinese">Chino (简体中文)</string>
|
||||
<string name="language_korean">Coreano (한국어)</string>
|
||||
<string name="language_dutch">Holandés (nederlands)</string>
|
||||
<string name="language_portuguese">Portugués (Português)</string>
|
||||
<string name="language_russian">Ruso (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanés (台湾)</string>
|
||||
<string name="language_british_english">Inglés británico</string>
|
||||
<string name="language_canadian_french">Francés Canadiense (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Español Latinoamericano (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Chino Simplificado (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Chino tradicional (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Portugués Brasileño (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taïwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japonais (日本語)</string>
|
||||
<string name="language_english">Anglais</string>
|
||||
<string name="language_french">Français (Français)</string>
|
||||
<string name="langauge_german">Allemand (Deutsch)</string>
|
||||
<string name="language_italian">Italien (Italiano)</string>
|
||||
<string name="language_spanish">Espagnol (Español)</string>
|
||||
<string name="language_chinese">Chinois (简体中文)</string>
|
||||
<string name="language_korean">Coréen (한국어)</string>
|
||||
<string name="language_dutch">Néerlandais (Nederlands)</string>
|
||||
<string name="language_portuguese">Portugais (Português)</string>
|
||||
<string name="language_russian">Russe (Русский)</string>
|
||||
<string name="language_taiwanese">Taïwanais (台湾)</string>
|
||||
<string name="language_british_english">Anglais Britannique</string>
|
||||
<string name="language_canadian_french">Français canadien (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Espagnol latino-américain (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Chinois simplifié (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Chinois Traditionnel (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Portugais brésilien (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Giapponese (日本語)</string>
|
||||
<string name="language_english">Inglese (English)</string>
|
||||
<string name="language_french">Francese (Français)</string>
|
||||
<string name="langauge_german">Tedesco (Deutsch)</string>
|
||||
<string name="language_italian">Italiano (Italiano)</string>
|
||||
<string name="language_spanish">Spagnolo (Español)</string>
|
||||
<string name="language_chinese">Cinese (简体中文)</string>
|
||||
<string name="language_korean">Coreano (한국어)</string>
|
||||
<string name="language_dutch">Olandese (Nederlands)</string>
|
||||
<string name="language_portuguese">Portoghese (Português)</string>
|
||||
<string name="language_russian">Russo (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanese (台湾)</string>
|
||||
<string name="language_british_english">Inglese britannico</string>
|
||||
<string name="language_canadian_french">Francese Canadese (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Spagnolo Latino Americano (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Cinese Semplificato (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Cinese tradizionale (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Portoghese (Português)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -239,24 +239,6 @@
|
||||
<string name="region_taiwan">台湾</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">日本語</string>
|
||||
<string name="language_english">英語</string>
|
||||
<string name="language_french">フランス語 (Français)</string>
|
||||
<string name="langauge_german">ドイツ語 (Deutsch)</string>
|
||||
<string name="language_italian">イタリア語 (Italiano)</string>
|
||||
<string name="language_spanish">スペイン語 (Español)</string>
|
||||
<string name="language_chinese">中国語 (简体中文)</string>
|
||||
<string name="language_korean">韓国語 (한국어)</string>
|
||||
<string name="language_dutch">オランダ語 (Nederlands)</string>
|
||||
<string name="language_portuguese">ポルトガル語 (Português)</string>
|
||||
<string name="language_russian">ロシア語 (Русский)</string>
|
||||
<string name="language_taiwanese">台湾語 (台湾)</string>
|
||||
<string name="language_british_english">イギリス英語</string>
|
||||
<string name="language_canadian_french">フランス語(カナダ) (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">スペイン語(ラテンアメリカ) (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">中国語 (简体中文)</string>
|
||||
<string name="language_traditional_chinese">繁体字中国語 (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">ポルトガル語(ブラジル) (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">타이완</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">일본어 (日本語)</string>
|
||||
<string name="language_english">영어 (English)</string>
|
||||
<string name="language_french">프랑스어 (Français)</string>
|
||||
<string name="langauge_german">독일어(Deutsch)</string>
|
||||
<string name="language_italian">이탈리아어 (Italiano)</string>
|
||||
<string name="language_spanish">스페인어 (Español)</string>
|
||||
<string name="language_chinese">중국어 (简体中文)</string>
|
||||
<string name="language_korean">한국어 (Korean)</string>
|
||||
<string name="language_dutch">네덜란드어 (Nederlands)</string>
|
||||
<string name="language_portuguese">포르투갈어 (Português)</string>
|
||||
<string name="language_russian">러시아어 (Русский)</string>
|
||||
<string name="language_taiwanese">대만어 (台湾)</string>
|
||||
<string name="language_british_english">영어 (British English)</string>
|
||||
<string name="language_canadian_french">캐나다 프랑스어 (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">라틴 아메리카 스페인어 (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">중국어 간체 (简体中文)</string>
|
||||
<string name="language_traditional_chinese">중국어 번체 (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">브라질 포르투갈어 (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">불칸</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japansk (日本語)</string>
|
||||
<string name="language_english">Engelsk</string>
|
||||
<string name="language_french">Fransk (Français)</string>
|
||||
<string name="langauge_german">Tysk (Deutsch)</string>
|
||||
<string name="language_italian">Italiensk (Italiano)</string>
|
||||
<string name="language_spanish">Spansk (Español)</string>
|
||||
<string name="language_chinese">Kinesisk (简体中文)</string>
|
||||
<string name="language_korean">Koreansk (한국어)</string>
|
||||
<string name="language_dutch">Nederlandsk (Nederlands)</string>
|
||||
<string name="language_portuguese">Portugisisk (Português)</string>
|
||||
<string name="language_russian">Russisk (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwansk (台湾)</string>
|
||||
<string name="language_british_english">Britisk Engelsk</string>
|
||||
<string name="language_canadian_french">Kanadisk fransk (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Latinamerikansk spansk (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Forenklet kinesisk (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Tradisjonell Kinesisk (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Brasiliansk portugisisk (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Tajwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japoński (日本語)</string>
|
||||
<string name="language_english">Angielski</string>
|
||||
<string name="language_french">Francuski (Francja)</string>
|
||||
<string name="langauge_german">Niemiecki (Niemcy)</string>
|
||||
<string name="language_italian">Włoski (Włochy)</string>
|
||||
<string name="language_spanish">Hiszpański (Hiszpania)</string>
|
||||
<string name="language_chinese">Chiński (简体中文)</string>
|
||||
<string name="language_korean">Koreański (한국어)</string>
|
||||
<string name="language_dutch">Duński (Holandia)</string>
|
||||
<string name="language_portuguese">Portugalski (Portugalia)</string>
|
||||
<string name="language_russian">Rosyjski (Русский)</string>
|
||||
<string name="language_taiwanese">Tajwański (台湾)</string>
|
||||
<string name="language_british_english">Angielski Brytyjski</string>
|
||||
<string name="language_canadian_french">Francuski (Kanada)</string>
|
||||
<string name="language_latin_american_spanish">Hiszpański (Ameryka Latynoska)</string>
|
||||
<string name="language_simplified_chinese">Chiński uproszczony (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Chiński tradycyjny (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Portugalski (Brazylia)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japônes (日本語)</string>
|
||||
<string name="language_english">Português do Brasil</string>
|
||||
<string name="language_french">Francês (Français)</string>
|
||||
<string name="langauge_german">Alemão (Deutsch)</string>
|
||||
<string name="language_italian">Italiano (Italiano)</string>
|
||||
<string name="language_spanish">Espanhol (Español)</string>
|
||||
<string name="language_chinese">Mandarim (简体中文)</string>
|
||||
<string name="language_korean">Coreano (한국어)</string>
|
||||
<string name="language_dutch">Holandês (Nederlands)</string>
|
||||
<string name="language_portuguese">Português (Português)</string>
|
||||
<string name="language_russian">Russo (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanês (台湾)</string>
|
||||
<string name="language_british_english">Inglês britânico (British English)</string>
|
||||
<string name="language_canadian_french">Fracês Canadiano (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Espanhol da América Latina (Español latino-americano)</string>
|
||||
<string name="language_simplified_chinese">Chinês Simplificado (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Chinês tradicional (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Português do Brasil (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulcano</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japonês (日本語)</string>
|
||||
<string name="language_english">Inglês</string>
|
||||
<string name="language_french">Francês (Français)</string>
|
||||
<string name="langauge_german">Alemão (Deutsch)</string>
|
||||
<string name="language_italian">Italiano (Italiano)</string>
|
||||
<string name="language_spanish">Espanhol (Español)</string>
|
||||
<string name="language_chinese">Chinês simplificado (简体中文)</string>
|
||||
<string name="language_korean">Coreano (한국어)</string>
|
||||
<string name="language_dutch">Holandês (Nederlands)</string>
|
||||
<string name="language_portuguese">Português (Português)</string>
|
||||
<string name="language_russian">Russo (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanês (台湾)</string>
|
||||
<string name="language_british_english">Inglês Britânico</string>
|
||||
<string name="language_canadian_french">Fracês Canadiano (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Espanhol da América Latina (Español latino-americano)</string>
|
||||
<string name="language_simplified_chinese">Chinês Simplificado (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Chinês Tradicional (正 體 中文)</string>
|
||||
<string name="language_brazilian_portuguese">Português do Brasil (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulcano</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Тайвань</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Японский (日本語)</string>
|
||||
<string name="language_english">Английский (English)</string>
|
||||
<string name="language_french">Французский (Français)</string>
|
||||
<string name="langauge_german">Немецкий (Deutsch)</string>
|
||||
<string name="language_italian">Итальянский (Italiano)</string>
|
||||
<string name="language_spanish">Испанский (Español)</string>
|
||||
<string name="language_chinese">Китайский (简体中文)</string>
|
||||
<string name="language_korean">Корейский (한국어)</string>
|
||||
<string name="language_dutch">Голландский (Nederlands)</string>
|
||||
<string name="language_portuguese">Португальский (Português)</string>
|
||||
<string name="language_russian">Русский</string>
|
||||
<string name="language_taiwanese">Тайваньский (台湾)</string>
|
||||
<string name="language_british_english">Британский английский</string>
|
||||
<string name="language_canadian_french">Канадский французский (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Латиноамериканский испанский (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Упрощенный китайский (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Традиционный китайский (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Бразильский португальский (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">Тайвань</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Японська (日本語)</string>
|
||||
<string name="language_english">Англійська (English)</string>
|
||||
<string name="language_french">Французька (Français)</string>
|
||||
<string name="langauge_german">Німецька (Deutsch)</string>
|
||||
<string name="language_italian">Італійська (Italiano)</string>
|
||||
<string name="language_spanish">Іспанська (Español)</string>
|
||||
<string name="language_chinese">Китайскька (简体中文)</string>
|
||||
<string name="language_korean">Корейська (한국어)</string>
|
||||
<string name="language_dutch">Голландська (Nederlands)</string>
|
||||
<string name="language_portuguese">Португальська (Português)</string>
|
||||
<string name="language_russian">Російська (Русский)</string>
|
||||
<string name="language_taiwanese">Тайванська (台湾)</string>
|
||||
<string name="language_british_english">Британська англійська</string>
|
||||
<string name="language_canadian_french">Канадська французька (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Латиноамериканська іспанська (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Спрощена китайська (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Традиційна китайська (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Бразильська португальська (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">中国台湾</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">日语 (日本語)</string>
|
||||
<string name="language_english">英语 (English)</string>
|
||||
<string name="language_french">法语 (Français)</string>
|
||||
<string name="langauge_german">德语 (Deutsch)</string>
|
||||
<string name="language_italian">意大利语 (Italiano)</string>
|
||||
<string name="language_spanish">西班牙语 (Español)</string>
|
||||
<string name="language_chinese">中文 (简体中文)</string>
|
||||
<string name="language_korean">韩语 (한국어)</string>
|
||||
<string name="language_dutch">荷兰语 (Nederlands)</string>
|
||||
<string name="language_portuguese">葡萄牙语 (Português)</string>
|
||||
<string name="language_russian">俄语 (Русский)</string>
|
||||
<string name="language_taiwanese">台湾中文 (台灣)</string>
|
||||
<string name="language_british_english">英式英语</string>
|
||||
<string name="language_canadian_french">加拿大法语 (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">拉丁美洲西班牙语 (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">简体中文 (简体中文)</string>
|
||||
<string name="language_traditional_chinese">繁体中文 (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">巴西葡萄牙语 (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -241,24 +241,6 @@
|
||||
<string name="region_taiwan">台灣</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">日文 (日本語)</string>
|
||||
<string name="language_english">英文</string>
|
||||
<string name="language_french">法文 (Français)</string>
|
||||
<string name="langauge_german">德文 (Deutsch)</string>
|
||||
<string name="language_italian">義大利文 (Italiano)</string>
|
||||
<string name="language_spanish">西班牙文 (Español)</string>
|
||||
<string name="language_chinese">中文 (简体中文)</string>
|
||||
<string name="language_korean">韓文 (한국어)</string>
|
||||
<string name="language_dutch">荷蘭文 (Nederlands)</string>
|
||||
<string name="language_portuguese">葡萄牙文 (Português)</string>
|
||||
<string name="language_russian">俄文 (Русский)</string>
|
||||
<string name="language_taiwanese">台文 (台灣)</string>
|
||||
<string name="language_british_english">英式英文</string>
|
||||
<string name="language_canadian_french">加拿大法文 (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">拉丁美洲西班牙文 (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">簡體中文 (简体中文)</string>
|
||||
<string name="language_traditional_chinese">正體中文 (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">巴西葡萄牙文 (Português do Brasil)</string>
|
||||
|
||||
<!-- Renderer APIs -->
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
|
@ -287,24 +287,24 @@
|
||||
<string name="region_taiwan">Taiwan</string>
|
||||
|
||||
<!-- Language Names -->
|
||||
<string name="language_japanese">Japanese (日本語)</string>
|
||||
<string name="language_english">English</string>
|
||||
<string name="language_french">French (Français)</string>
|
||||
<string name="langauge_german">German (Deutsch)</string>
|
||||
<string name="language_italian">Italian (Italiano)</string>
|
||||
<string name="language_spanish">Spanish (Español)</string>
|
||||
<string name="language_chinese">Chinese (简体中文)</string>
|
||||
<string name="language_korean">Korean (한국어)</string>
|
||||
<string name="language_dutch">Dutch (Nederlands)</string>
|
||||
<string name="language_portuguese">Portuguese (Português)</string>
|
||||
<string name="language_russian">Russian (Русский)</string>
|
||||
<string name="language_taiwanese">Taiwanese (台湾)</string>
|
||||
<string name="language_british_english">British English</string>
|
||||
<string name="language_canadian_french">Canadian French (Français canadien)</string>
|
||||
<string name="language_latin_american_spanish">Latin American Spanish (Español latinoamericano)</string>
|
||||
<string name="language_simplified_chinese">Simplified Chinese (简体中文)</string>
|
||||
<string name="language_traditional_chinese">Traditional Chinese (正體中文)</string>
|
||||
<string name="language_brazilian_portuguese">Brazilian Portuguese (Português do Brasil)</string>
|
||||
<string name="language_japanese" translatable="false">日本語</string>
|
||||
<string name="language_english" translatable="false">English</string>
|
||||
<string name="language_french" translatable="false">Français</string>
|
||||
<string name="langauge_german" translatable="false">Deutsch</string>
|
||||
<string name="language_italian" translatable="false">Italiano</string>
|
||||
<string name="language_spanish" translatable="false">Español</string>
|
||||
<string name="language_chinese" translatable="false">简体中文</string>
|
||||
<string name="language_korean" translatable="false">한국어</string>
|
||||
<string name="language_dutch" translatable="false">Nederlands</string>
|
||||
<string name="language_portuguese" translatable="false">Português</string>
|
||||
<string name="language_russian" translatable="false">Русский</string>
|
||||
<string name="language_taiwanese" translatable="false">台湾</string>
|
||||
<string name="language_british_english" translatable="false">British English</string>
|
||||
<string name="language_canadian_french" translatable="false">Français canadien</string>
|
||||
<string name="language_latin_american_spanish" translatable="false">Español latinoamericano</string>
|
||||
<string name="language_simplified_chinese" translatable="false">简体中文</string>
|
||||
<string name="language_traditional_chinese" translatable="false">正體中文</string>
|
||||
<string name="language_brazilian_portuguese" translatable="false">Português do Brasil</string>
|
||||
|
||||
<!-- Memory Sizes -->
|
||||
<string name="memory_byte">Byte</string>
|
||||
|
@ -51,7 +51,7 @@ struct PageTable {
|
||||
class PageInfo {
|
||||
public:
|
||||
/// Returns the page pointer
|
||||
[[nodiscard]] u8* Pointer() const noexcept {
|
||||
[[nodiscard]] uintptr_t Pointer() const noexcept {
|
||||
return ExtractPointer(raw.load(std::memory_order_relaxed));
|
||||
}
|
||||
|
||||
@ -61,7 +61,7 @@ struct PageTable {
|
||||
}
|
||||
|
||||
/// Returns the page pointer and attribute pair, extracted from the same atomic read
|
||||
[[nodiscard]] std::pair<u8*, PageType> PointerType() const noexcept {
|
||||
[[nodiscard]] std::pair<uintptr_t, PageType> PointerType() const noexcept {
|
||||
const uintptr_t non_atomic_raw = raw.load(std::memory_order_relaxed);
|
||||
return {ExtractPointer(non_atomic_raw), ExtractType(non_atomic_raw)};
|
||||
}
|
||||
@ -73,13 +73,13 @@ struct PageTable {
|
||||
}
|
||||
|
||||
/// Write a page pointer and type pair atomically
|
||||
void Store(u8* pointer, PageType type) noexcept {
|
||||
raw.store(reinterpret_cast<uintptr_t>(pointer) | static_cast<uintptr_t>(type));
|
||||
void Store(uintptr_t pointer, PageType type) noexcept {
|
||||
raw.store(pointer | static_cast<uintptr_t>(type));
|
||||
}
|
||||
|
||||
/// Unpack a pointer from a page info raw representation
|
||||
[[nodiscard]] static u8* ExtractPointer(uintptr_t raw) noexcept {
|
||||
return reinterpret_cast<u8*>(raw & (~uintptr_t{0} << ATTRIBUTE_BITS));
|
||||
[[nodiscard]] static uintptr_t ExtractPointer(uintptr_t raw) noexcept {
|
||||
return raw & (~uintptr_t{0} << ATTRIBUTE_BITS);
|
||||
}
|
||||
|
||||
/// Unpack a page type from a page info raw representation
|
||||
|
@ -217,8 +217,8 @@ void ARM_Interface::Run() {
|
||||
}
|
||||
}
|
||||
|
||||
void ARM_Interface::LoadWatchpointArray(const WatchpointArray& wp) {
|
||||
watchpoints = ℘
|
||||
void ARM_Interface::LoadWatchpointArray(const WatchpointArray* wp) {
|
||||
watchpoints = wp;
|
||||
}
|
||||
|
||||
const Kernel::DebugWatchpoint* ARM_Interface::MatchingWatchpoint(
|
||||
|
@ -186,7 +186,7 @@ public:
|
||||
virtual void SaveContext(ThreadContext64& ctx) const = 0;
|
||||
virtual void LoadContext(const ThreadContext32& ctx) = 0;
|
||||
virtual void LoadContext(const ThreadContext64& ctx) = 0;
|
||||
void LoadWatchpointArray(const WatchpointArray& wp);
|
||||
void LoadWatchpointArray(const WatchpointArray* wp);
|
||||
|
||||
/// Clears the exclusive monitor's state.
|
||||
virtual void ClearExclusiveState() = 0;
|
||||
|
@ -15,8 +15,8 @@ void KAutoObject::RegisterWithKernel() {
|
||||
m_kernel.RegisterKernelObject(this);
|
||||
}
|
||||
|
||||
void KAutoObject::UnregisterWithKernel() {
|
||||
m_kernel.UnregisterKernelObject(this);
|
||||
void KAutoObject::UnregisterWithKernel(KernelCore& kernel, KAutoObject* self) {
|
||||
kernel.UnregisterKernelObject(self);
|
||||
}
|
||||
|
||||
} // namespace Kernel
|
||||
|
@ -159,14 +159,15 @@ public:
|
||||
|
||||
// If ref count hits zero, destroy the object.
|
||||
if (cur_ref_count - 1 == 0) {
|
||||
KernelCore& kernel = m_kernel;
|
||||
this->Destroy();
|
||||
this->UnregisterWithKernel();
|
||||
KAutoObject::UnregisterWithKernel(kernel, this);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void RegisterWithKernel();
|
||||
void UnregisterWithKernel();
|
||||
static void UnregisterWithKernel(KernelCore& kernel, KAutoObject* self);
|
||||
|
||||
protected:
|
||||
KernelCore& m_kernel;
|
||||
|
@ -510,11 +510,12 @@ void KScheduler::Unload(KThread* thread) {
|
||||
|
||||
void KScheduler::Reload(KThread* thread) {
|
||||
auto& cpu_core = m_kernel.System().ArmInterface(m_core_id);
|
||||
auto* process = thread->GetOwnerProcess();
|
||||
cpu_core.LoadContext(thread->GetContext32());
|
||||
cpu_core.LoadContext(thread->GetContext64());
|
||||
cpu_core.SetTlsAddress(GetInteger(thread->GetTlsAddress()));
|
||||
cpu_core.SetTPIDR_EL0(thread->GetTpidrEl0());
|
||||
cpu_core.LoadWatchpointArray(thread->GetOwnerProcess()->GetWatchpoints());
|
||||
cpu_core.LoadWatchpointArray(process ? &process->GetWatchpoints() : nullptr);
|
||||
cpu_core.ClearExclusiveState();
|
||||
}
|
||||
|
||||
|
@ -129,7 +129,7 @@ Result KThread::Initialize(KThreadFunction func, uintptr_t arg, KProcessAddress
|
||||
case ThreadType::User:
|
||||
ASSERT(((owner == nullptr) ||
|
||||
(owner->GetCoreMask() | (1ULL << virt_core)) == owner->GetCoreMask()));
|
||||
ASSERT(((owner == nullptr) ||
|
||||
ASSERT(((owner == nullptr) || (prio > Svc::LowestThreadPriority) ||
|
||||
(owner->GetPriorityMask() | (1ULL << prio)) == owner->GetPriorityMask()));
|
||||
break;
|
||||
case ThreadType::Kernel:
|
||||
|
@ -24,6 +24,16 @@
|
||||
|
||||
namespace Core::Memory {
|
||||
|
||||
namespace {
|
||||
|
||||
bool AddressSpaceContains(const Common::PageTable& table, const Common::ProcessAddress addr,
|
||||
const std::size_t size) {
|
||||
const Common::ProcessAddress max_addr = 1ULL << table.GetAddressSpaceBits();
|
||||
return addr + size >= addr && addr + size <= max_addr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Implementation class used to keep the specifics of the memory subsystem hidden
|
||||
// from outside classes. This also allows modification to the internals of the memory
|
||||
// subsystem without needing to rebuild all files that make use of the memory interface.
|
||||
@ -73,7 +83,7 @@ struct Memory::Impl {
|
||||
return {};
|
||||
}
|
||||
|
||||
return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr;
|
||||
return system.DeviceMemory().GetPointer<u8>(paddr + vaddr);
|
||||
}
|
||||
|
||||
[[nodiscard]] u8* GetPointerFromDebugMemory(u64 vaddr) const {
|
||||
@ -84,7 +94,7 @@ struct Memory::Impl {
|
||||
return {};
|
||||
}
|
||||
|
||||
return system.DeviceMemory().GetPointer<u8>(paddr) + vaddr;
|
||||
return system.DeviceMemory().GetPointer<u8>(paddr + vaddr);
|
||||
}
|
||||
|
||||
u8 Read8(const Common::ProcessAddress addr) {
|
||||
@ -191,6 +201,11 @@ struct Memory::Impl {
|
||||
std::size_t page_offset = addr & YUZU_PAGEMASK;
|
||||
bool user_accessible = true;
|
||||
|
||||
if (!AddressSpaceContains(page_table, addr, size)) [[unlikely]] {
|
||||
on_unmapped(size, addr);
|
||||
return false;
|
||||
}
|
||||
|
||||
while (remaining_size) {
|
||||
const std::size_t copy_amount =
|
||||
std::min(static_cast<std::size_t>(YUZU_PAGESIZE) - page_offset, remaining_size);
|
||||
@ -205,7 +220,8 @@ struct Memory::Impl {
|
||||
break;
|
||||
}
|
||||
case Common::PageType::Memory: {
|
||||
u8* mem_ptr = pointer + page_offset + (page_index << YUZU_PAGEBITS);
|
||||
u8* mem_ptr =
|
||||
reinterpret_cast<u8*>(pointer + page_offset + (page_index << YUZU_PAGEBITS));
|
||||
on_memory(copy_amount, mem_ptr);
|
||||
break;
|
||||
}
|
||||
@ -420,7 +436,7 @@ struct Memory::Impl {
|
||||
}
|
||||
|
||||
void MarkRegionDebug(u64 vaddr, u64 size, bool debug) {
|
||||
if (vaddr == 0) {
|
||||
if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -447,7 +463,7 @@ struct Memory::Impl {
|
||||
break;
|
||||
case Common::PageType::Memory:
|
||||
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
||||
nullptr, Common::PageType::DebugMemory);
|
||||
0, Common::PageType::DebugMemory);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
@ -465,7 +481,8 @@ struct Memory::Impl {
|
||||
case Common::PageType::DebugMemory: {
|
||||
u8* const pointer{GetPointerFromDebugMemory(vaddr & ~YUZU_PAGEMASK)};
|
||||
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
||||
pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory);
|
||||
reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK),
|
||||
Common::PageType::Memory);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@ -476,7 +493,7 @@ struct Memory::Impl {
|
||||
}
|
||||
|
||||
void RasterizerMarkRegionCached(u64 vaddr, u64 size, bool cached) {
|
||||
if (vaddr == 0) {
|
||||
if (vaddr == 0 || !AddressSpaceContains(*current_page_table, vaddr, size)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -505,7 +522,7 @@ struct Memory::Impl {
|
||||
case Common::PageType::DebugMemory:
|
||||
case Common::PageType::Memory:
|
||||
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
||||
nullptr, Common::PageType::RasterizerCachedMemory);
|
||||
0, Common::PageType::RasterizerCachedMemory);
|
||||
break;
|
||||
case Common::PageType::RasterizerCachedMemory:
|
||||
// There can be more than one GPU region mapped per CPU region, so it's common
|
||||
@ -533,10 +550,11 @@ struct Memory::Impl {
|
||||
// pagetable after unmapping a VMA. In that case the underlying VMA will no
|
||||
// longer exist, and we should just leave the pagetable entry blank.
|
||||
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
||||
nullptr, Common::PageType::Unmapped);
|
||||
0, Common::PageType::Unmapped);
|
||||
} else {
|
||||
current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Store(
|
||||
pointer - (vaddr & ~YUZU_PAGEMASK), Common::PageType::Memory);
|
||||
reinterpret_cast<uintptr_t>(pointer) - (vaddr & ~YUZU_PAGEMASK),
|
||||
Common::PageType::Memory);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -583,7 +601,7 @@ struct Memory::Impl {
|
||||
"Mapping memory page without a pointer @ {:016x}", base * YUZU_PAGESIZE);
|
||||
|
||||
while (base != end) {
|
||||
page_table.pointers[base].Store(nullptr, type);
|
||||
page_table.pointers[base].Store(0, type);
|
||||
page_table.backing_addr[base] = 0;
|
||||
page_table.blocks[base] = 0;
|
||||
base += 1;
|
||||
@ -592,7 +610,8 @@ struct Memory::Impl {
|
||||
auto orig_base = base;
|
||||
while (base != end) {
|
||||
auto host_ptr =
|
||||
system.DeviceMemory().GetPointer<u8>(target) - (base << YUZU_PAGEBITS);
|
||||
reinterpret_cast<uintptr_t>(system.DeviceMemory().GetPointer<u8>(target)) -
|
||||
(base << YUZU_PAGEBITS);
|
||||
auto backing = GetInteger(target) - (base << YUZU_PAGEBITS);
|
||||
page_table.pointers[base].Store(host_ptr, type);
|
||||
page_table.backing_addr[base] = backing;
|
||||
@ -611,15 +630,15 @@ struct Memory::Impl {
|
||||
// AARCH64 masks the upper 16 bit of all memory accesses
|
||||
vaddr = vaddr & 0xffffffffffffULL;
|
||||
|
||||
if (vaddr >= 1uLL << current_page_table->GetAddressSpaceBits()) {
|
||||
if (!AddressSpaceContains(*current_page_table, vaddr, 1)) [[unlikely]] {
|
||||
on_unmapped();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Avoid adding any extra logic to this fast-path block
|
||||
const uintptr_t raw_pointer = current_page_table->pointers[vaddr >> YUZU_PAGEBITS].Raw();
|
||||
if (u8* const pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) {
|
||||
return &pointer[vaddr];
|
||||
if (const uintptr_t pointer = Common::PageTable::PageInfo::ExtractPointer(raw_pointer)) {
|
||||
return reinterpret_cast<u8*>(pointer + vaddr);
|
||||
}
|
||||
switch (Common::PageTable::PageInfo::ExtractType(raw_pointer)) {
|
||||
case Common::PageType::Unmapped:
|
||||
@ -813,7 +832,7 @@ bool Memory::IsValidVirtualAddress(const Common::ProcessAddress vaddr) const {
|
||||
return false;
|
||||
}
|
||||
const auto [pointer, type] = page_table.pointers[page].PointerType();
|
||||
return pointer != nullptr || type == Common::PageType::RasterizerCachedMemory ||
|
||||
return pointer != 0 || type == Common::PageType::RasterizerCachedMemory ||
|
||||
type == Common::PageType::DebugMemory;
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,9 @@ public:
|
||||
explicit QueryCacheBase(VideoCore::RasterizerInterface& rasterizer_,
|
||||
Core::Memory::Memory& cpu_memory_)
|
||||
: rasterizer{rasterizer_},
|
||||
cpu_memory{cpu_memory_}, streams{{CounterStream{static_cast<QueryCache&>(*this),
|
||||
// Use reinterpret_cast instead of static_cast as workaround for
|
||||
// UBSan bug (https://github.com/llvm/llvm-project/issues/59060)
|
||||
cpu_memory{cpu_memory_}, streams{{CounterStream{reinterpret_cast<QueryCache&>(*this),
|
||||
VideoCore::QueryType::SamplesPassed}}} {
|
||||
(void)slot_async_jobs.insert(); // Null value
|
||||
}
|
||||
|
@ -13,7 +13,8 @@ namespace VideoCore {
|
||||
|
||||
using namespace Core::Memory;
|
||||
|
||||
RasterizerAccelerated::RasterizerAccelerated(Memory& cpu_memory_) : cpu_memory{cpu_memory_} {}
|
||||
RasterizerAccelerated::RasterizerAccelerated(Memory& cpu_memory_)
|
||||
: cached_pages(std::make_unique<CachedPages>()), cpu_memory{cpu_memory_} {}
|
||||
|
||||
RasterizerAccelerated::~RasterizerAccelerated() = default;
|
||||
|
||||
@ -26,7 +27,7 @@ void RasterizerAccelerated::UpdatePagesCachedCount(VAddr addr, u64 size, int del
|
||||
std::atomic_thread_fence(std::memory_order_acquire);
|
||||
const u64 page_end = Common::DivCeil(addr + size, YUZU_PAGESIZE);
|
||||
for (u64 page = addr >> YUZU_PAGEBITS; page != page_end; ++page) {
|
||||
std::atomic_uint16_t& count = cached_pages.at(page >> 2).Count(page);
|
||||
std::atomic_uint16_t& count = cached_pages->at(page >> 2).Count(page);
|
||||
|
||||
if (delta > 0) {
|
||||
ASSERT_MSG(count.load(std::memory_order::relaxed) < UINT16_MAX, "Count may overflow!");
|
||||
|
@ -41,7 +41,8 @@ private:
|
||||
};
|
||||
static_assert(sizeof(CacheEntry) == 8, "CacheEntry should be 8 bytes!");
|
||||
|
||||
std::array<CacheEntry, 0x2000000> cached_pages;
|
||||
using CachedPages = std::array<CacheEntry, 0x2000000>;
|
||||
std::unique_ptr<CachedPages> cached_pages;
|
||||
Core::Memory::Memory& cpu_memory;
|
||||
};
|
||||
|
||||
|
@ -554,14 +554,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
||||
}
|
||||
|
||||
sets_per_pool = 64;
|
||||
if (extensions.extended_dynamic_state3 && is_amd_driver &&
|
||||
properties.properties.driverVersion >= VK_MAKE_API_VERSION(0, 2, 0, 270)) {
|
||||
LOG_WARNING(Render_Vulkan,
|
||||
"AMD drivers after 23.5.2 have broken extendedDynamicState3ColorBlendEquation");
|
||||
features.extended_dynamic_state3.extendedDynamicState3ColorBlendEnable = false;
|
||||
features.extended_dynamic_state3.extendedDynamicState3ColorBlendEquation = false;
|
||||
dynamic_state3_blending = false;
|
||||
}
|
||||
if (is_amd_driver) {
|
||||
// AMD drivers need a higher amount of Sets per Pool in certain circumstances like in XC2.
|
||||
sets_per_pool = 96;
|
||||
|
@ -3,9 +3,14 @@
|
||||
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
|
||||
#include <QEventLoop>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
|
||||
#include <discord_rpc.h>
|
||||
#include <fmt/format.h>
|
||||
#include <httplib.h>
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/string_util.h"
|
||||
#include "core/core.h"
|
||||
@ -31,7 +36,7 @@ void DiscordImpl::Pause() {
|
||||
Discord_ClearPresence();
|
||||
}
|
||||
|
||||
static std::string GetGameString(const std::string& title) {
|
||||
std::string DiscordImpl::GetGameString(const std::string& title) {
|
||||
// Convert to lowercase
|
||||
std::string icon_name = Common::ToLower(title);
|
||||
|
||||
@ -56,51 +61,56 @@ static std::string GetGameString(const std::string& title) {
|
||||
return icon_name;
|
||||
}
|
||||
|
||||
void DiscordImpl::Update() {
|
||||
void DiscordImpl::UpdateGameStatus(bool use_default) {
|
||||
const std::string default_text = "yuzu is an emulator for the Nintendo Switch";
|
||||
const std::string default_image = "yuzu_logo";
|
||||
const std::string url = use_default ? default_image : game_url;
|
||||
s64 start_time = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch())
|
||||
.count();
|
||||
const std::string default_text = "yuzu is an emulator for the Nintendo Switch";
|
||||
const std::string default_image = "yuzu_logo";
|
||||
std::string game_cover_url = "https://yuzu-emu.org";
|
||||
std::string title;
|
||||
|
||||
DiscordRichPresence presence{};
|
||||
|
||||
presence.largeImageKey = url.c_str();
|
||||
presence.largeImageText = game_title.c_str();
|
||||
presence.smallImageKey = default_image.c_str();
|
||||
presence.smallImageText = default_text.c_str();
|
||||
presence.state = game_title.c_str();
|
||||
presence.details = "Currently in game";
|
||||
presence.startTimestamp = start_time;
|
||||
Discord_UpdatePresence(&presence);
|
||||
}
|
||||
|
||||
void DiscordImpl::Update() {
|
||||
const std::string default_text = "yuzu is an emulator for the Nintendo Switch";
|
||||
const std::string default_image = "yuzu_logo";
|
||||
|
||||
if (system.IsPoweredOn()) {
|
||||
system.GetAppLoader().ReadTitle(title);
|
||||
system.GetAppLoader().ReadTitle(game_title);
|
||||
|
||||
// Used to format Icon URL for yuzu website game compatibility page
|
||||
std::string icon_name = GetGameString(title);
|
||||
std::string icon_name = GetGameString(game_title);
|
||||
game_url = fmt::format("https://yuzu-emu.org/images/game/boxart/{}.png", icon_name);
|
||||
|
||||
// New Check for game cover
|
||||
httplib::Client cli(game_cover_url);
|
||||
cli.set_connection_timeout(std::chrono::seconds(3));
|
||||
cli.set_read_timeout(std::chrono::seconds(3));
|
||||
|
||||
if (auto res = cli.Head(fmt::format("/images/game/boxart/{}.png", icon_name))) {
|
||||
if (res->status == 200) {
|
||||
game_cover_url += fmt::format("/images/game/boxart/{}.png", icon_name);
|
||||
} else {
|
||||
game_cover_url = "yuzu_logo";
|
||||
}
|
||||
} else {
|
||||
game_cover_url = "yuzu_logo";
|
||||
}
|
||||
|
||||
presence.largeImageKey = game_cover_url.c_str();
|
||||
presence.largeImageText = title.c_str();
|
||||
|
||||
presence.smallImageKey = default_image.c_str();
|
||||
presence.smallImageText = default_text.c_str();
|
||||
presence.state = title.c_str();
|
||||
presence.details = "Currently in game";
|
||||
} else {
|
||||
presence.largeImageKey = default_image.c_str();
|
||||
presence.largeImageText = default_text.c_str();
|
||||
presence.details = "Currently not in game";
|
||||
QNetworkAccessManager manager;
|
||||
QNetworkRequest request;
|
||||
request.setUrl(QUrl(QString::fromStdString(game_url)));
|
||||
request.setTransferTimeout(3000);
|
||||
QNetworkReply* reply = manager.head(request);
|
||||
QEventLoop request_event_loop;
|
||||
QObject::connect(reply, &QNetworkReply::finished, &request_event_loop, &QEventLoop::quit);
|
||||
request_event_loop.exec();
|
||||
UpdateGameStatus(reply->error());
|
||||
return;
|
||||
}
|
||||
|
||||
s64 start_time = std::chrono::duration_cast<std::chrono::seconds>(
|
||||
std::chrono::system_clock::now().time_since_epoch())
|
||||
.count();
|
||||
|
||||
DiscordRichPresence presence{};
|
||||
presence.largeImageKey = default_image.c_str();
|
||||
presence.largeImageText = default_text.c_str();
|
||||
presence.details = "Currently not in game";
|
||||
presence.startTimestamp = start_time;
|
||||
Discord_UpdatePresence(&presence);
|
||||
}
|
||||
|
@ -19,6 +19,13 @@ public:
|
||||
void Pause() override;
|
||||
void Update() override;
|
||||
|
||||
private:
|
||||
std::string GetGameString(const std::string& title);
|
||||
void UpdateGameStatus(bool use_default);
|
||||
|
||||
std::string game_url{};
|
||||
std::string game_title{};
|
||||
|
||||
Core::System& system;
|
||||
};
|
||||
|
||||
|
@ -265,7 +265,11 @@ void GameListWorker::AddTitlesToGameList(GameListDir* parent_dir) {
|
||||
std::vector<u8> icon;
|
||||
std::string name;
|
||||
u64 program_id = 0;
|
||||
loader->ReadProgramId(program_id);
|
||||
const auto result = loader->ReadProgramId(program_id);
|
||||
|
||||
if (result != Loader::ResultStatus::Success) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const PatchManager patch{program_id, system.GetFileSystemController(),
|
||||
system.GetContentProvider()};
|
||||
|
Reference in New Issue
Block a user