yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
f65d756bf
master
1// immediate-renderer-base.h 2#pragma once 3 4// Provides shared implementation of public API objects for targets with 5// an immediate mode execution context. 6 7#include "renderer-shared.h" 8 9namespace gfx 10{ 11 12enum class MapFlavor 13{ 14Unknown ,///< Unknown mapping type 15HostRead , 16HostWrite , 17WriteDiscard , 18}; 19 20class ImmediateCommandQueueBase :public ICommandQueue ,public Slang ::ComObject 21{ 22public : 23// Immediate device also holds a strong reference to an instance of `ImmediateCommandQueue`, 24// forming a cyclic reference. Therefore we need a free-op here to break the cycle when 25// the public reference count of the queue drops to 0. 26SLANG_COM_OBJECT_IUNKNOWN_ALL 27ICommandQueue * getInterface (const Slang ::Guid & guid ) 28 { 29if (guid == GfxGUID ::IID_ISlangUnknown || guid == GfxGUID ::IID_ICommandQueue ) 30return static_cast < ICommandQueue *> (this ); 31return nullptr ; 32 } 33virtual void comFree ()override {breakStrongReferenceToDevice (); } 34 35public : 36BreakableReference < RendererBase > m_renderer ; 37void breakStrongReferenceToDevice () {m_renderer .breakStrongReference (); } 38void establishStrongReferenceToDevice () {m_renderer .establishStrongReference (); } 39}; 40 41struct CommandBufferInfo 42{ 43bool hasWriteTimestamps ; 44}; 45 46class ImmediateRendererBase :public RendererBase 47{ 48public : 49// Immediate commands to be implemented by each target. 50virtual Result createRootShaderObject ( 51IShaderProgram * program , 52ShaderObjectBase ** outObject )= 0 ; 53virtual void bindRootShaderObject (IShaderObject * rootObject )= 0 ; 54virtual void setPipelineState (IPipelineState * state )= 0 ; 55virtual void setFramebuffer (IFramebuffer * frameBuffer )= 0 ; 56virtual void clearFrame (uint32_t colorBufferMask ,bool clearDepth ,bool clearStencil )= 0 ; 57virtual void setViewports (GfxCount count ,const Viewport * viewports )= 0 ; 58virtual void setScissorRects (GfxCount count ,const ScissorRect * scissors )= 0 ; 59virtual void setPrimitiveTopology (PrimitiveTopology topology )= 0 ; 60virtual void setVertexBuffers ( 61GfxIndex startSlot , 62GfxCount slotCount , 63IBufferResource * const * buffers , 64const Offset * offsets )= 0 ; 65virtual void setIndexBuffer (IBufferResource * buffer ,Format indexFormat ,Offset offset = 0 )= 0 ; 66virtual void draw (GfxCount vertexCount ,GfxIndex startVertex = 0 )= 0 ; 67virtual void drawIndexed ( 68GfxCount indexCount , 69GfxIndex startIndex = 0 , 70GfxIndex baseVertex = 0 )= 0 ; 71virtual void drawInstanced ( 72GfxCount vertexCount , 73GfxCount instanceCount , 74GfxIndex startVertex , 75GfxIndex startInstanceLocation )= 0 ; 76virtual void drawIndexedInstanced ( 77GfxCount indexCount , 78GfxCount instanceCount , 79GfxIndex startIndexLocation , 80GfxIndex baseVertexLocation , 81GfxIndex startInstanceLocation )= 0 ; 82virtual void setStencilReference (uint32_t referenceValue )= 0 ; 83virtual void dispatchCompute (int x ,int y ,int z )= 0 ; 84virtual void copyBuffer ( 85IBufferResource * dst , 86Offset dstOffset , 87IBufferResource * src , 88Offset srcOffset , 89Size size )= 0 ; 90virtual void submitGpuWork ()= 0 ; 91virtual void waitForGpu ()= 0 ; 92virtual void * map (IBufferResource * buffer ,MapFlavor flavor )= 0 ; 93virtual void unmap (IBufferResource * buffer ,size_t offsetWritten ,size_t sizeWritten )= 0 ; 94virtual void writeTimestamp (IQueryPool * pool ,GfxIndex index )= 0 ; 95virtual void beginCommandBuffer (const CommandBufferInfo & ) {} 96virtual void endCommandBuffer (const CommandBufferInfo & ) {} 97 98public : 99Slang ::RefPtr < ImmediateCommandQueueBase > m_queue ; 100uint32_t m_queueCreateCount = 0 ; 101 102ImmediateRendererBase (); 103 104virtual SLANG_NO_THROW Result SLANG_MCALL 105createCommandQueue (const ICommandQueue ::Desc & desc ,ICommandQueue ** outQueue )override ; 106virtual SLANG_NO_THROW Result SLANG_MCALL createTransientResourceHeap ( 107const ITransientResourceHeap ::Desc & desc , 108ITransientResourceHeap ** outHeap )override ; 109virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout ( 110const IRenderPassLayout ::Desc & desc , 111IRenderPassLayout ** outRenderPassLayout )override ; 112 113void uploadBufferData (IBufferResource * dst ,Offset offset ,Size size ,void * data ); 114 115virtual SLANG_NO_THROW SlangResult SLANG_MCALL readBufferResource ( 116IBufferResource * buffer , 117Offset offset , 118Size size , 119ISlangBlob ** outBlob )override ; 120}; 121 122class ImmediateComputeDeviceBase :public ImmediateRendererBase 123{ 124public : 125// Provide empty implementation for devices without graphics support. 126virtual void setFramebuffer (IFramebuffer * frameBuffer )override {SLANG_UNUSED (frameBuffer ); } 127virtual void clearFrame (uint32_t colorBufferMask ,bool clearDepth ,bool clearStencil )override 128 { 129SLANG_UNUSED (colorBufferMask ); 130SLANG_UNUSED (clearDepth ); 131SLANG_UNUSED (clearStencil ); 132 } 133virtual void setViewports (GfxCount count ,const Viewport * viewports )override 134 { 135SLANG_UNUSED (count ); 136SLANG_UNUSED (viewports ); 137 } 138virtual void setScissorRects (GfxCount count ,const ScissorRect * scissors )override 139 { 140SLANG_UNUSED (count ); 141SLANG_UNUSED (scissors ); 142 } 143virtual void setPrimitiveTopology (PrimitiveTopology topology )override 144 { 145SLANG_UNUSED (topology ); 146 } 147virtual void setVertexBuffers ( 148GfxIndex startSlot , 149GfxCount slotCount , 150IBufferResource * const * buffers , 151const Offset * offsets )override 152 { 153SLANG_UNUSED (startSlot ); 154SLANG_UNUSED (slotCount ); 155SLANG_UNUSED (buffers ); 156SLANG_UNUSED (offsets ); 157 } 158virtual void setIndexBuffer (IBufferResource * buffer ,Format indexFormat ,Offset offset = 0 ) 159override 160 { 161SLANG_UNUSED (buffer ); 162SLANG_UNUSED (indexFormat ); 163SLANG_UNUSED (offset ); 164 } 165virtual void draw (GfxCount vertexCount ,GfxIndex startVertex = 0 )override 166 { 167SLANG_UNUSED (vertexCount ); 168SLANG_UNUSED (startVertex ); 169 } 170virtual void drawIndexed (GfxCount indexCount ,GfxIndex startIndex = 0 ,GfxIndex baseVertex = 0 ) 171override 172 { 173SLANG_UNUSED (indexCount ); 174SLANG_UNUSED (startIndex ); 175SLANG_UNUSED (baseVertex ); 176 } 177virtual void drawInstanced ( 178GfxCount vertexCount , 179GfxCount instanceCount , 180GfxIndex startVertex , 181GfxIndex startInstanceLocation )override 182 { 183SLANG_UNUSED (vertexCount ); 184SLANG_UNUSED (instanceCount ); 185SLANG_UNUSED (startVertex ); 186SLANG_UNUSED (startInstanceLocation ); 187 } 188 189virtual void drawIndexedInstanced ( 190GfxCount indexCount , 191GfxCount instanceCount , 192GfxIndex startIndexLocation , 193GfxIndex baseVertexLocation , 194GfxIndex startInstanceLocation )override 195 { 196SLANG_UNUSED (indexCount ); 197SLANG_UNUSED (instanceCount ); 198SLANG_UNUSED (startIndexLocation ); 199SLANG_UNUSED (baseVertexLocation ); 200SLANG_UNUSED (startInstanceLocation ); 201 } 202virtual void setStencilReference (uint32_t referenceValue )override 203 { 204SLANG_UNUSED (referenceValue ); 205 } 206 207virtual SLANG_NO_THROW Result SLANG_MCALL createSwapchain ( 208const ISwapchain ::Desc & desc , 209WindowHandle window , 210ISwapchain ** outSwapchain )override 211 { 212SLANG_UNUSED (desc ); 213SLANG_UNUSED (window ); 214SLANG_UNUSED (outSwapchain ); 215return SLANG_FAIL ; 216 } 217virtual SLANG_NO_THROW Result SLANG_MCALL createFramebufferLayout ( 218const IFramebufferLayout ::Desc & desc , 219IFramebufferLayout ** outLayout )override 220 { 221SLANG_UNUSED (desc ); 222SLANG_UNUSED (outLayout ); 223return SLANG_FAIL ; 224 } 225virtual SLANG_NO_THROW Result SLANG_MCALL 226createFramebuffer (const IFramebuffer ::Desc & desc ,IFramebuffer ** outFramebuffer )override 227 { 228SLANG_UNUSED (desc ); 229SLANG_UNUSED (outFramebuffer ); 230return SLANG_FAIL ; 231 } 232virtual SLANG_NO_THROW Result SLANG_MCALL createRenderPassLayout ( 233const IRenderPassLayout ::Desc & desc , 234IRenderPassLayout ** outRenderPassLayout )override 235 { 236SLANG_UNUSED (desc ); 237SLANG_UNUSED (outRenderPassLayout ); 238return SLANG_FAIL ; 239 } 240 241virtual SLANG_NO_THROW Result SLANG_MCALL 242createInputLayout (IInputLayout ::Desc const & desc ,IInputLayout ** outLayout )override 243 { 244SLANG_UNUSED (desc ); 245SLANG_UNUSED (outLayout ); 246return SLANG_E_NOT_AVAILABLE ; 247 } 248virtual SLANG_NO_THROW Result SLANG_MCALL createGraphicsPipelineState ( 249const GraphicsPipelineStateDesc & desc , 250IPipelineState ** outState )override 251 { 252SLANG_UNUSED (desc ); 253SLANG_UNUSED (outState ); 254return SLANG_E_NOT_AVAILABLE ; 255 } 256virtual SLANG_NO_THROW SlangResult SLANG_MCALL readTextureResource ( 257ITextureResource * texture , 258ResourceState state , 259ISlangBlob ** outBlob , 260Size * outRowPitch , 261Size * outPixelSize )override 262 { 263SLANG_UNUSED (texture ); 264SLANG_UNUSED (outBlob ); 265SLANG_UNUSED (outRowPitch ); 266SLANG_UNUSED (outPixelSize ); 267 268return SLANG_E_NOT_AVAILABLE ; 269 } 270}; 271}// namespace gfx