[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: [PATCH] wined3d: Always try to create a hardware cursor.
From:       Zebediah Figura <z.figura12 () gmail ! com>
Date:       2019-06-30 13:48:53
Message-ID: 58302bd4-1bad-b51f-9d82-4deae2bcd58e () gmail ! com
[Download RAW message or body]

I guess the behaviour may have changed. I tested on Windows 10, and in 
both windowed and fullscreen mode I got a scaled 32x32 HW cursor. I also 
tested with a reduced testcase [essentially adapting test_cursor()] and 
I was never able to get a SW cursor. Or at least, it was always scaled 
to 32x32, and it always moved without me making any calls to d3d9.

I'd test with Windows 7 or something earlier, but I don't have immediate 
access to any such machine myself.

On 6/30/19 5:04 AM, Stefan Dösinger wrote:
> 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@codeweavers.com>:
> > 
> > From: Zebediah Figura <z.figura12@gmail.com>
> > 
> > Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47386
> > Signed-off-by: Zebediah Figura <z.figura12@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
> > 
> > 
> > 
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic