I mimimized my code to the problem part. I used to create root signature version 1.0 with no problem. Then I tried to upgrade my code to compatible with root signature version 1.1 if the hardware support.
D3D12_ROOT_DESCRIPTOR1 CBV1rootDescriptor;
CBV1rootDescriptor.ShaderRegister = 0;
CBV1rootDescriptor.RegisterSpace = 0;
CBV1rootDescriptor.Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE;
D3D12_ROOT_DESCRIPTOR1 CBV2rootDescriptor;
CBV2rootDescriptor.ShaderRegister = 1;
CBV2rootDescriptor.RegisterSpace = 0;
CBV1rootDescriptor.Flags = D3D12_ROOT_DESCRIPTOR_FLAG_NONE;
D3D12_ROOT_PARAMETER1 rootParam[2];
rootParam[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
rootParam[0].Descriptor = CBV1rootDescriptor;
rootParam[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
rootParam[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_CBV;
rootParam[1].Descriptor = CBV2rootDescriptor;
rootParam[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
D3D12_FEATURE_DATA_ROOT_SIGNATURE featureData = {};
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_1;
if (FAILED(device->CheckFeatureSupport(D3D12_FEATURE_ROOT_SIGNATURE, &featureData, sizeof(featureData))))
{
featureData.HighestVersion = D3D_ROOT_SIGNATURE_VERSION_1_0;
}
D3D12_ROOT_SIGNATURE_DESC1 rootSigDesc = {};
rootSigDesc.NumParameters = _countof(rootParam);
rootSigDesc.pParameters = rootParam;
rootSigDesc.NumStaticSamplers = 0;
rootSigDesc.pStaticSamplers = nullptr;
rootSigDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT;
D3D12_VERSIONED_ROOT_SIGNATURE_DESC VersionedrootSigDesc = {};
VersionedrootSigDesc.Version = featureData.HighestVersion;
VersionedrootSigDesc.Desc_1_1 = rootSigDesc;
ID3DBlob* serializedRootSig = nullptr;
ID3DBlob* errorBlob = nullptr;
ThrowIfFailed(D3DX12SerializeVersionedRootSignature(&VersionedrootSigDesc, featureData.HighestVersion, &serializedRootSig, &errorBlob));
The code will throw if I run like above, I checked featureData.HighestVersion is 1.1. If I forced featureData.HighestVersion to 1.0, the code will pass. And if I remove the second rootParam[1], only use 1 rootParam, even featureData.HighestVersion is 1.1, the code will pass. Does version 1.1 has some restrictions on CBV on root descriptor? (Windows 10 21H2 OS Build 19044.1706, Visual Studio 2022 community 17.2.2)