Ejemplo n.º 1
0
 void ExportSerializedProgram(SerializedProgram serializedProgram, ShaderWriter writer, ShaderType type)
 {
     if (serializedProgram.SubPrograms.Count > 0)
     {
         writer.WriteIndent(3);
         writer.Write("Program \"{0}\" {{\n", type.ToProgramTypeString());
         HashSet <ShaderGpuProgramType> isTierLookup = GetIsTierLookup(serializedProgram.SubPrograms);
         var subprograms = serializedProgram.SubPrograms;
         var best        = serializedProgram.SubPrograms
                           .OrderByDescending(subProgram =>
         {
             GPUPlatform platform      = subProgram.GpuProgramType.ToGPUPlatform(writer.Platform);
             int index                 = writer.Shader.Platforms.IndexOf(platform);
             ShaderSubProgramBlob blob = writer.Shader.SubProgramBlobs[index];
             var sp = blob.SubPrograms[(int)subProgram.BlobIndex];
             return(sp.ProgramData.Count);
             //return sp.GlobalKeywords.Sum(keyword => keyword.Contains("ON") ? 2 : 1);
         }).FirstOrDefault();
         if (FilterSubPrograms)
         {
             subprograms = new SerializedSubProgram[] { best };
         }
         foreach (SerializedSubProgram subProgram in subprograms)
         {
             Platform             uplatform = writer.Platform;
             GPUPlatform          platform  = subProgram.GpuProgramType.ToGPUPlatform(uplatform);
             int                  index     = writer.Shader.Platforms.IndexOf(platform);
             ShaderSubProgramBlob blob      = writer.Shader.SubProgramBlobs[index];
             bool                 isTier    = isTierLookup.Contains(subProgram.GpuProgramType);
             ExportSerializedSubProgram(subProgram, writer, blob, type, isTier, best.BlobIndex == subProgram.BlobIndex);
         }
         writer.WriteIndent(3);
         writer.Write("}\n");
     }
 }
Ejemplo n.º 2
0
 public Shader(AssetInfo assetInfo) :
     base(assetInfo)
 {
     if (IsEncoded)
     {
         SubProgramBlob = new ShaderSubProgramBlob();
     }
 }
Ejemplo n.º 3
0
        public override void Read(EndianStream stream)
        {
            base.Read(stream);

            ParsedForm.Read(stream);
            Name = ParsedForm.Name;

            m_platforms = stream.ReadEnum32Array((t) => (GPUPlatform)t);
            uint[] offsets             = stream.ReadUInt32Array();
            uint[] compressedLengths   = stream.ReadUInt32Array();
            uint[] decompressedLengths = stream.ReadUInt32Array();
            byte[] compressedBlob      = stream.ReadByteArray();
            stream.AlignStream(AlignType.Align4);

            m_subProgramBlobs = new ShaderSubProgramBlob[m_platforms.Length];
            using (MemoryStream memStream = new MemoryStream(compressedBlob))
            {
                for (int i = 0; i < m_platforms.Length; i++)
                {
                    uint offset             = offsets[i];
                    uint compressedLength   = compressedLengths[i];
                    uint decompressedLength = decompressedLengths[i];

                    memStream.Position = offset;
                    byte[] decompressedBuffer = new byte[decompressedLength];
                    using (Lz4Stream lz4Stream = new Lz4Stream(memStream, (int)compressedLength))
                    {
                        int read = lz4Stream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
                        if (read != decompressedLength)
                        {
                            throw new Exception($"Can't properly decode shader blob. Read {read} but expected {decompressedLength}");
                        }
                    }

                    using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
                    {
                        using (EndianStream blobStream = new EndianStream(blobMem))
                        {
                            ShaderSubProgramBlob blob = new ShaderSubProgramBlob(AssetsFile);
                            blob.Read(blobStream);
                            m_subProgramBlobs[i] = blob;
                        }
                    }
                }
            }

            m_dependencies = stream.ReadArray(() => new PPtr <SShader>(AssetsFile));
            ShaderIsBaked  = stream.ReadBoolean();
            stream.AlignStream(AlignType.Align4);
        }
 private void UnpackSubProgramBlobs(AssetLayout layout, uint[][] offsets, uint[][] compressedLengths, uint[][] decompressedLengths, byte[] compressedBlob)
 {
     Blobs = new ShaderSubProgramBlob[offsets.Length];
     using (MemoryStream memStream = new MemoryStream(compressedBlob))
     {
         for (int i = 0; i < Platforms.Length; i++)
         {
             uint[] blobOffsets             = offsets[i];
             uint[] blobCompressedLengths   = compressedLengths[i];
             uint[] blobDecompressedLengths = decompressedLengths[i];
             Blobs[i].Read(layout, memStream, blobOffsets, blobCompressedLengths, blobDecompressedLengths);
         }
     }
 }
