microsoft / ShaderConductor

ShaderConductor is a tool designed for cross-compiling HLSL to other shading languages
MIT License
1.78k stars 249 forks source link

HLSL compiled to DXIL won't load in DirectX11 #63

Open CallumCVM opened 3 years ago

CallumCVM commented 3 years ago

Describe the bug A HLSL vertex shader I am compiling to DXIL refuses to be created via ID3D11Device::CreateVertexShader due to the following error code:

D3D11 ERROR: ID3D11Device::CreateVertexShader: Vertex Shader is corrupt or in an unrecognized format. [ STATE_CREATION ERROR #166: CREATEVERTEXSHADER_INVALIDSHADERBYTECODE] D3D11 ERROR: ID3D11Device::CreateVertexShader: Shader is corrupt or in an unrecognized format. [ STATE_CREATION ERROR #166: CREATEVERTEXSHADER_INVALIDSHADERBYTECODE]

To Reproduce Shaders.zip Steps to reproduce the behavior:

  1. Input shader attached [Mesh.vs], I have also attached the compiled vso [Compiled/Mesh.vso]
  2. Full parameters:

`Compiler::ResultDesc CompileShader(const std::string& data, ShaderStage stage) { Compiler::SourceDesc sourceDesc{}; Compiler::TargetDesc targetDesc{};

sourceDesc.source = data.c_str();
sourceDesc.stage = stage;
sourceDesc.entryPoint = "ShaderMain";
sourceDesc.numDefines = 0;
sourceDesc.defines = nullptr;
sourceDesc.loadIncludeCallback = LoadInclude;

Compiler::Options opts;
opts.optimizationLevel = 0;

targetDesc.asModule = false;
targetDesc.language = ShadingLanguage::Dxil;
targetDesc.version = nullptr;

auto result = Compiler::Compile(sourceDesc, {}, targetDesc);

return result;

}` You may note that the constant buffer is commented out, this is due to another bug I have reported with the Dx shader compiler here: https://github.com/microsoft/DirectXShaderCompiler/issues/3511

Expected behavior I should be able to compile to DXIL, and load with Dx11.

gongminmin commented 3 years ago

No, D3D11 doesn't support DXIL. It's a by design behavior of DXC. Check https://github.com/microsoft/DirectXShaderCompiler/issues/621.