Salieri: shader cache (#1701)
Here come Salieri, my implementation of a disk shader cache! "I'm sure you know why I named it that." "It doesn't really mean anything." This implementation collects shaders at runtime and cache them to be later compiled when starting a game.
This commit is contained in:
parent
7166e82c3c
commit
48f6570557
57 changed files with 3589 additions and 396 deletions
|
@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
|
||||
Operand[] sources = sourcesList.ToArray();
|
||||
|
||||
int handle = !op.IsBindless ? op.Immediate : 0;
|
||||
int handle = !op.IsBindless ? op.HandleOffset : 0;
|
||||
|
||||
TextureFlags flags = op.IsBindless ? TextureFlags.Bindless : TextureFlags.None;
|
||||
|
||||
|
@ -238,7 +238,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
|
||||
if (!op.IsBindless)
|
||||
{
|
||||
format = context.Config.GetTextureFormat(op.Immediate);
|
||||
format = context.Config.GetTextureFormat(op.HandleOffset);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -262,7 +262,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
|
||||
Operand[] sources = sourcesList.ToArray();
|
||||
|
||||
int handle = !op.IsBindless ? op.Immediate : 0;
|
||||
int handle = !op.IsBindless ? op.HandleOffset : 0;
|
||||
|
||||
TextureFlags flags = op.IsBindless ? TextureFlags.Bindless : TextureFlags.None;
|
||||
|
||||
|
@ -458,7 +458,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
|
||||
flags = ConvertTextureFlags(tldsOp.Target) | TextureFlags.IntCoords;
|
||||
|
||||
if (tldsOp.Target == TexelLoadTarget.Texture1DLodZero && context.Config.GpuAccessor.QueryIsTextureBuffer(tldsOp.Immediate))
|
||||
if (tldsOp.Target == TexelLoadTarget.Texture1DLodZero && context.Config.GpuAccessor.QueryIsTextureBuffer(tldsOp.HandleOffset))
|
||||
{
|
||||
type = SamplerType.TextureBuffer;
|
||||
flags &= ~TextureFlags.LodLevel;
|
||||
|
@ -607,7 +607,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
}
|
||||
}
|
||||
|
||||
int handle = op.Immediate;
|
||||
int handle = op.HandleOffset;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
@ -756,7 +756,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
return Register(rdIndex++, RegisterType.Gpr);
|
||||
}
|
||||
|
||||
int handle = op.Immediate;
|
||||
int handle = op.HandleOffset;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
@ -870,7 +870,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
return Register(rdIndex++, RegisterType.Gpr);
|
||||
}
|
||||
|
||||
int handle = !isBindless ? op.Immediate : 0;
|
||||
int handle = !isBindless ? op.HandleOffset : 0;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
@ -1019,7 +1019,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
return Register(rdIndex++, RegisterType.Gpr);
|
||||
}
|
||||
|
||||
int handle = !op.IsBindless ? op.Immediate : 0;
|
||||
int handle = !op.IsBindless ? op.HandleOffset : 0;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
@ -1104,7 +1104,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
return Register(rdIndex++, RegisterType.Gpr);
|
||||
}
|
||||
|
||||
int handle = !bindless ? op.Immediate : 0;
|
||||
int handle = !bindless ? op.HandleOffset : 0;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
@ -1181,7 +1181,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
{
|
||||
// For bindless, we don't have any way to know the texture type,
|
||||
// so we assume it's texture buffer when the sampler type is 1D, since that's more common.
|
||||
bool isTypeBuffer = isBindless || context.Config.GpuAccessor.QueryIsTextureBuffer(op.Immediate);
|
||||
bool isTypeBuffer = isBindless || context.Config.GpuAccessor.QueryIsTextureBuffer(op.HandleOffset);
|
||||
|
||||
if (isTypeBuffer)
|
||||
{
|
||||
|
@ -1269,7 +1269,7 @@ namespace Ryujinx.Graphics.Shader.Instructions
|
|||
return Register(rdIndex++, RegisterType.Gpr);
|
||||
}
|
||||
|
||||
int handle = !isBindless ? op.Immediate : 0;
|
||||
int handle = !isBindless ? op.HandleOffset : 0;
|
||||
|
||||
for (int compMask = op.ComponentMask, compIndex = 0; compMask != 0; compMask >>= 1, compIndex++)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue