[PATCH v2 4/4] d3dx9: Implement ID3DXEffect::CloneEffect().
Zebediah Figura
zfigura at codeweavers.com
Mon Feb 14 00:30:20 CST 2022
On 2/12/22 13:54, Matteo Bruni wrote:
>> @@ -199,6 +199,10 @@ struct d3dx_effect
>>
>> struct list parameter_block_list;
>> struct d3dx_parameter_block *current_parameter_block;
>> +
>> + char *source;
>> + SIZE_T source_size;
>> + char *skip_constants_string;
>
> Cloning the "skip constants" setting seems reasonable but I'd prefer
> to have a test confirming that.
Done in v3.
>> + case D3DXPT_SAMPLER:
>> + case D3DXPT_SAMPLER1D:
>> + case D3DXPT_SAMPLER2D:
>> + case D3DXPT_SAMPLER3D:
>> + case D3DXPT_SAMPLERCUBE:
>> + case D3DXPT_PIXELSHADER:
>> + case D3DXPT_VERTEXSHADER:
>> + /* Nothing to do; these parameters are not mutable. */
>> + break;
>
> The test doesn't confirm that those are just recreated from scratch
> (rather than e.g. shared with the original effect). Can we add some
> tests for this?
Shaders are in fact shared if possible. Unless I'm misreading though,
there's no way for samplers to be shared.
>> + dst->manager = src->manager;
>> + if (dst->manager)
>> + dst->manager->lpVtbl->AddRef(dst->manager);
>
> Again, this makes perfect sense but a test would make it foolproof.
This one, surprisingly enough, is wrong.
>> + if (!(effect->source = malloc(data_size)))
>> + return E_OUTOFMEMORY;
>> + memcpy(effect->source, data, data_size);
>> + effect->source_size = data_size;
>> +
>
> We should probably do this only if D3DXFX_NOT_CLONEABLE is not set.
>
>> if (pool)
>> {
>> effect->pool = unsafe_impl_from_ID3DXEffectPool(pool);
>> @@ -6429,6 +6546,12 @@ static HRESULT d3dx9_effect_init_from_dxbc(struct d3dx_effect *effect,
>>
>> if (skip_constants_string)
>> {
>> + if (!(effect->skip_constants_string = strdup(skip_constants_string)))
>> + {
>> + hr = E_OUTOFMEMORY;
>> + goto fail;
>> + }
>> +
>
> Same here.
Both done in v3.
More information about the wine-devel
mailing list