[PATCH 1/5] d3d11: Add stub implementation for CreateDeviceContextState.
Henri Verbeet
hverbeet at gmail.com
Mon Jan 25 08:08:01 CST 2021
On Thu, 21 Jan 2021 at 20:13, Rémi Bernon <rbernon at codeweavers.com> wrote:
> +static inline struct d3d_device *device_from_ID3DDeviceContextState(ID3DDeviceContextState *iface)
> +{
> + struct d3d_device_context_state *state = impl_from_ID3DDeviceContextState(iface);
> + return impl_from_ID3D11Device2(state->device);
> +}
> +
You don't need this. For example, in
d3d_device_context_state_AddRef(), you could simply do:
ID3D11Device2_AddRef(state->device);
> +static HRESULT STDMETHODCALLTYPE d3d_device_context_state_QueryInterface(ID3DDeviceContextState *iface,
> + REFIID iid, void **out)
> +{
> + struct d3d_device_context_state *state = impl_from_ID3DDeviceContextState(iface);
> +
> + TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
> +
> + if (IsEqualGUID(iid, &IID_ID3DDeviceContextState)
> + || IsEqualGUID(iid, &IID_ID3D11DeviceChild)
> + || IsEqualGUID(iid, &IID_IUnknown))
> + {
> + *out = &state->ID3DDeviceContextState_iface;
> + }
> + else
> + {
> + WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
> + *out = NULL;
> + return E_NOINTERFACE;
> + }
> +
> + ID3DDeviceContextState_AddRef(iface);
> + return S_OK;
> +}
> +
This can be simplified; you don't need the "state" variable.
> +static ULONG STDMETHODCALLTYPE d3d_device_context_state_AddRef(ID3DDeviceContextState *iface)
> +{
> + struct d3d_device_context_state *state = impl_from_ID3DDeviceContextState(iface);
> + struct d3d_device *device = device_from_ID3DDeviceContextState(iface);
> + ULONG refcount = InterlockedIncrement(&state->refcount);
> +
> + TRACE("%p increasing refcount to %u.\n", state, refcount);
> +
> + if (refcount == 1)
> + {
> + ID3D11Device2_AddRef(&device->ID3D11Device2_iface);
> + }
Can this happen?
> +static ULONG STDMETHODCALLTYPE d3d_device_context_state_Release(ID3DDeviceContextState *iface)
> +{
> + struct d3d_device_context_state *state = impl_from_ID3DDeviceContextState(iface);
> + struct d3d_device *device = device_from_ID3DDeviceContextState(iface);
> + ULONG refcount = InterlockedDecrement(&state->refcount);
> +
> + TRACE("%p decreasing refcount to %u.\n", state, refcount);
> +
> + if (!refcount)
> + {
> + wined3d_private_store_cleanup(&state->private_store);
> + ID3D11Device2_Release(&device->ID3D11Device2_iface);
> + }
> +
> + return refcount;
> +}
> +
You leak the "state" object here.
> +static void STDMETHODCALLTYPE d3d_device_context_state_GetDevice(ID3DDeviceContextState *iface, ID3D11Device **device)
> +{
> + struct d3d_device *device_object = device_from_ID3DDeviceContextState(iface);
> +
> + TRACE("iface %p, device %p.\n", iface, device);
> +
> + *device = (ID3D11Device *)&device_object->ID3D11Device2_iface;
> + ID3D11Device_AddRef(*device);
> +}
> +
"*device = (ID3D11Device *)state->device;"
More information about the wine-devel
mailing list