[PATCH 3/3] wined3d: Factor out buffer bo_user invalidation.
Zebediah Figura (she/her)
zfigura at codeweavers.com
Mon Nov 1 15:10:59 CDT 2021
On 11/1/21 09:20, Henri Verbeet wrote:
> 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().
The answer to both of these is "well, wined3d_context_*_destroy_bo()
didn't already do those things". That could be changed, though.
>
>> @@ -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.
>
I guess not really. I don't think I had a particular reason for this
commit except to effect some deduplication.
Of course we could do a similar thing with textures, but there are quite
a few more locations to deal with...
I'll just drop the patch.
More information about the wine-devel
mailing list