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.7 KiB107 linesraw
1#if 0
2// Duplicated: This test is identical to slang-rhi\tests\test-mutable-shader-object.cpp
3// TODO: This test failed
4// The result buffer is still {0.0f, 1.0f, 2.0f, 3.0f}. Not incremented by the shader
5
6#include "core/slang-basic.h"
7#include "gfx-test-util.h"
8#include "unit-test/slang-unit-test.h"
9
10#include <slang-rhi.h>
11#include <slang-rhi/shader-cursor.h>
12
13using namespace rhi;
14
15namespace gfx_test
16{
17void mutableRootShaderObjectTestImpl(IDevice* device, UnitTestContext* context)
18{
19    ComPtr<IShaderProgram> shaderProgram;
20    slang::ProgramLayout* slangReflection;
21    GFX_CHECK_CALL_ABORT(loadComputeProgram(
22        device,
23        shaderProgram,
24        "mutable-shader-object",
25        "computeMain",
26        slangReflection));
27
28    ComputePipelineDesc pipelineDesc = {};
29    pipelineDesc.program = shaderProgram.get();
30    ComPtr<IComputePipeline> computePipeline;
31    GFX_CHECK_CALL_ABORT(
32        device->createComputePipeline(pipelineDesc, computePipeline.writeRef()));
33
34    float initialData[] = {0.0f, 1.0f, 2.0f, 3.0f};
35    const int numberCount = SLANG_COUNT_OF(initialData);
36    BufferDesc bufferDesc = {};
37    bufferDesc.size = sizeof(initialData);
38    bufferDesc.format = Format::Undefined;
39    bufferDesc.elementSize = sizeof(float);
40    bufferDesc.usage = BufferUsage::UnorderedAccess | BufferUsage::ShaderResource | BufferUsage::CopySource | BufferUsage::CopyDestination;
41    bufferDesc.defaultState = ResourceState::UnorderedAccess;
42    bufferDesc.memoryType = MemoryType::DeviceLocal;
43
44    ComPtr<IBuffer> numbersBuffer;
45    GFX_CHECK_CALL_ABORT(
46        device->createBuffer(bufferDesc, (void*)initialData, numbersBuffer.writeRef()));
47
48    ComPtr<IShaderObject> rootObject;
49    device->createRootShaderObject(shaderProgram, rootObject.writeRef());
50    auto entryPointCursor = ShaderCursor(rootObject->getEntryPoint(0));
51    entryPointCursor.getPath("buffer").setBinding(Binding(numbersBuffer));
52
53    slang::TypeReflection* addTransformerType = slangReflection->findTypeByName("AddTransformer");
54    ComPtr<IShaderObject> transformer;
55    GFX_CHECK_CALL_ABORT(device->createShaderObject(
56        addTransformerType,
57        ShaderObjectContainerType::None,
58        transformer.writeRef()));
59    entryPointCursor.getPath("transformer").setObject(transformer);
60
61    // Set the `c` field of the `AddTransformer`.
62    float c = 1.0f;
63    ShaderCursor(transformer).getPath("c").setData(&c, sizeof(float));
64
65    {
66        auto queue = device->getQueue(QueueType::Graphics);
67
68        auto commandEncoder = queue->createCommandEncoder();
69        {
70            auto encoder = commandEncoder->beginComputePass();
71            encoder->bindPipeline(computePipeline, rootObject);
72            encoder->dispatchCompute(1, 1, 1);
73            encoder->end();
74        }
75
76        // Set buffer state to ensure writes are visible
77        commandEncoder->setBufferState(numbersBuffer, ResourceState::UnorderedAccess);
78
79        // Mutate `transformer` object and run again.
80        c = 2.0f;
81        ShaderCursor(transformer).getPath("c").setData(&c, sizeof(float));
82        {
83            auto encoder = commandEncoder->beginComputePass();
84            encoder->bindPipeline(computePipeline, rootObject);
85            encoder->dispatchCompute(1, 1, 1);
86            encoder->end();
87        }
88
89        queue->submit(commandEncoder->finish());
90        queue->waitOnHost();
91    }
92
93    compareComputeResult(device, numbersBuffer, std::array{3.0f, 4.0f, 5.0f, 6.0f});
94}
95
96SLANG_UNIT_TEST(mutableRootShaderObjectD3D12)
97{
98    runTestImpl(mutableRootShaderObjectTestImpl, unitTestContext, DeviceType::D3D12, {});
99}
100
101/*SLANG_UNIT_TEST(mutableRootShaderObjectVulkan)
102{
103    runTestImpl(mutableRootShaderObjectTestImpl, unitTestContext, DeviceType::Vulkan, {});
104}*/
105} // namespace gfx_test
106
107#endif