Fix Shader reading. Close #720

This commit is contained in:
Perfare 2021-05-29 05:11:05 +08:00
parent 075d53a455
commit ab98585b6a
2 changed files with 171 additions and 37 deletions

View File

@ -394,6 +394,7 @@ namespace AssetStudio
public VectorParameter[] m_VectorParams; public VectorParameter[] m_VectorParams;
public StructParameter[] m_StructParams; public StructParameter[] m_StructParams;
public int m_Size; public int m_Size;
public bool m_IsPartialCB;
public ConstantBuffer(ObjectReader reader) public ConstantBuffer(ObjectReader reader)
{ {
@ -424,6 +425,16 @@ namespace AssetStudio
} }
} }
m_Size = reader.ReadInt32(); m_Size = reader.ReadInt32();
if ((version[0] == 2020 && version[1] > 3) ||
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
(version[0] == 2021 && version[1] > 1) ||
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
{
m_IsPartialCB = reader.ReadBoolean();
reader.AlignStream();
}
} }
} }
@ -477,6 +488,77 @@ namespace AssetStudio
kShaderGpuProgramRayTracing = 31, kShaderGpuProgramRayTracing = 31,
}; };
public class SerializedProgramParameters
{
public VectorParameter[] m_VectorParams;
public MatrixParameter[] m_MatrixParams;
public TextureParameter[] m_TextureParams;
public BufferBinding[] m_BufferParams;
public ConstantBuffer[] m_ConstantBuffers;
public BufferBinding[] m_ConstantBufferBindings;
public UAVParameter[] m_UAVParams;
public SamplerParameter[] m_Samplers;
public SerializedProgramParameters(ObjectReader reader)
{
int numVectorParams = reader.ReadInt32();
m_VectorParams = new VectorParameter[numVectorParams];
for (int i = 0; i < numVectorParams; i++)
{
m_VectorParams[i] = new VectorParameter(reader);
}
int numMatrixParams = reader.ReadInt32();
m_MatrixParams = new MatrixParameter[numMatrixParams];
for (int i = 0; i < numMatrixParams; i++)
{
m_MatrixParams[i] = new MatrixParameter(reader);
}
int numTextureParams = reader.ReadInt32();
m_TextureParams = new TextureParameter[numTextureParams];
for (int i = 0; i < numTextureParams; i++)
{
m_TextureParams[i] = new TextureParameter(reader);
}
int numBufferParams = reader.ReadInt32();
m_BufferParams = new BufferBinding[numBufferParams];
for (int i = 0; i < numBufferParams; i++)
{
m_BufferParams[i] = new BufferBinding(reader);
}
int numConstantBuffers = reader.ReadInt32();
m_ConstantBuffers = new ConstantBuffer[numConstantBuffers];
for (int i = 0; i < numConstantBuffers; i++)
{
m_ConstantBuffers[i] = new ConstantBuffer(reader);
}
int numConstantBufferBindings = reader.ReadInt32();
m_ConstantBufferBindings = new BufferBinding[numConstantBufferBindings];
for (int i = 0; i < numConstantBufferBindings; i++)
{
m_ConstantBufferBindings[i] = new BufferBinding(reader);
}
int numUAVParams = reader.ReadInt32();
m_UAVParams = new UAVParameter[numUAVParams];
for (int i = 0; i < numUAVParams; i++)
{
m_UAVParams[i] = new UAVParameter(reader);
}
int numSamplers = reader.ReadInt32();
m_Samplers = new SamplerParameter[numSamplers];
for (int i = 0; i < numSamplers; i++)
{
m_Samplers[i] = new SamplerParameter(reader);
}
}
}
public class SerializedSubProgram public class SerializedSubProgram
{ {
public uint m_BlobIndex; public uint m_BlobIndex;
@ -484,6 +566,7 @@ namespace AssetStudio
public ushort[] m_KeywordIndices; public ushort[] m_KeywordIndices;
public sbyte m_ShaderHardwareTier; public sbyte m_ShaderHardwareTier;
public ShaderGpuProgramType m_GpuProgramType; public ShaderGpuProgramType m_GpuProgramType;
public SerializedProgramParameters m_Parameters;
public VectorParameter[] m_VectorParams; public VectorParameter[] m_VectorParams;
public MatrixParameter[] m_MatrixParams; public MatrixParameter[] m_MatrixParams;
public TextureParameter[] m_TextureParams; public TextureParameter[] m_TextureParams;
@ -520,6 +603,16 @@ namespace AssetStudio
m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte(); m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte();
reader.AlignStream(); reader.AlignStream();
if ((version[0] == 2020 && version[1] > 3) ||
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
(version[0] == 2021 && version[1] > 1) ||
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
{
m_Parameters = new SerializedProgramParameters(reader);
}
else
{
int numVectorParams = reader.ReadInt32(); int numVectorParams = reader.ReadInt32();
m_VectorParams = new VectorParameter[numVectorParams]; m_VectorParams = new VectorParameter[numVectorParams];
for (int i = 0; i < numVectorParams; i++) for (int i = 0; i < numVectorParams; i++)
@ -578,6 +671,8 @@ namespace AssetStudio
m_Samplers[i] = new SamplerParameter(reader); m_Samplers[i] = new SamplerParameter(reader);
} }
} }
}
if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up
{ {
if (version[0] >= 2021) //2021.1 and up if (version[0] >= 2021) //2021.1 and up
@ -595,15 +690,27 @@ namespace AssetStudio
public class SerializedProgram public class SerializedProgram
{ {
public SerializedSubProgram[] m_SubPrograms; public SerializedSubProgram[] m_SubPrograms;
public SerializedProgramParameters m_CommonParameters;
public SerializedProgram(ObjectReader reader) public SerializedProgram(ObjectReader reader)
{ {
var version = reader.version;
int numSubPrograms = reader.ReadInt32(); int numSubPrograms = reader.ReadInt32();
m_SubPrograms = new SerializedSubProgram[numSubPrograms]; m_SubPrograms = new SerializedSubProgram[numSubPrograms];
for (int i = 0; i < numSubPrograms; i++) for (int i = 0; i < numSubPrograms; i++)
{ {
m_SubPrograms[i] = new SerializedSubProgram(reader); m_SubPrograms[i] = new SerializedSubProgram(reader);
} }
if ((version[0] == 2020 && version[1] > 3) ||
(version[0] == 2020 && version[1] == 3 && version[2] > 0) ||
(version[0] == 2020 && version[1] == 3 && version[2] == 0 && version[3] >= 2) || //2020.3.0f2 to 2020.3.x
(version[0] == 2021 && version[1] > 1) ||
(version[0] == 2021 && version[1] == 1 && version[2] >= 4)) //2021.1.4f1 to 2021.1.x
{
m_CommonParameters = new SerializedProgramParameters(reader);
}
} }
} }
@ -861,6 +968,26 @@ namespace AssetStudio
decompressedLengths = reader.ReadUInt32Array(); decompressedLengths = reader.ReadUInt32Array();
} }
compressedBlob = reader.ReadUInt8Array(); compressedBlob = reader.ReadUInt8Array();
reader.AlignStream();
var m_DependenciesCount = reader.ReadInt32();
for (int i = 0; i < m_DependenciesCount; i++)
{
new PPtr<Shader>(reader);
}
if (version[0] >= 2018)
{
var m_NonModifiableTexturesCount = reader.ReadInt32();
for (int i = 0; i < m_NonModifiableTexturesCount; i++)
{
var first = reader.ReadAlignedString();
new PPtr<Texture>(reader);
}
}
var m_ShaderIsBaked = reader.ReadBoolean();
reader.AlignStream();
} }
else else
{ {

View File

@ -167,6 +167,13 @@ namespace AssetStudio
sb.Append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms)); sb.Append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms));
sb.Append("}\n"); sb.Append("}\n");
} }
if (m_Passe.progRayTracing?.m_SubPrograms.Length > 0)
{
sb.Append("Program \"rtp\" {\n");
sb.Append(ConvertSerializedSubPrograms(m_Passe.progRayTracing.m_SubPrograms, platforms, shaderPrograms));
sb.Append("}\n");
}
} }
sb.Append("}\n"); sb.Append("}\n");
} }