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:
@@ -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)
|
||||
|
@@ -1 +1,2 @@
|
||||
WGL_ARB_create_context_robustness
|
||||
d3d12 ARB_robust_buffer_access_behavior
|
||||
|
@@ -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);
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user