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); }
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); } } }
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); }