Mesa (main): d3d12: Hook up robustness extensions

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 28 20:01:20 UTC 2022


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

Author: Jesse Natalie <jenatali at microsoft.com>
Date:   Fri Feb 11 08:08:09 2022 -0800

d3d12: Hook up robustness extensions

We can at least correctly return whether the context was lost, but
at this point can't correctly tear down and create a new one, nor
do we support the callback for dynamic notification.

Reviewed-by: Bill Kristiansen <billkris at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15002>

---

 docs/features.txt                           |  2 +-
 docs/relnotes/new_features.txt              |  1 +
 src/gallium/drivers/d3d12/d3d12_context.cpp | 18 ++++++++++++++++++
 src/gallium/drivers/d3d12/d3d12_screen.cpp  |  2 ++
 4 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/docs/features.txt b/docs/features.txt
index e0899fa1a99..77cfee15a6b 100644
--- a/docs/features.txt
+++ b/docs/features.txt
@@ -181,7 +181,7 @@ GL 4.3, GLSL 4.30 -- all DONE: i965/gen8+, nvc0, r600, radeonsi, llvmpipe, virgl
   GL_ARB_invalidate_subdata                             DONE (all drivers)
   GL_ARB_multi_draw_indirect                            DONE (freedreno, i965, softpipe, v3d, d3d12)
   GL_ARB_program_interface_query                        DONE (all drivers)
-  GL_ARB_robust_buffer_access_behavior                  DONE (freedreno, i965)
+  GL_ARB_robust_buffer_access_behavior                  DONE (freedreno, i965, d3d12)
   GL_ARB_shader_image_size                              DONE (freedreno/a5xx+, i965, softpipe, v3d, panfrost, d3d12)
   GL_ARB_shader_storage_buffer_object                   DONE (freedreno/a5xx+, i965, softpipe, v3d, panfrost, d3d12)
   GL_ARB_stencil_texturing                              DONE (freedreno, i965/hsw+, nv50, softpipe, v3d, panfrost, d3d12)
diff --git a/docs/relnotes/new_features.txt b/docs/relnotes/new_features.txt
index b8d89951bf0..c387dea1950 100644
--- a/docs/relnotes/new_features.txt
+++ b/docs/relnotes/new_features.txt
@@ -1 +1,2 @@
 WGL_ARB_create_context_robustness
+d3d12 ARB_robust_buffer_access_behavior
diff --git a/src/gallium/drivers/d3d12/d3d12_context.cpp b/src/gallium/drivers/d3d12/d3d12_context.cpp
index 0e86b29c5fe..d54f8aa31d2 100644
--- a/src/gallium/drivers/d3d12/d3d12_context.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_context.cpp
@@ -2355,6 +2355,22 @@ d3d12_set_tess_state(struct pipe_context *pctx,
    memcpy(ctx->default_inner_tess_factor, default_inner_level, sizeof(ctx->default_inner_tess_factor));
 }
 
+static enum pipe_reset_status
+d3d12_get_reset_status(struct pipe_context *pctx)
+{
+   struct d3d12_screen *screen = d3d12_screen(pctx->screen);
+   HRESULT hr = screen->dev->GetDeviceRemovedReason();
+   switch (hr) {
+   case DXGI_ERROR_DEVICE_HUNG:
+   case DXGI_ERROR_INVALID_CALL:
+      return PIPE_GUILTY_CONTEXT_RESET;
+   case DXGI_ERROR_DEVICE_RESET:
+      return PIPE_INNOCENT_CONTEXT_RESET;
+   default:
+      return SUCCEEDED(hr) ? PIPE_NO_RESET : PIPE_UNKNOWN_CONTEXT_RESET;
+   }
+}
+
 struct pipe_context *
 d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 {
@@ -2452,6 +2468,8 @@ d3d12_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
 
    ctx->base.get_sample_position = d3d12_get_sample_position;
 
+   ctx->base.get_device_reset_status = d3d12_get_reset_status;
+
    ctx->gfx_pipeline_state.sample_mask = ~0;
 
    d3d12_context_surface_init(&ctx->base);
diff --git a/src/gallium/drivers/d3d12/d3d12_screen.cpp b/src/gallium/drivers/d3d12/d3d12_screen.cpp
index 53b8f6b5f1a..8b6896d7d97 100644
--- a/src/gallium/drivers/d3d12/d3d12_screen.cpp
+++ b/src/gallium/drivers/d3d12/d3d12_screen.cpp
@@ -323,6 +323,8 @@ d3d12_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_INT64:
    case PIPE_CAP_INT64_DIVMOD:
    case PIPE_CAP_DOUBLES:
+   case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
+   case PIPE_CAP_ROBUST_BUFFER_ACCESS_BEHAVIOR:
       return 1;
 
    case PIPE_CAP_MAX_VERTEX_STREAMS:



More information about the mesa-commit mailing list