yum-mirror/slang

Making it easier to work with shaders

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

Ellie Hermaszewskaformatf65d756bf

master
3.0 KiB129 linesraw
1// cuda-helper-functions.cpp
2#include "cuda-helper-functions.h"
3
4#include "cuda-device.h"
5
6namespace gfx
7{
8#ifdef GFX_ENABLE_CUDA
9using namespace Slang;
10
11namespace cuda
12{
13SlangResult CUDAErrorInfo::handle() const
14{
15    StringBuilder builder;
16    builder << "Error: " << m_filePath << " (" << m_lineNo << ") :";
17
18    if (m_errorName)
19    {
20        builder << m_errorName << " : ";
21    }
22    if (m_errorString)
23    {
24        builder << m_errorString;
25    }
26
27    getDebugCallback()->handleMessage(
28        DebugMessageType::Error,
29        DebugMessageSource::Driver,
30        builder.getUnownedSlice().begin());
31
32    // Slang::signalUnexpectedError(builder.getBuffer());
33    return SLANG_FAIL;
34}
35
36SlangResult _handleCUDAError(CUresult cuResult, const char* file, int line)
37{
38    CUDAErrorInfo info(file, line);
39    cuGetErrorString(cuResult, &info.m_errorString);
40    cuGetErrorName(cuResult, &info.m_errorName);
41    return info.handle();
42}
43
44#ifdef RENDER_TEST_OPTIX
45
46static bool _isError(OptixResult result)
47{
48    return result != OPTIX_SUCCESS;
49}
50
51#if 1
52static SlangResult _handleOptixError(OptixResult result, char const* file, int line)
53{
54    fprintf(
55        stderr,
56        "%s(%d): optix: %s (%s)\n",
57        file,
58        line,
59        optixGetErrorString(result),
60        optixGetErrorName(result));
61    return SLANG_FAIL;
62}
63
64void _optixLogCallback(unsigned int level, const char* tag, const char* message, void* userData)
65{
66    fprintf(stderr, "optix: %s (%s)\n", message, tag);
67}
68#endif
69#endif
70
71AdapterLUID getAdapterLUID(int deviceIndex)
72{
73    CUdevice device;
74    cuDeviceGet(&device, deviceIndex);
75    AdapterLUID luid = {};
76    unsigned int deviceNodeMask;
77    cuDeviceGetLuid((char*)&luid, &deviceNodeMask, device);
78    return luid;
79}
80
81Result SLANG_MCALL getAdapters(List<AdapterInfo>& outAdapters)
82{
83    int deviceCount;
84    SLANG_CUDA_RETURN_ON_FAIL(cuDeviceGetCount(&deviceCount));
85    for (int deviceIndex = 0; deviceIndex < deviceCount; deviceIndex++)
86    {
87        CUdevice device;
88        SLANG_CUDA_RETURN_ON_FAIL(cuDeviceGet(&device, deviceIndex));
89
90        AdapterInfo info = {};
91        SLANG_CUDA_RETURN_ON_FAIL(cuDeviceGetName(info.name, sizeof(info.name), device));
92        info.luid = getAdapterLUID(deviceIndex);
93        outAdapters.add(info);
94    }
95
96    return SLANG_OK;
97}
98
99} // namespace cuda
100
101Result SLANG_MCALL getCUDAAdapters(List<AdapterInfo>& outAdapters)
102{
103    return cuda::getAdapters(outAdapters);
104}
105
106Result SLANG_MCALL createCUDADevice(const IDevice::Desc* desc, IDevice** outDevice)
107{
108    RefPtr<cuda::DeviceImpl> result = new cuda::DeviceImpl();
109    SLANG_RETURN_ON_FAIL(result->initialize(*desc));
110    returnComPtr(outDevice, result);
111    return SLANG_OK;
112}
113#else
114
115Result SLANG_MCALL getCUDAAdapters(List<AdapterInfo>& outAdapters)
116{
117    SLANG_UNUSED(outAdapters);
118    return SLANG_FAIL;
119}
120
121Result SLANG_MCALL createCUDADevice(const IDevice::Desc* desc, IDevice** outDevice)
122{
123    SLANG_UNUSED(desc);
124    *outDevice = nullptr;
125    return SLANG_FAIL;
126}
127#endif
128
129} // namespace gfx