Add workflow to automatically check code style issues for PRs (#4670)

* Add workflow to perform automated checks for PRs

* Downgrade Microsoft.CodeAnalysis to 4.4.0

This is a workaround to fix issues with dotnet-format.
See:
- https://github.com/dotnet/format/issues/1805
- https://github.com/dotnet/format/issues/1800

* Adjust editorconfig to be more compatible with Ryujinx code-style

* Adjust .editorconfig line endings to match .gitattributes

* Disable 'prefer switch expression' rule

* Remove naming styles

These are the default rules, so we don't need to override them.

* Silence IDE0060 in .editorconfig

* Slightly adjust .editorconfig

* Add lost workflow changes

* Move .editorconfig comment to the top

* .editorconfig: private static readonly fields should be _lowerCamelCase

* .editorconfig: Remove alignment for declarations as well

* editorconfig: Add rule for local constants

* Disable CA1822 for HLE services

* Disable CA1822 for ViewModels

Bindings won't work with static members, but this issue is silently ignored.

* Run dotnet format for the whole solution

* Check result code of SDL_GetDisplayBounds

* Fix dotnet format style issues

* Add missing trailing commas

* Update Microsoft.CodeAnalysis.CSharp to 4.6.0

Skipping 4.5.0 since it breaks dotnet format

* Restore old default naming rules for dotnet format

* Add naming rule exception for CPU tests

* checks: Include all files before excluding paths

* Fix dotnet format issues

* Check dotnet format version

* checks: Run dotnet format with severity info again

* checks: Disable naming style rules until they won't crash the process anymore

* Remove unread private member

* checks: Attempt to run analyzers 3 times before giving up

* checks: Enable naming style rules again with the new retry logic
This commit is contained in:
TSRBerry 2023-07-24 18:35:04 +02:00 committed by GitHub
parent 487261592e
commit eb528ae0f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
84 changed files with 252 additions and 160 deletions

View File

@ -1,8 +1,7 @@
# Remove the line below if you want to inherit .editorconfig settings from higher directories # Remove the line below if you want to inherit .editorconfig settings from higher directories
root = true root = true
# C# files [*]
[*.cs]
#### Core EditorConfig Options #### #### Core EditorConfig Options ####
@ -12,8 +11,11 @@ indent_style = space
tab_width = 4 tab_width = 4
# New line preferences # New line preferences
end_of_line = crlf end_of_line = lf
insert_final_newline = false insert_final_newline = true
# C# files
[*.cs]
#### .NET Coding Conventions #### #### .NET Coding Conventions ####
@ -59,7 +61,7 @@ dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_readonly_field = true:suggestion dotnet_style_readonly_field = true:suggestion
# Parameter preferences # Parameter preferences
dotnet_code_quality_unused_parameters = all:suggestion dotnet_code_quality_unused_parameters = all:silent
#### C# Coding Conventions #### #### C# Coding Conventions ####
@ -85,7 +87,7 @@ csharp_style_expression_bodied_properties = true:silent
# Pattern matching preferences # Pattern matching preferences
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
csharp_style_prefer_switch_expression = true:suggestion csharp_style_prefer_switch_expression = false:silent
# Null-checking preferences # Null-checking preferences
csharp_style_conditional_delegate_call = true:suggestion csharp_style_conditional_delegate_call = true:suggestion
@ -94,6 +96,7 @@ csharp_style_conditional_delegate_call = true:suggestion
csharp_prefer_static_local_function = true:suggestion csharp_prefer_static_local_function = true:suggestion
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent
csharp_style_prefer_readonly_struct = true csharp_style_prefer_readonly_struct = true
csharp_style_prefer_method_group_conversion = true
# Code-block preferences # Code-block preferences
csharp_prefer_braces = true:silent csharp_prefer_braces = true:silent
@ -109,6 +112,7 @@ csharp_style_prefer_range_operator = true:suggestion
csharp_style_throw_expression = true:suggestion csharp_style_throw_expression = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent csharp_style_unused_value_expression_statement_preference = discard_variable:silent
csharp_style_implicit_object_creation_when_type_is_apparent = true
# 'using' directive preferences # 'using' directive preferences
csharp_using_directive_placement = outside_namespace:silent csharp_using_directive_placement = outside_namespace:silent
@ -140,7 +144,6 @@ csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false csharp_space_before_comma = false
csharp_space_before_dot = false csharp_space_before_dot = false
@ -158,23 +161,31 @@ csharp_space_between_square_brackets = false
# Wrapping preferences # Wrapping preferences
csharp_preserve_single_line_blocks = true csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true csharp_preserve_single_line_statements = false
#### Naming styles #### #### Naming styles ####
# Naming rules # Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion dotnet_naming_rule.interfaces_should_be_prefixed_with_I.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface dotnet_naming_rule.interfaces_should_be_prefixed_with_I.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i dotnet_naming_rule.interfaces_should_be_prefixed_with_I.style = IPascalCase
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case dotnet_naming_rule.types_should_be_pascal_case.style = PascalCase
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case dotnet_naming_rule.non_field_members_should_be_pascal_case.style = PascalCase
dotnet_naming_rule.private_static_readonly_fields_should_be_camel_case_and_prefixed_with__.symbols = private_static_readonly_fields
dotnet_naming_rule.private_static_readonly_fields_should_be_camel_case_and_prefixed_with__.severity = suggestion
dotnet_naming_rule.private_static_readonly_fields_should_be_camel_case_and_prefixed_with__.style = _camelCase
dotnet_naming_rule.local_constants_should_be_pascal_case.symbols = local_constants
dotnet_naming_rule.local_constants_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.local_constants_should_be_pascal_case.style = PascalCase
# Symbol specifications # Symbol specifications
@ -190,14 +201,39 @@ dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, meth
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers = dotnet_naming_symbols.non_field_members.required_modifiers =
dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field
dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private
dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = static, readonly
dotnet_naming_symbols.local_constants.applicable_kinds = local
dotnet_naming_symbols.local_constants.applicable_accessibilities = local
dotnet_naming_symbols.local_constants.required_modifiers = const
# Naming styles # Naming styles
dotnet_naming_style.pascal_case.required_prefix = dotnet_naming_style._camelCase.required_prefix = _
dotnet_naming_style.pascal_case.required_suffix = dotnet_naming_style._camelCase.required_suffix =
dotnet_naming_style.pascal_case.word_separator = dotnet_naming_style._camelCase.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case dotnet_naming_style._camelCase.capitalization = camel_case
dotnet_naming_style.begins_with_i.required_prefix = I dotnet_naming_style.PascalCase.required_prefix =
dotnet_naming_style.begins_with_i.required_suffix = dotnet_naming_style.PascalCase.required_suffix =
dotnet_naming_style.begins_with_i.word_separator = dotnet_naming_style.PascalCase.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case dotnet_naming_style.PascalCase.capitalization = pascal_case
dotnet_naming_style.IPascalCase.required_prefix = I
dotnet_naming_style.IPascalCase.required_suffix =
dotnet_naming_style.IPascalCase.word_separator =
dotnet_naming_style.IPascalCase.capitalization = pascal_case
[src/Ryujinx.HLE/HOS/Services/**.cs]
# Disable "mark members as static" rule for services
dotnet_diagnostic.CA1822.severity = none
[src/Ryujinx.Ava/UI/ViewModels/**.cs]
# Disable "mark members as static" rule for ViewModels
dotnet_diagnostic.CA1822.severity = none
[src/Ryujinx.Tests/Cpu/*.cs]
# Disable naming rules for CPU tests
dotnet_diagnostic.IDE1006.severity = none

View File

@ -1,19 +1,10 @@
name: Build job name: Build job
on: on:
workflow_dispatch: workflow_call:
inputs: {}
pull_request:
branches: [ master ]
paths-ignore:
- '.github/**'
- '*.yml'
- '*.json'
- '*.config'
- 'README.md'
concurrency: concurrency:
group: pr-checks-${{ github.event.number }} group: pr-builds-${{ github.event.number }}
cancel-in-progress: true cancel-in-progress: true
env: env:

71
.github/workflows/checks.yml vendored Normal file
View File

@ -0,0 +1,71 @@
name: Perform checks
on:
pull_request:
branches: [ master ]
paths:
- '**'
- '!.github/**'
- '!*.yml'
- '!*.config'
- '!README.md'
- '.github/workflows/*.yml'
permissions:
pull-requests: write
checks: write
concurrency:
group: pr-checks-${{ github.event.number }}
cancel-in-progress: true
jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: actions/setup-dotnet@v3
with:
global-json-file: global.json
- run: dotnet restore
- name: Print dotnet format version
run: dotnet format --version
- name: Run dotnet format whitespace
run: |
dotnet format whitespace --verify-no-changes --report ./whitespace-report.json -v d
- name: Run dotnet format style
run: |
dotnet format style --severity info --verify-no-changes --report ./style-report.json -v d
# For some reason this step sometimes fails with exit code 139 (segfault?),
# so should that be the case we'll try again (3 tries max).
- name: Run dotnet format analyzers
run: |
attempt=0
exit_code=139
until [ $attempt -ge 3 ] || [ $exit_code -ne 139 ]; do
((attempt+=1))
exit_code=0
echo "Attempt: ${attempt}/3"
dotnet format analyzers --severity info --verify-no-changes --report ./analyzers-report.json -v d || exit_code=$?
done
exit $exit_code
- name: Upload report
if: failure()
uses: actions/upload-artifact@v3
with:
name: dotnet-format
path: ./*-report.json
pr_build:
uses: ./.github/workflows/build.yml
needs: format
secrets: inherit

View File

@ -1,8 +1,10 @@
name: Comment PR artifacts links name: Comment PR artifacts links
on: on:
workflow_run: workflow_run:
workflows: ['Build job'] workflows: ['Perform checks']
types: [completed] types: [completed]
jobs: jobs:
pr_comment: pr_comment:
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'

View File

@ -20,7 +20,7 @@
<PackageVersion Include="jp2masa.Avalonia.Flexbox" Version="0.2.0" /> <PackageVersion Include="jp2masa.Avalonia.Flexbox" Version="0.2.0" />
<PackageVersion Include="LibHac" Version="0.18.0" /> <PackageVersion Include="LibHac" Version="0.18.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" /> <PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.5.0" /> <PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.6.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.6.3" /> <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" /> <PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" />
<PackageVersion Include="MsgPack.Cli" Version="1.0.1" /> <PackageVersion Include="MsgPack.Cli" Version="1.0.1" />

View File

@ -31,7 +31,7 @@ namespace Ryujinx.Audio.Backends.OpenAL
_stillRunning = true; _stillRunning = true;
_updaterThread = new Thread(Update) _updaterThread = new Thread(Update)
{ {
Name = "HardwareDeviceDriver.OpenAL" Name = "HardwareDeviceDriver.OpenAL",
}; };
_updaterThread.Start(); _updaterThread.Start();

View File

@ -67,7 +67,7 @@ namespace Ryujinx.Audio.Backends.OpenAL
{ {
DriverIdentifier = buffer.DataPointer, DriverIdentifier = buffer.DataPointer,
BufferId = AL.GenBuffer(), BufferId = AL.GenBuffer(),
SampleCount = GetSampleCount(buffer) SampleCount = GetSampleCount(buffer),
}; };
AL.BufferData(driverBuffer.BufferId, _targetFormat, buffer.Data, (int)RequestedSampleRate); AL.BufferData(driverBuffer.BufferId, _targetFormat, buffer.Data, (int)RequestedSampleRate);

View File

@ -7,7 +7,6 @@ using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using static Ryujinx.Audio.Integration.IHardwareDeviceDriver; using static Ryujinx.Audio.Integration.IHardwareDeviceDriver;
using static SDL2.SDL; using static SDL2.SDL;
@ -111,7 +110,7 @@ namespace Ryujinx.Audio.Backends.SDL2
channels = (byte)requestedChannelCount, channels = (byte)requestedChannelCount,
format = GetSDL2Format(requestedSampleFormat), format = GetSDL2Format(requestedSampleFormat),
freq = (int)requestedSampleRate, freq = (int)requestedSampleRate,
samples = (ushort)sampleCount samples = (ushort)sampleCount,
}; };
} }

View File

@ -8,6 +8,6 @@
Alsa = 3, Alsa = 3,
CoreAudio = 4, CoreAudio = 4,
Wasapi = 5, Wasapi = 5,
Dummy = 6 Dummy = 6,
} }
} }

View File

@ -3,6 +3,6 @@
public enum SoundIoDeviceAim public enum SoundIoDeviceAim
{ {
SoundIoDeviceAimInput = 0, SoundIoDeviceAimInput = 0,
SoundIoDeviceAimOutput = 1 SoundIoDeviceAimOutput = 1,
} }
} }

View File

@ -4,6 +4,6 @@
{ {
List, List,
Grid, Grid,
Chip Chip,
} }
} }

View File

@ -25,7 +25,7 @@ namespace Ryujinx.Common
_workerThread = new Thread(DoWork) _workerThread = new Thread(DoWork)
{ {
Name = name, Name = name,
IsBackground = true IsBackground = true,
}; };
_workerThread.Start(); _workerThread.Start();
} }

View File

@ -8,6 +8,6 @@ namespace Ryujinx.Common.Configuration
{ {
Auto, Auto,
Off, Off,
On On,
} }
} }

View File

@ -7,6 +7,6 @@ namespace Ryujinx.Common.Configuration
public enum GraphicsBackend public enum GraphicsBackend
{ {
Vulkan, Vulkan,
OpenGl OpenGl,
} }
} }

View File

@ -9,6 +9,6 @@ namespace Ryujinx.Common.Configuration
None, None,
Error, Error,
Slowdowns, Slowdowns,
All All,
} }
} }

View File

@ -8,6 +8,6 @@ namespace Ryujinx.Common.Configuration.Hid.Controller.Motion
{ {
Invalid, Invalid,
GamepadDriver, GamepadDriver,
CemuHook CemuHook,
} }
} }

View File

@ -8,6 +8,6 @@ namespace Ryujinx.Common.Configuration
{ {
SoftwarePageTable, SoftwarePageTable,
HostMapped, HostMapped,
HostMappedUnsafe HostMappedUnsafe,
} }
} }

View File

@ -6,6 +6,6 @@
OglThreadControlDefault = 0, OglThreadControlDefault = 0,
OglThreadControlEnable = 1, OglThreadControlEnable = 1,
OglThreadControlDisable = 2 OglThreadControlDisable = 2,
} }
} }

View File

@ -14,6 +14,6 @@ namespace Ryujinx.Common.Logging
Guest, Guest,
AccessLog, AccessLog,
Notice, Notice,
Trace Trace,
} }
} }

View File

@ -179,7 +179,7 @@ namespace Ryujinx.Cpu
{ {
addressSpace = null; addressSpace = null;
const MemoryAllocationFlags asFlags = MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible; const MemoryAllocationFlags AsFlags = MemoryAllocationFlags.Reserve | MemoryAllocationFlags.ViewCompatible;
ulong minAddressSpaceSize = Math.Min(asSize, 1UL << 36); ulong minAddressSpaceSize = Math.Min(asSize, 1UL << 36);
@ -191,8 +191,8 @@ namespace Ryujinx.Cpu
try try
{ {
baseMemory = new MemoryBlock(addressSpaceSize, asFlags); baseMemory = new MemoryBlock(addressSpaceSize, AsFlags);
mirrorMemory = new MemoryBlock(addressSpaceSize, asFlags); mirrorMemory = new MemoryBlock(addressSpaceSize, AsFlags);
addressSpace = new AddressSpace(backingMemory, baseMemory, mirrorMemory, addressSpaceSize, supports4KBPages); addressSpace = new AddressSpace(backingMemory, baseMemory, mirrorMemory, addressSpaceSize, supports4KBPages);
break; break;

View File

@ -22,6 +22,6 @@ namespace Ryujinx.Cpu.AppleHv.Arm
UserNoneKernelReadWrite = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (0UL << (int)ApShift), UserNoneKernelReadWrite = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (0UL << (int)ApShift),
UserNoneKernelRead = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (2UL << (int)ApShift), UserNoneKernelRead = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (2UL << (int)ApShift),
UserReadKernelRead = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (3UL << (int)ApShift) UserReadKernelRead = (1UL << (int)PxnShift) | (1UL << (int)UxnShift) | (3UL << (int)ApShift),
} }
} }

View File

@ -56,7 +56,7 @@ namespace Ryujinx.Graphics.Device
TypeCode.Double => sizeof(double), TypeCode.Double => sizeof(double),
TypeCode.Decimal => sizeof(decimal), TypeCode.Decimal => sizeof(decimal),
TypeCode.Boolean => sizeof(bool), TypeCode.Boolean => sizeof(bool),
_ => throw new ArgumentException($"Length for type \"{type.Name}\" is unknown.") _ => throw new ArgumentException($"Length for type \"{type.Name}\" is unknown."),
}; };
} }
} }

View File

@ -412,7 +412,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading
public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved) public ICounterEvent ReportCounter(CounterType type, EventHandler<ulong> resultHandler, float divisor, bool hostReserved)
{ {
ThreadedCounterEvent evt = new ThreadedCounterEvent(this, type, _lastSampleCounterClear); ThreadedCounterEvent evt = new(this, type, _lastSampleCounterClear);
New<ReportCounterCommand>().Set(Ref(evt), type, Ref(resultHandler), divisor, hostReserved); New<ReportCounterCommand>().Set(Ref(evt), type, Ref(resultHandler), divisor, hostReserved);
QueueCommand(); QueueCommand();

View File

@ -187,7 +187,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
X = scale * 2f / viewportWidth, X = scale * 2f / viewportWidth,
Y = scale * 2f / viewportHeight, Y = scale * 2f / viewportHeight,
Z = 1, Z = 1,
W = disableTransformF W = disableTransformF,
}); });
} }
} }
@ -210,7 +210,7 @@ namespace Ryujinx.Graphics.Gpu.Memory
ReadOnlySpan<byte> data = MemoryMarshal.Cast<SupportBuffer, byte>(MemoryMarshal.CreateSpan(ref _data, 1)); ReadOnlySpan<byte> data = MemoryMarshal.Cast<SupportBuffer, byte>(MemoryMarshal.CreateSpan(ref _data, 1));
_renderer.SetBufferData(_handle, _startOffset, data.Slice(_startOffset, _endOffset - _startOffset)); _renderer.SetBufferData(_handle, _startOffset, data[_startOffset.._endOffset]);
_startOffset = -1; _startOffset = -1;
_endOffset = -1; _endOffset = -1;

View File

@ -8,8 +8,6 @@ using System.Threading;
namespace Ryujinx.Graphics.Gpu namespace Ryujinx.Graphics.Gpu
{ {
using Texture = Image.Texture;
/// <summary> /// <summary>
/// GPU image presentation window. /// GPU image presentation window.
/// </summary> /// </summary>
@ -202,13 +200,13 @@ namespace Ryujinx.Graphics.Gpu
{ {
pt.AcquireCallback(_context, pt.UserObj); pt.AcquireCallback(_context, pt.UserObj);
Texture texture = pt.Cache.FindOrCreateTexture(null, TextureSearchFlags.WithUpscale, pt.Info, 0, pt.Range); Image.Texture texture = pt.Cache.FindOrCreateTexture(null, TextureSearchFlags.WithUpscale, pt.Info, 0, pt.Range);
pt.Cache.Tick(); pt.Cache.Tick();
texture.SynchronizeMemory(); texture.SynchronizeMemory();
ImageCrop crop = new ImageCrop( ImageCrop crop = new(
(int)(pt.Crop.Left * texture.ScaleFactor), (int)(pt.Crop.Left * texture.ScaleFactor),
(int)MathF.Ceiling(pt.Crop.Right * texture.ScaleFactor), (int)MathF.Ceiling(pt.Crop.Right * texture.ScaleFactor),
(int)(pt.Crop.Top * texture.ScaleFactor), (int)(pt.Crop.Top * texture.ScaleFactor),

View File

@ -15,6 +15,6 @@
Tsec = 0xe0, Tsec = 0xe0,
Tsecb = 0xe1, Tsecb = 0xe1,
Nvjpg = 0xc0, Nvjpg = 0xc0,
Nvdec = 0xf0 Nvdec = 0xf0,
} }
} }

View File

@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Host1x
_syncMgr = syncMgr; _syncMgr = syncMgr;
_state = new DeviceState<Host1xClassRegisters>(new Dictionary<string, RwCallback> _state = new DeviceState<Host1xClassRegisters>(new Dictionary<string, RwCallback>
{ {
{ nameof(Host1xClassRegisters.WaitSyncpt32), new RwCallback(WaitSyncpt32, null) } { nameof(Host1xClassRegisters.WaitSyncpt32), new RwCallback(WaitSyncpt32, null) },
}); });
} }

View File

@ -16,6 +16,6 @@
NonIncrW, NonIncrW,
GatherW, GatherW,
RestartW, RestartW,
Extend Extend,
} }
} }

View File

@ -57,7 +57,7 @@ namespace Ryujinx.Graphics.Host1x
_state = new DeviceState<ThiRegisters>(new Dictionary<string, RwCallback> _state = new DeviceState<ThiRegisters>(new Dictionary<string, RwCallback>
{ {
{ nameof(ThiRegisters.IncrSyncpt), new RwCallback(IncrSyncpt, null) }, { nameof(ThiRegisters.IncrSyncpt), new RwCallback(IncrSyncpt, null) },
{ nameof(ThiRegisters.Method1), new RwCallback(Method1, null) } { nameof(ThiRegisters.Method1), new RwCallback(Method1, null) },
}); });
_previousContextId = -1; _previousContextId = -1;

View File

@ -127,7 +127,7 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.H264
35, 42, 49, 56, 57, 50, 43, 36, 35, 42, 49, 56, 57, 50, 43, 36,
29, 22, 15, 23, 30, 37, 44, 51, 29, 22, 15, 23, 30, 37, 44, 51,
58, 59, 52, 45, 38, 31, 39, 46, 58, 59, 52, 45, 38, 31, 39, 46,
53, 60, 61, 54, 47, 55, 62, 63 53, 60, 61, 54, 47, 55, 62, 63,
}; };
private static ReadOnlySpan<byte> ZigZagScan => new byte[] private static ReadOnlySpan<byte> ZigZagScan => new byte[]
@ -135,7 +135,7 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.H264
0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4, 0 + 0 * 4, 1 + 0 * 4, 0 + 1 * 4, 0 + 2 * 4,
1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4, 1 + 1 * 4, 2 + 0 * 4, 3 + 0 * 4, 2 + 1 * 4,
1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4, 1 + 2 * 4, 0 + 3 * 4, 1 + 3 * 4, 2 + 2 * 4,
3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4 3 + 1 * 4, 3 + 2 * 4, 2 + 3 * 4, 3 + 3 * 4,
}; };
private static void WriteScalingList(ref H264BitStreamWriter writer, IArray<byte> list) private static void WriteScalingList(ref H264BitStreamWriter writer, IArray<byte> list)

View File

@ -10,6 +10,6 @@
Verbose = 40, Verbose = 40,
Debug = 48, Debug = 48,
Trace = 56, Trace = 56,
MaxOffset = 64 MaxOffset = 64,
} }
} }

View File

@ -13,7 +13,7 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
private static readonly Dictionary<string, (int, int)> _librariesWhitelist = new() private static readonly Dictionary<string, (int, int)> _librariesWhitelist = new()
{ {
{ AvCodecLibraryName, (58, 59) }, { AvCodecLibraryName, (58, 59) },
{ AvUtilLibraryName, (56, 57) } { AvUtilLibraryName, (56, 57) },
}; };
private static string FormatLibraryNameForCurrentOs(string libraryName, int version) private static string FormatLibraryNameForCurrentOs(string libraryName, int version)

View File

@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Nvdec
_rm = new ResourceManager(gmm, new SurfaceCache(gmm)); _rm = new ResourceManager(gmm, new SurfaceCache(gmm));
_state = new DeviceState<NvdecRegisters>(new Dictionary<string, RwCallback> _state = new DeviceState<NvdecRegisters>(new Dictionary<string, RwCallback>
{ {
{ nameof(NvdecRegisters.Execute), new RwCallback(Execute, null) } { nameof(NvdecRegisters.Execute), new RwCallback(Execute, null) },
}); });
_contexts = new ConcurrentDictionary<long, NvdecDecoderContext>(); _contexts = new ConcurrentDictionary<long, NvdecDecoderContext>();
} }

View File

@ -116,7 +116,7 @@ namespace Ryujinx.Graphics.Nvdec.Types.H264
FrameType = 0, FrameType = 0,
PicWidthInMbsMinus1 = PicWidthInMbs - 1, PicWidthInMbsMinus1 = PicWidthInMbs - 1,
PicHeightInMapUnitsMinus1 = (PicHeightInMbs >> (FrameMbsOnlyFlag != 0 ? 0 : 1)) - 1, PicHeightInMapUnitsMinus1 = (PicHeightInMbs >> (FrameMbsOnlyFlag != 0 ? 0 : 1)) - 1,
QpprimeYZeroTransformBypassFlag = QpprimeYZeroTransformBypassFlag QpprimeYZeroTransformBypassFlag = QpprimeYZeroTransformBypassFlag,
}; };
} }
} }

View File

@ -68,7 +68,7 @@ namespace Ryujinx.Graphics.Nvdec.Types.Vp8
FirstPartSize = FirstPartSize, FirstPartSize = FirstPartSize,
Version = Version, Version = Version,
FrameWidth = FrameWidth, FrameWidth = FrameWidth,
FrameHeight = FrameHeight FrameHeight = FrameHeight,
}; };
} }
} }

View File

@ -7,6 +7,6 @@
FrameSizeChanged = 1 << 2, FrameSizeChanged = 1 << 2,
ErrorResilientMode = 1 << 3, ErrorResilientMode = 1 << 3,
LastShowFrame = 1 << 4, LastShowFrame = 1 << 4,
IntraOnly = 1 << 5 IntraOnly = 1 << 5,
} }
} }

View File

@ -80,7 +80,7 @@ namespace Ryujinx.Graphics.Nvdec.Types.Vp9
SegmentFeatureData = Seg.FeatureData, SegmentFeatureData = Seg.FeatureData,
ModeRefDeltaEnabled = Lf.ModeRefDeltaEnabled != 0, ModeRefDeltaEnabled = Lf.ModeRefDeltaEnabled != 0,
RefDeltas = Lf.RefDeltas, RefDeltas = Lf.RefDeltas,
ModeDeltas = Lf.ModeDeltas ModeDeltas = Lf.ModeDeltas,
}; };
} }
} }

View File

@ -668,7 +668,7 @@ namespace Ryujinx.Graphics.OpenGL
ShaderStage.TessellationEvaluation => ShaderType.TessEvaluationShader, ShaderStage.TessellationEvaluation => ShaderType.TessEvaluationShader,
ShaderStage.Geometry => ShaderType.GeometryShader, ShaderStage.Geometry => ShaderType.GeometryShader,
ShaderStage.Fragment => ShaderType.FragmentShader, ShaderStage.Fragment => ShaderType.FragmentShader,
_ => ShaderType.VertexShader _ => ShaderType.VertexShader,
}; };
} }
} }

View File

@ -37,7 +37,7 @@ namespace Ryujinx.Graphics.OpenGL
AmdUnix, AmdUnix,
IntelWindows, IntelWindows,
IntelUnix, IntelUnix,
Nvidia Nvidia,
} }
private static readonly Lazy<GpuVendor> _gpuVendor = new(GetGpuVendor); private static readonly Lazy<GpuVendor> _gpuVendor = new(GetGpuVendor);

View File

@ -33,7 +33,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
info.BorderColor.Red, info.BorderColor.Red,
info.BorderColor.Green, info.BorderColor.Green,
info.BorderColor.Blue, info.BorderColor.Blue,
info.BorderColor.Alpha info.BorderColor.Alpha,
}; };
GL.SamplerParameter(Handle, SamplerParameterName.TextureBorderColor, borderColor); GL.SamplerParameter(Handle, SamplerParameterName.TextureBorderColor, borderColor);

View File

@ -133,7 +133,7 @@ void main()
1 => SizedInternalFormat.R8ui, 1 => SizedInternalFormat.R8ui,
2 => SizedInternalFormat.Rg8ui, 2 => SizedInternalFormat.Rg8ui,
4 => SizedInternalFormat.Rgba8ui, 4 => SizedInternalFormat.Rgba8ui,
_ => throw new ArgumentException($"Invalid components count {componentsCount}.") _ => throw new ArgumentException($"Invalid components count {componentsCount}."),
}; };
} }
else if (componentSize == 2) else if (componentSize == 2)
@ -143,7 +143,7 @@ void main()
1 => SizedInternalFormat.R16ui, 1 => SizedInternalFormat.R16ui,
2 => SizedInternalFormat.Rg16ui, 2 => SizedInternalFormat.Rg16ui,
4 => SizedInternalFormat.Rgba16ui, 4 => SizedInternalFormat.Rgba16ui,
_ => throw new ArgumentException($"Invalid components count {componentsCount}.") _ => throw new ArgumentException($"Invalid components count {componentsCount}."),
}; };
} }
else if (componentSize == 4) else if (componentSize == 4)
@ -153,7 +153,7 @@ void main()
1 => SizedInternalFormat.R32ui, 1 => SizedInternalFormat.R32ui,
2 => SizedInternalFormat.Rg32ui, 2 => SizedInternalFormat.Rg32ui,
4 => SizedInternalFormat.Rgba32ui, 4 => SizedInternalFormat.Rgba32ui,
_ => throw new ArgumentException($"Invalid components count {componentsCount}.") _ => throw new ArgumentException($"Invalid components count {componentsCount}."),
}; };
} }
else else

View File

@ -173,7 +173,7 @@ void main()
4 => SizedInternalFormat.R32ui, 4 => SizedInternalFormat.R32ui,
8 => SizedInternalFormat.Rg32ui, 8 => SizedInternalFormat.Rg32ui,
16 => SizedInternalFormat.Rgba32ui, 16 => SizedInternalFormat.Rgba32ui,
_ => throw new ArgumentException($"Invalid bytes per pixel {bytesPerPixel}.") _ => throw new ArgumentException($"Invalid bytes per pixel {bytesPerPixel}."),
}; };
} }

View File

@ -72,7 +72,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
(int)Info.SwizzleR.Convert(), (int)Info.SwizzleR.Convert(),
(int)Info.SwizzleG.Convert(), (int)Info.SwizzleG.Convert(),
(int)Info.SwizzleB.Convert(), (int)Info.SwizzleB.Convert(),
(int)Info.SwizzleA.Convert() (int)Info.SwizzleA.Convert(),
}; };
if (Info.Format == Format.A1B5G5R5Unorm) if (Info.Format == Format.A1B5G5R5Unorm)
@ -210,7 +210,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
Target.Texture2DMultisample => Target.Texture2D, Target.Texture2DMultisample => Target.Texture2D,
Target.Texture2DMultisampleArray => Target.Texture2DArray, Target.Texture2DMultisampleArray => Target.Texture2DArray,
_ => Target _ => Target,
}; };
TextureView intermmediate = _renderer.TextureCopy.IntermediatePool.GetOrCreateWithAtLeast( TextureView intermmediate = _renderer.TextureCopy.IntermediatePool.GetOrCreateWithAtLeast(
@ -354,7 +354,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget.TextureCubeMapArray => (layer / 6) * mipSize, TextureTarget.TextureCubeMapArray => (layer / 6) * mipSize,
TextureTarget.Texture1DArray => layer * mipSize, TextureTarget.Texture1DArray => layer * mipSize,
TextureTarget.Texture2DArray => layer * mipSize, TextureTarget.Texture2DArray => layer * mipSize,
_ => 0 _ => 0,
}; };
} }

View File

@ -210,7 +210,7 @@ namespace Ryujinx.Graphics.OpenGL
GL.Arb.MaxShaderCompilerThreads(Math.Min(Environment.ProcessorCount, 8)); GL.Arb.MaxShaderCompilerThreads(Math.Min(Environment.ProcessorCount, 8));
} }
_counters.Initialize(_pipeline); _counters.Initialize();
// This is required to disable [0, 1] clamping for SNorm outputs on compatibility profiles. // This is required to disable [0, 1] clamping for SNorm outputs on compatibility profiles.
// This call is expected to fail if we're running with a core profile, // This call is expected to fail if we're running with a core profile,

View File

@ -5,7 +5,6 @@ using Ryujinx.Graphics.OpenGL.Image;
using Ryujinx.Graphics.OpenGL.Queries; using Ryujinx.Graphics.OpenGL.Queries;
using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader;
using System; using System;
using System.Runtime.CompilerServices;
namespace Ryujinx.Graphics.OpenGL namespace Ryujinx.Graphics.OpenGL
{ {
@ -44,7 +43,7 @@ namespace Ryujinx.Graphics.OpenGL
private CounterQueueEvent _activeConditionalRender; private CounterQueueEvent _activeConditionalRender;
private Vector4<int>[] _fpIsBgra = new Vector4<int>[SupportBuffer.FragmentIsBgraCount]; private readonly Vector4<int>[] _fpIsBgra = new Vector4<int>[SupportBuffer.FragmentIsBgraCount];
private readonly (TextureBase, Format)[] _images; private readonly (TextureBase, Format)[] _images;
private TextureBase _unit0Texture; private TextureBase _unit0Texture;

View File

@ -13,8 +13,6 @@ namespace Ryujinx.Graphics.OpenGL.Queries
public CounterType Type { get; } public CounterType Type { get; }
public bool Disposed { get; private set; } public bool Disposed { get; private set; }
private readonly Pipeline _pipeline;
private readonly Queue<CounterQueueEvent> _events = new(); private readonly Queue<CounterQueueEvent> _events = new();
private CounterQueueEvent _current; private CounterQueueEvent _current;
@ -30,12 +28,10 @@ namespace Ryujinx.Graphics.OpenGL.Queries
private readonly Thread _consumerThread; private readonly Thread _consumerThread;
internal CounterQueue(Pipeline pipeline, CounterType type) internal CounterQueue(CounterType type)
{ {
Type = type; Type = type;
_pipeline = pipeline;
QueryTarget glType = GetTarget(Type); QueryTarget glType = GetTarget(Type);
_queryPool = new Queue<BufferedQuery>(QueryPoolInitialSize); _queryPool = new Queue<BufferedQuery>(QueryPoolInitialSize);

View File

@ -14,12 +14,12 @@ namespace Ryujinx.Graphics.OpenGL.Queries
_counterQueues = new CounterQueue[count]; _counterQueues = new CounterQueue[count];
} }
public void Initialize(Pipeline pipeline) public void Initialize()
{ {
for (int index = 0; index < _counterQueues.Length; index++) for (int index = 0; index < _counterQueues.Length; index++)
{ {
CounterType type = (CounterType)index; CounterType type = (CounterType)index;
_counterQueues[index] = new CounterQueue(pipeline, type); _counterQueues[index] = new CounterQueue(type);
} }
} }

View File

@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.OpenGL
{ {
Info = view.Info, Info = view.Info,
View = view, View = view,
RemainingFrames = DisposedLiveFrames RemainingFrames = DisposedLiveFrames,
}); });
} }
} }

View File

@ -24,7 +24,7 @@ namespace Ryujinx.Graphics.OpenGL
SyncHandle handle = new() SyncHandle handle = new()
{ {
ID = id, ID = id,
Handle = GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None) Handle = GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None),
}; };

View File

@ -1,6 +1,6 @@
namespace Ryujinx.Graphics.Shader namespace Ryujinx.Graphics.Shader
{ {
public struct BufferDescriptor public readonly struct BufferDescriptor
{ {
// New fields should be added to the end of the struct to keep disk shader cache compatibility. // New fields should be added to the end of the struct to keep disk shader cache compatibility.

View File

@ -11,7 +11,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
{ {
class OperandManager class OperandManager
{ {
private Dictionary<AstOperand, string> _locals; private readonly Dictionary<AstOperand, string> _locals;
public OperandManager() public OperandManager()
{ {

View File

@ -13,8 +13,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
{ {
static class Declarations static class Declarations
{ {
private static readonly string[] _stagePrefixes = { "cp", "vp", "tcp", "tep", "gp", "fp" };
public static void DeclareParameters(CodeGenContext context, StructuredFunction function) public static void DeclareParameters(CodeGenContext context, StructuredFunction function)
{ {
DeclareParameters(context, function.InArguments, 0); DeclareParameters(context, function.InArguments, 0);
@ -192,7 +190,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
SamplerType.Texture3D => Dim.Dim3D, SamplerType.Texture3D => Dim.Dim3D,
SamplerType.TextureCube => Dim.Cube, SamplerType.TextureCube => Dim.Cube,
SamplerType.TextureBuffer => Dim.Buffer, SamplerType.TextureBuffer => Dim.Buffer,
_ => throw new InvalidOperationException($"Invalid sampler type \"{sampler.Type & SamplerType.Mask}\".") _ => throw new InvalidOperationException($"Invalid sampler type \"{sampler.Type & SamplerType.Mask}\"."),
}; };
var imageType = context.TypeImage( var imageType = context.TypeImage(
@ -519,10 +517,5 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Spirv
: (isOutput ? context.Outputs : context.Inputs); : (isOutput ? context.Outputs : context.Inputs);
dict.Add(ioDefinition, spvVar); dict.Add(ioDefinition, spvVar);
} }
private static string GetStagePrefix(ShaderStage stage)
{
return _stagePrefixes[(int)stage];
}
} }
} }

View File

@ -1,6 +1,6 @@
namespace Ryujinx.Graphics.Shader namespace Ryujinx.Graphics.Shader
{ {
public struct TextureDescriptor public readonly struct TextureDescriptor
{ {
// New fields should be added to the end of the struct to keep disk shader cache compatibility. // New fields should be added to the end of the struct to keep disk shader cache compatibility.

View File

@ -266,7 +266,7 @@ namespace Ryujinx.Graphics.Shader.Translation
{ {
AccurateType = accurateType, AccurateType = accurateType,
Type = type, Type = type,
UsageFlags = usageFlags UsageFlags = usageFlags,
}; };
int binding; int binding;

View File

@ -889,7 +889,7 @@ namespace Ryujinx.Graphics.Texture.Astc
0 => 0, 0 => 0,
1 => 32, 1 => 32,
2 => 63, 2 => 63,
_ => 0 _ => 0,
}; };
break; break;
@ -942,7 +942,7 @@ namespace Ryujinx.Graphics.Texture.Astc
2 => 32, 2 => 32,
3 => 47, 3 => 47,
4 => 63, 4 => 63,
_ => 0 _ => 0,
}; };
break; break;

View File

@ -12,7 +12,7 @@ namespace Ryujinx.Graphics.Texture.Astc
{ {
JustBits, JustBits,
Quint, Quint,
Trit Trit,
} }
readonly EIntegerEncoding _encoding; readonly EIntegerEncoding _encoding;
@ -162,7 +162,7 @@ namespace Ryujinx.Graphics.Texture.Astc
IntegerEncoded intEncoded = new(EIntegerEncoding.Quint, numberBitsPerValue) IntegerEncoded intEncoded = new(EIntegerEncoding.Quint, numberBitsPerValue)
{ {
BitValue = m[i], BitValue = m[i],
QuintValue = encodings[i] QuintValue = encodings[i],
}; };
listIntegerEncoded.Add(ref intEncoded); listIntegerEncoded.Add(ref intEncoded);
@ -309,7 +309,7 @@ namespace Ryujinx.Graphics.Texture.Astc
2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 0, 2, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 0, 2, 1, 1, 2,
1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 2, 2, 1, 1, 2, 2, 1, 2, 1, 2,
0, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 1, 2, 2, 2 2, 1, 2, 2, 2,
}; };
private static ReadOnlySpan<byte> QuintEncodings => new byte[] private static ReadOnlySpan<byte> QuintEncodings => new byte[]
@ -339,7 +339,7 @@ namespace Ryujinx.Graphics.Texture.Astc
0, 1, 4, 1, 1, 4, 0, 2, 3, 1, 2, 3, 2, 2, 3, 0, 1, 4, 1, 1, 4, 0, 2, 3, 1, 2, 3, 2, 2, 3,
3, 2, 3, 4, 2, 3, 2, 4, 3, 0, 2, 4, 1, 2, 4, 3, 2, 3, 4, 2, 3, 2, 4, 3, 0, 2, 4, 1, 2, 4,
0, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3, 0, 3, 3, 1, 3, 3, 2, 3, 3, 3, 3, 3, 4, 3, 3,
3, 4, 3, 0, 3, 4, 1, 3, 4 3, 4, 3, 0, 3, 4, 1, 3, 4,
}; };
} }
} }

View File

@ -21,12 +21,12 @@ namespace Ryujinx.Graphics.Texture
new int[] { 18, 60, -18, -60 }, new int[] { 18, 60, -18, -60 },
new int[] { 24, 80, -24, -80 }, new int[] { 24, 80, -24, -80 },
new int[] { 33, 106, -33, -106 }, new int[] { 33, 106, -33, -106 },
new int[] { 47, 183, -47, -183 } new int[] { 47, 183, -47, -183 },
}; };
private static readonly int[] _etc2Lut = private static readonly int[] _etc2Lut =
{ {
3, 6, 11, 16, 23, 32, 41, 64 3, 6, 11, 16, 23, 32, 41, 64,
}; };
private static readonly int[][] _etc2AlphaLut = private static readonly int[][] _etc2AlphaLut =
@ -46,7 +46,7 @@ namespace Ryujinx.Graphics.Texture
new int[] { -3, -4, -7, -10, 2, 3, 6, 9 }, new int[] { -3, -4, -7, -10, 2, 3, 6, 9 },
new int[] { -1, -2, -3, -10, 0, 1, 2, 9 }, new int[] { -1, -2, -3, -10, 0, 1, 2, 9 },
new int[] { -4, -6, -8, -9, 3, 5, 7, 8 }, new int[] { -4, -6, -8, -9, 3, 5, 7, 8 },
new int[] { -3, -5, -7, -9, 2, 4, 6, 8 } new int[] { -3, -5, -7, -9, 2, 4, 6, 8 },
}; };
public static byte[] DecodeRgb(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers) public static byte[] DecodeRgb(ReadOnlySpan<byte> data, int width, int height, int depth, int levels, int layers)

View File

@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.Texture.Encoders
private static readonly int[] _mostFrequentPartitions = new int[] private static readonly int[] _mostFrequentPartitions = new int[]
{ {
0, 13, 2, 1, 15, 14, 10, 23 0, 13, 2, 1, 15, 14, 10, 23,
}; };
private static Block CompressBlock(ReadOnlySpan<byte> data, int x, int y, int width, int height, bool fastMode) private static Block CompressBlock(ReadOnlySpan<byte> data, int x, int y, int width, int height, bool fastMode)
@ -233,7 +233,7 @@ namespace Ryujinx.Graphics.Texture.Encoders
1 => new RgbaColor8(255, 0, 0, 0).ToUInt32(), 1 => new RgbaColor8(255, 0, 0, 0).ToUInt32(),
2 => new RgbaColor8(0, 255, 0, 0).ToUInt32(), 2 => new RgbaColor8(0, 255, 0, 0).ToUInt32(),
3 => new RgbaColor8(0, 0, 255, 0).ToUInt32(), 3 => new RgbaColor8(0, 0, 255, 0).ToUInt32(),
_ => new RgbaColor8(0, 0, 0, 255).ToUInt32() _ => new RgbaColor8(0, 0, 0, 255).ToUInt32(),
}; };
} }
else else

View File

@ -5,6 +5,6 @@
Fast, Fast,
Exhaustive, Exhaustive,
ModeMask = 0xff, ModeMask = 0xff,
Multithreaded = 1 << 8 Multithreaded = 1 << 8,
} }
} }

View File

@ -89,7 +89,7 @@ namespace Ryujinx.Graphics.Texture
8 => Convert<ulong>(dst, data), 8 => Convert<ulong>(dst, data),
12 => Convert<Bpp12Pixel>(dst, data), 12 => Convert<Bpp12Pixel>(dst, data),
16 => Convert<Vector128<byte>>(dst, data), 16 => Convert<Vector128<byte>>(dst, data),
_ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format.") _ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format."),
}; };
} }
@ -240,7 +240,7 @@ namespace Ryujinx.Graphics.Texture
8 => Convert<ulong>(output, data), 8 => Convert<ulong>(output, data),
12 => Convert<Bpp12Pixel>(output, data), 12 => Convert<Bpp12Pixel>(output, data),
16 => Convert<Vector128<byte>>(output, data), 16 => Convert<Vector128<byte>>(output, data),
_ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format.") _ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format."),
}; };
} }
return output; return output;
@ -359,7 +359,7 @@ namespace Ryujinx.Graphics.Texture
8 => Convert<ulong>(dst, data), 8 => Convert<ulong>(dst, data),
12 => Convert<Bpp12Pixel>(dst, data), 12 => Convert<Bpp12Pixel>(dst, data),
16 => Convert<Vector128<byte>>(dst, data), 16 => Convert<Vector128<byte>>(dst, data),
_ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format.") _ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format."),
}; };
} }
@ -504,7 +504,7 @@ namespace Ryujinx.Graphics.Texture
8 => Convert<ulong>(output, data), 8 => Convert<ulong>(output, data),
12 => Convert<Bpp12Pixel>(output, data), 12 => Convert<Bpp12Pixel>(output, data),
16 => Convert<Vector128<byte>>(output, data), 16 => Convert<Vector128<byte>>(output, data),
_ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format.") _ => throw new NotSupportedException($"Unable to convert ${bytesPerPixel} bpp pixel format."),
}; };
} }

View File

@ -11,21 +11,21 @@
new BC7ModeInfo(1, 0, 0, 2, 1, 2, 3, 5, 6), new BC7ModeInfo(1, 0, 0, 2, 1, 2, 3, 5, 6),
new BC7ModeInfo(1, 0, 0, 2, 0, 2, 2, 7, 8), new BC7ModeInfo(1, 0, 0, 2, 0, 2, 2, 7, 8),
new BC7ModeInfo(1, 0, 2, 0, 0, 4, 0, 7, 7), new BC7ModeInfo(1, 0, 2, 0, 0, 4, 0, 7, 7),
new BC7ModeInfo(2, 6, 4, 0, 0, 2, 0, 5, 5) new BC7ModeInfo(2, 6, 4, 0, 0, 2, 0, 5, 5),
}; };
public static readonly byte[][] Weights = public static readonly byte[][] Weights =
{ {
new byte[] { 0, 21, 43, 64 }, new byte[] { 0, 21, 43, 64 },
new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 }, new byte[] { 0, 9, 18, 27, 37, 46, 55, 64 },
new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 } new byte[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 },
}; };
public static readonly byte[][] InverseWeights = public static readonly byte[][] InverseWeights =
{ {
new byte[] { 64, 43, 21, 0 }, new byte[] { 64, 43, 21, 0 },
new byte[] { 64, 55, 46, 37, 27, 18, 9, 0 }, new byte[] { 64, 55, 46, 37, 27, 18, 9, 0 },
new byte[] { 64, 60, 55, 51, 47, 43, 38, 34, 30, 26, 21, 17, 13, 9, 4, 0 } new byte[] { 64, 60, 55, 51, 47, 43, 38, 34, 30, 26, 21, 17, 13, 9, 4, 0 },
}; };
public static readonly byte[][][] FixUpIndices = new byte[3][][] public static readonly byte[][][] FixUpIndices = new byte[3][][]
@ -47,7 +47,7 @@
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 } new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
}, },
new byte[64][] new byte[64][]
{ {
@ -66,7 +66,7 @@
new byte[] { 0, 6, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 },
new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 },
new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 }, new byte[] { 0, 15, 0 },
new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 15, 0 } new byte[] { 0, 15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 15, 0 },
}, },
new byte[64][] new byte[64][]
{ {
@ -85,8 +85,8 @@
new byte[] { 0, 3, 15 }, new byte[] { 0, 15, 3 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 15, 3 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 5, 15 },
new byte[] { 0, 5, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 },
new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 13, 15 }, new byte[] { 0, 5, 15 }, new byte[] { 0, 10, 15 }, new byte[] { 0, 8, 15 }, new byte[] { 0, 13, 15 },
new byte[] { 0, 15, 3 }, new byte[] { 0, 12, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 } new byte[] { 0, 15, 3 }, new byte[] { 0, 12, 15 }, new byte[] { 0, 3, 15 }, new byte[] { 0, 3, 8 },
} },
}; };
public static readonly byte[][][] PartitionTable = new byte[3][][] public static readonly byte[][][] PartitionTable = new byte[3][][]
@ -156,7 +156,7 @@
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 60 new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 60
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 61 new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 61
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 62 new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 62
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } // 63 new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 63
}, },
new byte[64][] new byte[64][]
{ {
@ -223,7 +223,7 @@
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // 60 new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // 60
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // 61 new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // 61
new byte[16] { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, // 62 new byte[16] { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, // 62
new byte[16] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 } // 63 new byte[16] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 }, // 63
}, },
new byte[64][] new byte[64][]
{ {
@ -290,8 +290,8 @@
new byte[16] { 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1 }, // 60 new byte[16] { 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1 }, // 60
new byte[16] { 0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2 }, // 61 new byte[16] { 0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2 }, // 61
new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // 62 new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // 62
new byte[16] { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 } // 63 new byte[16] { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 }, // 63
} },
}; };
} }
} }

View File

@ -1199,7 +1199,7 @@ namespace Ryujinx.Graphics.Texture.Utils
RgbaColor32 weightV = new(colorWeight) RgbaColor32 weightV = new(colorWeight)
{ {
A = alphaWeight A = alphaWeight,
}; };
RgbaColor32 invWeightV = new RgbaColor32(64) - weightV; RgbaColor32 invWeightV = new RgbaColor32(64) - weightV;

View File

@ -77,7 +77,7 @@ namespace Ryujinx.Graphics.Texture.Utils
1 => G, 1 => G,
2 => B, 2 => B,
3 => A, 3 => A,
_ => throw new ArgumentOutOfRangeException(nameof(index)) _ => throw new ArgumentOutOfRangeException(nameof(index)),
}; };
} }
} }

View File

@ -417,7 +417,7 @@ namespace Ryujinx.Graphics.Vic.Image
0 => offsets.LumaOffset, 0 => offsets.LumaOffset,
1 => offsets.ChromaUOffset, 1 => offsets.ChromaUOffset,
2 => offsets.ChromaVOffset, 2 => offsets.ChromaVOffset,
_ => throw new ArgumentOutOfRangeException(nameof(plane)) _ => throw new ArgumentOutOfRangeException(nameof(plane)),
}; };
} }

View File

@ -7,6 +7,6 @@ namespace Ryujinx.Graphics.Vic.Types
Bob, Bob,
NewBob, NewBob,
Disi1, Disi1,
WeaveLumaBobFieldChroma WeaveLumaBobFieldChroma,
} }
} }

View File

@ -15,7 +15,7 @@ namespace Ryujinx.Graphics.Vic.Types
TopFieldChromaBottom, TopFieldChromaBottom,
BottomFieldChromaTop, BottomFieldChromaTop,
SubPicTopFieldChromaBottom, SubPicTopFieldChromaBottom,
SubPicBottomFieldChromaTop SubPicBottomFieldChromaTop,
} }
static class FrameFormatExtensions static class FrameFormatExtensions

View File

@ -76,6 +76,6 @@
Y8___U8___V8_N422R, Y8___U8___V8_N422R,
Y8___U8___V8_N420, Y8___U8___V8_N420,
U8, U8,
V8 V8,
} }
} }

View File

@ -19,7 +19,7 @@ namespace Ryujinx.Graphics.Vic
_rm = new ResourceManager(gmm, new BufferPool<Pixel>(), new BufferPool<byte>()); _rm = new ResourceManager(gmm, new BufferPool<Pixel>(), new BufferPool<byte>());
_state = new DeviceState<VicRegisters>(new Dictionary<string, RwCallback> _state = new DeviceState<VicRegisters>(new Dictionary<string, RwCallback>
{ {
{ nameof(VicRegisters.Execute), new RwCallback(Execute, null) } { nameof(VicRegisters.Execute), new RwCallback(Execute, null) },
}); });
} }

View File

@ -3,6 +3,6 @@ namespace Ryujinx.Graphics.Video
public enum FrameField public enum FrameField
{ {
Progressive, Progressive,
Interlaced Interlaced,
} }
} }

View File

@ -709,12 +709,14 @@ namespace Ryujinx.Graphics.Vulkan
return CommandBuffer.Handle == cb.Handle; return CommandBuffer.Handle == cb.Handle;
} }
#pragma warning disable CA1822 // Mark member as static
public void SetAlphaTest(bool enable, float reference, CompareOp op) public void SetAlphaTest(bool enable, float reference, CompareOp op)
{ {
// This is currently handled using shader specialization, as Vulkan does not support alpha test. // This is currently handled using shader specialization, as Vulkan does not support alpha test.
// In the future, we may want to use this to write the reference value into the support buffer, // In the future, we may want to use this to write the reference value into the support buffer,
// to avoid creating one version of the shader per reference value used. // to avoid creating one version of the shader per reference value used.
} }
#pragma warning restore CA1822
public void SetBlendState(AdvancedBlendDescriptor blend) public void SetBlendState(AdvancedBlendDescriptor blend)
{ {

View File

@ -321,7 +321,7 @@ namespace Ryujinx.HLE.HOS.Services.Mii.Types
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
, }; };
private static ReadOnlySpan<byte> RandomMiiFacelineColorRawArray => new byte[] private static ReadOnlySpan<byte> RandomMiiFacelineColorRawArray => new byte[]
{ {

View File

@ -2,6 +2,6 @@
{ {
enum DeviceType : uint enum DeviceType : uint
{ {
Amiibo Amiibo,
} }
} }

View File

@ -155,13 +155,18 @@ namespace Ryujinx.Headless.SDL2.OpenGL
{ {
// NOTE: grabbing the main display's dimensions directly as OpenGL doesn't scale along like the VulkanWindow. // NOTE: grabbing the main display's dimensions directly as OpenGL doesn't scale along like the VulkanWindow.
// we might have to amend this if people run this on a non-primary display set to a different resolution. // we might have to amend this if people run this on a non-primary display set to a different resolution.
SDL_Rect displayBounds; if (SDL_GetDisplayBounds(0, out SDL_Rect displayBounds) < 0)
SDL_GetDisplayBounds(0, out displayBounds); {
Logger.Warning?.Print(LogClass.Application, $"Could not retrieve display bounds: {SDL_GetError()}");
// Fallback to defaults
displayBounds.w = DefaultWidth;
displayBounds.h = DefaultHeight;
}
Renderer?.Window.SetSize(displayBounds.w, displayBounds.h); Renderer?.Window.SetSize(displayBounds.w, displayBounds.h);
MouseDriver.SetClientSize(displayBounds.w, displayBounds.h); MouseDriver.SetClientSize(displayBounds.w, displayBounds.h);
} }
else else
{ {
Renderer?.Window.SetSize(DefaultWidth, DefaultHeight); Renderer?.Window.SetSize(DefaultWidth, DefaultHeight);

View File

@ -1690,7 +1690,7 @@ namespace Ryujinx.Horizon.Common
{ 0x821AC, "InvalidPackage1" }, { 0x821AC, "InvalidPackage1" },
{ 0x823AC, "InvalidPackage1SectionSize" }, { 0x823AC, "InvalidPackage1SectionSize" },
{ 0x825AC, "InvalidPackage1MarikoBodySize" }, { 0x825AC, "InvalidPackage1MarikoBodySize" },
{ 0x827AC, "InvalidPackage1Pk11Size" } { 0x827AC, "InvalidPackage1Pk11Size" },
}; };
public static bool TryGet(int errorCode, out string name) public static bool TryGet(int errorCode, out string name)

View File

@ -13,6 +13,6 @@
OutCopyHandle, OutCopyHandle,
OutMoveHandle, OutMoveHandle,
OutObject, OutObject,
ProcessId ProcessId,
} }
} }

View File

@ -36,7 +36,7 @@ namespace Ryujinx.Horizon.Generators.Hipc
None, None,
Ref, Ref,
Out, Out,
In In,
} }
private readonly struct OutParameter private readonly struct OutParameter

View File

@ -40,7 +40,7 @@ namespace Ryujinx.Horizon.Kernel.Generators
$"{TypeKernelResultName}.TimedOut", $"{TypeKernelResultName}.TimedOut",
$"{TypeKernelResultName}.Cancelled", $"{TypeKernelResultName}.Cancelled",
$"{TypeKernelResultName}.PortRemoteClosed", $"{TypeKernelResultName}.PortRemoteClosed",
$"{TypeKernelResultName}.InvalidState" $"{TypeKernelResultName}.InvalidState",
}; };
private readonly struct OutParameter private readonly struct OutParameter

View File

@ -168,7 +168,7 @@ namespace Ryujinx.Horizon.Sdk.OsTypes.Impl
long minTime = endTime; long minTime = endTime;
foreach (MultiWaitHolder holder in _multiWaits) foreach (MultiWaitHolderBase holder in _multiWaits)
{ {
long currentTime = holder.GetAbsoluteTimeToWakeup(); long currentTime = holder.GetAbsoluteTimeToWakeup();

View File

@ -337,7 +337,7 @@ namespace Ryujinx.Tests.Memory
{ {
granular.GetHandles(), granular.GetHandles(),
singlePages, singlePages,
doublePages doublePages,
}; };
MultiRegionHandle combined = _tracking.BeginGranularTracking(0, PageSize * 18, handleGroups.SelectMany((handles) => handles), PageSize, 0); MultiRegionHandle combined = _tracking.BeginGranularTracking(0, PageSize * 18, handleGroups.SelectMany((handles) => handles), PageSize, 0);
@ -349,7 +349,7 @@ namespace Ryujinx.Tests.Memory
true, true, // Gap. true, true, // Gap.
false, true, false, // Individual handles. false, true, false, // Individual handles.
false, false, true, true, false, false, // Double size handles. false, false, true, true, false, false, // Double size handles.
true // Gap. true, // Gap.
}; };
for (int i = 0; i < 18; i++) for (int i = 0; i < 18; i++)

View File

@ -159,7 +159,7 @@ namespace Ryujinx.Tests.Unicorn
Arm.UC_ARM_REG_Q12, Arm.UC_ARM_REG_Q12,
Arm.UC_ARM_REG_Q13, Arm.UC_ARM_REG_Q13,
Arm.UC_ARM_REG_Q14, Arm.UC_ARM_REG_Q14,
Arm.UC_ARM_REG_Q15 Arm.UC_ARM_REG_Q15,
}; };
#pragma warning restore IDE0051, IDE0052 #pragma warning restore IDE0051, IDE0052

View File

@ -234,7 +234,7 @@ namespace Spv.Generator
{ {
{ Specification.Op.OpConstant, new [] { "Value" } }, { Specification.Op.OpConstant, new [] { "Value" } },
{ Specification.Op.OpTypeInt, new [] { "Width", "Signed" } }, { Specification.Op.OpTypeInt, new [] { "Width", "Signed" } },
{ Specification.Op.OpTypeFloat, new [] { "Width" } } { Specification.Op.OpTypeFloat, new [] { "Width" } },
}; };
public override string ToString() public override string ToString()