From 2bf00b4cff8fe072415386a06e4f0945f0163106 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Fri, 11 Feb 2022 08:08:09 -0800 Subject: [PATCH] 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 Part-of: --- 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: