yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1// metal-device.h 2#pragma once 3 4#include "../simple-transient-resource-heap.h" 5#include "metal-base.h" 6#include "metal-device.h" 7#include "metal-framebuffer.h" 8 9namespace gfx 10{ 11 12using namespace Slang ; 13 14namespace metal 15{ 16 17class DeviceImpl :public RendererBase 18{ 19public : 20// Renderer implementation 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 ; 49virtual SLANG_NO_THROW Result SLANG_MCALL createBufferFromNativeHandle ( 50InteropHandle handle , 51const IBufferResource ::Desc & srcDesc , 52IBufferResource ** outResource )override ; 53virtual SLANG_NO_THROW Result SLANG_MCALL 54createSamplerState (ISamplerState ::Desc const & desc ,ISamplerState ** outSampler )override ; 55 56virtual SLANG_NO_THROW Result SLANG_MCALL createTextureView ( 57ITextureResource * texture , 58IResourceView ::Desc const & desc , 59IResourceView ** outView )override ; 60virtual SLANG_NO_THROW Result SLANG_MCALL createBufferView ( 61IBufferResource * buffer , 62IBufferResource * counterBuffer , 63IResourceView ::Desc const & desc , 64IResourceView ** outView )override ; 65 66virtual SLANG_NO_THROW Result SLANG_MCALL 67createInputLayout (IInputLayout ::Desc const & desc ,IInputLayout ** outLayout )override ; 68 69virtual Result createShaderObjectLayout ( 70slang ::ISession * session , 71slang ::TypeLayoutReflection * typeLayout , 72ShaderObjectLayoutBase ** outLayout )override ; 73virtual Result createShaderObject (ShaderObjectLayoutBase * layout ,IShaderObject ** outObject ) 74override ; 75virtual Result createMutableShaderObject ( 76ShaderObjectLayoutBase * layout , 77IShaderObject ** outObject )override ; 78virtual SLANG_NO_THROW Result SLANG_MCALL 79createMutableRootShaderObject (IShaderProgram * program ,IShaderObject ** outObject )override ; 80 81virtual SLANG_NO_THROW Result SLANG_MCALL 82createShaderTable (const IShaderTable ::Desc & desc ,IShaderTable ** outShaderTable )override ; 83virtual SLANG_NO_THROW Result SLANG_MCALL createProgram ( 84const IShaderProgram ::Desc & desc , 85IShaderProgram ** outProgram , 86ISlangBlob ** outDiagnosticBlob )override ; 87virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState ( 88const GraphicsPipelineStateDesc & desc , 89IPipelineState ** outState )override ; 90virtual SLANG_NO_THROW Result SLANG_MCALL createComputePipelineState ( 91const ComputePipelineStateDesc & desc , 92IPipelineState ** outState )override ; 93virtual SLANG_NO_THROW Result SLANG_MCALL createRayTracingPipelineState ( 94const RayTracingPipelineStateDesc & desc , 95IPipelineState ** outState )override ; 96virtual SLANG_NO_THROW Result SLANG_MCALL 97createQueryPool (const IQueryPool ::Desc & desc ,IQueryPool ** outPool )override ; 98 99virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource ( 100ITextureResource * texture , 101ResourceState state , 102ISlangBlob ** outBlob , 103Size * outRowPitch , 104Size * outPixelSize )override ; 105 106virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource ( 107IBufferResource * buffer , 108Offset offset , 109Size size , 110ISlangBlob ** outBlob )override ; 111 112virtual SLANG_NO_THROW Result SLANG_MCALL getAccelerationStructurePrebuildInfo ( 113const IAccelerationStructure ::BuildInputs & buildInputs , 114IAccelerationStructure ::PrebuildInfo * outPrebuildInfo )override ; 115 116virtual SLANG_NO_THROW Result SLANG_MCALL createAccelerationStructure ( 117const IAccelerationStructure ::CreateDesc & desc , 118IAccelerationStructure ** outView )override ; 119 120virtual SLANG_NO_THROW Result SLANG_MCALL getTextureAllocationInfo ( 121const ITextureResource ::Desc & desc , 122Size * outSize , 123Size * outAlignment )override ; 124 125virtual SLANG_NO_THROW Result SLANG_MCALL getTextureRowAlignment (Size * outAlignment )override ; 126 127virtual SLANG_NO_THROW Result SLANG_MCALL 128createFence (const IFence ::Desc & desc ,IFence ** outFence )override ; 129 130virtual SLANG_NO_THROW Result SLANG_MCALL waitForFences ( 131GfxCount fenceCount , 132IFence ** fences , 133uint64_t * fenceValues , 134bool waitForAll , 135uint64_t timeout )override ; 136 137// void waitForGpu(); 138virtual SLANG_NO_THROW const DeviceInfo & SLANG_MCALL getDeviceInfo ()const override ; 139virtual SLANG_NO_THROW Result SLANG_MCALL 140getNativeDeviceHandles (InteropHandles * outHandles )override ; 141 ~DeviceImpl (); 142 143public : 144DeviceInfo m_info ; 145String m_adapterName ; 146 147bool captureEnabled ()const {return std ::getenv ("MTL_CAPTURE ")!= nullptr; } 148 149Desc m_desc ; 150NS ::SharedPtr < MTL ::Device > m_device ; 151NS ::SharedPtr < MTL ::CommandQueue > m_commandQueue ; 152 153uint32_t m_queueAllocCount ; 154 155bool m_hasArgumentBufferTier2 = false; 156 157// A list to hold objects that may have a strong back reference to the device 158// instance. Because of the pipeline cache in `RendererBase`, there could be a reference 159// cycle among `DeviceImpl`->`PipelineStateImpl`->`ShaderProgramImpl`->`DeviceImpl`. 160// Depending on whether a `PipelineState` objects gets stored in pipeline cache, there 161// may or may not be such a reference cycle. 162// We need to hold strong references to any objects that may become part of the reference 163// cycle here, so that when objects like `ShaderProgramImpl` lost all public refernces, we 164// can always safely break the strong reference in `ShaderProgramImpl::m_device` without 165// worrying the `ShaderProgramImpl` object getting destroyed after the completion of 166// `DeviceImpl::~DeviceImpl()'. 167ChunkedList < RefPtr < RefObject > ,1024 > m_deviceObjectsWithPotentialBackReferences ; 168}; 169 170}// namespace metal 171}// namespace gfx