yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
591affaf7
master
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 20Result initVulkanInstanceAndDevice (const InteropHandle * handles ,bool useValidationLayer ); 21virtual SLANG_NO_THROW Result SLANG_MCALL initialize (const Desc & desc )override ; 22virtual SLANG_NO_THROW Result SLANG_MCALL 23getFormatSupportedResourceStates (Format format ,ResourceStateSet * outStates )override ; 24virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap ( 25const ITransientResourceHeap ::Desc & desc , 26ITransientResourceHeap ** outHeap )override ; 27virtual SLANG_NO_THROW Result SLANG_MCALL 28createCommandQueue (const ICommandQueue ::Desc & desc ,ICommandQueue ** outQueue )override ; 29virtual SLANG_NO_THROW Result SLANG_MCALL createSwapchain ( 30const ISwapchain ::Desc & desc , 31WindowHandle window , 32ISwapchain ** outSwapchain )override ; 33virtual SLANG_NO_THROW Result SLANG_MCALL createFramebufferLayout ( 34const IFramebufferLayout ::Desc & desc , 35IFramebufferLayout ** outLayout )override ; 36virtual SLANG_NO_THROW Result SLANG_MCALL 37createFramebuffer (const IFramebuffer ::Desc & desc ,IFramebuffer ** outFramebuffer )override ; 38virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout ( 39const IRenderPassLayout ::Desc & desc , 40IRenderPassLayout ** outRenderPassLayout )override ; 41virtual SLANG_NO_THROW Result SLANG_MCALL createTextureResource ( 42const ITextureResource ::Desc & desc , 43const ITextureResource ::SubresourceData * initData , 44ITextureResource ** outResource )override ; 45virtual SLANG_NO_THROW Result SLANG_MCALL createBufferResource ( 46const IBufferResource ::Desc & desc , 47const void * initData , 48IBufferResource ** outResource )override ; 49SLANG_NO_THROW Result SLANG_MCALL createBufferResourceImpl ( 50const IBufferResource ::Desc & desc , 51VkBufferUsageFlags additionalUsageFlag , 52const void * initData , 53IBufferResource ** outResource ); 54virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle ( 55InteropHandle handle , 56const IBufferResource ::Desc & srcDesc , 57IBufferResource ** outResource )override ; 58virtual SLANG_NO_THROW Result SLANG_MCALL 59createSamplerState (ISamplerState ::Desc const & desc ,ISamplerState ** outSampler )override ; 60 61virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView ( 62ITextureResource * texture , 63IResourceView ::Desc const & desc , 64IResourceView ** outView )override ; 65virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView ( 66IBufferResource * buffer , 67IBufferResource * counterBuffer , 68IResourceView ::Desc const & desc , 69IResourceView ** outView )override ; 70 71virtual SLANG_NO_THROW Result SLANG_MCALL 72createInputLayout (IInputLayout ::Desc const & desc ,IInputLayout ** outLayout )override ; 73 74virtual Result createShaderObjectLayout ( 75slang ::ISession * session , 76slang ::TypeLayoutReflection * typeLayout , 77ShaderObjectLayoutBase ** outLayout )override ; 78virtual Result createShaderObject (ShaderObjectLayoutBase * layout ,IShaderObject ** outObject ) 79override ; 80virtual Result createMutableShaderObject ( 81ShaderObjectLayoutBase * layout , 82IShaderObject ** outObject )override ; 83virtual SLANG_NO_THROW Result SLANG_MCALL 84createMutableRootShaderObject (IShaderProgram * program ,IShaderObject ** outObject )override ; 85 86virtual SLANG_NO_THROW Result SLANG_MCALL 87createShaderTable (const IShaderTable ::Desc & desc ,IShaderTable ** outShaderTable )override ; 88virtual SLANG_NO_THROW Result SLANG_MCALL createProgram ( 89const IShaderProgram ::Desc & desc , 90IShaderProgram ** outProgram , 91ISlangBlob ** outDiagnosticBlob )override ; 92virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState ( 93const GraphicsPipelineStateDesc & desc , 94IPipelineState ** outState )override ; 95virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState ( 96const ComputePipelineStateDesc & desc , 97IPipelineState ** outState )override ; 98virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState ( 99const RayTracingPipelineStateDesc & desc , 100IPipelineState ** outState )override ; 101virtual SLANG_NO_THROW Result SLANG_MCALL 102createQueryPool (const IQueryPool ::Desc & desc ,IQueryPool ** outPool )override ; 103 104virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource ( 105ITextureResource * texture , 106ResourceState state , 107ISlangBlob ** outBlob , 108Size * outRowPitch , 109Size * outPixelSize )override ; 110 111virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource ( 112IBufferResource * buffer , 113Offset offset , 114Size size , 115ISlangBlob ** outBlob )override ; 116 117virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo ( 118const IAccelerationStructure ::BuildInputs & buildInputs , 119IAccelerationStructure ::PrebuildInfo * outPrebuildInfo )override ; 120 121virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure ( 122const IAccelerationStructure ::CreateDesc & desc , 123IAccelerationStructure ** outView )override ; 124 125virtual SLANG_NO_THROW Result SLANG_MCALL getTextureAllocationInfo ( 126const ITextureResource ::Desc & desc , 127Size * outSize , 128Size * outAlignment )override ; 129 130virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment (Size * outAlignment )override ; 131 132virtual SLANG_NO_THROW Result SLANG_MCALL getCooperativeVectorProperties ( 133CooperativeVectorProperties * properties , 134uint32_t * propertyCount )override ; 135 136virtual SLANG_NO_THROW Result SLANG_MCALL 137createFence (const IFence ::Desc & desc ,IFence ** outFence )override ; 138 139virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences ( 140GfxCount fenceCount , 141IFence ** fences , 142uint64_t * fenceValues , 143bool waitForAll , 144uint64_t timeout )override ; 145 146void waitForGpu (); 147 148virtual SLANG_NO_THROW const DeviceInfo & SLANG_MCALL getDeviceInfo ()const override ; 149 150virtual SLANG_NO_THROW Result SLANG_MCALL 151getNativeDeviceHandles ( InteropHandles * outHandles) override; 152 153~ DeviceImpl (); 154 155public : 156VkBool32 handleDebugMessage ( 157VkDebugReportFlagsEXT flags, 158VkDebugReportObjectTypeEXT objType, 159uint64_t srcObject, 160Size location, // TODO: Is "location" still needed for this function? 161int32_t msgCode, 162const char * pLayerPrefix, 163const char * pMsg); 164 165static VKAPI_ATTR VkBool32 VKAPI_CALL debugMessageCallback ( 166VkDebugReportFlagsEXT flags, 167VkDebugReportObjectTypeEXT objType, 168uint64_t srcObject, 169Size location, // TODO: Is "location" still needed? Calls handleDebugMessage() which doesn't 170// use it 171int32_t msgCode, 172const char * pLayerPrefix, 173const char * pMsg, 174void * pUserData); 175 176void _transitionImageLayout ( 177VkImage image, 178VkFormat format, 179const TextureResource ::Desc & desc, 180VkImageLayout oldLayout, 181VkImageLayout newLayout); 182void _transitionImageLayout ( 183VkCommandBuffer commandBuffer, 184VkImage image, 185VkFormat format, 186const TextureResource ::Desc & desc, 187VkImageLayout oldLayout, 188VkImageLayout newLayout); 189 190uint32_t getQueueFamilyIndex ( ICommandQueue ::QueueType queueType); 191 192public : 193// DeviceImpl members. 194 195DeviceInfo m_info; 196String m_adapterName; 197 198VkDebugReportCallbackEXT m_debugReportCallback = VK_NULL_HANDLE ; 199 200VkDevice m_device = VK_NULL_HANDLE ; 201 202VulkanModule m_module; 203VulkanApi m_api; 204GlslangModule m_glslang; 205 206VulkanDeviceQueue m_deviceQueue; 207uint32_t m_queueFamilyIndex; 208 209Desc m_desc; 210 211DescriptorSetAllocator descriptorSetAllocator; 212 213uint32_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()'. 225ChunkedList < RefPtr < RefObject > , 1024 > m_deviceObjectsWithPotentialBackReferences; 226 227VkSampler m_defaultSampler; 228 229RefPtr < FramebufferImpl > m_emptyFramebuffer; 230 231// If true, slang will skip downstream linking, so we need to do it ourselves 232bool m_skipsDownstreamLinking = false; 233}; 234 235} // namespace vk 236} // namespace gfx