//--------------------------------------------------------------------- const String D3D11Device::getErrorDescription(const HRESULT lastResult /* = NO_ERROR */) const { if (!mD3D11Device) { return "NULL device"; } if (D3D_NO_EXCEPTION == mExceptionsErrorLevel) { return "infoQ exceptions are turned off"; } String res; switch (lastResult) { case NO_ERROR: break; case E_INVALIDARG: res = res + "invalid parameters were passed.\n"; break; default: assert(false); // unknown HRESULT } ID3D11InfoQueue * pInfoQueue = NULL; HRESULT hr = mD3D11Device->QueryInterface(__uuidof(ID3D11InfoQueue), (LPVOID*)&pInfoQueue); if (SUCCEEDED(hr)) { UINT64 numStoredMessages = pInfoQueue->GetNumStoredMessages(); for (UINT64 i = 0 ; i < numStoredMessages ; i++ ) { // Get the size of the message SIZE_T messageLength = 0; hr = pInfoQueue->GetMessage(i, NULL, &messageLength); // Allocate space and get the message D3D11_MESSAGE * pMessage = (D3D11_MESSAGE*)malloc(messageLength); hr = pInfoQueue->GetMessage(i, pMessage, &messageLength); res = res + pMessage->pDescription + "\n"; free(pMessage); } } return res; }
void ANGLETest::checkD3D11SDKLayersMessages() { #if defined(ANGLE_PLATFORM_WINDOWS) && !defined(NDEBUG) // In debug D3D11 mode, check ID3D11InfoQueue to see if any D3D11 SDK Layers messages // were outputted by the test if (mIgnoreD3D11SDKLayersWarnings || mEGLWindow->getPlatform().renderer != EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE || mEGLWindow->getDisplay() == EGL_NO_DISPLAY) { return; } const char *extensionString = static_cast<const char *>(eglQueryString(mEGLWindow->getDisplay(), EGL_EXTENSIONS)); if (!strstr(extensionString, "EGL_EXT_device_query")) { return; } EGLAttrib device = 0; EGLAttrib angleDevice = 0; PFNEGLQUERYDISPLAYATTRIBEXTPROC queryDisplayAttribEXT; PFNEGLQUERYDEVICEATTRIBEXTPROC queryDeviceAttribEXT; queryDisplayAttribEXT = reinterpret_cast<PFNEGLQUERYDISPLAYATTRIBEXTPROC>( eglGetProcAddress("eglQueryDisplayAttribEXT")); queryDeviceAttribEXT = reinterpret_cast<PFNEGLQUERYDEVICEATTRIBEXTPROC>( eglGetProcAddress("eglQueryDeviceAttribEXT")); ASSERT_NE(nullptr, queryDisplayAttribEXT); ASSERT_NE(nullptr, queryDeviceAttribEXT); ASSERT_EGL_TRUE(queryDisplayAttribEXT(mEGLWindow->getDisplay(), EGL_DEVICE_EXT, &angleDevice)); ASSERT_EGL_TRUE(queryDeviceAttribEXT(reinterpret_cast<EGLDeviceEXT>(angleDevice), EGL_D3D11_DEVICE_ANGLE, &device)); ID3D11Device *d3d11Device = reinterpret_cast<ID3D11Device *>(device); ID3D11InfoQueue *infoQueue = nullptr; HRESULT hr = d3d11Device->QueryInterface(__uuidof(infoQueue), reinterpret_cast<void **>(&infoQueue)); if (SUCCEEDED(hr)) { UINT64 numStoredD3DDebugMessages = infoQueue->GetNumStoredMessagesAllowedByRetrievalFilter(); if (numStoredD3DDebugMessages > 0) { for (UINT64 i = 0; i < numStoredD3DDebugMessages; i++) { SIZE_T messageLength = 0; hr = infoQueue->GetMessage(i, nullptr, &messageLength); if (SUCCEEDED(hr)) { D3D11_MESSAGE *pMessage = reinterpret_cast<D3D11_MESSAGE *>(malloc(messageLength)); infoQueue->GetMessage(i, pMessage, &messageLength); std::cout << "Message " << i << ":" << " " << pMessage->pDescription << "\n"; free(pMessage); } } FAIL() << numStoredD3DDebugMessages << " D3D11 SDK Layers message(s) detected! Test Failed.\n"; } } SafeRelease(infoQueue); #endif }