[PATCH 01/10] wined3d: Introduce struct wined3d_dirty_regions.

Stefan Dösinger stefandoesinger at gmail.com
Mon Apr 17 11:14:10 CDT 2017

Hi Masanori,

Thank you for your patches! I have a few comments:

Regarding the big picture I think it would be great if we had a scheme
that also worked for partially mapping resources. It's also necessary to
make the D3DLOCK_NO_DIRTY_UPDATE test on managed textures work. However,
doing this is a lot more work than your patchset and complicates
location management a lot.

If Henri tells you something different follow his advice. He is the
authority for decisions in d3d :-) .

Patch 1:
Am 2017-04-17 um 15:47 schrieb Masanori Kakura:
> +struct wined3d_dirty_regions
> +{
> +    UINT left;
> +    UINT top;
> +    UINT right;
> +    UINT bottom;
> +    UINT front;
> +    UINT back;
> +    struct wined3d_dirty_regions *next;
> +};
A standard wine list would be better IMHO.

Patch 2:
> diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
> index 785105d7b9..711f98a0a6 100644
> --- a/dlls/wined3d/wined3d_private.h
> +++ b/dlls/wined3d/wined3d_private.h
> @@ -2765,6 +2765,27 @@ struct wined3d_dirty_regions
>      struct wined3d_dirty_regions *next;
>  };
> +static inline BOOL wined3d_dirty_regions_add(struct wined3d_dirty_regions **regions,
> +        UINT left, UINT top, UINT right, UINT bottom, UINT front, UINT back)
I don't think we want this in the header file, I think it'd be better
placed in resource.c. Also note that buffers already have a related
mechanism (buffer->modified_areas).

You can predeclare the functions in the header if you need to call them
from multiple files.

> +{
> +    struct wined3d_dirty_regions *new_region;
> +
> +    if (!(new_region = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_dirty_regions))))
> +        return FALSE;
HeapAlloc is expensive. I think it is OK for the start, but in the long
run a way to keep some old dirty region elements around and reuse them
instead of always calling Alloc / Free.

Patch 5:
> +    if (!wined3d_dirty_regions_add(&resource->dirty_regions, 0, 0, width, height, 0, depth))
Why not use wined3d_resource_maximize_dirty_region here?

>      wined3d_resource_acquire(resource);
> +    wined3d_dirty_regions_clear(&resource->dirty_regions);
>      wined3d_cs_destroy_object(resource->device->cs, wined3d_resource_destroy_object, resource);
Regions need to be cleared from inside the cs thread in case there are
pending update_texture commands.

Similarly patch 6 needs to put the region modifying into

Patch 7:
> +                if (box->left < box->right && box->top < box->bottom && box->front < box->back)
> +                {
You don't need to check the box, texture_resource_sub_resource_map
already does it before it reaches this place of the code. See

Patch 8: I am not sure if this is necessary at all. In d3d9 it doesn't
matter because a UpdateSurface destination can never be an UpdateTexture

Patch 9/10: These should be merged, and I don't think patch 10 looks
right. I think dirty regions should be honored on sublevels as well,
just adjusted (i.e., divide by 2 for every level).

> +    if (src_texture->resource.width <= dst_texture->resource.width
> +            && src_texture->resource.height <= dst_texture->resource.height
> +            && src_texture->resource.depth <= dst_texture->resource.depth)
Why are you adding this check? Is it because the src_skip_levels broke
the if (i == 0) root level detection? If you apply the dirty region to
all levels this problem should go away.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20170417/d005b62e/attachment.sig>

More information about the wine-devel mailing list