[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