Module: Mesa
Branch: main
Commit: a1277311195b5ebced72803d6235d547b15c9418
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a1277311195b5ebced72803d6235d547b15c9418

Author: Jesse Natalie <[email protected]>
Date:   Fri Feb 11 13:09:01 2022 -0800

d3d12: Add a unit test for context reset recovery

Reviewed-by: Bill Kristiansen <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15002>

---

 src/gallium/targets/libgl-gdi/tests/wgl_tests.cpp | 68 +++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/src/gallium/targets/libgl-gdi/tests/wgl_tests.cpp 
b/src/gallium/targets/libgl-gdi/tests/wgl_tests.cpp
index 67a2e6639c1..deda2034b85 100644
--- a/src/gallium/targets/libgl-gdi/tests/wgl_tests.cpp
+++ b/src/gallium/targets/libgl-gdi/tests/wgl_tests.cpp
@@ -41,6 +41,8 @@ public:
       ShowWindow(_window, SW_SHOW);
    }
 
+   void recreate_attribs(const int *attribList);
+
 private:
    HWND _window = nullptr;
    HDC _hdc = nullptr;
@@ -101,6 +103,22 @@ window::window(uint32_t width, uint32_t height)
    wglMakeCurrent(_hdc, _hglrc);
 }
 
+void window::recreate_attribs(const int *attribs)
+{
+   using pwglCreateContextAttribsARB = HGLRC(WINAPI*)(HDC, HGLRC, const int *);
+   auto wglCreateContextAttribsARB = 
(pwglCreateContextAttribsARB)wglGetProcAddress("wglCreateContextAttribsARB");
+   if (!wglCreateContextAttribsARB)
+      GTEST_FAIL() << "failed to get wglCreateContextAttribsARB";
+
+   wglMakeCurrent(nullptr, nullptr);
+   wglDeleteContext(_hglrc);
+   _hglrc = wglCreateContextAttribsARB(_hdc, nullptr, attribs);
+   if (!_hglrc)
+      return;
+
+   wglMakeCurrent(_hdc, _hglrc);
+}
+
 window::~window()
 {
    if (_hglrc) {
@@ -196,4 +214,54 @@ TEST_F(d3d12, swapchain_cleanup)
 
    ASSERT_FALSE(info_queue_has_swapchain(debug_device.Get(), 
info_queue.Get()));
 }
+
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB               0x8252
+using pglGetGraphicsResetStatusARB = GLenum(APIENTRY*)();
+TEST_F(d3d12, context_reset)
+{
+   ComPtr<ID3D12Device5> device;
+   if (FAILED(D3D12CreateDevice(nullptr, D3D_FEATURE_LEVEL_11_0, 
IID_PPV_ARGS(&device))))
+      GTEST_SKIP();
+
+   const int attribs[] = { WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB, 
WGL_LOSE_CONTEXT_ON_RESET_ARB, 0 };
+
+   {
+      window wnd;
+      wnd.recreate_attribs(attribs);
+      EXPECT_TRUE(wnd.valid());
+
+      wnd.show();
+      glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+      glClear(GL_COLOR_BUFFER_BIT);
+      SwapBuffers(wnd.get_hdc());
+
+      auto glGetGraphicsResetStatusARB = 
(pglGetGraphicsResetStatusARB)wglGetProcAddress("glGetGraphicsResetStatusARB");
+      if (!glGetGraphicsResetStatusARB)
+         GTEST_FAIL() << "Couldn't get reset function";
+
+      EXPECT_EQ(glGetGraphicsResetStatusARB(), NO_ERROR);
+
+      device->RemoveDevice();
+      device.Reset();
+
+      EXPECT_NE(glGetGraphicsResetStatusARB(), NO_ERROR);
+   }
+
+   {
+      window wnd;
+      EXPECT_TRUE(wnd.valid());
+
+      wnd.recreate_attribs(attribs);
+      EXPECT_TRUE(wnd.valid());
+
+      wnd.show();
+      auto glGetGraphicsResetStatusARB = 
(pglGetGraphicsResetStatusARB)wglGetProcAddress("glGetGraphicsResetStatusARB");
+      EXPECT_EQ(glGetGraphicsResetStatusARB(), NO_ERROR);
+
+      glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+      glClear(GL_COLOR_BUFFER_BIT);
+      SwapBuffers(wnd.get_hdc());
+   }
+}
 #endif

Reply via email to