Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
5ff6ea6d82 | |||
c2d9c6955d | |||
fbe0c211c1 | |||
db0f3c0b74 | |||
34447d7359 | |||
5f771f5661 | |||
93cd327873 | |||
12cbacffca | |||
437c78e198 |
87
.github/update_reviewers.py
vendored
87
.github/update_reviewers.py
vendored
@ -1,87 +0,0 @@
|
|||||||
from pathlib import Path
|
|
||||||
from typing import List, Set
|
|
||||||
from github import Auth, Github
|
|
||||||
from github.Repository import Repository
|
|
||||||
from github.GithubException import GithubException
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
|
|
||||||
def add_reviewers(
|
|
||||||
reviewers: Set[str], team_reviewers: Set[str], new_entries: List[str]
|
|
||||||
):
|
|
||||||
for reviewer in new_entries:
|
|
||||||
if reviewer.startswith("@"):
|
|
||||||
team_reviewers.add(reviewer[1:])
|
|
||||||
else:
|
|
||||||
reviewers.add(reviewer)
|
|
||||||
|
|
||||||
|
|
||||||
def update_reviewers(config, repo: Repository, pr_id: int) -> int:
|
|
||||||
pull_request = repo.get_pull(pr_id)
|
|
||||||
|
|
||||||
if not pull_request:
|
|
||||||
sys.stderr.writable(f"Unknown PR #{pr_id}\n")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
if pull_request.draft:
|
|
||||||
print("Not assigning reviewers for draft PRs")
|
|
||||||
return 0
|
|
||||||
|
|
||||||
pull_request_author = pull_request.user.login
|
|
||||||
reviewers = set()
|
|
||||||
team_reviewers = set()
|
|
||||||
|
|
||||||
for label in pull_request.labels:
|
|
||||||
if label.name in config:
|
|
||||||
add_reviewers(reviewers, team_reviewers, config[label.name])
|
|
||||||
|
|
||||||
if "default" in config:
|
|
||||||
add_reviewers(reviewers, team_reviewers, config["default"])
|
|
||||||
|
|
||||||
if pull_request_author in reviewers:
|
|
||||||
reviewers.remove(pull_request_author)
|
|
||||||
|
|
||||||
try:
|
|
||||||
reviewers = list(reviewers)
|
|
||||||
team_reviewers = list(team_reviewers)
|
|
||||||
print(
|
|
||||||
f"Attempting to assign reviewers ({reviewers}) and team_reviewers ({team_reviewers})"
|
|
||||||
)
|
|
||||||
pull_request.create_review_request(reviewers, team_reviewers)
|
|
||||||
return 0
|
|
||||||
except GithubException as e:
|
|
||||||
sys.stderr.write(f"Cannot assign review request for PR #{pr_id}: {e}\n")
|
|
||||||
return 1
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if len(sys.argv) != 7:
|
|
||||||
sys.stderr.write("usage: <app_id> <private_key_env_name> <installation_id> <repo_path> <pr_id> <config_path>\n")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
app_id = int(sys.argv[1])
|
|
||||||
private_key = os.environ[sys.argv[2]]
|
|
||||||
installation_id = int(sys.argv[3])
|
|
||||||
repo_path = sys.argv[4]
|
|
||||||
pr_id = int(sys.argv[5])
|
|
||||||
config_path = Path(sys.argv[6])
|
|
||||||
|
|
||||||
auth = Auth.AppAuth(app_id, private_key).get_installation_auth(installation_id)
|
|
||||||
g = Github(auth=auth)
|
|
||||||
repo = g.get_repo(repo_path)
|
|
||||||
|
|
||||||
if not repo:
|
|
||||||
sys.stderr.write("Repository not found!\n")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
if not config_path.exists():
|
|
||||||
sys.stderr.write(f'Config "{config_path}" not found!\n')
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
with open(config_path, "r") as f:
|
|
||||||
config = yaml.safe_load(f)
|
|
||||||
|
|
||||||
sys.exit(update_reviewers(config, repo, pr_id))
|
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
@ -108,7 +108,7 @@ jobs:
|
|||||||
configuration: [ Debug, Release ]
|
configuration: [ Debug, Release ]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
|
2
.github/workflows/checks.yml
vendored
2
.github/workflows/checks.yml
vendored
@ -23,7 +23,7 @@ jobs:
|
|||||||
format:
|
format:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
4
.github/workflows/flatpak.yml
vendored
4
.github/workflows/flatpak.yml
vendored
@ -24,7 +24,7 @@ jobs:
|
|||||||
RYUJINX_VERSION: "${{ inputs.ryujinx_version }}"
|
RYUJINX_VERSION: "${{ inputs.ryujinx_version }}"
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
path: Ryujinx
|
path: Ryujinx
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "git_hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
|
echo "git_hash=$(git rev-parse HEAD)" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: flathub/org.ryujinx.Ryujinx
|
repository: flathub/org.ryujinx.Ryujinx
|
||||||
token: ${{ secrets.RYUJINX_BOT_PAT }}
|
token: ${{ secrets.RYUJINX_BOT_PAT }}
|
||||||
|
28
.github/workflows/pr_triage.yml
vendored
28
.github/workflows/pr_triage.yml
vendored
@ -12,14 +12,24 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
# Grab sources to get update_reviewers.py and reviewers.yml
|
# Grab sources to get latest labeler.yml
|
||||||
- name: Fetch sources
|
- name: Fetch sources
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
# Ensure we pin the source origin as pull_request_target run under forks.
|
# Ensure we pin the source origin as pull_request_target run under forks.
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
repository: Ryujinx/Ryujinx
|
repository: Ryujinx/Ryujinx
|
||||||
ref: master
|
ref: master
|
||||||
|
|
||||||
|
- name: Checkout Ryujinx-Mako
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: Ryujinx/Ryujinx-Mako
|
||||||
|
ref: master
|
||||||
|
path: '.ryujinx-mako'
|
||||||
|
|
||||||
|
- name: Setup Ryujinx-Mako
|
||||||
|
uses: ./.ryujinx-mako/.github/actions/setup-mako
|
||||||
|
|
||||||
- name: Update labels based on changes
|
- name: Update labels based on changes
|
||||||
uses: actions/labeler@v4
|
uses: actions/labeler@v4
|
||||||
@ -27,11 +37,11 @@ jobs:
|
|||||||
sync-labels: true
|
sync-labels: true
|
||||||
dot: true
|
dot: true
|
||||||
|
|
||||||
- run: pip3 install PyGithub
|
|
||||||
|
|
||||||
- name: Assign reviewers
|
- name: Assign reviewers
|
||||||
run: |
|
run: |
|
||||||
python3 .github/update_reviewers.py ${{ secrets.MAKO_APP_ID }} "MAKO_PRIVATE_KEY" ${{ secrets.MAKO_INSTALLATION_ID }} ${{ github.repository }} ${{ github.event.pull_request.number }} .github/reviewers.yml
|
poetry -n -C .ryujinx-mako run ryujinx-mako update-reviewers ${{ github.repository }} ${{ github.event.pull_request.number }} .github/reviewers.yml
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
|
MAKO_APP_ID: ${{ secrets.MAKO_APP_ID }}
|
||||||
MAKO_PRIVATE_KEY: ${{ secrets.MAKO_PRIVATE_KEY }}
|
MAKO_PRIVATE_KEY: ${{ secrets.MAKO_PRIVATE_KEY }}
|
||||||
|
MAKO_INSTALLATION_ID: ${{ secrets.MAKO_INSTALLATION_ID }}
|
||||||
|
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@ -62,7 +62,7 @@ jobs:
|
|||||||
DOTNET_RUNTIME_IDENTIFIER: win10-x64
|
DOTNET_RUNTIME_IDENTIFIER: win10-x64
|
||||||
RELEASE_ZIP_OS_NAME: win_x64
|
RELEASE_ZIP_OS_NAME: win_x64
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
@ -150,7 +150,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
|
timeout-minutes: ${{ fromJSON(vars.JOB_TIMEOUT) }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@v3
|
- uses: actions/setup-dotnet@v3
|
||||||
with:
|
with:
|
||||||
|
@ -544,7 +544,7 @@
|
|||||||
"SwkbdMinCharacters": "Must be at least {0} characters long",
|
"SwkbdMinCharacters": "Must be at least {0} characters long",
|
||||||
"SwkbdMinRangeCharacters": "Must be {0}-{1} characters long",
|
"SwkbdMinRangeCharacters": "Must be {0}-{1} characters long",
|
||||||
"SoftwareKeyboard": "Software Keyboard",
|
"SoftwareKeyboard": "Software Keyboard",
|
||||||
"SoftwareKeyboardModeNumbersOnly": "Must be numbers only",
|
"SoftwareKeyboardModeNumeric": "Must be 0-9 or '.' only",
|
||||||
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
"SoftwareKeyboardModeAlphabet": "Must be non CJK-characters only",
|
||||||
"SoftwareKeyboardModeASCII": "Must be ASCII text only",
|
"SoftwareKeyboardModeASCII": "Must be ASCII text only",
|
||||||
"DialogControllerAppletMessagePlayerRange": "Application requests {0} player(s) with:\n\nTYPES: {1}\n\nPLAYERS: {2}\n\n{3}Please open Settings and reconfigure Input now or press Close.",
|
"DialogControllerAppletMessagePlayerRange": "Application requests {0} player(s) with:\n\nTYPES: {1}\n\nPLAYERS: {2}\n\n{3}Please open Settings and reconfigure Input now or press Close.",
|
||||||
|
@ -136,10 +136,10 @@ namespace Ryujinx.Ava.UI.Controls
|
|||||||
string localeText;
|
string localeText;
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case KeyboardMode.NumbersOnly:
|
case KeyboardMode.Numeric:
|
||||||
localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeNumbersOnly);
|
localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeNumeric);
|
||||||
validationInfoText = string.IsNullOrEmpty(validationInfoText) ? localeText : string.Join("\n", validationInfoText, localeText);
|
validationInfoText = string.IsNullOrEmpty(validationInfoText) ? localeText : string.Join("\n", validationInfoText, localeText);
|
||||||
_checkInput = text => text.All(char.IsDigit);
|
_checkInput = text => text.All(NumericCharacterValidation.IsNumeric);
|
||||||
break;
|
break;
|
||||||
case KeyboardMode.Alphabet:
|
case KeyboardMode.Alphabet:
|
||||||
localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeAlphabet);
|
localeText = LocaleManager.Instance.UpdateAndGetDynamicValue(LocaleKeys.SoftwareKeyboardModeAlphabet);
|
||||||
|
@ -128,7 +128,26 @@ namespace Ryujinx.Graphics.Shader
|
|||||||
/// <returns>GPU graphics state</returns>
|
/// <returns>GPU graphics state</returns>
|
||||||
GpuGraphicsState QueryGraphicsState()
|
GpuGraphicsState QueryGraphicsState()
|
||||||
{
|
{
|
||||||
return default;
|
return new GpuGraphicsState(
|
||||||
|
false,
|
||||||
|
InputTopology.Points,
|
||||||
|
false,
|
||||||
|
TessPatchType.Triangles,
|
||||||
|
TessSpacing.EqualSpacing,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
1f,
|
||||||
|
AlphaTestOp.Always,
|
||||||
|
0f,
|
||||||
|
default,
|
||||||
|
true,
|
||||||
|
default,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -38,6 +38,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
bool is3D = depth > 1 || gobBlocksInZ > 1;
|
bool is3D = depth > 1 || gobBlocksInZ > 1;
|
||||||
|
|
||||||
int layerSize = 0;
|
int layerSize = 0;
|
||||||
|
int layerSizeAligned = 0;
|
||||||
|
|
||||||
int[] allOffsets = new int[is3D ? Calculate3DOffsetCount(levels, depth) : levels * layers * depth];
|
int[] allOffsets = new int[is3D ? Calculate3DOffsetCount(levels, depth) : levels * layers * depth];
|
||||||
int[] mipOffsets = new int[levels];
|
int[] mipOffsets = new int[levels];
|
||||||
@ -91,6 +92,8 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
sliceSizes[level] = totalBlocksOfGobsInY * robSize;
|
sliceSizes[level] = totalBlocksOfGobsInY * robSize;
|
||||||
levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
|
levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
|
||||||
|
|
||||||
|
layerSizeAligned += levelSizes[level];
|
||||||
|
|
||||||
if (is3D)
|
if (is3D)
|
||||||
{
|
{
|
||||||
int gobSize = mipGobBlocksInY * GobSize;
|
int gobSize = mipGobBlocksInY * GobSize;
|
||||||
@ -130,28 +133,32 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
depthLevelOffset += d;
|
depthLevelOffset += d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int totalSize;
|
||||||
|
|
||||||
if (layers > 1)
|
if (layers > 1)
|
||||||
{
|
{
|
||||||
layerSize = AlignLayerSize(
|
layerSizeAligned = AlignLayerSize(
|
||||||
layerSize,
|
layerSizeAligned,
|
||||||
height,
|
height,
|
||||||
depth,
|
depth,
|
||||||
blockHeight,
|
blockHeight,
|
||||||
gobBlocksInY,
|
gobBlocksInY,
|
||||||
gobBlocksInZ,
|
gobBlocksInZ,
|
||||||
gobBlocksInTileX);
|
gobBlocksInTileX);
|
||||||
}
|
|
||||||
|
|
||||||
int totalSize;
|
if (layerSizeAligned < gpuLayerSize)
|
||||||
|
{
|
||||||
if (layerSize < gpuLayerSize)
|
totalSize = (layers - 1) * gpuLayerSize + layerSizeAligned;
|
||||||
{
|
layerSizeAligned = gpuLayerSize;
|
||||||
totalSize = (layers - 1) * gpuLayerSize + layerSize;
|
}
|
||||||
layerSize = gpuLayerSize;
|
else
|
||||||
|
{
|
||||||
|
totalSize = layerSizeAligned * layers;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
totalSize = layerSize * layers;
|
totalSize = layerSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is3D)
|
if (!is3D)
|
||||||
@ -159,7 +166,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
for (int layer = 0; layer < layers; layer++)
|
for (int layer = 0; layer < layers; layer++)
|
||||||
{
|
{
|
||||||
int baseIndex = layer * levels;
|
int baseIndex = layer * levels;
|
||||||
int baseOffset = layer * layerSize;
|
int baseOffset = layer * layerSizeAligned;
|
||||||
|
|
||||||
for (int level = 0; level < levels; level++)
|
for (int level = 0; level < levels; level++)
|
||||||
{
|
{
|
||||||
@ -168,7 +175,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new SizeInfo(mipOffsets, allOffsets, sliceSizes, levelSizes, depth, levels, layerSize, totalSize, is3D);
|
return new SizeInfo(mipOffsets, allOffsets, sliceSizes, levelSizes, depth, levels, layerSizeAligned, totalSize, is3D);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SizeInfo GetLinearTextureSize(int stride, int height, int blockHeight)
|
public static SizeInfo GetLinearTextureSize(int stride, int height, int blockHeight)
|
||||||
|
@ -967,7 +967,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
|
|
||||||
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
|
if (!_cachedConvertedBuffers.TryGetValue(offset, size, key, out var holder))
|
||||||
{
|
{
|
||||||
holder = _gd.BufferManager.Create(_gd, (size * 2 + 3) & ~3);
|
holder = _gd.BufferManager.Create(_gd, (size * 2 + 3) & ~3, baseType: BufferAllocationType.DeviceLocal);
|
||||||
|
|
||||||
_gd.PipelineInternal.EndRenderPass();
|
_gd.PipelineInternal.EndRenderPass();
|
||||||
_gd.HelperShader.ConvertI8ToI16(_gd, cbs, this, holder, offset, size);
|
_gd.HelperShader.ConvertI8ToI16(_gd, cbs, this, holder, offset, size);
|
||||||
@ -993,7 +993,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
{
|
{
|
||||||
int alignedStride = (stride + (alignment - 1)) & -alignment;
|
int alignedStride = (stride + (alignment - 1)) & -alignment;
|
||||||
|
|
||||||
holder = _gd.BufferManager.Create(_gd, (size / stride) * alignedStride);
|
holder = _gd.BufferManager.Create(_gd, (size / stride) * alignedStride, baseType: BufferAllocationType.DeviceLocal);
|
||||||
|
|
||||||
_gd.PipelineInternal.EndRenderPass();
|
_gd.PipelineInternal.EndRenderPass();
|
||||||
_gd.HelperShader.ChangeStride(_gd, cbs, this, holder, offset, size, stride, alignedStride);
|
_gd.HelperShader.ChangeStride(_gd, cbs, this, holder, offset, size, stride, alignedStride);
|
||||||
@ -1023,7 +1023,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
|
|
||||||
int convertedCount = pattern.GetConvertedCount(indexCount);
|
int convertedCount = pattern.GetConvertedCount(indexCount);
|
||||||
|
|
||||||
holder = _gd.BufferManager.Create(_gd, convertedCount * 4);
|
holder = _gd.BufferManager.Create(_gd, convertedCount * 4, baseType: BufferAllocationType.DeviceLocal);
|
||||||
|
|
||||||
_gd.PipelineInternal.EndRenderPass();
|
_gd.PipelineInternal.EndRenderPass();
|
||||||
_gd.HelperShader.ConvertIndexBuffer(_gd, cbs, this, holder, pattern, indexSize, offset, indexCount);
|
_gd.HelperShader.ConvertIndexBuffer(_gd, cbs, this, holder, pattern, indexSize, offset, indexCount);
|
||||||
|
@ -5,7 +5,6 @@ using Ryujinx.Graphics.Shader.Translation;
|
|||||||
using Silk.NET.Vulkan;
|
using Silk.NET.Vulkan;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
|
using CompareOp = Ryujinx.Graphics.GAL.CompareOp;
|
||||||
using Format = Ryujinx.Graphics.GAL.Format;
|
using Format = Ryujinx.Graphics.GAL.Format;
|
||||||
@ -27,6 +26,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
class HelperShader : IDisposable
|
class HelperShader : IDisposable
|
||||||
{
|
{
|
||||||
private const int UniformBufferAlignment = 256;
|
private const int UniformBufferAlignment = 256;
|
||||||
|
private const int ConvertElementsPerWorkgroup = 32 * 100; // Work group size of 32 times 100 elements.
|
||||||
private const string ShaderBinariesPath = "Ryujinx.Graphics.Vulkan/Shaders/SpirvBinaries";
|
private const string ShaderBinariesPath = "Ryujinx.Graphics.Vulkan/Shaders/SpirvBinaries";
|
||||||
|
|
||||||
private readonly PipelineHelperShader _pipeline;
|
private readonly PipelineHelperShader _pipeline;
|
||||||
@ -894,7 +894,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
_pipeline.SetStorageBuffers(1, sbRanges);
|
_pipeline.SetStorageBuffers(1, sbRanges);
|
||||||
|
|
||||||
_pipeline.SetProgram(_programStrideChange);
|
_pipeline.SetProgram(_programStrideChange);
|
||||||
_pipeline.DispatchCompute(1, 1, 1);
|
_pipeline.DispatchCompute(1 + elems / ConvertElementsPerWorkgroup, 1, 1);
|
||||||
|
|
||||||
gd.BufferManager.Delete(bufferHandle);
|
gd.BufferManager.Delete(bufferHandle);
|
||||||
|
|
||||||
@ -1742,7 +1742,7 @@ namespace Ryujinx.Graphics.Vulkan
|
|||||||
_pipeline.SetStorageBuffers(1, sbRanges);
|
_pipeline.SetStorageBuffers(1, sbRanges);
|
||||||
|
|
||||||
_pipeline.SetProgram(_programConvertD32S8ToD24S8);
|
_pipeline.SetProgram(_programConvertD32S8ToD24S8);
|
||||||
_pipeline.DispatchCompute(1, 1, 1);
|
_pipeline.DispatchCompute(1 + inSize / ConvertElementsPerWorkgroup, 1, 1);
|
||||||
|
|
||||||
gd.BufferManager.Delete(bufferHandle);
|
gd.BufferManager.Delete(bufferHandle);
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ void main()
|
|||||||
int sourceOffset = stride_arguments_data.w;
|
int sourceOffset = stride_arguments_data.w;
|
||||||
|
|
||||||
int strideRemainder = targetStride - sourceStride;
|
int strideRemainder = targetStride - sourceStride;
|
||||||
int invocations = int(gl_WorkGroupSize.x);
|
int invocations = int(gl_WorkGroupSize.x * gl_NumWorkGroups.x);
|
||||||
|
|
||||||
int copiesRequired = bufferSize / sourceStride;
|
int copiesRequired = bufferSize / sourceStride;
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ void main()
|
|||||||
int allInvocationCopies = copiesRequired / invocations;
|
int allInvocationCopies = copiesRequired / invocations;
|
||||||
|
|
||||||
// - Extra remainder copy that this invocation performs.
|
// - Extra remainder copy that this invocation performs.
|
||||||
int index = int(gl_LocalInvocationID.x);
|
int index = int(gl_GlobalInvocationID.x);
|
||||||
int extra = (index < (copiesRequired % invocations)) ? 1 : 0;
|
int extra = (index < (copiesRequired % invocations)) ? 1 : 0;
|
||||||
|
|
||||||
int copyCount = allInvocationCopies + extra;
|
int copyCount = allInvocationCopies + extra;
|
||||||
|
@ -23,7 +23,7 @@ layout (std430, set = 1, binding = 2) buffer out_s
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
// Determine what slice of the stride copies this invocation will perform.
|
// Determine what slice of the stride copies this invocation will perform.
|
||||||
int invocations = int(gl_WorkGroupSize.x);
|
int invocations = int(gl_WorkGroupSize.x * gl_NumWorkGroups.x);
|
||||||
|
|
||||||
int copiesRequired = pixelCount;
|
int copiesRequired = pixelCount;
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ void main()
|
|||||||
int allInvocationCopies = copiesRequired / invocations;
|
int allInvocationCopies = copiesRequired / invocations;
|
||||||
|
|
||||||
// - Extra remainder copy that this invocation performs.
|
// - Extra remainder copy that this invocation performs.
|
||||||
int index = int(gl_LocalInvocationID.x);
|
int index = int(gl_GlobalInvocationID.x);
|
||||||
int extra = (index < (copiesRequired % invocations)) ? 1 : 0;
|
int extra = (index < (copiesRequired % invocations)) ? 1 : 0;
|
||||||
|
|
||||||
int copyCount = allInvocationCopies + extra;
|
int copyCount = allInvocationCopies + extra;
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -11,9 +11,9 @@
|
|||||||
Default = 0,
|
Default = 0,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Only numbers allowed.
|
/// Only 0-9 or '.' allowed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
NumbersOnly = 1,
|
Numeric = 1,
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Only ASCII characters allowed.
|
/// Only ASCII characters allowed.
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace Ryujinx.HLE.HOS.Applets.SoftwareKeyboard
|
||||||
|
{
|
||||||
|
public static partial class NumericCharacterValidation
|
||||||
|
{
|
||||||
|
public static bool IsNumeric(char value)
|
||||||
|
{
|
||||||
|
Regex regex = NumericRegex();
|
||||||
|
|
||||||
|
return regex.IsMatch(value.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedRegex("[0-9]|.")]
|
||||||
|
private static partial Regex NumericRegex();
|
||||||
|
}
|
||||||
|
}
|
@ -154,6 +154,28 @@ namespace Ryujinx.HLE.HOS.Services.Audio
|
|||||||
return ResultCode.Success;
|
return ResultCode.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandCmif(8)] // 16.0.0+
|
||||||
|
// GetWorkBufferSizeExEx(OpusParametersEx) -> u32
|
||||||
|
public ResultCode GetWorkBufferSizeExEx(ServiceCtx context)
|
||||||
|
{
|
||||||
|
// NOTE: GetWorkBufferSizeEx use hardcoded values to compute the returned size.
|
||||||
|
// GetWorkBufferSizeExEx fixes that by using dynamic values.
|
||||||
|
// Since we're already doing that, it's fine to call it directly.
|
||||||
|
|
||||||
|
return GetWorkBufferSizeEx(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
[CommandCmif(9)] // 16.0.0+
|
||||||
|
// GetWorkBufferSizeForMultiStreamExEx(buffer<unknown<0x118>, 0x19>) -> u32
|
||||||
|
public ResultCode GetWorkBufferSizeForMultiStreamExEx(ServiceCtx context)
|
||||||
|
{
|
||||||
|
// NOTE: GetWorkBufferSizeForMultiStreamEx use hardcoded values to compute the returned size.
|
||||||
|
// GetWorkBufferSizeForMultiStreamExEx fixes that by using dynamic values.
|
||||||
|
// Since we're already doing that, it's fine to call it directly.
|
||||||
|
|
||||||
|
return GetWorkBufferSizeForMultiStreamEx(context);
|
||||||
|
}
|
||||||
|
|
||||||
private static int GetOpusMultistreamDecoderSize(int streams, int coupledStreams)
|
private static int GetOpusMultistreamDecoderSize(int streams, int coupledStreams)
|
||||||
{
|
{
|
||||||
if (streams < 1 || coupledStreams > streams || coupledStreams < 0)
|
if (streams < 1 || coupledStreams > streams || coupledStreams < 0)
|
||||||
|
@ -90,9 +90,9 @@ namespace Ryujinx.Ui.Applet
|
|||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
{
|
{
|
||||||
case KeyboardMode.NumbersOnly:
|
case KeyboardMode.Numeric:
|
||||||
_validationInfoText += "<i>Must be numbers only.</i>";
|
_validationInfoText += "<i>Must be 0-9 or '.' only.</i>";
|
||||||
_checkInput = text => text.All(char.IsDigit);
|
_checkInput = text => text.All(NumericCharacterValidation.IsNumeric);
|
||||||
break;
|
break;
|
||||||
case KeyboardMode.Alphabet:
|
case KeyboardMode.Alphabet:
|
||||||
_validationInfoText += "<i>Must be non CJK-characters only.</i>";
|
_validationInfoText += "<i>Must be non CJK-characters only.</i>";
|
||||||
|
Reference in New Issue
Block a user