summaryrefslogtreecommitdiff
path: root/materialsystem/shaderapidx9/shaderdevicedx10.h
diff options
context:
space:
mode:
Diffstat (limited to 'materialsystem/shaderapidx9/shaderdevicedx10.h')
-rw-r--r--materialsystem/shaderapidx9/shaderdevicedx10.h254
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