microsoft / ShaderConductor

ShaderConductor is a tool designed for cross-compiling HLSL to other shading languages

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

HLSL compiled to DXIL won't load in DirectX11

CallumCVM opened this issue · comments

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: microsoft/DirectXShaderCompiler#3511

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

No, D3D11 doesn't support DXIL. It's a by design behavior of DXC. Check microsoft/DirectXShaderCompiler#621.