Implement PointCoord and PointSize shader attributes (#353)

* Implement PointCoord and PointSize shader attributes

* Address feedback
This commit is contained in:
ReinUsesLisp 2018-08-16 02:26:03 -03:00 committed by gdkchan
parent c393cdf8e3
commit 6e1a6c5b2b
2 changed files with 22 additions and 9 deletions

View file

@ -6,6 +6,9 @@ namespace Ryujinx.Graphics.Gal.Shader
class GlslDecl class GlslDecl
{ {
public const int LayerAttr = 0x064; public const int LayerAttr = 0x064;
public const int PointSizeAttr = 0x06c;
public const int PointCoordAttrX = 0x2e0;
public const int PointCoordAttrY = 0x2e4;
public const int TessCoordAttrX = 0x2f0; public const int TessCoordAttrX = 0x2f0;
public const int TessCoordAttrY = 0x2f4; public const int TessCoordAttrY = 0x2f4;
public const int TessCoordAttrZ = 0x2f8; public const int TessCoordAttrZ = 0x2f8;
@ -249,11 +252,14 @@ namespace Ryujinx.Graphics.Gal.Shader
case ShaderIrOperAbuf Abuf: case ShaderIrOperAbuf Abuf:
{ {
//This is a built-in input variable. //This is a built-in variable.
if (Abuf.Offs == VertexIdAttr || if (Abuf.Offs == LayerAttr ||
Abuf.Offs == InstanceIdAttr || Abuf.Offs == PointSizeAttr ||
Abuf.Offs == FaceAttr || Abuf.Offs == PointCoordAttrX ||
Abuf.Offs == LayerAttr) Abuf.Offs == PointCoordAttrY ||
Abuf.Offs == VertexIdAttr ||
Abuf.Offs == InstanceIdAttr ||
Abuf.Offs == FaceAttr)
{ {
break; break;
} }
@ -345,4 +351,4 @@ namespace Ryujinx.Graphics.Gal.Shader
return Decls.ContainsKey(Index); return Decls.ContainsKey(Index);
} }
} }
} }

View file

@ -795,6 +795,9 @@ namespace Ryujinx.Graphics.Gal.Shader
{ {
switch (Abuf.Offs) switch (Abuf.Offs)
{ {
case GlslDecl.PointCoordAttrX: return "gl_PointCoord.x";
case GlslDecl.PointCoordAttrY: return "gl_PointCoord.y";
//Note: It's a guess that Maxwell's face is 1 when gl_FrontFacing == true //Note: It's a guess that Maxwell's face is 1 when gl_FrontFacing == true
case GlslDecl.FaceAttr: return "(gl_FrontFacing ? 1 : 0)"; case GlslDecl.FaceAttr: return "(gl_FrontFacing ? 1 : 0)";
} }
@ -813,7 +816,7 @@ namespace Ryujinx.Graphics.Gal.Shader
if (!Decl.Attributes.TryGetValue(Index, out ShaderDeclInfo DeclInfo)) if (!Decl.Attributes.TryGetValue(Index, out ShaderDeclInfo DeclInfo))
{ {
//Handle special vec4 attributes here //Handle special vec4 attributes here
//(for example, index 7 is aways gl_Position). //(for example, index 7 is always gl_Position).
if (Index == GlslDecl.GlPositionVec4Index) if (Index == GlslDecl.GlPositionVec4Index)
{ {
string Name = string Name =
@ -822,6 +825,10 @@ namespace Ryujinx.Graphics.Gal.Shader
return Name + Swizzle; return Name + Swizzle;
} }
else if (Abuf.Offs == GlslDecl.PointSizeAttr)
{
return "gl_PointSize";
}
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
@ -1265,9 +1272,9 @@ namespace Ryujinx.Graphics.Gal.Shader
switch (Node) switch (Node)
{ {
case ShaderIrOperAbuf Abuf: case ShaderIrOperAbuf Abuf:
return Abuf.Offs == GlslDecl.LayerAttr || return Abuf.Offs == GlslDecl.LayerAttr ||
Abuf.Offs == GlslDecl.InstanceIdAttr || Abuf.Offs == GlslDecl.InstanceIdAttr ||
Abuf.Offs == GlslDecl.VertexIdAttr || Abuf.Offs == GlslDecl.VertexIdAttr ||
Abuf.Offs == GlslDecl.FaceAttr Abuf.Offs == GlslDecl.FaceAttr
? OperType.I32 ? OperType.I32
: OperType.F32; : OperType.F32;