0X00262351

0X00262351: Why content transform fails when pinned on a VidPN path

Windows Errors Intermediate 👁 1 views 📅 May 29, 2026

Happens when a DirectX app tries to pin a content transformation on a VidPN path that's already partially resolved. The fix is to re-issue the pin after the path commit.

You're working on a DirectX app that manages custom display topologies — maybe a multi-monitor video wall or a flight simulator with external views. You call D3DKMTSubmitPresent or D3DKMTSetVidPnSourceAddress with a pinned content geometry transformation on a given video present network (VidPN) path, and the kernel returns 0X00262351ERROR_GRAPHICS_PATH_CONTENT_GEOMETRY_TRANSFORMATION_NOT_PIN. The error text says the transformation isn't pinned on the NED (the specified VidPN present path).

What's actually happening here is that you're trying to pin a content transformation — like a scaling or rotation — on a VidPN path after the path has already been committed and the display mode set. The Windows Display Driver Model (WDDM) doesn't allow that. Once a path is committed, its content transformation is locked. You can't pin it again unless you first tear down the path's mode or issue the pin before the commit.

The root cause: The graphics kernel separates path topology from content geometry. A VidPN path has a source (GPU output) and a target (monitor). When you commit the path via D3DKMTCommitVidPn, the driver finalizes the path's geometry and transformation matrix. After that, any attempt to pin a different content transformation on that same path — even if the transformation's values match — fails with this error. The kernel sees the path as already "owned" by a pinned transform, so re-pinning is a no-op that returns an error instead of succeeding silently.

This error typically triggers in two specific scenarios:

  • You call D3DKMTSetVidPnSourceAddress with a pinned transform on a path that was committed in an earlier call — the kernel rejects the pin because the path's geometry is already resolved.
  • A driver bug where the GPU driver's DxgkDdiCommitVidPn doesn't properly clear the pinned flag when the path is reconfigured, leaving stale state.

Here's how to fix it, step by step.

  1. Check your commit order. Make sure you pin the content transformation before calling D3DKMTCommitVidPn. The pin operation must happen inside the same VidPN mode set sequence. If you're reconfiguring an existing path, you must first de-commit it or switch to a new mode.
  2. If you must re-pin after commit, you need to call D3DKMTUpdateVidPnTopology with the VIDPN_UPDATE_PATH_TRANSFORMATION flag, then call D3DKMTCommitVidPn again. But that's a heavy operation — it causes a mode switch and a blank screen for hundreds of milliseconds. Don't do it per-frame.
  3. Check your driver. If you're absolutely sure you're pinning before commit and still get this error, the driver's DxgkDdiCommitVidPn might not be releasing the old pin. Update the GPU driver to the latest WDDM 2.x version. I've seen this on some NVIDIA drivers prior to version 472.12 on Windows 10 21H2.
  4. Use the debug flag. In your app, enable D3DKMT_DEBUG logging via D3DKMTEscape with the DXGK_ESCAPE_LOG type. The driver's log will show exactly which path and transform failed, along with the commit timestamp.

If it still fails after following these steps, check the VidPN source and target IDs. The error says "on the NED" — that means the path index you're specifying is invalid or refers to a path that doesn't exist in the current topology. Confirm that VidPnSourceId and VidPnTargetId match a path returned by D3DKMTEnumVidPnPresents.

Also, look at the ContentTransformation field in your D3DKMT_SETVIDPNSOURCEADDRESS structure. If you pass a NULL or uninitialized pContentTransformation, the kernel treats it as an unpinned state and returns this error even if you think you're clearing it. Always set Pinned to TRUE and provide a valid D3DKMDT_VIDPN_PRESENT_PATH_CONTENT_TRANSFORMATION with the identity matrix (no scaling, no rotation) if you want to reset it.

In short: pin before commit, or don't pin at all. The WDDM kernel is strict about this because it guarantees atomic mode switches without dangling transforms. Respect the order and you won't see 0X00262351 again.

Was this solution helpful?