diff options
| author | Yong He <yonghe@outlook.com> | 2021-07-09 11:00:44 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-09 11:00:44 -0700 |
| commit | fa565f96823f3985cffa3a899742fdf1449d5876 (patch) | |
| tree | e8aeddb87cd077bf9b28ca4b799756c0ee77e48a | |
| parent | 09a251e0f3a31c826eaa91eef64b04eb01c4393a (diff) | |
Enable testing with Swiftshader. (#1906)
42 files changed, 305 insertions, 216 deletions
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4f871a6c0..091997303 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -47,4 +47,6 @@ jobs: } $slangTestBinDir = ".\bin\windows-$testPlatform\${{matrix.configuration}}\"; $env:Path += ";$slangTestBinDir"; + Invoke-WebRequest -uri "https://github.com/shader-slang/swiftshader/releases/download/v1.0/vk_swiftshader_windows_$testPlatform.zip" -Method "GET" -Outfile "swiftshader.zip"; + Expand-Archive "swiftshader.zip" -DestinationPath $slangTestBinDir; & "$slangTestBinDir\slang-test.exe" -api all-dx12 -appveyor -bindir "$slangTestBinDir\" -platform $testPlatform -configuration ${{matrix.configuration}} -category $testCategory;
\ No newline at end of file diff --git a/external/slang-binaries b/external/slang-binaries -Subproject 959b5c336907769f5df386735590b2bf8b50718 +Subproject 788d2198b077df34bb6b42a9c4e6f345611e801 diff --git a/source/core/slang-render-api-util.cpp b/source/core/slang-render-api-util.cpp index edf8c13ca..6c00e72b0 100644 --- a/source/core/slang-render-api-util.cpp +++ b/source/core/slang-render-api-util.cpp @@ -265,7 +265,7 @@ static bool _canLoadSharedLibrary(const char* libName) switch (type) { case RenderApiType::OpenGl: return _canLoadSharedLibrary("opengl32"); - case RenderApiType::Vulkan: return _canLoadSharedLibrary("vulkan-1"); + case RenderApiType::Vulkan: return _canLoadSharedLibrary("vulkan-1") || _canLoadSharedLibrary("vk_swiftshader"); case RenderApiType::D3D11: return _canLoadSharedLibrary("d3d11"); case RenderApiType::D3D12: return _canLoadSharedLibrary("d3d12"); case RenderApiType::CPU: return true; diff --git a/tests/bugs/dxbc-double-problem.slang b/tests/bugs/dxbc-double-problem.slang index 50abf4d7b..441000f63 100644 --- a/tests/bugs/dxbc-double-problem.slang +++ b/tests/bugs/dxbc-double-problem.slang @@ -1,5 +1,5 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-dx12 -compute -use-dxil -output-using-type -shaderobj //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-dx12 -compute -output-using-type -shaderobj diff --git a/tests/compute/ray-tracing-inline.slang b/tests/compute/ray-tracing-inline.slang index 94e0a4f87..7699cf9eb 100644 --- a/tests/compute/ray-tracing-inline.slang +++ b/tests/compute/ray-tracing-inline.slang @@ -1,5 +1,5 @@ -//TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -use-dxil -profile sm_6_5 -render-feature ray-tracing -//TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-tracing +//TEST(compute):COMPARE_COMPUTE:-d3d12 -output-using-type -use-dxil -profile sm_6_5 -render-feature ray-query +//TEST(compute):COMPARE_COMPUTE:-vk -output-using-type -render-feature ray-query //TEST_INPUT: set scene = AccelerationStructure uniform RaytracingAccelerationStructure scene; diff --git a/tests/compute/texture-sample-grad-offset-clamp.slang b/tests/compute/texture-sample-grad-offset-clamp.slang index 2a7d4d79a..b83cc1264 100644 --- a/tests/compute/texture-sample-grad-offset-clamp.slang +++ b/tests/compute/texture-sample-grad-offset-clamp.slang @@ -1,5 +1,5 @@ -//TEST(compute, vulkan):COMPARE_RENDER_COMPUTE:-vk -shaderobj -//TEST(compute):COMPARE_RENDER_COMPUTE:-shaderobj +//TEST(compute, vulkan):COMPARE_RENDER_COMPUTE:-vk -shaderobj -render-feature shader-resource-min-lod +//TEST(compute):COMPARE_RENDER_COMPUTE:-shaderobj -render-feature shader-resource-min-lod //TEST_INPUT: Texture2D(size=4, content = one):name=t2D //TEST_INPUT: Sampler:name=samplerState diff --git a/tests/compute/texture-simple.slang b/tests/compute/texture-simple.slang index 54be76679..f9acfe3f0 100644 --- a/tests/compute/texture-simple.slang +++ b/tests/compute/texture-simple.slang @@ -1,9 +1,9 @@ -//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj -//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile cs_6_0 -use-dxil -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj +//TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj -output-using-type +//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile cs_6_0 -use-dxil -shaderobj -output-using-type +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type -render-feature hardware-device +//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type // Doesn't work on CUDA, not clear why yet //DISABLE_TEST_INPUT: Texture1D(format=R_Float32, size=4, content = one, mipMaps=1):name tLoad1D diff --git a/tests/compute/texture-simple.slang.expected.txt b/tests/compute/texture-simple.slang.expected.txt index cf6e7405a..195e0c411 100644 --- a/tests/compute/texture-simple.slang.expected.txt +++ b/tests/compute/texture-simple.slang.expected.txt @@ -1,4 +1,5 @@ -40E00000 -40E00000 -40E00000 -40E00000 +type: float +7.000000 +7.000000 +7.000000 +7.000000 diff --git a/tests/hlsl-intrinsic/bit-cast-double.slang b/tests/hlsl-intrinsic/bit-cast-double.slang index 43d12009b..292f56d8e 100644 --- a/tests/hlsl-intrinsic/bit-cast-double.slang +++ b/tests/hlsl-intrinsic/bit-cast-double.slang @@ -1,7 +1,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -cpu -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-slang -vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-slang -vk -compute -shaderobj -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-slang -cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer diff --git a/tests/hlsl-intrinsic/bit-cast/bit-cast-16-bit.slang b/tests/hlsl-intrinsic/bit-cast/bit-cast-16-bit.slang index 28f8973f6..adeb83a67 100644 --- a/tests/hlsl-intrinsic/bit-cast/bit-cast-16-bit.slang +++ b/tests/hlsl-intrinsic/bit-cast/bit-cast-16-bit.slang @@ -1,7 +1,7 @@ // bit-cast-16-bit.slang //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile sm_6_2 -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int16,half //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], stride=4):name inputBuffer diff --git a/tests/hlsl-intrinsic/classify-double.slang b/tests/hlsl-intrinsic/classify-double.slang index 7ab19e980..7108ce449 100644 --- a/tests/hlsl-intrinsic/classify-double.slang +++ b/tests/hlsl-intrinsic/classify-double.slang @@ -1,7 +1,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature double //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj // inf, -inf, nan, finite diff --git a/tests/hlsl-intrinsic/literal-int64.slang b/tests/hlsl-intrinsic/literal-int64.slang index 49a19663d..9dea6f72e 100644 --- a/tests/hlsl-intrinsic/literal-int64.slang +++ b/tests/hlsl-intrinsic/literal-int64.slang @@ -4,7 +4,7 @@ // No support with Dx12 with dxbc. Needs SM6.0 + dxil //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -profile cs_6_0 -dx12 -use-dxil -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int64 //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj // Note that the behavior we expect here, is a int without suffix is assumed to diff --git a/tests/hlsl-intrinsic/matrix-double-reduced-intrinsic.slang b/tests/hlsl-intrinsic/matrix-double-reduced-intrinsic.slang index 1d8a63d05..82f48399e 100644 --- a/tests/hlsl-intrinsic/matrix-double-reduced-intrinsic.slang +++ b/tests/hlsl-intrinsic/matrix-double-reduced-intrinsic.slang @@ -5,7 +5,7 @@ //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -shaderobj //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -output-using-type -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_0 -use-dxil -output-using-type -shaderobj -//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj +//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/matrix-double.slang b/tests/hlsl-intrinsic/matrix-double.slang index 9b4f8ac19..060c2f4ad 100644 --- a/tests/hlsl-intrinsic/matrix-double.slang +++ b/tests/hlsl-intrinsic/matrix-double.slang @@ -7,7 +7,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -output-using-type -//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type +//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/scalar-double-d3d-intrinsic.slang b/tests/hlsl-intrinsic/scalar-double-d3d-intrinsic.slang index 34bab6503..36f8ef130 100644 --- a/tests/hlsl-intrinsic/scalar-double-d3d-intrinsic.slang +++ b/tests/hlsl-intrinsic/scalar-double-d3d-intrinsic.slang @@ -4,7 +4,7 @@ // This is disabled because Dx12/DXBC doing double writes to a structured buffer can fail //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -output-using-type -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_0 -use-dxil -output-using-type -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/scalar-double-simple.slang b/tests/hlsl-intrinsic/scalar-double-simple.slang index b86cea88d..11370dd4d 100644 --- a/tests/hlsl-intrinsic/scalar-double-simple.slang +++ b/tests/hlsl-intrinsic/scalar-double-simple.slang @@ -5,7 +5,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile sm_6_0 -use-dxil -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature double //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/scalar-double-vk-intrinsic.slang b/tests/hlsl-intrinsic/scalar-double-vk-intrinsic.slang index 97292dcae..128c1c1cd 100644 --- a/tests/hlsl-intrinsic/scalar-double-vk-intrinsic.slang +++ b/tests/hlsl-intrinsic/scalar-double-vk-intrinsic.slang @@ -1,7 +1,7 @@ // This test is to see what intrinsics are available on VK //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute -output-using-type -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj -render-feature double // We don't want to run a cuda test here... //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj diff --git a/tests/hlsl-intrinsic/scalar-double.slang b/tests/hlsl-intrinsic/scalar-double.slang index 35f530269..cdf08e7b4 100644 --- a/tests/hlsl-intrinsic/scalar-double.slang +++ b/tests/hlsl-intrinsic/scalar-double.slang @@ -3,7 +3,7 @@ //TEST(compute):COMPARE_COMPUTE_EX:-cpu -compute //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute +//DISABLE_TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -render-feature double //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/scalar-int64.slang b/tests/hlsl-intrinsic/scalar-int64.slang index 35fba2fa4..0fdc5a36d 100644 --- a/tests/hlsl-intrinsic/scalar-int64.slang +++ b/tests/hlsl-intrinsic/scalar-int64.slang @@ -4,7 +4,7 @@ // No support with Dx12 with dxbc. Needs SM6.0 + dxil //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -profile cs_6_0 -dx12 -use-dxil -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int64 //TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/scalar-uint64.slang b/tests/hlsl-intrinsic/scalar-uint64.slang index f862852b4..314e37b94 100644 --- a/tests/hlsl-intrinsic/scalar-uint64.slang +++ b/tests/hlsl-intrinsic/scalar-uint64.slang @@ -5,7 +5,7 @@ // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/hlsl-shader-model-6-0-features-for-direct3d-12 //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -profile cs_6_0 -use-dxil -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature int64 //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/vector-double-reduced-intrinsic.slang b/tests/hlsl-intrinsic/vector-double-reduced-intrinsic.slang index 7d7e0ca0d..b75f5efc4 100644 --- a/tests/hlsl-intrinsic/vector-double-reduced-intrinsic.slang +++ b/tests/hlsl-intrinsic/vector-double-reduced-intrinsic.slang @@ -3,7 +3,7 @@ // On CI systems DX11 test failed, so disable for now //DISABLE_TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -output-using-type -shaderobj //TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -output-using-type -shaderobj -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -output-using-type -shaderobj -render-feature double //TEST(compute, vulkan):COMPARE_COMPUTE_EX:-cuda -compute -output-using-type -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-active-count-bits.slang b/tests/hlsl-intrinsic/wave-active-count-bits.slang index 2de7db485..0782fee11 100644 --- a/tests/hlsl-intrinsic/wave-active-count-bits.slang +++ b/tests/hlsl-intrinsic/wave-active-count-bits.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-active-product.slang b/tests/hlsl-intrinsic/wave-active-product.slang index 6d9aea1fa..5d7b85026 100644 --- a/tests/hlsl-intrinsic/wave-active-product.slang +++ b/tests/hlsl-intrinsic/wave-active-product.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-is-first-lane.slang b/tests/hlsl-intrinsic/wave-is-first-lane.slang index 203c20bb8..300e78801 100644 --- a/tests/hlsl-intrinsic/wave-is-first-lane.slang +++ b/tests/hlsl-intrinsic/wave-is-first-lane.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang index 71721ec35..37c49d805 100644 --- a/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang +++ b/tests/hlsl-intrinsic/wave-mask/wave-is-first-lane.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang index 5904d6b99..4ebd4e95f 100644 --- a/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang +++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-product.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang index bf8f83805..7d7f76d6c 100644 --- a/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang +++ b/tests/hlsl-intrinsic/wave-mask/wave-prefix-sum.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-mask/wave-vector.slang b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang index 1b77b3dc5..d51fbc6a3 100644 --- a/tests/hlsl-intrinsic/wave-mask/wave-vector.slang +++ b/tests/hlsl-intrinsic/wave-mask/wave-vector.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-mask/wave.slang b/tests/hlsl-intrinsic/wave-mask/wave.slang index 1b8acc277..5718dbcf1 100644 --- a/tests/hlsl-intrinsic/wave-mask/wave.slang +++ b/tests/hlsl-intrinsic/wave-mask/wave.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-prefix-count-bits.slang b/tests/hlsl-intrinsic/wave-prefix-count-bits.slang index 5440715aa..0c726e549 100644 --- a/tests/hlsl-intrinsic/wave-prefix-count-bits.slang +++ b/tests/hlsl-intrinsic/wave-prefix-count-bits.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-prefix-product.slang b/tests/hlsl-intrinsic/wave-prefix-product.slang index 70f52db13..4c412fe9f 100644 --- a/tests/hlsl-intrinsic/wave-prefix-product.slang +++ b/tests/hlsl-intrinsic/wave-prefix-product.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-prefix-sum.slang b/tests/hlsl-intrinsic/wave-prefix-sum.slang index 529b99d48..a90051d4e 100644 --- a/tests/hlsl-intrinsic/wave-prefix-sum.slang +++ b/tests/hlsl-intrinsic/wave-prefix-sum.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/hlsl-intrinsic/wave-vector.slang b/tests/hlsl-intrinsic/wave-vector.slang index eb8872145..a87aa1ebb 100644 --- a/tests/hlsl-intrinsic/wave-vector.slang +++ b/tests/hlsl-intrinsic/wave-vector.slang @@ -2,7 +2,7 @@ //DISABLE_TEST:COMPARE_COMPUTE_EX:-cpu -compute -shaderobj //DISABLE_TEST:COMPARE_COMPUTE_EX:-slang -compute -shaderobj //TEST:COMPARE_COMPUTE_EX:-slang -compute -dx12 -use-dxil -profile cs_6_0 -shaderobj -//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -render-feature hardware-device //TEST:COMPARE_COMPUTE_EX:-cuda -compute -render-features cuda_sm_7_0 -shaderobj //TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name outputBuffer diff --git a/tests/language-feature/initializer-lists/default-init-16bit-types.slang b/tests/language-feature/initializer-lists/default-init-16bit-types.slang index 5fb578ca4..09da165f9 100644 --- a/tests/language-feature/initializer-lists/default-init-16bit-types.slang +++ b/tests/language-feature/initializer-lists/default-init-16bit-types.slang @@ -1,6 +1,6 @@ // simple-namespace.slang -//TEST(compute):COMPARE_COMPUTE:-vk +//TEST(compute):COMPARE_COMPUTE:-vk -render-feature int16 // Test that default initialization works with 16-bit types under Vulkan. diff --git a/tests/type/texture-sampler/texture-sampler-2d.slang b/tests/type/texture-sampler/texture-sampler-2d.slang index 974231b9b..146fd0fd8 100644 --- a/tests/type/texture-sampler/texture-sampler-2d.slang +++ b/tests/type/texture-sampler/texture-sampler-2d.slang @@ -1,4 +1,4 @@ -//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj +//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type //TEST_INPUT: TextureSampler2D(size=4, content=one):name t2D Sampler2D<float> t2D; diff --git a/tests/type/texture-sampler/texture-sampler-2d.slang.expected.txt b/tests/type/texture-sampler/texture-sampler-2d.slang.expected.txt index cc5e55ab6..6c9927073 100644 --- a/tests/type/texture-sampler/texture-sampler-2d.slang.expected.txt +++ b/tests/type/texture-sampler/texture-sampler-2d.slang.expected.txt @@ -1,4 +1,5 @@ -3F800000 -3F800000 -3F800000 -3F800000 +type: float +1.0 +1.0 +1.0 +1.0 diff --git a/tools/copy-hlsl-libs.bat b/tools/copy-hlsl-libs.bat index 806cbfde7..721273112 100644 --- a/tools/copy-hlsl-libs.bat +++ b/tools/copy-hlsl-libs.bat @@ -5,9 +5,12 @@ set SOURCE_DIR=%~1 set TARGET_DIR=%~2 set PLATFORM=%~3 -robocopy "../../external/slang-binaries/bin/%PLATFORM%" "%TARGET_DIR%" d3dcompiler_47.dll /r:0 >nul +robocopy "../../../external/slang-binaries/bin/%PLATFORM%" "%TARGET_DIR%" d3dcompiler_47.dll /r:0 >nul -robocopy "%SOURCE_DIR%" "%TARGET_DIR%" dxcompiler.dll /xn /r:0 >nul -robocopy "%SOURCE_DIR%" "%TARGET_DIR%" dxil.dll /xn /r:0 >nul +robocopy "../../../external/slang-binaries/bin/%PLATFORM%" "%TARGET_DIR%" dxcompiler.dll /r:0 >nul +robocopy "../../../external/slang-binaries/bin/%PLATFORM%" "%TARGET_DIR%" dxil.dll /r:0 >nul + +robocopy "%SOURCE_DIR%" "%TARGET_DIR%" dxcompiler.dll /xo /r:0 >nul +robocopy "%SOURCE_DIR%" "%TARGET_DIR%" dxil.dll /xo /r:0 >nul exit /b 0 diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp index 0e3640d1f..703c0665f 100644 --- a/tools/gfx/vulkan/render-vk.cpp +++ b/tools/gfx/vulkan/render-vk.cpp @@ -138,38 +138,6 @@ public: ~VKDevice(); public: - // Float16 features - VkPhysicalDeviceFloat16Int8FeaturesKHR float16Features = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR}; - // 16 bit storage features - VkPhysicalDevice16BitStorageFeatures storage16BitFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR}; - // AtomicInt64 features - VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomicInt64Features = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR}; - // Atomic Float features - VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomicFloatFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT}; - // Timeline Semaphore features - VkPhysicalDeviceTimelineSemaphoreFeatures timelineFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES}; - // Extended dynamic state features - VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT}; - // Subgroup extended type features - VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypeFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES}; - // Acceleration structure features - VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR}; - // Ray query (inline ray-tracing) features - VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR}; - // Buffer device address features - VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures = { - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES}; - -public: class Buffer { @@ -5234,99 +5202,104 @@ Result VKDevice::initVulkanInstanceAndDevice(bool useValidationLayer) { m_queueAllocCount = 0; - VkApplicationInfo applicationInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO }; - applicationInfo.pApplicationName = "slang-render-test"; - applicationInfo.pEngineName = "slang-render-test"; + VkInstance instance = VK_NULL_HANDLE; + VkApplicationInfo applicationInfo = {VK_STRUCTURE_TYPE_APPLICATION_INFO}; + applicationInfo.pApplicationName = "slang-gfx"; + applicationInfo.pEngineName = "slang-gfx"; applicationInfo.apiVersion = VK_API_VERSION_1_1; applicationInfo.engineVersion = 1; applicationInfo.applicationVersion = 1; - const char* instanceExtensions[] = - { - VK_KHR_SURFACE_EXTENSION_NAME, - VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, + for (int tryUseSurfaceExtensions = 1; tryUseSurfaceExtensions >= 0; tryUseSurfaceExtensions--) + { + Array<const char*, 4> instanceExtensions; + instanceExtensions.add(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); + if (tryUseSurfaceExtensions) + { + instanceExtensions.add(VK_KHR_SURFACE_EXTENSION_NAME); #if SLANG_WINDOWS_FAMILY - VK_KHR_WIN32_SURFACE_EXTENSION_NAME, + instanceExtensions.add(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); #elif defined(SLANG_ENABLE_XLIB) - VK_KHR_XLIB_SURFACE_EXTENSION_NAME, + instanceExtensions.add(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); #endif - #if ENABLE_VALIDATION_LAYER - VK_EXT_DEBUG_REPORT_EXTENSION_NAME, + instanceExtensions.add(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); #endif - }; - - VkInstance instance = VK_NULL_HANDLE; + } - VkInstanceCreateInfo instanceCreateInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO }; - instanceCreateInfo.pApplicationInfo = &applicationInfo; - instanceCreateInfo.enabledExtensionCount = SLANG_COUNT_OF(instanceExtensions); - instanceCreateInfo.ppEnabledExtensionNames = &instanceExtensions[0]; + VkInstanceCreateInfo instanceCreateInfo = {VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO}; + instanceCreateInfo.pApplicationInfo = &applicationInfo; + instanceCreateInfo.enabledExtensionCount = (uint32_t)instanceExtensions.getCount(); + instanceCreateInfo.ppEnabledExtensionNames = &instanceExtensions[0]; - if (useValidationLayer) - { - // Depending on driver version, validation layer may or may not exist. - // Newer drivers comes with "VK_LAYER_KHRONOS_validation", while older - // drivers provide only the deprecated - // "VK_LAYER_LUNARG_standard_validation" layer. - // We will check what layers are available, and use the newer - // "VK_LAYER_KHRONOS_validation" layer when possible. - uint32_t layerCount; - m_api.vkEnumerateInstanceLayerProperties(&layerCount, nullptr); - - List<VkLayerProperties> availableLayers; - availableLayers.setCount(layerCount); - m_api.vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.getBuffer()); - - const char* layerNames[] = { nullptr }; - for (auto& layer : availableLayers) - { - if (strncmp( - layer.layerName, - "VK_LAYER_KHRONOS_validation", - sizeof("VK_LAYER_KHRONOS_validation")) == 0) - { - layerNames[0] = "VK_LAYER_KHRONOS_validation"; - break; - } - } - // On older drivers, only "VK_LAYER_LUNARG_standard_validation" exists, - // so we try to use it if we can't find "VK_LAYER_KHRONOS_validation". - if (!layerNames[0]) + if (useValidationLayer) { + // Depending on driver version, validation layer may or may not exist. + // Newer drivers comes with "VK_LAYER_KHRONOS_validation", while older + // drivers provide only the deprecated + // "VK_LAYER_LUNARG_standard_validation" layer. + // We will check what layers are available, and use the newer + // "VK_LAYER_KHRONOS_validation" layer when possible. + uint32_t layerCount; + m_api.vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + + List<VkLayerProperties> availableLayers; + availableLayers.setCount(layerCount); + m_api.vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.getBuffer()); + + const char* layerNames[] = {nullptr}; for (auto& layer : availableLayers) { if (strncmp( - layer.layerName, - "VK_LAYER_LUNARG_standard_validation", - sizeof("VK_LAYER_LUNARG_standard_validation")) == 0) + layer.layerName, + "VK_LAYER_KHRONOS_validation", + sizeof("VK_LAYER_KHRONOS_validation")) == 0) { - layerNames[0] = "VK_LAYER_LUNARG_standard_validation"; + layerNames[0] = "VK_LAYER_KHRONOS_validation"; break; } } + // On older drivers, only "VK_LAYER_LUNARG_standard_validation" exists, + // so we try to use it if we can't find "VK_LAYER_KHRONOS_validation". + if (!layerNames[0]) + { + for (auto& layer : availableLayers) + { + if (strncmp( + layer.layerName, + "VK_LAYER_LUNARG_standard_validation", + sizeof("VK_LAYER_LUNARG_standard_validation")) == 0) + { + layerNames[0] = "VK_LAYER_LUNARG_standard_validation"; + break; + } + } + } + if (layerNames[0]) + { + instanceCreateInfo.enabledLayerCount = SLANG_COUNT_OF(layerNames); + instanceCreateInfo.ppEnabledLayerNames = layerNames; + } } - if (layerNames[0]) + uint32_t apiVersionsToTry[] = {VK_API_VERSION_1_2, VK_API_VERSION_1_1, VK_API_VERSION_1_0}; + for (auto apiVersion : apiVersionsToTry) { - instanceCreateInfo.enabledLayerCount = SLANG_COUNT_OF(layerNames); - instanceCreateInfo.ppEnabledLayerNames = layerNames; + applicationInfo.apiVersion = apiVersion; + if (m_api.vkCreateInstance(&instanceCreateInfo, nullptr, &instance) == VK_SUCCESS) + { + break; + } } - } - uint32_t apiVersionsToTry[] = {VK_API_VERSION_1_2, VK_API_VERSION_1_1, VK_API_VERSION_1_0}; - for (auto apiVersion : apiVersionsToTry) - { - applicationInfo.apiVersion = apiVersion; - if (m_api.vkCreateInstance(&instanceCreateInfo, nullptr, &instance) == VK_SUCCESS) - { + if (instance) break; - } } if (!instance) return SLANG_FAIL; + SLANG_RETURN_ON_FAIL(m_api.initInstanceProcs(instance)); - if (useValidationLayer) + if (useValidationLayer && m_api.vkCreateDebugReportCallbackEXT) { VkDebugReportFlagsEXT debugFlags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; @@ -5410,6 +5383,8 @@ Result VKDevice::initVulkanInstanceAndDevice(bool useValidationLayer) const uint32_t majorVersion = VK_VERSION_MAJOR(basicProps.apiVersion); const uint32_t minorVersion = VK_VERSION_MINOR(basicProps.apiVersion); + auto& extendedFeatures = m_api.m_extendedFeatures; + // API version check, can't use vkGetPhysicalDeviceProperties2 yet since this device might not support it if (VK_MAKE_VERSION(majorVersion, minorVersion, 0) >= VK_API_VERSION_1_1 && m_api.vkGetPhysicalDeviceProperties2 && @@ -5419,57 +5394,77 @@ Result VKDevice::initVulkanInstanceAndDevice(bool useValidationLayer) VkPhysicalDeviceFeatures2 deviceFeatures2 = {}; deviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + // Inline uniform block + extendedFeatures.inlineUniformBlockFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.inlineUniformBlockFeatures; + // Buffer device address features - bufferDeviceAddressFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &bufferDeviceAddressFeatures; + extendedFeatures.bufferDeviceAddressFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.bufferDeviceAddressFeatures; // Ray query features - rayQueryFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &rayQueryFeatures; + extendedFeatures.rayQueryFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.rayQueryFeatures; // Acceleration structure features - accelerationStructureFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &accelerationStructureFeatures; + extendedFeatures.accelerationStructureFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.accelerationStructureFeatures; // Subgroup features - shaderSubgroupExtendedTypeFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &shaderSubgroupExtendedTypeFeatures; + extendedFeatures.shaderSubgroupExtendedTypeFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.shaderSubgroupExtendedTypeFeatures; // Extended dynamic states - extendedDynamicStateFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &extendedDynamicStateFeatures; + extendedFeatures.extendedDynamicStateFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.extendedDynamicStateFeatures; // Timeline Semaphore - timelineFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &timelineFeatures; + extendedFeatures.timelineFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.timelineFeatures; // Float16 - float16Features.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &float16Features; + extendedFeatures.float16Features.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.float16Features; // 16-bit storage - storage16BitFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &storage16BitFeatures; + extendedFeatures.storage16BitFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.storage16BitFeatures; // Atomic64 - atomicInt64Features.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &atomicInt64Features; + extendedFeatures.atomicInt64Features.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.atomicInt64Features; // Atomic Float // To detect atomic float we need // https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkPhysicalDeviceShaderAtomicFloatFeaturesEXT.html - atomicFloatFeatures.pNext = deviceFeatures2.pNext; - deviceFeatures2.pNext = &atomicFloatFeatures; + extendedFeatures.atomicFloatFeatures.pNext = deviceFeatures2.pNext; + deviceFeatures2.pNext = &extendedFeatures.atomicFloatFeatures; m_api.vkGetPhysicalDeviceFeatures2(m_api.m_physicalDevice, &deviceFeatures2); + if (deviceFeatures2.features.shaderResourceMinLod) + { + m_features.add("shader-resource-min-lod"); + } + if (deviceFeatures2.features.shaderFloat64) + { + m_features.add("double"); + } + if (deviceFeatures2.features.shaderInt64) + { + m_features.add("int64"); + } + if (deviceFeatures2.features.shaderInt16) + { + m_features.add("int16"); + } // If we have float16 features then enable - if (float16Features.shaderFloat16) + if (extendedFeatures.float16Features.shaderFloat16) { // Link into the creation features - float16Features.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &float16Features; + extendedFeatures.float16Features.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.float16Features; // Add the Float16 extension deviceExtensions.add(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME); @@ -5478,11 +5473,11 @@ Result VKDevice::initVulkanInstanceAndDevice(bool useValidationLayer) m_features.add("half"); } - if (storage16BitFeatures.storageBuffer16BitAccess) + if (extendedFeatures.storage16BitFeatures.storageBuffer16BitAccess) { // Link into the creation features - storage16BitFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &storage16BitFeatures; + extendedFeatures.storage16BitFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.storage16BitFeatures; // Add the 16-bit storage extension deviceExtensions.add(VK_KHR_16BIT_STORAGE_EXTENSION_NAME); @@ -5491,77 +5486,94 @@ Result VKDevice::initVulkanInstanceAndDevice(bool useValidationLayer) m_features.add("16-bit-storage"); } - if (atomicInt64Features.shaderBufferInt64Atomics) + if (extendedFeatures.atomicInt64Features.shaderBufferInt64Atomics) { // Link into the creation features - atomicInt64Features.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &atomicInt64Features; + extendedFeatures.atomicInt64Features.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.atomicInt64Features; deviceExtensions.add(VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME); m_features.add("atomic-int64"); } - if (atomicFloatFeatures.shaderBufferFloat32AtomicAdd) + if (extendedFeatures.atomicFloatFeatures.shaderBufferFloat32AtomicAdd) { // Link into the creation features - atomicFloatFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &atomicFloatFeatures; + extendedFeatures.atomicFloatFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.atomicFloatFeatures; deviceExtensions.add(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME); m_features.add("atomic-float"); } - if (timelineFeatures.timelineSemaphore) + if (extendedFeatures.timelineFeatures.timelineSemaphore) { // Link into the creation features - timelineFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &timelineFeatures; + extendedFeatures.timelineFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.timelineFeatures; deviceExtensions.add(VK_KHR_TIMELINE_SEMAPHORE_EXTENSION_NAME); m_features.add("timeline-semaphore"); } - if (extendedDynamicStateFeatures.extendedDynamicState) + if (extendedFeatures.extendedDynamicStateFeatures.extendedDynamicState) { // Link into the creation features - extendedDynamicStateFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &extendedDynamicStateFeatures; + extendedFeatures.extendedDynamicStateFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.extendedDynamicStateFeatures; deviceExtensions.add(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME); m_features.add("extended-dynamic-states"); } - if (shaderSubgroupExtendedTypeFeatures.shaderSubgroupExtendedTypes) + if (extendedFeatures.shaderSubgroupExtendedTypeFeatures.shaderSubgroupExtendedTypes) { - shaderSubgroupExtendedTypeFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &shaderSubgroupExtendedTypeFeatures; + extendedFeatures.shaderSubgroupExtendedTypeFeatures.pNext = + (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.shaderSubgroupExtendedTypeFeatures; deviceExtensions.add(VK_KHR_SHADER_SUBGROUP_EXTENDED_TYPES_EXTENSION_NAME); m_features.add("shader-subgroup-extended-types"); } - if (accelerationStructureFeatures.accelerationStructure) + if (extendedFeatures.accelerationStructureFeatures.accelerationStructure) { - accelerationStructureFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &accelerationStructureFeatures; + extendedFeatures.accelerationStructureFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.accelerationStructureFeatures; deviceExtensions.add(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME); deviceExtensions.add(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME); m_features.add("acceleration-structure"); } - if (rayQueryFeatures.rayQuery) + if (extendedFeatures.rayQueryFeatures.rayQuery) { - rayQueryFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &rayQueryFeatures; + extendedFeatures.rayQueryFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.rayQueryFeatures; deviceExtensions.add(VK_KHR_RAY_QUERY_EXTENSION_NAME); m_features.add("ray-query"); m_features.add("ray-tracing"); } - if (bufferDeviceAddressFeatures.bufferDeviceAddress) + if (extendedFeatures.bufferDeviceAddressFeatures.bufferDeviceAddress) { - bufferDeviceAddressFeatures.pNext = (void*)deviceCreateInfo.pNext; - deviceCreateInfo.pNext = &bufferDeviceAddressFeatures; + extendedFeatures.bufferDeviceAddressFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.bufferDeviceAddressFeatures; deviceExtensions.add(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); m_features.add("buffer-device-address"); } + + if (extendedFeatures.inlineUniformBlockFeatures.inlineUniformBlock) + { + extendedFeatures.inlineUniformBlockFeatures.pNext = (void*)deviceCreateInfo.pNext; + deviceCreateInfo.pNext = &extendedFeatures.inlineUniformBlockFeatures; + deviceExtensions.add(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME); + m_features.add("inline-uniform-block"); + } + } + if (m_api.m_module->isSoftware()) + { + m_features.add("software-device"); + } + else + { + m_features.add("hardware-device"); } m_queueFamilyIndex = m_api.findQueue(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT); @@ -5604,6 +5616,7 @@ SlangResult VKDevice::initialize(const Desc& desc) SLANG_RETURN_ON_FAIL(m_module.init()); SLANG_RETURN_ON_FAIL(m_api.initGlobalProcs(m_module)); descriptorSetAllocator.m_api = &m_api; + SLANG_RETURN_ON_FAIL(initVulkanInstanceAndDevice(ENABLE_VALIDATION_LAYER != 0)); { VkQueue queue; @@ -6088,6 +6101,14 @@ void VKDevice::_transitionImageLayout(VkImage image, VkFormat format, const Text sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; destinationStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; } + else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_GENERAL) + { + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT; + + sourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + destinationStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + } else { assert(!"unsupported layout transition!"); @@ -6364,7 +6385,7 @@ Result VKDevice::createBufferResource(const IBufferResource::Desc& descIn, const VkMemoryPropertyFlags reqMemoryProperties = 0; VkBufferUsageFlags usage = _calcBufferUsageFlags(desc.allowedStates); - if (bufferDeviceAddressFeatures.bufferDeviceAddress) + if (m_api.m_extendedFeatures.bufferDeviceAddressFeatures.bufferDeviceAddress) { usage |= VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT; } diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h index 5d044944f..746648470 100644 --- a/tools/gfx/vulkan/vk-api.h +++ b/tools/gfx/vulkan/vk-api.h @@ -191,6 +191,44 @@ namespace gfx { #define VK_API_DECLARE_PROC(NAME) PFN_##NAME NAME = nullptr; + +struct VulkanExtendedFeatureProperties +{ + // Float16 features + VkPhysicalDeviceFloat16Int8FeaturesKHR float16Features = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR}; + // 16 bit storage features + VkPhysicalDevice16BitStorageFeatures storage16BitFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR}; + // AtomicInt64 features + VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomicInt64Features = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR}; + // Atomic Float features + VkPhysicalDeviceShaderAtomicFloatFeaturesEXT atomicFloatFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT}; + // Timeline Semaphore features + VkPhysicalDeviceTimelineSemaphoreFeatures timelineFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES}; + // Extended dynamic state features + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT}; + // Subgroup extended type features + VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures shaderSubgroupExtendedTypeFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES}; + // Acceleration structure features + VkPhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR}; + // Ray query (inline ray-tracing) features + VkPhysicalDeviceRayQueryFeaturesKHR rayQueryFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR}; + // Buffer device address features + VkPhysicalDeviceBufferDeviceAddressFeatures bufferDeviceAddressFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES}; + // Inline uniform block features + VkPhysicalDeviceInlineUniformBlockFeaturesEXT inlineUniformBlockFeatures = { + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES}; +}; + struct VulkanApi { VK_API_ALL_PROCS(VK_API_DECLARE_PROC) @@ -232,6 +270,7 @@ struct VulkanApi VkPhysicalDeviceProperties m_deviceProperties; VkPhysicalDeviceFeatures m_deviceFeatures; VkPhysicalDeviceMemoryProperties m_deviceMemoryProperties; + VulkanExtendedFeatureProperties m_extendedFeatures; }; } // renderer_test diff --git a/tools/gfx/vulkan/vk-descriptor-allocator.cpp b/tools/gfx/vulkan/vk-descriptor-allocator.cpp index c01e37642..d5e9b5863 100644 --- a/tools/gfx/vulkan/vk-descriptor-allocator.cpp +++ b/tools/gfx/vulkan/vk-descriptor-allocator.cpp @@ -6,23 +6,29 @@ namespace gfx VkDescriptorPool DescriptorSetAllocator::newPool() { VkDescriptorPoolCreateInfo descriptorPoolInfo = {VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO}; - VkDescriptorPoolSize poolSizes[] = { - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLER, 1024}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1024}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 4096}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1024}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 256}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 256}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4096}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 4096}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 4096}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 4096}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 16}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, 16}, - VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 256}}; + Slang::Array<VkDescriptorPoolSize, 32> poolSizes; + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLER, 1024}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1024}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 4096}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1024}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 256}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 256}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 4096}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 4096}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 4096}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 4096}); + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 16}); + if (m_api->m_extendedFeatures.inlineUniformBlockFeatures.inlineUniformBlock) + { + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, 16}); + } + if (m_api->m_extendedFeatures.accelerationStructureFeatures.accelerationStructure) + { + poolSizes.add(VkDescriptorPoolSize{VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, 256}); + } descriptorPoolInfo.maxSets = 4096; - descriptorPoolInfo.poolSizeCount = sizeof(poolSizes) / sizeof(VkDescriptorPoolSize); - descriptorPoolInfo.pPoolSizes = poolSizes; + descriptorPoolInfo.poolSizeCount = (uint32_t)poolSizes.getCount(); + descriptorPoolInfo.pPoolSizes = poolSizes.getBuffer(); descriptorPoolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; VkDescriptorPool descriptorPool = VK_NULL_HANDLE; diff --git a/tools/gfx/vulkan/vk-module.cpp b/tools/gfx/vulkan/vk-module.cpp index 4e92a3d2c..985df1a7b 100644 --- a/tools/gfx/vulkan/vk-module.cpp +++ b/tools/gfx/vulkan/vk-module.cpp @@ -1,4 +1,4 @@ -// module.cpp +// module.cpp #include "vk-module.h" #include <stdlib.h> @@ -37,6 +37,18 @@ Slang::Result VulkanModule::init() if (!m_module) { + dynamicLibraryName = "vk_swiftshader"; +#if SLANG_WINDOWS_FAMILY + HMODULE swiftShaderModule = ::LoadLibraryA(dynamicLibraryName); + m_module = (void*)swiftShaderModule; +#else + m_module = dlopen(dynamicLibraryName, RTLD_NOW); +#endif + m_isSoftware = true; + } + + if (!m_module) + { fprintf(stderr, "error: failed load '%s'\n", dynamicLibraryName); return SLANG_FAIL; } diff --git a/tools/gfx/vulkan/vk-module.h b/tools/gfx/vulkan/vk-module.h index 7ddd5da45..eb1b3d570 100644 --- a/tools/gfx/vulkan/vk-module.h +++ b/tools/gfx/vulkan/vk-module.h @@ -25,6 +25,9 @@ struct VulkanModule /// Get a function by name PFN_vkVoidFunction getFunction(const char* name) const; + /// true if using a software Vulkan implementation. + bool isSoftware() const { return m_isSoftware; } + /// Initialize Slang::Result init(); /// Destroy @@ -33,8 +36,9 @@ struct VulkanModule /// Dtor ~VulkanModule() { destroy(); } - protected: - void* m_module = nullptr; + protected: + void* m_module = nullptr; + bool m_isSoftware = false; }; } // renderer_test |
