[D3D9] fix for SetFVF memleak [2nd try+patch]
Ivan Gyurdiev
ivg231 at gmail.com
Sat Oct 14 19:27:47 CDT 2006
Stefan Dösinger wrote:
> Am Samstag 14 Oktober 2006 20:53 schrieb Ivan Gyurdiev:
>
>> H. Verbeet wrote:
>>
>>> On 14/10/06, Ivan Gyurdiev <ivg231 at gmail.com> wrote:
>>>
>>>> Exactly... so why is the refcount 1 *after* GetVertexDeclaration.
>>>>
>>> Perhaps the declaration in only generated when calling
>>> GetVertexDeclaration(). If you call it twice, does it return the same
>>> pointer?
>>>
>> No.. I tried that too.
>> The same pointer is returned.
>>
> Perhaps windows has a static internal vertex declaration? Does the refcount
> increase when you call GetVertexDeclaration more often?
>
Yes, the refcount increases.
======================
Here's probably what it does:
-> SetFVF()... sets FVF
-> GetVertexDeclaration() ... vdecl is null, but there is an FVF, grab
the FVF, and make a declaration out of it. Store the declaration, and
return it to the caller with refcount 1.
-> GetVertexDeclaration() again - just grab the stored declaration and
follow regular code path, increasing the refcount.
Now, if the caller does not release the ref, it will leak memory [
because d3d certainly doesn't free it - not on SetFVF, or on
SetVertexDecl ]. On the other hand, if the caller does release it, will
it cause damage (1) on subsequent get calls? (2) at draw time... and how
can we test that.
This whole part of the API is very strange, and completely undocumented.
Perhaps those conversions don't matter at all in real applications. The
primary reason they fixed stuff, is probably that the FVF codepath
wasn't working together with shaders, so switching to decl internally
caused improvement.
More information about the wine-devel
mailing list