Add support for Vertex Program A and other small shader improvements (#192)
* Add WIP support for Vertex Program A, add the FADD_I32 shader instruction, small fix on FFMA_I encoding, nits * Add separate subroutines for program A/B, and copy attributes to a temp * Move finalization code to main * Add new line after flip uniform on the shader * Handle possible case where VPB uses an output attribute written by VPA but not available on the vbo * Address PR feedback
This commit is contained in:
parent
900a84ae0a
commit
e6eeb6f09f
9 changed files with 303 additions and 78 deletions
|
@ -97,12 +97,37 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
|
||||
public void Create(IGalMemory Memory, long Key, GalShaderType Type)
|
||||
{
|
||||
Stages.GetOrAdd(Key, (Stage) => ShaderStageFactory(Memory, Key, Type));
|
||||
Stages.GetOrAdd(Key, (Stage) => ShaderStageFactory(Memory, Key, 0, false, Type));
|
||||
}
|
||||
|
||||
private ShaderStage ShaderStageFactory(IGalMemory Memory, long Position, GalShaderType Type)
|
||||
public void Create(IGalMemory Memory, long VpAPos, long Key, GalShaderType Type)
|
||||
{
|
||||
GlslProgram Program = GetGlslProgram(Memory, Position, Type);
|
||||
Stages.GetOrAdd(Key, (Stage) => ShaderStageFactory(Memory, VpAPos, Key, true, Type));
|
||||
}
|
||||
|
||||
private ShaderStage ShaderStageFactory(
|
||||
IGalMemory Memory,
|
||||
long Position,
|
||||
long PositionB,
|
||||
bool IsDualVp,
|
||||
GalShaderType Type)
|
||||
{
|
||||
GlslProgram Program;
|
||||
|
||||
GlslDecompiler Decompiler = new GlslDecompiler();
|
||||
|
||||
if (IsDualVp)
|
||||
{
|
||||
Program = Decompiler.Decompile(
|
||||
Memory,
|
||||
Position + 0x50,
|
||||
PositionB + 0x50,
|
||||
Type);
|
||||
}
|
||||
else
|
||||
{
|
||||
Program = Decompiler.Decompile(Memory, Position + 0x50, Type);
|
||||
}
|
||||
|
||||
return new ShaderStage(
|
||||
Type,
|
||||
|
@ -111,13 +136,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
|||
Program.Uniforms);
|
||||
}
|
||||
|
||||
private GlslProgram GetGlslProgram(IGalMemory Memory, long Position, GalShaderType Type)
|
||||
{
|
||||
GlslDecompiler Decompiler = new GlslDecompiler();
|
||||
|
||||
return Decompiler.Decompile(Memory, Position + 0x50, Type);
|
||||
}
|
||||
|
||||
public IEnumerable<ShaderDeclInfo> GetTextureUsage(long Key)
|
||||
{
|
||||
if (Stages.TryGetValue(Key, out ShaderStage Stage))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue