diff options
Diffstat (limited to 'materialsystem/shaderapidx9/shaderdevicedx10.h')
| -rw-r--r-- | materialsystem/shaderapidx9/shaderdevicedx10.h | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/materialsystem/shaderapidx9/shaderdevicedx10.h b/materialsystem/shaderapidx9/shaderdevicedx10.h new file mode 100644 index 0000000..ecf6a8d --- /dev/null +++ b/materialsystem/shaderapidx9/shaderdevicedx10.h @@ -0,0 +1,254 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//===========================================================================// + +#ifndef SHADERDEVICEDX10_H +#define SHADERDEVICEDX10_H + +#ifdef _WIN32 +#pragma once +#endif + + +#include "shaderdevicebase.h" +#include "tier1/utlvector.h" +#include "tier1/utlrbtree.h" +#include "tier1/utllinkedlist.h" + + +//----------------------------------------------------------------------------- +// Forward declaration +//----------------------------------------------------------------------------- +struct IDXGIFactory; +struct IDXGIAdapter; +struct IDXGIOutput; +struct IDXGISwapChain; +struct ID3D10Device; +struct ID3D10RenderTargetView; +struct ID3D10VertexShader; +struct ID3D10PixelShader; +struct ID3D10GeometryShader; +struct ID3D10InputLayout; +struct ID3D10ShaderReflection; + + +//----------------------------------------------------------------------------- +// The Base implementation of the shader device +//----------------------------------------------------------------------------- +class CShaderDeviceMgrDx10 : public CShaderDeviceMgrBase +{ + typedef CShaderDeviceMgrBase BaseClass; + +public: + // constructor, destructor + CShaderDeviceMgrDx10(); + virtual ~CShaderDeviceMgrDx10(); + + // Methods of IAppSystem + virtual bool Connect( CreateInterfaceFn factory ); + virtual void Disconnect(); + virtual InitReturnVal_t Init(); + virtual void Shutdown(); + + // Methods of IShaderDeviceMgr + virtual int GetAdapterCount() const; + virtual void GetAdapterInfo( int adapter, MaterialAdapterInfo_t& info ) const; + virtual int GetModeCount( int nAdapter ) const; + virtual void GetModeInfo( ShaderDisplayMode_t* pInfo, int nAdapter, int mode ) const; + virtual void GetCurrentModeInfo( ShaderDisplayMode_t* pInfo, int nAdapter ) const; + virtual bool SetAdapter( int nAdapter, int nFlags ); + virtual CreateInterfaceFn SetMode( void *hWnd, int nAdapter, const ShaderDeviceInfo_t& mode ); + +private: + // Initialize adapter information + void InitAdapterInfo(); + + // Determines hardware caps from D3D + bool ComputeCapsFromD3D( HardwareCaps_t *pCaps, IDXGIAdapter *pAdapter, IDXGIOutput *pOutput ); + + // Returns the amount of video memory in bytes for a particular adapter + virtual int GetVidMemBytes( int nAdapter ) const; + + // Returns the appropriate adapter output to use + IDXGIOutput* GetAdapterOutput( int nAdapter ) const; + + // Returns the adapter interface for a particular adapter + IDXGIAdapter* GetAdapter( int nAdapter ) const; + + // Used to enumerate adapters, attach to windows + IDXGIFactory *m_pDXGIFactory; + + bool m_bObeyDxCommandlineOverride: 1; + + friend class CShaderDeviceDx10; +}; + + +//----------------------------------------------------------------------------- +// The Dx10 implementation of the shader device +//----------------------------------------------------------------------------- +class CShaderDeviceDx10 : public CShaderDeviceBase +{ +public: + // constructor, destructor + CShaderDeviceDx10(); + virtual ~CShaderDeviceDx10(); + +public: + // Methods of IShaderDevice + virtual bool IsUsingGraphics() const; + virtual int GetCurrentAdapter() const; + virtual ImageFormat GetBackBufferFormat() const; + virtual void GetBackBufferDimensions( int& width, int& height ) const; + virtual void SpewDriverInfo() const; + virtual void Present(); + virtual IShaderBuffer* CompileShader( const char *pProgram, size_t nBufLen, const char *pShaderVersion ); + virtual VertexShaderHandle_t CreateVertexShader( IShaderBuffer *pShader ); + virtual void DestroyVertexShader( VertexShaderHandle_t hShader ); + virtual GeometryShaderHandle_t CreateGeometryShader( IShaderBuffer* pShaderBuffer ); + virtual void DestroyGeometryShader( GeometryShaderHandle_t hShader ); + virtual PixelShaderHandle_t CreatePixelShader( IShaderBuffer* pShaderBuffer ); + virtual void DestroyPixelShader( PixelShaderHandle_t hShader ); + virtual void ReleaseResources() {} + virtual void ReacquireResources() {} + virtual IMesh* CreateStaticMesh( VertexFormat_t format, const char *pTextureBudgetGroup, IMaterial * pMaterial ); + virtual void DestroyStaticMesh( IMesh* mesh ); + virtual IVertexBuffer *CreateVertexBuffer( ShaderBufferType_t type, VertexFormat_t fmt, int nVertexCount, const char *pTextureBudgetGroup ); + virtual void DestroyVertexBuffer( IVertexBuffer *pVertexBuffer ); + virtual IIndexBuffer *CreateIndexBuffer( ShaderBufferType_t type, MaterialIndexFormat_t fmt, int nIndexCount, const char *pTextureBudgetGroup ); + virtual void DestroyIndexBuffer( IIndexBuffer *pIndexBuffer ); + virtual IVertexBuffer *GetDynamicVertexBuffer( int nStreamID, VertexFormat_t vertexFormat, bool bBuffered = true ); + virtual IIndexBuffer *GetDynamicIndexBuffer( MaterialIndexFormat_t fmt, bool bBuffered = true ); + virtual void SetHardwareGammaRamp( float fGamma, float fGammaTVRangeMin, float fGammaTVRangeMax, float fGammaTVExponent, bool bTVEnabled ); + + // A special path used to tick the front buffer while loading on the 360 + virtual void EnableNonInteractiveMode( MaterialNonInteractiveMode_t mode, ShaderNonInteractiveInfo_t *pInfo ) {} + virtual void RefreshFrontBufferNonInteractive( ) {} + virtual void HandleThreadEvent( uint32 threadEvent ) {} + +public: + // Methods of CShaderDeviceBase + virtual bool InitDevice( void *hWnd, int nAdapter, const ShaderDeviceInfo_t& mode ); + virtual void ShutdownDevice(); + virtual bool IsDeactivated() const { return false; } + + // Other public methods + ID3D10VertexShader* GetVertexShader( VertexShaderHandle_t hShader ) const; + ID3D10GeometryShader* GetGeometryShader( GeometryShaderHandle_t hShader ) const; + ID3D10PixelShader* GetPixelShader( PixelShaderHandle_t hShader ) const; + ID3D10InputLayout* GetInputLayout( VertexShaderHandle_t hShader, VertexFormat_t format ); + +private: + struct InputLayout_t + { + ID3D10InputLayout *m_pInputLayout; + VertexFormat_t m_VertexFormat; + }; + + typedef CUtlRBTree< InputLayout_t, unsigned short > InputLayoutDict_t; + + static bool InputLayoutLessFunc( const InputLayout_t &lhs, const InputLayout_t &rhs ) + { + return ( lhs.m_VertexFormat < rhs.m_VertexFormat ); + } + + struct VertexShader_t + { + ID3D10VertexShader *m_pShader; + ID3D10ShaderReflection *m_pInfo; + void *m_pByteCode; + size_t m_nByteCodeLen; + InputLayoutDict_t m_InputLayouts; + + VertexShader_t() : m_InputLayouts( 0, 0, InputLayoutLessFunc ) {} + }; + + struct GeometryShader_t + { + ID3D10GeometryShader *m_pShader; + ID3D10ShaderReflection *m_pInfo; + }; + + struct PixelShader_t + { + ID3D10PixelShader *m_pShader; + ID3D10ShaderReflection *m_pInfo; + }; + + typedef CUtlFixedLinkedList< VertexShader_t >::IndexType_t VertexShaderIndex_t; + typedef CUtlFixedLinkedList< GeometryShader_t >::IndexType_t GeometryShaderIndex_t; + typedef CUtlFixedLinkedList< PixelShader_t >::IndexType_t PixelShaderIndex_t; + + void SetupHardwareCaps(); + void ReleaseInputLayouts( VertexShaderIndex_t nIndex ); + + IDXGIOutput *m_pOutput; + ID3D10Device *m_pDevice; + IDXGISwapChain *m_pSwapChain; + ID3D10RenderTargetView *m_pRenderTargetView; + + CUtlFixedLinkedList< VertexShader_t > m_VertexShaderDict; + CUtlFixedLinkedList< GeometryShader_t > m_GeometryShaderDict; + CUtlFixedLinkedList< PixelShader_t > m_PixelShaderDict; + + friend ID3D10Device *D3D10Device(); + friend IDXGISwapChain *D3D10SwapChain(); + friend ID3D10RenderTargetView *D3D10RenderTargetView(); +}; + + +//----------------------------------------------------------------------------- +// Inline methods of CShaderDeviceDx10 +//----------------------------------------------------------------------------- +inline ID3D10VertexShader* CShaderDeviceDx10::GetVertexShader( VertexShaderHandle_t hShader ) const +{ + if ( hShader != VERTEX_SHADER_HANDLE_INVALID ) + return m_VertexShaderDict[ (VertexShaderIndex_t)hShader ].m_pShader; + return NULL; +} + +inline ID3D10GeometryShader* CShaderDeviceDx10::GetGeometryShader( GeometryShaderHandle_t hShader ) const +{ + if ( hShader != GEOMETRY_SHADER_HANDLE_INVALID ) + return m_GeometryShaderDict[ (GeometryShaderIndex_t)hShader ].m_pShader; + return NULL; +} + +inline ID3D10PixelShader* CShaderDeviceDx10::GetPixelShader( PixelShaderHandle_t hShader ) const +{ + if ( hShader != PIXEL_SHADER_HANDLE_INVALID ) + return m_PixelShaderDict[ (PixelShaderIndex_t)hShader ].m_pShader; + return NULL; +} + + +//----------------------------------------------------------------------------- +// Singleton +//----------------------------------------------------------------------------- +extern CShaderDeviceDx10* g_pShaderDeviceDx10; + + +//----------------------------------------------------------------------------- +// Utility methods +//----------------------------------------------------------------------------- +inline ID3D10Device *D3D10Device() +{ + return g_pShaderDeviceDx10->m_pDevice; +} + +inline IDXGISwapChain *D3D10SwapChain() +{ + return g_pShaderDeviceDx10->m_pSwapChain; +} + +inline ID3D10RenderTargetView *D3D10RenderTargetView() +{ + return g_pShaderDeviceDx10->m_pRenderTargetView; +} + + +#endif // SHADERDEVICEDX10_H
\ No newline at end of file |