From 0f076ad7cc135e58361f1cf379985f6d5418909b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Fri, 21 Aug 2015 13:07:58 -0700 Subject: [PATCH] D3D9: Test if timer query is available. --- src/renderer_d3d9.cpp | 56 +++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 4bb5c023..3554011f 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -282,7 +282,8 @@ namespace bgfx { namespace d3d9 , m_initialized(false) , m_amd(false) , m_nvidia(false) - , m_instancing(false) + , m_instancingSupport(false) + , m_timerQuerySupport(false) , m_rtMsaa(false) { } @@ -551,7 +552,7 @@ namespace bgfx { namespace d3d9 BX_UNUSED(fourcc); } - m_instancing = false + m_instancingSupport = false || s_extendedFormats[ExtendedFormat::Inst].m_supported || (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::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) { @@ -661,6 +662,18 @@ namespace bgfx { namespace d3d9 m_fmtDepth = D3DFMT_D24FS8; #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; DX_CHECK(m_device->GetSwapChain(0, &swapChain) ); @@ -1344,7 +1357,10 @@ namespace bgfx { namespace d3d9 capturePreReset(); 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) { @@ -1374,7 +1390,10 @@ namespace bgfx { namespace d3d9 DX_CHECK(m_device->GetDepthStencilSurface(&m_backBufferDepthStencil) ); DX_CHECK(m_device->CreateQuery(D3DQUERYTYPE_EVENT, &m_flushQuery) ); - m_gpuTimer.postReset(); + if (m_timerQuerySupport) + { + m_gpuTimer.postReset(); + } capturePostReset(); @@ -1865,7 +1884,8 @@ namespace bgfx { namespace d3d9 bool m_initialized; bool m_amd; bool m_nvidia; - bool m_instancing; + bool m_instancingSupport; + bool m_timerQuerySupport; D3DFORMAT m_fmtDepth; @@ -3129,7 +3149,10 @@ namespace bgfx { namespace d3d9 int64_t captureElapsed = 0; device->BeginScene(); - m_gpuTimer.begin(); + if (m_timerQuerySupport) + { + m_gpuTimer.begin(); + } 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) ); if (isValid(draw.m_instanceDataBuffer) - && m_instancing) + && m_instancingSupport) { const VertexBufferD3D9& inst = m_vertexBuffers[draw.m_instanceDataBuffer.idx]; DX_CHECK(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|draw.m_numInstances) ); @@ -3685,15 +3708,18 @@ namespace bgfx { namespace d3d9 static double maxGpuElapsed = 0.0f; double elapsedGpuMs = 0.0; - m_gpuTimer.end(); - - while (m_gpuTimer.get() ) + if (m_timerQuerySupport) { - double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency); - elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs; - maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed; + m_gpuTimer.end(); + + 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();