#ifndef MATERIAL_SYSTEM_H #define MATERIAL_SYSTEM_H #include "tier0/platform.h" #include "tier2/iappsystem.h" class IGameWindow; class IGameWindowManager; #define VULKAN_FRAMES_IN_FLIGHT 2 enum EImageFormat { IMAGE_FORMAT_R8_UINT, IMAGE_FORMAT_RGB8_UINT, IMAGE_FORMAT_RGB8_SINT, IMAGE_FORMAT_RGB8_UNORM, IMAGE_FORMAT_RGB8_SNORM, IMAGE_FORMAT_RGB8_SFLOAT, IMAGE_FORMAT_RGB16_UINT, IMAGE_FORMAT_RGB16_SINT, IMAGE_FORMAT_RGB16_UNORM, IMAGE_FORMAT_RGB16_SNORM, IMAGE_FORMAT_RGB16_SFLOAT, IMAGE_FORMAT_RGB32_SFLOAT, IMAGE_FORMAT_RGBA8_UNORM, IMAGE_FORMAT_BGRA8_UNORM, IMAGE_FORMAT_RGBA8_UINT, IMAGE_FORMAT_RGBA8_SINT, IMAGE_FORMAT_RGBA16_UINT, IMAGE_FORMAT_RGBA16_SINT, IMAGE_FORMAT_RGBA16_UNORM, IMAGE_FORMAT_RGBA16_SNORM, IMAGE_FORMAT_RGBA16_SFLOAT, IMAGE_FORMAT_RGBA32_SFLOAT, IMAGE_FORMAT_BC1, IMAGE_FORMAT_BC2, IMAGE_FORMAT_BC3, IMAGE_FORMAT_BC4, IMAGE_FORMAT_BC5, IMAGE_FORMAT_BC6, IMAGE_FORMAT_BC7, IMAGE_FORMAT_D32_SFLOAT, IMAGE_FORMAT_WINDOW, }; enum EVertexFormat { VERTEX_FORMAT_X32_SFLOAT, VERTEX_FORMAT_XY32_SFLOAT, VERTEX_FORMAT_XYZ32_SFLOAT, VERTEX_FORMAT_XYZW32_SFLOAT, }; enum EIndexFormat { INDEX_FORMAT_USHORT, INDEX_FORMAT_UINT, }; enum EImageType { IMAGE_TYPE_1D, IMAGE_TYPE_2D, IMAGE_TYPE_3D, IMAGE_TYPE_CUBE, IMAGE_TYPE_1D_ARRAY, IMAGE_TYPE_2D_ARRAY, IMAGE_TYPE_CUBE_ARRAY, }; enum EMultisampleType { MULTISAMPLE_TYPE_NONE, MULTISAMPLE_TYPE_1_SAMPLES = MULTISAMPLE_TYPE_NONE, MULTISAMPLE_TYPE_2_SAMPLES, MULTISAMPLE_TYPE_4_SAMPLES, MULTISAMPLE_TYPE_8_SAMPLES, }; enum EResolveMode { RESOLVE_MODE_NONE, RESOLVE_MODE_ZERO, RESOLVE_MODE_AVERAGE, RESOLVE_MODE_MIN, RESOLVE_MODE_MAX, }; enum ELoadMode { LOAD_MODE_LOAD, LOAD_MODE_CLEAR, LOAD_MODE_DONT_CARE, }; enum EStoreMode { STORE_MODE_STORE, STORE_MODE_DONT_CARE, }; enum ETopologyMode { TOPOLOGY_MODE_POINT_LIST, TOPOLOGY_MODE_LINE_LIST, TOPOLOGY_MODE_LINE_STRIP, TOPOLOGY_MODE_TRIANGLE_LIST, TOPOLOGY_MODE_TRIANGLE_STRIP, }; //----------------------------------------------------------------------------- // Basic rendering object //----------------------------------------------------------------------------- abstract_class IRenderingObject { public: virtual ~IRenderingObject() = default; virtual void SetDebugName( const char *szName ) = 0; }; //----------------------------------------------------------------------------- // Buffer object //----------------------------------------------------------------------------- abstract_class IBuffer : public IRenderingObject { public: virtual ~IBuffer() = default; virtual void Lock() = 0; virtual void Unlock() = 0; virtual void *Map() = 0; virtual void Unmap() = 0; virtual uint32_t GetSize() = 0; }; typedef IBuffer IVertexBuffer; typedef IBuffer IIndexBuffer; //----------------------------------------------------------------------------- // Image object //----------------------------------------------------------------------------- abstract_class IImage : public IRenderingObject { public: virtual uint32_t GetImageWidth() = 0; virtual uint32_t GetImageHeight() = 0; virtual EImageFormat GetImageFormat() = 0; virtual EMultisampleType GetMultisampleType() = 0; }; abstract_class ITextureArray: public IRenderingObject { public: virtual void Build() = 0; virtual uint32_t LoadTexture( const char *szPath ) = 0; virtual uint32_t GetTextureID( const char *szPath ) = 0; virtual void UnloadTexture( uint32_t uTextureID ) = 0; }; //----------------------------------------------------------------------------- // Shader object //----------------------------------------------------------------------------- abstract_class IShader { public: virtual ~IShader() = default; virtual uint32_t PSGetResourceByName( const char *szName ) = 0; virtual uint32_t VSGetResourceByName( const char *szName ) = 0; virtual void AddLayout( int iIndex, int iStride ) = 0; virtual void AddAttribute( int iBufferIndex, int iLocation, EVertexFormat eFormat, int iOffset ) = 0; virtual void SetTopology( ETopologyMode eTopology ) = 0; virtual void AddOutputImage( int iImageIndex, EImageFormat eFormat ) = 0; virtual void SetDepthImage( EImageFormat eFormat ) = 0; virtual void SetMultisampling( EMultisampleType eFormat ) = 0; virtual void DisablePixelShader( bool bDisable) = 0; virtual void Build() = 0; }; //----------------------------------------------------------------------------- // Material handle // It allows to specify resources in shaders such as textures, buffers etc. // // Resources must be updated prior to the frame //----------------------------------------------------------------------------- abstract_class IMaterial { public: virtual ~IMaterial() = default; virtual void VSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0; virtual void PSSetShaderResource( uint32_t uRegister, IRenderingObject *pResource ) = 0; virtual void VSSetConstantsBuffer( uint32_t uRegister, IBuffer *pImage ) = 0; virtual void PSSetConstantsBuffer( uint32_t uRegister, IBuffer *pImage ) = 0; virtual void PSSetTextureArray( uint32_t uSet, ITextureArray *pArray ) = 0; }; abstract_class IRenderCommandList { public: virtual void ResetRendering() = 0; virtual void SetRenderTarget( uint32_t uIndex, IImage *pImage ) = 0; virtual void SetClearColor( uint32_t uIndex, float r, float g, float b, float a ) = 0; virtual void SetDepthTarget( IImage *pDepth ) = 0; virtual void SetClearDepth( float fVal ) = 0; virtual void SetRenderResolution( uint32_t iWidth, uint32_t iHeight ) = 0; virtual void SetScissors( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight ) = 0; virtual void SetViewport( uint32_t uX, uint32_t uY, uint32_t uWidth, uint32_t uHeight, float fMinDepth, float fMaxDepth ) = 0; virtual void SetMaterial( IMaterial *pMaterial ) = 0; virtual void SetVertexBuffer( uint32_t uBinding, IVertexBuffer *pBuffer ) = 0; virtual void SetIndexBuffer( IVertexBuffer *pBuffer ) = 0; virtual void DrawPrimitives( uint32_t nVertexCount, uint32_t nFirstVertex, uint32_t nInstanceCount, uint32_t nFirstInstance ) = 0; virtual void DrawPrimitivesIndexed( uint32_t nIndexCount, uint32_t nFirstIndex, uint32_t nVertexOffset, uint32_t nInstanceCount, uint32_t nFirstInstance ) = 0; virtual void ResolveImage( IImage *pOriginal, IImage *pResolved ) = 0; virtual void StartRecording() = 0; virtual void EndRecording() = 0; }; //----------------------------------------------------------------------------- // Rendering context // // Responsible for the object handling //----------------------------------------------------------------------------- abstract_class IRenderContext: public IAppSystem { public: virtual void Frame( float fTime ) = 0; virtual IVertexBuffer *CreateVertexBuffer( uint32_t nSize ) = 0; virtual IIndexBuffer *CreateIndexBuffer( uint32_t nSize ) = 0; virtual IBuffer *CreateConstantBuffer( uint32_t nSize ) = 0; virtual IBuffer *CreateStorageBuffer( uint32_t nSize ) = 0; virtual IImage *CreateRenderTarget( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; virtual IImage *CreateTexture( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; virtual IImage *CreateStorageImage( uint32_t x, uint32_t y, EImageFormat eFormat, EMultisampleType eMultisampleType ) = 0; virtual void DestroyBuffer( IBuffer *pBuffer ) = 0; virtual void DestroyImage( IImage *pImage ) = 0; virtual IShader *CreateShader( const char *szName ) = 0; virtual void DestroyShader( IShader *pMaterial ) = 0; virtual IMaterial *CreateMaterial( IShader *pShader ) = 0; virtual void DestroyMaterial( IMaterial *pMaterial ) = 0; virtual IRenderCommandList *CreateCommandList() = 0; virtual void DestroyCommandList( IRenderCommandList *pCommandList ) = 0; virtual void SubmitCommandList(IRenderCommandList *pList) = 0; virtual void SetMainWindowManager( IGameWindowManager *pWindowManager ) = 0; virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; virtual void RegisterGameWindow( IGameWindow *pWindow ) = 0; virtual void UnregisterGameWindow( IGameWindow *pWindow ) = 0; virtual ITextureArray *CreateTextureArray() = 0; virtual void DestroyTextureArray() = 0; }; #define RENDER_CONTEXT_INTERFACE_VERSION "RenderContext001" #define MATERIAL_SYSTEM_INTERFACE_VERSION "MaterialSystem001" abstract_class IMaterialSystem: public IAppSystem { public: virtual void Frame( float fTime ) = 0; virtual void RenderGameWindow( IGameWindow *pWindow ) = 0; }; #endif