Fixed sampler state ref leak.

This commit is contained in:
bkaradzic 2013-02-10 18:12:52 -08:00
parent e1a13b1bbf
commit d6cb01f72d
3 changed files with 29 additions and 9 deletions

View file

@ -34,6 +34,12 @@ namespace bgfx
#endif // BGFX_CONFIG_DEBUG #endif // BGFX_CONFIG_DEBUG
#if BGFX_CONFIG_DEBUG #if BGFX_CONFIG_DEBUG
# define DX_CHECK_REFCOUNT(_ptr, _expected) \
do { \
ULONG count = getRefCount(_ptr); \
BX_CHECK(_expected == count, "RefCount is %d (expected %d).", count, _expected); \
} while (0)
# define DX_RELEASE(_ptr, _expected) \ # define DX_RELEASE(_ptr, _expected) \
do { \ do { \
if (NULL != _ptr) \ if (NULL != _ptr) \
@ -44,6 +50,7 @@ namespace bgfx
} \ } \
} while (0) } while (0)
#else #else
# define DX_CHECK_REFCOUNT(_ptr, _expected)
# define DX_RELEASE(_ptr, _expected) \ # define DX_RELEASE(_ptr, _expected) \
do { \ do { \
if (NULL != _ptr) \ if (NULL != _ptr) \
@ -53,6 +60,13 @@ namespace bgfx
} \ } \
} while (0) } while (0)
#endif // BGFX_CONFIG_DEBUG #endif // BGFX_CONFIG_DEBUG
inline int getRefCount(IUnknown* _interface)
{
_interface->AddRef();
return _interface->Release();
}
} // namespace bgfx } // namespace bgfx
#endif // __RENDERER_D3D_H__ #endif // __RENDERER_D3D_H__

View file

@ -1423,6 +1423,7 @@ namespace bgfx
desc.MinLOD = 0; desc.MinLOD = 0;
desc.MaxLOD = D3D11_FLOAT32_MAX; desc.MaxLOD = D3D11_FLOAT32_MAX;
s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler); s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler);
DX_CHECK_REFCOUNT(m_sampler, 1);
s_renderCtx.m_samplerStateCache.add(_flags, m_sampler); s_renderCtx.m_samplerStateCache.add(_flags, m_sampler);
} }
@ -1750,6 +1751,12 @@ namespace bgfx
} }
} }
void Texture::destroy()
{
DX_RELEASE(m_srv, 0);
DX_RELEASE(m_ptr, 0);
}
void Texture::commit(uint8_t _stage) void Texture::commit(uint8_t _stage)
{ {
s_renderCtx.m_textureStage.m_srv[_stage] = m_srv; s_renderCtx.m_textureStage.m_srv[_stage] = m_srv;
@ -1834,7 +1841,11 @@ namespace bgfx
// DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_depthTexture, NULL, &m_srv) ); // DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_depthTexture, NULL, &m_srv) );
} }
m_sampler = s_renderCtx.m_samplerStateCache.find(_flags); _textureFlags &= BGFX_TEXTURE_MIN_MASK|BGFX_TEXTURE_MAG_MASK|BGFX_TEXTURE_MIP_MASK
| BGFX_TEXTURE_U_MASK|BGFX_TEXTURE_V_MASK|BGFX_TEXTURE_W_MASK
;
m_sampler = s_renderCtx.m_samplerStateCache.find(_textureFlags);
if (NULL == m_sampler) if (NULL == m_sampler)
{ {
D3D11_SAMPLER_DESC desc; D3D11_SAMPLER_DESC desc;
@ -1852,8 +1863,9 @@ namespace bgfx
desc.MinLOD = 0; desc.MinLOD = 0;
desc.MaxLOD = D3D11_FLOAT32_MAX; desc.MaxLOD = D3D11_FLOAT32_MAX;
s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler); s_renderCtx.m_device->CreateSamplerState(&desc, &m_sampler);
DX_CHECK_REFCOUNT(m_sampler, 1);
s_renderCtx.m_samplerStateCache.add(_flags, m_sampler); s_renderCtx.m_samplerStateCache.add(_textureFlags, m_sampler);
} }
} }

View file

@ -238,13 +238,7 @@ namespace bgfx
} }
void create(const Memory* _mem, uint32_t _flags); void create(const Memory* _mem, uint32_t _flags);
void destroy();
void destroy()
{
DX_RELEASE(m_srv, 0);
DX_RELEASE(m_ptr, 0);
}
void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem); void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem);
void commit(uint8_t _stage); void commit(uint8_t _stage);