[PATCH] wined3d: Always try to create a hardware cursor.

Stefan Dösinger stefandoesinger at gmail.com
Sun Jun 30 05:04:57 CDT 2019


If my memory of my own experiments are right then what your patch does is correct for windowed mode. In Windowed mode native d3d9 never renders an SW cursor and instead creates a scaled HW cursor.

In fullscreen mode I do get a (non-moving by default) SW cursor for a 64x64 texture, or at least used to when I tested it on Windows 7 years ago. The behavior might have changed. Since comment 7 on bug 47386 indicates that the game calls SetCursorProperties over and over it might be the correct thing to update the cursor position to the current user32 cursor pos in SetCursorProperties.

How does the cursor appear on Windows? Does it look like a 32x32 or 64x64 cursor? Also keep in mind the possibility that the cursor is a 64x64 one where only a 32x32 part of the texture contains non-transparent data.

> Am 29.06.2019 um 01:46 schrieb Zebediah Figura <zfigura at codeweavers.com>:
> 
> From: Zebediah Figura <z.figura12 at gmail.com>
> 
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47386
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
> dlls/wined3d/device.c | 65 +++++++++++++++++++++----------------------
> 1 file changed, 31 insertions(+), 34 deletions(-)
> 
> diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
> index d35a0648c9c..39dd93e11b7 100644
> --- a/dlls/wined3d/device.c
> +++ b/dlls/wined3d/device.c
> @@ -5216,9 +5216,12 @@ HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device
>         UINT x_hotspot, UINT y_hotspot, struct wined3d_texture *texture, unsigned int sub_resource_idx)
> {
>     unsigned int texture_level = sub_resource_idx % texture->level_count;
> -    unsigned int cursor_width, cursor_height;
> +    unsigned int cursor_width, cursor_height, mask_size;
>     struct wined3d_display_mode mode;
>     struct wined3d_map_desc map_desc;
> +    ICONINFO cursor_info;
> +    DWORD *mask_bits;
> +    HCURSOR cursor;
>     HRESULT hr;
> 
>     TRACE("device %p, x_hotspot %u, y_hotspot %u, texture %p, sub_resource_idx %u.\n",
> @@ -5268,43 +5271,37 @@ HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device
>         return WINED3DERR_INVALIDCALL;
>     }
> 
> -    if (cursor_width == 32 && cursor_height == 32)
> -    {
> -        UINT mask_size = cursor_width * cursor_height / 8;
> -        ICONINFO cursor_info;
> -        DWORD *mask_bits;
> -        HCURSOR cursor;
> +    mask_size = cursor_width * cursor_height / 8;
> 
> -        /* 32-bit user32 cursors ignore the alpha channel if it's all
> -         * zeroes, and use the mask instead. Fill the mask with all ones
> -         * to ensure we still get a fully transparent cursor. */
> -        if (!(mask_bits = heap_alloc(mask_size)))
> -            return E_OUTOFMEMORY;
> -        memset(mask_bits, 0xff, mask_size);
> +    /* 32-bit user32 cursors ignore the alpha channel if it's all
> +     * zeroes, and use the mask instead. Fill the mask with all ones
> +     * to ensure we still get a fully transparent cursor. */
> +    if (!(mask_bits = heap_alloc(mask_size)))
> +        return E_OUTOFMEMORY;
> +    memset(mask_bits, 0xff, mask_size);
> 
> -        wined3d_resource_map(&texture->resource, sub_resource_idx, &map_desc, NULL,
> -                WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READ);
> -        cursor_info.fIcon = FALSE;
> -        cursor_info.xHotspot = x_hotspot;
> -        cursor_info.yHotspot = y_hotspot;
> -        cursor_info.hbmMask = CreateBitmap(cursor_width, cursor_height, 1, 1, mask_bits);
> -        cursor_info.hbmColor = CreateBitmap(cursor_width, cursor_height, 1, 32, map_desc.data);
> -        wined3d_resource_unmap(&texture->resource, sub_resource_idx);
> +    wined3d_resource_map(&texture->resource, sub_resource_idx, &map_desc, NULL,
> +            WINED3D_MAP_NO_DIRTY_UPDATE | WINED3D_MAP_READ);
> +    cursor_info.fIcon = FALSE;
> +    cursor_info.xHotspot = x_hotspot;
> +    cursor_info.yHotspot = y_hotspot;
> +    cursor_info.hbmMask = CreateBitmap(cursor_width, cursor_height, 1, 1, mask_bits);
> +    cursor_info.hbmColor = CreateBitmap(cursor_width, cursor_height, 1, 32, map_desc.data);
> +    wined3d_resource_unmap(&texture->resource, sub_resource_idx);
> 
> -        /* Create our cursor and clean up. */
> -        cursor = CreateIconIndirect(&cursor_info);
> -        if (cursor_info.hbmMask)
> -            DeleteObject(cursor_info.hbmMask);
> -        if (cursor_info.hbmColor)
> -            DeleteObject(cursor_info.hbmColor);
> -        if (device->hardwareCursor)
> -            DestroyCursor(device->hardwareCursor);
> -        device->hardwareCursor = cursor;
> -        if (device->bCursorVisible)
> -            SetCursor(cursor);
> +    /* Create our cursor and clean up. */
> +    cursor = CreateIconIndirect(&cursor_info);
> +    if (cursor_info.hbmMask)
> +        DeleteObject(cursor_info.hbmMask);
> +    if (cursor_info.hbmColor)
> +        DeleteObject(cursor_info.hbmColor);
> +    if (device->hardwareCursor)
> +        DestroyCursor(device->hardwareCursor);
> +    device->hardwareCursor = cursor;
> +    if (device->bCursorVisible)
> +        SetCursor(cursor);
> 
> -        heap_free(mask_bits);
> -    }
> +    heap_free(mask_bits);
> 
>     TRACE("New cursor dimensions are %ux%u.\n", cursor_width, cursor_height);
>     device->cursorWidth = cursor_width;
> --
> 2.20.1
> 
> 
> 

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


More information about the wine-devel mailing list