diff --git a/src/util/com/com_guid.cpp b/src/util/com/com_guid.cpp index 329d1848..ed4eaba6 100644 --- a/src/util/com/com_guid.cpp +++ b/src/util/com/com_guid.cpp @@ -1,9 +1,47 @@ +#include +#include + #include "com_guid.h" #include "../../d3d11/d3d11_interfaces.h" #include "../../dxgi/dxgi_interfaces.h" +#include "../../dxvk/dxvk_hash.h" + +#include "../thread.h" + +namespace dxvk { + + struct GuidPair { + GuidPair() { }; + GuidPair(IID a_, IID b_) + : a(a_), b(b_) { } + + IID a, b; + + size_t hash() const { + return size_t(a.Data1) ^ size_t(b.Data1); + } + + bool eq(const GuidPair& other) const { + return a == other.a && b == other.b; + } + }; + + dxvk::mutex g_loggedQueryInterfaceErrorMutex; + std::unordered_set g_loggedQueryInterfaceErrors; + + bool logQueryInterfaceError(REFIID objectGuid, REFIID requestedGuid) { + if (Logger::logLevel() > LogLevel::Warn) + return false; + + std::lock_guard lock(g_loggedQueryInterfaceErrorMutex); + return g_loggedQueryInterfaceErrors.emplace(objectGuid, requestedGuid).second; + } + +} + std::ostream& operator << (std::ostream& os, REFIID guid) { os << std::hex << std::setfill('0') << std::setw(8) << guid.Data1 << '-'; diff --git a/src/util/com/com_guid.h b/src/util/com/com_guid.h index 9a69fc93..f090c236 100644 --- a/src/util/com/com_guid.h +++ b/src/util/com/com_guid.h @@ -5,4 +5,17 @@ #include "com_include.h" +namespace dxvk { + + /** + * \brief Checks whether an unknown GUID should be logged + * + * \param [in] objectGuid GUID of the object that QueryInterface is called on + * \param [in] requestGuid Requested unsupported GUID + * \returns \c true if the error should be logged + */ + bool logQueryInterfaceError(REFIID objectGuid, REFIID requestedGuid); + +}; + std::ostream& operator << (std::ostream& os, REFIID guid);