[PATCH 6/8] d3d11: Implement ID3D11DeviceContext::FinishCommandList().

Henri Verbeet hverbeet at gmail.com
Wed May 26 11:35:40 CDT 2021


On Wed, 26 May 2021 at 07:23, Zebediah Figura <z.figura12 at gmail.com> wrote:
> +struct d3d11_command_list
> +{
> +    ID3D11CommandList ID3D11CommandList_iface;
> +    LONG refcount;
> +
> +    ID3D11Device *device;
> +    struct wined3d_command_list *wined3d_list;
> +    struct wined3d_private_store private_store;
> +};
[...]
> +static void STDMETHODCALLTYPE d3d11_command_list_GetDevice(ID3D11CommandList *iface, ID3D11Device **device)
> +{
> +    struct d3d11_command_list *list = impl_from_ID3D11CommandList(iface);
> +
> +    TRACE("iface %p, device %p.\n", iface, device);
> +
> +    *device = (ID3D11Device *)list->device;
> +    ID3D11Device_AddRef(*device);
> +}
The cast seems superfluous, but an argument could also be made for
storing an ID3D11Device2 pointer in struct d3d11_command_list, like we
do for most other d3d11 objects.

> @@ -2629,9 +2746,44 @@ static UINT STDMETHODCALLTYPE d3d11_device_context_GetContextFlags(ID3D11DeviceC
>  static HRESULT STDMETHODCALLTYPE d3d11_device_context_FinishCommandList(ID3D11DeviceContext1 *iface,
>          BOOL restore, ID3D11CommandList **command_list)
>  {
> +    struct d3d11_device_context *context = impl_from_ID3D11DeviceContext1(iface);
> +    struct d3d11_command_list *object;
> +    HRESULT hr;
> +
>      TRACE("iface %p, restore %#x, command_list %p.\n", iface, restore, command_list);
>
> -    return DXGI_ERROR_INVALID_CALL;
> +    if (context->type == D3D11_DEVICE_CONTEXT_IMMEDIATE)
> +    {
> +        WARN("Attempt to record command list on an immediate context; returning DXGI_ERROR_INVALID_CALL.\n");
> +        return DXGI_ERROR_INVALID_CALL;
> +    }
> +
> +    if (!(object = heap_alloc_zero(sizeof(*object))))
> +        return E_OUTOFMEMORY;
> +
> +    object->ID3D11CommandList_iface.lpVtbl = &d3d11_command_list_vtbl;
> +    object->refcount = 1;
> +    object->device = (ID3D11Device *)&context->device->ID3D11Device2_iface;
> +    wined3d_private_store_init(&object->private_store);
> +
... in which case we could get rid of the cast above instead.

> +    wined3d_mutex_lock();
> +
> +    if (FAILED(hr = wined3d_deferred_context_record_command_list(context->wined3d_context,
> +            restore, &object->wined3d_list)))
> +    {
> +        WARN("Failed to record wined3d command list, hr %#x.\n", hr);
> +        heap_free(object);
> +        return hr;
> +    }
> +
That's missing a wined3d_private_store_cleanup(), strictly speaking.
It wouldn't do anything in this case, but that's an implementation
detail, and subject to future change.

> +    ID3D11Device2_AddRef(&context->device->ID3D11Device2_iface);
> +
That should probably be "ID3D11Device_AddRef(object->device);".

> +HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device_context *context,
> +        BOOL restore, struct wined3d_command_list **list)
> +{
bool, probably.



More information about the wine-devel mailing list