What does HRESULT 0x087A000A (DXGI_STATUS_DDA_WAS_STILL_DRAWING) mean?

 
Previous Next
DXGI_STATUS_UNOCCLUDED DXGI_STATUS_PRESENT_REQUIRED

DXGI_STATUS_DDA_WAS_STILL_DRAWING

Why this is not a generic GPU failure: status dda was still drawing

DXGI_STATUS_DDA_WAS_STILL_DRAWING (0x087A000A) belongs to the dxgi status layer. It marks the duplication-related present could not acquire resources immediately because previous GPU work still owned them, rather than a generic rendering failure. The object that owns the decision is Desktop Duplication presentation readiness.

DXGI_STATUS_DDA_WAS_STILL_DRAWING: A DXGI status can describe a successful or temporarily invisible presentation. For DXGI_STATUS_DDA_WAS_STILL_DRAWING, Converting every non-S_OK value into device recreation destroys useful state and can create a full-screen transition loop. For DXGI_STATUS_DDA_WAS_STILL_DRAWING, the built-in one-line message identifies the immediate result; diagnosis also needs the producing API, object ownership and the display generation current at the time.

The smallest evidence set

Capture itemWhy it matters for DXGI_STATUS_DDA_WAS_STILL_DRAWING
Current graph stateswap chain, target window, output and Present call
Supporting tracePresent/Present1 result history, WM_SIZE or WM_DISPLAYCHANGE messages, swap-chain description and current IDXGIOutput identity
Object identityDesktop Duplication presentation readiness
Rejected boundarythe duplication-related present could not acquire resources immediately because previous GPU work still owned them
Decisive captureduplication frame number, AcquireNextFrame/ReleaseFrame sequence, GPU fence state, timeout, dirty/move rectangles and adapter load

For DXGI_STATUS_DDA_WAS_STILL_DRAWING, preserve the unsigned HRESULT, symbolic name, first failing API and timestamp in one record. If cleanup later fails too, keep that secondary result separately from DXGI_STATUS_DDA_WAS_STILL_DRAWING.

A/B test for the exact condition

  1. Freeze the DXGI_STATUS_DDA_WAS_STILL_DRAWING generation. Record duplication frame number, AcquireNextFrame/ReleaseFrame sequence, GPU fence state, timeout, dirty/move rectangles and adapter load. Before diagnosing DXGI_STATUS_DDA_WAS_STILL_DRAWING, do not resize, hot-plug, recreate or release the object under examination.
  2. Run the narrow DXGI_STATUS_DDA_WAS_STILL_DRAWING comparison. retry after releasing the acquired frame and allowing the outstanding GPU work to complete. During the DXGI_STATUS_DDA_WAS_STILL_DRAWING comparison, keep every driver, monitor, resource format and unrelated policy unchanged.
  3. Observe the layer after DXGI_STATUS_DDA_WAS_STILL_DRAWING. For DXGI_STATUS_DDA_WAS_STILL_DRAWING, if the exact check passes, record the next HRESULT or visible outcome. A different downstream result shows that the DXGI_STATUS_DDA_WAS_STILL_DRAWING boundary was crossed.
  4. Repeat DXGI_STATUS_DDA_WAS_STILL_DRAWING through a lifecycle transition. For DXGI_STATUS_DDA_WAS_STILL_DRAWING, exercise one relevant resize, mode switch, device recreation, hot-plug or session change and confirm that this result does not reuse stale handles.

The comparison with DXGI_DDI_ERR_WASSTILLDRAWING is especially useful: DXGI_DDI_ERR_WASSTILLDRAWING is a driver-interface busy result at a different layer. For DXGI_STATUS_DDA_WAS_STILL_DRAWING, recording both names prevents a broad “graphics error” label from merging distinct ownership, capability and lifetime problems.

Safe remediation

Maintain one balanced acquire/release cycle and use bounded retry rather than treating the transient status as data corruption. Repair of DXGI_STATUS_DDA_WAS_STILL_DRAWING is complete only when the original call succeeds or returns its documented nonfatal status and the same lifetime test remains correct after a second display transition.

  • The DXGI_STATUS_DDA_WAS_STILL_DRAWING trace identifies one producing API and one current graphics object, rather than only the final UI symptom.
  • The passing run changes exactly the condition described for DXGI_STATUS_DDA_WAS_STILL_DRAWING; unrelated adapter, monitor and application state remains unchanged.
  • For DXGI_STATUS_DDA_WAS_STILL_DRAWING, debug-layer, ETW or driver diagnostics no longer report the rejected Desktop Duplication presentation readiness contract during the same scenario.
  • The application handles recurrence of DXGI_STATUS_DDA_WAS_STILL_DRAWING without an unbounded retry loop, leaked resource, duplicate composition target or stale topology handle.

Implementation notes for DXGI_STATUS_DDA_WAS_STILL_DRAWING

For DXGI_STATUS_DDA_WAS_STILL_DRAWING, log Present/Present1 result history, WM_SIZE or WM_DISPLAYCHANGE messages, swap-chain description and current IDXGIOutput identity. When the DXGI_STATUS_DDA_WAS_STILL_DRAWING path returns a count, size, status flag or replacement object, retain it even on a nonfatal result because it can direct the next call.

A production fallback for DXGI_STATUS_DDA_WAS_STILL_DRAWING should be explicit: pause rendering, re-enumerate, rebuild one cache entry, recreate a device, or decline a protected path only when this layer calls for that action. Reinstalling every display component, deleting all caches or forcing a resolution change is not an evidence-based fix for DXGI_STATUS_DDA_WAS_STILL_DRAWING.

Technical references


Looking for a different code? Search another status or error code.