diff --git a/src/bgfx.cpp b/src/bgfx.cpp index bd2c2eab..c8338bc9 100755 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -187,6 +187,7 @@ namespace bgfx static CallbackStub* s_callbackStub = NULL; static AllocatorStub* s_allocatorStub = NULL; + static bool s_graphicsDebuggerPresent = false; CallbackI* g_callback = NULL; bx::ReallocatorI* g_allocator = NULL; @@ -201,6 +202,17 @@ namespace bgfx return NULL != s_ctx; } + void setGraphicsDebuggerPresent(bool _present) + { + BX_TRACE("Graphics debugger is %spresent.", _present ? "" : "not "); + s_graphicsDebuggerPresent = _present; + } + + bool isGraphicsDebuggerPresent() + { + return s_graphicsDebuggerPresent; + } + void fatal(Fatal::Enum _code, const char* _format, ...) { char temp[8192]; diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 275ce6c6..9c0e985b 100755 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -229,6 +229,8 @@ namespace bgfx extern bx::ReallocatorI* g_allocator; extern Caps g_caps; + void setGraphicsDebuggerPresent(bool _present); + bool isGraphicsDebuggerPresent(); void release(const Memory* _mem); const char* getAttribName(Attrib::Enum _attr); bool renderFrame(); diff --git a/src/renderer_d3d.h b/src/renderer_d3d.h index b10f4c7c..2081c7e7 100644 --- a/src/renderer_d3d.h +++ b/src/renderer_d3d.h @@ -30,12 +30,33 @@ namespace bgfx ); \ } while (0) +#define _DX_RELEASE(_ptr, _expected, _check) \ + do { \ + if (NULL != _ptr) \ + { \ + ULONG count = _ptr->Release(); \ + _check(isGraphicsDebuggerPresent() || _expected == count, "%p RefCount is %d (expected %d).", _ptr, count, _expected); BX_UNUSED(count); \ + _ptr = NULL; \ + } \ + } while (0) + +# define _DX_CHECK_REFCOUNT(_ptr, _expected) \ + do { \ + ULONG count = getRefCount(_ptr); \ + BX_CHECK(isGraphicsDebuggerPresent() || _expected == count, "%p RefCount is %d (expected %d).", _ptr, count, _expected); \ + } while (0) + #if BGFX_CONFIG_DEBUG # define DX_CHECK(_call) _DX_CHECK(_call) +# define DX_CHECK_REFCOUNT(_ptr, _expected) _DX_CHECK_REFCOUNT(_ptr, _expected) #else # define DX_CHECK(_call) _call +# define DX_CHECK_REFCOUNT(_ptr, _expected) #endif // BGFX_CONFIG_DEBUG +#define DX_RELEASE(_ptr, _expected) _DX_RELEASE(_ptr, _expected, BX_CHECK) +#define DX_RELEASE_WARNONLY(_ptr, _expected) _DX_RELEASE(_ptr, _expected, BX_WARN) + typedef int (WINAPI *D3DPERF_BeginEventFunc)(DWORD _color, LPCWSTR _wszName); typedef int (WINAPI *D3DPERF_EndEventFunc)(); typedef void (WINAPI *D3DPERF_SetMarkerFunc)(DWORD _color, LPCWSTR _wszName); @@ -58,30 +79,6 @@ namespace bgfx # define PIX_ENDEVENT() #endif // BGFX_CONFIG_DEBUG_PIX -#if BGFX_CONFIG_DEBUG -# define DX_CHECK_REFCOUNT(_ptr, _expected) \ - do { \ - ULONG count = getRefCount(_ptr); \ - BX_CHECK(_expected == count, "RefCount is %d (expected %d).", count, _expected); \ - } while (0) - -#else -# define DX_CHECK_REFCOUNT(_ptr, _expected) -#endif // BGFX_CONFIG_DEBUG - -#define _DX_RELEASE(_ptr, _expected, _check) \ - do { \ - if (NULL != _ptr) \ - { \ - ULONG count = _ptr->Release(); \ - _check(_expected == count, "RefCount is %d (expected %d).", count, _expected); BX_UNUSED(count); \ - _ptr = NULL; \ - } \ - } while (0) - -#define DX_RELEASE(_ptr, _expected) _DX_RELEASE(_ptr, _expected, BX_CHECK) -#define DX_RELEASE_WARNONLY(_ptr, _expected) _DX_RELEASE(_ptr, _expected, BX_WARN) - inline int getRefCount(IUnknown* _interface) { _interface->AddRef(); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index e26ef4b1..9a9fdb39 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -66,7 +66,7 @@ namespace bgfx static const D3D11_COMPARISON_FUNC s_depthFunc[] = { - D3D11_COMPARISON_LESS, // ignored + D3D11_COMPARISON_FUNC(0), // ignored D3D11_COMPARISON_LESS, D3D11_COMPARISON_LESS_EQUAL, D3D11_COMPARISON_EQUAL, @@ -79,7 +79,7 @@ namespace bgfx static const D3D11_COMPARISON_FUNC s_stencilFunc[] = { - D3D11_COMPARISON_LESS, // ignored + D3D11_COMPARISON_FUNC(0), // ignored D3D11_COMPARISON_LESS, D3D11_COMPARISON_LESS_EQUAL, D3D11_COMPARISON_EQUAL, @@ -456,8 +456,9 @@ namespace bgfx BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device."); // GPA increases device ref count and triggers assert in debug - // build. Warn only instead. - DX_RELEASE_WARNONLY(device, 2); + // build. Set flag to disable reference count checks. + setGraphicsDebuggerPresent(3 < getRefCount(device) ); + DX_RELEASE(device, 2); hr = adapter->GetDesc(&m_adapterDesc); BGFX_FATAL(SUCCEEDED(hr), Fatal::UnableToInitialize, "Unable to create Direct3D11 device."); diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index e608e6a4..8a5f3f39 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -43,7 +43,7 @@ namespace bgfx HashMap::iterator it = m_hashMap.find(_id); if (it != m_hashMap.end() ) { - DX_RELEASE(it->second, 0); + DX_RELEASE_WARNONLY(it->second, 0); m_hashMap.erase(it); } } @@ -52,8 +52,16 @@ namespace bgfx { for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it) { - DX_RELEASE(it->second, 0); + it->second->Release(); } + +#if BGFX_CONFIG_DEBUG + for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it) + { + DX_CHECK_REFCOUNT(it->second, 0); + } +#endif // BGFX_CONFIG_DEBUG + m_hashMap.clear(); }