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@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15002>
This commit is contained in:
Jesse Natalie
2022-02-11 08:08:09 -08:00
committed by Marge Bot
parent 06ae10bb92
commit 2bf00b4cff
4 changed files with 22 additions and 1 deletions

View File

@@ -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)

View File

@@ -1 +1,2 @@
WGL_ARB_create_context_robustness
d3d12 ARB_robust_buffer_access_behavior

View File

@@ -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);

View File

@@ -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: