The general rule we follow is "use Visual Studio defaults".
Using an IDE that supports the .editorconfig
standard will make this much simpler.
using
statement is permitted to be nested within another using
statement by starting on the following line at the same indentation level, even if the nested using
contains a controlled block._camelCase
for internal and private fields and use readonly
where possible. Prefix internal and private instance fields with _
, thread static fields with t_
. When used on static fields, readonly
should come after static
(e.g. static readonly
not readonly static
). Public fields should be used sparingly and should use PascalCasing with no prefix when used.this.
unless absolutely necessary.private string _foo
not string _foo
). Visibility should be the first modifier (e.g.
public abstract
not abstract public
).namespace
declarations.if (someVar == 0)...
, where the dots mark the spurious free spaces.
Consider enabling "View White Space (Ctrl+R, Ctrl+W)" or "Edit -> Advanced -> View White Space" if using Visual Studio to aid detection.m_member
rather than _member
), the existing style in that file takes precedence.var
when the type is explicitly named on the right-hand side, typically due to either new
or an explicit cast, e.g. var stream = new FileStream(...)
not var stream = OpenStandardInput()
.
new()
can only be used when the type is explicitly named on the left-hand side, in a variable definition statement or a field definition statement. e.g. FileStream stream = new(...);
, but not stream = new(...);
(where the type was specified on a previous line).int, string, float
instead of Int32, String, Single
, etc) for both type references as well as method calls (e.g. int.Parse
instead of Int32.Parse
). See issue #13976 for examples.nameof(...)
instead of "..."
whenever possible and relevant.if (source == null) throw new ArgumentNullException("source");
)if
/else if
/.../else
compound statement uses braces or if a single statement body spans multiple lines.if
/else if
/.../else
compound statement is placed on a single line.for (int i = 56; i < 68; i++)
could read for (int i = _currentAge; i < _retireAge; i++)
).
This may be ignored for trivial or syntactically common statements.An EditorConfig file (.editorconfig
) has been provided at the root of the runtime repository, enabling C# auto-formatting conforming to the above guidelines.
ShaderCache.cs:
using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Gpu.Engine.Threed;
using Ryujinx.Graphics.Gpu.Engine.Types;
using Ryujinx.Graphics.Gpu.Image;
using Ryujinx.Graphics.Gpu.Memory;
using Ryujinx.Graphics.Gpu.Shader.DiskCache;
using Ryujinx.Graphics.Shader;
using Ryujinx.Graphics.Shader.Translation;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
namespace Ryujinx.Graphics.Gpu.Shader
{
/// <summary>
/// Memory cache of shader code.
/// </summary>
class ShaderCache : IDisposable
{
/// <summary>
/// Default flags used on the shader translation process.
/// </summary>
public const TranslationFlags DefaultFlags = TranslationFlags.DebugMode;
private readonly struct TranslatedShader
{
public readonly CachedShaderStage Shader;
public readonly ShaderProgram Program;
public TranslatedShader(CachedShaderStage shader, ShaderProgram program)
{
Shader = shader;
Program = program;
}
}
...
/// <summary>
/// Processes the queue of shaders that must save their binaries to the disk cache.
/// </summary>
public void ProcessShaderCacheQueue()
{
// Check to see if the binaries for previously compiled shaders are ready, and save them out.
while (_programsToSaveQueue.TryPeek(out ProgramToSave programToSave))
{
ProgramLinkStatus result = programToSave.HostProgram.CheckProgramLink(false);
if (result != ProgramLinkStatus.Incomplete)
{
if (result == ProgramLinkStatus.Success)
{
_cacheWriter.AddShader(programToSave.CachedProgram, programToSave.BinaryCode ?? programToSave.HostProgram.GetBinary());
}
_programsToSaveQueue.Dequeue();
}
else
{
break;
}
}
}
}
}
For other languages, our current best guidance is consistency. When editing files, keep new code and changes consistent with the style in the files. For new files, it should conform to the style for that component. If there is a completely new component, anything that is reasonably broadly accepted is fine.