mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-25 09:08:22 -05:00
D3D9: Test if timer query is available.
This commit is contained in:
parent
3c6ee5fbcb
commit
0f076ad7cc
1 changed files with 41 additions and 15 deletions
|
@ -282,7 +282,8 @@ namespace bgfx { namespace d3d9
|
||||||
, m_initialized(false)
|
, m_initialized(false)
|
||||||
, m_amd(false)
|
, m_amd(false)
|
||||||
, m_nvidia(false)
|
, m_nvidia(false)
|
||||||
, m_instancing(false)
|
, m_instancingSupport(false)
|
||||||
|
, m_timerQuerySupport(false)
|
||||||
, m_rtMsaa(false)
|
, m_rtMsaa(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -551,7 +552,7 @@ namespace bgfx { namespace d3d9
|
||||||
BX_UNUSED(fourcc);
|
BX_UNUSED(fourcc);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_instancing = false
|
m_instancingSupport = false
|
||||||
|| s_extendedFormats[ExtendedFormat::Inst].m_supported
|
|| s_extendedFormats[ExtendedFormat::Inst].m_supported
|
||||||
|| (m_caps.VertexShaderVersion >= D3DVS_VERSION(3, 0) )
|
|| (m_caps.VertexShaderVersion >= D3DVS_VERSION(3, 0) )
|
||||||
;
|
;
|
||||||
|
@ -571,7 +572,7 @@ namespace bgfx { namespace d3d9
|
||||||
s_textureFormat[TextureFormat::BC4].m_fmt = s_extendedFormats[ExtendedFormat::Ati1].m_supported ? D3DFMT_ATI1 : D3DFMT_UNKNOWN;
|
s_textureFormat[TextureFormat::BC4].m_fmt = s_extendedFormats[ExtendedFormat::Ati1].m_supported ? D3DFMT_ATI1 : D3DFMT_UNKNOWN;
|
||||||
s_textureFormat[TextureFormat::BC5].m_fmt = s_extendedFormats[ExtendedFormat::Ati2].m_supported ? D3DFMT_ATI2 : D3DFMT_UNKNOWN;
|
s_textureFormat[TextureFormat::BC5].m_fmt = s_extendedFormats[ExtendedFormat::Ati2].m_supported ? D3DFMT_ATI2 : D3DFMT_UNKNOWN;
|
||||||
|
|
||||||
g_caps.supported |= m_instancing ? BGFX_CAPS_INSTANCING : 0;
|
g_caps.supported |= m_instancingSupport ? BGFX_CAPS_INSTANCING : 0;
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
|
for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
|
||||||
{
|
{
|
||||||
|
@ -661,6 +662,18 @@ namespace bgfx { namespace d3d9
|
||||||
m_fmtDepth = D3DFMT_D24FS8;
|
m_fmtDepth = D3DFMT_D24FS8;
|
||||||
#endif // BX_PLATFORM_WINDOWS
|
#endif // BX_PLATFORM_WINDOWS
|
||||||
|
|
||||||
|
{
|
||||||
|
IDirect3DQuery9* timerQueryTest[3] = {};
|
||||||
|
m_timerQuerySupport = true
|
||||||
|
&& SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPDISJOINT, &timerQueryTest[0]) )
|
||||||
|
&& SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMP, &timerQueryTest[1]) )
|
||||||
|
&& SUCCEEDED(m_device->CreateQuery(D3DQUERYTYPE_TIMESTAMPFREQ, &timerQueryTest[2]) )
|
||||||
|
;
|
||||||
|
DX_RELEASE(timerQueryTest[0], 0);
|
||||||
|
DX_RELEASE(timerQueryTest[1], 0);
|
||||||
|
DX_RELEASE(timerQueryTest[2], 0);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
IDirect3DSwapChain9* swapChain;
|
IDirect3DSwapChain9* swapChain;
|
||||||
DX_CHECK(m_device->GetSwapChain(0, &swapChain) );
|
DX_CHECK(m_device->GetSwapChain(0, &swapChain) );
|
||||||
|
@ -1344,7 +1357,10 @@ namespace bgfx { namespace d3d9
|
||||||
capturePreReset();
|
capturePreReset();
|
||||||
|
|
||||||
DX_RELEASE(m_flushQuery, 0);
|
DX_RELEASE(m_flushQuery, 0);
|
||||||
m_gpuTimer.preReset();
|
if (m_timerQuerySupport)
|
||||||
|
{
|
||||||
|
m_gpuTimer.preReset();
|
||||||
|
}
|
||||||
|
|
||||||
for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
|
for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
|
||||||
{
|
{
|
||||||
|
@ -1374,7 +1390,10 @@ namespace bgfx { namespace d3d9
|
||||||
DX_CHECK(m_device->GetDepthStencilSurface(&m_backBufferDepthStencil) );
|
DX_CHECK(m_device->GetDepthStencilSurface(&m_backBufferDepthStencil) );
|
||||||
|
|
||||||
DX_CHECK(m_device->CreateQuery(D3DQUERYTYPE_EVENT, &m_flushQuery) );
|
DX_CHECK(m_device->CreateQuery(D3DQUERYTYPE_EVENT, &m_flushQuery) );
|
||||||
m_gpuTimer.postReset();
|
if (m_timerQuerySupport)
|
||||||
|
{
|
||||||
|
m_gpuTimer.postReset();
|
||||||
|
}
|
||||||
|
|
||||||
capturePostReset();
|
capturePostReset();
|
||||||
|
|
||||||
|
@ -1865,7 +1884,8 @@ namespace bgfx { namespace d3d9
|
||||||
bool m_initialized;
|
bool m_initialized;
|
||||||
bool m_amd;
|
bool m_amd;
|
||||||
bool m_nvidia;
|
bool m_nvidia;
|
||||||
bool m_instancing;
|
bool m_instancingSupport;
|
||||||
|
bool m_timerQuerySupport;
|
||||||
|
|
||||||
D3DFORMAT m_fmtDepth;
|
D3DFORMAT m_fmtDepth;
|
||||||
|
|
||||||
|
@ -3129,7 +3149,10 @@ namespace bgfx { namespace d3d9
|
||||||
int64_t captureElapsed = 0;
|
int64_t captureElapsed = 0;
|
||||||
|
|
||||||
device->BeginScene();
|
device->BeginScene();
|
||||||
m_gpuTimer.begin();
|
if (m_timerQuerySupport)
|
||||||
|
{
|
||||||
|
m_gpuTimer.begin();
|
||||||
|
}
|
||||||
|
|
||||||
if (0 < _render->m_iboffset)
|
if (0 < _render->m_iboffset)
|
||||||
{
|
{
|
||||||
|
@ -3542,7 +3565,7 @@ namespace bgfx { namespace d3d9
|
||||||
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
|
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
|
||||||
|
|
||||||
if (isValid(draw.m_instanceDataBuffer)
|
if (isValid(draw.m_instanceDataBuffer)
|
||||||
&& m_instancing)
|
&& m_instancingSupport)
|
||||||
{
|
{
|
||||||
const VertexBufferD3D9& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
|
const VertexBufferD3D9& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
|
||||||
DX_CHECK(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|draw.m_numInstances) );
|
DX_CHECK(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|draw.m_numInstances) );
|
||||||
|
@ -3685,15 +3708,18 @@ namespace bgfx { namespace d3d9
|
||||||
static double maxGpuElapsed = 0.0f;
|
static double maxGpuElapsed = 0.0f;
|
||||||
double elapsedGpuMs = 0.0;
|
double elapsedGpuMs = 0.0;
|
||||||
|
|
||||||
m_gpuTimer.end();
|
if (m_timerQuerySupport)
|
||||||
|
|
||||||
while (m_gpuTimer.get() )
|
|
||||||
{
|
{
|
||||||
double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
|
m_gpuTimer.end();
|
||||||
elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
|
|
||||||
maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
|
while (m_gpuTimer.get() )
|
||||||
|
{
|
||||||
|
double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
|
||||||
|
elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
|
||||||
|
maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
|
||||||
|
}
|
||||||
|
maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
|
||||||
}
|
}
|
||||||
maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
|
|
||||||
|
|
||||||
const int64_t timerFreq = bx::getHPFrequency();
|
const int64_t timerFreq = bx::getHPFrequency();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue