Add TEX texture types and 1D and 3D textures support. Stub depth
This commit is contained in:
parent
56fde4c02d
commit
3bc53382c8
6 changed files with 75 additions and 50 deletions
|
@ -91,23 +91,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
const int Level = 0;
|
const int Level = 0;
|
||||||
const int Border = 0;
|
const int Border = 0;
|
||||||
|
|
||||||
switch (Target)
|
OGLHelper.TexImage(
|
||||||
{
|
|
||||||
case TextureTarget.Texture2D:
|
|
||||||
GL.TexImage2D(
|
|
||||||
Target,
|
|
||||||
Level,
|
|
||||||
InternalFormat,
|
|
||||||
Image.Width,
|
|
||||||
Image.Height,
|
|
||||||
Border,
|
|
||||||
PixelFormat,
|
|
||||||
PixelType,
|
|
||||||
IntPtr.Zero);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TextureTarget.Texture2DArray:
|
|
||||||
GL.TexImage3D(
|
|
||||||
Target,
|
Target,
|
||||||
Level,
|
Level,
|
||||||
InternalFormat,
|
InternalFormat,
|
||||||
|
@ -117,12 +101,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
Border,
|
Border,
|
||||||
PixelFormat,
|
PixelFormat,
|
||||||
PixelType,
|
PixelType,
|
||||||
IntPtr.Zero);
|
null);
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new NotImplementedException(Target.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Initialized)
|
if (Initialized)
|
||||||
{
|
{
|
||||||
|
|
|
@ -304,8 +304,10 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
{
|
{
|
||||||
switch (Target)
|
switch (Target)
|
||||||
{
|
{
|
||||||
|
case GalImageTarget._1d: return TextureTarget.Texture1D;
|
||||||
case GalImageTarget._2d: return TextureTarget.Texture2D;
|
case GalImageTarget._2d: return TextureTarget.Texture2D;
|
||||||
case GalImageTarget._2dArray: return TextureTarget.Texture2DArray;
|
case GalImageTarget._2dArray: return TextureTarget.Texture2DArray;
|
||||||
|
case GalImageTarget._3d: return TextureTarget.Texture3D;
|
||||||
case GalImageTarget.CubeMap: return TextureTarget.TextureCubeMap;
|
case GalImageTarget.CubeMap: return TextureTarget.TextureCubeMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,18 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
{
|
{
|
||||||
switch (Target)
|
switch (Target)
|
||||||
{
|
{
|
||||||
|
case TextureTarget.Texture1D:
|
||||||
|
GL.TexImage1D(
|
||||||
|
Target,
|
||||||
|
Level,
|
||||||
|
InternalFormat,
|
||||||
|
Width,
|
||||||
|
Border,
|
||||||
|
PixelFormat,
|
||||||
|
PixelType,
|
||||||
|
Data);
|
||||||
|
break;
|
||||||
|
|
||||||
case TextureTarget.Texture2D:
|
case TextureTarget.Texture2D:
|
||||||
GL.TexImage2D(
|
GL.TexImage2D(
|
||||||
Target,
|
Target,
|
||||||
|
@ -33,6 +45,9 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TextureTarget.Texture2DArray:
|
case TextureTarget.Texture2DArray:
|
||||||
|
case TextureTarget.Texture3D:
|
||||||
|
//FIXME: Unstub depth when swizzle is fixed
|
||||||
|
Depth = 1;
|
||||||
GL.TexImage3D(
|
GL.TexImage3D(
|
||||||
Target,
|
Target,
|
||||||
Level,
|
Level,
|
||||||
|
@ -110,6 +125,9 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TextureTarget.Texture2DArray:
|
case TextureTarget.Texture2DArray:
|
||||||
|
case TextureTarget.Texture3D:
|
||||||
|
//FIXME: Unstub depth when swizzle is fixed
|
||||||
|
Depth = 1;
|
||||||
GL.CompressedTexImage3D(
|
GL.CompressedTexImage3D(
|
||||||
Target,
|
Target,
|
||||||
Level,
|
Level,
|
||||||
|
|
|
@ -145,8 +145,6 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
{
|
{
|
||||||
SB = new StringBuilder();
|
SB = new StringBuilder();
|
||||||
|
|
||||||
SB.AppendLine("#version 410 core");
|
|
||||||
|
|
||||||
PrintDeclHeader();
|
PrintDeclHeader();
|
||||||
PrintDeclTextures();
|
PrintDeclTextures();
|
||||||
PrintDeclUniforms();
|
PrintDeclUniforms();
|
||||||
|
@ -185,6 +183,8 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
|
|
||||||
private void PrintDeclHeader()
|
private void PrintDeclHeader()
|
||||||
{
|
{
|
||||||
|
SB.AppendLine("#version 410 core");
|
||||||
|
|
||||||
if (Decl.ShaderType == GalShaderType.Geometry)
|
if (Decl.ShaderType == GalShaderType.Geometry)
|
||||||
{
|
{
|
||||||
int MaxVertices = Header.MaxOutputVertexCount;
|
int MaxVertices = Header.MaxOutputVertexCount;
|
||||||
|
@ -209,10 +209,10 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
SB.AppendLine("layout(triangles) in;" + Environment.NewLine);
|
SB.AppendLine("layout(triangles) in;" + Environment.NewLine);
|
||||||
|
|
||||||
SB.AppendLine($"layout({OutputTopology}, max_vertices = {MaxVertices}) out;");
|
SB.AppendLine($"layout({OutputTopology}, max_vertices = {MaxVertices}) out;");
|
||||||
|
}
|
||||||
|
|
||||||
SB.AppendLine();
|
SB.AppendLine();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private void PrintDeclTextures()
|
private void PrintDeclTextures()
|
||||||
{
|
{
|
||||||
|
@ -259,11 +259,9 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
|
|
||||||
SB.AppendLine(IdentationStr + "int " + GlslDecl.InstanceUniformName + ";");
|
SB.AppendLine(IdentationStr + "int " + GlslDecl.InstanceUniformName + ";");
|
||||||
|
|
||||||
SB.AppendLine("};");
|
SB.AppendLine("};" + Environment.NewLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
SB.AppendLine();
|
|
||||||
|
|
||||||
foreach (ShaderDeclInfo DeclInfo in Decl.Uniforms.Values.OrderBy(DeclKeySelector))
|
foreach (ShaderDeclInfo DeclInfo in Decl.Uniforms.Values.OrderBy(DeclKeySelector))
|
||||||
{
|
{
|
||||||
SB.AppendLine($"layout (std140) uniform {DeclInfo.Name} {{");
|
SB.AppendLine($"layout (std140) uniform {DeclInfo.Name} {{");
|
||||||
|
@ -1217,11 +1215,15 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
GetOperExpr(Op, Op.OperandB) + ", " +
|
GetOperExpr(Op, Op.OperandB) + ", " +
|
||||||
GetOperExpr(Op, Op.OperandC) + ")";
|
GetOperExpr(Op, Op.OperandC) + ")";
|
||||||
}
|
}
|
||||||
else
|
else if (Op.OperandB != null)
|
||||||
{
|
{
|
||||||
return "vec2(" + GetOperExpr(Op, Op.OperandA) + ", " +
|
return "vec2(" + GetOperExpr(Op, Op.OperandA) + ", " +
|
||||||
GetOperExpr(Op, Op.OperandB) + ")";
|
GetOperExpr(Op, Op.OperandB) + ")";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GetOperExpr(Op, Op.OperandA);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetITexSamplerCoords(ShaderIrOp Op)
|
private string GetITexSamplerCoords(ShaderIrOp Op)
|
||||||
|
@ -1232,11 +1234,15 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
GetOperExpr(Op, Op.OperandB) + ", " +
|
GetOperExpr(Op, Op.OperandB) + ", " +
|
||||||
GetOperExpr(Op, Op.OperandC) + ")";
|
GetOperExpr(Op, Op.OperandC) + ")";
|
||||||
}
|
}
|
||||||
else
|
else if (Op.OperandB != null)
|
||||||
{
|
{
|
||||||
return "ivec2(" + GetOperExpr(Op, Op.OperandA) + ", " +
|
return "ivec2(" + GetOperExpr(Op, Op.OperandA) + ", " +
|
||||||
GetOperExpr(Op, Op.OperandB) + ")";
|
GetOperExpr(Op, Op.OperandB) + ")";
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GetOperExpr(Op, Op.OperandA);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetOperExpr(ShaderIrOp Op, ShaderIrNode Oper)
|
private string GetOperExpr(ShaderIrOp Op, ShaderIrNode Oper)
|
||||||
|
@ -1383,8 +1389,10 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
{
|
{
|
||||||
switch (Type)
|
switch (Type)
|
||||||
{
|
{
|
||||||
|
case ShaderTextureType._1d: return "sampler1D";
|
||||||
case ShaderTextureType._2d: return "sampler2D";
|
case ShaderTextureType._2d: return "sampler2D";
|
||||||
case ShaderTextureType._2dArray: return "sampler2DArray";
|
case ShaderTextureType._2dArray: return "sampler2DArray";
|
||||||
|
case ShaderTextureType._3d: return "sampler3D";
|
||||||
case ShaderTextureType.Cube: return "samplerCube";
|
case ShaderTextureType.Cube: return "samplerCube";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,16 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
{ RGB_, RG_A, R_BA, _GBA, RGBA, ____, ____, ____ }
|
{ RGB_, RG_A, R_BA, _GBA, RGBA, ____, ____, ____ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static ShaderTextureType[] TexTypes = new ShaderTextureType[]
|
||||||
|
{
|
||||||
|
ShaderTextureType._1d,
|
||||||
|
ShaderTextureType._2d,
|
||||||
|
ShaderTextureType._3d,
|
||||||
|
ShaderTextureType.Cube,
|
||||||
|
};
|
||||||
|
|
||||||
|
private static int[] TexTypeCoords = new int[] { 1, 2, 3, 3 };
|
||||||
|
|
||||||
private static ShaderTextureType[] TexsTypes = new ShaderTextureType[]
|
private static ShaderTextureType[] TexsTypes = new ShaderTextureType[]
|
||||||
{
|
{
|
||||||
ShaderTextureType._1d,
|
ShaderTextureType._1d,
|
||||||
|
@ -159,14 +169,15 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
|
|
||||||
private static void EmitTex(ShaderIrBlock Block, long OpCode, bool GprHandle)
|
private static void EmitTex(ShaderIrBlock Block, long OpCode, bool GprHandle)
|
||||||
{
|
{
|
||||||
//TODO: Support other formats.
|
int TypeId = (int)((OpCode >> 29) & 3);
|
||||||
ShaderIrOperGpr[] Coords = new ShaderIrOperGpr[2];
|
|
||||||
|
|
||||||
for (int Index = 0; Index < Coords.Length; Index++)
|
ShaderIrOperGpr[] Coords = new ShaderIrOperGpr[3];
|
||||||
|
|
||||||
|
ShaderTextureType Type = TexTypes[TypeId];
|
||||||
|
|
||||||
|
for (int Index = 0; Index < TexTypeCoords[TypeId]; Index++)
|
||||||
{
|
{
|
||||||
Coords[Index] = GetOperGpr8(OpCode);
|
Coords[Index] = GetOperGpr8(OpCode) + Index;
|
||||||
|
|
||||||
Coords[Index].Index += Index;
|
|
||||||
|
|
||||||
if (Coords[Index].Index > ShaderIrOperGpr.ZRIndex)
|
if (Coords[Index].Index > ShaderIrOperGpr.ZRIndex)
|
||||||
{
|
{
|
||||||
|
@ -186,9 +197,9 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
{
|
{
|
||||||
ShaderIrOperGpr Dst = new ShaderIrOperGpr(TempRegStart + Ch);
|
ShaderIrOperGpr Dst = new ShaderIrOperGpr(TempRegStart + Ch);
|
||||||
|
|
||||||
ShaderIrMetaTex Meta = new ShaderIrMetaTex(ShaderTextureType._2d, TextureIndex, Ch);
|
ShaderIrMetaTex Meta = new ShaderIrMetaTex(Type, TextureIndex, Ch);
|
||||||
|
|
||||||
ShaderIrOp Op = new ShaderIrOp(Inst, Coords[0], Coords[1], null, Meta);
|
ShaderIrOp Op = new ShaderIrOp(Inst, Coords[0], Coords[1], Coords[2], Meta);
|
||||||
|
|
||||||
Block.AddNode(GetPredNode(new ShaderIrAsg(Dst, Op), OpCode));
|
Block.AddNode(GetPredNode(new ShaderIrAsg(Dst, Op), OpCode));
|
||||||
}
|
}
|
||||||
|
@ -266,6 +277,13 @@ namespace Ryujinx.Graphics.Gal.Shader
|
||||||
OperC = GetOperGpr8 (OpCode);
|
OperC = GetOperGpr8 (OpCode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//This layout is copy-pasted, complitely untested
|
||||||
|
case ShaderTextureType._3d:
|
||||||
|
OperA = GetOperGpr8(OpCode) + 1;
|
||||||
|
OperB = GetOperGpr20(OpCode);
|
||||||
|
OperC = GetOperGpr8(OpCode);
|
||||||
|
break;
|
||||||
|
|
||||||
//Unsure about this layout
|
//Unsure about this layout
|
||||||
case ShaderTextureType.Cube:
|
case ShaderTextureType.Cube:
|
||||||
OperA = GetOperGpr8 (OpCode);
|
OperA = GetOperGpr8 (OpCode);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
Enable_Memory_Checks = false
|
Enable_Memory_Checks = false
|
||||||
|
|
||||||
#Dump shaders in local directory (e.g. `C:\ShaderDumps`)
|
#Dump shaders in local directory (e.g. `C:\ShaderDumps`)
|
||||||
Graphics_Shaders_Dump_Path =
|
Graphics_Shaders_Dump_Path = D:\Shaders
|
||||||
|
|
||||||
#Enable print debug logs
|
#Enable print debug logs
|
||||||
Logging_Enable_Debug = false
|
Logging_Enable_Debug = false
|
||||||
|
|
Loading…
Reference in a new issue