I'm writing a program w/directX api. I'm beginning to use DXUT. I'm having problems when trying to control the reference count of the directX device. It seems that everytime I call D3DXCreateMesh(), D3DXCreateTextureFromFile() or IDirect3DDevice9::CreateVertexBuffer() a reference is added to the device. I've tried using "SYSTEMMEM" flags to store the newly created object(mesh, texture, or vertex buffer) in the system's memory as opposed to storing it within the device's allotment. Here is an example of a call that has added a reference to the device...
DWORD dwNumFaces = 1, dwNumVertices = 3, dwOptions |= D3DXMESH_SYSTEMMEM;
D3DVERTEXELEMENT9 mesh_decl
{
...
}
ID3DXMESH *pMesh = NULL;
D3DXCreateMesh(dwNumFaces, dwNumVertices, dwOptions, mesh_decl, m_pd3dDevice, &pMesh);
Any ideas or link to info concerning this issue? Is this to be expected? The solution so far has been to release the device (m_pd3dDevice->Release()) directly after each call to the above functions. When DXUT tries to release the device, an error is thrown that says the reference count for the device is greater than zero.
Every mesh is associated with a device. The device must live for at least as long as the Mesh.
When you release the mesh with pMesh->Release()
, on the final release, the mesh will be destroyed. When that happens, the Mesh will in turn call Release()
on the device. This ensures that as long as there is a Mesh, the device will still exist.
That is how it is supposed to work, regardless of whether system or device memory is used.
A mesh is not just a bunch of triangles - it is a bunch of triangles which are pre-calculated, tweaked, cached, and optimised for display on a particular device. That's why they have a reference to the device - it's the device they are optimised for. You can't just move them to another device.
Bottom Line: The reference count must be the correct reference count - it should be the count of references to the object. Since each Mesh has a reference to the object, it is correct that the reference count should increase when you create a mesh, and reduce when you destroy one.
If you "Control" the reference count, the result will be that it will be incorrect, and Bad Things will happen.