Jump to content

  • Log In with Google      Sign In   
  • Create Account

rainsing

Member Since 25 Dec 2008
Offline Last Active Sep 28 2012 03:22 AM

Posts I've Made

In Topic: Tracking down D3D9 leaks

14 May 2012 - 01:08 AM

Phew, I finally get the problem solved.

We capture the states of the whole pipeline in a StateBlock before rendering our UI, and restore the states after it's done.

However, we didn't properly call Release() on this IDirect3DStateBlock9 when the application exits.

According to DirectX docs, plus an educated guess, I believe that this StateBlock holds a reference to basically every resource that's current bound to the driver, including all vertex streams, textures for all sampling stages, vertex and pixel shaders, etc. If you fail to release the StateBlock, all these resources won't get released. This perfectly explained why some of our vertex declarations and cubemaps leak even if we called Release() on them.

Thank you guys for providing valuable opinions along the way!

In Topic: Tracking down D3D9 leaks

13 May 2012 - 07:16 PM

Are you rendering to cube-maps at any point?


Nope. But I found that if we create the cubemap but don't use it at all(i.e. bind the cubemap using SetTexture()), it will be properly released. However, we do unbind all textures at the end of each frame.

In Topic: Tracking down D3D9 leaks

11 May 2012 - 05:53 AM

As I continue to investigate the problem, I found something weird.

I used PIX to record a diagnostic log. At the very last frame, where all D3D objects are being released, I found out that one of our cubemaps is released this way:

Frame 000098 ........PRE: IDirect3DCubeTexture9::Release()
Frame 000098 ........POST: <0> IDirect3DCubeTexture9::Release()

While other cubemaps are released like this:


Frame 000098 ........PRE: IDirect3DCubeTexture9::Release()
Frame 000098 ............PRE: RemoveObject(D3D9 Cube Texture, 0x062AAD30, 0x0018E6E0)
Frame 000098 ............POST: <> RemoveObject(D3D9 Cube Texture, 0x062AAD30, 0x0018E6E0)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x06272F60, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x06272F60, NULL)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x06272ED0, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x06272ED0, NULL)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x06272E40, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x06272E40, NULL)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x06272DB0, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x06272DB0, NULL)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x06272D20, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x06272D20, NULL)
Frame 000098 ............PRE: RemoveObject(D3D9 Surface, 0x062AAF18, NULL)
Frame 000098 ............POST: <> RemoveObject(D3D9 Surface, 0x062AAF18, NULL)
Frame 000098 ........POST: <0> IDirect3DCubeTexture9::Release()

The main difference here is that the latter call to IDirect3DCubeTexture9::Release() actually removed the texture object and all of its surfaces, but the first call did nothing.

And both of them returned a reference count of 0(<0>). That's why our sanity check on the return value of Release() can't catch this type of leak.

Of course, PIX marked the texture and the surfaces of the first cubemap as never destroyed, which means they are leaking.

In Topic: Tracking down D3D9 leaks

11 May 2012 - 01:03 AM

@Ripiz: Thanks for the tip. That's what I am starting to do now. I've completely lost in the irrelevance of the allocIDs.

In Topic: Tracking down D3D9 leaks

10 May 2012 - 09:38 PM

Well, the D3D debug runtime reports exactly the same allocIDs every time I run. I think this proves that our code is deterministic.


PARTNERS