Some small shader related fixes (#258)

* Some small shader related fixes

* Address PR feedback
This commit is contained in:
gdkchan 2018-07-14 13:08:39 -03:00 committed by GitHub
parent 494f8f0248
commit 2f37583ab3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 57 additions and 28 deletions

View File

@ -18,6 +18,8 @@ namespace Ryujinx.Graphics.Gal
void Bind(long Key); void Bind(long Key);
void Unbind(GalShaderType Type);
void BindProgram(); void BindProgram();
} }
} }

View File

@ -203,6 +203,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
} }
} }
public void Unbind(GalShaderType Type)
{
switch (Type)
{
case GalShaderType.Vertex: Current.Vertex = null; break;
case GalShaderType.TessControl: Current.TessControl = null; break;
case GalShaderType.TessEvaluation: Current.TessEvaluation = null; break;
case GalShaderType.Geometry: Current.Geometry = null; break;
case GalShaderType.Fragment: Current.Fragment = null; break;
}
}
public void BindProgram() public void BindProgram()
{ {
if (Current.Vertex == null || if (Current.Vertex == null ||

View File

@ -216,7 +216,7 @@ namespace Ryujinx.Graphics.Gal.Shader
private void PrintDeclOutAttributes() private void PrintDeclOutAttributes()
{ {
if (Decl.ShaderType == GalShaderType.Vertex) if (Decl.ShaderType != GalShaderType.Fragment)
{ {
SB.AppendLine("layout (location = " + GlslDecl.PositionOutAttrLocation + ") out vec4 " + GlslDecl.PositionOutAttrName + ";"); SB.AppendLine("layout (location = " + GlslDecl.PositionOutAttrLocation + ") out vec4 " + GlslDecl.PositionOutAttrName + ";");
} }
@ -337,7 +337,10 @@ namespace Ryujinx.Graphics.Gal.Shader
if (Decl.ShaderType == GalShaderType.Vertex) if (Decl.ShaderType == GalShaderType.Vertex)
{ {
SB.AppendLine(IdentationStr + "gl_Position.xy *= " + GlslDecl.FlipUniformName + ";"); SB.AppendLine(IdentationStr + "gl_Position.xy *= " + GlslDecl.FlipUniformName + ";");
}
if (Decl.ShaderType != GalShaderType.Fragment)
{
SB.AppendLine(IdentationStr + GlslDecl.PositionOutAttrName + " = gl_Position;"); SB.AppendLine(IdentationStr + GlslDecl.PositionOutAttrName + " = gl_Position;");
SB.AppendLine(IdentationStr + GlslDecl.PositionOutAttrName + ".w = 1;"); SB.AppendLine(IdentationStr + GlslDecl.PositionOutAttrName + ".w = 1;");
} }
@ -598,9 +601,6 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
switch (Op.Inst) switch (Op.Inst)
{ {
case ShaderIrInst.Frcp:
return true;
case ShaderIrInst.Ipa: case ShaderIrInst.Ipa:
case ShaderIrInst.Texq: case ShaderIrInst.Texq:
case ShaderIrInst.Texs: case ShaderIrInst.Texs:
@ -608,8 +608,7 @@ namespace Ryujinx.Graphics.Gal.Shader
return false; return false;
} }
return Op.OperandB != null || return true;
Op.OperandC != null;
} }
private string GetName(ShaderIrOperCbuf Cbuf) private string GetName(ShaderIrOperCbuf Cbuf)
@ -711,13 +710,13 @@ namespace Ryujinx.Graphics.Gal.Shader
} }
else else
{ {
return Imm.Value.ToString(CultureInfo.InvariantCulture); return GetIntConst(Imm.Value);
} }
} }
private string GetValue(ShaderIrOperImmf Immf) private string GetValue(ShaderIrOperImmf Immf)
{ {
return Immf.Value.ToString(CultureInfo.InvariantCulture); return GetFloatConst(Immf.Value);
} }
private string GetName(ShaderIrOperPred Pred) private string GetName(ShaderIrOperPred Pred)
@ -1047,7 +1046,7 @@ namespace Ryujinx.Graphics.Gal.Shader
if (!float.IsNaN(Value) && !float.IsInfinity(Value)) if (!float.IsNaN(Value) && !float.IsInfinity(Value))
{ {
return Value.ToString(CultureInfo.InvariantCulture); return GetFloatConst(Value);
} }
} }
break; break;
@ -1064,6 +1063,20 @@ namespace Ryujinx.Graphics.Gal.Shader
return Expr; return Expr;
} }
private static string GetIntConst(int Value)
{
string Expr = Value.ToString(CultureInfo.InvariantCulture);
return Value < 0 ? "(" + Expr + ")" : Expr;
}
private static string GetFloatConst(float Value)
{
string Expr = Value.ToString(CultureInfo.InvariantCulture);
return Value < 0 ? "(" + Expr + ")" : Expr;
}
private static OperType GetDstNodeType(ShaderIrNode Node) private static OperType GetDstNodeType(ShaderIrNode Node)
{ {
//Special case instructions with the result type different //Special case instructions with the result type different

View File

@ -172,6 +172,8 @@ namespace Ryujinx.HLE.Gpu.Engines
for (; Index < 6; Index++) for (; Index < 6; Index++)
{ {
GalShaderType Type = GetTypeFromProgram(Index);
int Control = ReadRegister(NvGpuEngine3dReg.ShaderNControl + Index * 0x10); int Control = ReadRegister(NvGpuEngine3dReg.ShaderNControl + Index * 0x10);
int Offset = ReadRegister(NvGpuEngine3dReg.ShaderNOffset + Index * 0x10); int Offset = ReadRegister(NvGpuEngine3dReg.ShaderNOffset + Index * 0x10);
@ -180,16 +182,16 @@ namespace Ryujinx.HLE.Gpu.Engines
if (!Enable) if (!Enable)
{ {
Gpu.Renderer.Shader.Unbind(Type);
continue; continue;
} }
long Key = BasePosition + (uint)Offset; long Key = BasePosition + (uint)Offset;
GalShaderType ShaderType = GetTypeFromProgram(Index); Keys[(int)Type] = Key;
Keys[(int)ShaderType] = Key; Gpu.Renderer.Shader.Create(Vmm, Key, Type);
Gpu.Renderer.Shader.Create(Vmm, Key, ShaderType);
Gpu.Renderer.Shader.Bind(Key); Gpu.Renderer.Shader.Bind(Key);
} }