Ejemplo n.º 5
0
        public void Export(ShaderWriter writer, ShaderType type)
        {
            writer.WriteIndent(3);
            writer.Write("Program \"{0}\" {{\n", type.ToProgramTypeString());
            int tierCount = GetTierCount(SubPrograms);

            for (int i = 0; i < SubPrograms.Length; i++)
            {
                SerializedSubProgram subProgram = SubPrograms[i];
                Platform             uplatform  = writer.Platform;
                GPUPlatform          platform   = subProgram.GpuProgramType.ToGPUPlatform(uplatform);
                int index = writer.Shader.Platforms.IndexOf(platform);
                ref ShaderSubProgramBlob blob = ref writer.Shader.SubProgramBlobs[index];
                subProgram.Export(writer, ref blob, type, tierCount > 1);
            }
Ejemplo n.º 6
0
        private void ReadSubProgramBlobs(AssetLayout layout, uint[] offsets, uint[] compressedLengths, uint[] decompressedLengths, byte[] compressedBlob)
        {
            SubProgramBlobs = new ShaderSubProgramBlob[Platforms.Length];
            using (MemoryStream memStream = new MemoryStream(compressedBlob))
            {
                for (int i = 0; i < Platforms.Length; i++)
                {
                    uint offset             = offsets[i];
                    uint compressedLength   = compressedLengths[i];
                    uint decompressedLength = decompressedLengths[i];

                    SubProgramBlobs[i] = ReadSubProgramBlobs(layout, memStream, offset, compressedLength, decompressedLength);
                }
            }
        }
 private void UnpackSubProgramBlobs(AssetLayout layout, uint offset, uint compressedLength, uint decompressedLength, byte[] compressedBlob)
 {
     if (compressedBlob.Length == 0)
     {
         Blobs = Array.Empty <ShaderSubProgramBlob>();
     }
     else
     {
         Blobs = new ShaderSubProgramBlob[1];
         using (MemoryStream memStream = new MemoryStream(compressedBlob))
         {
             uint[] offsets             = new uint[] { offset };
             uint[] compressedLengths   = new uint[] { compressedLength };
             uint[] decompressedLengths = new uint[] { decompressedLength };
             Blobs[0].Read(layout, memStream, offsets, compressedLengths, decompressedLengths);
         }
     }
 }
Ejemplo n.º 8
0
        public void Export(ShaderWriter writer, ref ShaderSubProgramBlob blob, ShaderType type, bool isTier)
        {
            writer.WriteIndent(4);
#warning TODO: convertion (DX to HLSL)
            writer.Write("SubProgram \"{0} ", GpuProgramType.ToGPUPlatform(writer.Platform));
            if (isTier)
            {
                writer.Write("hw_tier{0} ", ShaderHardwareTier.ToString("00"));
            }
            writer.Write("\" {\n");
            writer.WriteIndent(5);

            blob.SubPrograms[(int)BlobIndex].Export(writer, type);

            writer.Write('\n');
            writer.WriteIndent(4);
            writer.Write("}\n");
        }
Ejemplo n.º 9
0
        private ShaderSubProgramBlob ReadSubProgramBlobs(AssetLayout layout, MemoryStream memStream, uint offset, uint compressedLength, uint decompressedLength)
        {
            memStream.Position = offset;
            byte[] decompressedBuffer = new byte[decompressedLength];
            using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream, (int)compressedLength))
            {
                lz4Stream.ReadBuffer(decompressedBuffer, 0, decompressedBuffer.Length);
            }

            using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
            {
                using (AssetReader blobReader = new AssetReader(blobMem, EndianType.LittleEndian, layout))
                {
                    ShaderSubProgramBlob blob = new ShaderSubProgramBlob();
                    blob.Read(blobReader);
                    return(blob);
                }
            }
        }
