[PATCHv4 2/3] wined3d: Use an rbtree for storing shaders for texture format conversion/blitting

Martin Storsjö martin at martin.st
Mon Feb 17 06:21:10 CST 2014


On Fri, 14 Feb 2014, Henri Verbeet wrote:

> On 13 February 2014 13:05, Martin Storsjo <martin at martin.st> wrote:
>>  static HRESULT arbfp_blit_alloc(struct wined3d_device *device)
>>  {
>> +    struct arbfp_blit_priv *priv;
>>      device->blit_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct arbfp_blit_priv));
>>      if(!device->blit_priv) {
>>          ERR("Out of memory\n");
>>          return E_OUTOFMEMORY;
>>      }
>> +    priv = device->blit_priv;
>> +
>> +    if (wine_rb_init(&priv->shaders, &wined3d_arbfp_blit_rb_functions) == -1)
>> +    {
>> +        ERR("Failed to initialize rbtree.\n");
>> +        HeapFree(GetProcessHeap(), 0, device->blit_priv);
>> +        device->blit_priv = NULL;
>> +        return E_OUTOFMEMORY;
>> +    }
>> +
>>      return WINED3D_OK;
>>  }
>>
> The following is probably slightly nicer:
>
> static HRESULT arbfp_blit_alloc(struct wined3d_device *device)
> {
> -    device->blit_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
> sizeof(struct arbfp_blit_priv));
> -    if(!device->blit_priv) {
> -        ERR("Out of memory\n");
> +    struct arbfp_blit_priv *priv;
> +
> +    if (!(priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*priv))))
>         return E_OUTOFMEMORY;
> +
> +    if (wine_rb_init(&priv->shaders, &wined3d_arbfp_blit_rb_functions) == -1)
> +    {
> +        ERR("Failed to initialize rbtree.\n");
> +        HeapFree(GetProcessHeap(), 0, priv);
> +        return E_FAIL;
>     }
> +
> +    device->blit_priv = priv;
> +
>     return WINED3D_OK;
> }

That's nicer indeed, updated the patch accordingly locally.

>> +    if (desc)
>> +        HeapFree(GetProcessHeap(), 0, desc);
> There's no point in checking for NULL before HeapFree().

MSDN says "If this pointer is NULL, the behavior is undefined" about the 
lpMem parameter to HeapFree.

> Perhaps more importantly, I think it makes more sense to insert the 
> rbtree entries in arbfp_blit_set(), instead of duplicating the code 
> between gen_p8_shader() and gen_yuv_shader().

Good point, I've updated my patch accordingly.

I'll resend all three patches in a little while unless you or Stefan have 
got more comments at the moment.

// Martin



More information about the wine-devel mailing list