yum-mirror/slang

Making it easier to work with shaders

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

Jay KwakCheck the available VK extensions before using CoopVec APIs in GFX (#6849)591affaf7

master
9.0 KiB236 linesraw
1// vk-device.h
2#pragma once
3
4#include "glslang-module.h"
5#include "vk-base.h"
6#include "vk-framebuffer.h"
7
8namespace gfx
9{
10
11using namespace Slang;
12
13namespace vk
14{
15
16class DeviceImpl : public RendererBase
17{
18public:
19    // Renderer    implementation
20    Result initVulkanInstanceAndDevice(const InteropHandle* handles, bool useValidationLayer);
21    virtual SLANG_NO_THROW Result SLANG_MCALL initialize(const Desc& desc) override;
22    virtual SLANG_NO_THROW Result SLANG_MCALL
23    getFormatSupportedResourceStates(Format format, ResourceStateSet* outStates) override;
24    virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap(
25        const ITransientResourceHeap::Desc& desc,
26        ITransientResourceHeap** outHeap) override;
27    virtual SLANG_NO_THROW Result SLANG_MCALL
28    createCommandQueue(const ICommandQueue::Desc& desc, ICommandQueue** outQueue) override;
29    virtual SLANG_NO_THROW Result SLANG_MCALL createSwapchain(
30        const ISwapchain::Desc& desc,
31        WindowHandle window,
32        ISwapchain** outSwapchain) override;
33    virtual SLANG_NO_THROW Result SLANG_MCALL createFramebufferLayout(
34        const IFramebufferLayout::Desc& desc,
35        IFramebufferLayout** outLayout) override;
36    virtual SLANG_NO_THROW Result SLANG_MCALL
37    createFramebuffer(const IFramebuffer::Desc& desc, IFramebuffer** outFramebuffer) override;
38    virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout(
39        const IRenderPassLayout::Desc& desc,
40        IRenderPassLayout** outRenderPassLayout) override;
41    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource(
42        const ITextureResource::Desc& desc,
43        const ITextureResource::SubresourceData* initData,
44        ITextureResource** outResource) override;
45    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource(
46        const IBufferResource::Desc& desc,
47        const void* initData,
48        IBufferResource** outResource) override;
49    SLANG_NO_THROW Result SLANG_MCALL createBufferResourceImpl(
50        const IBufferResource::Desc& desc,
51        VkBufferUsageFlags additionalUsageFlag,
52        const void* initData,
53        IBufferResource** outResource);
54    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle(
55        InteropHandle handle,
56        const IBufferResource::Desc& srcDesc,
57        IBufferResource** outResource) override;
58    virtual SLANG_NO_THROW Result SLANG_MCALL
59    createSamplerState(ISamplerState::Desc const& desc, ISamplerState** outSampler) override;
60
61    virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView(
62        ITextureResource* texture,
63        IResourceView::Desc const& desc,
64        IResourceView** outView) override;
65    virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView(
66        IBufferResource* buffer,
67        IBufferResource* counterBuffer,
68        IResourceView::Desc const& desc,
69        IResourceView** outView) override;
70
71    virtual SLANG_NO_THROW Result SLANG_MCALL
72    createInputLayout(IInputLayout::Desc const& desc, IInputLayout** outLayout) override;
73
74    virtual Result createShaderObjectLayout(
75        slang::ISession* session,
76        slang::TypeLayoutReflection* typeLayout,
77        ShaderObjectLayoutBase** outLayout) override;
78    virtual Result createShaderObject(ShaderObjectLayoutBase* layout, IShaderObject** outObject)
79        override;
80    virtual Result createMutableShaderObject(
81        ShaderObjectLayoutBase* layout,
82        IShaderObject** outObject) override;
83    virtual SLANG_NO_THROW Result SLANG_MCALL
84    createMutableRootShaderObject(IShaderProgram* program, IShaderObject** outObject) override;
85
86    virtual SLANG_NO_THROW Result SLANG_MCALL
87    createShaderTable(const IShaderTable::Desc& desc, IShaderTable** outShaderTable) override;
88    virtual SLANG_NO_THROW Result SLANG_MCALL createProgram(
89        const IShaderProgram::Desc& desc,
90        IShaderProgram** outProgram,
91        ISlangBlob** outDiagnosticBlob) override;
92    virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState(
93        const GraphicsPipelineStateDesc& desc,
94        IPipelineState** outState) override;
95    virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState(
96        const ComputePipelineStateDesc& desc,
97        IPipelineState** outState) override;
98    virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState(
99        const RayTracingPipelineStateDesc& desc,
100        IPipelineState** outState) override;
101    virtual SLANG_NO_THROW Result SLANG_MCALL
102    createQueryPool(const IQueryPool::Desc& desc, IQueryPool** outPool) override;
103
104    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource(
105        ITextureResource* texture,
106        ResourceState state,
107        ISlangBlob** outBlob,
108        Size* outRowPitch,
109        Size* outPixelSize) override;
110
111    virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource(
112        IBufferResource* buffer,
113        Offset offset,
114        Size size,
115        ISlangBlob** outBlob) override;
116
117    virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo(
118        const IAccelerationStructure::BuildInputs& buildInputs,
119        IAccelerationStructure::PrebuildInfo* outPrebuildInfo) override;
120
121    virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure(
122        const IAccelerationStructure::CreateDesc& desc,
123        IAccelerationStructure** outView) override;
124
125    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureAllocationInfo(
126        const ITextureResource::Desc& desc,
127        Size* outSize,
128        Size* outAlignment) override;
129
130    virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment(Size* outAlignment) override;
131
132    virtual SLANG_NO_THROW Result SLANG_MCALL getCooperativeVectorProperties(
133        CooperativeVectorProperties* properties,
134        uint32_t* propertyCount) override;
135
136    virtual SLANG_NO_THROW Result SLANG_MCALL
137    createFence(const IFence::Desc& desc, IFence** outFence) override;
138
139    virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences(
140        GfxCount fenceCount,
141        IFence** fences,
142        uint64_t* fenceValues,
143        bool waitForAll,
144        uint64_t timeout) override;
145
146    void waitForGpu();
147
148    virtual SLANG_NO_THROW const DeviceInfo& SLANG_MCALL getDeviceInfo() const override;
149
150    virtual SLANG_NO_THROW Result SLANG_MCALL
151    getNativeDeviceHandles(InteropHandles* outHandles) override;
152
153    ~DeviceImpl();
154
155public:
156    VkBool32 handleDebugMessage(
157        VkDebugReportFlagsEXT flags,
158        VkDebugReportObjectTypeEXT objType,
159        uint64_t srcObject,
160        Size location, // TODO: Is "location" still needed for this function?
161        int32_t msgCode,
162        const char* pLayerPrefix,
163        const char* pMsg);
164
165    static VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback(
166        VkDebugReportFlagsEXT flags,
167        VkDebugReportObjectTypeEXT objType,
168        uint64_t srcObject,
169        Size location, // TODO: Is "location" still needed? Calls handleDebugMessage() which doesn't
170                       // use it
171        int32_t msgCode,
172        const char* pLayerPrefix,
173        const char* pMsg,
174        void* pUserData);
175
176    void _transitionImageLayout(
177        VkImage image,
178        VkFormat format,
179        const TextureResource::Desc& desc,
180        VkImageLayout oldLayout,
181        VkImageLayout newLayout);
182    void _transitionImageLayout(
183        VkCommandBuffer commandBuffer,
184        VkImage image,
185        VkFormat format,
186        const TextureResource::Desc& desc,
187        VkImageLayout oldLayout,
188        VkImageLayout newLayout);
189
190    uint32_t getQueueFamilyIndex(ICommandQueue::QueueType queueType);
191
192public:
193    // DeviceImpl members.
194
195    DeviceInfo m_info;
196    String m_adapterName;
197
198    VkDebugReportCallbackEXT m_debugReportCallback = VK_NULL_HANDLE;
199
200    VkDevice m_device = VK_NULL_HANDLE;
201
202    VulkanModule m_module;
203    VulkanApi m_api;
204    GlslangModule m_glslang;
205
206    VulkanDeviceQueue m_deviceQueue;
207    uint32_t m_queueFamilyIndex;
208
209    Desc m_desc;
210
211    DescriptorSetAllocator descriptorSetAllocator;
212
213    uint32_t m_queueAllocCount;
214
215    // A list to hold objects that may have a strong back reference to the device
216    // instance. Because of the pipeline cache in `RendererBase`, there could be a reference
217    // cycle among `DeviceImpl`->`PipelineStateImpl`->`ShaderProgramImpl`->`DeviceImpl`.
218    // Depending on whether a `PipelineState` objects gets stored in pipeline cache, there
219    // may or may not be such a reference cycle.
220    // We need to hold strong references to any objects that may become part of the reference
221    // cycle here, so that when objects like `ShaderProgramImpl` lost all public refernces, we
222    // can always safely break the strong reference in `ShaderProgramImpl::m_device` without
223    // worrying the `ShaderProgramImpl` object getting destroyed after the completion of
224    // `DeviceImpl::~DeviceImpl()'.
225    ChunkedList<RefPtr<RefObject>, 1024> m_deviceObjectsWithPotentialBackReferences;
226
227    VkSampler m_defaultSampler;
228
229    RefPtr<FramebufferImpl> m_emptyFramebuffer;
230
231    // If true, slang will skip downstream linking, so we need to do it ourselves
232    bool m_skipsDownstreamLinking = false;
233};
234
235} // namespace vk
236} // namespace gfx