[PATCH 3/3] wined3d: Factor out buffer bo_user invalidation.

Henri Verbeet hverbeet at gmail.com
Mon Nov 1 09:20:28 CDT 2021


On Wed, 20 Oct 2021 at 07:28, Zebediah Figura <zfigura at codeweavers.com> wrote:
> +static void adapter_gl_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
> +{
> +    struct wined3d_context_gl *context_gl = wined3d_context_gl(context);
> +    struct wined3d_bo_gl *bo_gl = wined3d_bo_gl(bo);
> +
> +    if (context_gl->c.transform_feedback_active && bo_gl->binding == GL_TRANSFORM_FEEDBACK_BUFFER
> +            && wined3d_context_is_graphics_state_dirty(&context_gl->c, STATE_STREAM_OUTPUT))
> +    {
> +        /* It's illegal to (un)bind GL_TRANSFORM_FEEDBACK_BUFFER while transform
> +         * feedback is active. Deleting a buffer implicitly unbinds it, so we
> +         * need to end transform feedback here if this buffer was bound.
> +         *
> +         * This should only be possible if STATE_STREAM_OUTPUT is dirty; if we
> +         * do a draw call before destroying this buffer then the draw call will
> +         * already rebind the GL target. */
> +        WARN("Deleting buffer object %p, disabling transform feedback.\n", bo_gl);
> +        wined3d_context_gl_end_transform_feedback(context_gl);
> +    }
> +
Is there any particular reason this belongs in adapter_gl_destroy_bo()
instead of wined3d_context_gl_destroy_bo()?

> +static void adapter_vk_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
> +{
> +    struct wined3d_bo_vk *bo_vk = wined3d_bo_vk(bo);
> +
> +    wined3d_context_vk_destroy_bo(wined3d_context_vk(context), bo_vk);
> +    bo_vk->vk_buffer = VK_NULL_HANDLE;
> +    bo_vk->memory = NULL;
> +}
> +
Similarly, it seems somewhat arbitrary to clear the "vk_buffer" and
"memory" fields in adapter_vk_destroy_bo() instead of
wined3d_context_vk_destroy_bo().

> @@ -3370,6 +3380,7 @@ struct wined3d_adapter_ops
>              const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size);
>      void (*adapter_flush_bo_address)(struct wined3d_context *context,
>              const struct wined3d_const_bo_address *data, size_t size);
> +    void (*adapter_destroy_bo)(struct wined3d_context *context, struct wined3d_bo *bo);
>      HRESULT (*adapter_create_swapchain)(struct wined3d_device *device,
>              struct wined3d_swapchain_desc *desc,
>              struct wined3d_swapchain_state_parent *state_parent, void *parent,
> @@ -4982,8 +4993,6 @@ struct wined3d_buffer_ops
>  {
>      BOOL (*buffer_prepare_location)(struct wined3d_buffer *buffer,
>              struct wined3d_context *context, unsigned int location);
> -    void (*buffer_unload_location)(struct wined3d_buffer *buffer,
> -            struct wined3d_context *context, unsigned int location);
>      void (*buffer_upload_ranges)(struct wined3d_buffer *buffer, struct wined3d_context *context, const void *data,
>              unsigned int data_offset, unsigned int range_count, const struct wined3d_range *ranges);
>      void (*buffer_download_ranges)(struct wined3d_buffer *buffer, struct wined3d_context *context, void *data,

Is that the direction we want to go in? The original idea was to unify
wined3d_buffer_ops and wined3d_texture_ops, and then merge them into
wined3d_resource_ops. If there are additional reasons to introduce
adapter_destroy_bo(), perhaps that's fine though.



More information about the wine-devel mailing list