source: GTP/trunk/App/Demos/Geom/Shark3D/src/drv_d3d9_query.h @ 2236

Revision 2236, 5.8 KB checked in by gumbau, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14//@cpp
15#ifndef S3D_DRV_D3D9_QUERY_H
16#define S3D_DRV_D3D9_QUERY_H
17
18#include "drv_d3d9_types.h"
19#include "drv_d3d9_env.h"
20#include "drv_d3d9_util.h"
21
22///////////////////////////////////////////////////////////////////////////////
23
24//    D3DQUERYTYPE_VCACHE                 = 4, /* D3DISSUE_END */
25//    D3DQUERYTYPE_RESOURCEMANAGER        = 5, /* D3DISSUE_END */
26//    D3DQUERYTYPE_VERTEXSTATS            = 6, /* D3DISSUE_END */
27//    D3DQUERYTYPE_EVENT                  = 8, /* D3DISSUE_END */
28//    D3DQUERYTYPE_OCCLUSION              = 9, /* D3DISSUE_BEGIN, D3DISSUE_END
29// */
30//    D3DQUERYTYPE_TIMESTAMP              = 10, /* D3DISSUE_END */
31//    D3DQUERYTYPE_TIMESTAMPDISJOINT      = 11, /* D3DISSUE_BEGIN,
32// D3DISSUE_END */
33//    D3DQUERYTYPE_TIMESTAMPFREQ          = 12, /* D3DISSUE_END */
34//    D3DQUERYTYPE_PIPELINETIMINGS        = 13, /* D3DISSUE_BEGIN,
35// D3DISSUE_END */
36//    D3DQUERYTYPE_INTERFACETIMINGS       = 14, /* D3DISSUE_BEGIN,
37// D3DISSUE_END */
38//    D3DQUERYTYPE_VERTEXTIMINGS          = 15, /* D3DISSUE_BEGIN,
39// D3DISSUE_END */
40//    D3DQUERYTYPE_PIXELTIMINGS           = 16, /* D3DISSUE_BEGIN,
41// D3DISSUE_END */
42//    D3DQUERYTYPE_BANDWIDTHTIMINGS       = 17, /* D3DISSUE_BEGIN,
43// D3DISSUE_END */
44//    D3DQUERYTYPE_CACHEUTILIZATION       = 18, /* D3DISSUE_BEGIN,
45// D3DISSUE_END */
46
47///////////////////////////////////////////////////////////////////////////////
48//
49
50class s3d_CDrvD3d9QueryEnd
51{
52public:
53    s3d_CDrvD3d9QueryEnd(
54            D3DQUERYTYPE QueryType);
55
56    void Init(
57            s3d_CDrvD3d9Env *Env, s3d_CDrvD3d9Device &D3dDev);
58
59    void End();
60
61    HRESULT GetData(
62            s3d_CSysIntps Size, s3d_CSysIntm *Data, bool Flush, bool Wait);
63
64    bool IsAvail(bool Flush);
65    void Flush();
66
67    void Reset();
68
69private:
70    friend class s3d_CDrvD3d9QueryBeginEnd;
71
72    D3DQUERYTYPE m_QueryType;
73    s3d_CDrvD3d9Query m_Query;
74    s3d_CDrvD3d9Env *m_Env;
75};
76
77///////////////////////////////////////////////////////////////////////////////
78
79class s3d_CDrvD3d9QueryBeginEnd
80        : public s3d_CDrvD3d9QueryEnd
81{
82public:
83    s3d_CDrvD3d9QueryBeginEnd(
84            D3DQUERYTYPE QueryType);
85
86    void Begin();
87};
88
89///////////////////////////////////////////////////////////////////////////////
90
91class s3d_CDrvD3d9QueryEvent
92        : public s3d_CDrvD3d9QueryEnd
93{
94public:
95    s3d_CDrvD3d9QueryEvent();
96};
97
98///////////////////////////////////////////////////////////////////////////////
99
100class s3d_CDrvD3d9QueryOcclusion
101        : public s3d_CDrvD3d9QueryBeginEnd
102{
103public:
104    s3d_CDrvD3d9QueryOcclusion();
105    DWORD GetResult(bool Wait);
106};
107
108///////////////////////////////////////////////////////////////////////////////
109// Implementation
110///////////////////////////////////////////////////////////////////////////////
111
112S3D_SYS_INLINE
113s3d_CDrvD3d9QueryEnd::s3d_CDrvD3d9QueryEnd(
114        D3DQUERYTYPE QueryType)
115{
116    m_QueryType = QueryType;
117}
118
119S3D_SYS_INLINE
120void s3d_CDrvD3d9QueryEnd::Init(
121        s3d_CDrvD3d9Env *Env, s3d_CDrvD3d9Device &D3dDev)
122{
123    if(!D3dDev)
124        return;
125   
126    m_Env = Env;
127
128    S3D_DRV_D3D9_CHECK(
129            m_Env, D3dDev->CreateQuery(m_QueryType, &m_Query.EmptyRef()));
130}
131
132S3D_SYS_INLINE
133void s3d_CDrvD3d9QueryEnd::End()
134{
135    if(!m_Query)
136        return;
137
138    S3D_DRV_D3D9_CHECK(
139            m_Env, m_Query->Issue(D3DISSUE_END));
140}
141
142S3D_SYS_INLINE
143HRESULT s3d_CDrvD3d9QueryEnd::GetData(
144        s3d_CSysIntps Size, s3d_CSysIntm *Data, bool Flush, bool Wait)
145{
146    if(!m_Query)
147        return E_FAIL;
148
149    DWORD Flags = 0;
150    if(Wait || Flush)
151        Flags |= D3DGETDATA_FLUSH;
152   
153    HRESULT Result;
154    do
155    {
156        S3D_DRV_D3D9_CALLCHECK(
157                m_Env, Result, m_Query->GetData(
158                    Data, Size, Flags));
159    }
160    while(Wait && Result == S_FALSE);
161   
162    return Result;
163}
164
165S3D_SYS_INLINE
166bool s3d_CDrvD3d9QueryEnd::IsAvail(
167        bool Flush)
168{
169    HRESULT Result = GetData(0, 0, Flush, false);
170    return Result == S_OK;
171}
172
173S3D_SYS_INLINE
174void s3d_CDrvD3d9QueryEnd::Flush()
175{
176    GetData(0, 0, true, false);
177}
178
179S3D_SYS_INLINE
180void s3d_CDrvD3d9QueryEnd::Reset()
181{
182    m_Query.Reset();
183}
184
185
186///////////////////////////////////////////////////////////////////////////////
187
188S3D_SYS_INLINE
189s3d_CDrvD3d9QueryBeginEnd::s3d_CDrvD3d9QueryBeginEnd(
190        D3DQUERYTYPE QueryType)
191    : s3d_CDrvD3d9QueryEnd(QueryType)
192{
193}
194
195S3D_SYS_INLINE
196void s3d_CDrvD3d9QueryBeginEnd::Begin()
197{
198    if(!m_Query)
199        return;
200
201    S3D_DRV_D3D9_CHECK(
202            m_Env, m_Query->Issue(D3DISSUE_BEGIN));
203}
204
205///////////////////////////////////////////////////////////////////////////////
206
207S3D_SYS_INLINE
208s3d_CDrvD3d9QueryEvent::s3d_CDrvD3d9QueryEvent()
209    : s3d_CDrvD3d9QueryEnd(D3DQUERYTYPE_EVENT)
210{
211}
212
213///////////////////////////////////////////////////////////////////////////////
214
215S3D_SYS_INLINE
216s3d_CDrvD3d9QueryOcclusion::s3d_CDrvD3d9QueryOcclusion()
217    : s3d_CDrvD3d9QueryBeginEnd(D3DQUERYTYPE_OCCLUSION)
218{
219}
220
221S3D_SYS_INLINE
222DWORD s3d_CDrvD3d9QueryOcclusion::GetResult(bool Wait)
223{
224    DWORD Result = 0;
225    GetData(
226            sizeof(Result), reinterpret_cast<s3d_CSysIntm*>(&Result),
227            false, Wait);
228    return Result;
229}
230///////////////////////////////////////////////////////////////////////////////
231
232#endif
Note: See TracBrowser for help on using the repository browser.