Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ffa544b75 | ||
|
|
247b4901f8 |
49 changed files with 406 additions and 851 deletions
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -1,4 +1,5 @@
|
||||||
- [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
|
- [ ] I have read and followed the [Contribution Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/CONTRIBUTING.md#code-contributions).
|
||||||
|
- [ ] I have read and followed the [AI Policy](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/AI.md).
|
||||||
- [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
|
- [ ] I have read and followed the [Coding Guidelines](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/policies/Coding.md) to the best of my ability.
|
||||||
|
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -7,7 +7,6 @@
|
||||||
# Build directory
|
# Build directory
|
||||||
/[Bb]uild*/
|
/[Bb]uild*/
|
||||||
doc-build/
|
doc-build/
|
||||||
out/
|
|
||||||
AppDir/
|
AppDir/
|
||||||
uruntime
|
uruntime
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,14 +16,15 @@ Eden is free, open-source, copyleft software, licensed under the terms of the [G
|
||||||
|
|
||||||
### Policies
|
### Policies
|
||||||
|
|
||||||
- AI usage is allowed, but we reserve the right to close and rework your PR if you don't fully understand the changes you're making.
|
- We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*. Please read our [detailed AI policy](docs/policies/AI.md) for more info.
|
||||||
- As a common courtesy, please disclose your AI usage under the PR description, as `Assisted-by: <AI model> (<how it helped>)`.
|
- Usage of any form of profanity or otherwise unsavory language is generally discouraged.
|
||||||
- Usage of any form of profanity or otherwise unsavory language is discouraged but not strictly disallowed.
|
- This is primarily because it rarely helps to actually understand what's going on.
|
||||||
- New code must follow the same style as the surrounding codebase. Exceptions may be granted in certain cases.
|
- Remember that your comments should be focused and actually address what's happening. With very few exceptions, expletives are actively detrimental at best.
|
||||||
|
- New code must follow the same general style as the surrounding codebase. Exceptions may be granted in certain cases.
|
||||||
- Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this.
|
- Maintainers reserve the right to change your patches and pull requests at will. We will try to avoid this.
|
||||||
- You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem.
|
- You should generally respect all decisions made by the [code owners](docs/CODEOWNERS) in your particular subsystem.
|
||||||
- However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct.
|
- However, if you feel they are overstepping or are incorrect, don't be afraid to stand your ground! Maintainers are not always correct.
|
||||||
- While we do *not* adhere to the terms of a formal code of conduct, you are expected to treat other developers, contributors, and community members respectfully.
|
- While we do *not* adhere to the terms of a formal code of conduct, you will generally be expected to respect other developers, contributors, and community members.
|
||||||
- You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity.
|
- You **must** have basic knowledge of [Git](https://git-scm.com/learn). Knowing how to manage your branches and follow proper fork policies is a necessity.
|
||||||
|
|
||||||
### Where do I start?
|
### Where do I start?
|
||||||
|
|
@ -37,8 +38,7 @@ You may also search for open issues on [GitHub](https://github.com/eden-emulator
|
||||||
There are five primary ways to contribute.
|
There are five primary ways to contribute.
|
||||||
|
|
||||||
- Submit pull requests directly to our source tree
|
- Submit pull requests directly to our source tree
|
||||||
- You must first [create an account](https://git.eden-emu.dev/user/sign_up).
|
- You must first request an account on our Forgejo. See [Signup](#how-do-i-sign-up)
|
||||||
- You may use an internal account, or you may use a GitHub/Codeberg account linked to our instance.
|
|
||||||
- Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports)
|
- Submit pull requests to our [GitHub mirror](https://github.com/eden-emulator/Issue-Reports)
|
||||||
- Note that this is subject to being removed by DMCA, so don't rely on this.
|
- Note that this is subject to being removed by DMCA, so don't rely on this.
|
||||||
- Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden)
|
- Submit pull requests to our [Codeberg mirror](https://codeberg.org/eden-emu/eden)
|
||||||
|
|
@ -50,8 +50,31 @@ There are five primary ways to contribute.
|
||||||
|
|
||||||
To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request.
|
To test your changes, ensure to read the [build documentation](./docs/Build.md) for your specific platform(s) to ensure everything compiles and works properly. You should also make sure that your branch is up-to-date with the upstream `master` branch before opening a pull request.
|
||||||
|
|
||||||
|
### How do I sign up?
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>To sign up and begin contributing... (click to open)</summary>
|
||||||
|
|
||||||
|
Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the following format:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Subject: [Eden Git] Registration Request
|
||||||
|
Username: <Your Desired Username>
|
||||||
|
Email: <Your Desired Email>
|
||||||
|
I wish to sign up because... <your reason here>
|
||||||
|
```
|
||||||
|
|
||||||
|
Received mail that does not follow this format will be ignored.
|
||||||
|
|
||||||
|
Once your request is processed, you will receive a confirmation email with your temporary password and some information on Git access and policies. If you do not receive a response within 48 hours, feel free to send another email.
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam or Junk folder.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## Non-code Contributions
|
## Non-code Contributions
|
||||||
|
|
||||||
Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community.
|
Alongside the other contribution methods listed up top, you can also choose to contribute through documentation, organization, or community guides. These can be done either through the code contribution methods described above, or created externally and shared via our Discord community.
|
||||||
|
|
||||||
If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev).
|
If you have an external tool/page that you believe would be handy to integrate/link into Eden, please additionally email our developers at [`developers@eden-emu.dev`](mailto:developers@eden-emu.dev). **Do not submit vibe-coded or AI generated tools or applications**.
|
||||||
|
|
|
||||||
|
|
@ -351,13 +351,13 @@
|
||||||
},
|
},
|
||||||
"zstd": {
|
"zstd": {
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
"hash": "2b006c3c110c38bd2f5896b42d36a38931c8eae261f30552f9a9fd04458d218d8f1a1425f117fd12af545ed77042e4b2d1a1a9b6286c4d0b9d74ef79f20a8f08",
|
"hash": "cc5ad4b119a9c2ea57f0b71eeff01113bb506e0d17000159c5409cb8236d22e38c52d5e9e97e7947a4bf1b2dfc44b6c503ab2d9aedbd59458435c6a2849cb029",
|
||||||
"min_version": "1.5",
|
"min_version": "1.5",
|
||||||
"options": [
|
"options": [
|
||||||
"ZSTD_BUILD_SHARED OFF"
|
"ZSTD_BUILD_SHARED OFF"
|
||||||
],
|
],
|
||||||
"repo": "facebook/zstd",
|
"repo": "facebook/zstd",
|
||||||
"source_subdir": "build/cmake",
|
"source_subdir": "build/cmake",
|
||||||
"version": "33618c8"
|
"version": "b8d6101fba"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
203
docs/policies/AI.md
Normal file
203
docs/policies/AI.md
Normal file
|
|
@ -0,0 +1,203 @@
|
||||||
|
# AI Policy
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> We are trialing a slightly relaxed AI policy to allow high-quality contributors to use AI *responsibly*.
|
||||||
|
> This policy is subject to change at any point in time, so check back frequently.
|
||||||
|
>
|
||||||
|
> This banner will be removed once we have finalized our revised policy.
|
||||||
|
|
||||||
|
- [AI Policy](#ai-policy)
|
||||||
|
- [TL;DR](#tldr)
|
||||||
|
- [Definitions](#definitions)
|
||||||
|
- [Scope](#scope)
|
||||||
|
- [Introduction](#introduction)
|
||||||
|
- [Requirements](#requirements)
|
||||||
|
- [Sign-off, Authorship, and Copyright](#sign-off-authorship-and-copyright)
|
||||||
|
- [Permitted Usage](#permitted-usage)
|
||||||
|
- [Recommended Prior Discussion](#recommended-prior-discussion)
|
||||||
|
- [Forbidden Usage](#forbidden-usage)
|
||||||
|
- [Human Effort Denial of Service](#human-effort-denial-of-service)
|
||||||
|
- [Disclosure](#disclosure)
|
||||||
|
- [Codebase Ingestion](#codebase-ingestion)
|
||||||
|
- [Enforcement](#enforcement)
|
||||||
|
- [Addendum: AI Commit Messages](#addendum-ai-commit-messages)
|
||||||
|
- [References](#references)
|
||||||
|
|
||||||
|
## TL;DR
|
||||||
|
|
||||||
|
AI-assisted contributions are welcome, provided you take responsibility for them.
|
||||||
|
|
||||||
|
- You **must** disclose any AI or LLM usage in your pull request description *and* commit message.
|
||||||
|
- You **must** be able to explain, defend, and revise every line of code you submit.
|
||||||
|
- Commit messages, PR descriptions, issues, and comments **must** be written by you. Verbatim AI output is not acceptable.
|
||||||
|
- Undisclosed AI usage will result in your contribution being rejected.
|
||||||
|
- Low-quality contributions, disclosed or not, will be reworked or rejected.
|
||||||
|
- Spamming automated PRs, comments, or issues is treated as a Denial of Service (DoS) attack on our reviewers; see [Human Effort Denial of Service](#human-effort-denial-of-service).
|
||||||
|
|
||||||
|
## Definitions
|
||||||
|
|
||||||
|
An *AI or LLM-based tool* is any piece of software that generates code, text, or other content through machine learning models. This includes, but is not limited to: chat assistants, agentic coding tools/harnesses, inline code completion suggestions you have accepted into the code, and AI-driven explanation/refactoring features.
|
||||||
|
|
||||||
|
For the purposes of this policy, basic deterministic/static development tools (such as clang-tidy, git, compilers, etc.) are not considered AI tools.
|
||||||
|
|
||||||
|
Terms such as "substantially", "large-scale", "majority", and "low-quality" are intentionally left vague, and will be interpreted at the maintainers' discretion. When in doubt, ask first.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This policy applies to all code contributions, alongside issues and pull requests surrounding this codebase. This includes:
|
||||||
|
|
||||||
|
- Commit messages
|
||||||
|
- PR descriptions
|
||||||
|
- Code review comments
|
||||||
|
- Issue/PR comments
|
||||||
|
- Patches submitted via e-mail
|
||||||
|
|
||||||
|
Areas that are not directly related to code--such as our surrounding communities--are not covered by the terms of this policy. Additionally, spelling/grammar checking via AI or LLM-based tools is not covered under this document.
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
In the right hands, AI and LLM-based tools are incredibly useful for getting features and bugfixes out the door as fast as possible. At the same time, reviewer bandwidth is a scarce resource. We are therefore open to AI-assisted contributions, provided they are produced and disclosed properly.
|
||||||
|
|
||||||
|
The goal of this document is *not* to set arbitrary restrictions, but rather to keep our development healthy and stable, while still allowing contributors to use the tools they find helpful. A contribution must be worth more to the project than the time it takes to review it.
|
||||||
|
|
||||||
|
Throughout this document, **must** and **must not** are inflexible, binding requirements. Refusal to follow these is treated as a violation of the terms outlined in this document.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
These apply to all contributions, whether AI-assisted or not. AI-assisted contributions also carry additional disclosure requirements as outlined in [Disclosure](#disclosure).
|
||||||
|
|
||||||
|
1. *Disclosure*. Any and all usage of AI or LLM-based tools within any contribution **must** be explicitly marked and disclosed as appropriate.
|
||||||
|
2. *Responsibility*. The human submitter of any contribution is held wholly responsible for the accuracy, completeness, and intent of what is submitted. You **must** be able to explain, defend, and revise your code during review.
|
||||||
|
3. *Review*. All code **must** be thoroughly reviewed by the author before opening a PR or marking it ready for review.
|
||||||
|
4. *Testing*. All code changes **must** be tested directly by the human author.
|
||||||
|
5. *Quality*. All submitted code is held to a strict standard of excellence. Low-quality AI-generated content does not uphold this standard.
|
||||||
|
6. *Licensing*. All code **must** be compatible with the GPLv3 or later. You **must** warrant that you have the right to submit it under those terms, and that it was not copied from work published under an incompatible license.
|
||||||
|
|
||||||
|
## Sign-off, Authorship, and Copyright
|
||||||
|
|
||||||
|
AI agents **must not** add `Signed-off-by:` tags. The human submitter **must** sign off on all changes.
|
||||||
|
|
||||||
|
Similarly, AI agents cannot hold authorship or copyright over code, and **must not** add `Co-authored-by:` or `Co-developed-by:` tags. The human submitter **must** author all changes.
|
||||||
|
|
||||||
|
## Permitted Usage
|
||||||
|
|
||||||
|
This is a non-exhaustive list of permitted uses of AI and LLM-based tools, provided they are disclosed properly.
|
||||||
|
|
||||||
|
- Drafting issues and pull requests, provided the final text and submitted code are substantially your own.
|
||||||
|
- Debugging issues, bugs, glitches, and crashes, whether pre-existing or introduced by your own changes.
|
||||||
|
- Reviewing your own changes before submitting a PR.
|
||||||
|
- Research, brainstorming, and codebase searching/understanding.
|
||||||
|
- Applying tedious but not particularly large changes, such as mass-migrating specific classes to polyfills or abstractions.
|
||||||
|
|
||||||
|
## Recommended Prior Discussion
|
||||||
|
|
||||||
|
Some usage cases are not necessarily forbidden nor permitted. These should be discussed with maintainers in an issue or e-mail *before* submission. Maintainers and reviewers may also comment on this during the review/submission phase.
|
||||||
|
|
||||||
|
- Generating boilerplate/scaffolding for new code.
|
||||||
|
- Writing unit tests.
|
||||||
|
- Large-scale refactors primarily driven by an AI agent.
|
||||||
|
- Any contribution where an AI agent or model was responsible for the majority of the implementation.
|
||||||
|
|
||||||
|
## Forbidden Usage
|
||||||
|
|
||||||
|
This is a non-exhaustive list of strictly forbidden uses of AI and LLM-based tools.
|
||||||
|
|
||||||
|
- Vibecoding, or changes entirely authored by AI agents without human intervention or understanding.
|
||||||
|
- If you don't choose to put in the necessary effort to understand every line of code you submitted, neither will we.
|
||||||
|
- Fully AI-generated commit messages, PR descriptions, issues, or comments. See [Addendum: AI Commit Messages](#addendum-ai-commit-messages).
|
||||||
|
- Submission of AI-assisted work that is not disclosed per the [Disclosure](#disclosure) requirements.
|
||||||
|
- Low-quality submissions that fail to satisfy our standard of code excellence.
|
||||||
|
- Submitting secrets, credentials, private user data, or unpublished security reports to third-party AI services.
|
||||||
|
- This includes console keys, encryption material, and private vulnerability disclosures.
|
||||||
|
- Verbatim AI code reviews (e.g. Codex/Copilot reviews).
|
||||||
|
|
||||||
|
## Human Effort Denial of Service
|
||||||
|
|
||||||
|
Using automated tools and AI to submit PRs, issues, and comments that we have to carefully review and handle is considered a [Denial-of-service attack](https://en.wikipedia.org/wiki/Denial-of-service_attack) on our human effort.
|
||||||
|
|
||||||
|
It takes very little effort on your side (an LLM prompt) to generate a large amount of effort on ours (careful and thorough code review). Please respect our time and don't do that.
|
||||||
|
|
||||||
|
## Disclosure
|
||||||
|
|
||||||
|
How you disclose AI usage is up to you. However, it **must** be explicit, easy to identify, and placed both within the commit message *and* the surrounding PR description. For patches submitted by e-mail, the cover letter counts as the PR description. We recommend an `Assisted-by:` footer:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Assisted-by: <model> (<what it was used for>)
|
||||||
|
```
|
||||||
|
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Assisted-by: Claude Opus 5.5 (initial draft and code review)
|
||||||
|
```
|
||||||
|
|
||||||
|
Contributions without a commit message (e.g. issues/comments) should instead use a plain sentence in the text body such as `I used <model> to help with <X>`. PRs and commit messages may opt to use this format as well.
|
||||||
|
|
||||||
|
Multi-commit series/squashes **must** maintain the trailer. Maintainers will handle this for merges to master, but you are responsible for ensuring the disclosure survives into the final commit/PR body of squashes within your branches.
|
||||||
|
|
||||||
|
Regardless, what matters is that reviewers can tell *at a glance* where and how AI was involved in your contribution.
|
||||||
|
|
||||||
|
## Codebase Ingestion
|
||||||
|
|
||||||
|
Ingestion of this codebase by LLMs for any purpose--such as training or prompt context--is permitted *for now*. This may change at any point as litigation and court rulings around AI and code copyright proceed.
|
||||||
|
|
||||||
|
AI models may have ingested AGPLv3 or otherwise copyleft-incompatible code and may regurgitate it. You remain responsible for ensuring that all code you submit is compatible with the GPLv3 or later.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
- If we suspect undisclosed AI usage in a contribution, we will ask for disclosure.
|
||||||
|
- Refusal to provide disclosure will result in rejection of the contribution, and your PR or issue will be closed. Maintainers may choose to rework it themselves if the change is worth having.
|
||||||
|
- Accounts that spam us with repeated automated PRs or comments will be blocked or permanently suspended from our Git instance.
|
||||||
|
- Maintainers reserve the right to close your issues and pull requests if you don't follow the guidelines and procedures outlined in this document, and refuse or fail to make changes as necessary to comply.
|
||||||
|
- Repeated failures to comply may result in loss of contribution privileges.
|
||||||
|
|
||||||
|
## Addendum: AI Commit Messages
|
||||||
|
|
||||||
|
The patchset for pull request [#3422](https://git.eden-emu.dev/eden-emu/eden/pulls/3422) was fed into a dedicated code AI model, and it produced the following:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
profile_manager: Refactor user deletion to use index instead of UUID
|
||||||
|
|
||||||
|
This commit improves the user profile deletion flow in the following ways:
|
||||||
|
|
||||||
|
1. **UI layer (ConfigureProfileManager)**:
|
||||||
|
- Replaces UUID-based deletion with index-based deletion
|
||||||
|
- Passes the selected row index from the tree view to the confirmation dialog
|
||||||
|
- Emits deleteUser(int index) signal from ConfigureProfileManagerDeleteDialog
|
||||||
|
- Removes lambda capture and std::function callback in favor of direct signal/slot connection
|
||||||
|
|
||||||
|
2. **Delete dialog**:
|
||||||
|
- Changes SetInfo() signature to accept index instead of accept callback
|
||||||
|
- Stores index internally and emits it via deleteUser signal on acceptance
|
||||||
|
|
||||||
|
3. **Core ProfileManager**:
|
||||||
|
- Refactors RemoveUser(UUID) → RemoveProfileAtIndex(index)
|
||||||
|
- Removes duplicated stable_partition + save logic from RemoveUser()
|
||||||
|
- Centralizes profile removal and save-file writing in RemoveProfileAtIndex()
|
||||||
|
|
||||||
|
4. **Minor follow-up**:
|
||||||
|
- Adds profile_manager.ResetUserSaveFile() call in PopulateUserList() to ensure consistent state when refreshing the user list
|
||||||
|
|
||||||
|
These changes eliminate redundant code, reduce the risk of UUID → index mismatch bugs, and make the deletion path more straightforward and maintainable.
|
||||||
|
|
||||||
|
Fixes: potential inconsistency when user order changes between UI and backend
|
||||||
|
```
|
||||||
|
|
||||||
|
This:
|
||||||
|
|
||||||
|
- Is needlessly verbose (nobody cares about most of these details)
|
||||||
|
- Doesn't address the actual purpose of the PR (fixing a double-deletion bug in the profile manager)
|
||||||
|
- Has unicode arrows (this is bad for command-line editors)
|
||||||
|
- Uses corporate and word-salad language that pads out the message to make it look like a lot changed
|
||||||
|
|
||||||
|
A good commit message should be concise, descriptive, and convey the *intent* behind the change, such as the bug being fixed or the feature being added. It should *not* be a detailed changelog of every individual byte that's changed.
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
This policy document has been adapted from the AI policies of numerous other free and open-source projects, whether restrictive or permissive.
|
||||||
|
|
||||||
|
- [Gitea](https://github.com/go-gitea/gitea/blob/main/CONTRIBUTING.md#ai-contribution-policy)
|
||||||
|
- The [Linux kernel](https://kernel.org/doc/html/next/process/coding-assistants.html)
|
||||||
|
- [Gentoo Linux](https://wiki.gentoo.org/wiki/Project:Council/AI_policy)
|
||||||
|
- [cURL](https://curl.se/dev/contribute.html#on-ai-use-in-curl)
|
||||||
|
- [FastAPI](https://tiangolo.com/open-source/contributing/#automated-code-and-ai)
|
||||||
|
|
@ -16,6 +16,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
||||||
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
||||||
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
||||||
|
NCE_INVALIDATION_GPU_READBACK("nce_invalidation_gpu_readback"),
|
||||||
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
||||||
EMULATE_BGR565("emulate_bgr565"),
|
EMULATE_BGR565("emulate_bgr565"),
|
||||||
RESCALE_HACK("rescale_hack"),
|
RESCALE_HACK("rescale_hack"),
|
||||||
|
|
|
||||||
|
|
@ -859,6 +859,13 @@ abstract class SettingsItem(
|
||||||
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.NCE_INVALIDATION_GPU_READBACK,
|
||||||
|
titleId = R.string.nce_invalidation_gpu_readback,
|
||||||
|
descriptionId = R.string.nce_invalidation_gpu_readback_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.FIX_BLOOM_EFFECTS,
|
BooleanSetting.FIX_BLOOM_EFFECTS,
|
||||||
|
|
|
||||||
|
|
@ -554,6 +554,7 @@ class SettingsFragmentPresenter(
|
||||||
add(HeaderSetting(R.string.hacks))
|
add(HeaderSetting(R.string.hacks))
|
||||||
|
|
||||||
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
||||||
|
add(BooleanSetting.NCE_INVALIDATION_GPU_READBACK.key)
|
||||||
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
||||||
add(BooleanSetting.EMULATE_BGR565.key)
|
add(BooleanSetting.EMULATE_BGR565.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||||
|
|
|
||||||
|
|
@ -100,7 +100,7 @@ class Game(
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val extensions: Set<String> = HashSet(
|
val extensions: Set<String> = HashSet(
|
||||||
listOf("xci", "nsp", "nca", "nro", "nsz", "xcz")
|
listOf("xci", "nsp", "nca", "nro")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ object GameHelper {
|
||||||
|
|
||||||
// File extensions considered as external content, buuut should
|
// File extensions considered as external content, buuut should
|
||||||
// be done better imo.
|
// be done better imo.
|
||||||
private val externalContentExtensions = setOf("nsp", "xci", "nsz", "xcz")
|
private val externalContentExtensions = setOf("nsp", "xci")
|
||||||
|
|
||||||
private fun scanContentContainersRecursive(
|
private fun scanContentContainersRecursive(
|
||||||
files: Array<MinimalDocumentFile>,
|
files: Array<MinimalDocumentFile>,
|
||||||
|
|
|
||||||
|
|
@ -76,9 +76,7 @@ jboolean Java_org_yuzu_yuzu_1emu_utils_GameMetadata_getIsValid(JNIEnv* env, jobj
|
||||||
auto const file_type = loader->GetFileType();
|
auto const file_type = loader->GetFileType();
|
||||||
if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error)
|
if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error)
|
||||||
return false;
|
return false;
|
||||||
if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI ||
|
if ((file_type == Loader::FileType::NSP || file_type == Loader::FileType::XCI) && !Loader::IsBootableGameContainer(file, file_type))
|
||||||
file_type == Loader::FileType::NSZ || file_type == Loader::FileType::XCZ) &&
|
|
||||||
!Loader::IsBootableGameContainer(file, file_type))
|
|
||||||
return false;
|
return false;
|
||||||
u64 program_id = 0;
|
u64 program_id = 0;
|
||||||
return loader->ReadProgramId(program_id) == Loader::ResultStatus::Success;
|
return loader->ReadProgramId(program_id) == Loader::ResultStatus::Success;
|
||||||
|
|
|
||||||
|
|
@ -587,6 +587,8 @@
|
||||||
<string name="fast_gpu_time_description">يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch.</string>
|
<string name="fast_gpu_time_description">يجعل اللعبة تعتقد أن عمل وحدة معالجة الرسومات ينتهي بشكل أسرع مما هو عليه في الواقع، لذلك تتوقف عن خفض الدقة ومسافة العرض لتتناسب مع سرعات جهاز Switch.</string>
|
||||||
<string name="skip_cpu_inner_invalidation">تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية</string>
|
<string name="skip_cpu_inner_invalidation">تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب.</string>
|
<string name="skip_cpu_inner_invalidation_description">يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب.</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback">إعادة قراءة وحدة معالجة الرسومات قبل إبطال صلاحية NCE</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback_description">إصلاح مؤقت. يعالج مشكلة تعطل لعبة Ender Magnolia (وغيرها من ألعاب UE). قد يؤدي إلى انخفاض في الأداء. يجري العمل على تحسينه.</string>
|
||||||
<string name="fix_bloom_effects">إصلاح تأثيرات التوهج</string>
|
<string name="fix_bloom_effects">إصلاح تأثيرات التوهج</string>
|
||||||
<string name="fix_bloom_effects_description">يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى.</string>
|
<string name="fix_bloom_effects_description">يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى.</string>
|
||||||
<string name="emulate_bgr565">محاكاة BGR565</string>
|
<string name="emulate_bgr565">محاكاة BGR565</string>
|
||||||
|
|
|
||||||
|
|
@ -577,6 +577,8 @@
|
||||||
<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="nce_invalidation_gpu_readback">在 NCE 無效化前進行 GPU 回讀</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback_description">(暫時性功能)修復 \"終結者瑪格諾莉亞:霧中綻放\" 及其它使用虛幻引擎之遊戲中的當機問題,可能會降低效能。此功能正在改善中</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>
|
||||||
|
|
|
||||||
|
|
@ -593,8 +593,10 @@
|
||||||
<string name="fast_gpu_time_description">Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks.</string>
|
<string name="fast_gpu_time_description">Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks.</string>
|
||||||
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback">GPU Readback Before NCE Invalidation</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback_description">Temporary. Fix Ender Magnolia (and other UE titles) crashes. May reduce performance. Improvement in progress.</string>
|
||||||
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
||||||
<string name="fix_bloom_effects_description">Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games.</string>
|
<string name="fix_bloom_effects_description">Removes bloom in Burnout.</string>
|
||||||
<string name="emulate_bgr565">Emulate BGR565</string>
|
<string name="emulate_bgr565">Emulate BGR565</string>
|
||||||
<string name="emulate_bgr565_description">Fixes problems with inverted colors in games or strange artifacts or strange shadows.</string>
|
<string name="emulate_bgr565_description">Fixes problems with inverted colors in games or strange artifacts or strange shadows.</string>
|
||||||
<string name="rescale_hack">Enable Legacy Rescale Pass</string>
|
<string name="rescale_hack">Enable Legacy Rescale Pass</string>
|
||||||
|
|
|
||||||
|
|
@ -639,6 +639,8 @@ struct Values {
|
||||||
Specialization::Default,
|
Specialization::Default,
|
||||||
true,
|
true,
|
||||||
true};
|
true};
|
||||||
|
SwitchableSetting<bool> nce_invalidation_gpu_readback{
|
||||||
|
linkage, false, "nce_invalidation_gpu_readback", Category::RendererHacks};
|
||||||
SwitchableSetting<bool> async_presentation{linkage,
|
SwitchableSetting<bool> async_presentation{linkage,
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
true,
|
true,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -49,10 +46,4 @@ std::vector<u8> DecompressDataZSTD(std::span<const u8> compressed) {
|
||||||
return decompressed;
|
return decompressed;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t DecompressDataZSTD(std::span<const u8> compressed, std::span<u8> output) {
|
|
||||||
const std::size_t result =
|
|
||||||
ZSTD_decompress(output.data(), output.size(), compressed.data(), compressed.size());
|
|
||||||
return ZSTD_isError(result) ? 0 : result;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Common::Compression
|
} // namespace Common::Compression
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -45,15 +42,4 @@ namespace Common::Compression {
|
||||||
*/
|
*/
|
||||||
[[nodiscard]] std::vector<u8> DecompressDataZSTD(std::span<const u8> compressed);
|
[[nodiscard]] std::vector<u8> DecompressDataZSTD(std::span<const u8> compressed);
|
||||||
|
|
||||||
/**
|
|
||||||
* Decompresses a single Zstandard frame into a caller-provided buffer of known size.
|
|
||||||
*
|
|
||||||
* @param compressed the compressed source memory region.
|
|
||||||
* @param output the destination buffer. Its size is the maximum number of bytes to write.
|
|
||||||
*
|
|
||||||
* @return the number of bytes written, or 0 if the frame is invalid or doesn't fit. An empty
|
|
||||||
* frame also returns 0.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] std::size_t DecompressDataZSTD(std::span<const u8> compressed, std::span<u8> output);
|
|
||||||
|
|
||||||
} // namespace Common::Compression
|
} // namespace Common::Compression
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,6 @@ add_library(core STATIC
|
||||||
crypto/encryption_layer.h
|
crypto/encryption_layer.h
|
||||||
crypto/key_manager.cpp
|
crypto/key_manager.cpp
|
||||||
crypto/key_manager.h
|
crypto/key_manager.h
|
||||||
crypto/ncz_decompressor.cpp
|
|
||||||
crypto/ncz_decompressor.h
|
|
||||||
crypto/partition_data_manager.cpp
|
crypto/partition_data_manager.cpp
|
||||||
crypto/partition_data_manager.h
|
crypto/partition_data_manager.h
|
||||||
crypto/xts_encryption_layer.cpp
|
crypto/xts_encryption_layer.cpp
|
||||||
|
|
|
||||||
|
|
@ -369,8 +369,8 @@ void ArmNce::SetContext(const Kernel::Svc::ThreadContext& ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ArmNce::SignalInterrupt(Kernel::KThread* thread) {
|
void ArmNce::SignalInterrupt(Kernel::KThread* thread) {
|
||||||
constexpr u64 break_loop = static_cast<u64>(HaltReason::BreakLoop);
|
// Add break loop condition.
|
||||||
if ((m_guest_ctx.esr_el1.fetch_or(break_loop) & break_loop) != 0) return;
|
m_guest_ctx.esr_el1.fetch_or(static_cast<u64>(HaltReason::BreakLoop));
|
||||||
|
|
||||||
auto* params = &thread->GetNativeExecutionParameters();
|
auto* params = &thread->GetNativeExecutionParameters();
|
||||||
LockThreadParameters(params);
|
LockThreadParameters(params);
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <unordered_map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "game_settings.h"
|
#include "game_settings.h"
|
||||||
|
|
@ -248,12 +249,30 @@ struct System::Impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetNVDECActive(bool is_nvdec_active) {
|
void NotifyNVDECChannelOpen(u64 process_id) {
|
||||||
nvdec_active = is_nvdec_active;
|
std::scoped_lock lock{nvdec_active_mutex};
|
||||||
|
++nvdec_active_channels[process_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotifyNVDECChannelClose(u64 process_id) {
|
||||||
|
std::scoped_lock lock{nvdec_active_mutex};
|
||||||
|
const auto it = nvdec_active_channels.find(process_id);
|
||||||
|
if (it == nvdec_active_channels.end()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (--it->second == 0) {
|
||||||
|
nvdec_active_channels.erase(it);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GetNVDECActive() {
|
bool GetNVDECActive() {
|
||||||
return nvdec_active;
|
std::scoped_lock lock{nvdec_active_mutex};
|
||||||
|
return !nvdec_active_channels.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsNVDECActiveForProcess(u64 process_id) {
|
||||||
|
std::scoped_lock lock{nvdec_active_mutex};
|
||||||
|
return nvdec_active_channels.contains(process_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitializeDebugger(System& system, u16 port) {
|
void InitializeDebugger(System& system, u16 port) {
|
||||||
|
|
@ -509,6 +528,8 @@ struct System::Impl {
|
||||||
|
|
||||||
mutable std::mutex suspend_guard;
|
mutable std::mutex suspend_guard;
|
||||||
std::mutex general_channel_mutex;
|
std::mutex general_channel_mutex;
|
||||||
|
std::mutex nvdec_active_mutex;
|
||||||
|
std::unordered_map<u64, u32> nvdec_active_channels;
|
||||||
std::atomic_bool is_paused{};
|
std::atomic_bool is_paused{};
|
||||||
std::atomic_bool is_shutting_down{};
|
std::atomic_bool is_shutting_down{};
|
||||||
std::atomic_bool is_powered_on{};
|
std::atomic_bool is_powered_on{};
|
||||||
|
|
@ -516,7 +537,6 @@ struct System::Impl {
|
||||||
bool extended_memory_layout : 1 = false;
|
bool extended_memory_layout : 1 = false;
|
||||||
bool exit_locked : 1 = false;
|
bool exit_locked : 1 = false;
|
||||||
bool exit_requested : 1 = false;
|
bool exit_requested : 1 = false;
|
||||||
bool nvdec_active : 1 = false;
|
|
||||||
|
|
||||||
void EnsureGeneralChannelInitialized(System& system) {
|
void EnsureGeneralChannelInitialized(System& system) {
|
||||||
if (!general_channel_event) {
|
if (!general_channel_event) {
|
||||||
|
|
@ -580,14 +600,22 @@ void System::UnstallApplication() {
|
||||||
impl->UnstallApplication();
|
impl->UnstallApplication();
|
||||||
}
|
}
|
||||||
|
|
||||||
void System::SetNVDECActive(bool is_nvdec_active) {
|
void System::NotifyNVDECChannelOpen(u64 process_id) {
|
||||||
impl->SetNVDECActive(is_nvdec_active);
|
impl->NotifyNVDECChannelOpen(process_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void System::NotifyNVDECChannelClose(u64 process_id) {
|
||||||
|
impl->NotifyNVDECChannelClose(process_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool System::GetNVDECActive() {
|
bool System::GetNVDECActive() {
|
||||||
return impl->GetNVDECActive();
|
return impl->GetNVDECActive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool System::IsNVDECActiveForProcess(u64 process_id) {
|
||||||
|
return impl->IsNVDECActiveForProcess(process_id);
|
||||||
|
}
|
||||||
|
|
||||||
void System::InitializeDebugger() {
|
void System::InitializeDebugger() {
|
||||||
impl->InitializeDebugger(*this, Settings::values.gdbstub_port.GetValue());
|
impl->InitializeDebugger(*this, Settings::values.gdbstub_port.GetValue());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue