コード例 #1
0
        public static bool ParseShader(FxcShader shader)
        {
            ShaderBytecode ByteCodeObj;
            ShaderProfile  ShaderProfile;

            try
            {
                ByteCodeObj = new ShaderBytecode(shader.ByteCode);

                ShaderProfile = ByteCodeObj.GetVersion();


                switch (ShaderProfile.Version)
                {
                case ShaderVersion.VertexShader:
                case ShaderVersion.PixelShader:
                case ShaderVersion.GeometryShader:
                    //VersionMajor = br.ReadByte();//4,5 //appears to be shader model version
                    //VersionMinor = br.ReadByte(); //perhaps shader minor version
                    break;

                default:
                    shader.VersionMajor = (byte)ShaderProfile.Major;
                    shader.VersionMinor = (byte)ShaderProfile.Minor;
                    break;
                }

                shader.Disassembly = ByteCodeObj.Disassemble();
            }
            catch (Exception ex)
            {
                shader.LastError += ex.ToString() + "\r\n";
                return(false);
            }

            return(true);
        }
コード例 #2
0
ファイル: Shader.D3D11.cs プロジェクト: Nostritius/OpenSAGE
        private void PlatformConstruct(
            GraphicsDevice graphicsDevice,
            string functionName,
            byte[] deviceBytecode,
            out ShaderType shaderType,
            out ShaderResourceBinding[] resourceBindings)
        {
            DeviceBytecode = deviceBytecode;

            using (var shaderBytecode = new ShaderBytecode(DeviceBytecode))
            {
                switch (shaderBytecode.GetVersion().Version)
                {
                case ShaderVersion.VertexShader:
                    DeviceShader = AddDisposable(new VertexShader(graphicsDevice.Device, DeviceBytecode));
                    shaderType   = ShaderType.VertexShader;
                    break;

                case ShaderVersion.PixelShader:
                    DeviceShader = AddDisposable(new PixelShader(graphicsDevice.Device, DeviceBytecode));
                    shaderType   = ShaderType.PixelShader;
                    break;

                default:
                    throw new NotSupportedException();
                }
            }

            using (var reflection = new ShaderReflection(DeviceBytecode))
            {
                resourceBindings = new ShaderResourceBinding[reflection.Description.BoundResources];

                for (var i = 0; i < resourceBindings.Length; i++)
                {
                    var resourceDescription = reflection.GetResourceBindingDescription(i);

                    int constantBufferSizeInBytes;
                    ConstantBufferField[] constantBufferFields;
                    if (resourceDescription.Type == ShaderInputType.ConstantBuffer)
                    {
                        using (var constantBufferDesc = reflection.GetConstantBuffer(resourceDescription.Name))
                        {
                            constantBufferSizeInBytes = constantBufferDesc.Description.Size;
                            constantBufferFields      = new ConstantBufferField[constantBufferDesc.Description.VariableCount];
                            for (var j = 0; j < constantBufferFields.Length; j++)
                            {
                                var variable = constantBufferDesc.GetVariable(j);

                                constantBufferFields[j] = new ConstantBufferField(
                                    variable.Description.Name,
                                    variable.Description.StartOffset,
                                    variable.Description.Size);
                            }
                        }
                    }
                    else
                    {
                        constantBufferSizeInBytes = 0;
                        constantBufferFields      = null;
                    }

                    resourceBindings[i] = new ShaderResourceBinding(
                        resourceDescription.Name,
                        GetResourceType(resourceDescription.Type),
                        shaderType,
                        resourceDescription.BindPoint,
                        constantBufferSizeInBytes,
                        constantBufferFields);
                }
            }
        }
コード例 #3
0
ファイル: FxcFile.cs プロジェクト: rt-2/CodeWalker
        public bool Read(BinaryReader br, bool exbyteflag)
        {
            Name = FxcFile.ReadString(br);

            if (Name.Length == 0)
            {
                Name       = FxcFile.ReadString(br); //why  (seems to be GS only)
                exbyteflag = true;
            }


            Params = FxcFile.ReadStringArray(br);

            byte bufferCount = br.ReadByte();
            var  buffers     = new List <FxcShaderBufferRef>();

            for (int e = 0; e < bufferCount; e++)
            {
                FxcShaderBufferRef ext = new FxcShaderBufferRef();
                ext.Name       = FxcFile.ReadString(br);
                ext.Unk0Ushort = br.ReadUInt16();
                buffers.Add(ext);
            }
            Buffers = buffers.ToArray();

            byte exbyte = 0;

            if (exbyteflag)
            {
                exbyte = br.ReadByte(); //not sure what this is used for...
                if ((exbyte != 0))
                {
                }
            }


            uint datalength = br.ReadUInt32();

            if (datalength > 0)
            {
                uint magic_dxbc = br.ReadUInt32();
                if (magic_dxbc != 1128421444) //"DXBC" - directx bytecode header
                {
                    LastError += "Unexpected data found at DXBC header...\r\n";
                    return(false);           //didn't find the DXBC header... abort!
                }
                br.BaseStream.Position -= 4; //wind back because dx needs that header

                ByteCode = br.ReadBytes((int)datalength);


                try
                {
                    ByteCodeObj = new ShaderBytecode(ByteCode);

                    ShaderProfile = ByteCodeObj.GetVersion();

                    Disassembly = ByteCodeObj.Disassemble();


                    switch (ShaderProfile.Version)
                    {
                    case ShaderVersion.VertexShader:
                    case ShaderVersion.PixelShader:
                    case ShaderVersion.GeometryShader:
                        VersionMajor = br.ReadByte();    //4,5 //appears to be shader model version
                        VersionMinor = br.ReadByte();    //perhaps shader minor version
                        break;

                    default:
                        VersionMajor = (byte)ShaderProfile.Major;
                        VersionMinor = (byte)ShaderProfile.Minor;
                        break;
                    }
                }
                catch (Exception ex)
                {
                    LastError += ex.ToString() + "\r\n";
                    return(false);
                }
            }
            else
            {
            }
            return(true);
        }