I have code in **OpenGL** that uses `glReadPixels` to copy the depth buffer to a CPU memory buffer:

```
glReadPixels(0, 0, w, h, GL_DEPTH_COMPONENT, GL_FLOAT, dbuf);

```

How do I achieve the same in Direct3D?

I have looked at a similar [question](https://gamedev.stackexchange.com/questions/41958/how-to-capture-the-screen-in-directx-9-to-a-raw-bitmap-in-memory-without-using-d) which gives a solution for copying the *color* buffer. I've tried to write similar code to copy the depth buffer:

```
IDirect3DSurface9* d3dSurface;
d3dDevice->GetDepthStencilSurface(&d3dSurface);

D3DSURFACE_DESC d3dSurfaceDesc;
d3dSurface->GetDesc(&d3dSurfaceDesc);

IDirect3DSurface9* d3dOffSurface;
  d3dDevice->CreateOffscreenPlainSurface(
  d3dSurfaceDesc.Width,
  d3dSurfaceDesc.Height,
  D3DFMT_D32F_LOCKABLE,
  D3DPOOL_SCRATCH,
  &d3dOffSurface,
  NULL
);

// FAILS: D3DERR_INVALIDCALL
D3DXLoadSurfaceFromSurface(
  d3dOffSurface,
  NULL,
  NULL,
  d3dSurface,
  NULL,
  NULL,
  D3DX_FILTER_NONE,
  0
);

// Copy from offscreen surface to CPU memory ...

```

The code fails on the call to `D3DXLoadSurfaceFromSurface`. It returns the error value `D3DERR_INVALIDCALL`.

So, is something wrong with my code? How can I copy the depth buffer contents?