Ejemplo n.º 10
0
        public override void Read(AssetReader reader)
        {
            if (IsSerialized(reader.Version))
            {
                ReadBase(reader);

                ParsedForm.Read(reader);

                m_platforms = reader.ReadEnum32Array((t) => (GPUPlatform)t);
                uint[] offsets             = reader.ReadUInt32Array();
                uint[] compressedLengths   = reader.ReadUInt32Array();
                uint[] decompressedLengths = reader.ReadUInt32Array();
                byte[] compressedBlob      = reader.ReadByteArray();
                reader.AlignStream(AlignType.Align4);

                m_subProgramBlobs = new ShaderSubProgramBlob[m_platforms.Length];
                using (MemoryStream memStream = new MemoryStream(compressedBlob))
                {
                    for (int i = 0; i < m_platforms.Length; i++)
                    {
                        uint offset             = offsets[i];
                        uint compressedLength   = compressedLengths[i];
                        uint decompressedLength = decompressedLengths[i];

                        memStream.Position = offset;
                        byte[] decompressedBuffer = new byte[decompressedLength];
                        using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream, (int)compressedLength))
                        {
                            int read = lz4Stream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
                            if (read != decompressedLength)
                            {
                                throw new Exception($"Can't properly decode shader blob. Read {read} but expected {decompressedLength}");
                            }
                        }

                        using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetReader blobReader = new AssetReader(blobMem, reader.Version, reader.Platform, reader.Flags))
                            {
                                ShaderSubProgramBlob blob = new ShaderSubProgramBlob();
                                blob.Read(blobReader);
                                m_subProgramBlobs[i] = blob;
                            }
                        }
                    }
                }
            }
            else
            {
                base.Read(reader);

                if (IsEncoded(reader.Version))
                {
                    uint decompressedSize = reader.ReadUInt32();
                    int  comressedSize    = reader.ReadInt32();

                    byte[] subProgramBlob = new byte[comressedSize];
                    reader.Read(subProgramBlob, 0, comressedSize);
                    reader.AlignStream(AlignType.Align4);

                    if (comressedSize > 0 && decompressedSize > 0)
                    {
                        byte[] decompressedBuffer = new byte[decompressedSize];
                        using (MemoryStream memStream = new MemoryStream(subProgramBlob))
                        {
                            using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream))
                            {
                                int read = lz4Stream.Read(decompressedBuffer, 0, decompressedBuffer.Length);
                                if (read != decompressedSize)
                                {
                                    throw new Exception($"Can't properly decode sub porgram blob. Read {read} but expected {decompressedSize}");
                                }
                            }
                        }

                        using (MemoryStream memStream = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetReader blobReader = new AssetReader(memStream, reader.Version, reader.Platform, reader.Flags))
                            {
                                SubProgramBlob.Read(blobReader);
                            }
                        }
                    }
                }

                if (IsReadFallback(reader.Version))
                {
                    Fallback.Read(reader);
                }
                if (IsReadDefaultProperties(reader.Version))
                {
                    DefaultProperties.Read(reader);
                }
                if (IsReadStaticProperties(reader.Version))
                {
                    StaticProperties.Read(reader);
                }
            }

            if (IsReadDependencies(reader.Version))
            {
                m_dependencies = reader.ReadAssetArray <PPtr <Shader> >();
            }
            if (IsReadNonModifiableTextures(reader.Version))
            {
                m_nonModifiableTextures = reader.ReadAssetArray <PPtr <Texture> >();
            }
            if (IsReadShaderIsBaked(reader.Version))
            {
                ShaderIsBaked = reader.ReadBoolean();
                reader.AlignStream(AlignType.Align4);
            }
        }
Ejemplo n.º 11
0
        void ExportSerializedSubProgram(SerializedSubProgram subProgram, ShaderWriter writer, ShaderSubProgramBlob blob, ShaderType type, bool isTier, bool isBest)
        {
            writer.WriteIndent(4);
            writer.Write("SubProgram \"{0} ", subProgram.GpuProgramType.ToGPUPlatform(writer.Platform));
            if (isTier)
            {
                writer.Write("hw_tier{0} ", subProgram.ShaderHardwareTier.ToString("00"));
            }
            writer.Write("\" {\n");
            writer.WriteIndent(5);

            var    shaderSubProgram = blob.SubPrograms[(int)subProgram.BlobIndex];
            string hash             = Hash(shaderSubProgram.ProgramData.ToArray());
            var    filesteam        = writer.BaseStream as FileStream;
            var    folder           = Path.GetDirectoryName(filesteam.Name);

            DXShaderObjectExporter.FixShaderSubProgram(shaderSubProgram,
                                                       subProgram);
            ExportShaderSubProgram(shaderSubProgram, writer, type, isBest);

            writer.Write('\n');
            writer.WriteIndent(4);
            writer.Write("}\n");
        }
