mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-06 06:00:12 +00:00
Compare commits
139 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9c18bd44e7 | |||
| 013deb4f3f | |||
| 0b7d216a09 | |||
| b8478a570b | |||
| 9d620bba88 | |||
| 165a1d1da1 | |||
| 5c7520f572 | |||
| 7db354a25a | |||
| f759409cc2 | |||
| e11ea7f008 | |||
| 73cac64037 | |||
| fb174abf04 | |||
| 1b764efad9 | |||
| 488dcefec5 | |||
| df36685c9b | |||
| 9cc9a1fc35 | |||
| 0a88e761eb | |||
| 451b8eb80c | |||
| e4f74863d2 | |||
| 51584f5a63 | |||
| 148a7b24cd | |||
| 940568bb33 | |||
| 5714c3e477 | |||
| bad10039ae | |||
| dd1c024efc | |||
| 4f5fc58b6e | |||
| efba499fd3 | |||
| 41d8da1612 | |||
| 63fc150635 | |||
| 92cbcb8fe5 | |||
| 8040f06c87 | |||
| bdc890f647 | |||
| 08917afe0e | |||
| 213d9fb4a7 | |||
| 2d6f28c50e | |||
| ef7cde0c2b | |||
| 2d5c79c9f3 | |||
| 14b6160fcd | |||
| dfe0b7e7c7 | |||
| b8d9f44421 | |||
| 7d61946b7c | |||
| d8fc94093d | |||
| 4ce91d18b8 | |||
| f6cd6128ff | |||
| f3ce6acf53 | |||
| 656370e70a | |||
| 16483a27ed | |||
| d6f69e14dc | |||
| 1a65725a35 | |||
| 381d97639f | |||
| be4bcbee85 | |||
| 49c3a79fa8 | |||
| 9d4355064b | |||
| d832f5e156 | |||
| 5dc91d7e25 | |||
| ccbaa75e5e | |||
| 63ce0a0527 | |||
| d2d2220b24 | |||
| bc121efc19 | |||
| bcb3fbcf12 | |||
| ab11282def | |||
| a5c5966cd8 | |||
| 7a007fbf48 | |||
| 3f3240caed | |||
| 19298b713b | |||
| 10a21bf246 | |||
| 108c991431 | |||
| 98ad2d5e4c | |||
| 3ff00afd59 | |||
| fd8da678df | |||
| f71a80671c | |||
| 6ffd65adaf | |||
| e6fe763afa | |||
| fa9e069907 | |||
| 3ab215fd30 | |||
| 8d8e67cd7f | |||
| 36b06254b4 | |||
| ffb75c2b68 | |||
| d82a9c3ba5 | |||
| b7b90c183f | |||
| 1fbb1a0499 | |||
| 09371eab60 | |||
| 8a8c7f4c06 | |||
| 3a22f908a3 | |||
| 0dd78bbd07 | |||
| 20d3a4370a | |||
| 1529e30435 | |||
| 51d64c298d | |||
| 3cabafc06a | |||
| e9436f8094 | |||
| 228a400752 | |||
| 08741c919a | |||
| 17adc28b2c | |||
| 10528f1ceb | |||
| 377478cd46 | |||
| f92e326e17 | |||
| b10212fe94 | |||
| 521d3922f5 | |||
| 8cdf552c28 | |||
| d633c43aae | |||
| 27bcaba75c | |||
| 64a307c6dc | |||
| 691b63e79b | |||
| f955dfedcb | |||
| 86f826c313 | |||
| 052a04e610 | |||
| bd82351d73 | |||
| a152596f29 | |||
| 40036eb0f8 | |||
| 0cc76f1f22 | |||
| b016c88768 | |||
| 6221bd2c43 | |||
| facee08b5e | |||
| 43622f463d | |||
| 9bedcf6202 | |||
| 66a25a3d79 | |||
| b24c3d7226 | |||
| 26031c0940 | |||
| 930b64858e | |||
| b1e512c152 | |||
| fa4e7c6992 | |||
| b77308ced6 | |||
| defddec47f | |||
| c5405250d1 | |||
| 10c07d700c | |||
| 505b157647 | |||
| 1575f55abe | |||
| bfba95fd60 | |||
| ee73920d28 | |||
| 42642f8bad | |||
| 1a48de6e55 | |||
| 5adaa5b0f7 | |||
| 2b4184dd2b | |||
| d9159fefdd | |||
| 099547b3f4 | |||
| 93318ef697 | |||
| 9b64944480 | |||
| 5d150cac5c | |||
| ff8368c606 |
@@ -1,13 +0,0 @@
|
|||||||
diff --git a/libs/cobalt/include/boost/cobalt/concepts.hpp b/libs/cobalt/include/boost/cobalt/concepts.hpp
|
|
||||||
index d49f2ec..a9bdb80 100644
|
|
||||||
--- a/libs/cobalt/include/boost/cobalt/concepts.hpp
|
|
||||||
+++ b/libs/cobalt/include/boost/cobalt/concepts.hpp
|
|
||||||
@@ -62,7 +62,7 @@ struct enable_awaitables
|
|
||||||
template <typename T>
|
|
||||||
concept with_get_executor = requires (T& t)
|
|
||||||
{
|
|
||||||
- {t.get_executor()} -> asio::execution::executor;
|
|
||||||
+ t.get_executor();
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
+4
-8
@@ -82,8 +82,8 @@ cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSV
|
|||||||
option(ENABLE_DEBUG_TOOLS "Enable debugging tools (maxwell disassembler, SPIRV translator, etc)" OFF)
|
option(ENABLE_DEBUG_TOOLS "Enable debugging tools (maxwell disassembler, SPIRV translator, etc)" OFF)
|
||||||
option(ENABLE_WERROR "Enable -Werror diagnostics" ON)
|
option(ENABLE_WERROR "Enable -Werror diagnostics" ON)
|
||||||
|
|
||||||
# Lossless Scaling frame generation. Only Android.
|
# Lossless Scaling frame generation.
|
||||||
cmake_dependent_option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON "ANDROID" OFF)
|
option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON)
|
||||||
|
|
||||||
option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON)
|
option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON)
|
||||||
|
|
||||||
@@ -417,12 +417,9 @@ AddJsonPackage(boost)
|
|||||||
set(BOOST_NO_HEADERS ${Boost_ADDED})
|
set(BOOST_NO_HEADERS ${Boost_ADDED})
|
||||||
|
|
||||||
if (Boost_ADDED)
|
if (Boost_ADDED)
|
||||||
if (MSVC OR ANDROID)
|
|
||||||
add_compile_definitions(YUZU_BOOST_v1)
|
add_compile_definitions(YUZU_BOOST_v1)
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT MSVC OR CXX_CLANG)
|
if (NOT MSVC OR CXX_CLANG)
|
||||||
# boost sucks
|
# solaris sucks
|
||||||
if (SOLARIS)
|
if (SOLARIS)
|
||||||
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-pthreads>)
|
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-pthreads>)
|
||||||
endif()
|
endif()
|
||||||
@@ -431,8 +428,7 @@ if (Boost_ADDED)
|
|||||||
target_compile_options(boost_icl INTERFACE $<$<COMPILE_LANGUAGE:C,CXX>:-Wno-shadow>)
|
target_compile_options(boost_icl INTERFACE $<$<COMPILE_LANGUAGE:C,CXX>:-Wno-shadow>)
|
||||||
target_compile_options(boost_asio INTERFACE
|
target_compile_options(boost_asio INTERFACE
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-conversion>
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-conversion>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-implicit-fallthrough>
|
$<$<COMPILE_LANGUAGE:C,CXX>:-Wno-implicit-fallthrough>)
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
+6
-9
@@ -6,22 +6,19 @@
|
|||||||
"version": "v0.19.0"
|
"version": "v0.19.0"
|
||||||
},
|
},
|
||||||
"boost": {
|
"boost": {
|
||||||
"artifact": "%VERSION%-cmake.tar.xz",
|
"artifact": "boost-%VERSION%.tar.zst",
|
||||||
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
|
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
|
||||||
"hash": "6ae6e94664fe7f2fb01976b59b276ac5df8085c7503fa829d810fbfe495960cfec44fa2c36e2cb23480bc19c956ed199d4952b02639a00a6c07625d4e7130c2d",
|
"hash": "681d97be4386767662e230b2e7c9754d45e709cc5db4e747c23c27d1f5b0e87770bdf19b0bc44dcb0e8349324887bbb8fffb432098f4d0ce74a5043021a90afc",
|
||||||
"min_version": "1.57",
|
"min_version": "1.57",
|
||||||
"package": "Boost",
|
"package": "Boost",
|
||||||
"patches": [
|
"repo": "eden-emulator/ext-boost",
|
||||||
"0001-clang-cl.patch"
|
"version": "1.92.0"
|
||||||
],
|
|
||||||
"repo": "boostorg/boost",
|
|
||||||
"version": "boost-1.90.0"
|
|
||||||
},
|
},
|
||||||
"boost_headers": {
|
"boost_headers": {
|
||||||
"bundled": true,
|
"bundled": true,
|
||||||
"hash": "4ef845775e2277a8104ded6ddf749aa262ce52cf8438042869a048f9a0156dd772fbbcfa74efa1378fecef339b7286f6fe4b4feb5c45d49966b35d08e3e83507",
|
"hash": "c5fa2cd72f6e6666b7963b97bc359c75284b8fb540c30f3629a028b85270c9bc66c8a051383964f2bd4c1e005a4691593d15696e7ef39ea87cf6cff9e5691fb2",
|
||||||
"repo": "boostorg/headers",
|
"repo": "boostorg/headers",
|
||||||
"version": "boost-1.90.0"
|
"version": "boost-1.91.0"
|
||||||
},
|
},
|
||||||
"catch2": {
|
"catch2": {
|
||||||
"hash": "7eea385d79d88a5690cde131fe7ccda97d5c54ea09d6f515000d7bf07c828809d61c1ac99912c1ee507cf933f61c1c47ecdcc45df7850ffa82714034b0fccf35",
|
"hash": "7eea385d79d88a5690cde131fe7ccda97d5c54ea09d6f515000d7bf07c828809d61c1ac99912c1ee507cf933f61c1c47ecdcc45df7850ffa82714034b0fccf35",
|
||||||
|
|||||||
Vendored
+709
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+710
-601
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
Vendored
+708
-599
File diff suppressed because it is too large
Load Diff
Vendored
+709
-600
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.adapters
|
package org.yuzu.yuzu_emu.adapters
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import android.view.LayoutInflater
|
|||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.widget.LinearLayout
|
||||||
import android.widget.RadioGroup
|
import android.widget.RadioGroup
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.drawerlayout.widget.DrawerLayout
|
import androidx.drawerlayout.widget.DrawerLayout
|
||||||
@@ -673,6 +674,167 @@ class QuickSettings(val emulationFragment: EmulationFragment) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun addFrameGenCell(inflater: LayoutInflater, row: ViewGroup): TextView {
|
||||||
|
val cell = inflater.inflate(R.layout.item_quick_settings_frame_gen_cell, row, false)
|
||||||
|
as TextView
|
||||||
|
row.addView(cell)
|
||||||
|
return cell
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addFrameGen(container: ViewGroup) {
|
||||||
|
val inflater = LayoutInflater.from(emulationFragment.requireContext())
|
||||||
|
val itemView = inflater.inflate(R.layout.item_quick_settings_frame_gen, container, false)
|
||||||
|
|
||||||
|
val multiplierRow = itemView.findViewById<LinearLayout>(R.id.frame_gen_multipliers)
|
||||||
|
val targetRow = itemView.findViewById<LinearLayout>(R.id.frame_gen_targets)
|
||||||
|
val targetSection = itemView.findViewById<ViewGroup>(R.id.frame_gen_target_section)
|
||||||
|
val flowRow = itemView.findViewById<LinearLayout>(R.id.frame_gen_flow)
|
||||||
|
val flowSection = itemView.findViewById<ViewGroup>(R.id.frame_gen_flow_section)
|
||||||
|
|
||||||
|
val multiplierNames =
|
||||||
|
emulationFragment.resources.getStringArray(R.array.frameGenMultiplierNames)
|
||||||
|
val multiplierValues =
|
||||||
|
emulationFragment.resources.getIntArray(R.array.frameGenMultiplierValues)
|
||||||
|
val targetValues =
|
||||||
|
emulationFragment.resources.getIntArray(R.array.frameGenTargetRateValues)
|
||||||
|
val flowValues =
|
||||||
|
emulationFragment.resources.getIntArray(R.array.frameGenFlowScaleValues)
|
||||||
|
|
||||||
|
val columns = maxOf(
|
||||||
|
multiplierValues.size + 1,
|
||||||
|
targetValues.size,
|
||||||
|
flowValues.size + 1
|
||||||
|
).toFloat()
|
||||||
|
multiplierRow.weightSum = columns
|
||||||
|
targetRow.weightSum = columns
|
||||||
|
flowRow.weightSum = columns
|
||||||
|
|
||||||
|
val powerCell = addFrameGenCell(inflater, multiplierRow)
|
||||||
|
|
||||||
|
val multiplierCells = mutableListOf<TextView>()
|
||||||
|
for (name in multiplierNames) {
|
||||||
|
val cell = addFrameGenCell(inflater, multiplierRow)
|
||||||
|
cell.text = name
|
||||||
|
multiplierCells.add(cell)
|
||||||
|
}
|
||||||
|
|
||||||
|
val targetCells = mutableListOf<TextView>()
|
||||||
|
for (value in targetValues) {
|
||||||
|
val cell = addFrameGenCell(inflater, targetRow)
|
||||||
|
if (value == 0) {
|
||||||
|
cell.setText(R.string.frame_gen_fixed)
|
||||||
|
} else {
|
||||||
|
cell.text = value.toString()
|
||||||
|
}
|
||||||
|
targetCells.add(cell)
|
||||||
|
}
|
||||||
|
|
||||||
|
val autoCell = addFrameGenCell(inflater, flowRow)
|
||||||
|
autoCell.setText(R.string.frame_gen_flow_auto)
|
||||||
|
|
||||||
|
val flowCells = mutableListOf<TextView>()
|
||||||
|
for (value in flowValues) {
|
||||||
|
val cell = addFrameGenCell(inflater, flowRow)
|
||||||
|
cell.text = "$value%"
|
||||||
|
flowCells.add(cell)
|
||||||
|
}
|
||||||
|
|
||||||
|
val inactiveAlpha = 0.38f
|
||||||
|
|
||||||
|
fun refresh() {
|
||||||
|
val enabled = BooleanSetting.RENDERER_FRAME_GEN.getBoolean(needsGlobal = false)
|
||||||
|
val multiplier = IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.getInt(needsGlobal = false)
|
||||||
|
val target = IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.getInt(needsGlobal = false)
|
||||||
|
val fixed = target == 0
|
||||||
|
val flowAuto =
|
||||||
|
BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.getBoolean(needsGlobal = false)
|
||||||
|
val flowScale = IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.getInt(needsGlobal = false)
|
||||||
|
|
||||||
|
var powerLabel = R.string.frame_gen_off
|
||||||
|
var rowAlpha = inactiveAlpha
|
||||||
|
if (enabled) {
|
||||||
|
powerLabel = R.string.frame_gen_on
|
||||||
|
rowAlpha = 1.0f
|
||||||
|
}
|
||||||
|
|
||||||
|
var multiplierAlpha = inactiveAlpha
|
||||||
|
if (enabled && fixed) {
|
||||||
|
multiplierAlpha = 1.0f
|
||||||
|
}
|
||||||
|
|
||||||
|
powerCell.setText(powerLabel)
|
||||||
|
powerCell.isSelected = enabled
|
||||||
|
|
||||||
|
multiplierCells.forEachIndexed { index, cell ->
|
||||||
|
cell.isEnabled = enabled
|
||||||
|
cell.isSelected = enabled && fixed && multiplierValues[index] == multiplier
|
||||||
|
cell.alpha = multiplierAlpha
|
||||||
|
}
|
||||||
|
|
||||||
|
targetSection.alpha = rowAlpha
|
||||||
|
targetCells.forEachIndexed { index, cell ->
|
||||||
|
cell.isEnabled = enabled
|
||||||
|
cell.isSelected = enabled && targetValues[index] == target
|
||||||
|
}
|
||||||
|
|
||||||
|
flowSection.alpha = rowAlpha
|
||||||
|
autoCell.isEnabled = enabled
|
||||||
|
autoCell.isSelected = enabled && flowAuto
|
||||||
|
|
||||||
|
flowCells.forEachIndexed { index, cell ->
|
||||||
|
cell.isEnabled = enabled
|
||||||
|
cell.isSelected = enabled && !flowAuto && flowValues[index] == flowScale
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
powerCell.setOnClickListener {
|
||||||
|
if (BooleanSetting.RENDERER_FRAME_GEN.getBoolean(needsGlobal = false)) {
|
||||||
|
BooleanSetting.RENDERER_FRAME_GEN.setBoolean(false)
|
||||||
|
} else {
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.setInt(multiplierValues.first())
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(0)
|
||||||
|
BooleanSetting.RENDERER_FRAME_GEN.setBoolean(true)
|
||||||
|
}
|
||||||
|
saveSettings()
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
multiplierCells.forEachIndexed { index, cell ->
|
||||||
|
cell.setOnClickListener {
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_MULTIPLIER.setInt(multiplierValues[index])
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(0)
|
||||||
|
saveSettings()
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
targetCells.forEachIndexed { index, cell ->
|
||||||
|
cell.setOnClickListener {
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.setInt(targetValues[index])
|
||||||
|
saveSettings()
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
autoCell.setOnClickListener {
|
||||||
|
BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.setBoolean(true)
|
||||||
|
saveSettings()
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
flowCells.forEachIndexed { index, cell ->
|
||||||
|
cell.setOnClickListener {
|
||||||
|
IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.setInt(flowValues[index])
|
||||||
|
BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.setBoolean(false)
|
||||||
|
saveSettings()
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh()
|
||||||
|
container.addView(itemView)
|
||||||
|
}
|
||||||
|
|
||||||
fun addDivider(container: ViewGroup) {
|
fun addDivider(container: ViewGroup) {
|
||||||
val inflater = LayoutInflater.from(emulationFragment.requireContext())
|
val inflater = LayoutInflater.from(emulationFragment.requireContext())
|
||||||
val dividerView = inflater.inflate(R.layout.item_quick_settings_divider, container, false)
|
val dividerView = inflater.inflate(R.layout.item_quick_settings_divider, container, false)
|
||||||
|
|||||||
+4
-4
@@ -20,28 +20,28 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
EMULATE_BGR565("emulate_bgr565"),
|
EMULATE_BGR565("emulate_bgr565"),
|
||||||
RESCALE_HACK("rescale_hack"),
|
RESCALE_HACK("rescale_hack"),
|
||||||
CPUOPT_UNSAFE_HOST_MMU("cpuopt_unsafe_host_mmu"),
|
CPUOPT_UNSAFE_HOST_MMU("cpuopt_unsafe_host_mmu"),
|
||||||
|
RELOCATE_36BIT_ADDRESS_SPACE("relocate_36bit_address_space"),
|
||||||
USE_DOCKED_MODE("use_docked_mode"),
|
USE_DOCKED_MODE("use_docked_mode"),
|
||||||
USE_AUTO_STUB("use_auto_stub"),
|
USE_AUTO_STUB("use_auto_stub"),
|
||||||
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
||||||
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
||||||
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
||||||
RENDERER_ASYNC_PRESENTATION("async_presentation"),
|
|
||||||
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
||||||
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
||||||
|
RENDERER_BARRIER_FEEDBACK_LOOPS("barrier_feedback_loops"),
|
||||||
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
||||||
USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"),
|
USE_OPTIMIZED_VERTEX_BUFFERS("use_optimized_vertex_buffers"),
|
||||||
ENABLE_GPU_BUFFER_READBACK("enable_gpu_buffer_readback"),
|
ENABLE_GPU_BUFFER_READBACK("enable_gpu_buffer_readback"),
|
||||||
|
USE_UNIFIED_MEMORY("use_unified_memory"),
|
||||||
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
||||||
|
STALL_ON_GPU_FENCE_WAIT("stall_on_gpu_fence_wait"),
|
||||||
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
||||||
RENDERER_DEBUG("debug"),
|
RENDERER_DEBUG("debug"),
|
||||||
RENDERER_PATCH_OLD_QCOM_DRIVERS("patch_old_qcom_drivers"),
|
RENDERER_PATCH_OLD_QCOM_DRIVERS("patch_old_qcom_drivers"),
|
||||||
RENDERER_VERTEX_INPUT_DYNAMIC_STATE("vertex_input_dynamic_state"),
|
RENDERER_VERTEX_INPUT_DYNAMIC_STATE("vertex_input_dynamic_state"),
|
||||||
RENDERER_SAMPLE_SHADING("sample_shading"),
|
RENDERER_SAMPLE_SHADING("sample_shading"),
|
||||||
RENDERER_FRAME_GEN("frame_gen"),
|
RENDERER_FRAME_GEN("frame_gen"),
|
||||||
RENDERER_FRAME_GEN_FP16("frame_gen_fp16"),
|
|
||||||
RENDERER_FRAME_GEN_FLOW_SCALE_AUTO("frame_gen_flow_scale_auto"),
|
RENDERER_FRAME_GEN_FLOW_SCALE_AUTO("frame_gen_flow_scale_auto"),
|
||||||
RENDERER_FRAME_GEN_DUMP_FLOW("frame_gen_dump_flow"),
|
|
||||||
GPU_UNSWIZZLE_ENABLED("gpu_unswizzle_enabled"),
|
|
||||||
PICTURE_IN_PICTURE("picture_in_picture"),
|
PICTURE_IN_PICTURE("picture_in_picture"),
|
||||||
USE_CUSTOM_RTC("custom_rtc_enabled"),
|
USE_CUSTOM_RTC("custom_rtc_enabled"),
|
||||||
BLACK_BACKGROUNDS("black_backgrounds"),
|
BLACK_BACKGROUNDS("black_backgrounds"),
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
|||||||
RENDERER_DYNA_STATE("dyna_state"),
|
RENDERER_DYNA_STATE("dyna_state"),
|
||||||
DMA_ACCURACY("dma_accuracy"),
|
DMA_ACCURACY("dma_accuracy"),
|
||||||
GPU_FENCE_BEHAVIOR("gpu_fence_behavior"),
|
GPU_FENCE_BEHAVIOR("gpu_fence_behavior"),
|
||||||
FRAME_PACING_MODE("frame_pacing_mode"),
|
|
||||||
AUDIO_OUTPUT_ENGINE("output_engine"),
|
AUDIO_OUTPUT_ENGINE("output_engine"),
|
||||||
MAX_ANISOTROPY("max_anisotropy"),
|
MAX_ANISOTROPY("max_anisotropy"),
|
||||||
THEME("theme"),
|
THEME("theme"),
|
||||||
@@ -51,9 +50,6 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
|||||||
FAST_CPU_TIME("fast_cpu_time"),
|
FAST_CPU_TIME("fast_cpu_time"),
|
||||||
CPU_TICKS("cpu_ticks"),
|
CPU_TICKS("cpu_ticks"),
|
||||||
FAST_GPU_TIME("fast_gpu_time"),
|
FAST_GPU_TIME("fast_gpu_time"),
|
||||||
GPU_UNSWIZZLE_TEXTURE_SIZE("gpu_unswizzle_texture_size"),
|
|
||||||
GPU_UNSWIZZLE_STREAM_SIZE("gpu_unswizzle_stream_size"),
|
|
||||||
GPU_UNSWIZZLE_CHUNK_SIZE("gpu_unswizzle_chunk_size"),
|
|
||||||
BAT_TEMPERATURE_UNIT("bat_temperature_unit"),
|
BAT_TEMPERATURE_UNIT("bat_temperature_unit"),
|
||||||
CABINET_APPLET("cabinet_applet_mode"),
|
CABINET_APPLET("cabinet_applet_mode"),
|
||||||
CONTROLLER_APPLET("controller_applet_mode"),
|
CONTROLLER_APPLET("controller_applet_mode"),
|
||||||
|
|||||||
-89
@@ -1,89 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.model.view
|
|
||||||
|
|
||||||
import androidx.annotation.ArrayRes
|
|
||||||
import androidx.annotation.StringRes
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.BooleanSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.IntSetting
|
|
||||||
|
|
||||||
class GpuUnswizzleSetting(
|
|
||||||
@StringRes titleId: Int = 0,
|
|
||||||
titleString: String = "",
|
|
||||||
@StringRes descriptionId: Int = 0,
|
|
||||||
descriptionString: String = "",
|
|
||||||
@ArrayRes val textureSizeChoicesId: Int,
|
|
||||||
@ArrayRes val textureSizeValuesId: Int,
|
|
||||||
@ArrayRes val streamSizeChoicesId: Int,
|
|
||||||
@ArrayRes val streamSizeValuesId: Int,
|
|
||||||
@ArrayRes val chunkSizeChoicesId: Int,
|
|
||||||
@ArrayRes val chunkSizeValuesId: Int
|
|
||||||
) : SettingsItem(
|
|
||||||
object : AbstractSetting {
|
|
||||||
override val key: String = SettingsItem.GPU_UNSWIZZLE_COMBINED
|
|
||||||
override val defaultValue: Any = false
|
|
||||||
override val isSaveable = true
|
|
||||||
override val isRuntimeModifiable = true
|
|
||||||
override val isSwitchable = true
|
|
||||||
override val pairedSettingKey: String = ""
|
|
||||||
override var global: Boolean
|
|
||||||
get() {
|
|
||||||
return BooleanSetting.GPU_UNSWIZZLE_ENABLED.global &&
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.global &&
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.global &&
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.global
|
|
||||||
}
|
|
||||||
set(value) {
|
|
||||||
BooleanSetting.GPU_UNSWIZZLE_ENABLED.global = value
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.global = value
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.global = value
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.global = value
|
|
||||||
}
|
|
||||||
override fun getValueAsString(needsGlobal: Boolean): String = "combined"
|
|
||||||
override fun reset() {
|
|
||||||
BooleanSetting.GPU_UNSWIZZLE_ENABLED.reset()
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.reset()
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.reset()
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.reset()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
titleId,
|
|
||||||
titleString,
|
|
||||||
descriptionId,
|
|
||||||
descriptionString
|
|
||||||
) {
|
|
||||||
override val type = SettingsItem.TYPE_GPU_UNSWIZZLE
|
|
||||||
|
|
||||||
// Check if GPU unswizzle is enabled via the dedicated boolean setting
|
|
||||||
fun isEnabled(needsGlobal: Boolean = false): Boolean =
|
|
||||||
BooleanSetting.GPU_UNSWIZZLE_ENABLED.getBoolean(needsGlobal)
|
|
||||||
|
|
||||||
fun setEnabled(value: Boolean) =
|
|
||||||
BooleanSetting.GPU_UNSWIZZLE_ENABLED.setBoolean(value)
|
|
||||||
|
|
||||||
fun enable() = setEnabled(true)
|
|
||||||
|
|
||||||
fun disable() = setEnabled(false)
|
|
||||||
|
|
||||||
fun getTextureSize(needsGlobal: Boolean = false): Int =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.getInt(needsGlobal)
|
|
||||||
|
|
||||||
fun setTextureSize(value: Int) =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE.setInt(value)
|
|
||||||
|
|
||||||
fun getStreamSize(needsGlobal: Boolean = false): Int =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.getInt(needsGlobal)
|
|
||||||
|
|
||||||
fun setStreamSize(value: Int) =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE.setInt(value)
|
|
||||||
|
|
||||||
fun getChunkSize(needsGlobal: Boolean = false): Int =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.getInt(needsGlobal)
|
|
||||||
|
|
||||||
fun setChunkSize(value: Int) =
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE.setInt(value)
|
|
||||||
|
|
||||||
fun reset() = setting.reset()
|
|
||||||
}
|
|
||||||
+29
-65
@@ -123,9 +123,7 @@ abstract class SettingsItem(
|
|||||||
IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.key,
|
IntSetting.RENDERER_FRAME_GEN_TARGET_RATE.key,
|
||||||
IntSetting.RENDERER_FRAME_GEN_QUEUE_TARGET.key,
|
IntSetting.RENDERER_FRAME_GEN_QUEUE_TARGET.key,
|
||||||
BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.key,
|
BooleanSetting.RENDERER_FRAME_GEN_FLOW_SCALE_AUTO.key,
|
||||||
IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key,
|
IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key
|
||||||
BooleanSetting.RENDERER_FRAME_GEN_FP16.key,
|
|
||||||
BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW.key
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const val TYPE_HEADER = 0
|
const val TYPE_HEADER = 0
|
||||||
@@ -143,14 +141,12 @@ abstract class SettingsItem(
|
|||||||
const val TYPE_SPINBOX = 12
|
const val TYPE_SPINBOX = 12
|
||||||
const val TYPE_LAUNCHABLE = 13
|
const val TYPE_LAUNCHABLE = 13
|
||||||
const val TYPE_PATH = 14
|
const val TYPE_PATH = 14
|
||||||
const val TYPE_GPU_UNSWIZZLE = 15
|
|
||||||
const val TYPE_FX_TOOLBAR = 16
|
const val TYPE_FX_TOOLBAR = 16
|
||||||
const val TYPE_FX_PRESET = 17
|
const val TYPE_FX_PRESET = 17
|
||||||
const val TYPE_FX_SHADER = 18
|
const val TYPE_FX_SHADER = 18
|
||||||
const val TYPE_FX_BUTTON = 19
|
const val TYPE_FX_BUTTON = 19
|
||||||
|
|
||||||
const val FASTMEM_COMBINED = "fastmem_combined"
|
const val FASTMEM_COMBINED = "fastmem_combined"
|
||||||
const val GPU_UNSWIZZLE_COMBINED = "gpu_unswizzle_combined"
|
|
||||||
|
|
||||||
val emptySetting = object : AbstractSetting {
|
val emptySetting = object : AbstractSetting {
|
||||||
override val key: String = ""
|
override val key: String = ""
|
||||||
@@ -709,20 +705,6 @@ abstract class SettingsItem(
|
|||||||
units = "%"
|
units = "%"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.RENDERER_FRAME_GEN_FP16,
|
|
||||||
titleId = R.string.frame_gen_fp16,
|
|
||||||
descriptionId = R.string.frame_gen_fp16_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW,
|
|
||||||
titleId = R.string.frame_gen_dump_flow,
|
|
||||||
descriptionId = R.string.frame_gen_dump_flow_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.RENDERER_SCREEN_LAYOUT,
|
IntSetting.RENDERER_SCREEN_LAYOUT,
|
||||||
@@ -769,13 +751,6 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.RENDERER_ASYNC_PRESENTATION,
|
|
||||||
titleId = R.string.renderer_async_presentation,
|
|
||||||
descriptionId = R.string.renderer_async_presentation_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.DMA_ACCURACY,
|
IntSetting.DMA_ACCURACY,
|
||||||
@@ -810,45 +785,6 @@ abstract class SettingsItem(
|
|||||||
valuesId = R.array.gpuValues
|
valuesId = R.array.gpuValues
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SingleChoiceSetting(
|
|
||||||
IntSetting.GPU_UNSWIZZLE_TEXTURE_SIZE,
|
|
||||||
titleId = R.string.gpu_unswizzle_texture_size,
|
|
||||||
descriptionId = R.string.gpu_unswizzle_texture_size_description,
|
|
||||||
choicesId = R.array.gpuTextureSizeSwizzleEntries,
|
|
||||||
valuesId = R.array.gpuTextureSizeSwizzleValues
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
|
||||||
SingleChoiceSetting(
|
|
||||||
IntSetting.GPU_UNSWIZZLE_STREAM_SIZE,
|
|
||||||
titleId = R.string.gpu_unswizzle_stream_size,
|
|
||||||
descriptionId = R.string.gpu_unswizzle_stream_size_description,
|
|
||||||
choicesId = R.array.gpuSwizzleEntries,
|
|
||||||
valuesId = R.array.gpuSwizzleValues
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
|
||||||
SingleChoiceSetting(
|
|
||||||
IntSetting.GPU_UNSWIZZLE_CHUNK_SIZE,
|
|
||||||
titleId = R.string.gpu_unswizzle_chunk_size,
|
|
||||||
descriptionId = R.string.gpu_unswizzle_chunk_size_description,
|
|
||||||
choicesId = R.array.gpuSwizzleChunkEntries,
|
|
||||||
valuesId = R.array.gpuSwizzleChunkValues
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
|
||||||
GpuUnswizzleSetting(
|
|
||||||
titleId = R.string.gpu_unswizzle_settings,
|
|
||||||
descriptionId = R.string.gpu_unswizzle_settings_description,
|
|
||||||
textureSizeChoicesId = R.array.gpuTextureSizeSwizzleEntries,
|
|
||||||
textureSizeValuesId = R.array.gpuTextureSizeSwizzleValues,
|
|
||||||
streamSizeChoicesId = R.array.gpuSwizzleEntries,
|
|
||||||
streamSizeValuesId = R.array.gpuSwizzleValues,
|
|
||||||
chunkSizeChoicesId = R.array.gpuSwizzleChunkEntries,
|
|
||||||
chunkSizeValuesId = R.array.gpuSwizzleChunkValues
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.FAST_CPU_TIME,
|
IntSetting.FAST_CPU_TIME,
|
||||||
@@ -910,6 +846,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.cpuopt_unsafe_host_mmu_description
|
descriptionId = R.string.cpuopt_unsafe_host_mmu_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.RELOCATE_36BIT_ADDRESS_SPACE,
|
||||||
|
titleId = R.string.relocate_36bit_address_space,
|
||||||
|
descriptionId = R.string.relocate_36bit_address_space_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.RENDERER_REACTIVE_FLUSHING,
|
BooleanSetting.RENDERER_REACTIVE_FLUSHING,
|
||||||
@@ -917,6 +860,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.renderer_reactive_flushing_description
|
descriptionId = R.string.renderer_reactive_flushing_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.RENDERER_BARRIER_FEEDBACK_LOOPS,
|
||||||
|
titleId = R.string.renderer_barrier_feedback_loops,
|
||||||
|
descriptionId = R.string.renderer_barrier_feedback_loops_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.ENABLE_BUFFER_HISTORY,
|
BooleanSetting.ENABLE_BUFFER_HISTORY,
|
||||||
@@ -931,6 +881,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.enable_gpu_buffer_readback_description
|
descriptionId = R.string.enable_gpu_buffer_readback_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.USE_UNIFIED_MEMORY,
|
||||||
|
titleId = R.string.use_unified_memory,
|
||||||
|
descriptionId = R.string.use_unified_memory_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS,
|
BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS,
|
||||||
@@ -945,6 +902,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.sync_memory_operations_description
|
descriptionId = R.string.sync_memory_operations_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.STALL_ON_GPU_FENCE_WAIT,
|
||||||
|
titleId = R.string.stall_on_gpu_fence_wait,
|
||||||
|
descriptionId = R.string.stall_on_gpu_fence_wait_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.BUFFER_REORDER_DISABLE,
|
BooleanSetting.BUFFER_REORDER_DISABLE,
|
||||||
|
|||||||
-206
@@ -1,206 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui
|
|
||||||
|
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.DialogInterface
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.widget.ArrayAdapter
|
|
||||||
import androidx.fragment.app.DialogFragment
|
|
||||||
import androidx.fragment.app.activityViewModels
|
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
import org.yuzu.yuzu_emu.databinding.DialogGpuUnswizzleBinding
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.GpuUnswizzleSetting
|
|
||||||
|
|
||||||
class GpuUnswizzleDialogFragment : DialogFragment() {
|
|
||||||
private var position = 0
|
|
||||||
private val settingsViewModel: SettingsViewModel by activityViewModels()
|
|
||||||
private lateinit var binding: DialogGpuUnswizzleBinding
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
position = requireArguments().getInt(POSITION)
|
|
||||||
|
|
||||||
if (settingsViewModel.clickedItem == null) dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
|
||||||
binding = DialogGpuUnswizzleBinding.inflate(LayoutInflater.from(requireContext()))
|
|
||||||
val item = settingsViewModel.clickedItem as GpuUnswizzleSetting
|
|
||||||
|
|
||||||
// Setup texture size dropdown
|
|
||||||
val textureSizeEntries = resources.getStringArray(item.textureSizeChoicesId)
|
|
||||||
val textureSizeValues = resources.getIntArray(item.textureSizeValuesId)
|
|
||||||
val textureSizeAdapter = ArrayAdapter(
|
|
||||||
requireContext(),
|
|
||||||
android.R.layout.simple_dropdown_item_1line,
|
|
||||||
textureSizeEntries.toMutableList()
|
|
||||||
)
|
|
||||||
binding.dropdownTextureSize.setAdapter(textureSizeAdapter)
|
|
||||||
|
|
||||||
// Setup stream size dropdown
|
|
||||||
val streamSizeEntries = resources.getStringArray(item.streamSizeChoicesId)
|
|
||||||
val streamSizeValues = resources.getIntArray(item.streamSizeValuesId)
|
|
||||||
val streamSizeAdapter = ArrayAdapter(
|
|
||||||
requireContext(),
|
|
||||||
android.R.layout.simple_dropdown_item_1line,
|
|
||||||
streamSizeEntries.toMutableList()
|
|
||||||
)
|
|
||||||
binding.dropdownStreamSize.setAdapter(streamSizeAdapter)
|
|
||||||
|
|
||||||
// Setup chunk size dropdown
|
|
||||||
val chunkSizeEntries = resources.getStringArray(item.chunkSizeChoicesId)
|
|
||||||
val chunkSizeValues = resources.getIntArray(item.chunkSizeValuesId)
|
|
||||||
val chunkSizeAdapter = ArrayAdapter(
|
|
||||||
requireContext(),
|
|
||||||
android.R.layout.simple_dropdown_item_1line,
|
|
||||||
chunkSizeEntries.toMutableList()
|
|
||||||
)
|
|
||||||
binding.dropdownChunkSize.setAdapter(chunkSizeAdapter)
|
|
||||||
|
|
||||||
// Load current values
|
|
||||||
val isEnabled = item.isEnabled()
|
|
||||||
binding.switchEnable.isChecked = isEnabled
|
|
||||||
|
|
||||||
if (isEnabled) {
|
|
||||||
val textureSizeIndex = textureSizeValues.indexOf(item.getTextureSize())
|
|
||||||
if (textureSizeIndex >= 0) {
|
|
||||||
binding.dropdownTextureSize.setText(textureSizeEntries[textureSizeIndex], false)
|
|
||||||
}
|
|
||||||
|
|
||||||
val streamSizeIndex = streamSizeValues.indexOf(item.getStreamSize())
|
|
||||||
if (streamSizeIndex >= 0) {
|
|
||||||
binding.dropdownStreamSize.setText(streamSizeEntries[streamSizeIndex], false)
|
|
||||||
}
|
|
||||||
|
|
||||||
val chunkSizeIndex = chunkSizeValues.indexOf(item.getChunkSize())
|
|
||||||
if (chunkSizeIndex >= 0) {
|
|
||||||
binding.dropdownChunkSize.setText(chunkSizeEntries[chunkSizeIndex], false)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Set default/recommended values when disabling
|
|
||||||
binding.dropdownTextureSize.setText(textureSizeEntries[3], false)
|
|
||||||
binding.dropdownStreamSize.setText(streamSizeEntries[3], false)
|
|
||||||
binding.dropdownChunkSize.setText(chunkSizeEntries[3], false)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear adapter filters after setText to fix rotation bug
|
|
||||||
textureSizeAdapter.filter.filter(null)
|
|
||||||
streamSizeAdapter.filter.filter(null)
|
|
||||||
chunkSizeAdapter.filter.filter(null)
|
|
||||||
|
|
||||||
// Enable/disable dropdowns based on switch state
|
|
||||||
updateDropdownsState(isEnabled)
|
|
||||||
binding.switchEnable.setOnCheckedChangeListener { _, checked ->
|
|
||||||
updateDropdownsState(checked)
|
|
||||||
}
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
|
||||||
.setTitle(item.title)
|
|
||||||
.setView(binding.root)
|
|
||||||
.create()
|
|
||||||
|
|
||||||
// Setup button listeners
|
|
||||||
binding.btnDefault.setOnClickListener {
|
|
||||||
// Reset to defaults
|
|
||||||
item.reset()
|
|
||||||
// Refresh values with adapters reset
|
|
||||||
val textureSizeIndex = textureSizeValues.indexOf(item.getTextureSize())
|
|
||||||
if (textureSizeIndex >= 0) {
|
|
||||||
binding.dropdownTextureSize.setText(textureSizeEntries[textureSizeIndex], false)
|
|
||||||
}
|
|
||||||
val streamSizeIndex = streamSizeValues.indexOf(item.getStreamSize())
|
|
||||||
if (streamSizeIndex >= 0) {
|
|
||||||
binding.dropdownStreamSize.setText(streamSizeEntries[streamSizeIndex], false)
|
|
||||||
}
|
|
||||||
val chunkSizeIndex = chunkSizeValues.indexOf(item.getChunkSize())
|
|
||||||
if (chunkSizeIndex >= 0) {
|
|
||||||
binding.dropdownChunkSize.setText(chunkSizeEntries[chunkSizeIndex], false)
|
|
||||||
}
|
|
||||||
// Clear filters
|
|
||||||
textureSizeAdapter.filter.filter(null)
|
|
||||||
streamSizeAdapter.filter.filter(null)
|
|
||||||
chunkSizeAdapter.filter.filter(null)
|
|
||||||
|
|
||||||
settingsViewModel.setAdapterItemChanged(position)
|
|
||||||
settingsViewModel.setShouldReloadSettingsList(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.btnCancel.setOnClickListener {
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.btnOk.setOnClickListener {
|
|
||||||
if (binding.switchEnable.isChecked) {
|
|
||||||
item.enable()
|
|
||||||
// Save the selected values
|
|
||||||
val selectedTextureIndex = textureSizeEntries.indexOf(
|
|
||||||
binding.dropdownTextureSize.text.toString()
|
|
||||||
)
|
|
||||||
if (selectedTextureIndex >= 0) {
|
|
||||||
item.setTextureSize(textureSizeValues[selectedTextureIndex])
|
|
||||||
}
|
|
||||||
|
|
||||||
val selectedStreamIndex = streamSizeEntries.indexOf(
|
|
||||||
binding.dropdownStreamSize.text.toString()
|
|
||||||
)
|
|
||||||
if (selectedStreamIndex >= 0) {
|
|
||||||
item.setStreamSize(streamSizeValues[selectedStreamIndex])
|
|
||||||
}
|
|
||||||
|
|
||||||
val selectedChunkIndex = chunkSizeEntries.indexOf(
|
|
||||||
binding.dropdownChunkSize.text.toString()
|
|
||||||
)
|
|
||||||
if (selectedChunkIndex >= 0) {
|
|
||||||
item.setChunkSize(chunkSizeValues[selectedChunkIndex])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Disable GPU unswizzle
|
|
||||||
item.disable()
|
|
||||||
}
|
|
||||||
|
|
||||||
settingsViewModel.setAdapterItemChanged(position)
|
|
||||||
settingsViewModel.setShouldReloadSettingsList(true)
|
|
||||||
dialog.dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ensure filters are cleared after dialog is shown
|
|
||||||
binding.root.post {
|
|
||||||
textureSizeAdapter.filter.filter(null)
|
|
||||||
streamSizeAdapter.filter.filter(null)
|
|
||||||
chunkSizeAdapter.filter.filter(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateDropdownsState(enabled: Boolean) {
|
|
||||||
binding.layoutTextureSize.isEnabled = enabled
|
|
||||||
binding.dropdownTextureSize.isEnabled = enabled
|
|
||||||
binding.layoutStreamSize.isEnabled = enabled
|
|
||||||
binding.dropdownStreamSize.isEnabled = enabled
|
|
||||||
binding.layoutChunkSize.isEnabled = enabled
|
|
||||||
binding.dropdownChunkSize.isEnabled = enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val TAG = "GpuUnswizzleDialogFragment"
|
|
||||||
const val POSITION = "Position"
|
|
||||||
|
|
||||||
fun newInstance(
|
|
||||||
settingsViewModel: SettingsViewModel,
|
|
||||||
item: GpuUnswizzleSetting,
|
|
||||||
position: Int
|
|
||||||
): GpuUnswizzleDialogFragment {
|
|
||||||
val dialog = GpuUnswizzleDialogFragment()
|
|
||||||
val args = Bundle()
|
|
||||||
args.putInt(POSITION, position)
|
|
||||||
dialog.arguments = args
|
|
||||||
settingsViewModel.clickedItem = item
|
|
||||||
return dialog
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-12
@@ -106,10 +106,6 @@ class SettingsAdapter(
|
|||||||
PathViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
PathViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsItem.TYPE_GPU_UNSWIZZLE -> {
|
|
||||||
GpuUnswizzleViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsItem.TYPE_FX_TOOLBAR -> {
|
SettingsItem.TYPE_FX_TOOLBAR -> {
|
||||||
FxToolbarViewHolder(
|
FxToolbarViewHolder(
|
||||||
ListItemSettingFxToolbarBinding.inflate(inflater, parent, false),
|
ListItemSettingFxToolbarBinding.inflate(inflater, parent, false),
|
||||||
@@ -511,14 +507,6 @@ class SettingsAdapter(
|
|||||||
settingsViewModel.setShouldShowPathResetDialog(true)
|
settingsViewModel.setShouldShowPathResetDialog(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onGpuUnswizzleClick(item: GpuUnswizzleSetting, position: Int) {
|
|
||||||
GpuUnswizzleDialogFragment.newInstance(
|
|
||||||
settingsViewModel,
|
|
||||||
item,
|
|
||||||
position
|
|
||||||
).show(fragment.childFragmentManager, GpuUnswizzleDialogFragment.TAG)
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DiffCallback : DiffUtil.ItemCallback<SettingsItem>() {
|
private class DiffCallback : DiffUtil.ItemCallback<SettingsItem>() {
|
||||||
override fun areItemsTheSame(oldItem: SettingsItem, newItem: SettingsItem): Boolean {
|
override fun areItemsTheSame(oldItem: SettingsItem, newItem: SettingsItem): Boolean {
|
||||||
return oldItem.setting.key == newItem.setting.key
|
return oldItem.setting.key == newItem.setting.key
|
||||||
|
|||||||
+4
-4
@@ -124,7 +124,6 @@ class SettingsFragmentPresenter(
|
|||||||
) {
|
) {
|
||||||
add(IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key)
|
add(IntSetting.RENDERER_FRAME_GEN_FLOW_SCALE.key)
|
||||||
}
|
}
|
||||||
add(BooleanSetting.RENDERER_FRAME_GEN_FP16.key)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,11 +545,14 @@ class SettingsFragmentPresenter(
|
|||||||
add(IntSetting.RENDERER_NVDEC_EMULATION.key)
|
add(IntSetting.RENDERER_NVDEC_EMULATION.key)
|
||||||
|
|
||||||
add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key)
|
add(BooleanSetting.SYNC_MEMORY_OPERATIONS.key)
|
||||||
|
add(BooleanSetting.STALL_ON_GPU_FENCE_WAIT.key)
|
||||||
add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
|
add(BooleanSetting.RENDERER_USE_DISK_SHADER_CACHE.key)
|
||||||
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
add(BooleanSetting.RENDERER_FORCE_MAX_CLOCK.key)
|
||||||
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
add(BooleanSetting.RENDERER_REACTIVE_FLUSHING.key)
|
||||||
|
add(BooleanSetting.RENDERER_BARRIER_FEEDBACK_LOOPS.key)
|
||||||
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
add(BooleanSetting.ENABLE_BUFFER_HISTORY.key)
|
||||||
add(BooleanSetting.ENABLE_GPU_BUFFER_READBACK.key)
|
add(BooleanSetting.ENABLE_GPU_BUFFER_READBACK.key)
|
||||||
|
add(BooleanSetting.USE_UNIFIED_MEMORY.key)
|
||||||
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
add(BooleanSetting.USE_OPTIMIZED_VERTEX_BUFFERS.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.hacks))
|
add(HeaderSetting(R.string.hacks))
|
||||||
@@ -561,8 +563,6 @@ class SettingsFragmentPresenter(
|
|||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||||
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key)
|
|
||||||
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
|
||||||
|
|
||||||
add(HeaderSetting(R.string.extensions))
|
add(HeaderSetting(R.string.extensions))
|
||||||
|
|
||||||
@@ -1528,6 +1528,7 @@ class SettingsFragmentPresenter(
|
|||||||
add(HeaderSetting(R.string.cpu))
|
add(HeaderSetting(R.string.cpu))
|
||||||
|
|
||||||
add(IntSetting.CPU_BACKEND.key)
|
add(IntSetting.CPU_BACKEND.key)
|
||||||
|
add(BooleanSetting.RELOCATE_36BIT_ADDRESS_SPACE.key)
|
||||||
add(IntSetting.CPU_ACCURACY.key)
|
add(IntSetting.CPU_ACCURACY.key)
|
||||||
add(BooleanSetting.USE_AUTO_STUB.key)
|
add(BooleanSetting.USE_AUTO_STUB.key)
|
||||||
add(SettingsItem.FASTMEM_COMBINED)
|
add(SettingsItem.FASTMEM_COMBINED)
|
||||||
@@ -1553,7 +1554,6 @@ class SettingsFragmentPresenter(
|
|||||||
add(BooleanSetting.DUMP_GUEST_SHADERS.key)
|
add(BooleanSetting.DUMP_GUEST_SHADERS.key)
|
||||||
add(BooleanSetting.GPU_LOG_SHADER_DUMPS.key)
|
add(BooleanSetting.GPU_LOG_SHADER_DUMPS.key)
|
||||||
add(BooleanSetting.DUMP_MACROS.key)
|
add(BooleanSetting.DUMP_MACROS.key)
|
||||||
add(BooleanSetting.RENDERER_FRAME_GEN_DUMP_FLOW.key)
|
|
||||||
add(BooleanSetting.GPU_LOG_MEMORY_TRACKING.key)
|
add(BooleanSetting.GPU_LOG_MEMORY_TRACKING.key)
|
||||||
add(BooleanSetting.GPU_LOG_DRIVER_DEBUG.key)
|
add(BooleanSetting.GPU_LOG_DRIVER_DEBUG.key)
|
||||||
add(IntSetting.GPU_LOG_RING_BUFFER_SIZE.key)
|
add(IntSetting.GPU_LOG_RING_BUFFER_SIZE.key)
|
||||||
|
|||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
|
||||||
|
|
||||||
import android.view.View
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.GpuUnswizzleSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
|
|
||||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
|
|
||||||
|
|
||||||
class GpuUnswizzleViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
|
|
||||||
SettingViewHolder(binding.root, adapter) {
|
|
||||||
private lateinit var setting: GpuUnswizzleSetting
|
|
||||||
|
|
||||||
override fun bind(item: SettingsItem) {
|
|
||||||
setting = item as GpuUnswizzleSetting
|
|
||||||
binding.textSettingName.text = setting.title
|
|
||||||
binding.textSettingDescription.setVisible(item.description.isNotEmpty())
|
|
||||||
binding.textSettingDescription.text = item.description
|
|
||||||
|
|
||||||
binding.textSettingValue.setVisible(true)
|
|
||||||
val resMgr = binding.root.context.resources
|
|
||||||
|
|
||||||
if (setting.isEnabled()) {
|
|
||||||
// Show a summary of current settings
|
|
||||||
val textureSizeEntries = resMgr.getStringArray(setting.textureSizeChoicesId)
|
|
||||||
val textureSizeValues = resMgr.getIntArray(setting.textureSizeValuesId)
|
|
||||||
val textureSizeIndex = textureSizeValues.indexOf(setting.getTextureSize())
|
|
||||||
val textureSizeLabel = if (textureSizeIndex >= 0) textureSizeEntries[textureSizeIndex] else "?"
|
|
||||||
|
|
||||||
val streamSizeEntries = resMgr.getStringArray(setting.streamSizeChoicesId)
|
|
||||||
val streamSizeValues = resMgr.getIntArray(setting.streamSizeValuesId)
|
|
||||||
val streamSizeIndex = streamSizeValues.indexOf(setting.getStreamSize())
|
|
||||||
val streamSizeLabel = if (streamSizeIndex >= 0) streamSizeEntries[streamSizeIndex] else "?"
|
|
||||||
|
|
||||||
val chunkSizeEntries = resMgr.getStringArray(setting.chunkSizeChoicesId)
|
|
||||||
val chunkSizeValues = resMgr.getIntArray(setting.chunkSizeValuesId)
|
|
||||||
val chunkSizeIndex = chunkSizeValues.indexOf(setting.getChunkSize())
|
|
||||||
val chunkSizeLabel = if (chunkSizeIndex >= 0) chunkSizeEntries[chunkSizeIndex] else "?"
|
|
||||||
|
|
||||||
binding.textSettingValue.text = "$textureSizeLabel ⋅ $streamSizeLabel ⋅ $chunkSizeLabel"
|
|
||||||
} else {
|
|
||||||
binding.textSettingValue.text = resMgr.getString(R.string.gpu_unswizzle_disabled)
|
|
||||||
}
|
|
||||||
|
|
||||||
binding.buttonClear.setVisible(setting.clearable)
|
|
||||||
binding.buttonClear.setOnClickListener {
|
|
||||||
adapter.onClearClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
|
|
||||||
setStyle(setting.isEditable, binding)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onClick(clicked: View) {
|
|
||||||
if (!setting.isEditable) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
adapter.onGpuUnswizzleClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onLongClick(clicked: View): Boolean {
|
|
||||||
if (setting.isEditable) {
|
|
||||||
return adapter.onLongClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -92,6 +92,7 @@ import org.yuzu.yuzu_emu.utils.GameIconUtils
|
|||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.utils.InputHandler
|
import org.yuzu.yuzu_emu.utils.InputHandler
|
||||||
import org.yuzu.yuzu_emu.utils.Log
|
import org.yuzu.yuzu_emu.utils.Log
|
||||||
|
import org.yuzu.yuzu_emu.utils.LosslessScalingHelper
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig
|
import org.yuzu.yuzu_emu.utils.NativeFreedrenoConfig
|
||||||
import org.yuzu.yuzu_emu.utils.NativePostProcessing
|
import org.yuzu.yuzu_emu.utils.NativePostProcessing
|
||||||
@@ -1188,6 +1189,11 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
|||||||
|
|
||||||
quickSettings.addDivider(container)
|
quickSettings.addDivider(container)
|
||||||
|
|
||||||
|
if (LosslessScalingHelper.isInstalled() && LosslessScalingHelper.isSupportedByGpu()) {
|
||||||
|
quickSettings.addFrameGen(container)
|
||||||
|
quickSettings.addDivider(container)
|
||||||
|
}
|
||||||
|
|
||||||
quickSettings.addIntSetting(
|
quickSettings.addIntSetting(
|
||||||
R.string.renderer_accuracy,
|
R.string.renderer_accuracy,
|
||||||
container,
|
container,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
@@ -37,7 +37,7 @@ class Game(
|
|||||||
|
|
||||||
val settingsName: String
|
val settingsName: String
|
||||||
get() {
|
get() {
|
||||||
val programIdLong = programId.toLong()
|
val programIdLong = programId.toLongOrNull() ?: 0L
|
||||||
return if (programIdLong == 0L) {
|
return if (programIdLong == 0L) {
|
||||||
FileUtil.getFilename(Uri.parse(path))
|
FileUtil.getFilename(Uri.parse(path))
|
||||||
} else {
|
} else {
|
||||||
@@ -47,7 +47,7 @@ class Game(
|
|||||||
|
|
||||||
val programIdHex: String
|
val programIdHex: String
|
||||||
get() {
|
get() {
|
||||||
val programIdLong = programId.toLong()
|
val programIdLong = programId.toLongOrNull() ?: 0L
|
||||||
return if (programIdLong == 0L) {
|
return if (programIdLong == 0L) {
|
||||||
"0"
|
"0"
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
|||||||
@@ -64,8 +64,8 @@ void EmuWindow_Android::OnTouchReleased(int id) {
|
|||||||
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchReleased(id);
|
EmulationSession::GetInstance().GetInputSubsystem().GetTouchScreen()->TouchReleased(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuWindow_Android::OnFrameDisplayed() {
|
void EmuWindow_Android::OnFrameDisplayed(u32 presented_frames) {
|
||||||
UpdateObservedFrameRate();
|
UpdateObservedFrameRate(presented_frames);
|
||||||
UpdateFrameRateHint();
|
UpdateFrameRateHint();
|
||||||
|
|
||||||
if (!m_first_frame) {
|
if (!m_first_frame) {
|
||||||
@@ -75,15 +75,16 @@ void EmuWindow_Android::OnFrameDisplayed() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EmuWindow_Android::UpdateObservedFrameRate() {
|
void EmuWindow_Android::UpdateObservedFrameRate(u32 presented_frames) {
|
||||||
|
m_presented_frames = static_cast<float>((std::max)(presented_frames, 1u));
|
||||||
const auto now = Clock::now();
|
const auto now = Clock::now();
|
||||||
if (m_last_frame_display_time.time_since_epoch().count() != 0) {
|
if (m_last_frame_display_time.time_since_epoch().count() != 0) {
|
||||||
const auto frame_time = std::chrono::duration<float>(now - m_last_frame_display_time);
|
const auto frame_time = std::chrono::duration<float>(now - m_last_frame_display_time);
|
||||||
const float seconds = frame_time.count();
|
const float seconds = frame_time.count();
|
||||||
if (seconds > 0.0f) {
|
if (seconds > 0.0f) {
|
||||||
const float instantaneous_rate = 1.0f / seconds;
|
const float instantaneous_rate = m_presented_frames / seconds;
|
||||||
if (std::isfinite(instantaneous_rate) && instantaneous_rate >= 1.0f &&
|
if (std::isfinite(instantaneous_rate) && instantaneous_rate >= 1.0f &&
|
||||||
instantaneous_rate <= 240.0f) {
|
instantaneous_rate <= 240.0f * m_presented_frames) {
|
||||||
constexpr float SmoothingFactor = 0.15f;
|
constexpr float SmoothingFactor = 0.15f;
|
||||||
if (m_smoothed_present_rate <= 0.0f) {
|
if (m_smoothed_present_rate <= 0.0f) {
|
||||||
m_smoothed_present_rate = instantaneous_rate;
|
m_smoothed_present_rate = instantaneous_rate;
|
||||||
@@ -124,18 +125,9 @@ float EmuWindow_Android::GetFrameTimeVerifiedHint() const {
|
|||||||
return QuantizeFrameRateHint(verified_rate);
|
return QuantizeFrameRateHint(verified_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
float EmuWindow_Android::GetPresentedFrameMultiplier() {
|
|
||||||
if (!Settings::values.frame_gen.GetValue()) {
|
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
return static_cast<float>(std::clamp<u32>(Settings::values.frame_gen_multiplier.GetValue(), 2, 4));
|
|
||||||
}
|
|
||||||
|
|
||||||
float EmuWindow_Android::GetFrameRateHint() const {
|
float EmuWindow_Android::GetFrameRateHint() const {
|
||||||
const float presented_multiplier = GetPresentedFrameMultiplier();
|
const float observed_rate = std::clamp(m_smoothed_present_rate, 0.0f, 240.0f);
|
||||||
const float observed_rate =
|
const float frame_time_verified_hint = GetFrameTimeVerifiedHint() * m_presented_frames;
|
||||||
std::clamp(m_smoothed_present_rate * presented_multiplier, 0.0f, 240.0f);
|
|
||||||
const float frame_time_verified_hint = GetFrameTimeVerifiedHint() * presented_multiplier;
|
|
||||||
|
|
||||||
if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) {
|
if (m_last_frame_rate_hint > 0.0f && observed_rate > 0.0f) {
|
||||||
const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f);
|
const float tolerance = std::max(m_last_frame_rate_hint * 0.12f, 4.0f);
|
||||||
@@ -159,7 +151,7 @@ float EmuWindow_Android::GetFrameRateHint() const {
|
|||||||
return frame_time_verified_hint;
|
return frame_time_verified_hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
const float nominal_rate = 60.0f * presented_multiplier;
|
const float nominal_rate = 60.0f * m_presented_frames;
|
||||||
if (!Settings::values.use_speed_limit.GetValue()) {
|
if (!Settings::values.use_speed_limit.GetValue()) {
|
||||||
return QuantizeFrameRateHint(nominal_rate);
|
return QuantizeFrameRateHint(nominal_rate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public:
|
|||||||
~EmuWindow_Android() = default;
|
~EmuWindow_Android() = default;
|
||||||
|
|
||||||
void OnSurfaceChanged(ANativeWindow* surface);
|
void OnSurfaceChanged(ANativeWindow* surface);
|
||||||
void OnFrameDisplayed() override;
|
void OnFrameDisplayed(u32 presented_frames) override;
|
||||||
|
|
||||||
void OnTouchPressed(int id, float x, float y);
|
void OnTouchPressed(int id, float x, float y);
|
||||||
void OnTouchMoved(int id, float x, float y);
|
void OnTouchMoved(int id, float x, float y);
|
||||||
@@ -58,10 +58,9 @@ private:
|
|||||||
using Clock = std::chrono::steady_clock;
|
using Clock = std::chrono::steady_clock;
|
||||||
|
|
||||||
void UpdateFrameRateHint();
|
void UpdateFrameRateHint();
|
||||||
void UpdateObservedFrameRate();
|
void UpdateObservedFrameRate(u32 presented_frames);
|
||||||
[[nodiscard]] float GetFrameRateHint() const;
|
[[nodiscard]] float GetFrameRateHint() const;
|
||||||
[[nodiscard]] float GetFrameTimeVerifiedHint() const;
|
[[nodiscard]] float GetFrameTimeVerifiedHint() const;
|
||||||
[[nodiscard]] static float GetPresentedFrameMultiplier();
|
|
||||||
[[nodiscard]] static float QuantizeFrameRateHint(float frame_rate);
|
[[nodiscard]] static float QuantizeFrameRateHint(float frame_rate);
|
||||||
|
|
||||||
float m_window_width{};
|
float m_window_width{};
|
||||||
@@ -73,6 +72,7 @@ private:
|
|||||||
float m_last_frame_rate_hint = -1.0f;
|
float m_last_frame_rate_hint = -1.0f;
|
||||||
float m_pending_frame_rate_hint = -1.0f;
|
float m_pending_frame_rate_hint = -1.0f;
|
||||||
float m_smoothed_present_rate = 0.0f;
|
float m_smoothed_present_rate = 0.0f;
|
||||||
|
float m_presented_frames = 1.0f;
|
||||||
Clock::time_point m_last_frame_display_time{};
|
Clock::time_point m_last_frame_display_time{};
|
||||||
Clock::time_point m_pending_frame_rate_since{};
|
Clock::time_point m_pending_frame_rate_since{};
|
||||||
std::uint32_t m_pending_frame_rate_hint_votes = 0;
|
std::uint32_t m_pending_frame_rate_hint_votes = 0;
|
||||||
|
|||||||
@@ -738,6 +738,35 @@ const char* fallback_cpu_detection() {
|
|||||||
return s_result.c_str();
|
return s_result.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ARCHITECTURE_arm64
|
||||||
|
struct SystemDriverInfo {
|
||||||
|
VkPhysicalDeviceProperties properties{};
|
||||||
|
VkPhysicalDeviceDriverProperties driver{};
|
||||||
|
};
|
||||||
|
|
||||||
|
SystemDriverInfo QuerySystemDriverInfo(JNIEnv* env, jstring j_hook_lib_dir) {
|
||||||
|
const std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir);
|
||||||
|
const Common::DynamicLibrary library{adrenotools_open_libvulkan(
|
||||||
|
RTLD_NOW, 0, nullptr, hook_lib_dir.c_str(), nullptr, nullptr, nullptr, nullptr)};
|
||||||
|
Vulkan::vk::InstanceDispatch dld;
|
||||||
|
const Vulkan::vk::Instance instance = Vulkan::CreateInstance(library, dld, VK_API_VERSION_1_1);
|
||||||
|
const std::vector<VkPhysicalDevice> devices = instance.EnumeratePhysicalDevices();
|
||||||
|
if (devices.empty()) {
|
||||||
|
throw Vulkan::vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
|
}
|
||||||
|
SystemDriverInfo info{};
|
||||||
|
info.driver.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
|
||||||
|
VkPhysicalDeviceProperties2 properties2{
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
|
||||||
|
.pNext = &info.driver,
|
||||||
|
.properties = {},
|
||||||
|
};
|
||||||
|
Vulkan::vk::PhysicalDevice(devices[0], dld).GetProperties2(properties2);
|
||||||
|
info.properties = properties2.properties;
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -857,34 +886,18 @@ jboolean JNICALL Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_supportsCustomDri
|
|||||||
|
|
||||||
jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
|
jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
|
||||||
JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
JNIEnv* env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
||||||
|
std::string version_string{"1.1.0"};
|
||||||
|
std::string driver_name{"generic"};
|
||||||
#ifdef ARCHITECTURE_arm64
|
#ifdef ARCHITECTURE_arm64
|
||||||
const char* file_redirect_dir_{};
|
try {
|
||||||
int featureFlags{};
|
const SystemDriverInfo info = QuerySystemDriverInfo(env, j_hook_lib_dir);
|
||||||
std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir);
|
const u32 driver_version = info.properties.driverVersion;
|
||||||
auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(),
|
version_string =
|
||||||
nullptr, nullptr, file_redirect_dir_, nullptr);
|
|
||||||
auto driver_library = std::make_shared<Common::DynamicLibrary>(handle);
|
|
||||||
InputCommon::InputSubsystem input_subsystem;
|
|
||||||
auto window =
|
|
||||||
std::make_unique<EmuWindow_Android>(ANativeWindow_fromSurface(env, j_surf), driver_library);
|
|
||||||
|
|
||||||
Vulkan::vk::InstanceDispatch dld;
|
|
||||||
Vulkan::vk::Instance vk_instance = Vulkan::CreateInstance(
|
|
||||||
*driver_library, dld, VK_API_VERSION_1_1, Core::Frontend::WindowSystemType::Android);
|
|
||||||
|
|
||||||
auto surface = Vulkan::CreateSurface(vk_instance, window->GetWindowInfo());
|
|
||||||
|
|
||||||
auto device = Vulkan::CreateDevice(vk_instance, dld, *surface);
|
|
||||||
|
|
||||||
auto driver_version = device.GetDriverVersion();
|
|
||||||
auto version_string =
|
|
||||||
fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version),
|
fmt::format("{}.{}.{}", VK_API_VERSION_MAJOR(driver_version),
|
||||||
VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version));
|
VK_API_VERSION_MINOR(driver_version), VK_API_VERSION_PATCH(driver_version));
|
||||||
auto driver_name = device.GetDriverName();
|
driver_name = Vulkan::vk::GetDriverName(info.driver);
|
||||||
#else
|
} catch (...) {
|
||||||
auto driver_version = "1.0.0";
|
}
|
||||||
auto version_string = "1.1.0"; //Assume lowest Vulkan level
|
|
||||||
auto driver_name = "generic";
|
|
||||||
#endif
|
#endif
|
||||||
jobjectArray j_driver_info = env->NewObjectArray(2, Common::Android::GetStringClass(), Common::Android::ToJString(env, version_string));
|
jobjectArray j_driver_info = env->NewObjectArray(2, Common::Android::GetStringClass(), Common::Android::ToJString(env, version_string));
|
||||||
env->SetObjectArrayElement(j_driver_info, 1, Common::Android::ToJString(env, driver_name));
|
env->SetObjectArrayElement(j_driver_info, 1, Common::Android::ToJString(env, driver_name));
|
||||||
@@ -893,32 +906,12 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getSystemDriverInfo(
|
|||||||
|
|
||||||
jstring Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getGpuModel(JNIEnv *env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
jstring Java_org_yuzu_yuzu_1emu_utils_GpuDriverHelper_getGpuModel(JNIEnv *env, jobject j_obj, jobject j_surf, jstring j_hook_lib_dir) {
|
||||||
#ifdef ARCHITECTURE_arm64
|
#ifdef ARCHITECTURE_arm64
|
||||||
const char* file_redirect_dir_{};
|
try {
|
||||||
int featureFlags{};
|
return Common::Android::ToJString(env, QuerySystemDriverInfo(env, j_hook_lib_dir).properties.deviceName);
|
||||||
std::string hook_lib_dir = Common::Android::GetJString(env, j_hook_lib_dir);
|
} catch (...) {
|
||||||
auto handle = adrenotools_open_libvulkan(RTLD_NOW, featureFlags, nullptr, hook_lib_dir.c_str(),
|
}
|
||||||
nullptr, nullptr, file_redirect_dir_, nullptr);
|
|
||||||
auto driver_library = std::make_shared<Common::DynamicLibrary>(handle);
|
|
||||||
InputCommon::InputSubsystem input_subsystem;
|
|
||||||
auto window =
|
|
||||||
std::make_unique<EmuWindow_Android>(ANativeWindow_fromSurface(env, j_surf), driver_library);
|
|
||||||
|
|
||||||
Vulkan::vk::InstanceDispatch dld;
|
|
||||||
Vulkan::vk::Instance vk_instance = Vulkan::CreateInstance(
|
|
||||||
*driver_library, dld, VK_API_VERSION_1_1, Core::Frontend::WindowSystemType::Android);
|
|
||||||
|
|
||||||
auto surface = Vulkan::CreateSurface(vk_instance, window->GetWindowInfo());
|
|
||||||
|
|
||||||
auto device = Vulkan::CreateDevice(vk_instance, dld, *surface);
|
|
||||||
|
|
||||||
const std::string model_name{device.GetModelName()};
|
|
||||||
|
|
||||||
window.release();
|
|
||||||
|
|
||||||
return Common::Android::ToJString(env, model_name);
|
|
||||||
#else
|
|
||||||
return Common::Android::ToJString(env, "no-info");
|
|
||||||
#endif
|
#endif
|
||||||
|
return Common::Android::ToJString(env, "no-info");
|
||||||
}
|
}
|
||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_reloadKeys(JNIEnv* env, jclass clazz) {
|
||||||
@@ -1168,7 +1161,7 @@ VkPhysicalDeviceProperties GetVulkanDeviceProperties() {
|
|||||||
return physical_device.GetProperties();
|
return physical_device.GetProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GetVulkanMemoryModelSupport() {
|
bool GetFrameGenerationSupport() {
|
||||||
Common::DynamicLibrary library;
|
Common::DynamicLibrary library;
|
||||||
if (!library.Open("libvulkan.so")) {
|
if (!library.Open("libvulkan.so")) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1183,9 +1176,13 @@ bool GetVulkanMemoryModelSupport() {
|
|||||||
|
|
||||||
const Vulkan::vk::PhysicalDevice physical_device(physical_devices[0], dld);
|
const Vulkan::vk::PhysicalDevice physical_device(physical_devices[0], dld);
|
||||||
|
|
||||||
|
VkPhysicalDeviceShaderFloat16Int8Features float16_int8{
|
||||||
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
|
||||||
|
.pNext = nullptr,
|
||||||
|
};
|
||||||
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model{
|
VkPhysicalDeviceVulkanMemoryModelFeatures memory_model{
|
||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
|
||||||
.pNext = nullptr,
|
.pNext = &float16_int8,
|
||||||
};
|
};
|
||||||
VkPhysicalDeviceFeatures2 features{
|
VkPhysicalDeviceFeatures2 features{
|
||||||
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
|
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
|
||||||
@@ -1193,7 +1190,7 @@ bool GetVulkanMemoryModelSupport() {
|
|||||||
};
|
};
|
||||||
physical_device.GetFeatures2(features);
|
physical_device.GetFeatures2(features);
|
||||||
|
|
||||||
return memory_model.vulkanMemoryModel == VK_TRUE;
|
return memory_model.vulkanMemoryModel == VK_TRUE && float16_int8.shaderFloat16 == VK_TRUE;
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@@ -1272,7 +1269,7 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_getVulkanApiVersion(JNIEnv* env, j
|
|||||||
|
|
||||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_supportsFrameGeneration(JNIEnv* env, jobject jobj) {
|
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_supportsFrameGeneration(JNIEnv* env, jobject jobj) {
|
||||||
try {
|
try {
|
||||||
return static_cast<jboolean>(GetVulkanMemoryModelSupport());
|
return static_cast<jboolean>(GetFrameGenerationSupport());
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
return static_cast<jboolean>(false);
|
return static_cast<jboolean>(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:color="?attr/colorOnPrimary" android:state_selected="true" />
|
||||||
|
<item android:color="?attr/colorOnSurface" />
|
||||||
|
</selector>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:color="?attr/colorControlHighlight">
|
||||||
|
|
||||||
|
<item android:id="@android:id/mask">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="@android:color/white" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<item>
|
||||||
|
<selector>
|
||||||
|
<item android:state_selected="true">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="?attr/colorPrimary" />
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<corners android:radius="8dp" />
|
||||||
|
<stroke
|
||||||
|
android:width="1dp"
|
||||||
|
android:color="?attr/colorOutline" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</ripple>
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:scrollbars="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="24dp">
|
|
||||||
|
|
||||||
<com.google.android.material.switchmaterial.SwitchMaterial
|
|
||||||
android:id="@+id/switch_enable"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
android:text="@string/gpu_unswizzle_enable" />
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
|
||||||
android:id="@+id/layout_texture_size"
|
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="12dp"
|
|
||||||
android:hint="@string/gpu_unswizzle_texture_size">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
|
||||||
android:id="@+id/dropdown_texture_size"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="none" />
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
|
||||||
android:id="@+id/layout_stream_size"
|
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="12dp"
|
|
||||||
android:hint="@string/gpu_unswizzle_stream_size">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
|
||||||
android:id="@+id/dropdown_stream_size"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="none" />
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
|
||||||
android:id="@+id/layout_chunk_size"
|
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:hint="@string/gpu_unswizzle_chunk_size">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.MaterialAutoCompleteTextView
|
|
||||||
android:id="@+id/dropdown_chunk_size"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="none" />
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="24dp"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:gravity="end"
|
|
||||||
android:spacing="8dp">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/btn_default"
|
|
||||||
style="@style/Widget.Material3.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/gpu_unswizzle_default_button" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/btn_cancel"
|
|
||||||
style="@style/Widget.Material3.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@android:string/cancel" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/btn_ok"
|
|
||||||
style="@style/Widget.Material3.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@android:string/ok" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="24dp"
|
||||||
|
android:paddingEnd="18dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="8dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleSmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodySmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen_quick_description"
|
||||||
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/frame_gen_multipliers"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/frame_gen_target_section"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="24dp"
|
||||||
|
android:paddingEnd="18dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="8dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleSmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen_target_rate" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodySmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen_target_rate_quick_description"
|
||||||
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/frame_gen_targets"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/frame_gen_flow_section"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:paddingStart="24dp"
|
||||||
|
android:paddingEnd="18dp"
|
||||||
|
android:paddingTop="12dp"
|
||||||
|
android:paddingBottom="8dp">
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.TitleSmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen_flow_scale" />
|
||||||
|
|
||||||
|
<com.google.android.material.textview.MaterialTextView
|
||||||
|
style="@style/TextAppearance.Material3.BodySmall"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="4dp"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:text="@string/frame_gen_flow_scale_quick_description"
|
||||||
|
android:textColor="?attr/colorOnSurfaceVariant" />
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/frame_gen_flow"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:orientation="horizontal" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<com.google.android.material.textview.MaterialTextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
style="@style/TextAppearance.Material3.LabelLarge"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:layout_marginEnd="6dp"
|
||||||
|
android:background="@drawable/frame_gen_cell_background"
|
||||||
|
android:clickable="true"
|
||||||
|
android:focusable="true"
|
||||||
|
android:gravity="center"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColor="@color/frame_gen_cell_text" />
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">سيشغل هذا البرنامج ألعاب جهاز Nintendo Switch. لا يتضمن البرنامج أي ألعاب أو مفاتيح.<br /><br />قبل أن تبدأ، يرجى تحديد موقع ملف <![CDATA[<b> prod.keys </b>]]> على وحدة تخزين جهازك.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">اعرف المزيد</a>]]></string>
|
<string name="app_disclaimer">سيعمل هذا البرنامج على تشغيل ألعاب منصة ألعاب «نينتندو سويتش». لا يتضمن البرنامج أي ألعاب أو مفاتيح تفعيل.<br /><br /> قبل البدء، يرجى تحديد موقع ملف <![CDATA[<b> prod.keys</b> ]]> في مساحة التخزين بجهازك.<br /><br /><![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">مزيد من المعلومات</a>]]></string>
|
||||||
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
|
<string name="notice_notification_channel_name">الإشعارات والأخطاء</string>
|
||||||
<string name="notice_notification_channel_description">عرض الإشعارات عند حدوث خطأ ما.</string>
|
<string name="notice_notification_channel_description">عرض الإشعارات عند حدوث خطأ ما.</string>
|
||||||
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار!</string>
|
<string name="notification_permission_not_granted">لم يتم منح إذن الإشعار!</string>
|
||||||
@@ -291,6 +291,25 @@
|
|||||||
<string name="gpu_driver_fetcher">أداة جلب برامج تشغيل وحدة المعالجة الرسومية</string>
|
<string name="gpu_driver_fetcher">أداة جلب برامج تشغيل وحدة المعالجة الرسومية</string>
|
||||||
<string name="gpu_driver_manager">إدارة برامج تشغيل وحدة معالجة الرسومات</string>
|
<string name="gpu_driver_manager">إدارة برامج تشغيل وحدة معالجة الرسومات</string>
|
||||||
<string name="install_gpu_driver_description">تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل</string>
|
<string name="install_gpu_driver_description">تثبيت برامج تشغيل بديلة لأداء أو دقة أفضل</string>
|
||||||
|
<string name="post_processing">تأثيرات ما بعد المعالجة</string>
|
||||||
|
<string name="post_processing_description">تأثيرات ReShade FX التي يتم تطبيقها بعد عملية العرض</string>
|
||||||
|
<string name="post_processing_per_game_description">ضبط تسلسل التأثيرات لهذه اللعبة</string>
|
||||||
|
<string name="post_processing_add">إضافة تأثير</string>
|
||||||
|
<string name="post_processing_remove">إزالة</string>
|
||||||
|
<string name="post_processing_open_list">فتح القائمة</string>
|
||||||
|
<string name="post_processing_close_list">إغلاق القائمة</string>
|
||||||
|
<string name="post_processing_remove_all">إزالة التأثيرات</string>
|
||||||
|
<string name="post_processing_preset_locked">الإعداد مسبقًا نشط. قم بتعديله في «تأثيرات ما بعد المعالجة» قبل بدء اللعبة.</string>
|
||||||
|
<string name="post_processing_preset_modified">تم تغيير القيم عن الإعداد الأصلي.</string>
|
||||||
|
<string name="post_processing_presets">الإعدادات المسبقة</string>
|
||||||
|
<string name="post_processing_preset_new">إعداد مسبق جديد</string>
|
||||||
|
<string name="post_processing_preset_new_description">يحفظ التأثيرات التي قمت بتحميلها، مع قيمها الحالية، كإعداد مسبق يمكنك اختياره لاحقًا.</string>
|
||||||
|
<string name="post_processing_preset_name_invalid">قم بتسمية الإعداد المسبق باسم لا يحتوي على علامة يساوي.</string>
|
||||||
|
<string name="post_processing_preset_none">لا يوجد إعداد مسبق</string>
|
||||||
|
<string name="post_processing_preset_delete">حذف الإعداد المسبق</string>
|
||||||
|
<string name="post_processing_preset_reset">إعادة تعيين القيم المحددة مسبقًا</string>
|
||||||
|
<string name="post_processing_reset">إعادة التعيين إلى الإعدادات الافتراضية</string>
|
||||||
|
<string name="post_processing_empty">لم يتم العثور على أي ملفات. ضع ملفات .fx في هذا المجلد:</string>
|
||||||
<string name="frame_gen">توليد الإطار</string>
|
<string name="frame_gen">توليد الإطار</string>
|
||||||
<string name="frame_gen_per_game_description">ضبط إعدادات إنشاء الإطارات لهذه اللعبة</string>
|
<string name="frame_gen_per_game_description">ضبط إعدادات إنشاء الإطارات لهذه اللعبة</string>
|
||||||
<string name="frame_gen_description">قم بإدراج الإطارات المُستكملة بين الإطارات المُعالجة باستخدام تقنية التحجيم بدون فقدان الجودة. يُفرض هذا الخيار عرض الإطارات وفقًا لترتيب FIFO عند تفعيله.</string>
|
<string name="frame_gen_description">قم بإدراج الإطارات المُستكملة بين الإطارات المُعالجة باستخدام تقنية التحجيم بدون فقدان الجودة. يُفرض هذا الخيار عرض الإطارات وفقًا لترتيب FIFO عند تفعيله.</string>
|
||||||
@@ -305,8 +324,13 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 إطارًا في الثانية</string>
|
<string name="frame_gen_target_rate_60">60 إطارًا في الثانية</string>
|
||||||
<string name="frame_gen_target_rate_90">90 إطارًا في الثانية</string>
|
<string name="frame_gen_target_rate_90">90 إطارًا في الثانية</string>
|
||||||
<string name="frame_gen_target_rate_120">120 إطارًا في الثانية</string>
|
<string name="frame_gen_target_rate_120">120 إطارًا في الثانية</string>
|
||||||
<string name="frame_gen_target_rate_144">144 إطارًا في الثانية</string>
|
<string name="frame_gen_on">تشغيل</string>
|
||||||
<string name="frame_gen_target_rate_165">165 إطارًا في الثانية</string>
|
<string name="frame_gen_off">إيقاف</string>
|
||||||
|
<string name="frame_gen_fixed">مستقر</string>
|
||||||
|
<string name="frame_gen_flow_auto">تلقائي</string>
|
||||||
|
<string name="frame_gen_quick_description">قم بتشغيل أو إيقاف توليد الإطارات واختر مضاعف الإطارات.</string>
|
||||||
|
<string name="frame_gen_target_rate_quick_description">توليد إطارات بمعدل إطارات مستهدف. ويتم ضبط المضاعف تلقائيًا.</string>
|
||||||
|
<string name="frame_gen_flow_scale_quick_description">الدقة المستخدمة لتقدير الحركة بين الإطارات. تقلل القيم المنخفضة من الوقت الذي تستهلكه وحدة معالجة الرسومات.</string>
|
||||||
<string name="frame_gen_queue_target">هدف قائمة انتظار الإطارات</string>
|
<string name="frame_gen_queue_target">هدف قائمة انتظار الإطارات</string>
|
||||||
<string name="frame_gen_queue_target_description">كم عدد الإطارات المكتملة التي قد تنتظر قبل عرضها؟ تعمل قوائم الانتظار الأكبر حجمًا على امتصاص الارتفاعات المفاجئة في حمل وحدة معالجة الرسومات على حساب زمن انتقال الإدخال.</string>
|
<string name="frame_gen_queue_target_description">كم عدد الإطارات المكتملة التي قد تنتظر قبل عرضها؟ تعمل قوائم الانتظار الأكبر حجمًا على امتصاص الارتفاعات المفاجئة في حمل وحدة معالجة الرسومات على حساب زمن انتقال الإدخال.</string>
|
||||||
<string name="frame_gen_queue_target_0">أقل زمن انتقال (بدون تخزين مؤقت)</string>
|
<string name="frame_gen_queue_target_0">أقل زمن انتقال (بدون تخزين مؤقت)</string>
|
||||||
@@ -316,19 +340,15 @@
|
|||||||
<string name="frame_gen_flow_scale_auto_description">قم بتقدير الحركة بناءً على الدقة التي تعرضها اللعبة فعليًّا، بدلاً من الإخراج الذي تم رفع دقته. ولا يؤثر ذلك على الدقة بأي شكل، لأن رفع الدقة لا يضيف أي تفاصيل تتعلق بالحركة.</string>
|
<string name="frame_gen_flow_scale_auto_description">قم بتقدير الحركة بناءً على الدقة التي تعرضها اللعبة فعليًّا، بدلاً من الإخراج الذي تم رفع دقته. ولا يؤثر ذلك على الدقة بأي شكل، لأن رفع الدقة لا يضيف أي تفاصيل تتعلق بالحركة.</string>
|
||||||
<string name="frame_gen_flow_scale">دقة تقدير الحركة</string>
|
<string name="frame_gen_flow_scale">دقة تقدير الحركة</string>
|
||||||
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
||||||
<string name="frame_gen_fp16">مُظلِّلات نصف الدقة</string>
|
|
||||||
<string name="frame_gen_fp16_description">استخدم نسخة التظليل 16 بت. يتم التراجع تلقائيًا إلى الخيار البديل في حالة عدم توفرها في برنامج التشغيل أو الملف.</string>
|
|
||||||
<string name="frame_gen_dump_flow">إفراغ الإطار الذي تم إنشاؤه</string>
|
|
||||||
<string name="frame_gen_dump_flow_description">قم بكتابة مستويات MIP للتدفق البصري والإطار المُستكمل إلى مجلد lossless/debug مرة واحدة، لغرض استكشاف الأخطاء وإصلاحها</string>
|
|
||||||
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
||||||
<string name="frame_gen_unsupported_description">لا يدعم برنامج تشغيل وحدة معالجة الرسومات هذا نموذج ذاكرة Vulkan، الذي تتطلبه برامج التظليل الخاصة بـ«Lossless Scaling».</string>
|
<string name="frame_gen_unsupported_description">يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling».</string>
|
||||||
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا</string>
|
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا</string>
|
||||||
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
||||||
<string name="frame_generation_support">توليد الإطارات</string>
|
<string name="frame_generation_support">توليد الإطارات</string>
|
||||||
<string name="frame_generation_supported">مدعوم</string>
|
<string name="frame_generation_supported">مدعوم</string>
|
||||||
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan)</string>
|
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16)</string>
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات</string>
|
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات</string>
|
||||||
<string name="lossless_scaling_installed">مثبت</string>
|
<string name="lossless_scaling_installed">مثبت</string>
|
||||||
@@ -554,8 +574,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
||||||
<string name="renderer_async_presentation">عرض غير متزامن</string>
|
|
||||||
<string name="renderer_async_presentation_description">يمكن لهذه الحيلة أن تزيد من الأداء عن طريق نقل عملية العرض إلى خيط معالجة منفصل على حساب مشاكل الرسوميات.</string>
|
|
||||||
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||||
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
||||||
<string name="enable_buffer_history">تمكين سجل التخزين المؤقت</string>
|
<string name="enable_buffer_history">تمكين سجل التخزين المؤقت</string>
|
||||||
@@ -579,17 +597,6 @@
|
|||||||
<string name="rescale_hack_description">يُمكّن هذا الخيار من التعامل مع عملية إعادة تحجيم الألعاب بطريقة تقليدية باستخدام مسار إعادة التحجيم السريع</string>
|
<string name="rescale_hack_description">يُمكّن هذا الخيار من التعامل مع عملية إعادة تحجيم الألعاب بطريقة تقليدية باستخدام مسار إعادة التحجيم السريع</string>
|
||||||
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
|
<string name="renderer_asynchronous_shaders">استخدم تظليل غير متزامن</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">يقوم بتجميع التظليل بشكل غير متزامن. قد يقلل ذلك من التقطعات ولكنه قد يؤدي أيضًا إلى حدوث أخطاء.</string>
|
<string name="renderer_asynchronous_shaders_description">يقوم بتجميع التظليل بشكل غير متزامن. قد يقلل ذلك من التقطعات ولكنه قد يؤدي أيضًا إلى حدوث أخطاء.</string>
|
||||||
<string name="gpu_unswizzle_settings">إعدادات إلغاء ترتيب بيانات وحدة معالجة الرسومات</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">قم بضبط معلمات فكّ تشابك النسيج المستندة إلى وحدة معالجة الرسومات أو تعطيلها تمامًا. اضبط هذه الإعدادات لتحقيق التوازن بين الأداء وجودة تحميل النسيج.</string>
|
|
||||||
<string name="gpu_unswizzle_enable">تفعيل إلغاء ترتيب بيانات وحدة معالجة الرسومات</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">تعطيل</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">الحد الأقصى لحجم النسيج في وحدة معالجة الرسومات بعد إعادة ترتيب البيانات</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">يُحدد هذا الخيار الحد الأقصى لحجم (ميغابايت) معالجة الصور باستخدام وحدة معالجة الرسومات. مع أن وحدة معالجة الرسومات أسرع في معالجة الصور المتوسطة والكبيرة، إلا أن وحدة المعالجة المركزية قد تكون أكثر كفاءة في معالجة الصور الصغيرة جدًا. اضبط هذا الخيار لتحقيق التوازن الأمثل بين سرعة معالجة الرسومات واستهلاك وحدة المعالجة المركزية.</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">حجم تدفق إلغاء ترتيب بيانات وحدة معالجة الرسومات</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">يحدد هذا الخيار حد البيانات لكل إطار لمعالجة الصور الكبيرة. القيم الأعلى تُسرّع تحميل الصور على حساب زيادة زمن استجابة الإطارات؛ أما القيم الأقل فتُقلل من الحمل الزائد على وحدة معالجة الرسومات، ولكنها قد تتسبب في ظهور الصور بشكل مفاجئ.</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">حجم كتلة إلغاء ترتيب بيانات وحدة معالجة الرسومات</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">يُحدد هذا الخيار عدد شرائح العمق التي تتم معالجتها لكل دفعة من الصور ثلاثية الأبعاد (3D). زيادة هذا العدد تُحسّن كفاءة الإنتاجية على وحدات معالجة الرسومات القوية، ولكنها قد تُسبب تقطعًا أو انقطاعًا في عمل برنامج التشغيل على الأجهزة ذات المواصفات الأقل قوة.</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">افتراضي</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">إضافات</string>
|
<string name="extensions">إضافات</string>
|
||||||
@@ -918,7 +925,7 @@
|
|||||||
<string name="loader_error_file_not_found">ملف ROM غير موجود</string>
|
<string name="loader_error_file_not_found">ملف ROM غير موجود</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">اللعبة تتطلب الفيرموير</string>
|
<string name="loader_requires_firmware">اللعبة تتطلب الفيرموير</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[اللعبة التي تحاول تشغيلها تتطلب الفيرموير للتمهيد أو لتجاوز القائمة الافتتاحية. يرجى <a href=\"https://yuzu-mirror.github.io/help/quickstart\">نسخ وتثبيت الفيرموير</a>، أو اضغط \"موافق\" للمتابعة على أي حال.]]></string>
|
<string name="loader_requires_firmware_description"><![CDATA[قد تتطلب هذه اللعبة برنامجاً ثابتاً لتعمل بشكل صحيح، ولم يتم تثبيت أي منها لديك. يرجى تثبيت البرنامج الثابت قبل التشغيل، أو الضغط على \"موافق\" للتشغيل على أية حال.]]></string>
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">جارٍ البحث عن اللعبة...</string>
|
<string name="searching_for_game">جارٍ البحث عن اللعبة...</string>
|
||||||
@@ -1030,25 +1037,10 @@
|
|||||||
<string name="fast_gpu_high">كسر السرعة</string>
|
<string name="fast_gpu_high">كسر السرعة</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">صغير جدًا (16 ميغابايت)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">صغير (32 ميغابايت)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">قياسي (128 ميغابايت)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">كبير (256 ميغابايت)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">كبير جدًا (512 ميغابايت)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">منخفض جدًا (4 ميغابايت)</string>
|
|
||||||
<string name="gpu_swizzle_low">منخفض (8 ميغابايت)</string>
|
|
||||||
<string name="gpu_swizzle_normal">قياسي (16 ميغابايت)</string>
|
|
||||||
<string name="gpu_swizzle_medium">متوسط (32 ميغابايت)</string>
|
|
||||||
<string name="gpu_swizzle_high">عالي (64 ميغابايت)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">منخفض جدًا (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">منخفض (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">قياسي (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">متوسط (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">عالي (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">مئوية</string>
|
<string name="temperature_celsius">مئوية</string>
|
||||||
|
|||||||
@@ -474,8 +474,6 @@
|
|||||||
<string name="loader_error_file_not_found">فایلی ڕۆم بوونی نییە</string>
|
<string name="loader_error_file_not_found">فایلی ڕۆم بوونی نییە</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">یارییەکە فریموێر پێویستە</string>
|
<string name="loader_requires_firmware">یارییەکە فریموێر پێویستە</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[یارییەکە کە تۆ هەوڵ دەدەیت بیخەیتە کار فریموێر پێویستە بۆ کردنەوە یان تێپەڕاندنی مێنیوی کردنەوە. تکایە <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> فریموێر دامپ بکە و دابنێ</a>, یان پەنجە بنێ سەر \"باشە\" بۆ بەردەوامبوون هەرچۆنێک بێت.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">گەڕان بە دوای یارییە...</string>
|
<string name="searching_for_game">گەڕان بە دوای یارییە...</string>
|
||||||
<string name="game_not_found_for_title_id">یاری نەدۆزرایەوە بۆ ناسنامەی ناونیشان: %1$s</string>
|
<string name="game_not_found_for_title_id">یاری نەدۆزرایەوە بۆ ناسنامەی ناونیشان: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Tento software umožňuje spouštět hry pro herní konzoli Nintendo Switch. Neobsahuje žádné herní tituly ani klíče.<br /><br /> Nejdříve prosím vyhledejte soubor <![CDATA[<b> prod.keys </b>]]> v úložišti vašeho zařízení.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Další informace</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Upozornění a chyby</string>
|
<string name="notice_notification_channel_name">Upozornění a chyby</string>
|
||||||
<string name="notice_notification_channel_description">Zobrazí oznámení v případě chyby.</string>
|
<string name="notice_notification_channel_description">Zobrazí oznámení v případě chyby.</string>
|
||||||
<string name="notification_permission_not_granted">Oprávnění k zobrazení oznámení nebylo uděleno!</string>
|
<string name="notification_permission_not_granted">Oprávnění k zobrazení oznámení nebylo uděleno!</string>
|
||||||
@@ -605,8 +604,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM neexistuje</string>
|
<string name="loader_error_file_not_found">ROM neexistuje</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Hra vyžaduje firmware</string>
|
<string name="loader_requires_firmware">Hra vyžaduje firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Hra, kterou se pokoušíte spustit, vyžaduje firmware pro spuštění nebo pro překročení úvodní nabídky. Prosím <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> převezměte a nainstalujte firmware</a>, nebo stiskněte \"OK\" pro pokračování v každém případě.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Hledání hry...</string>
|
<string name="searching_for_game">Hledání hry...</string>
|
||||||
<string name="game_not_found_for_title_id">Hra nebyla nalezena pro ID titulu: %1$s</string>
|
<string name="game_not_found_for_title_id">Hra nebyla nalezena pro ID titulu: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Diese Software führt Spiele für die Nintendo Switch-Konsole aus. Es sind keine Spiele oder Schlüssel enthalten. Suche, bevor du beginnst, deine <![CDATA[<b> prod.keys </b>]]>-Datei auf deinem Gerät.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Mehr Erfahren</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Hinweise und Fehler</string>
|
<string name="notice_notification_channel_name">Hinweise und Fehler</string>
|
||||||
<string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
|
<string name="notice_notification_channel_description">Zeigt Benachrichtigungen an, wenn etwas schief läuft.</string>
|
||||||
<string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht zugelassen!</string>
|
<string name="notification_permission_not_granted">Berechtigung für Benachrichtigungen nicht zugelassen!</string>
|
||||||
@@ -304,17 +303,13 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_target_rate_144">144 FPS</string>
|
|
||||||
<string name="frame_gen_target_rate_165">165 FPS</string>
|
|
||||||
<string name="frame_gen_queue_target_1">Ausbalanciert (1 Bild)</string>
|
<string name="frame_gen_queue_target_1">Ausbalanciert (1 Bild)</string>
|
||||||
<string name="frame_gen_queue_target_2">Flüssigste (2 Bilder)</string>
|
<string name="frame_gen_queue_target_2">Flüssigste (2 Bilder)</string>
|
||||||
<string name="frame_gen_unsupported">Frame-Generation nicht verfügbar</string>
|
<string name="frame_gen_unsupported">Frame-Generation nicht verfügbar</string>
|
||||||
<string name="frame_gen_unsupported_description">Dieser GPU-Treiber unterstützt das Vulkan-Memory-Model nicht, welches Lossless Scaling-Shader benötigen.</string>
|
|
||||||
<string name="lossless_scaling_setup_description">Optional. Stelle deine eigene Lossless.dll zur Verfügung, um Frame-Generation später zu aktivieren.</string>
|
<string name="lossless_scaling_setup_description">Optional. Stelle deine eigene Lossless.dll zur Verfügung, um Frame-Generation später zu aktivieren.</string>
|
||||||
<string name="lossless_scaling_install">Installiere Lossless.dll</string>
|
<string name="lossless_scaling_install">Installiere Lossless.dll</string>
|
||||||
<string name="lossless_scaling_replace_description">Wähle eine andere Kopie von Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">Wähle eine andere Kopie von Lossless.dll</string>
|
||||||
<string name="frame_generation_supported">Unterstützt</string>
|
<string name="frame_generation_supported">Unterstützt</string>
|
||||||
<string name="frame_generation_unsupported">Nicht unterstützt (kein Vulkan-Memory-Model)</string>
|
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_installed">Installiert</string>
|
<string name="lossless_scaling_installed">Installiert</string>
|
||||||
<string name="lossless_scaling_not_installed">Nicht installiert</string>
|
<string name="lossless_scaling_not_installed">Nicht installiert</string>
|
||||||
@@ -513,7 +508,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
|||||||
<string name="skip_cpu_inner_invalidation_description">Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Kann in einigen Spielen zu Fehlern oder Abstürzen führen.</string>
|
<string name="skip_cpu_inner_invalidation_description">Überspringt bestimmte Cache-Invalidierungen auf CPU-Seite während Speicherupdates, reduziert die CPU-Auslastung und verbessert die Leistung. Kann in einigen Spielen zu Fehlern oder Abstürzen führen.</string>
|
||||||
<string name="renderer_asynchronous_shaders">Asynchrone Shader</string>
|
<string name="renderer_asynchronous_shaders">Asynchrone Shader</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Kompiliert Shader asynchron. Dies kann Ruckler reduzieren, aber auch Grafikfehler verursachen.</string>
|
<string name="renderer_asynchronous_shaders_description">Kompiliert Shader asynchron. Dies kann Ruckler reduzieren, aber auch Grafikfehler verursachen.</string>
|
||||||
<string name="gpu_unswizzle_default_button">Standard</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Erweiterungen</string>
|
<string name="extensions">Erweiterungen</string>
|
||||||
@@ -813,8 +807,6 @@ Wirklich fortfahren?</string>
|
|||||||
<string name="loader_error_file_not_found">ROM-Datei existiert nicht</string>
|
<string name="loader_error_file_not_found">ROM-Datei existiert nicht</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Spiel erfordert Firmware</string>
|
<string name="loader_requires_firmware">Spiel erfordert Firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Das Spiel, das Sie starten möchten, benötigt Firmware zum Booten oder zum Überspringen des Startmenüs. Bitte <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> dumpen und installieren Sie Firmware</a>, oder drücken Sie \"OK\", um trotzdem zu starten.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Suche nach Spiel...</string>
|
<string name="searching_for_game">Suche nach Spiel...</string>
|
||||||
<string name="game_not_found_for_title_id">Spiel nicht gefunden für Titel-ID: %1$s</string>
|
<string name="game_not_found_for_title_id">Spiel nicht gefunden für Titel-ID: %1$s</string>
|
||||||
@@ -925,25 +917,10 @@ Wirklich fortfahren?</string>
|
|||||||
<string name="fast_gpu_high">Übertaktung</string>
|
<string name="fast_gpu_high">Übertaktung</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Sehr klein (16 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Klein (32 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Normal (128 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Groß (256 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Sehr groß (512 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Sehr niedrig (4 MB)</string>
|
|
||||||
<string name="gpu_swizzle_low">Niedrig (8 MB)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Normal (16 MB)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Mittel (32 MB)</string>
|
|
||||||
<string name="gpu_swizzle_high">Hoch (64 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Sehr niedrig (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Niedrig (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Normal (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Mittel (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">Hoch (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Celsius</string>
|
<string name="temperature_celsius">Celsius</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Este software arrancará juegos para la consola Nintendo Switch. No se incluyen títulos ni claves de juego.<br /><br />Antes de continuar, por favor localiza tu archivo <![CDATA[prod.keys ]]> en el almacenamiento de tu dispositivo. <br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Aprender más</a>]]><b></string>
|
|
||||||
<string name="notice_notification_channel_name">Avisos y errores</string>
|
<string name="notice_notification_channel_name">Avisos y errores</string>
|
||||||
<string name="notice_notification_channel_description">Mostrar notificaciones cuando algo vaya mal.</string>
|
<string name="notice_notification_channel_description">Mostrar notificaciones cuando algo vaya mal.</string>
|
||||||
<string name="notification_permission_not_granted">¡Permiso de notificación no concedido!</string>
|
<string name="notification_permission_not_granted">¡Permiso de notificación no concedido!</string>
|
||||||
@@ -290,6 +289,9 @@
|
|||||||
<string name="gpu_driver_fetcher">Obtenedor de controladores de la GPU</string>
|
<string name="gpu_driver_fetcher">Obtenedor de controladores de la GPU</string>
|
||||||
<string name="gpu_driver_manager">Gestor de controladores de la GPU</string>
|
<string name="gpu_driver_manager">Gestor de controladores de la GPU</string>
|
||||||
<string name="install_gpu_driver_description">Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión</string>
|
<string name="install_gpu_driver_description">Instale los controladores alternativos para obtener un posible mejor rendimiento o precisión</string>
|
||||||
|
<string name="post_processing_open_list">Abrir lista</string>
|
||||||
|
<string name="post_processing_close_list">Cerrar lista</string>
|
||||||
|
<string name="post_processing_reset">Restablecer a predeterminado</string>
|
||||||
<string name="frame_gen">Generación de fotograma</string>
|
<string name="frame_gen">Generación de fotograma</string>
|
||||||
<string name="frame_gen_per_game_description">Configurar la generación de fotogramas para este juego</string>
|
<string name="frame_gen_per_game_description">Configurar la generación de fotogramas para este juego</string>
|
||||||
<string name="frame_gen_multiplier">Multiplicador de fotograma</string>
|
<string name="frame_gen_multiplier">Multiplicador de fotograma</string>
|
||||||
@@ -301,18 +303,14 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_target_rate_144">144 FPS</string>
|
|
||||||
<string name="frame_gen_target_rate_165">165 FPS</string>
|
|
||||||
<string name="frame_gen_queue_target_0">Latencia más baja (Sin búfer)</string>
|
<string name="frame_gen_queue_target_0">Latencia más baja (Sin búfer)</string>
|
||||||
<string name="frame_gen_queue_target_1">Equilibrado (1 fotograma)</string>
|
<string name="frame_gen_queue_target_1">Equilibrado (1 fotograma)</string>
|
||||||
<string name="frame_gen_queue_target_2">Más suave (2 fotogramas)</string>
|
<string name="frame_gen_queue_target_2">Más suave (2 fotogramas)</string>
|
||||||
<string name="frame_gen_fp16">Sombreadores de media precisión</string>
|
|
||||||
<string name="frame_gen_unsupported">Generación de fotogramas no disponbile</string>
|
<string name="frame_gen_unsupported">Generación de fotogramas no disponbile</string>
|
||||||
<string name="lossless_scaling_install">Instalar Lossless.dll</string>
|
<string name="lossless_scaling_install">Instalar Lossless.dll</string>
|
||||||
<string name="lossless_scaling_replace_description">Seleccionar una copia diferente de Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">Seleccionar una copia diferente de Lossless.dll</string>
|
||||||
<string name="frame_generation_support">Generación de fotograma</string>
|
<string name="frame_generation_support">Generación de fotograma</string>
|
||||||
<string name="frame_generation_supported">Soportado</string>
|
<string name="frame_generation_supported">Soportado</string>
|
||||||
<string name="frame_generation_unsupported">No soportado (sin modelo de memoria de Vulkan)</string>
|
|
||||||
<string name="lossless_scaling">Escalado sin pérdidas</string>
|
<string name="lossless_scaling">Escalado sin pérdidas</string>
|
||||||
<string name="lossless_scaling_installed">Instalado</string>
|
<string name="lossless_scaling_installed">Instalado</string>
|
||||||
<string name="lossless_scaling_not_installed">No instalado</string>
|
<string name="lossless_scaling_not_installed">No instalado</string>
|
||||||
@@ -519,8 +517,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
||||||
<string name="renderer_async_presentation">Presentación asíncrona</string>
|
|
||||||
<string name="renderer_async_presentation_description">Este hack puede aumentar el rendimiento al mover la presentación a un hilo independiente de la CPU a costa de problemas gráficos.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
||||||
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
||||||
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
||||||
@@ -543,17 +539,6 @@
|
|||||||
<string name="rescale_hack_description">Permite el manejo de versiones anteriores para el paso de configuración de reescalado para juegos mediante el uso de una ruta de reescalado rápida.</string>
|
<string name="rescale_hack_description">Permite el manejo de versiones anteriores para el paso de configuración de reescalado para juegos mediante el uso de una ruta de reescalado rápida.</string>
|
||||||
<string name="renderer_asynchronous_shaders">Usar sombreadores asíncronos</string>
|
<string name="renderer_asynchronous_shaders">Usar sombreadores asíncronos</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Compila los sombreadores de forma asíncrona. Esto puede reducir los tirones, pero también puede introducir errores gráficos.</string>
|
<string name="renderer_asynchronous_shaders_description">Compila los sombreadores de forma asíncrona. Esto puede reducir los tirones, pero también puede introducir errores gráficos.</string>
|
||||||
<string name="gpu_unswizzle_settings">Ajustes de desentrelazado de la GPU</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">Configura los parámetros de desentrelazado de texturas basadas en la GPU o desactívelos por completo. Modifique estos ajustes para equilibrar el rendimiento y la calidad de las texturas cargadas.</string>
|
|
||||||
<string name="gpu_unswizzle_enable">Activar desentrelazado de la GPU</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">Desactivado</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">Tamaño máximo de textura de desentrelazado de la GPU</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">Establece el tamaño máximo (en MB) para el desentrelazado de texturas basada en GPU. Aunque la GPU es más rápida para texturas medianas y grandes, la CPU puede ser más eficiente para texturas muy pequeñas. Ajuste este valor para encontrar el equilibrio entre la aceleración de la GPU y la sobrecarga de la CPU.</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">Tamaño del flujo de desentrelazado de la GPU</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">Establece el límite de datos por fotograma para desentrelazar texturas grandes. Los valores altos aceleran la carga de texturas, a coste de una mayor latencia por fotograma; los valores bajos reducen la carga de la GPU, pero pueden causar parpadeos visibles en las texturas.</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">Tamaño del trozo de desentrelazado de la GPU</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">Determina la cantidad de cortes de profundidad procesados en un solo envío de texturas 3D. Aumentar este valor puede mejorar el rendimiento en una GPU de gama alta, pero puede causar tirones y problemas en los tiempos de respuesta en hardware más modesto.</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">Por defecto</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Extensiones</string>
|
<string name="extensions">Extensiones</string>
|
||||||
@@ -786,7 +771,7 @@
|
|||||||
<!-- Custom Paths settings -->
|
<!-- Custom Paths settings -->
|
||||||
<string name="custom_save_directory">Directorio de los datos de guardado</string>
|
<string name="custom_save_directory">Directorio de los datos de guardado</string>
|
||||||
<string name="custom_save_directory_description">Establecer una ruta personalizada para el almacenamiento de los datos de guardado</string>
|
<string name="custom_save_directory_description">Establecer una ruta personalizada para el almacenamiento de los datos de guardado</string>
|
||||||
<string name="reset_to_nand">Restaurar valores predeterminados</string>
|
<string name="reset_to_nand">Restaurar los valores predeterminados</string>
|
||||||
<string name="migrate_save_data">Migrar datos de guardado</string>
|
<string name="migrate_save_data">Migrar datos de guardado</string>
|
||||||
<string name="migrate_save_data_question">¿Desea migrar los datos de guardado existentes a la nueva ubicación\?</string>
|
<string name="migrate_save_data_question">¿Desea migrar los datos de guardado existentes a la nueva ubicación\?</string>
|
||||||
<string name="save_migration_complete">Datos de guardado migrados con éxito</string>
|
<string name="save_migration_complete">Datos de guardado migrados con éxito</string>
|
||||||
@@ -880,8 +865,6 @@
|
|||||||
<string name="loader_error_file_not_found">Archivo ROM no existe</string>
|
<string name="loader_error_file_not_found">Archivo ROM no existe</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">El juego requiere firmware</string>
|
<string name="loader_requires_firmware">El juego requiere firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[El juego que intenta iniciar requiere el firmware para arrancar o pasar el menú de inicio. Por favor <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> vuelque e instale el firmware</a>, o pulse \"Aceptar\" para continuar de todos modos.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Buscando juego...</string>
|
<string name="searching_for_game">Buscando juego...</string>
|
||||||
<string name="game_not_found_for_title_id">Juego no encontrado para el ID de título: %1$s</string>
|
<string name="game_not_found_for_title_id">Juego no encontrado para el ID de título: %1$s</string>
|
||||||
@@ -992,25 +975,10 @@
|
|||||||
<string name="fast_gpu_high">Overclock</string>
|
<string name="fast_gpu_high">Overclock</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Muy pequeño (16 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Pequeño (32 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Normal (128 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Grande (256 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Muy grande (512 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Muy bajo (4 MB)</string>
|
|
||||||
<string name="gpu_swizzle_low">Bajo (8 MB)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Normal (16 MB)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Medio (32 MB)</string>
|
|
||||||
<string name="gpu_swizzle_high">Alto (64 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Muy bajo (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Bajo (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Normal (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Medio (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">Alto (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Celsius</string>
|
<string name="temperature_celsius">Celsius</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Ce logiciel permet de jouer à des jeux de la console Nintendo Switch. Aucun titre ni clé de jeu n\'est inclus.<br /><br />Avant de commencer, veuillez localiser votre fichier <![CDATA[<b> prod.keys </b>]]> sur le stockage de votre appareil.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">En savoir plus</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Avis et erreurs</string>
|
<string name="notice_notification_channel_name">Avis et erreurs</string>
|
||||||
<string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
|
<string name="notice_notification_channel_description">Affiche des notifications en cas de problème.</string>
|
||||||
<string name="notification_permission_not_granted">Permission de notification non accordée !</string>
|
<string name="notification_permission_not_granted">Permission de notification non accordée !</string>
|
||||||
@@ -483,8 +482,6 @@
|
|||||||
<string name="emulate_bgr565">Emuler BGR565</string>
|
<string name="emulate_bgr565">Emuler BGR565</string>
|
||||||
<string name="renderer_asynchronous_shaders">Utiliser les shaders asynchrones</string>
|
<string name="renderer_asynchronous_shaders">Utiliser les shaders asynchrones</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Compile les shaders de manière asynchrone. Cela peut réduire les saccades mais peut aussi provoquer des problèmes graphiques.</string>
|
<string name="renderer_asynchronous_shaders_description">Compile les shaders de manière asynchrone. Cela peut réduire les saccades mais peut aussi provoquer des problèmes graphiques.</string>
|
||||||
<string name="gpu_unswizzle_disabled">Désactivé</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">Par défaut</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Extensions</string>
|
<string name="extensions">Extensions</string>
|
||||||
@@ -785,8 +782,6 @@
|
|||||||
<string name="loader_error_file_not_found">Le fichier ROM n\'existe pas</string>
|
<string name="loader_error_file_not_found">Le fichier ROM n\'existe pas</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Jeu nécessite un firmware</string>
|
<string name="loader_requires_firmware">Jeu nécessite un firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Ce jeu nécessite un firmware pour démarrer ou passer le menu d\'accueil. Veuillez <a href=\"https://yuzu-mirror.github.io/help/quickstart\">dumper et installer le firmware</a> ou appuyez sur \"OK\" pour continuer quand même.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Recherche du jeu...</string>
|
<string name="searching_for_game">Recherche du jeu...</string>
|
||||||
<string name="game_not_found_for_title_id">Jeu non trouvé pour l\'ID de titre : %1$s</string>
|
<string name="game_not_found_for_title_id">Jeu non trouvé pour l\'ID de titre : %1$s</string>
|
||||||
@@ -887,25 +882,10 @@
|
|||||||
<string name="memory_8gb">8 Go (Dangereux)</string>
|
<string name="memory_8gb">8 Go (Dangereux)</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Très petit (16 Mo)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Petit (32 Mo)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Normal (128 Mo)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Large (256 Mo)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Très large (512 Mo)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Très faible (4 Mo)</string>
|
|
||||||
<string name="gpu_swizzle_low">Faible (8 Mo)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Normal (16 Mo)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Moyen (32 Mo)</string>
|
|
||||||
<string name="gpu_swizzle_high">Élevé (64 Mo)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Très faible (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Faible (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Normal (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Moyen (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">Élevé (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Celsius</string>
|
<string name="temperature_celsius">Celsius</string>
|
||||||
|
|||||||
@@ -510,8 +510,6 @@
|
|||||||
<string name="loader_error_file_not_found">קובץ המשחק לא קיים</string>
|
<string name="loader_error_file_not_found">קובץ המשחק לא קיים</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">המשחק דורש קושחה</string>
|
<string name="loader_requires_firmware">המשחק דורש קושחה</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[המשחק שאתה מנסה להפעיל דורש קושחה לאתחול או למעבר מתפריט הפתיחה. אנא <a href=\"https://yuzu-mirror.github.io/help/quickstart\">שמור והתקן קושחה</a> או לחץ \"אישור\" כדי להמשיך בכל מקרה.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">מחפש משחק...</string>
|
<string name="searching_for_game">מחפש משחק...</string>
|
||||||
<string name="game_not_found_for_title_id">משחק לא נמצא למזהה כותרת: %1$s</string>
|
<string name="game_not_found_for_title_id">משחק לא נמצא למזהה כותרת: %1$s</string>
|
||||||
|
|||||||
@@ -598,8 +598,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM fájl nem létezik</string>
|
<string name="loader_error_file_not_found">ROM fájl nem létezik</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">A játék firmware-t igényel</string>
|
<string name="loader_requires_firmware">A játék firmware-t igényel</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[A játék, amelyet el szeretne indítani, firmware-t igényel a bootoláshoz vagy a kezdőmenü átlépéséhez. Kérjük, <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> dumpolja és telepítse a firmware-t</a>, vagy nyomja meg az \"OK\" gombot a folytatáshoz.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Játék keresése...</string>
|
<string name="searching_for_game">Játék keresése...</string>
|
||||||
<string name="game_not_found_for_title_id">A játék nem található a következő címazonosítóhoz: %1$s</string>
|
<string name="game_not_found_for_title_id">A játék nem található a következő címazonosítóhoz: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Perangkat lunak ini akan menjalankan permainan dari konsol Nintendo Switch. Permainan maupun keys tidak disediakan.<br /><br />Sebelum memulai, tolong temukan berkas <![CDATA[<b> prod.keys </b>]]> didalam tempat penyimpanan mu.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Pelajari lebih lanjut</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Pemberitahuan dan error</string>
|
<string name="notice_notification_channel_name">Pemberitahuan dan error</string>
|
||||||
<string name="notice_notification_channel_description">Menampilkan pemberitahuan ketika terjadi kesalahan.</string>
|
<string name="notice_notification_channel_description">Menampilkan pemberitahuan ketika terjadi kesalahan.</string>
|
||||||
<string name="notification_permission_not_granted">Izin notifikasi tidak diberikan!</string>
|
<string name="notification_permission_not_granted">Izin notifikasi tidak diberikan!</string>
|
||||||
@@ -638,8 +637,6 @@
|
|||||||
<string name="loader_error_file_not_found">Berkas Tidak Ditemukan</string>
|
<string name="loader_error_file_not_found">Berkas Tidak Ditemukan</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Game memerlukan firmware</string>
|
<string name="loader_requires_firmware">Game memerlukan firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Game yang ingin Anda jalankan memerlukan firmware untuk boot atau melewati menu pembuka. Silakan <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> dump dan instal firmware</a>, atau tekan \"OK\" untuk melanjutkan.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Mencari game...</string>
|
<string name="searching_for_game">Mencari game...</string>
|
||||||
<string name="game_not_found_for_title_id">Game tidak ditemukan untuk ID Judul: %1$s</string>
|
<string name="game_not_found_for_title_id">Game tidak ditemukan untuk ID Judul: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Questo software esegue giochi per la console Nintendo Switch. Non sono inclusi titoli di giochi o chiavi.<br /><br /> Prima di iniziare, individua il file <![CDATA[<b>prod.keys</b>]]> nella memoria del tuo dispositivo.<br /><br /> <![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Ulteriori informazioni</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Avvisi ed errori</string>
|
<string name="notice_notification_channel_name">Avvisi ed errori</string>
|
||||||
<string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string>
|
<string name="notice_notification_channel_description">Mostra le notifiche quando qualcosa va storto.</string>
|
||||||
<string name="notification_permission_not_granted">Autorizzazione di notifica non concessa!</string>
|
<string name="notification_permission_not_granted">Autorizzazione di notifica non concessa!</string>
|
||||||
@@ -662,8 +661,6 @@
|
|||||||
<string name="loader_error_file_not_found">Il file della ROM non esiste</string>
|
<string name="loader_error_file_not_found">Il file della ROM non esiste</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Firmware richiesto</string>
|
<string name="loader_requires_firmware">Firmware richiesto</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Il gioco che stai cercando di avviare richiede il firmware per poter partire o per superare il menù iniziale. <a href=\"https://yuzu-mirror.github.io/help/quickstart\">Esegui il dump del firmware e installalo</a>, o premi \"OK\" per continuare lo stesso.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Ricerca del gioco in corso...</string>
|
<string name="searching_for_game">Ricerca del gioco in corso...</string>
|
||||||
<string name="game_not_found_for_title_id">Gioco non trovato per l\'ID titolo: %1$s</string>
|
<string name="game_not_found_for_title_id">Gioco non trovato per l\'ID titolo: %1$s</string>
|
||||||
|
|||||||
@@ -508,8 +508,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROMファイルが存在しません</string>
|
<string name="loader_error_file_not_found">ROMファイルが存在しません</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">ゲームにはファームウェアが必要です</string>
|
<string name="loader_requires_firmware">ゲームにはファームウェアが必要です</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[起動しようとしているゲームは、起動または開始メニューを通過するためにファームウェアが必要です。<a href=\"https://yuzu-mirror.github.io/help/quickstart\"> ファームウェアをダンプしてインストール</a>するか、\"OK\"を押して続行してください。]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">ゲームを検索中...</string>
|
<string name="searching_for_game">ゲームを検索中...</string>
|
||||||
<string name="game_not_found_for_title_id">タイトルID: %1$s のゲームが見つかりません</string>
|
<string name="game_not_found_for_title_id">タイトルID: %1$s のゲームが見つかりません</string>
|
||||||
|
|||||||
@@ -558,8 +558,6 @@
|
|||||||
<string name="loader_error_file_not_found">롬 파일이 존재하지 않음</string>
|
<string name="loader_error_file_not_found">롬 파일이 존재하지 않음</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">게임에 펌웨어가 필요합니다</string>
|
<string name="loader_requires_firmware">게임에 펌웨어가 필요합니다</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[실행하려는 게임은 부팅하거나 시작 메뉴를 통과하기 위해 펌웨어가 필요합니다. <a href=\"https://yuzu-mirror.github.io/help/quickstart\">펌웨어를 덤프하여 설치</a>하거나 \"확인\"을 눌러 계속 진행하세요.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">게임 검색 중...</string>
|
<string name="searching_for_game">게임 검색 중...</string>
|
||||||
<string name="game_not_found_for_title_id">타이틀 ID에 대한 게임을 찾을 수 없음: %1$s</string>
|
<string name="game_not_found_for_title_id">타이틀 ID에 대한 게임을 찾을 수 없음: %1$s</string>
|
||||||
|
|||||||
@@ -487,8 +487,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM-filen finnes ikke</string>
|
<string name="loader_error_file_not_found">ROM-filen finnes ikke</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Spillet krever fastvare</string>
|
<string name="loader_requires_firmware">Spillet krever fastvare</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Spillet du prøver å starte krever fastvare for oppstart eller for å komme forbi startmenyen. Vennligst <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> dump og installer fastvare</a>, eller trykk \"OK\" for å fortsette likevel.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Søker etter spill...</string>
|
<string name="searching_for_game">Søker etter spill...</string>
|
||||||
<string name="game_not_found_for_title_id">Spill ikke funnet for tittel-ID: %1$s</string>
|
<string name="game_not_found_for_title_id">Spill ikke funnet for tittel-ID: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">To oprogramowanie uruchamia gry na konsoli Nintendo Switch. Żadne tytuły gier ani klucze nie są dołączone.<br /><br />Zanim zaczniesz, zlokalizuj plik <![CDATA[<b> prod.keys </b>]]> na swoim urządzeniu.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Więcej informacji</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Powiadomienia błędy</string>
|
<string name="notice_notification_channel_name">Powiadomienia błędy</string>
|
||||||
<string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string>
|
<string name="notice_notification_channel_description">Pokaż powiadomienie gdy coś pójdzie źle</string>
|
||||||
<string name="notification_permission_not_granted">Nie zezwolono na powiadomienia!</string>
|
<string name="notification_permission_not_granted">Nie zezwolono na powiadomienia!</string>
|
||||||
@@ -758,8 +757,6 @@
|
|||||||
<string name="loader_error_file_not_found">Plik ROM nie istnieje</string>
|
<string name="loader_error_file_not_found">Plik ROM nie istnieje</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Gra wymaga oprogramowania sprzętowego</string>
|
<string name="loader_requires_firmware">Gra wymaga oprogramowania sprzętowego</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Gra, którą próbujesz uruchomić, wymaga oprogramowania sprzętowego do uruchomienia lub przejścia przez menu startowe. Proszę <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> zrzuć i zainstaluj oprogramowanie sprzętowe</a>, lub naciśnij \"OK\", aby kontynuować mimo to.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Wyszukiwanie gry...</string>
|
<string name="searching_for_game">Wyszukiwanie gry...</string>
|
||||||
<string name="game_not_found_for_title_id">Nie znaleziono gry dla ID tytułu: %1$s</string>
|
<string name="game_not_found_for_title_id">Nie znaleziono gry dla ID tytułu: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Este programa serve para rodar jogos do Nintendo Switch. Nenhum jogo ou chaves do sistema são inclusos<br /><br />Antes de começar, localize o seu <![CDATA[<b> prod.keys </b>]]> salvo no seu sistema.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Saiba mais</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Notificações e erros</string>
|
<string name="notice_notification_channel_name">Notificações e erros</string>
|
||||||
<string name="notice_notification_channel_description">Mostra notificações quando acontecer um erro.</string>
|
<string name="notice_notification_channel_description">Mostra notificações quando acontecer um erro.</string>
|
||||||
<string name="notification_permission_not_granted">Acesso às notificações não foi permitido!</string>
|
<string name="notification_permission_not_granted">Acesso às notificações não foi permitido!</string>
|
||||||
@@ -717,8 +716,6 @@
|
|||||||
<string name="loader_error_file_not_found">O arquivo ROM não existe</string>
|
<string name="loader_error_file_not_found">O arquivo ROM não existe</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">O jogo requer firmware</string>
|
<string name="loader_requires_firmware">O jogo requer firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[O jogo que você está tentando iniciar requer firmware para inicializar ou passar do menu de abertura. Por favor <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> faça dump e instale o firmware</a>, ou pressione \"OK\" para continuar mesmo assim.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Procurando jogo...</string>
|
<string name="searching_for_game">Procurando jogo...</string>
|
||||||
<string name="game_not_found_for_title_id">Jogo não encontrado para o ID do Título: %1$s</string>
|
<string name="game_not_found_for_title_id">Jogo não encontrado para o ID do Título: %1$s</string>
|
||||||
|
|||||||
@@ -609,8 +609,6 @@ uma tentativa de mapeamento automático</string>
|
|||||||
<string name="loader_error_file_not_found">O ficheiro da ROM não existe</string>
|
<string name="loader_error_file_not_found">O ficheiro da ROM não existe</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">O jogo requer firmware</string>
|
<string name="loader_requires_firmware">O jogo requer firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[O jogo que está a tentar iniciar requer firmware para arrancar ou passar o menu inicial. Por favor <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> faça dump e instale o firmware</a>, ou pressione \"OK\" para continuar mesmo assim.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">A procurar jogo...</string>
|
<string name="searching_for_game">A procurar jogo...</string>
|
||||||
<string name="game_not_found_for_title_id">Jogo não encontrado para o ID do Título: %1$s</string>
|
<string name="game_not_found_for_title_id">Jogo não encontrado para o ID do Título: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Это программное обеспечение предназначено для запуска игр для игровой консоли Nintendo Switch. Игры и ключи в комплект не входят.<br /><br />Прежде чем начать, пожалуйста, найдите файл <![CDATA[<b>prod.keys</b>]]> на вашем устройстве.<br /><br /> <![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Узнать больше</a>]]></string>
|
<string name="app_disclaimer">Это программное обеспечение предназначено для запуска игр консоли Nintendo Switch. Никакие игры или ключи не входят в комплект.<br /><br />Перед началом работы найдите файл <![CDATA[<b> prod.keys </b>]]> во внутреннем хранилище вашего устройства. <br /><br /><![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">Узнать больше</a>]]></string>
|
||||||
<string name="notice_notification_channel_name">Уведомления и ошибки</string>
|
<string name="notice_notification_channel_name">Уведомления и ошибки</string>
|
||||||
<string name="notice_notification_channel_description">Показывает уведомления, когда что-то пошло не так</string>
|
<string name="notice_notification_channel_description">Показывает уведомления, когда что-то пошло не так</string>
|
||||||
<string name="notification_permission_not_granted">Вы не предоставили разрешение на уведомления!</string>
|
<string name="notification_permission_not_granted">Вы не предоставили разрешение на уведомления!</string>
|
||||||
@@ -291,6 +291,25 @@
|
|||||||
<string name="gpu_driver_fetcher">Получение драйверов ГПУ</string>
|
<string name="gpu_driver_fetcher">Получение драйверов ГПУ</string>
|
||||||
<string name="gpu_driver_manager">Менеджер драйверов ГПУ</string>
|
<string name="gpu_driver_manager">Менеджер драйверов ГПУ</string>
|
||||||
<string name="install_gpu_driver_description">Установите альтернативные драйверы для потенциально лучшей производительности и/или точности</string>
|
<string name="install_gpu_driver_description">Установите альтернативные драйверы для потенциально лучшей производительности и/или точности</string>
|
||||||
|
<string name="post_processing">Эффекты постобработки</string>
|
||||||
|
<string name="post_processing_description">Эффекты ReShade FX, применяемые после рендеринга</string>
|
||||||
|
<string name="post_processing_per_game_description">Настроить цепочку эффектов для этой игры</string>
|
||||||
|
<string name="post_processing_add">Добавить эффект</string>
|
||||||
|
<string name="post_processing_remove">Удалить</string>
|
||||||
|
<string name="post_processing_open_list">Открыть список</string>
|
||||||
|
<string name="post_processing_close_list">Закрыть список</string>
|
||||||
|
<string name="post_processing_remove_all">Удалить эффекты</string>
|
||||||
|
<string name="post_processing_preset_locked">Пресет активен. Отредактируйте его в разделе \"Эффекты постобработки\" перед запуском игры.</string>
|
||||||
|
<string name="post_processing_preset_modified">Значения изменены относительно исходного пресета.</string>
|
||||||
|
<string name="post_processing_presets">Пресеты</string>
|
||||||
|
<string name="post_processing_preset_new">Новый пресет</string>
|
||||||
|
<string name="post_processing_preset_new_description">Сохраняет загруженные вами эффекты вместе с их текущими значениями в виде пресета, который можно будет выбрать позже.</string>
|
||||||
|
<string name="post_processing_preset_name_invalid">Дайте пресету имя без знака равенства.</string>
|
||||||
|
<string name="post_processing_preset_none">Нет пресета</string>
|
||||||
|
<string name="post_processing_preset_delete">Удалить пресет</string>
|
||||||
|
<string name="post_processing_preset_reset">Сбросить значения пресета</string>
|
||||||
|
<string name="post_processing_reset">Сбросить до значений по умолчанию</string>
|
||||||
|
<string name="post_processing_empty">Эффекты не найдены. Поместите файлы .fx в эту папку:</string>
|
||||||
<string name="frame_gen">Генерация кадров</string>
|
<string name="frame_gen">Генерация кадров</string>
|
||||||
<string name="frame_gen_per_game_description">Настройка генерации кадров для данной игры</string>
|
<string name="frame_gen_per_game_description">Настройка генерации кадров для данной игры</string>
|
||||||
<string name="frame_gen_description">Вставляет промежуточные кадры между отрендеренными с помощью Lossless Scaling. При включении принудительно устанавливает режим вывода FIFO.</string>
|
<string name="frame_gen_description">Вставляет промежуточные кадры между отрендеренными с помощью Lossless Scaling. При включении принудительно устанавливает режим вывода FIFO.</string>
|
||||||
@@ -308,19 +327,13 @@
|
|||||||
<string name="frame_gen_flow_scale_auto_description">Оценивать движение в разрешении, которое игра действительно рендерит, вместо масштабированного вывода. Ничего не стоит в точности, так как масштабирование не добавляет деталей движения.</string>
|
<string name="frame_gen_flow_scale_auto_description">Оценивать движение в разрешении, которое игра действительно рендерит, вместо масштабированного вывода. Ничего не стоит в точности, так как масштабирование не добавляет деталей движения.</string>
|
||||||
<string name="frame_gen_flow_scale">Разрешение оценки движения</string>
|
<string name="frame_gen_flow_scale">Разрешение оценки движения</string>
|
||||||
<string name="frame_gen_flow_scale_description">Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность.</string>
|
<string name="frame_gen_flow_scale_description">Разрешение прохода оптического потока в долях от выходного разрешения. Его понижение — самый дешёвый способ вернуть производительность.</string>
|
||||||
<string name="frame_gen_fp16">Шейдеры половинной точности</string>
|
|
||||||
<string name="frame_gen_fp16_description">Использовать 16-битную версию шейдеров. Автоматически переключается на обычную, если драйвер или файл не поддерживают её.</string>
|
|
||||||
<string name="frame_gen_dump_flow">Сохранить сгенерированный кадр</string>
|
|
||||||
<string name="frame_gen_dump_flow_description">Однократно записать уровни мип-карт оптического потока и интерполированный кадр в папку lossless/debug для диагностики.</string>
|
|
||||||
<string name="frame_gen_unsupported">Генерация кадров недоступна</string>
|
<string name="frame_gen_unsupported">Генерация кадров недоступна</string>
|
||||||
<string name="frame_gen_unsupported_description">Драйвер ГПУ не поддерживает модель памяти Vulkan, требуемую шейдерами Lossless Scaling.</string>
|
|
||||||
<string name="lossless_scaling_setup_description">Опционально. Укажите свой Lossless.dll для включения генерации кадров позже.</string>
|
<string name="lossless_scaling_setup_description">Опционально. Укажите свой Lossless.dll для включения генерации кадров позже.</string>
|
||||||
<string name="lossless_scaling_install">Установить Lossless.dll</string>
|
<string name="lossless_scaling_install">Установить Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">Для генерации кадров требуется ваша собственная легальная копия Lossless.dll из Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">Выбрать другой файл Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">Выбрать другой файл Lossless.dll</string>
|
||||||
<string name="frame_generation_support">Генерация кадров</string>
|
<string name="frame_generation_support">Генерация кадров</string>
|
||||||
<string name="frame_generation_supported">Поддерживается</string>
|
<string name="frame_generation_supported">Поддерживается</string>
|
||||||
<string name="frame_generation_unsupported">Не поддерживается (нет модели памяти Vulkan)</string>
|
|
||||||
<string name="lossless_scaling_description">Предоставьте свою копию Lossless.dll для включения генерации кадров</string>
|
<string name="lossless_scaling_description">Предоставьте свою копию Lossless.dll для включения генерации кадров</string>
|
||||||
<string name="lossless_scaling_installed">Установлена</string>
|
<string name="lossless_scaling_installed">Установлена</string>
|
||||||
<string name="lossless_scaling_not_installed">Не установлена</string>
|
<string name="lossless_scaling_not_installed">Не установлена</string>
|
||||||
@@ -541,8 +554,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
||||||
<string name="renderer_async_presentation">Асинхронная презентация</string>
|
|
||||||
<string name="renderer_async_presentation_description">Может повысить производительность за счёт перемещения вывода кадров в отдельный поток ЦП, но ценой возникновения графических проблем.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
||||||
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
||||||
<string name="enable_buffer_history">Включить историю буфера</string>
|
<string name="enable_buffer_history">Включить историю буфера</string>
|
||||||
@@ -566,17 +577,6 @@
|
|||||||
<string name="rescale_hack_description">Включает старый метод обработки этапа перенастройки масштабирования для игр за счёт использования быстрого алгоритма перемасштабирования.</string>
|
<string name="rescale_hack_description">Включает старый метод обработки этапа перенастройки масштабирования для игр за счёт использования быстрого алгоритма перемасштабирования.</string>
|
||||||
<string name="renderer_asynchronous_shaders">Использовать асинхронные шейдеры</string>
|
<string name="renderer_asynchronous_shaders">Использовать асинхронные шейдеры</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Компилирует шейдеры асинхронно. Это может уменьшить подтормаживания, но также может вызвать графические артефакты.</string>
|
<string name="renderer_asynchronous_shaders_description">Компилирует шейдеры асинхронно. Это может уменьшить подтормаживания, но также может вызвать графические артефакты.</string>
|
||||||
<string name="gpu_unswizzle_settings">Настройки распаковки текстур (Unswizzle)</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">Настройте параметры распаковки текстур на стороне ГПУ либо полностью отключите эту функцию. Изменение этих параметров позволяет найти баланс между производительностью и качеством загрузки текстур.</string>
|
|
||||||
<string name="gpu_unswizzle_enable">Включить распаковку текстур (Unswizzle)</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">Отключено</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">Макс. размер текстуры Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">Задает максимальный размер (в МБ) текстур для преобразования формата (unswizzle) на ГПУ. Хотя ГПУ быстрее работает со средними и большими текстурами, ЦП может быть эффективнее для очень маленьких. Настройте это значение, чтобы найти баланс между ускорением на ГПУ и нагрузкой на ЦП.</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">Размер потока Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">Задает лимит данных на кадр для преобразования крупных текстур (unswizzle). Высокие значения ускоряют загрузку текстур ценой увеличения задержки кадра; низкие значения снижают нагрузку на ГПУ, но могут вызывать заметную постепенную подгрузку текстур.</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">Размер блока Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">Задает количество слоёв глубины, обрабатываемых за одну пачку для 3D-текстур. Увеличение этого значения улучшает пропускную способность на мощных ГПУ, но может вызывать подтормаживания или таймауты драйвера на слабом железе.</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">По умолчанию</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Расширения</string>
|
<string name="extensions">Расширения</string>
|
||||||
@@ -617,6 +617,11 @@
|
|||||||
<string name="log">Логирование</string>
|
<string name="log">Логирование</string>
|
||||||
<string name="flush_by_line">Сбрасывать логи отладки построчно</string>
|
<string name="flush_by_line">Сбрасывать логи отладки построчно</string>
|
||||||
<string name="flush_by_line_description">Сбрасывает логи отладки после каждой написанной строки, упрощая отладку в случае сбоев или зависаний.</string>
|
<string name="flush_by_line_description">Сбрасывает логи отладки после каждой написанной строки, упрощая отладку в случае сбоев или зависаний.</string>
|
||||||
|
<string name="extended_logging">Включить расширенное логирование</string>
|
||||||
|
<string name="extended_logging_description">Увеличивает максимальный размер файла журнала со 100 МБ до 1 ГБ.</string>
|
||||||
|
<string name="log_filter">Фильтр журнала</string>
|
||||||
|
<string name="log_filter_description">Управляет категориями журнала Eden. Пример: :Info Service.LM:Debug</string>
|
||||||
|
|
||||||
<!-- GPU Logging strings -->
|
<!-- GPU Logging strings -->
|
||||||
<string name="gpu_logging_header">Ведение журнала ГПУ</string>
|
<string name="gpu_logging_header">Ведение журнала ГПУ</string>
|
||||||
<string name="gpu_log_level">Уровень журналирования</string>
|
<string name="gpu_log_level">Уровень журналирования</string>
|
||||||
@@ -900,7 +905,7 @@
|
|||||||
<string name="loader_error_file_not_found">Файл ROM не существует</string>
|
<string name="loader_error_file_not_found">Файл ROM не существует</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Игре требуется прошивка</string>
|
<string name="loader_requires_firmware">Игре требуется прошивка</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Для запуска этой игры или прохождения начального меню требуется прошивка. Пожалуйста, <a href=\"https://yuzu-mirror.github.io/help/quickstart\">сохраните и установите прошивку</a> или нажмите \"OK\" для запуска в любом случае.]]></string>
|
<string name="loader_requires_firmware_description"><![CDATA[Для корректной работы этой игры может потребоваться прошивка, а у вас она не установлена. Пожалуйста, установите прошивку перед запуском или нажмите \"OK\", чтобы всё равно запустить.]]></string>
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Поиск игры...</string>
|
<string name="searching_for_game">Поиск игры...</string>
|
||||||
@@ -1012,25 +1017,10 @@
|
|||||||
<string name="fast_gpu_high">Разгон</string>
|
<string name="fast_gpu_high">Разгон</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Очень малый (16 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Малый (32 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Обычный (128 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Большой (256 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Очень большой (512 МБ)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Очень низкий (4 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_low">Низкий (8 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Обычный (16 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Средний (32 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_high">Высокий (64 МБ)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Очень малый (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Малый (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Обычный (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Средний (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">Большой (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Цельсий</string>
|
<string name="temperature_celsius">Цельсий</string>
|
||||||
|
|||||||
@@ -606,8 +606,6 @@
|
|||||||
<string name="loader_error_file_not_found">РОМ датотека не постоји</string>
|
<string name="loader_error_file_not_found">РОМ датотека не постоји</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Игра захтева firmware</string>
|
<string name="loader_requires_firmware">Игра захтева firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Игра коју покушавате да покренете захтева firmware за покретање или прелазак почетног менија. Молимо <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> направите дамп и инсталирајте firmware</a>, или притисните \"OK\" да бисте наставили у сваком случају.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Тражење игре...</string>
|
<string name="searching_for_game">Тражење игре...</string>
|
||||||
<string name="game_not_found_for_title_id">Игра није пронађена за ID наслова: %1$s</string>
|
<string name="game_not_found_for_title_id">Игра није пронађена за ID наслова: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">Цей застосунок запускає ігри для ігрової консолі Nintendo Switch. Він не містить ігор чи ключів.<br /><br />Перш ніж почати, укажіть розташування файлу <![CDATA[<b> prod.keys </b>]]> у пам’яті вашого пристрою.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Дізнатися більше</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">Сповіщення та помилки</string>
|
<string name="notice_notification_channel_name">Сповіщення та помилки</string>
|
||||||
<string name="notice_notification_channel_description">Показує сповіщення у разі виникнення проблем.</string>
|
<string name="notice_notification_channel_description">Показує сповіщення у разі виникнення проблем.</string>
|
||||||
<string name="notification_permission_not_granted">Дозвіл на сповіщення не надано!</string>
|
<string name="notification_permission_not_granted">Дозвіл на сповіщення не надано!</string>
|
||||||
@@ -482,8 +481,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
||||||
<string name="renderer_async_presentation">Асинхронне подання</string>
|
|
||||||
<string name="renderer_async_presentation_description">Це обхідне рішення може покращити продуктивність завдяки переміщенню подання на окремий потік ЦП, але спричинить проблеми з графікою.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
||||||
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
||||||
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
||||||
@@ -503,17 +500,6 @@
|
|||||||
<string name="rescale_hack_description">Вмикає застарілу обробку масштабування для ігор, використовуючи швидкий шлях масштабування</string>
|
<string name="rescale_hack_description">Вмикає застарілу обробку масштабування для ігор, використовуючи швидкий шлях масштабування</string>
|
||||||
<string name="renderer_asynchronous_shaders">Асинхронні шейдери</string>
|
<string name="renderer_asynchronous_shaders">Асинхронні шейдери</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Компілює шейдери асинхронно. Це може зменшити затримки, але також може спричинити графічні баги.</string>
|
<string name="renderer_asynchronous_shaders_description">Компілює шейдери асинхронно. Це може зменшити затримки, але також може спричинити графічні баги.</string>
|
||||||
<string name="gpu_unswizzle_settings">Налаштування розпакування за допомогою ГП</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">Налаштуйте розпакування текстур за допомогою ГП або повністю вимкнути його. Відкоригуйте ці налаштування, щоб урівноважити продуктивність і якість завантаження текстур.</string>
|
|
||||||
<string name="gpu_unswizzle_enable">Увімкнути розпакування за допомогою ГП</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">Вимкнено</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">Максимальний розмір текстур для розпакування ГП за допомогою ГП</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">Встановлює максимальний розмір (МБ) для розпакування текстур за допомогою ГП. ГП швидше справляється з текстурами середніх і великих розмірів, а ЦП ефективніший для дуже маленьких. Налаштуйте, щоб збалансувати ГП-прискоренням і навантаженням на ЦП.</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">Розмір потоку розпакування за допомогою ГП</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">Встановлює обмеження даних на кадр для розпакування великих текстур. Вищі значення пришвидшують завантаження текстур за рахунок більших кадрових затримок; менші значення зменшують перевантаження ГП але може спричинити помітні появи текстур.</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">Розмір блоків розпакування за допомогою ГП</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">Визначає кількість зрізів глибини, оброблених за партію 3D-текстур. Збільшення здатне покращити пропускну здатність на потужних ГП, але може призвести до затримок або затримок драйвера зі слабшим устаткуванням.</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">Стандартно</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Розширення</string>
|
<string name="extensions">Розширення</string>
|
||||||
@@ -830,8 +816,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM файлу не існує</string>
|
<string name="loader_error_file_not_found">ROM файлу не існує</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Гра вимагає прошивки</string>
|
<string name="loader_requires_firmware">Гра вимагає прошивки</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Гра, яку ви намагаєтеся запустити, вимагає прошивки для завантаження або пропуску початкового меню. Будь ласка, <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> зробіть дамп і встановіть прошивку</a>, або натисніть \"OK\", щоб продовжити в будь-якому разі.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Пошук гри...</string>
|
<string name="searching_for_game">Пошук гри...</string>
|
||||||
<string name="game_not_found_for_title_id">Гру не знайдено для ID заголовку: %1$s</string>
|
<string name="game_not_found_for_title_id">Гру не знайдено для ID заголовку: %1$s</string>
|
||||||
@@ -932,25 +916,10 @@
|
|||||||
<string name="memory_8gb">8 ГБ (Небезпечно)</string>
|
<string name="memory_8gb">8 ГБ (Небезпечно)</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Дуже малий (16 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Малий (32 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Нормальний (128 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Великий (256 МБ)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Дуже великий (512 МБ)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Дуже низький (4 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_low">Низький (8 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Нормальний (16 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Середній (32 МБ)</string>
|
|
||||||
<string name="gpu_swizzle_high">Високий (64 МБ)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Дуже низький (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Низький (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Нормальний (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Середній (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">Високий (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Цельсій</string>
|
<string name="temperature_celsius">Цельсій</string>
|
||||||
|
|||||||
@@ -483,8 +483,6 @@
|
|||||||
<string name="loader_error_file_not_found">Tệp ROM không tồn tại</string>
|
<string name="loader_error_file_not_found">Tệp ROM không tồn tại</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">Trò chơi yêu cầu firmware</string>
|
<string name="loader_requires_firmware">Trò chơi yêu cầu firmware</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[Trò chơi bạn đang cố khởi chạy yêu cầu firmware để khởi động hoặc vượt qua menu mở đầu. Vui lòng <a href=\"https://yuzu-mirror.github.io/help/quickstart\"> dump và cài đặt firmware</a>, hoặc nhấn \"OK\" để tiếp tục dù sao đi nữa.]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">Đang tìm kiếm trò chơi...</string>
|
<string name="searching_for_game">Đang tìm kiếm trò chơi...</string>
|
||||||
<string name="game_not_found_for_title_id">Không tìm thấy trò chơi cho ID Tiêu đề: %1$s</string>
|
<string name="game_not_found_for_title_id">Không tìm thấy trò chơi cho ID Tiêu đề: %1$s</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">本软件可以运行Nintendo Switch游戏主机的游戏,但自身并不包含任何游戏或密钥。<br /><br />请于开始之前选定位于你的设备存储空间中的<![CDATA[<b>prod.keys</b>]]>。<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">了解更多</a>]]></string>
|
|
||||||
<string name="notice_notification_channel_name">错误与注意事项</string>
|
<string name="notice_notification_channel_name">错误与注意事项</string>
|
||||||
<string name="notice_notification_channel_description">当发生错误时显示通知。</string>
|
<string name="notice_notification_channel_description">当发生错误时显示通知。</string>
|
||||||
<string name="notification_permission_not_granted">未授予通知权限!</string>
|
<string name="notification_permission_not_granted">未授予通知权限!</string>
|
||||||
@@ -305,8 +304,6 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_target_rate_144">144 FPS</string>
|
|
||||||
<string name="frame_gen_target_rate_165">165 FPS</string>
|
|
||||||
<string name="frame_gen_queue_target">帧队列目标</string>
|
<string name="frame_gen_queue_target">帧队列目标</string>
|
||||||
<string name="frame_gen_queue_target_description">在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。</string>
|
<string name="frame_gen_queue_target_description">在显示之前有多少已完成渲染的帧正在等待。较大的队列可以缓解 GPU 突发的压力,但会增加输入延迟。</string>
|
||||||
<string name="frame_gen_queue_target_0">最低延迟 (无缓冲)</string>
|
<string name="frame_gen_queue_target_0">最低延迟 (无缓冲)</string>
|
||||||
@@ -316,19 +313,13 @@
|
|||||||
<string name="frame_gen_flow_scale_auto_description">在游戏实际渲染的分辨率下估算运动,而不是在放大后的输出上。不会影响精确性,因为放大并不会增加运动细节。</string>
|
<string name="frame_gen_flow_scale_auto_description">在游戏实际渲染的分辨率下估算运动,而不是在放大后的输出上。不会影响精确性,因为放大并不会增加运动细节。</string>
|
||||||
<string name="frame_gen_flow_scale">运动预估分辨率</string>
|
<string name="frame_gen_flow_scale">运动预估分辨率</string>
|
||||||
<string name="frame_gen_flow_scale_description">光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。</string>
|
<string name="frame_gen_flow_scale_description">光流通道的分辨率,以输出的比例表示。降低它是提升性能最经济的做法。</string>
|
||||||
<string name="frame_gen_fp16">半精度着色器</string>
|
|
||||||
<string name="frame_gen_fp16_description">使用 16 位着色器变体。如果驱动或文件不支持会自动回退。</string>
|
|
||||||
<string name="frame_gen_dump_flow">转储已生成的帧</string>
|
|
||||||
<string name="frame_gen_dump_flow_description">为了排查问题,把光流 mip 级别和插值帧写入 lossless/debug 文件夹一次</string>
|
|
||||||
<string name="frame_gen_unsupported">帧生成不可用</string>
|
<string name="frame_gen_unsupported">帧生成不可用</string>
|
||||||
<string name="frame_gen_unsupported_description">这个 GPU 驱动不支持无损缩放着色器所需的 Vulkan 内存模型。</string>
|
|
||||||
<string name="lossless_scaling_setup_description">作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。</string>
|
<string name="lossless_scaling_setup_description">作为可选项。请提供您自己的 Lossless.dll 以便在之后可以启用帧生成。</string>
|
||||||
<string name="lossless_scaling_install">安装 Lossless.dll</string>
|
<string name="lossless_scaling_install">安装 Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本</string>
|
<string name="lossless_scaling_install_description">帧生成需要您自己从 Lossless Scaling 获得合法的 Lossless.dll 副本</string>
|
||||||
<string name="lossless_scaling_replace_description">选择其它 Lossless.dll 副本</string>
|
<string name="lossless_scaling_replace_description">选择其它 Lossless.dll 副本</string>
|
||||||
<string name="frame_generation_support">帧生成</string>
|
<string name="frame_generation_support">帧生成</string>
|
||||||
<string name="frame_generation_supported">支持</string>
|
<string name="frame_generation_supported">支持</string>
|
||||||
<string name="frame_generation_unsupported">不支持 (无 Vulkan 内存模型)</string>
|
|
||||||
<string name="lossless_scaling">无损缩放</string>
|
<string name="lossless_scaling">无损缩放</string>
|
||||||
<string name="lossless_scaling_description">提供您自己的 Lossless.dll 文件以启用帧生成</string>
|
<string name="lossless_scaling_description">提供您自己的 Lossless.dll 文件以启用帧生成</string>
|
||||||
<string name="lossless_scaling_installed">已安装</string>
|
<string name="lossless_scaling_installed">已安装</string>
|
||||||
@@ -544,8 +535,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
||||||
<string name="renderer_async_presentation">异步呈现</string>
|
|
||||||
<string name="renderer_async_presentation_description">此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会带来图形显示问题。</string>
|
|
||||||
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
||||||
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
||||||
<string name="enable_buffer_history">启用缓冲区历史</string>
|
<string name="enable_buffer_history">启用缓冲区历史</string>
|
||||||
@@ -569,17 +558,6 @@
|
|||||||
<string name="rescale_hack_description">启用通过使用快速缩放路径,来为游戏提供缩放配置处理的传统处理方式</string>
|
<string name="rescale_hack_description">启用通过使用快速缩放路径,来为游戏提供缩放配置处理的传统处理方式</string>
|
||||||
<string name="renderer_asynchronous_shaders">使用异步着色器</string>
|
<string name="renderer_asynchronous_shaders">使用异步着色器</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">以异步方式编译着色器。采用此方式或可减少卡顿,但也可能引入故障点。</string>
|
<string name="renderer_asynchronous_shaders_description">以异步方式编译着色器。采用此方式或可减少卡顿,但也可能引入故障点。</string>
|
||||||
<string name="gpu_unswizzle_settings">GPU Unswizzle 设置</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">配置基于 GPU 的纹理 unswizzling 参数,或完全禁用该功能。通过调整这些设置,以尝试在性能与纹理加载质量之间取得平衡。</string>
|
|
||||||
<string name="gpu_unswizzle_enable">启用 GPU Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">禁用</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle 最大纹理尺寸</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">设置基于 GPU 的纹理 unswizzling 的最大尺寸(MB)。虽然 GPU 处理中等和大型纹理的速度更快,但对于非常小的纹理,CPU 可能更为高效。通过调节此项设置,以平衡GPU 加速与 CPU 开销。</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle 流大小</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">设置用于 unswizzling 大型纹理时的每帧数据限制。较高的数值可以加速纹理的加载过程,但会带来更高的帧延迟。而较低的数值则可以降低 GPU 的开销,但也可能会导致可见的纹理闪现。</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle 块大小</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">定义了 3D 纹理每批次处理的深度切片数量。增加此数值可在高性能 GPU 上提升吞吐效率,但在性能较弱的硬件上可能会导致卡顿或驱动超时。</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">默认</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">扩展</string>
|
<string name="extensions">扩展</string>
|
||||||
@@ -903,8 +881,6 @@
|
|||||||
<string name="loader_error_file_not_found">ROM 文件不存在</string>
|
<string name="loader_error_file_not_found">ROM 文件不存在</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">游戏需要固件</string>
|
<string name="loader_requires_firmware">游戏需要固件</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[您尝试启动的游戏需要固件才能引导或通过启动菜单。请<a href=\"https://yuzu-mirror.github.io/help/quickstart\">转储并安装固件</a>,或点击\"确定\"继续。]]></string>
|
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">正在搜索游戏...</string>
|
<string name="searching_for_game">正在搜索游戏...</string>
|
||||||
<string name="game_not_found_for_title_id">未找到标题ID的游戏: %1$s</string>
|
<string name="game_not_found_for_title_id">未找到标题ID的游戏: %1$s</string>
|
||||||
@@ -1015,25 +991,10 @@
|
|||||||
<string name="fast_gpu_high">超频</string>
|
<string name="fast_gpu_high">超频</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">极小 (16 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">较小 (32 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">正常 (128 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">较大 (256 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">极大 (512 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">极低 (4 MB)</string>
|
|
||||||
<string name="gpu_swizzle_low">低 (8 MB)</string>
|
|
||||||
<string name="gpu_swizzle_normal">正常 (16 MB)</string>
|
|
||||||
<string name="gpu_swizzle_medium">中 (32 MB)</string>
|
|
||||||
<string name="gpu_swizzle_high">高 (64 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">极低 (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">低 (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">正常 (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">中 (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">高 (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">摄氏度</string>
|
<string name="temperature_celsius">摄氏度</string>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
|
||||||
|
|
||||||
<string name="app_disclaimer">本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。<br/> <br/>在開始之前,請先安裝您的 <<![CDATA[ <b>prod.keys</b> ]]> 檔案,<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">了解更多</a>]]></string>
|
<string name="app_disclaimer">本軟體可執行Nintendo Switch主機的遊戲,軟體不提供遊戲和金鑰檔案。<br /><br />在開始之前,請先安裝您的 <![CDATA[<b> prod.keys </b>]]> 檔案,<![CDATA[<a href=\"https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/user/QuickStart.md\">了解更多</a>]]></string>
|
||||||
<string name="notice_notification_channel_name">通知和錯誤</string>
|
<string name="notice_notification_channel_name">通知和錯誤</string>
|
||||||
<string name="notice_notification_channel_description">發生錯誤時顯示通知</string>
|
<string name="notice_notification_channel_description">發生錯誤時顯示通知</string>
|
||||||
<string name="notification_permission_not_granted">未授予通知權限!</string>
|
<string name="notification_permission_not_granted">未授予通知權限!</string>
|
||||||
@@ -291,6 +291,25 @@
|
|||||||
<string name="gpu_driver_fetcher">GPU驅動程式下載器</string>
|
<string name="gpu_driver_fetcher">GPU驅動程式下載器</string>
|
||||||
<string name="gpu_driver_manager">GPU 驅動程式管理員</string>
|
<string name="gpu_driver_manager">GPU 驅動程式管理員</string>
|
||||||
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
||||||
|
<string name="post_processing">後製處理效果</string>
|
||||||
|
<string name="post_processing_description">在渲染完成後套用 ReShade FX 效果</string>
|
||||||
|
<string name="post_processing_per_game_description">為此遊戲設定特殊濾鏡或效果</string>
|
||||||
|
<string name="post_processing_add">新增效果</string>
|
||||||
|
<string name="post_processing_remove">移除</string>
|
||||||
|
<string name="post_processing_open_list">開啟清單</string>
|
||||||
|
<string name="post_processing_close_list">收起清單</string>
|
||||||
|
<string name="post_processing_remove_all">移除效果</string>
|
||||||
|
<string name="post_processing_preset_locked">濾鏡已啟用。請在開啟遊戲前於 後製處理效果 中調整</string>
|
||||||
|
<string name="post_processing_preset_modified">數值已變更,與原始濾鏡設定不同</string>
|
||||||
|
<string name="post_processing_presets">濾鏡</string>
|
||||||
|
<string name="post_processing_preset_new">新增濾鏡</string>
|
||||||
|
<string name="post_processing_preset_new_description">將目前載入的效果及數值儲存為設定檔方便日後使用</string>
|
||||||
|
<string name="post_processing_preset_name_invalid">請為此濾鏡設定檔命名,名稱中不得包含等號且不能與預先提供的設定檔名稱相同</string>
|
||||||
|
<string name="post_processing_preset_none">無濾鏡</string>
|
||||||
|
<string name="post_processing_preset_delete">刪除濾鏡</string>
|
||||||
|
<string name="post_processing_preset_reset">重設此濾鏡的所有設定值</string>
|
||||||
|
<string name="post_processing_reset">重設為預設值</string>
|
||||||
|
<string name="post_processing_empty">找不到設定檔。請將濾鏡效果的 .fx 檔案放置於此資料夾:</string>
|
||||||
<string name="frame_gen">影格生成</string>
|
<string name="frame_gen">影格生成</string>
|
||||||
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
||||||
<string name="frame_gen_description">使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步</string>
|
<string name="frame_gen_description">使用 Lossless Scaling 在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用 FIFO 垂直同步</string>
|
||||||
@@ -305,8 +324,6 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_target_rate_144">144 FPS</string>
|
|
||||||
<string name="frame_gen_target_rate_165">165 FPS</string>
|
|
||||||
<string name="frame_gen_queue_target">影格佇列目標</string>
|
<string name="frame_gen_queue_target">影格佇列目標</string>
|
||||||
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
||||||
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
||||||
@@ -316,15 +333,38 @@
|
|||||||
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
||||||
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
||||||
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法</string>
|
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法</string>
|
||||||
<string name="frame_gen_fp16">半準確著色器</string>
|
|
||||||
<string name="frame_gen_fp16_description">使用16位元著色器。如果驅動程式或著色器檔案不支援則會自動切換成其它版本</string>
|
|
||||||
<string name="frame_gen_dump_flow">傾印生成的著色器</string>
|
|
||||||
<string name="frame_gen_dump_flow_description">將光流的 MIP 層級與補間影格寫入 Eden 資料夾中的 lossless\debug 資料夾以便進行疑難排解</string>
|
|
||||||
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
||||||
<string name="frame_gen_unsupported_description">Lossless Scaling 的著色器需要 Vulkan 記憶體模型,所選的驅動程式不支援該功能</string>
|
|
||||||
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
||||||
|
<string name="lossless_scaling_install">安裝 Lossless.dll</string>
|
||||||
|
<string name="lossless_scaling_install_description">您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能</string>
|
||||||
|
<string name="lossless_scaling_replace_description">安裝不同的 Lossless.dll 檔案</string>
|
||||||
|
<string name="frame_generation_support">影格生成</string>
|
||||||
|
<string name="frame_generation_supported">支援</string>
|
||||||
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
|
<string name="lossless_scaling_description">安裝您擁有的 Lossless.dll 檔案以使用影格生成</string>
|
||||||
|
<string name="lossless_scaling_installed">已安裝</string>
|
||||||
|
<string name="lossless_scaling_not_installed">未安裝</string>
|
||||||
|
<string name="lossless_scaling_replace">替換</string>
|
||||||
|
<string name="lossless_scaling_remove">刪除</string>
|
||||||
|
<string name="lossless_scaling_remove_description">刪除已安裝的 Lossless.dll 及預先編譯的著色器</string>
|
||||||
|
<string name="lossless_scaling_remove_confirmation">影格生成功能會停止運作直到您重新安裝 Lossless.dll 。您的 Lossless.dll 原始檔並不會被 Eden 修改</string>
|
||||||
|
<string name="lossless_scaling_missing">Lossless.dll 未安裝</string>
|
||||||
|
<string name="lossless_scaling_missing_description">前往 設定 -> Lossless Scaling 安裝以使用影格生成功能</string>
|
||||||
|
<string name="lossless_scaling_locked">請先關閉遊戲</string>
|
||||||
|
<string name="lossless_scaling_locked_description">Lossless.dll 無法在遊戲執行時進行更換</string>
|
||||||
|
<string name="lossless_scaling_remove_unavailable">沒有東西可以刪除</string>
|
||||||
|
<string name="lossless_scaling_remove_unavailable_description">尚未安裝 Lossless.dll</string>
|
||||||
|
<string name="lossless_scaling_installing">準備影格生成著色器中...</string>
|
||||||
|
<string name="lossless_scaling_install_success">成功安裝 Lossless.dll</string>
|
||||||
|
<string name="lossless_scaling_install_failed">無法安裝 Lossless.dll</string>
|
||||||
|
<string name="error_lossless_copy_failed">無法複製選取的檔案</string>
|
||||||
|
<string name="error_lossless_unreadable">無法讀取選取的檔案</string>
|
||||||
|
<string name="error_lossless_not_pe">選取的檔案並不是 Windows 程式庫。請在 Lossless Scaling 的安裝位置(資料夾)中選擇 Lossless.dll</string>
|
||||||
|
<string name="error_lossless_missing_shaders">這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後再試一次</string>
|
||||||
|
<string name="error_lossless_translation_failed">無法轉譯影格生成著色器。尚不支援此 Lossless Scaling 版本</string>
|
||||||
|
<string name="error_lossless_cache_failed">轉譯的著色器無法寫入到儲存空間。請確認手機容量是否充足</string>
|
||||||
<string name="advanced_settings">進階設定</string>
|
<string name="advanced_settings">進階設定</string>
|
||||||
<string name="settings_description">進行模擬器設定</string>
|
<string name="settings_description">調整模擬器設定</string>
|
||||||
<string name="search_recently_played">最近遊玩</string>
|
<string name="search_recently_played">最近遊玩</string>
|
||||||
<string name="search_recently_added">最近新增</string>
|
<string name="search_recently_added">最近新增</string>
|
||||||
<string name="open_user_folder">開啟 Eden 資料夾</string>
|
<string name="open_user_folder">開啟 Eden 資料夾</string>
|
||||||
@@ -515,10 +555,8 @@
|
|||||||
<string name="renderer_force_max_clock_description">強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用)</string>
|
<string name="renderer_force_max_clock_description">強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用)</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
||||||
<string name="renderer_async_presentation">非同步呈現</string>
|
|
||||||
<string name="renderer_async_presentation_description">此修改可以透過將渲染移至單獨的 CPU 執行緒來提升性能,但可能會導致圖形問題</string>
|
|
||||||
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
||||||
<string name="renderer_reactive_flushing_description">犧牲效能,以改善部分遊戲的轉譯準確度。</string>
|
<string name="renderer_reactive_flushing_description">犧牲效能,以改善部分遊戲的轉譯準確度</string>
|
||||||
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
||||||
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
||||||
<string name="enable_gpu_buffer_readback">啟用 GPU 緩衝區讀回</string>
|
<string name="enable_gpu_buffer_readback">啟用 GPU 緩衝區讀回</string>
|
||||||
@@ -531,7 +569,7 @@
|
|||||||
<string name="fast_gpu_time">GPU 時脈</string>
|
<string name="fast_gpu_time">GPU 時脈</string>
|
||||||
<string name="fast_gpu_time_description">讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離</string>
|
<string name="fast_gpu_time_description">讓遊戲誤以為 GPU 工作能更快完成,避免遊戲為了配合 Switch 的時脈而降低解析度與渲染距離</string>
|
||||||
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
|
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機。</string>
|
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機</string>
|
||||||
<string name="fix_bloom_effects">修正光暈特效</string>
|
<string name="fix_bloom_effects">修正光暈特效</string>
|
||||||
<string name="fix_bloom_effects_description">在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
<string name="fix_bloom_effects_description">在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
||||||
<string name="emulate_bgr565">模擬 BGR565</string>
|
<string name="emulate_bgr565">模擬 BGR565</string>
|
||||||
@@ -540,17 +578,6 @@
|
|||||||
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
||||||
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。</string>
|
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。</string>
|
||||||
<string name="gpu_unswizzle_settings">GPU Unswizzle 設定</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">設定基於 GPU 的 Unswizzling 參數或完全停用此功能。調整此設定以在性能與紋理載入品質中取得平衡</string>
|
|
||||||
<string name="gpu_unswizzle_enable">啟用 GPU Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">停用</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle 最大紋理尺寸</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">設定 GPU 紋理 Unswizzling 的最大值 (MB)。雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。整此設定以在 GPU 加速與 CPU 負載之間取得平衡</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle 流大小</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">設定每個影格處理大型紋理 Unswizzling 的資料上限。數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle 塊大小</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">設定 3D 紋理每批次處理的深度切片數量。增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">預設</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">擴充功能</string>
|
<string name="extensions">擴充功能</string>
|
||||||
@@ -591,6 +618,11 @@
|
|||||||
<string name="log">日誌</string>
|
<string name="log">日誌</string>
|
||||||
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
||||||
<string name="flush_by_line_description">在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。</string>
|
<string name="flush_by_line_description">在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。</string>
|
||||||
|
<string name="extended_logging">啟用更詳細的日誌記錄</string>
|
||||||
|
<string name="extended_logging_description">將日誌檔的最大檔案限制從 100MB 提高到 1GB</string>
|
||||||
|
<string name="log_filter">日誌過濾器</string>
|
||||||
|
<string name="log_filter_description">控制 Eden 日誌的紀錄類別。例如: *:Info Service.LM:Debug</string>
|
||||||
|
|
||||||
<!-- GPU Logging strings -->
|
<!-- GPU Logging strings -->
|
||||||
<string name="gpu_logging_header">GPU 日誌</string>
|
<string name="gpu_logging_header">GPU 日誌</string>
|
||||||
<string name="gpu_log_level">記錄層級</string>
|
<string name="gpu_log_level">記錄層級</string>
|
||||||
@@ -715,7 +747,7 @@
|
|||||||
<string name="import_failed">導入失敗</string>
|
<string name="import_failed">導入失敗</string>
|
||||||
<string name="cancelling">正在取消</string>
|
<string name="cancelling">正在取消</string>
|
||||||
<string name="install">安裝</string>
|
<string name="install">安裝</string>
|
||||||
<string name="fetch">獲取</string>
|
<string name="fetch">下載</string>
|
||||||
<string name="delete">刪除</string>
|
<string name="delete">刪除</string>
|
||||||
<string name="edit">編輯</string>
|
<string name="edit">編輯</string>
|
||||||
<string name="import_success">已成功導入</string>
|
<string name="import_success">已成功導入</string>
|
||||||
@@ -740,12 +772,12 @@
|
|||||||
|
|
||||||
<!-- GPU driver fetcher -->
|
<!-- GPU driver fetcher -->
|
||||||
<string name="show_releases">顯示版本</string>
|
<string name="show_releases">顯示版本</string>
|
||||||
<string name="failed_to_fetch">獲取失敗</string>
|
<string name="failed_to_fetch">下載失敗</string>
|
||||||
<string name="error_during_fetch">獲取過程中發生錯誤</string>
|
<string name="error_during_fetch">下載過程中發生錯誤</string>
|
||||||
<string name="show_downloads">顯示下載</string>
|
<string name="show_downloads">顯示下載</string>
|
||||||
<string name="hide_downloads">隱藏下載</string>
|
<string name="hide_downloads">隱藏下載</string>
|
||||||
<string name="failed_cache_dir">快取目錄不可用</string>
|
<string name="failed_cache_dir">快取目錄不可用</string>
|
||||||
<string name="empty_response_body">回應內容為空</string>
|
<string name="empty_response_body">未回傳任何資料</string>
|
||||||
<string name="successfully_installed">%1$s 安裝成功</string>
|
<string name="successfully_installed">%1$s 安裝成功</string>
|
||||||
<string name="driver_failed_title">驅動程式安裝失敗</string>
|
<string name="driver_failed_title">驅動程式安裝失敗</string>
|
||||||
<string name="failed_install_driver">無法安裝 %1$s 驅動程式,您的系統支援此驅動程式嗎?</string>
|
<string name="failed_install_driver">無法安裝 %1$s 驅動程式,您的系統支援此驅動程式嗎?</string>
|
||||||
@@ -786,13 +818,21 @@
|
|||||||
<string name="save_migration_complete">成功遷移儲存資料</string>
|
<string name="save_migration_complete">成功遷移儲存資料</string>
|
||||||
<string name="save_migration_failed">儲存資料遷移失敗</string>
|
<string name="save_migration_failed">儲存資料遷移失敗</string>
|
||||||
<string name="save_directory_set">存檔目錄設定完成</string>
|
<string name="save_directory_set">存檔目錄設定完成</string>
|
||||||
|
<string name="destination_has_saves">所選取的位置已有儲存資料。是否要取代該檔案?</string>
|
||||||
|
<string name="all_files_permission_required">若要自訂路徑必須授予所有檔案的存取權</string>
|
||||||
|
<string name="grant_permission">授予權限</string>
|
||||||
|
<string name="custom_nand_directory">NAND 路徑</string>
|
||||||
|
<string name="custom_nand_directory_description">設定 NAND 資料的自訂路徑</string>
|
||||||
|
<string name="custom_sdmc_directory">虛擬 SD卡 路徑</string>
|
||||||
|
<string name="custom_sdmc_directory_description">設定虛擬 SD卡 儲存空間的自訂路徑</string>
|
||||||
|
<string name="path_set">路徑設定成功</string>
|
||||||
<string name="skip_migration">跳過</string>
|
<string name="skip_migration">跳過</string>
|
||||||
|
|
||||||
<!-- Game properties -->
|
<!-- Game properties -->
|
||||||
<string name="info">資訊</string>
|
<string name="info">軟體資訊</string>
|
||||||
<string name="info_description">程式 ID、開發人員及版本資訊</string>
|
<string name="info_description">程式 ID、開發人員及版本資訊</string>
|
||||||
<string name="per_game_settings">個別遊戲設定</string>
|
<string name="per_game_settings">個別遊戲設定</string>
|
||||||
<string name="per_game_settings_description">編輯此遊戲的特定設定</string>
|
<string name="per_game_settings_description">調整此遊戲的專用設定</string>
|
||||||
<string name="launch_options">啟動設定</string>
|
<string name="launch_options">啟動設定</string>
|
||||||
<string name="path">路徑</string>
|
<string name="path">路徑</string>
|
||||||
<string name="program_id">程式 ID</string>
|
<string name="program_id">程式 ID</string>
|
||||||
@@ -827,17 +867,17 @@
|
|||||||
<string name="save_data_description">管理此遊戲的儲存資料</string>
|
<string name="save_data_description">管理此遊戲的儲存資料</string>
|
||||||
<string name="delete_save_data">刪除儲存資料</string>
|
<string name="delete_save_data">刪除儲存資料</string>
|
||||||
<string name="delete_save_data_description">刪除此遊戲的所有儲存資料</string>
|
<string name="delete_save_data_description">刪除此遊戲的所有儲存資料</string>
|
||||||
<string name="delete_save_data_warning_description">這將會刪除此遊戲的所有儲存資料,且無法復原,您確定要繼續嗎?</string>
|
<string name="delete_save_data_warning_description">這將會刪除此遊戲的所有儲存資料且無法復原,您確定要繼續嗎?</string>
|
||||||
<string name="save_data_deleted_successfully">儲存資料已成功刪除</string>
|
<string name="save_data_deleted_successfully">儲存資料已成功刪除</string>
|
||||||
<string name="select_content_type">內容類型</string>
|
<string name="select_content_type">內容類型</string>
|
||||||
<string name="updates_and_dlc">更新及 DLC</string>
|
<string name="updates_and_dlc">更新及 DLC</string>
|
||||||
<string name="mods_and_cheats">模組及密技</string>
|
<string name="mods_and_cheats">模組及金手指</string>
|
||||||
<string name="addon_notice">重要的˙附加元件通知</string>
|
<string name="addon_notice">重要的˙附加元件通知</string>
|
||||||
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
|
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
|
||||||
<string name="addon_notice_description">若要安裝模組及密技,您必須選擇一個包含 cheats/、romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是否與您的遊戲相容,所以請謹慎安裝!</string>
|
<string name="addon_notice_description">若要安裝模組及金手指,您必須選擇一個包含 cheats/、romfs/ 或 exefs/ 的目錄。我們無法驗證這些內容是否與您的遊戲相容,所以請謹慎安裝!</string>
|
||||||
<string name="invalid_directory">無效的目錄</string>
|
<string name="invalid_directory">無效的目錄</string>
|
||||||
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
|
<!-- \"cheats/" "romfs/" and \"exefs/ should not be translated -->
|
||||||
<string name="invalid_directory_description">請確保您選取的目錄包含 cheats/、romfs/ 或 exefs/ 資料夾,然後再試一次。</string>
|
<string name="invalid_directory_description">請確保您選取的目錄包含 cheats/、romfs/ 或 exefs/ 資料夾,然後再試一次</string>
|
||||||
<string name="addon_installed_successfully">附加元件已成功安裝</string>
|
<string name="addon_installed_successfully">附加元件已成功安裝</string>
|
||||||
<string name="verifying_content">正在驗證內容…</string>
|
<string name="verifying_content">正在驗證內容…</string>
|
||||||
<string name="content_install_notice">內容安裝通知</string>
|
<string name="content_install_notice">內容安裝通知</string>
|
||||||
@@ -845,11 +885,12 @@
|
|||||||
<string name="confirm_uninstall">確認刪除</string>
|
<string name="confirm_uninstall">確認刪除</string>
|
||||||
<string name="confirm_uninstall_description">您確定要刪除此附加元件嗎?</string>
|
<string name="confirm_uninstall_description">您確定要刪除此附加元件嗎?</string>
|
||||||
<string name="verify_integrity">完整性驗證</string>
|
<string name="verify_integrity">完整性驗證</string>
|
||||||
|
<string name="verifying">驗證中...</string>
|
||||||
<string name="verify_success">完整性驗證成功!</string>
|
<string name="verify_success">完整性驗證成功!</string>
|
||||||
<string name="verify_failure">完整性驗證失敗!</string>
|
<string name="verify_failure">完整性驗證失敗!</string>
|
||||||
<string name="verify_failure_description">文件可能已經損壞</string>
|
<string name="verify_failure_description">文件可能已經損壞</string>
|
||||||
<string name="verify_no_result">無法執行完整性驗證</string>
|
<string name="verify_no_result">無法正常執行完整性驗證</string>
|
||||||
<string name="verify_no_result_description">未檢查文件的完整性</string>
|
<string name="verify_no_result_description">未完成文件完整性檢查</string>
|
||||||
<string name="verification_failed_for">以下文件的完整性驗證失敗:\n %1$s</string>
|
<string name="verification_failed_for">以下文件的完整性驗證失敗:\n %1$s</string>
|
||||||
<string name="share_game_settings">分享設定</string>
|
<string name="share_game_settings">分享設定</string>
|
||||||
<string name="import_config">導入設定</string>
|
<string name="import_config">導入設定</string>
|
||||||
@@ -859,13 +900,13 @@
|
|||||||
<!-- ROM loading errors -->
|
<!-- ROM loading errors -->
|
||||||
<string name="loader_error_encrypted">您的 ROM 已加密</string>
|
<string name="loader_error_encrypted">您的 ROM 已加密</string>
|
||||||
<string name="loader_error_encrypted_roms_description"><![CDATA[請按照指南重新轉儲您的<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">遊戲卡</a>或<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">數位版遊戲</a>。]]></string>
|
<string name="loader_error_encrypted_roms_description"><![CDATA[請按照指南重新轉儲您的<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-physical-titles-game-cards\">遊戲卡</a>或<a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-digital-titles-eshop\">數位版遊戲</a>。]]></string>
|
||||||
<string name="loader_error_encrypted_keys_description"><![CDATA[請確保您的 <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案已安裝,讓遊戲可以解密。]]></string>
|
<string name="loader_error_encrypted_keys_description"><![CDATA[請確保您的 <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> 檔案已安裝,讓遊戲可以正常解密]]></string>
|
||||||
<string name="loader_error_video_core">初始化視訊核心時發生錯誤</string>
|
<string name="loader_error_video_core">初始化視訊核心時發生錯誤</string>
|
||||||
<string name="loader_error_video_core_description">這經常是因為不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。</string>
|
<string name="loader_error_video_core_description">這經常是因為不相容的 GPU 驅動程式造成,安裝自訂 GPU 驅動程式可能會解決此問題。</string>
|
||||||
<string name="loader_error_file_not_found">ROM 檔案不存在</string>
|
<string name="loader_error_file_not_found">ROM 檔案不存在</string>
|
||||||
|
|
||||||
<string name="loader_requires_firmware">遊戲需要韌體</string>
|
<string name="loader_requires_firmware">遊戲需要韌體</string>
|
||||||
<string name="loader_requires_firmware_description"><![CDATA[您嘗試啟動的遊戲需要韌體才能啟動或通過遊戲主選單。請<a href=\"https://yuzu-mirror.github.io/help/quickstart\">轉儲並安裝韌體</a>,或點擊\"確定\"繼續。]]></string>
|
<string name="loader_requires_firmware_description"><![CDATA[您嘗試啟動的遊戲需要韌體才能正常運作,而您並未安裝任何韌體。請於遊戲啟動前安裝韌體或按\"確定\"強制啟動遊戲]]></string>
|
||||||
|
|
||||||
<!-- Intent Launch strings -->
|
<!-- Intent Launch strings -->
|
||||||
<string name="searching_for_game">正在搜尋遊戲...</string>
|
<string name="searching_for_game">正在搜尋遊戲...</string>
|
||||||
@@ -887,15 +928,15 @@
|
|||||||
<string name="config_write_failed">設定寫入失敗</string>
|
<string name="config_write_failed">設定寫入失敗</string>
|
||||||
<string name="config_apply_failed">套用設定失敗</string>
|
<string name="config_apply_failed">套用設定失敗</string>
|
||||||
<string name="config_already_exists_title">設定已存在</string>
|
<string name="config_already_exists_title">設定已存在</string>
|
||||||
<string name="config_already_exists_message">%1$s已存在自訂設定\n\n您要覆寫它嗎?\n\n這個動作無法復原</string>
|
<string name="config_already_exists_message">%1$s已存在自訂設定\n\n您要取代它嗎?\n\n這個動作無法復原</string>
|
||||||
<string name="config_exists_prompt">正在檢查現有設定...</string>
|
<string name="config_exists_prompt">正在檢查現有設定...</string>
|
||||||
<string name="overwrite_cancelled">覆寫已取消</string>
|
<string name="overwrite_cancelled">已取消取代該設定</string>
|
||||||
<string name="overwrite">覆寫</string>
|
<string name="overwrite">取代</string>
|
||||||
|
|
||||||
<!-- Driver strings -->
|
<!-- Driver strings -->
|
||||||
<string name="driver_not_found">未安裝所需的驅動程式: %s</string>
|
<string name="driver_not_found">未安裝所需的驅動程式: %s</string>
|
||||||
<string name="invalid_driver_file">無效的驅動程式檔案: %s</string>
|
<string name="invalid_driver_file">無效的驅動程式檔案: %s</string>
|
||||||
<string name="network_unavailable">無可用網路連線。請檢查您的網路連線並重試。</string>
|
<string name="network_unavailable">無可用網路連線。請檢查您的網路連線並重試</string>
|
||||||
<string name="driver_missing_title">需要GPU驅動程式</string>
|
<string name="driver_missing_title">需要GPU驅動程式</string>
|
||||||
<string name="driver_missing_message">這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎?</string>
|
<string name="driver_missing_message">這個遊戲的設定需要 \"%s\"驅動程式,而它並沒有安裝在您的裝置上\n\n要下載並安裝此驅動程式嗎?</string>
|
||||||
<string name="driver_download_cancelled">驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。</string>
|
<string name="driver_download_cancelled">驅動程式下載已取消。沒有所需的驅動程式無法啟動遊戲。</string>
|
||||||
@@ -907,7 +948,7 @@
|
|||||||
<string name="emulation_toggle_controls">切換控制</string>
|
<string name="emulation_toggle_controls">切換控制</string>
|
||||||
<string name="emulation_rel_stick_center">相對搖桿中心</string>
|
<string name="emulation_rel_stick_center">相對搖桿中心</string>
|
||||||
<string name="emulation_dpad_slide">方向鍵滑動</string>
|
<string name="emulation_dpad_slide">方向鍵滑動</string>
|
||||||
<string name="emulation_haptics">觸覺回饋技術</string>
|
<string name="emulation_haptics">觸覺回饋</string>
|
||||||
<string name="emulation_show_overlay">顯示虛擬按鍵</string>
|
<string name="emulation_show_overlay">顯示虛擬按鍵</string>
|
||||||
<string name="emulation_hide_overlay">隱藏虛擬按鍵</string>
|
<string name="emulation_hide_overlay">隱藏虛擬按鍵</string>
|
||||||
<string name="emulation_toggle_all">全部切換</string>
|
<string name="emulation_toggle_all">全部切換</string>
|
||||||
@@ -916,8 +957,9 @@
|
|||||||
<string name="emulation_control_opacity">不透明度</string>
|
<string name="emulation_control_opacity">不透明度</string>
|
||||||
<string name="emulation_touch_overlay_reset">重設虛擬按鍵</string>
|
<string name="emulation_touch_overlay_reset">重設虛擬按鍵</string>
|
||||||
<string name="emulation_touch_overlay_edit">編輯虛擬按鍵</string>
|
<string name="emulation_touch_overlay_edit">編輯虛擬按鍵</string>
|
||||||
|
<string name="emulation_snap_to_grid">對齊網格</string>
|
||||||
<string name="emulation_pause">暫停模擬</string>
|
<string name="emulation_pause">暫停模擬</string>
|
||||||
<string name="emulation_unpause">取消暫停模擬</string>
|
<string name="emulation_unpause">繼續模擬</string>
|
||||||
<string name="emulation_input_overlay">疊加層/虛擬按鍵設定</string>
|
<string name="emulation_input_overlay">疊加層/虛擬按鍵設定</string>
|
||||||
<string name="load_amiibo">導入Amiibo</string>
|
<string name="load_amiibo">導入Amiibo</string>
|
||||||
<string name="touchscreen">觸控螢幕</string>
|
<string name="touchscreen">觸控螢幕</string>
|
||||||
|
|||||||
@@ -174,8 +174,6 @@
|
|||||||
<item>@string/frame_gen_target_rate_60</item>
|
<item>@string/frame_gen_target_rate_60</item>
|
||||||
<item>@string/frame_gen_target_rate_90</item>
|
<item>@string/frame_gen_target_rate_90</item>
|
||||||
<item>@string/frame_gen_target_rate_120</item>
|
<item>@string/frame_gen_target_rate_120</item>
|
||||||
<item>@string/frame_gen_target_rate_144</item>
|
|
||||||
<item>@string/frame_gen_target_rate_165</item>
|
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<integer-array name="frameGenTargetRateValues">
|
<integer-array name="frameGenTargetRateValues">
|
||||||
@@ -183,8 +181,12 @@
|
|||||||
<item>60</item>
|
<item>60</item>
|
||||||
<item>90</item>
|
<item>90</item>
|
||||||
<item>120</item>
|
<item>120</item>
|
||||||
<item>144</item>
|
</integer-array>
|
||||||
<item>165</item>
|
|
||||||
|
<integer-array name="frameGenFlowScaleValues">
|
||||||
|
<item>50</item>
|
||||||
|
<item>75</item>
|
||||||
|
<item>100</item>
|
||||||
</integer-array>
|
</integer-array>
|
||||||
|
|
||||||
<string-array name="frameGenQueueTargetNames">
|
<string-array name="frameGenQueueTargetNames">
|
||||||
@@ -589,54 +591,6 @@
|
|||||||
<item>2</item>
|
<item>2</item>
|
||||||
</integer-array>
|
</integer-array>
|
||||||
|
|
||||||
<string-array name="gpuTextureSizeSwizzleEntries">
|
|
||||||
<item>@string/gpu_texturesizeswizzle_verysmall</item>
|
|
||||||
<item>@string/gpu_texturesizeswizzle_small</item>
|
|
||||||
<item>@string/gpu_texturesizeswizzle_normal</item>
|
|
||||||
<item>@string/gpu_texturesizeswizzle_large</item>
|
|
||||||
<item>@string/gpu_texturesizeswizzle_verylarge</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<integer-array name="gpuTextureSizeSwizzleValues">
|
|
||||||
<item>0</item>
|
|
||||||
<item>1</item>
|
|
||||||
<item>2</item>
|
|
||||||
<item>3</item>
|
|
||||||
<item>4</item>
|
|
||||||
</integer-array>
|
|
||||||
|
|
||||||
<string-array name="gpuSwizzleEntries">
|
|
||||||
<item>@string/gpu_swizzle_verylow</item>
|
|
||||||
<item>@string/gpu_swizzle_low</item>
|
|
||||||
<item>@string/gpu_swizzle_normal</item>
|
|
||||||
<item>@string/gpu_swizzle_medium</item>
|
|
||||||
<item>@string/gpu_swizzle_high</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<integer-array name="gpuSwizzleValues">
|
|
||||||
<item>0</item>
|
|
||||||
<item>1</item>
|
|
||||||
<item>2</item>
|
|
||||||
<item>3</item>
|
|
||||||
<item>4</item>
|
|
||||||
</integer-array>
|
|
||||||
|
|
||||||
<string-array name="gpuSwizzleChunkEntries">
|
|
||||||
<item>@string/gpu_swizzlechunk_verylow</item>
|
|
||||||
<item>@string/gpu_swizzlechunk_low</item>
|
|
||||||
<item>@string/gpu_swizzlechunk_normal</item>
|
|
||||||
<item>@string/gpu_swizzlechunk_medium</item>
|
|
||||||
<item>@string/gpu_swizzlechunk_high</item>
|
|
||||||
</string-array>
|
|
||||||
|
|
||||||
<integer-array name="gpuSwizzleChunkValues">
|
|
||||||
<item>0</item>
|
|
||||||
<item>1</item>
|
|
||||||
<item>2</item>
|
|
||||||
<item>3</item>
|
|
||||||
<item>4</item>
|
|
||||||
</integer-array>
|
|
||||||
|
|
||||||
<string-array name="temperatureUnitEntries">
|
<string-array name="temperatureUnitEntries">
|
||||||
<item>@string/temperature_celsius</item>
|
<item>@string/temperature_celsius</item>
|
||||||
<item>@string/temperature_fahrenheit</item>
|
<item>@string/temperature_fahrenheit</item>
|
||||||
|
|||||||
@@ -105,6 +105,8 @@
|
|||||||
<string name="use_sync_core_description">Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed.</string>
|
<string name="use_sync_core_description">Synchronize the core tick speed to the maximum speed percentage to improve performance without altering the game\'s actual speed.</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu">Enable Host MMU Emulation</string>
|
<string name="cpuopt_unsafe_host_mmu">Enable Host MMU Emulation</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu_description">This optimization speeds up memory accesses by the guest program. Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host\'s MMU. Disabling this forces all memory accesses to use Software MMU Emulation.</string>
|
<string name="cpuopt_unsafe_host_mmu_description">This optimization speeds up memory accesses by the guest program. Enabling it causes guest memory reads/writes to be done directly into memory and make use of Host\'s MMU. Disabling this forces all memory accesses to use Software MMU Emulation.</string>
|
||||||
|
<string name="relocate_36bit_address_space">Run 36-bit games natively</string>
|
||||||
|
<string name="relocate_36bit_address_space_description">Gives games built for the 36-bit address space the 39-bit layout so they can run with NCE instead of the JIT. Experimental: a game that relies on 36-bit addresses can crash.</string>
|
||||||
<string name="debug_knobs">Debug knobs</string>
|
<string name="debug_knobs">Debug knobs</string>
|
||||||
<string name="debug_knobs_description">For development use only.</string>
|
<string name="debug_knobs_description">For development use only.</string>
|
||||||
<string name="debug_knobs_hint">0 to 65535</string>
|
<string name="debug_knobs_hint">0 to 65535</string>
|
||||||
@@ -331,8 +333,13 @@
|
|||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
<string name="frame_gen_target_rate_144">144 FPS</string>
|
<string name="frame_gen_on">On</string>
|
||||||
<string name="frame_gen_target_rate_165">165 FPS</string>
|
<string name="frame_gen_off">Off</string>
|
||||||
|
<string name="frame_gen_fixed">Fixed</string>
|
||||||
|
<string name="frame_gen_flow_auto">Auto</string>
|
||||||
|
<string name="frame_gen_quick_description">Turn frame generation on or off and choose the frame multiplier.</string>
|
||||||
|
<string name="frame_gen_target_rate_quick_description">Generate frames up to a target frame rate. The multiplier adjusts on its own.</string>
|
||||||
|
<string name="frame_gen_flow_scale_quick_description">Resolution used to estimate motion between frames. Lower values save GPU time.</string>
|
||||||
<string name="frame_gen_queue_target">Frame queue target</string>
|
<string name="frame_gen_queue_target">Frame queue target</string>
|
||||||
<string name="frame_gen_queue_target_description">How many finished frames may wait ahead of the display. Larger queues absorb GPU spikes at the cost of input latency.</string>
|
<string name="frame_gen_queue_target_description">How many finished frames may wait ahead of the display. Larger queues absorb GPU spikes at the cost of input latency.</string>
|
||||||
<string name="frame_gen_queue_target_0">Lowest latency (Unbuffered)</string>
|
<string name="frame_gen_queue_target_0">Lowest latency (Unbuffered)</string>
|
||||||
@@ -341,20 +348,16 @@
|
|||||||
<string name="frame_gen_flow_scale_auto">Match motion estimation to the game</string>
|
<string name="frame_gen_flow_scale_auto">Match motion estimation to the game</string>
|
||||||
<string name="frame_gen_flow_scale_auto_description">Estimate motion at the resolution the game actually renders instead of the upscaled output. Costs nothing in accuracy, since upscaling adds no motion detail.</string>
|
<string name="frame_gen_flow_scale_auto_description">Estimate motion at the resolution the game actually renders instead of the upscaled output. Costs nothing in accuracy, since upscaling adds no motion detail.</string>
|
||||||
<string name="frame_gen_flow_scale">Motion estimation resolution</string>
|
<string name="frame_gen_flow_scale">Motion estimation resolution</string>
|
||||||
<string name="frame_gen_flow_scale_description">Resolution of the optical flow pass, as a fraction of the output. Lowering it is the cheapest way to reclaim performance.</string>
|
<string name="frame_gen_flow_scale_description">Resolution of the optical flow pass, as a fraction of the game\'s render resolution. Lowering it is the cheapest way to reclaim performance.</string>
|
||||||
<string name="frame_gen_fp16">Half precision shaders</string>
|
|
||||||
<string name="frame_gen_fp16_description">Use the 16-bit shader variant. Falls back automatically if the driver or the file lacks it.</string>
|
|
||||||
<string name="frame_gen_dump_flow">Dump generated frame</string>
|
|
||||||
<string name="frame_gen_dump_flow_description">Write the optical flow mip levels and the interpolated frame to the lossless/debug folder once, for troubleshooting</string>
|
|
||||||
<string name="frame_gen_unsupported">Frame generation unavailable</string>
|
<string name="frame_gen_unsupported">Frame generation unavailable</string>
|
||||||
<string name="frame_gen_unsupported_description">This GPU driver does not support the Vulkan memory model, which the Lossless Scaling shaders require.</string>
|
<string name="frame_gen_unsupported_description">This GPU driver lacks the Vulkan memory model or half precision (float16) support that the Lossless Scaling shaders require.</string>
|
||||||
<string name="lossless_scaling_setup_description">Optional. Provide your own Lossless.dll to enable frame generation later</string>
|
<string name="lossless_scaling_setup_description">Optional. Provide your own Lossless.dll to enable frame generation later</string>
|
||||||
<string name="lossless_scaling_install">Install Lossless.dll</string>
|
<string name="lossless_scaling_install">Install Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">Frame generation needs your own legal copy of Lossless.dll from Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">Frame generation needs your own legal copy of Lossless.dll from Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">Select a different copy of Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">Select a different copy of Lossless.dll</string>
|
||||||
<string name="frame_generation_support">Frame generation</string>
|
<string name="frame_generation_support">Frame generation</string>
|
||||||
<string name="frame_generation_supported">Supported</string>
|
<string name="frame_generation_supported">Supported</string>
|
||||||
<string name="frame_generation_unsupported">Unsupported (no Vulkan memory model)</string>
|
<string name="frame_generation_unsupported">Unsupported (no Vulkan memory model or float16)</string>
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">Provide your own copy of Lossless.dll to enable frame generation</string>
|
<string name="lossless_scaling_description">Provide your own copy of Lossless.dll to enable frame generation</string>
|
||||||
<string name="lossless_scaling_installed">Installed</string>
|
<string name="lossless_scaling_installed">Installed</string>
|
||||||
@@ -572,6 +575,8 @@
|
|||||||
<string name="accelerate_astc_description">Pick how ASTC-compressed textures are decoded for rendering: CPU (slow, safe), GPU (fast, recommended), or CPU Async (no stutters, may cause issues)</string>
|
<string name="accelerate_astc_description">Pick how ASTC-compressed textures are decoded for rendering: CPU (slow, safe), GPU (fast, recommended), or CPU Async (no stutters, may cause issues)</string>
|
||||||
|
|
||||||
<string name="sync_memory_operations">Sync Memory Operations</string>
|
<string name="sync_memory_operations">Sync Memory Operations</string>
|
||||||
|
<string name="stall_on_gpu_fence_wait">Pause CPU on GPU fence timeouts</string>
|
||||||
|
<string name="stall_on_gpu_fence_wait_description">When a game keeps timing out while waiting for the GPU, pauses every CPU thread until the GPU catches up. Disabling it keeps the other threads running, which can reduce stutter but may break games that rely on it.</string>
|
||||||
<string name="sync_memory_operations_description">Ensures data consistency between compute and memory operations. This option should fix issues in some games, but may also reduce performance in some cases. Unreal Engine 4 games often see the most significant changes thereof.</string>
|
<string name="sync_memory_operations_description">Ensures data consistency between compute and memory operations. This option should fix issues in some games, but may also reduce performance in some cases. Unreal Engine 4 games often see the most significant changes thereof.</string>
|
||||||
<string name="use_disk_shader_cache">Disk shader cache</string>
|
<string name="use_disk_shader_cache">Disk shader cache</string>
|
||||||
<string name="use_disk_shader_cache_description">Reduces stuttering by locally storing and loading generated shaders.</string>
|
<string name="use_disk_shader_cache_description">Reduces stuttering by locally storing and loading generated shaders.</string>
|
||||||
@@ -579,13 +584,15 @@
|
|||||||
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
||||||
<string name="renderer_async_presentation">Asynchronous presentation</string>
|
|
||||||
<string name="renderer_async_presentation_description">This hack can increase performance by moving presentation to a separate CPU thread at the cost of graphical issues.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
||||||
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
||||||
|
<string name="renderer_barrier_feedback_loops">Barrier feedback loops</string>
|
||||||
|
<string name="renderer_barrier_feedback_loops_description">Improves rendering of transparency effects in specific games at the cost of performance.</string>
|
||||||
<string name="enable_buffer_history">Enable buffer history</string>
|
<string name="enable_buffer_history">Enable buffer history</string>
|
||||||
<string name="enable_buffer_history_description">Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games.</string>
|
<string name="enable_buffer_history_description">Enables access to previous buffer states. This option may improve rendering quality and performance consistency in some games.</string>
|
||||||
<string name="enable_gpu_buffer_readback">Enable GPU Buffer Readback</string>
|
<string name="enable_gpu_buffer_readback">Enable GPU Buffer Readback</string>
|
||||||
|
<string name="use_unified_memory">Unified Memory</string>
|
||||||
|
<string name="use_unified_memory_description">Backs part of the emulated memory with GPU-shared buffers so textures are unswizzled directly from it, skipping a CPU copy. Needs 12 GB of RAM or more and a GPU with I/O coherency; it turns itself off otherwise. Takes effect on the next game launch.</string>
|
||||||
<string name="enable_gpu_buffer_readback_description">Preserves GPU-modified buffer data by reading it back before uploads. Some games require this to render certain effects properly. May cause issues if the hardware cannot handle the additional workload.</string>
|
<string name="enable_gpu_buffer_readback_description">Preserves GPU-modified buffer data by reading it back before uploads. Some games require this to render certain effects properly. May cause issues if the hardware cannot handle the additional workload.</string>
|
||||||
<string name="use_optimized_vertex_buffers">Optimized Vertex Buffers</string>
|
<string name="use_optimized_vertex_buffers">Optimized Vertex Buffers</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers (25.3 and below).</string>
|
<string name="use_optimized_vertex_buffers_description">Enables optimized vertex buffer binding for improved performance. Requires Mesa 26.0+ Turnip drivers/ QCOM drivers. Will crash on older Turnip drivers (25.3 and below).</string>
|
||||||
@@ -604,17 +611,6 @@
|
|||||||
<string name="rescale_hack_description">Enables a legacy handling for the rescale configuration pass for games by using a quick rescale path</string>
|
<string name="rescale_hack_description">Enables a legacy handling for the rescale configuration pass for games by using a quick rescale path</string>
|
||||||
<string name="renderer_asynchronous_shaders">Use asynchronous shaders</string>
|
<string name="renderer_asynchronous_shaders">Use asynchronous shaders</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously. This may reduce stutters but may also introduce glitches.</string>
|
<string name="renderer_asynchronous_shaders_description">Compiles shaders asynchronously. This may reduce stutters but may also introduce glitches.</string>
|
||||||
<string name="gpu_unswizzle_settings">GPU Unswizzle Settings</string>
|
|
||||||
<string name="gpu_unswizzle_settings_description">Configure GPU-based texture unswizzling parameters or disable it entirely. Adjust these settings to balance performance and texture loading quality.</string>
|
|
||||||
<string name="gpu_unswizzle_enable">Enable GPU Unswizzle</string>
|
|
||||||
<string name="gpu_unswizzle_disabled">Disabled</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle Max Texture Size</string>
|
|
||||||
<string name="gpu_unswizzle_texture_size_description">Sets the maximum size (MB) for GPU-based texture unswizzling. While the GPU is faster for medium and large textures, the CPU may be more efficient for very small ones. Adjust this to find the balance between GPU acceleration and CPU overhead.</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle Stream Size</string>
|
|
||||||
<string name="gpu_unswizzle_stream_size_description">Sets the data limit per frame for unswizzling large textures. Higher values speed up texture loading at the cost of higher frame latency; lower values reduce GPU overhead but may cause visible texture pop-in.</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle Chunk Size</string>
|
|
||||||
<string name="gpu_unswizzle_chunk_size_description">Defines the number of depth slices processed per batch for 3D textures. Increasing this improves throughput efficiency on powerful GPUs but may cause stuttering or driver timeouts on weaker hardware.</string>
|
|
||||||
<string name="gpu_unswizzle_default_button">Default</string>
|
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">Extensions</string>
|
<string name="extensions">Extensions</string>
|
||||||
@@ -1064,25 +1060,10 @@
|
|||||||
<string name="fast_gpu_high">Overclock</string>
|
<string name="fast_gpu_high">Overclock</string>
|
||||||
|
|
||||||
<!-- GPU swizzle texture size -->
|
<!-- GPU swizzle texture size -->
|
||||||
<string name="gpu_texturesizeswizzle_verysmall">Very Small (16 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_small">Small (32 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_normal">Normal (128 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_large">Large (256 MB)</string>
|
|
||||||
<string name="gpu_texturesizeswizzle_verylarge">Very Large (512 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle streams -->
|
<!-- GPU swizzle streams -->
|
||||||
<string name="gpu_swizzle_verylow">Very Low (4 MB)</string>
|
|
||||||
<string name="gpu_swizzle_low">Low (8 MB)</string>
|
|
||||||
<string name="gpu_swizzle_normal">Normal (16 MB)</string>
|
|
||||||
<string name="gpu_swizzle_medium">Medium (32 MB)</string>
|
|
||||||
<string name="gpu_swizzle_high">High (64 MB)</string>
|
|
||||||
|
|
||||||
<!-- GPU swizzle chunks -->
|
<!-- GPU swizzle chunks -->
|
||||||
<string name="gpu_swizzlechunk_verylow">Very Low (32)</string>
|
|
||||||
<string name="gpu_swizzlechunk_low">Low (64)</string>
|
|
||||||
<string name="gpu_swizzlechunk_normal">Normal (128)</string>
|
|
||||||
<string name="gpu_swizzlechunk_medium">Medium (256)</string>
|
|
||||||
<string name="gpu_swizzlechunk_high">High (512)</string>
|
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Celsius</string>
|
<string name="temperature_celsius">Celsius</string>
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|||||||
@@ -261,6 +261,7 @@ SinkStream* CubebSink::AcquireSinkStream(Core::System& system, u32 system_channe
|
|||||||
system_channels = system_channels_;
|
system_channels = system_channels_;
|
||||||
SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique<CubebSinkStream>(
|
SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique<CubebSinkStream>(
|
||||||
ctx, device_channels, system_channels, output_device, input_device, name, type, system));
|
ctx, device_channels, system_channels, output_device, input_device, name, type, system));
|
||||||
|
stream->SetDeviceVolume(device_volume);
|
||||||
|
|
||||||
return stream.get();
|
return stream.get();
|
||||||
}
|
}
|
||||||
@@ -280,14 +281,11 @@ void CubebSink::CloseStreams() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
f32 CubebSink::GetDeviceVolume() const {
|
f32 CubebSink::GetDeviceVolume() const {
|
||||||
if (sink_streams.empty()) {
|
return device_volume;
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sink_streams[0]->GetDeviceVolume();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CubebSink::SetDeviceVolume(f32 volume) {
|
void CubebSink::SetDeviceVolume(f32 volume) {
|
||||||
|
device_volume = volume;
|
||||||
for (auto& stream : sink_streams) {
|
for (auto& stream : sink_streams) {
|
||||||
stream->SetDeviceVolume(volume);
|
stream->SetDeviceVolume(volume);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -38,6 +41,7 @@ public:
|
|||||||
StreamType type) override {
|
StreamType type) override {
|
||||||
if (null_sink == nullptr) {
|
if (null_sink == nullptr) {
|
||||||
null_sink = std::make_unique<NullSinkStreamImpl>(system, type);
|
null_sink = std::make_unique<NullSinkStreamImpl>(system, type);
|
||||||
|
null_sink->SetDeviceVolume(device_volume);
|
||||||
}
|
}
|
||||||
return null_sink.get();
|
return null_sink.get();
|
||||||
}
|
}
|
||||||
@@ -45,9 +49,14 @@ public:
|
|||||||
void CloseStream(SinkStream*) override {}
|
void CloseStream(SinkStream*) override {}
|
||||||
void CloseStreams() override {}
|
void CloseStreams() override {}
|
||||||
f32 GetDeviceVolume() const override {
|
f32 GetDeviceVolume() const override {
|
||||||
return 1.0f;
|
return device_volume;
|
||||||
|
}
|
||||||
|
void SetDeviceVolume(f32 volume) override {
|
||||||
|
device_volume = volume;
|
||||||
|
if (null_sink != nullptr) {
|
||||||
|
null_sink->SetDeviceVolume(volume);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void SetDeviceVolume(f32 volume) override {}
|
|
||||||
void SetSystemVolume(f32 volume) override {}
|
void SetSystemVolume(f32 volume) override {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -246,6 +246,7 @@ SinkStream* SDLSink::AcquireSinkStream(Core::System& system, u32 system_channels
|
|||||||
system_channels = system_channels_;
|
system_channels = system_channels_;
|
||||||
SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique<SDLSinkStream>(
|
SinkStreamPtr& stream = sink_streams.emplace_back(std::make_unique<SDLSinkStream>(
|
||||||
device_channels, system_channels, output_device, input_device, type, system));
|
device_channels, system_channels, output_device, input_device, type, system));
|
||||||
|
stream->SetDeviceVolume(device_volume);
|
||||||
return stream.get();
|
return stream.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,14 +265,11 @@ void SDLSink::CloseStreams() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
f32 SDLSink::GetDeviceVolume() const {
|
f32 SDLSink::GetDeviceVolume() const {
|
||||||
if (sink_streams.empty()) {
|
return device_volume;
|
||||||
return 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sink_streams[0]->GetDeviceVolume();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDLSink::SetDeviceVolume(f32 volume) {
|
void SDLSink::SetDeviceVolume(f32 volume) {
|
||||||
|
device_volume = volume;
|
||||||
for (auto& stream : sink_streams) {
|
for (auto& stream : sink_streams) {
|
||||||
stream->SetDeviceVolume(volume);
|
stream->SetDeviceVolume(volume);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -96,6 +99,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/// Master volume, persists stream lifetimes
|
||||||
|
f32 device_volume{1.0f};
|
||||||
/// Number of device channels supported by the hardware
|
/// Number of device channels supported by the hardware
|
||||||
u32 device_channels{2};
|
u32 device_channels{2};
|
||||||
/// Number of channels the game is sending
|
/// Number of channels the game is sending
|
||||||
|
|||||||
@@ -108,8 +108,6 @@ add_library(
|
|||||||
settings_setting.h
|
settings_setting.h
|
||||||
slot_vector.h
|
slot_vector.h
|
||||||
socket_types.h
|
socket_types.h
|
||||||
sparse_large_vector.cpp
|
|
||||||
sparse_large_vector.h
|
|
||||||
spin_lock.h
|
spin_lock.h
|
||||||
stb.cpp
|
stb.cpp
|
||||||
stb.h
|
stb.h
|
||||||
@@ -139,6 +137,8 @@ add_library(
|
|||||||
uuid.cpp
|
uuid.cpp
|
||||||
uuid.h
|
uuid.h
|
||||||
vector_math.h
|
vector_math.h
|
||||||
|
virtual_buffer.cpp
|
||||||
|
virtual_buffer.h
|
||||||
zstd_compression.cpp
|
zstd_compression.cpp
|
||||||
zstd_compression.h
|
zstd_compression.h
|
||||||
fs/ryujinx_compat.h fs/ryujinx_compat.cpp
|
fs/ryujinx_compat.h fs/ryujinx_compat.cpp
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/fiber.h"
|
#include "common/fiber.h"
|
||||||
|
#include "common/virtual_buffer.h"
|
||||||
|
|
||||||
#include <boost/context/detail/fcontext.hpp>
|
#include <boost/context/detail/fcontext.hpp>
|
||||||
|
|
||||||
|
|||||||
+13
-41
@@ -178,14 +178,6 @@ public:
|
|||||||
Release();
|
Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Allocate(size_t size) {
|
|
||||||
auto* ptr = VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
|
||||||
if (ptr == nullptr) {
|
|
||||||
LOG_CRITICAL(HW_Memory, "Failed to allocate fallback buffer with size {:#x}, error {}", size, GetLastError());
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) {
|
void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) {
|
||||||
std::unique_lock lock{placeholder_mutex};
|
std::unique_lock lock{placeholder_mutex};
|
||||||
if (!IsNiechePlaceholder(virtual_offset, length)) {
|
if (!IsNiechePlaceholder(virtual_offset, length)) {
|
||||||
@@ -406,10 +398,6 @@ private:
|
|||||||
// For managarm: see https://github.com/managarm/managarm/issues/1370
|
// For managarm: see https://github.com/managarm/managarm/issues/1370
|
||||||
#else // ^^^ Windows ^^^ vvv POSIX vvv
|
#else // ^^^ Windows ^^^ vvv POSIX vvv
|
||||||
|
|
||||||
#ifndef MAP_NOCORE
|
|
||||||
#define MAP_NOCORE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ARCHITECTURE_arm64
|
#ifdef ARCHITECTURE_arm64
|
||||||
|
|
||||||
static void* ChooseVirtualBase(size_t virtual_size) {
|
static void* ChooseVirtualBase(size_t virtual_size) {
|
||||||
@@ -434,7 +422,7 @@ static void* ChooseVirtualBase(size_t virtual_size) {
|
|||||||
// Note: we may be able to take advantage of MAP_FIXED_NOREPLACE here.
|
// Note: we may be able to take advantage of MAP_FIXED_NOREPLACE here.
|
||||||
void* map_pointer =
|
void* map_pointer =
|
||||||
mmap(reinterpret_cast<void*>(hint_address), virtual_size, PROT_READ | PROT_WRITE,
|
mmap(reinterpret_cast<void*>(hint_address), virtual_size, PROT_READ | PROT_WRITE,
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_NOCORE, -1, 0);
|
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
|
||||||
|
|
||||||
// If we successfully mapped, we're done.
|
// If we successfully mapped, we're done.
|
||||||
if (reinterpret_cast<uintptr_t>(map_pointer) == hint_address) {
|
if (reinterpret_cast<uintptr_t>(map_pointer) == hint_address) {
|
||||||
@@ -454,11 +442,11 @@ static void* ChooseVirtualBase(size_t virtual_size) {
|
|||||||
|
|
||||||
static void* ChooseVirtualBase(size_t virtual_size) {
|
static void* ChooseVirtualBase(size_t virtual_size) {
|
||||||
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__)
|
#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) || defined(__sun__) || defined(__HAIKU__) || defined(__managarm__) || defined(__AIX__)
|
||||||
void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER | MAP_NOCORE, -1, 0);
|
void* virtual_base = mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_ALIGNED_SUPER, -1, 0);
|
||||||
if (virtual_base != MAP_FAILED)
|
if (virtual_base != MAP_FAILED)
|
||||||
return virtual_base;
|
return virtual_base;
|
||||||
#endif
|
#endif
|
||||||
return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE | MAP_NOCORE, -1, 0);
|
return mmap(nullptr, virtual_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -552,13 +540,13 @@ public:
|
|||||||
}
|
}
|
||||||
if (use_anon) {
|
if (use_anon) {
|
||||||
LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones");
|
LOG_WARNING(Common_Memory, "Using private mappings instead of shared ones");
|
||||||
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NOCORE, -1, 0));
|
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0));
|
||||||
if (fd > 0) {
|
if (fd > 0) {
|
||||||
fd = -1;
|
fd = -1;
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_NOCORE, fd, 0));
|
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));
|
||||||
}
|
}
|
||||||
if (backing_base == MAP_FAILED) {
|
if (backing_base == MAP_FAILED) {
|
||||||
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
|
||||||
@@ -582,14 +570,6 @@ public:
|
|||||||
Release();
|
Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void* Allocate(size_t size) {
|
|
||||||
auto* ptr = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
|
||||||
if (ptr == MAP_FAILED) {
|
|
||||||
LOG_CRITICAL(HW_Memory, "Failed to allocate fallback buffer with size {:#x}, {}", size, strerror(errno));
|
|
||||||
}
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) {
|
void Map(size_t virtual_offset, size_t host_offset, size_t length, MemoryPermission perms) {
|
||||||
// Intersect the range with our address space.
|
// Intersect the range with our address space.
|
||||||
AdjustMap(&virtual_offset, &length);
|
AdjustMap(&virtual_offset, &length);
|
||||||
@@ -710,10 +690,12 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_)
|
|||||||
{
|
{
|
||||||
#if defined(__OPENORBIS__) || defined(__managarm__)
|
#if defined(__OPENORBIS__) || defined(__managarm__)
|
||||||
LOG_WARNING(HW_Memory, "Platform doesn't support fastmem");
|
LOG_WARNING(HW_Memory, "Platform doesn't support fastmem");
|
||||||
backing_base = static_cast<u8*>(mmap(nullptr, backing_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
|
fallback_buffer.emplace(backing_size);
|
||||||
|
backing_base = fallback_buffer->data();
|
||||||
virtual_base = nullptr;
|
virtual_base = nullptr;
|
||||||
#else
|
#else
|
||||||
// Try to allocate a fastmem arena.
|
// Try to allocate a fastmem arena.
|
||||||
|
// The implementation will fail with std::bad_alloc on errors.
|
||||||
impl = std::make_unique<HostMemory::Impl>(AlignUp(backing_size, PageAlignment), AlignUp(virtual_size, PageAlignment) + HugePageSize);
|
impl = std::make_unique<HostMemory::Impl>(AlignUp(backing_size, PageAlignment), AlignUp(virtual_size, PageAlignment) + HugePageSize);
|
||||||
if (impl->Init()) {
|
if (impl->Init()) {
|
||||||
backing_base = impl->backing_base;
|
backing_base = impl->backing_base;
|
||||||
@@ -724,26 +706,16 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_)
|
|||||||
virtual_base_offset = virtual_base - impl->virtual_base;
|
virtual_base_offset = virtual_base - impl->virtual_base;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_WARNING(HW_Memory, "Platform can support fastmem, but can't create it");
|
|
||||||
fallback_buffer = true;
|
|
||||||
backing_base = static_cast<u8*>(impl->Allocate(backing_size));
|
|
||||||
virtual_base = nullptr;
|
|
||||||
impl.reset();
|
impl.reset();
|
||||||
|
LOG_WARNING(HW_Memory, "Platform can support fastmem, but can't create it");
|
||||||
|
fallback_buffer.emplace(backing_size);
|
||||||
|
backing_base = fallback_buffer->data();
|
||||||
|
virtual_base = nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
HostMemory::~HostMemory() {
|
HostMemory::~HostMemory() = default;
|
||||||
#ifdef _WIN32
|
|
||||||
if (fallback_buffer) {
|
|
||||||
VirtualFree(backing_base, backing_size, MEM_RELEASE);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (fallback_buffer) {
|
|
||||||
munmap(backing_base, backing_size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
HostMemory::HostMemory(HostMemory&&) noexcept = default;
|
HostMemory::HostMemory(HostMemory&&) noexcept = default;
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "common/virtual_buffer.h"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ private:
|
|||||||
u8* virtual_base{};
|
u8* virtual_base{};
|
||||||
size_t virtual_base_offset{};
|
size_t virtual_base_offset{};
|
||||||
// Windows requires it for kernels whom lack proper support for some functions!
|
// Windows requires it for kernels whom lack proper support for some functions!
|
||||||
bool fallback_buffer{false};
|
std::optional<Common::VirtualBuffer<u8>> fallback_buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|||||||
@@ -13,11 +13,39 @@ PageTable::PageTable() = default;
|
|||||||
|
|
||||||
PageTable::~PageTable() noexcept = default;
|
PageTable::~PageTable() noexcept = default;
|
||||||
|
|
||||||
void PageTable::Resize(std::size_t address_space_width_in_bits, std::size_t page_bits) {
|
bool PageTable::BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context,
|
||||||
auto const num_page_table_entries = 1ULL << (address_space_width_in_bits - page_bits);
|
Common::ProcessAddress address) const {
|
||||||
entries.ResizeAndClear(num_page_table_entries);
|
out_context->next_offset = GetInteger(address);
|
||||||
|
out_context->next_page = address / page_size;
|
||||||
|
|
||||||
|
return this->ContinueTraversal(out_entry, out_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PageTable::ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const {
|
||||||
|
// Setup invalid defaults.
|
||||||
|
out_entry->phys_addr = 0;
|
||||||
|
out_entry->block_size = page_size;
|
||||||
|
// Validate that we can read the actual entry.
|
||||||
|
if (auto const page = context->next_page; page < entries.size()) {
|
||||||
|
// Validate that the entry is mapped.
|
||||||
|
if (auto const paddr = entries[page].addr; paddr != 0) {
|
||||||
|
// Populate the results.
|
||||||
|
out_entry->phys_addr = paddr + context->next_offset;
|
||||||
|
context->next_page += 1;
|
||||||
|
context->next_offset += page_size;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
context->next_page += 1;
|
||||||
|
context->next_offset += page_size;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PageTable::Resize(std::size_t address_space_width_in_bits, std::size_t page_size_in_bits) {
|
||||||
|
auto const num_page_table_entries = 1ULL << (address_space_width_in_bits - page_size_in_bits);
|
||||||
|
entries.resize(num_page_table_entries);
|
||||||
current_address_space_width_in_bits = address_space_width_in_bits;
|
current_address_space_width_in_bits = address_space_width_in_bits;
|
||||||
current_page_bits = page_bits;
|
page_size = 1ULL << page_size_in_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|||||||
+56
-64
@@ -9,22 +9,22 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/sparse_large_vector.h"
|
|
||||||
#include "common/typed_address.h"
|
#include "common/typed_address.h"
|
||||||
|
#include "common/virtual_buffer.h"
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
enum class PageType : u8 {
|
enum class PageType : u8 {
|
||||||
/// Page is unmapped and should cause an access error.
|
/// Page is unmapped and should cause an access error.
|
||||||
Unmapped = 0b00,
|
Unmapped,
|
||||||
/// Page is mapped to regular memory. This is the only type you can get pointers to.
|
/// Page is mapped to regular memory. This is the only type you can get pointers to.
|
||||||
Memory = 0b01,
|
Memory,
|
||||||
/// Page is mapped to regular memory, but inaccessible from CPU fastmem and must use
|
/// Page is mapped to regular memory, but inaccessible from CPU fastmem and must use
|
||||||
/// the callbacks.
|
/// the callbacks.
|
||||||
DebugMemory = 0b10,
|
DebugMemory,
|
||||||
/// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
|
/// Page is mapped to regular memory, but also needs to check for rasterizer cache flushing and
|
||||||
/// invalidation
|
/// invalidation
|
||||||
RasterizerCachedMemory = 0b11,
|
RasterizerCachedMemory,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,86 +42,57 @@ struct PageTable {
|
|||||||
u64 next_offset{};
|
u64 next_offset{};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Masks out bits reserved for attribute tagging.
|
/// Number of bits reserved for attribute tagging.
|
||||||
static constexpr u64 ATTRIBUTE_MASK = ((1ULL << 44) - 1) << 12;
|
/// This can be at most the guaranteed alignment of the pointers in the page table.
|
||||||
|
static constexpr int ATTRIBUTE_BITS = 2;
|
||||||
/// Specifies sign bit for page table entries.
|
|
||||||
static constexpr u64 SIGN_BIT = 45 + 12; // 44 bits of data + page offset
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Atomic tuple of host pointer, page type, and block id.
|
* Pair of host pointer and page type attribute.
|
||||||
* This uses the lower bits of a given pointer to store the attributes.
|
* This uses the lower bits of a given pointer to store the attribute tag.
|
||||||
* Writing and reading the pointer attribute pair is guaranteed to be atomic for the same method
|
* Writing and reading the pointer attribute pair is guaranteed to be atomic for the same method
|
||||||
* call. In other words, they are guaranteed to be synchronized at all times.
|
* call. In other words, they are guaranteed to be synchronized at all times.
|
||||||
*/
|
*/
|
||||||
class PageEntryData {
|
class PageInfo {
|
||||||
public:
|
public:
|
||||||
struct Data {
|
|
||||||
Data(bool marked_, PageType type_, u16 block_, u64 page_)
|
|
||||||
: marked(static_cast<u64>(marked_) & 0b1)
|
|
||||||
, type(static_cast<u64>(type_) & ((1ULL << 2) - 1))
|
|
||||||
, block(static_cast<u64>(block_) & ((1ULL << 9) - 1))
|
|
||||||
, page((page_ >> 12) & ((1ULL << 45) - 1))
|
|
||||||
, block2((static_cast<u64>(block_) >> 9) & ((1ULL << 7) - 1)) {}
|
|
||||||
u64 marked : 1;
|
|
||||||
u64 type : 2;
|
|
||||||
u64 block : 9;
|
|
||||||
u64 page : 45; // 44 bits of actual data (64 - page offset (12) - reserved (8)) + a sign bit
|
|
||||||
u64 block2 : 7;
|
|
||||||
};
|
|
||||||
|
|
||||||
[[nodiscard]] Data Raw() const noexcept {
|
|
||||||
return std::bit_cast<Data>(data_raw.load(std::memory_order_relaxed));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the page pointer
|
/// Returns the page pointer
|
||||||
[[nodiscard]] uintptr_t Pointer(bool ignored_marked = false) const noexcept {
|
[[nodiscard]] uintptr_t Pointer() const noexcept {
|
||||||
return ExtractPointer(std::bit_cast<Data>(data_raw.load(std::memory_order_relaxed)), ignored_marked);
|
return ExtractPointer(raw.load(std::memory_order_relaxed));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the page type attribute
|
/// Returns the page type attribute
|
||||||
[[nodiscard]] PageType Type() const noexcept {
|
[[nodiscard]] PageType Type() const noexcept {
|
||||||
return static_cast<PageType>(std::bit_cast<Data>(data_raw.load(std::memory_order_relaxed)).type);
|
return ExtractType(raw.load(std::memory_order_relaxed));
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the block identifier.
|
|
||||||
[[nodiscard]] u16 Block() const noexcept {
|
|
||||||
return ExtractBlock(std::bit_cast<Data>(data_raw.load(std::memory_order_relaxed)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the page pointer and attribute pair, extracted from the same atomic read
|
/// Returns the page pointer and attribute pair, extracted from the same atomic read
|
||||||
[[nodiscard]] std::tuple<uintptr_t, PageType, u16> PointerTypeBlock(bool ignore_marked = false) const noexcept {
|
[[nodiscard]] std::pair<uintptr_t, PageType> PointerType() const noexcept {
|
||||||
const auto non_atomic_raw = std::bit_cast<Data>(data_raw.load(std::memory_order_relaxed));
|
const uintptr_t non_atomic_raw = raw.load(std::memory_order_relaxed);
|
||||||
return {ExtractPointer(non_atomic_raw, ignore_marked), static_cast<PageType>(non_atomic_raw.type), ExtractBlock(non_atomic_raw)};
|
return {ExtractPointer(non_atomic_raw), ExtractType(non_atomic_raw)};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Write page info atomically
|
/// Returns the raw representation of the page information.
|
||||||
constexpr void Store(bool marked, PageType type, u16 block, uintptr_t pointer) noexcept {
|
/// Use ExtractPointer and ExtractType to unpack the value.
|
||||||
data_raw.store(std::bit_cast<u64>(Data{marked, type, block, pointer}));
|
[[nodiscard]] uintptr_t Raw() const noexcept {
|
||||||
|
return raw.load(std::memory_order_relaxed);
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void MarkRasterizerCached() noexcept {
|
/// Write a page pointer and type pair atomically
|
||||||
data_raw.fetch_or(0b111);
|
void Store(uintptr_t pointer, PageType type) noexcept {
|
||||||
}
|
raw.store(pointer | uintptr_t(type));
|
||||||
|
|
||||||
constexpr void MarkDebug(u64 ptr, u16 block) noexcept {
|
|
||||||
Store(true, PageType::DebugMemory, block, ptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Unpack a pointer from a page info raw representation
|
/// Unpack a pointer from a page info raw representation
|
||||||
[[nodiscard]] static uintptr_t ExtractPointer(Data raw, bool ignore_marked = false) noexcept {
|
[[nodiscard]] static uintptr_t ExtractPointer(uintptr_t raw) noexcept {
|
||||||
return raw.marked && !ignore_marked ? 0
|
return raw & (~uintptr_t{0} << ATTRIBUTE_BITS);
|
||||||
// shift raw.page's fake sign bit to the actual sign bit, then sign extend
|
|
||||||
: ((s64)(raw.page << (64 - 44))) >> (64 - 44 - 12);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] static u16 ExtractBlock(Data raw) noexcept {
|
/// Unpack a page type from a page info raw representation
|
||||||
return static_cast<u16>(raw.block | (raw.block2 << 9));
|
[[nodiscard]] static PageType ExtractType(uintptr_t raw) noexcept {
|
||||||
|
return static_cast<PageType>(raw & ((uintptr_t{1} << ATTRIBUTE_BITS) - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::atomic<u64> data_raw;
|
std::atomic<uintptr_t> raw;
|
||||||
static_assert(sizeof(Data) == sizeof(std::atomic<u64>));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
PageTable();
|
PageTable();
|
||||||
@@ -129,8 +100,13 @@ struct PageTable {
|
|||||||
|
|
||||||
PageTable(const PageTable&) = delete;
|
PageTable(const PageTable&) = delete;
|
||||||
PageTable& operator=(const PageTable&) = delete;
|
PageTable& operator=(const PageTable&) = delete;
|
||||||
PageTable(PageTable&&) noexcept = delete;
|
|
||||||
PageTable& operator=(PageTable&&) noexcept = delete;
|
PageTable(PageTable&&) noexcept = default;
|
||||||
|
PageTable& operator=(PageTable&&) noexcept = default;
|
||||||
|
|
||||||
|
bool BeginTraversal(TraversalEntry* out_entry, TraversalContext* out_context,
|
||||||
|
Common::ProcessAddress address) const;
|
||||||
|
bool ContinueTraversal(TraversalEntry* out_entry, TraversalContext* context) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resizes the page table to be able to accommodate enough pages within
|
* Resizes the page table to be able to accommodate enough pages within
|
||||||
@@ -145,14 +121,30 @@ struct PageTable {
|
|||||||
return current_address_space_width_in_bits;
|
return current_address_space_width_in_bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GetPhysicalAddress(Common::PhysicalAddress* out_phys_addr,
|
||||||
|
Common::ProcessAddress virt_addr) const {
|
||||||
|
if (virt_addr > (1ULL << this->GetAddressSpaceBits())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out_phys_addr = entries[virt_addr / page_size].addr + GetInteger(virt_addr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Vector of memory pointers backing each page. An entry can only be non-null if the
|
/// Vector of memory pointers backing each page. An entry can only be non-null if the
|
||||||
/// corresponding attribute element is of type `Memory`.
|
/// corresponding attribute element is of type `Memory`.
|
||||||
SparseLargeVector<PageEntryData> entries;
|
struct PageEntryData {
|
||||||
static_assert(sizeof(PageEntryData) == 8);
|
PageInfo ptr;
|
||||||
|
u64 block;
|
||||||
|
u64 addr;
|
||||||
|
u64 padding;
|
||||||
|
};
|
||||||
|
VirtualBuffer<PageEntryData> entries;
|
||||||
|
static_assert(sizeof(PageEntryData) == 32);
|
||||||
|
|
||||||
u8* fastmem_arena{};
|
u8* fastmem_arena{};
|
||||||
std::size_t current_address_space_width_in_bits{};
|
std::size_t current_address_space_width_in_bits{};
|
||||||
std::size_t current_page_bits{};
|
std::size_t page_size{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ SWITCHABLE(AnisotropyMode, true);
|
|||||||
SWITCHABLE(AntiAliasing, false);
|
SWITCHABLE(AntiAliasing, false);
|
||||||
SWITCHABLE(AspectRatio, true);
|
SWITCHABLE(AspectRatio, true);
|
||||||
SWITCHABLE(AstcDecodeMode, true);
|
SWITCHABLE(AstcDecodeMode, true);
|
||||||
SWITCHABLE(AstcRecompression, true);
|
|
||||||
SWITCHABLE(AudioMode, true);
|
SWITCHABLE(AudioMode, true);
|
||||||
SWITCHABLE(CpuBackend, true);
|
SWITCHABLE(CpuBackend, true);
|
||||||
SWITCHABLE(CpuAccuracy, true);
|
SWITCHABLE(CpuAccuracy, true);
|
||||||
|
|||||||
+14
-43
@@ -65,7 +65,6 @@ SWITCHABLE(AnisotropyMode, true);
|
|||||||
SWITCHABLE(AntiAliasing, false);
|
SWITCHABLE(AntiAliasing, false);
|
||||||
SWITCHABLE(AspectRatio, true);
|
SWITCHABLE(AspectRatio, true);
|
||||||
SWITCHABLE(AstcDecodeMode, true);
|
SWITCHABLE(AstcDecodeMode, true);
|
||||||
SWITCHABLE(AstcRecompression, true);
|
|
||||||
SWITCHABLE(AudioMode, true);
|
SWITCHABLE(AudioMode, true);
|
||||||
SWITCHABLE(CpuBackend, true);
|
SWITCHABLE(CpuBackend, true);
|
||||||
SWITCHABLE(CpuAccuracy, true);
|
SWITCHABLE(CpuAccuracy, true);
|
||||||
@@ -260,6 +259,8 @@ struct Values {
|
|||||||
Category::Cpu};
|
Category::Cpu};
|
||||||
SwitchableSetting<CpuAccuracy, true> cpu_accuracy{linkage, CpuAccuracy::Auto,
|
SwitchableSetting<CpuAccuracy, true> cpu_accuracy{linkage, CpuAccuracy::Auto,
|
||||||
"cpu_accuracy", Category::Cpu};
|
"cpu_accuracy", Category::Cpu};
|
||||||
|
SwitchableSetting<bool> relocate_36bit_address_space{
|
||||||
|
linkage, false, "relocate_36bit_address_space", Category::Cpu};
|
||||||
SwitchableSetting<CpuClock> cpu_clock{linkage,
|
SwitchableSetting<CpuClock> cpu_clock{linkage,
|
||||||
CpuClock::Normal,
|
CpuClock::Normal,
|
||||||
"fast_cpu_time",
|
"fast_cpu_time",
|
||||||
@@ -459,7 +460,7 @@ struct Values {
|
|||||||
&frame_gen};
|
&frame_gen};
|
||||||
|
|
||||||
SwitchableSetting<u32, true> frame_gen_queue_target{linkage,
|
SwitchableSetting<u32, true> frame_gen_queue_target{linkage,
|
||||||
1,
|
0,
|
||||||
0,
|
0,
|
||||||
2,
|
2,
|
||||||
"frame_gen_queue_target",
|
"frame_gen_queue_target",
|
||||||
@@ -469,9 +470,6 @@ struct Values {
|
|||||||
false,
|
false,
|
||||||
&frame_gen};
|
&frame_gen};
|
||||||
|
|
||||||
SwitchableSetting<bool> frame_gen_fp16{linkage, true, "frame_gen_fp16", Category::Renderer,
|
|
||||||
Specialization::Default, true, false, &frame_gen};
|
|
||||||
|
|
||||||
SwitchableSetting<bool> frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow",
|
SwitchableSetting<bool> frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow",
|
||||||
Category::Renderer};
|
Category::Renderer};
|
||||||
|
|
||||||
@@ -556,22 +554,6 @@ struct Values {
|
|||||||
"accelerate_astc",
|
"accelerate_astc",
|
||||||
Category::RendererAdvanced};
|
Category::RendererAdvanced};
|
||||||
|
|
||||||
SwitchableSetting<FramePacingMode, true> frame_pacing_mode{linkage,
|
|
||||||
FramePacingMode::Target_Auto,
|
|
||||||
FramePacingMode::Target_Auto,
|
|
||||||
FramePacingMode::Target_120,
|
|
||||||
"frame_pacing_mode",
|
|
||||||
Category::RendererAdvanced,
|
|
||||||
Specialization::Default,
|
|
||||||
true,
|
|
||||||
true};
|
|
||||||
|
|
||||||
SwitchableSetting<AstcRecompression, true> astc_recompression{linkage,
|
|
||||||
AstcRecompression::Uncompressed,
|
|
||||||
"astc_recompression",
|
|
||||||
Category::RendererAdvanced};
|
|
||||||
|
|
||||||
|
|
||||||
SwitchableSetting<bool> sync_memory_operations{linkage,
|
SwitchableSetting<bool> sync_memory_operations{linkage,
|
||||||
false,
|
false,
|
||||||
"sync_memory_operations",
|
"sync_memory_operations",
|
||||||
@@ -579,6 +561,8 @@ struct Values {
|
|||||||
Specialization::Default,
|
Specialization::Default,
|
||||||
true,
|
true,
|
||||||
true};
|
true};
|
||||||
|
SwitchableSetting<bool> stall_on_gpu_fence_wait{linkage, true, "stall_on_gpu_fence_wait",
|
||||||
|
Category::RendererAdvanced};
|
||||||
|
|
||||||
SwitchableSetting<bool> renderer_force_max_clock{linkage, false, "force_max_clock",
|
SwitchableSetting<bool> renderer_force_max_clock{linkage, false, "force_max_clock",
|
||||||
Category::RendererAdvanced};
|
Category::RendererAdvanced};
|
||||||
@@ -605,8 +589,13 @@ struct Values {
|
|||||||
"use_reactive_flushing",
|
"use_reactive_flushing",
|
||||||
Category::RendererAdvanced};
|
Category::RendererAdvanced};
|
||||||
|
|
||||||
SwitchableSetting<bool> barrier_feedback_loops{linkage, true, "barrier_feedback_loops",
|
SwitchableSetting<bool> barrier_feedback_loops{linkage,
|
||||||
Category::RendererAdvanced};
|
true,
|
||||||
|
"barrier_feedback_loops",
|
||||||
|
Category::RendererAdvanced,
|
||||||
|
Specialization::Default,
|
||||||
|
true,
|
||||||
|
true};
|
||||||
|
|
||||||
SwitchableSetting<bool> enable_buffer_history{linkage,
|
SwitchableSetting<bool> enable_buffer_history{linkage,
|
||||||
false,
|
false,
|
||||||
@@ -644,7 +633,7 @@ struct Values {
|
|||||||
true};
|
true};
|
||||||
SwitchableSetting<bool> async_presentation{linkage,
|
SwitchableSetting<bool> async_presentation{linkage,
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
false,
|
true,
|
||||||
#else
|
#else
|
||||||
false,
|
false,
|
||||||
#endif
|
#endif
|
||||||
@@ -669,25 +658,7 @@ struct Values {
|
|||||||
SwitchableSetting<bool> use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
|
SwitchableSetting<bool> use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
|
||||||
Category::RendererHacks};
|
Category::RendererHacks};
|
||||||
|
|
||||||
SwitchableSetting<GpuUnswizzleSize> gpu_unswizzle_texture_size{linkage,
|
SwitchableSetting<bool> use_unified_memory{linkage, false, "use_unified_memory",
|
||||||
GpuUnswizzleSize::Large,
|
|
||||||
"gpu_unswizzle_texture_size",
|
|
||||||
Category::RendererHacks,
|
|
||||||
Specialization::Default};
|
|
||||||
|
|
||||||
SwitchableSetting<GpuUnswizzle> gpu_unswizzle_stream_size{linkage,
|
|
||||||
GpuUnswizzle::Medium,
|
|
||||||
"gpu_unswizzle_stream_size",
|
|
||||||
Category::RendererHacks,
|
|
||||||
Specialization::Default};
|
|
||||||
|
|
||||||
SwitchableSetting<GpuUnswizzleChunk> gpu_unswizzle_chunk_size{linkage,
|
|
||||||
GpuUnswizzleChunk::Medium,
|
|
||||||
"gpu_unswizzle_chunk_size",
|
|
||||||
Category::RendererHacks,
|
|
||||||
Specialization::Default};
|
|
||||||
|
|
||||||
SwitchableSetting<bool> gpu_unswizzle_enabled{linkage, false, "gpu_unswizzle_enabled",
|
|
||||||
Category::RendererHacks};
|
Category::RendererHacks};
|
||||||
|
|
||||||
SwitchableSetting<ExtendedDynamicState> dyna_state{linkage,
|
SwitchableSetting<ExtendedDynamicState> dyna_state{linkage,
|
||||||
|
|||||||
@@ -130,8 +130,6 @@ ENUM(TimeZone, Auto, Default, Cet, Cst6Cdt, Cuba, Eet, Egypt, Eire, Est, Est5Edt
|
|||||||
Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu);
|
Roc, Rok, Singapore, Turkey, Uct, Universal, Utc, WSu, Wet, Zulu);
|
||||||
ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16);
|
ENUM(AnisotropyMode, Automatic, Default, X2, X4, X8, X16);
|
||||||
ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous);
|
ENUM(AstcDecodeMode, Cpu, Gpu, CpuAsynchronous);
|
||||||
ENUM(AstcRecompression, Uncompressed, Bc1, Bc3);
|
|
||||||
ENUM(FramePacingMode, Target_Auto, Target_30, Target_60, Target_90, Target_120);
|
|
||||||
ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
|
ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
|
||||||
ENUM(VramUsageMode, Conservative, Aggressive);
|
ENUM(VramUsageMode, Conservative, Aggressive);
|
||||||
ENUM(RendererBackend, OpenGL_GLSL, Vulkan, Null, OpenGL_GLASM, OpenGL_SPIRV);
|
ENUM(RendererBackend, OpenGL_GLSL, Vulkan, Null, OpenGL_GLASM, OpenGL_SPIRV);
|
||||||
@@ -153,9 +151,6 @@ ENUM(ConsoleMode, Handheld, Docked);
|
|||||||
ENUM(AppletMode, HLE, LLE);
|
ENUM(AppletMode, HLE, LLE);
|
||||||
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
||||||
ENUM(GpuClock, Normal, Boost, Overclock)
|
ENUM(GpuClock, Normal, Boost, Overclock)
|
||||||
ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge)
|
|
||||||
ENUM(GpuUnswizzle, VeryLow, Low, Normal, Medium, High)
|
|
||||||
ENUM(GpuUnswizzleChunk, VeryLow, Low, Normal, Medium, High)
|
|
||||||
ENUM(TemperatureUnits, Celsius, Fahrenheit)
|
ENUM(TemperatureUnits, Celsius, Fahrenheit)
|
||||||
ENUM(ExtendedDynamicState, Disabled, EDS1, EDS2, EDS3);
|
ENUM(ExtendedDynamicState, Disabled, EDS1, EDS2, EDS3);
|
||||||
ENUM(GpuLogLevel, Off, Errors, Standard, Verbose, All)
|
ENUM(GpuLogLevel, Off, Errors, Standard, Verbose, All)
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
/* virtual_buffer.cpp */
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <windows.h>
|
|
||||||
#include <mutex>
|
|
||||||
#else
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "common/alignment.h"
|
|
||||||
#include "common/assert.h"
|
|
||||||
#include "common/sparse_large_vector.h"
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
static std::vector<std::pair<u64, u64>> vector_regions {};
|
|
||||||
|
|
||||||
// Workaround for handling non-commited memory accessed by Dynarmic; usually result of an error
|
|
||||||
static LONG WINAPI FakePageFaultHandler(PEXCEPTION_POINTERS info) {
|
|
||||||
DWORD code = info->ExceptionRecord->ExceptionCode;
|
|
||||||
u64 exception_addr = reinterpret_cast<u64>(info->ExceptionRecord->ExceptionAddress);
|
|
||||||
|
|
||||||
if (code != EXCEPTION_ACCESS_VIOLATION) {
|
|
||||||
// Not our problem
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 addr = 0, addr2 = 0;
|
|
||||||
|
|
||||||
for (auto region: vector_regions) {
|
|
||||||
auto addr_shifted = exception_addr >> HostPageBits;
|
|
||||||
if (region.first <= addr_shifted && addr_shifted <= region.second) {
|
|
||||||
addr = addr_shifted;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Page-boundary accesses
|
|
||||||
if (auto addr_ = (exception_addr + 0x40) >> HostPageBits; addr_ != addr_shifted && region.first <= addr_ && addr_ <= region.second) {
|
|
||||||
addr2 = addr_;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addr != 0 || addr2 != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addr == 0 && addr2 == 0) {
|
|
||||||
// Not our problem
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_ERROR(HW_Memory, "Accessing an unallocated region of a SparseLargeVector at {:#x}; this shouldn't happen and is likely a Dynarmic error!", exception_addr);
|
|
||||||
|
|
||||||
// Commit this region
|
|
||||||
if (addr != 0) {
|
|
||||||
if (!CommitVectorPage(addr << HostPageBits, false)) {
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Commit next region if needed
|
|
||||||
if (addr2 != 0) {
|
|
||||||
if (!CommitVectorPage(addr2 << HostPageBits, false)) {
|
|
||||||
return EXCEPTION_CONTINUE_SEARCH;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXCEPTION_CONTINUE_EXECUTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CommitVectorPage(uintptr_t addr, bool write) noexcept {
|
|
||||||
MEMORY_BASIC_INFORMATION info {};
|
|
||||||
auto res = VirtualQuery(reinterpret_cast<void*>(addr), &info, sizeof(info));
|
|
||||||
if (res == 0) {
|
|
||||||
LOG_CRITICAL(HW_Memory, "Failed to query large buffer region at {:#x} with error {}, will try committing anyway", addr, GetLastError());
|
|
||||||
} else if (info.State != MEM_RESERVE) {
|
|
||||||
LOG_ERROR(HW_Memory, "Tried to commit an unreserved large buffer region at {:#x} that is not mapped or is already committed (state {:#x})", addr, info.State);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto perm = write ? PAGE_READWRITE : PAGE_READONLY;
|
|
||||||
void* res2 = VirtualAlloc(reinterpret_cast<LPVOID>(addr), HostPageSize, MEM_COMMIT, perm);
|
|
||||||
if (res2 == nullptr) {
|
|
||||||
LOG_ERROR(HW_Memory, "Failed to commit large buffer region at {:#x}, error {}", addr, GetLastError());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MAP_NOCORE
|
|
||||||
#define MAP_NOCORE 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void* AllocateMemoryPages(std::size_t size) noexcept {
|
|
||||||
if (auto page = HostPageSize; size % page != 0) {
|
|
||||||
LOG_WARNING(HW_Memory, "Allocating unaligned large vector with size {:#x}; aligning to {} page size", size, page);
|
|
||||||
size = AlignUp(size, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
// We will never use this memory entirely so instead of committing it up front let's just reserve it and commit each page individually
|
|
||||||
void* base = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_READWRITE);
|
|
||||||
|
|
||||||
if (base != nullptr) {
|
|
||||||
vector_regions.emplace_back(reinterpret_cast<u64>(base), reinterpret_cast<u64>(base) + size);
|
|
||||||
|
|
||||||
static std::once_flag flag;
|
|
||||||
std::call_once(flag, []() { AddVectoredExceptionHandler(1, FakePageFaultHandler); });
|
|
||||||
} else {
|
|
||||||
// Try committing everything instead??
|
|
||||||
LOG_WARNING(HW_Memory, "Failed to reserve large vector region with error {}, trying to commit instead..", GetLastError());
|
|
||||||
base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE);
|
|
||||||
}
|
|
||||||
ASSERT_MSG(base, "Failed to reserve {:#x} sized region with error {}", size, GetLastError());
|
|
||||||
#else
|
|
||||||
void* base = mmap(nullptr, size, PROT_READ, MAP_ANON | MAP_PRIVATE | MAP_NOCORE, -1, 0);
|
|
||||||
if (base == MAP_FAILED)
|
|
||||||
base = nullptr;
|
|
||||||
ASSERT_MSG(base, "Failed to allocate {:#x} sized region with error {}", size, strerror(errno));
|
|
||||||
#endif
|
|
||||||
return base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept {
|
|
||||||
if (auto page = HostPageSize; size % page != 0) {
|
|
||||||
size = AlignUp(size, page);
|
|
||||||
}
|
|
||||||
if (!base)
|
|
||||||
return;
|
|
||||||
#ifdef _WIN32
|
|
||||||
ASSERT(VirtualFree(base, 0, MEM_RELEASE));
|
|
||||||
#else
|
|
||||||
ASSERT(munmap(base, size) == 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Common
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
/* virtual_buffer.h */
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <atomic>
|
|
||||||
#include <bit>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "common/alignment.h"
|
|
||||||
#include "common/assert.h"
|
|
||||||
|
|
||||||
namespace Common {
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
constexpr u64 HostPageSize = 0x1000;
|
|
||||||
constexpr u64 HostPageBits = 12;
|
|
||||||
constexpr u64 HostPageMask = ~(HostPageSize - 1);
|
|
||||||
bool CommitVectorPage(uintptr_t addr, bool write) noexcept;
|
|
||||||
#else
|
|
||||||
const u64 HostPageSize = sysconf(_SC_PAGESIZE);
|
|
||||||
const u64 HostPageBits = std::countr_zero(HostPageSize);
|
|
||||||
const u64 HostPageMask = ~(HostPageSize - 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void* AllocateMemoryPages(std::size_t size) noexcept;
|
|
||||||
void FreeMemoryPages(void* base, std::size_t size) noexcept;
|
|
||||||
|
|
||||||
/// A large page-aligned buffer that has optimized memory usage for zero-writes.
|
|
||||||
template <typename T>
|
|
||||||
requires std::is_trivially_copyable_v<T>
|
|
||||||
class SparseLargeVector final {
|
|
||||||
public:
|
|
||||||
constexpr SparseLargeVector() = default;
|
|
||||||
|
|
||||||
explicit SparseLargeVector(std::size_t count) noexcept
|
|
||||||
: alloc_size{count * sizeof(T)}
|
|
||||||
{
|
|
||||||
base_ptr = static_cast<T*>(AllocateMemoryPages(alloc_size));
|
|
||||||
|
|
||||||
// each item in vector holds information for 64 pages
|
|
||||||
auto denom = HostPageSize * 64;
|
|
||||||
committed_pages = std::vector<std::atomic<u64>>((alloc_size + denom - 1) / denom);
|
|
||||||
}
|
|
||||||
|
|
||||||
~SparseLargeVector() noexcept {
|
|
||||||
FreeMemoryPages(base_ptr, alloc_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
SparseLargeVector(const SparseLargeVector&) = delete;
|
|
||||||
SparseLargeVector& operator=(const SparseLargeVector&) = delete;
|
|
||||||
SparseLargeVector(SparseLargeVector&& other) = delete;
|
|
||||||
SparseLargeVector& operator=(SparseLargeVector&& other) = delete;
|
|
||||||
|
|
||||||
void ResizeAndClear(std::size_t count) noexcept {
|
|
||||||
if (auto const new_size = count * sizeof(T); new_size != alloc_size) {
|
|
||||||
FreeMemoryPages(base_ptr, alloc_size);
|
|
||||||
alloc_size = new_size;
|
|
||||||
base_ptr = static_cast<T*>(AllocateMemoryPages(alloc_size));
|
|
||||||
|
|
||||||
auto denom = HostPageSize * 64;
|
|
||||||
committed_pages = std::vector<std::atomic<u64>>((alloc_size + denom - 1) / denom);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a reference to the value of the requested index and allocates memory if needed.
|
|
||||||
T& GetAndFault(std::size_t index) noexcept {
|
|
||||||
if (index > alloc_size / sizeof(T)) {
|
|
||||||
UNREACHABLE_MSG("Out of bounds RW access on SparseLargeVector @ {}", index);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!IsCommittedPage(index)) {
|
|
||||||
CommitPage(index);
|
|
||||||
}
|
|
||||||
return base_ptr[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a reference to the value of the requested index if initialized, or will otherwise return a zero-initialized object.
|
|
||||||
const T& GetOrDefault(std::size_t index) const {
|
|
||||||
#ifdef _WIN32
|
|
||||||
if (!IsCommittedPage(index)) {
|
|
||||||
return *reinterpret_cast<const T*>(&default_val);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// On non-Windows, OS page table should optimize this by pointing to a zero page if unallocated.
|
|
||||||
return base_ptr[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set(std::size_t index, const T& value) noexcept {
|
|
||||||
if (index > alloc_size / sizeof(T)) {
|
|
||||||
LOG_CRITICAL(Common_Memory, "Out of bounds write on SparseLargeVector @ {}", index);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!IsCommittedPage(index))
|
|
||||||
CommitPage(index);
|
|
||||||
base_ptr[index] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ZeroRegion(std::size_t start, std::size_t end_) noexcept {
|
|
||||||
u64 base = reinterpret_cast<u64>(&base_ptr[start]);
|
|
||||||
const u64 end = reinterpret_cast<u64>(&base_ptr[end_]);
|
|
||||||
|
|
||||||
const u64 end_page = AlignUp(base, HostPageSize);
|
|
||||||
const u64 first_size = (std::min)(end_page, end) - base;
|
|
||||||
|
|
||||||
if (IsCommittedPage(start / sizeof(T))) {
|
|
||||||
std::memset(reinterpret_cast<void*>(base), 0, first_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (end <= end_page)
|
|
||||||
return;
|
|
||||||
|
|
||||||
base = end_page;
|
|
||||||
|
|
||||||
for (u64 page = base; page < end; page += HostPageSize) {
|
|
||||||
if (!IsCommittedPage((page - reinterpret_cast<u64>(base_ptr)) / sizeof(T))) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::memset(reinterpret_cast<void*>(page), 0, (std::min)( HostPageSize, end - page));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr void CommitRegion(size_t index, size_t end_) {
|
|
||||||
const u64 base = static_cast<u64>(index) * sizeof(T);
|
|
||||||
const u64 end = static_cast<u64>(end_) * sizeof(T);
|
|
||||||
|
|
||||||
for (u64 page = AlignDown(base, HostPageSize); page < end; page += HostPageSize) {
|
|
||||||
if (!IsCommittedPage(page / sizeof(T))) {
|
|
||||||
CommitPage(page / sizeof(T));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr T& GetUnchecked(size_t index) {
|
|
||||||
return base_ptr[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] constexpr const T& operator[](std::size_t index) const noexcept {
|
|
||||||
return GetOrDefault(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] constexpr const T* data() const noexcept {
|
|
||||||
return base_ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] constexpr std::size_t size() const noexcept {
|
|
||||||
return alloc_size / sizeof(T);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
[[nodiscard]] constexpr bool IsCommittedPage(std::size_t index) const noexcept {
|
|
||||||
if (index > alloc_size / sizeof(T)) {
|
|
||||||
LOG_CRITICAL(Common_Memory, "Out of bounds access on large vector @ {}", index);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto page = (index * sizeof(T)) >> HostPageBits;
|
|
||||||
auto val = committed_pages[page >> 6].load(std::memory_order_acquire);
|
|
||||||
return (val >> (page & 63)) & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr void CommitPage(std::size_t index) noexcept {
|
|
||||||
auto page_index = (index * sizeof(T)) >> HostPageBits;
|
|
||||||
auto page = reinterpret_cast<uintptr_t>(base_ptr + index) & HostPageMask;
|
|
||||||
#if defined(_WIN32)
|
|
||||||
CommitVectorPage(page, true);
|
|
||||||
#else
|
|
||||||
mprotect(reinterpret_cast<void*>(page), HostPageSize, PROT_READ | PROT_WRITE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
committed_pages[page_index >> 6].fetch_or(1ULL << (page_index & 63), std::memory_order_release);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t alloc_size{};
|
|
||||||
T* base_ptr{};
|
|
||||||
|
|
||||||
std::vector<std::atomic<u64>> committed_pages{};
|
|
||||||
#ifdef _WIN32
|
|
||||||
const std::array<u8, sizeof(T)> default_val{};
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Common
|
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "common/assert.h"
|
||||||
|
#include "common/virtual_buffer.h"
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
|
||||||
|
void* AllocateMemoryPages(std::size_t size) noexcept {
|
||||||
|
#ifdef _WIN32
|
||||||
|
void* base = VirtualAlloc(nullptr, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||||
|
if (base == nullptr) {
|
||||||
|
// Probably failing to reserve is less likely than failing to commit
|
||||||
|
base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||||
|
if (base == MAP_FAILED)
|
||||||
|
base = nullptr;
|
||||||
|
#endif
|
||||||
|
ASSERT(base);
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FreeMemoryPages(void* base, [[maybe_unused]] std::size_t size) noexcept {
|
||||||
|
if (!base)
|
||||||
|
return;
|
||||||
|
#ifdef _WIN32
|
||||||
|
ASSERT(VirtualFree(base, 0, MEM_RELEASE));
|
||||||
|
#else
|
||||||
|
ASSERT(munmap(base, size) == 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Common
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
|
||||||
|
void* AllocateMemoryPages(std::size_t size) noexcept;
|
||||||
|
void FreeMemoryPages(void* base, std::size_t size) noexcept;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class VirtualBuffer final {
|
||||||
|
public:
|
||||||
|
// TODO: Uncomment this and change Common::PageTable::PageInfo to be trivially constructible
|
||||||
|
// using std::atomic_ref once libc++ has support for it
|
||||||
|
// static_assert(
|
||||||
|
// std::is_trivially_constructible_v<T>,
|
||||||
|
// "T must be trivially constructible, as non-trivial constructors will not be executed "
|
||||||
|
// "with the current allocator");
|
||||||
|
|
||||||
|
constexpr VirtualBuffer() = default;
|
||||||
|
explicit VirtualBuffer(std::size_t count) noexcept
|
||||||
|
: alloc_size{count * sizeof(T)}
|
||||||
|
{
|
||||||
|
base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
~VirtualBuffer() noexcept {
|
||||||
|
FreeMemoryPages(base_ptr, alloc_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
VirtualBuffer(const VirtualBuffer&) = delete;
|
||||||
|
VirtualBuffer& operator=(const VirtualBuffer&) = delete;
|
||||||
|
|
||||||
|
VirtualBuffer(VirtualBuffer&& other) noexcept
|
||||||
|
: alloc_size{std::exchange(other.alloc_size, 0)}
|
||||||
|
, base_ptr{std::exchange(other.base_ptr, nullptr)}
|
||||||
|
{}
|
||||||
|
|
||||||
|
VirtualBuffer& operator=(VirtualBuffer&& other) noexcept {
|
||||||
|
alloc_size = std::exchange(other.alloc_size, 0);
|
||||||
|
base_ptr = std::exchange(other.base_ptr, nullptr);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resize(std::size_t count) noexcept {
|
||||||
|
if (auto const new_size = count * sizeof(T); new_size != alloc_size) {
|
||||||
|
FreeMemoryPages(base_ptr, alloc_size);
|
||||||
|
alloc_size = new_size;
|
||||||
|
base_ptr = reinterpret_cast<T*>(AllocateMemoryPages(alloc_size));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr const T& operator[](std::size_t index) const noexcept {
|
||||||
|
return base_ptr[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr T& operator[](std::size_t index) noexcept {
|
||||||
|
return base_ptr[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr T* data() noexcept {
|
||||||
|
return base_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr const T* data() const noexcept {
|
||||||
|
return base_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] constexpr std::size_t size() const noexcept {
|
||||||
|
return alloc_size / sizeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::size_t alloc_size{};
|
||||||
|
T* base_ptr{};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Common
|
||||||
+9
-20
@@ -810,6 +810,8 @@ add_library(core STATIC
|
|||||||
hle/service/ns/ecommerce_interface.h
|
hle/service/ns/ecommerce_interface.h
|
||||||
hle/service/ns/factory_reset_interface.cpp
|
hle/service/ns/factory_reset_interface.cpp
|
||||||
hle/service/ns/factory_reset_interface.h
|
hle/service/ns/factory_reset_interface.h
|
||||||
|
hle/service/ns/i_async_result.cpp
|
||||||
|
hle/service/ns/i_async_result.h
|
||||||
hle/service/ns/language.cpp
|
hle/service/ns/language.cpp
|
||||||
hle/service/ns/language.h
|
hle/service/ns/language.h
|
||||||
hle/service/ns/ns.cpp
|
hle/service/ns/ns.cpp
|
||||||
@@ -1236,8 +1238,7 @@ if (HAS_NCE)
|
|||||||
arm/nce/interpreter_visitor.cpp
|
arm/nce/interpreter_visitor.cpp
|
||||||
arm/nce/interpreter_visitor.h
|
arm/nce/interpreter_visitor.h
|
||||||
arm/nce/patcher.cpp
|
arm/nce/patcher.cpp
|
||||||
arm/nce/patcher.h
|
arm/nce/patcher.h)
|
||||||
arm/nce/visitor_base.h)
|
|
||||||
target_link_libraries(core PRIVATE merry::oaknut)
|
target_link_libraries(core PRIVATE merry::oaknut)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -1261,23 +1262,11 @@ if (ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 OR ARCHITECTURE_riscv64 OR ARCHITE
|
|||||||
target_link_libraries(core PRIVATE dynarmic::dynarmic)
|
target_link_libraries(core PRIVATE dynarmic::dynarmic)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_sources(core PRIVATE hle/service/ssl/ssl_backend_openssl.cpp)
|
if (TARGET OpenSSL::SSL)
|
||||||
|
target_sources(core PRIVATE hle/service/ssl/ssl_backend_openssl.cpp)
|
||||||
target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto)
|
target_link_libraries(core PRIVATE OpenSSL::SSL OpenSSL::Crypto)
|
||||||
|
else()
|
||||||
# TODO
|
target_sources(core PRIVATE hle/service/ssl/ssl_backend_none.cpp)
|
||||||
|
endif()
|
||||||
# elseif (APPLE)
|
|
||||||
# target_sources(core PRIVATE
|
|
||||||
# hle/service/ssl/ssl_backend_securetransport.cpp)
|
|
||||||
# target_link_libraries(core PRIVATE "-framework Security")
|
|
||||||
# elseif (WIN32)
|
|
||||||
# target_sources(core PRIVATE
|
|
||||||
# hle/service/ssl/ssl_backend_schannel.cpp)
|
|
||||||
# target_link_libraries(core PRIVATE crypt32 secur32)
|
|
||||||
# else()
|
|
||||||
# target_sources(core PRIVATE
|
|
||||||
# hle/service/ssl/ssl_backend_none.cpp)
|
|
||||||
# endif()
|
|
||||||
|
|
||||||
create_target_directory_groups(core)
|
create_target_directory_groups(core)
|
||||||
|
|||||||
@@ -172,12 +172,12 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) {
|
|||||||
if (page_table) {
|
if (page_table) {
|
||||||
constexpr size_t PageBits = 12;
|
constexpr size_t PageBits = 12;
|
||||||
constexpr size_t NumPageTableEntries = 1 << (32 - PageBits);
|
constexpr size_t NumPageTableEntries = 1 << (32 - PageBits);
|
||||||
|
constexpr size_t PageLog2Stride = 5;
|
||||||
|
static_assert(1 << PageLog2Stride == sizeof(Common::PageTable::PageEntryData));
|
||||||
|
|
||||||
// Dynarmic will not write to the page table, const_cast is safe here
|
config.page_table = reinterpret_cast<std::array<std::uint8_t*, NumPageTableEntries>*>(page_table->entries.data());
|
||||||
config.page_table = reinterpret_cast<std::array<std::uint8_t*, NumPageTableEntries>*>(
|
config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS;
|
||||||
const_cast<Common::PageTable::PageEntryData*>(page_table->entries.data()));
|
config.page_table_log2_stride = PageLog2Stride;
|
||||||
config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK;
|
|
||||||
config.page_table_marked_bit = 0;
|
|
||||||
config.absolute_offset_page_table = true;
|
config.absolute_offset_page_table = true;
|
||||||
config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
|
config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
|
||||||
config.only_detect_misalignment_via_page_table_on_page_boundary = true;
|
config.only_detect_misalignment_via_page_table_on_page_boundary = true;
|
||||||
@@ -188,13 +188,6 @@ void ArmDynarmic32::MakeJit(Common::PageTable* page_table) {
|
|||||||
|
|
||||||
config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt;
|
config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt;
|
||||||
config.recompile_on_exclusive_fastmem_failure = true;
|
config.recompile_on_exclusive_fastmem_failure = true;
|
||||||
|
|
||||||
if (reinterpret_cast<u64>(m_system.DeviceMemory().buffer.BackingBasePointer() +
|
|
||||||
Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) {
|
|
||||||
// Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries,
|
|
||||||
// we have to manually sign extend when our actual pointer is negative.
|
|
||||||
config.page_table_sign_extension = Common::PageTable::SIGN_BIT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multi-process state
|
// Multi-process state
|
||||||
@@ -427,7 +420,6 @@ void ArmDynarmic32::SignalInterrupt(Kernel::KThread* thread) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ArmDynarmic32::ClearInstructionCache() {
|
void ArmDynarmic32::ClearInstructionCache() {
|
||||||
m_cb->last_code_addr = u64(-1);
|
|
||||||
m_jit->ClearCache();
|
m_jit->ClearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -211,12 +211,13 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s
|
|||||||
|
|
||||||
// Memory
|
// Memory
|
||||||
if (page_table) {
|
if (page_table) {
|
||||||
// Dynarmic will not write to the page table, const_cast is safe here
|
constexpr size_t PageLog2Stride = 5;
|
||||||
config.page_table = reinterpret_cast<void**>(
|
static_assert(1 << PageLog2Stride == sizeof(Common::PageTable::PageEntryData));
|
||||||
const_cast<Common::PageTable::PageEntryData*>(page_table->entries.data()));
|
|
||||||
|
config.page_table = reinterpret_cast<void**>(page_table->entries.data());
|
||||||
config.page_table_address_space_bits = std::uint32_t(address_space_bits);
|
config.page_table_address_space_bits = std::uint32_t(address_space_bits);
|
||||||
config.page_table_pointer_mask = Common::PageTable::ATTRIBUTE_MASK;
|
config.page_table_pointer_mask_bits = Common::PageTable::ATTRIBUTE_BITS;
|
||||||
config.page_table_marked_bit = 0;
|
config.page_table_log2_stride = PageLog2Stride;
|
||||||
config.silently_mirror_page_table = false;
|
config.silently_mirror_page_table = false;
|
||||||
config.absolute_offset_page_table = true;
|
config.absolute_offset_page_table = true;
|
||||||
config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
|
config.detect_misaligned_access_via_page_table = 16 | 32 | 64 | 128;
|
||||||
@@ -230,13 +231,6 @@ void ArmDynarmic64::MakeJit(Common::PageTable* page_table, std::size_t address_s
|
|||||||
|
|
||||||
config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt;
|
config.fastmem_exclusive_access = config.fastmem_pointer != std::nullopt;
|
||||||
config.recompile_on_exclusive_fastmem_failure = true;
|
config.recompile_on_exclusive_fastmem_failure = true;
|
||||||
|
|
||||||
if (reinterpret_cast<u64>(m_system.DeviceMemory().buffer.BackingBasePointer() +
|
|
||||||
Kernel::Board::Nintendo::Nx::KSystemControl::Init::GetIntendedMemorySize()) < (1ULL << 39)) {
|
|
||||||
// Systems like FreeBSD allocate memory really low by default, and since we pack our page table entries,
|
|
||||||
// we have to manually sign extend when our actual pointer is negative.
|
|
||||||
config.page_table_sign_extension = Common::PageTable::SIGN_BIT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Multi-process state
|
// Multi-process state
|
||||||
@@ -453,7 +447,6 @@ void ArmDynarmic64::SignalInterrupt(Kernel::KThread* thread) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ArmDynarmic64::ClearInstructionCache() {
|
void ArmDynarmic64::ClearInstructionCache() {
|
||||||
m_cb->last_code_addr = u64(-1);
|
|
||||||
m_jit->ClearCache();
|
m_jit->ClearCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user