/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// //@cpp #ifndef S3D_DRV_D3D9_QUERY_H #define S3D_DRV_D3D9_QUERY_H #include "drv_d3d9_types.h" #include "drv_d3d9_env.h" #include "drv_d3d9_util.h" /////////////////////////////////////////////////////////////////////////////// // D3DQUERYTYPE_VCACHE = 4, /* D3DISSUE_END */ // D3DQUERYTYPE_RESOURCEMANAGER = 5, /* D3DISSUE_END */ // D3DQUERYTYPE_VERTEXSTATS = 6, /* D3DISSUE_END */ // D3DQUERYTYPE_EVENT = 8, /* D3DISSUE_END */ // D3DQUERYTYPE_OCCLUSION = 9, /* D3DISSUE_BEGIN, D3DISSUE_END // */ // D3DQUERYTYPE_TIMESTAMP = 10, /* D3DISSUE_END */ // D3DQUERYTYPE_TIMESTAMPDISJOINT = 11, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_TIMESTAMPFREQ = 12, /* D3DISSUE_END */ // D3DQUERYTYPE_PIPELINETIMINGS = 13, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_INTERFACETIMINGS = 14, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_VERTEXTIMINGS = 15, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_PIXELTIMINGS = 16, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_BANDWIDTHTIMINGS = 17, /* D3DISSUE_BEGIN, // D3DISSUE_END */ // D3DQUERYTYPE_CACHEUTILIZATION = 18, /* D3DISSUE_BEGIN, // D3DISSUE_END */ /////////////////////////////////////////////////////////////////////////////// // class s3d_CDrvD3d9QueryEnd { public: s3d_CDrvD3d9QueryEnd( D3DQUERYTYPE QueryType); void Init( s3d_CDrvD3d9Env *Env, s3d_CDrvD3d9Device &D3dDev); void End(); HRESULT GetData( s3d_CSysIntps Size, s3d_CSysIntm *Data, bool Flush, bool Wait); bool IsAvail(bool Flush); void Flush(); void Reset(); private: friend class s3d_CDrvD3d9QueryBeginEnd; D3DQUERYTYPE m_QueryType; s3d_CDrvD3d9Query m_Query; s3d_CDrvD3d9Env *m_Env; }; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9QueryBeginEnd : public s3d_CDrvD3d9QueryEnd { public: s3d_CDrvD3d9QueryBeginEnd( D3DQUERYTYPE QueryType); void Begin(); }; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9QueryEvent : public s3d_CDrvD3d9QueryEnd { public: s3d_CDrvD3d9QueryEvent(); }; /////////////////////////////////////////////////////////////////////////////// class s3d_CDrvD3d9QueryOcclusion : public s3d_CDrvD3d9QueryBeginEnd { public: s3d_CDrvD3d9QueryOcclusion(); DWORD GetResult(bool Wait); }; /////////////////////////////////////////////////////////////////////////////// // Implementation /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9QueryEnd::s3d_CDrvD3d9QueryEnd( D3DQUERYTYPE QueryType) { m_QueryType = QueryType; } S3D_SYS_INLINE void s3d_CDrvD3d9QueryEnd::Init( s3d_CDrvD3d9Env *Env, s3d_CDrvD3d9Device &D3dDev) { if(!D3dDev) return; m_Env = Env; S3D_DRV_D3D9_CHECK( m_Env, D3dDev->CreateQuery(m_QueryType, &m_Query.EmptyRef())); } S3D_SYS_INLINE void s3d_CDrvD3d9QueryEnd::End() { if(!m_Query) return; S3D_DRV_D3D9_CHECK( m_Env, m_Query->Issue(D3DISSUE_END)); } S3D_SYS_INLINE HRESULT s3d_CDrvD3d9QueryEnd::GetData( s3d_CSysIntps Size, s3d_CSysIntm *Data, bool Flush, bool Wait) { if(!m_Query) return E_FAIL; DWORD Flags = 0; if(Wait || Flush) Flags |= D3DGETDATA_FLUSH; HRESULT Result; do { S3D_DRV_D3D9_CALLCHECK( m_Env, Result, m_Query->GetData( Data, Size, Flags)); } while(Wait && Result == S_FALSE); return Result; } S3D_SYS_INLINE bool s3d_CDrvD3d9QueryEnd::IsAvail( bool Flush) { HRESULT Result = GetData(0, 0, Flush, false); return Result == S_OK; } S3D_SYS_INLINE void s3d_CDrvD3d9QueryEnd::Flush() { GetData(0, 0, true, false); } S3D_SYS_INLINE void s3d_CDrvD3d9QueryEnd::Reset() { m_Query.Reset(); } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9QueryBeginEnd::s3d_CDrvD3d9QueryBeginEnd( D3DQUERYTYPE QueryType) : s3d_CDrvD3d9QueryEnd(QueryType) { } S3D_SYS_INLINE void s3d_CDrvD3d9QueryBeginEnd::Begin() { if(!m_Query) return; S3D_DRV_D3D9_CHECK( m_Env, m_Query->Issue(D3DISSUE_BEGIN)); } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9QueryEvent::s3d_CDrvD3d9QueryEvent() : s3d_CDrvD3d9QueryEnd(D3DQUERYTYPE_EVENT) { } /////////////////////////////////////////////////////////////////////////////// S3D_SYS_INLINE s3d_CDrvD3d9QueryOcclusion::s3d_CDrvD3d9QueryOcclusion() : s3d_CDrvD3d9QueryBeginEnd(D3DQUERYTYPE_OCCLUSION) { } S3D_SYS_INLINE DWORD s3d_CDrvD3d9QueryOcclusion::GetResult(bool Wait) { DWORD Result = 0; GetData( sizeof(Result), reinterpret_cast(&Result), false, Wait); return Result; } /////////////////////////////////////////////////////////////////////////////// #endif