diff options
| -rw-r--r-- | slang-gfx.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-profile-defs.h | 4 | ||||
| -rw-r--r-- | tools/gfx/d3d12/d3d12-device.cpp | 72 | ||||
| -rw-r--r-- | tools/gfx/debug-layer/debug-command-encoder.cpp | 2 |
4 files changed, 43 insertions, 36 deletions
diff --git a/slang-gfx.h b/slang-gfx.h index 18395e3f2..b4ab50517 100644 --- a/slang-gfx.h +++ b/slang-gfx.h @@ -2562,6 +2562,7 @@ struct D3D12DeviceExtendedDesc StructType structType = StructType::D3D12DeviceExtendedDesc; const char* rootParameterShaderAttributeName = nullptr; bool debugBreakOnD3D12Error = false; + uint32_t highestShaderModel = 0; }; } diff --git a/source/slang/slang-profile-defs.h b/source/slang/slang-profile-defs.h index 64522005a..acef8cb0a 100644 --- a/source/slang/slang-profile-defs.h +++ b/source/slang/slang-profile-defs.h @@ -104,6 +104,7 @@ PROFILE_VERSION(DX_6_3, DX) PROFILE_VERSION(DX_6_4, DX) PROFILE_VERSION(DX_6_5, DX) PROFILE_VERSION(DX_6_6, DX) +PROFILE_VERSION(DX_6_7, DX) PROFILE_VERSION(GLSL_110, GLSL) PROFILE_VERSION(GLSL_120, GLSL) @@ -210,6 +211,7 @@ PROFILE(DX_Lib_6_3, lib_6_3, Unknown, DX_6_3) PROFILE(DX_Lib_6_4, lib_6_4, Unknown, DX_6_4) PROFILE(DX_Lib_6_5, lib_6_5, Unknown, DX_6_5) PROFILE(DX_Lib_6_6, lib_6_6, Unknown, DX_6_6) +PROFILE(DX_Lib_6_7, lib_6_7, Unknown, DX_6_7) PROFILE_ALIAS(DX_None_6_1, DX_Lib_6_1, sm_6_1) PROFILE_ALIAS(DX_None_6_2, DX_Lib_6_2, sm_6_2) @@ -217,6 +219,8 @@ PROFILE_ALIAS(DX_None_6_3, DX_Lib_6_3, sm_6_3) PROFILE_ALIAS(DX_None_6_4, DX_Lib_6_4, sm_6_4) PROFILE_ALIAS(DX_None_6_5, DX_Lib_6_5, sm_6_5) PROFILE_ALIAS(DX_None_6_6, DX_Lib_6_6, sm_6_6) +PROFILE_ALIAS(DX_None_6_7, DX_Lib_6_7, sm_6_7) + // Define all the GLSL profiles diff --git a/tools/gfx/d3d12/d3d12-device.cpp b/tools/gfx/d3d12/d3d12-device.cpp index c1db6c6ba..2d9780b0f 100644 --- a/tools/gfx/d3d12/d3d12-device.cpp +++ b/tools/gfx/d3d12/d3d12-device.cpp @@ -33,6 +33,28 @@ using namespace Slang; static const uint32_t D3D_FEATURE_LEVEL_12_2 = 0xc200; +struct ShaderModelInfo +{ + D3D_SHADER_MODEL shaderModel; + SlangCompileTarget compileTarget; + const char* profileName; +}; +static ShaderModelInfo kKnownShaderModels[] = { +#define SHADER_MODEL_INFO_DXBC(major, minor) {D3D_SHADER_MODEL_##major##_##minor, SLANG_DXBC, "sm_" #major "_" #minor } + SHADER_MODEL_INFO_DXBC(5, 1), +#undef SHADER_MODEL_INFO_DXBC +#define SHADER_MODEL_INFO_DXIL(major, minor) {(D3D_SHADER_MODEL)0x##major##minor, SLANG_DXIL, "sm_" #major "_" #minor } + SHADER_MODEL_INFO_DXIL(6, 0), + SHADER_MODEL_INFO_DXIL(6, 1), + SHADER_MODEL_INFO_DXIL(6, 2), + SHADER_MODEL_INFO_DXIL(6, 3), + SHADER_MODEL_INFO_DXIL(6, 4), + SHADER_MODEL_INFO_DXIL(6, 5), + SHADER_MODEL_INFO_DXIL(6, 6), + SHADER_MODEL_INFO_DXIL(6, 7) +#undef SHADER_MODEL_INFO_DXIL +}; + Result DeviceImpl::createBuffer( const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, @@ -579,7 +601,10 @@ Result DeviceImpl::initialize(const Desc& desc) } D3D12_FEATURE_DATA_SHADER_MODEL shaderModelData = {}; - shaderModelData.HighestShaderModel = D3D_SHADER_MODEL_6_6; + if (m_extendedDesc.highestShaderModel != 0) + shaderModelData.HighestShaderModel = (D3D_SHADER_MODEL)m_extendedDesc.highestShaderModel; + else + shaderModelData.HighestShaderModel = kKnownShaderModels[SLANG_COUNT_OF(kKnownShaderModels)-1].shaderModel; // Find what features are supported { @@ -744,42 +769,19 @@ Result DeviceImpl::initialize(const Desc& desc) // Check shader model version. SlangCompileTarget compileTarget = SLANG_DXBC; const char* profileName = "sm_5_1"; - switch (shaderModelData.HighestShaderModel) + for (auto& sm : kKnownShaderModels) { - case D3D_SHADER_MODEL_5_1: - compileTarget = SLANG_DXBC; - profileName = "sm_5_1"; - break; - case D3D_SHADER_MODEL_6_0: - compileTarget = SLANG_DXIL; - profileName = "sm_6_0"; - break; - case D3D_SHADER_MODEL_6_1: - compileTarget = SLANG_DXIL; - profileName = "sm_6_1"; - break; - case D3D_SHADER_MODEL_6_2: - compileTarget = SLANG_DXIL; - profileName = "sm_6_2"; - break; - case D3D_SHADER_MODEL_6_3: - compileTarget = SLANG_DXIL; - profileName = "sm_6_3"; - break; - case D3D_SHADER_MODEL_6_4: - compileTarget = SLANG_DXIL; - profileName = "sm_6_4"; - break; - case D3D_SHADER_MODEL_6_5: - compileTarget = SLANG_DXIL; - profileName = "sm_6_5"; - break; - default: - compileTarget = SLANG_DXIL; - profileName = "sm_6_6"; - break; + if (sm.shaderModel <= shaderModelData.HighestShaderModel) + { + m_features.add(sm.profileName); + profileName = sm.profileName; + compileTarget = sm.compileTarget; + } + else + { + break; + } } - m_features.add(profileName); // If user specified a higher shader model than what the system supports, return failure. int userSpecifiedShaderModel = D3DUtil::getShaderModelFromProfileName(desc.slang.targetProfile); if (userSpecifiedShaderModel > shaderModelData.HighestShaderModel) diff --git a/tools/gfx/debug-layer/debug-command-encoder.cpp b/tools/gfx/debug-layer/debug-command-encoder.cpp index b8b005338..64ebd2b46 100644 --- a/tools/gfx/debug-layer/debug-command-encoder.cpp +++ b/tools/gfx/debug-layer/debug-command-encoder.cpp @@ -346,7 +346,7 @@ void DebugResourceCommandEncoderImpl::resolveQuery( IQueryPool* queryPool, GfxIndex index, GfxCount count, IBufferResource* buffer, Offset offset) { SLANG_GFX_API_FUNC; - getBaseResourceEncoder()->resolveQuery(getInnerObj(queryPool), index, count, buffer, offset); + getBaseResourceEncoder()->resolveQuery(getInnerObj(queryPool), index, count, getInnerObj(buffer), offset); } void DebugResourceCommandEncoderImpl::copyTextureToBuffer( |
