yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Gangzheng TongConvert gfx unit tests and examples to use slang-rhi (#7577)43d0c2100

master
3.1 KiB99 linesraw
1#include "core/slang-basic.h"
2#include "gfx-test-util.h"
3#include "slang-rhi.h"
4#include "slang-rhi/shader-cursor.h"
5#include "unit-test/slang-unit-test.h"
6
7#if SLANG_WINDOWS_FAMILY
8#include <d3d12.h>
9#endif
10
11using namespace rhi;
12
13namespace gfx_test
14{
15void getBufferHandleTestImpl(IDevice* device, UnitTestContext* context)
16{
17    // Create a command queue and encoder to get a command buffer
18    ComPtr<ICommandQueue> queue;
19    GFX_CHECK_CALL_ABORT(device->getQueue(QueueType::Graphics, queue.writeRef()));
20
21    ComPtr<ICommandEncoder> encoder;
22    GFX_CHECK_CALL_ABORT(queue->createCommandEncoder(encoder.writeRef()));
23
24    ComPtr<ICommandBuffer> commandBuffer;
25    GFX_CHECK_CALL_ABORT(encoder->finish(commandBuffer.writeRef()));
26
27    NativeHandle handle = {};
28    GFX_CHECK_CALL_ABORT(commandBuffer->getNativeHandle(&handle));
29    if (device->getInfo().deviceType == rhi::DeviceType::Vulkan)
30    {
31        SLANG_CHECK(handle.value != 0);
32    }
33#if SLANG_WINDOWS_FAMILY
34    else
35    {
36        auto d3d12Handle = (ID3D12GraphicsCommandList*)handle.value;
37        Slang::ComPtr<IUnknown> testHandle1;
38        GFX_CHECK_CALL_ABORT(d3d12Handle->QueryInterface<IUnknown>(testHandle1.writeRef()));
39        Slang::ComPtr<ID3D12GraphicsCommandList> testHandle2;
40        GFX_CHECK_CALL_ABORT(
41            d3d12Handle->QueryInterface<ID3D12GraphicsCommandList>(testHandle2.writeRef()));
42        SLANG_CHECK(d3d12Handle == testHandle2.get());
43    }
44#endif
45}
46
47void getBufferHandleTestAPI(UnitTestContext* context, Slang::RenderApiFlag::Enum api)
48{
49    if ((api & context->enabledApis) == 0)
50    {
51        SLANG_IGNORE_TEST;
52    }
53    Slang::ComPtr<IDevice> device;
54    DeviceDesc deviceDesc = {};
55    switch (api)
56    {
57    case Slang::RenderApiFlag::D3D11:
58        deviceDesc.deviceType = rhi::DeviceType::D3D11;
59        break;
60    case Slang::RenderApiFlag::D3D12:
61        deviceDesc.deviceType = rhi::DeviceType::D3D12;
62        break;
63    case Slang::RenderApiFlag::Vulkan:
64        deviceDesc.deviceType = rhi::DeviceType::Vulkan;
65        break;
66    default:
67        SLANG_IGNORE_TEST;
68    }
69    deviceDesc.slang.slangGlobalSession = context->slangGlobalSession;
70    const char* searchPaths[] = {"", "../../tools/gfx-unit-test", "tools/gfx-unit-test"};
71    deviceDesc.slang.searchPathCount = (SlangInt)SLANG_COUNT_OF(searchPaths);
72    deviceDesc.slang.searchPaths = searchPaths;
73    auto createDeviceResult = getRHI()->createDevice(deviceDesc, device.writeRef());
74    if (SLANG_FAILED(createDeviceResult))
75    {
76        SLANG_IGNORE_TEST;
77    }
78    // Ignore this test on swiftshader. Swiftshader seems to have a bug that causes the test
79    // to crash.
80    if (Slang::String(device->getInfo().adapterName).toLower().contains("swiftshader"))
81    {
82        SLANG_IGNORE_TEST;
83    }
84    getBufferHandleTestImpl(device, context);
85}
86
87#if SLANG_WINDOWS_FAMILY
88SLANG_UNIT_TEST(getCmdBufferHandleD3D12)
89{
90    return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::D3D12);
91}
92#endif
93
94SLANG_UNIT_TEST(getCmdBufferHandleVulkan)
95{
96    return getBufferHandleTestAPI(unitTestContext, Slang::RenderApiFlag::Vulkan);
97}
98
99} // namespace gfx_test