Ejemplo n.º 12
0
        public override void Read(AssetReader reader)
        {
            if (IsSerialized(reader.Version))
            {
                ReadNamedObject(reader);

                ParsedForm.Read(reader);

                Platforms = reader.ReadArray((t) => (GPUPlatform)t);
                uint[] offsets             = reader.ReadUInt32Array();
                uint[] compressedLengths   = reader.ReadUInt32Array();
                uint[] decompressedLengths = reader.ReadUInt32Array();
                byte[] compressedBlob      = reader.ReadByteArray();
                reader.AlignStream();

                SubProgramBlobs = new ShaderSubProgramBlob[Platforms.Length];
                using (MemoryStream memStream = new MemoryStream(compressedBlob))
                {
                    for (int i = 0; i < Platforms.Length; i++)
                    {
                        uint offset             = offsets[i];
                        uint compressedLength   = compressedLengths[i];
                        uint decompressedLength = decompressedLengths[i];

                        memStream.Position = offset;
                        byte[] decompressedBuffer = new byte[decompressedLength];
                        using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream, (int)compressedLength))
                        {
                            lz4Stream.ReadBuffer(decompressedBuffer, 0, decompressedBuffer.Length);
                        }

                        using (MemoryStream blobMem = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetReader blobReader = new AssetReader(blobMem, EndianType.LittleEndian, reader.Version, reader.Platform, reader.Flags))
                            {
                                ShaderSubProgramBlob blob = new ShaderSubProgramBlob();
                                blob.Read(blobReader);
                                SubProgramBlobs[i] = blob;
                            }
                        }
                    }
                }
            }
            else
            {
                base.Read(reader);

                if (IsEncoded(reader.Version))
                {
                    uint decompressedSize = reader.ReadUInt32();
                    int  comressedSize    = reader.ReadInt32();
                    if (comressedSize > 0 && decompressedSize > 0)
                    {
                        byte[] subProgramBlob = new byte[comressedSize];
                        reader.ReadBuffer(subProgramBlob, 0, comressedSize);

                        byte[] decompressedBuffer = new byte[decompressedSize];
                        using (MemoryStream memStream = new MemoryStream(subProgramBlob))
                        {
                            using (Lz4DecodeStream lz4Stream = new Lz4DecodeStream(memStream))
                            {
                                lz4Stream.ReadBuffer(decompressedBuffer, 0, decompressedBuffer.Length);
                            }
                        }

                        using (MemoryStream memStream = new MemoryStream(decompressedBuffer))
                        {
                            using (AssetReader blobReader = new AssetReader(memStream, EndianType.LittleEndian, reader.Version, reader.Platform, reader.Flags))
                            {
                                SubProgramBlob.Read(blobReader);
                            }
                        }
                    }
                    reader.AlignStream();
                }

                if (HasFallback(reader.Version))
                {
                    Fallback.Read(reader);
                }
                if (HasDefaultProperties(reader.Version))
                {
                    DefaultProperties.Read(reader);
                }
                if (HasStaticProperties(reader.Version))
                {
                    StaticProperties.Read(reader);
                }
            }

            if (HasDependencies(reader.Version))
            {
                Dependencies = reader.ReadAssetArray <PPtr <Shader> >();
            }
            if (HasNonModifiableTextures(reader.Version))
            {
                NonModifiableTextures = new Dictionary <string, PPtr <Texture> >();
                NonModifiableTextures.Read(reader);
            }
            if (HasShaderIsBaked(reader.Version))
            {
                ShaderIsBaked = reader.ReadBoolean();
                reader.AlignStream();
            }

#if UNIVERSAL
            if (HasErrors(reader.Version, reader.Flags))
            {
                Errors = reader.ReadAssetArray <ShaderError>();
            }
            if (HasDefaultTextures(reader.Version, reader.Flags))
            {
                DefaultTextures = new Dictionary <string, PPtr <Texture> >();
                DefaultTextures.Read(reader);
            }
            if (HasCompileInfo(reader.Version, reader.Flags))
            {
                CompileInfo.Read(reader);
            }
#endif
        }