2 Copyright � 1995-2019, The AROS Development Team. All rights reserved.
5 Desc: Class for VMWare.
13 #include <aros/debug.h>
15 #define __OOP_NOATTRBASES__
17 #include <proto/exec.h>
18 #include <proto/oop.h>
19 #include <proto/utility.h>
20 #include <aros/symbolsets.h>
21 #include <devices/inputevent.h>
22 #include <exec/alerts.h>
23 #include <exec/memory.h>
24 #include <hardware/custom.h>
25 #include <hidd/hidd.h>
28 #include <clib/alib_protos.h>
32 #include "vmwaresvga_intern.h"
34 #include LC_LIBDEFS_FILE
38 #define DESCRIPTORNAME_LEN 32
40 static OOP_AttrBase HiddAttrBase
;
41 static OOP_AttrBase HiddBitMapAttrBase
;
42 static OOP_AttrBase HiddPixFmtAttrBase
;
43 static OOP_AttrBase HiddGfxAttrBase
;
44 static OOP_AttrBase HiddSyncAttrBase
;
45 static OOP_AttrBase HiddVMWareSVGAAttrBase
;
46 static OOP_AttrBase HiddVMWareSVGABitMapAttrBase
;
48 static struct OOP_ABDescr attrbases
[] =
50 {IID_Hidd
, &HiddAttrBase
},
51 {IID_Hidd_BitMap
, &HiddBitMapAttrBase
},
52 {IID_Hidd_VMWareSVGABitMap
, &HiddVMWareSVGABitMapAttrBase
},
53 {IID_Hidd_VMWareSVGA
, &HiddVMWareSVGAAttrBase
},
54 {IID_Hidd_PixFmt
, &HiddPixFmtAttrBase
},
55 {IID_Hidd_Sync
, &HiddSyncAttrBase
},
56 {IID_Hidd_Gfx
, &HiddGfxAttrBase
},
60 STATIC ULONG
mask_to_shift(ULONG mask
)
64 for (i
= 32; mask
; i
--) {
75 OOP_Object
*VMWareSVGA__Root__New(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_New
*msg
)
77 unsigned int sync_count
, sync_modes
, sync_curr
, sync_displayid
, sync_modeid
;
78 ULONG max_width
, max_height
;
80 struct TagItem pftags
[] =
82 {aHidd_PixFmt_RedShift
, 0 }, /* 0 */
83 {aHidd_PixFmt_GreenShift
, 0 }, /* 1 */
84 {aHidd_PixFmt_BlueShift
, 0 }, /* 2 */
85 {aHidd_PixFmt_AlphaShift
, 0 }, /* 3 */
86 {aHidd_PixFmt_RedMask
, 0 }, /* 4 */
87 {aHidd_PixFmt_GreenMask
, 0 }, /* 5 */
88 {aHidd_PixFmt_BlueMask
, 0 }, /* 6 */
89 {aHidd_PixFmt_AlphaMask
, 0 }, /* 7 */
90 {aHidd_PixFmt_ColorModel
, 0 }, /* 8 */
91 {aHidd_PixFmt_Depth
, 0 }, /* 9 */
92 {aHidd_PixFmt_BytesPerPixel
, 0 }, /* 10 */
93 {aHidd_PixFmt_BitsPerPixel
, 0 }, /* 11 */
94 {aHidd_PixFmt_StdPixFmt
, 0 }, /* 12 */
95 {aHidd_PixFmt_CLUTShift
, 0 }, /* 13 */
96 {aHidd_PixFmt_CLUTMask
, 0x0f }, /* 14 */
97 {aHidd_PixFmt_BitMapType
, 0 }, /* 15 */
101 /* TODO: Probe available sync modes */
102 #define VMWARESVGA_SYNCMODES 12
103 sync_modes
= VMWARESVGA_SYNCMODES
;
105 // TODO: We don't really support multiple displays. We'll switch this back on when we can handle it
106 sync_count
= sync_modes
;// * XSD(cl)->data.displaycount;
108 struct TagItem
*modetags
= AllocVec((sync_count
+ 2) * sizeof(struct TagItem
), MEMF_CLEAR
);
110 modetags
[0].ti_Tag
= aHidd_Gfx_PixFmtTags
;
111 modetags
[0].ti_Data
= (IPTR
)pftags
;
112 modetags
[sync_count
+ 1].ti_Tag
= TAG_DONE
;
117 max_width
= vmwareReadReg(&XSD(cl
)->data
, SVGA_REG_MAX_WIDTH
);
118 max_height
= vmwareReadReg(&XSD(cl
)->data
, VGA_REG_MAX_HEIGHT
);
121 while (sync_curr
< sync_count
)
123 sync_modeid
= sync_curr
% sync_modes
;
124 sync_displayid
= sync_curr
/sync_modes
;
129 DINFO(bug("[VMWareSVGA] %s: Setting Sync Mode %d for Display %d\n", __func__
, sync_modeid
, sync_displayid
));
131 char *sync_Description
= AllocVec(DESCRIPTORNAME_LEN
, MEMF_CLEAR
);
185 if (sync_displayid
== 0)
187 sprintf(sync_Description
, "VMWareSVGA:%dx%d", sync_Width
, sync_Height
);
191 sprintf(sync_Description
, "VMWareSVGA.%d:%dx%d", sync_displayid
, sync_Width
, sync_Height
);
193 DINFO(bug("[VMWareSVGA] %s: Description '%s'\n", __func__
, sync_Description
));
195 struct TagItem
*sync_mode
= AllocVec(11 * sizeof(struct TagItem
), MEMF_CLEAR
);
197 sync_mode
[0].ti_Tag
= aHidd_Sync_Description
;
198 sync_mode
[0].ti_Data
= (IPTR
)sync_Description
;
199 sync_mode
[1].ti_Tag
= aHidd_Sync_PixelClock
;
200 sync_mode
[2].ti_Tag
= aHidd_Sync_HDisp
;
201 sync_mode
[2].ti_Data
= sync_Width
;
202 sync_mode
[3].ti_Tag
= aHidd_Sync_VDisp
;
203 sync_mode
[3].ti_Data
= sync_Height
;
204 sync_mode
[4].ti_Tag
= aHidd_Sync_HSyncStart
;
205 sync_mode
[5].ti_Tag
= aHidd_Sync_HSyncEnd
;
206 sync_mode
[6].ti_Tag
= aHidd_Sync_HTotal
;
207 sync_mode
[7].ti_Tag
= aHidd_Sync_VSyncStart
;
208 sync_mode
[8].ti_Tag
= aHidd_Sync_VSyncEnd
;
209 sync_mode
[9].ti_Tag
= aHidd_Sync_VTotal
;
210 sync_mode
[10].ti_Tag
= TAG_DONE
;
212 modetags
[1 + sync_curr
].ti_Tag
= aHidd_Gfx_SyncTags
;
213 modetags
[1 + sync_curr
].ti_Data
= (IPTR
)sync_mode
;
218 struct TagItem yourtags
[] =
220 {aHidd_Gfx_ModeTags
, (IPTR
)modetags
},
221 { aHidd_Name
, (IPTR
)"VMWareSVGA" },
222 { aHidd_HardwareName
, (IPTR
)"VMWare SVGA Gfx Adaptor" },
223 { aHidd_ProducerName
, (IPTR
)"VMWare Inc" },
226 struct pRoot_New yourmsg
;
229 if (!XSD(cl
)->data
.pseudocolor
)
231 pftags
[0].ti_Data
= mask_to_shift(XSD(cl
)->data
.redmask
);
232 pftags
[1].ti_Data
= mask_to_shift(XSD(cl
)->data
.greenmask
);
233 pftags
[2].ti_Data
= mask_to_shift(XSD(cl
)->data
.bluemask
);
237 pftags
[0].ti_Data
= 0;
238 pftags
[1].ti_Data
= 0;
239 pftags
[2].ti_Data
= 0;
241 pftags
[3].ti_Data
= 0;
242 pftags
[4].ti_Data
= XSD(cl
)->data
.redmask
;
243 pftags
[5].ti_Data
= XSD(cl
)->data
.greenmask
;
244 pftags
[6].ti_Data
= XSD(cl
)->data
.bluemask
;
245 pftags
[7].ti_Data
= 0;
246 DINFO(bug("[VMWareSVGA] New: Masks red=%08x<<%d,green=%08x<<%d,blue%08x<<%d\n",
247 pftags
[4].ti_Data
, pftags
[0].ti_Data
,
248 pftags
[5].ti_Data
, pftags
[1].ti_Data
,
249 pftags
[6].ti_Data
, pftags
[2].ti_Data
));
251 if (XSD(cl
)->data
.pseudocolor
)
252 pftags
[8].ti_Data
= vHidd_ColorModel_Palette
;
254 pftags
[8].ti_Data
= vHidd_ColorModel_TrueColor
;
256 pftags
[9].ti_Data
= XSD(cl
)->data
.depth
;
257 pftags
[10].ti_Data
= XSD(cl
)->data
.bytesperpixel
;
258 pftags
[11].ti_Data
= XSD(cl
)->data
.bitsperpixel
;
259 pftags
[12].ti_Data
= vHidd_StdPixFmt_Native
;
260 pftags
[15].ti_Data
= vHidd_BitMapType_Chunky
;
262 yourtags
[1].ti_Data
= (IPTR
)msg
->attrList
;
264 yourmsg
.mID
= msg
->mID
;
265 yourmsg
.attrList
= yourtags
;
267 EnterFunc(bug("[VMWareSVGA] New()\n"));
268 o
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
271 DINFO(bug("[VMWareSVGA] %s: object @ 0x%p\n", __func__
, o
);)
273 XSD(cl
)->vmwaresvgahidd
= o
;
274 XSD(cl
)->mouse
.shape
= NULL
;
276 bug("[VMWareSVGA] %s: Device capabilities: %08x\n", __func__
, XSD(cl
)->data
.capabilities
);
277 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_IRQMASK
)
278 bug("[VMWareSVGA] %s: IRQ Mask\n", __func__
);
279 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_EXTENDED_FIFO
)
280 bug("[VMWareSVGA] %s: Extended FIFO\n", __func__
);
281 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_CURSOR
)
282 bug("[VMWareSVGA] %s: HW Cursor\n", __func__
);
283 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_ALPHA_CURSOR
)
284 bug("[VMWareSVGA] %s: Alpha Cursor\n", __func__
);
285 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_CURSOR_BYPASS
)
286 bug("[VMWareSVGA] %s: Cursor-Bypass\n", __func__
);
287 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_CURSOR_BYPASS_2
)
288 bug("[VMWareSVGA] %s: Cursor-Bypass2\n", __func__
);
289 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_RECT_COPY
)
290 bug("[VMWareSVGA] %s: Copy Rect\n", __func__
);
291 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_8BIT_EMULATION
)
292 bug("[VMWareSVGA] %s: 8bit-emu\n", __func__
);
293 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_3D
)
294 bug("[VMWareSVGA] %s: 3D.\n", __func__
);
295 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_MULTIMON
)
296 bug("[VMWareSVGA] %s: Multimon\n", __func__
);
297 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_DISPLAY_TOPOLOGY
)
298 bug("[VMWareSVGA] %s: Display Topology\n", __func__
);
299 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_PITCHLOCK
)
300 bug("[VMWareSVGA] %s: Pitchlock\n", __func__
);
301 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_GMR
)
302 bug("[VMWareSVGA] %s: GMR\n", __func__
);
303 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_GMR2
)
304 bug("[VMWareSVGA] %s: GMR2\n", __func__
);
305 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_TRACES
)
306 bug("[VMWareSVGA] %s: Traces\n", __func__
);
307 if (XSD(cl
)->data
.capabilities
& SVGA_CAP_SCREEN_OBJECT_2
)
308 bug("[VMWareSVGA] %s: Screen-Object2\n", __func__
);
312 D(bug("[VMWareSVGA] %s: returning 0x%p\n", __func__
, o
);)
317 VOID
VMWareSVGA__Root__Dispose(OOP_Class
*cl
, OOP_Object
*o
, OOP_Msg msg
)
319 FreeVec(XSD(cl
)->mouse
.shape
);
320 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
323 VOID
VMWareSVGA__Root__Get(OOP_Class
*cl
, OOP_Object
*o
, struct pRoot_Get
*msg
)
328 if (IS_GFX_ATTR(msg
->attrID
, idx
))
332 case aoHidd_Gfx_SupportsHWCursor
:
333 *msg
->storage
= (IPTR
)TRUE
;
336 case aoHidd_Gfx_MemoryAttribs
:
338 struct TagItem
*matstate
= (struct TagItem
*)msg
->storage
;
342 struct TagItem
*matag
;
343 while ((matag
= NextTagItem(&matstate
)))
345 switch(matag
->ti_Tag
)
347 case tHidd_Gfx_MemTotal
:
348 case tHidd_Gfx_MemAddressableTotal
:
349 matag
->ti_Data
= (IPTR
)vmwareReadReg(&XSD(cl
)->data
, SVGA_REG_VRAM_SIZE
);
351 case tHidd_Gfx_MemFree
:
352 case tHidd_Gfx_MemAddressableFree
:
363 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
366 OOP_Object
*VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CreateObject
*msg
)
368 OOP_Object
*object
= NULL
;
370 D(bug("[VMWareSVGA] %s()\n", __func__
));
372 if (msg
->cl
== XSD(cl
)->basebm
)
376 OOP_Class
*classptr
= NULL
;
377 struct TagItem tags
[] =
379 { TAG_IGNORE
, TAG_IGNORE
}, /* Placeholder for aHidd_BitMap_ClassPtr */
380 { TAG_MORE
, (IPTR
)msg
->attrList
}
383 struct pHidd_Gfx_CreateObject yourmsg
;
385 displayable
= GetTagData(aHidd_BitMap_Displayable
, FALSE
, msg
->attrList
);
386 framebuffer
= GetTagData(aHidd_BitMap_FrameBuffer
, FALSE
, msg
->attrList
);
388 classptr
= XSD(cl
)->vmwaresvgaonbmclass
;
389 else if (displayable
)
390 classptr
= XSD(cl
)->vmwaresvgaoffbmclass
;
394 modeid
= (HIDDT_ModeID
)GetTagData(aHidd_BitMap_ModeID
, vHidd_ModeID_Invalid
, msg
->attrList
);
395 if (modeid
!= vHidd_ModeID_Invalid
)
396 classptr
= XSD(cl
)->vmwaresvgaoffbmclass
;
399 HIDDT_StdPixFmt stdpf
;
400 stdpf
= (HIDDT_StdPixFmt
)GetTagData(aHidd_BitMap_StdPixFmt
, vHidd_StdPixFmt_Unknown
, msg
->attrList
);
401 if (stdpf
== vHidd_StdPixFmt_Unknown
)
404 friend = (OOP_Object
*)GetTagData(aHidd_BitMap_Friend
, (IPTR
)NULL
, msg
->attrList
);
407 OOP_Class
*friend_class
= NULL
;
408 OOP_GetAttr(friend, aHidd_BitMap_ClassPtr
, (IPTR
*)&friend_class
);
409 if (friend_class
== XSD(cl
)->vmwaresvgaonbmclass
)
411 classptr
= XSD(cl
)->vmwaresvgaoffbmclass
;
417 if (classptr
!= NULL
)
419 tags
[0].ti_Tag
= aHidd_BitMap_ClassPtr
;
420 tags
[0].ti_Data
= (IPTR
)classptr
;
422 yourmsg
.mID
= msg
->mID
;
423 yourmsg
.cl
= msg
->cl
;
424 yourmsg
.attrList
= tags
;
426 object
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)&yourmsg
);
428 else if (XSD(cl
)->basegallium
&& (msg
->cl
== XSD(cl
)->basegallium
))
430 /* Create the gallium 3d driver object .. */
431 object
= OOP_NewObject(NULL
, CLID_Hidd_Gallium_VMWareSVGA
, msg
->attrList
);
434 object
= (OOP_Object
*)OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
436 D(bug("[VMWareSVGA] %s: returning 0x%p\n", __func__
, object
);)
440 VOID
VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_CopyBox
*msg
)
445 struct HWData
*hwdata
= &XSD(cl
)->data
;
446 struct Box box
= { msg
->srcX
, msg
->srcY
, msg
->srcX
+ msg
->width
+ 1, msg
->srcY
+ msg
->height
+ 1};
448 D(bug("[VMWareSVGA] %s()\n", __func__
));
450 ObtainSemaphore(&hwdata
->damage_control
);
452 mode
= GC_DRMD(msg
->gc
);
453 OOP_GetAttr(msg
->src
, aHidd_VMWareSVGABitMap_Drawable
, (IPTR
*)&src
);
454 OOP_GetAttr(msg
->dest
, aHidd_VMWareSVGABitMap_Drawable
, (IPTR
*)&dst
);
455 if (((dst
== NULL
) || (src
== NULL
))) /* no vmwaregfx bitmap */
457 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
460 // TODO: This is nice and fast. but unfortunately has to go. We'll soon switch to a more refined accelerated blitting
463 struct BitmapData
*data
;
464 data
= OOP_INST_DATA(OOP_OCLASS(msg
->src
), msg
->src
);
467 case vHidd_GC_DrawMode_Clear
:
468 clearCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
470 case vHidd_GC_DrawMode_And
:
471 andCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
473 case vHidd_GC_DrawMode_AndReverse
:
474 andReverseCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
476 case vHidd_GC_DrawMode_Copy
:
477 copyCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
479 case vHidd_GC_DrawMode_AndInverted
:
480 andInvertedCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
482 case vHidd_GC_DrawMode_NoOp
:
483 noOpCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
485 case vHidd_GC_DrawMode_Xor
:
486 xorCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
488 case vHidd_GC_DrawMode_Or
:
489 orCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
491 case vHidd_GC_DrawMode_Nor
:
492 norCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
494 case vHidd_GC_DrawMode_Equiv
:
495 equivCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
497 case vHidd_GC_DrawMode_Invert
:
498 invertCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
500 case vHidd_GC_DrawMode_OrReverse
:
501 orReverseCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
503 case vHidd_GC_DrawMode_CopyInverted
:
504 copyInvertedCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
506 case vHidd_GC_DrawMode_OrInverted
:
507 orInvertedCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
509 case vHidd_GC_DrawMode_Nand
:
510 nandCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
512 case vHidd_GC_DrawMode_Set
:
513 setCopyVMWareSVGA(data
->data
, msg
->srcX
, msg
->srcY
, msg
->destX
, msg
->destY
, msg
->width
, msg
->height
);
516 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
521 struct BitmapData
*srcbd
= OOP_INST_DATA(OOP_OCLASS(msg
->src
), msg
->src
);
522 struct BitmapData
*dstbd
= OOP_INST_DATA(OOP_OCLASS(msg
->dest
), msg
->dest
);
527 ULONG ycnt
= msg
->height
;
531 /* get src/dest video data start addresses and skip sizes */
532 if (srcbd
->VideoData
== srcbd
->data
->vrambase
)
534 offset
= (msg
->srcX
*srcbd
->bytesperpix
)+(msg
->srcY
*srcbd
->data
->bytesperline
);
535 srestadd
= (srcbd
->data
->bytesperline
- (msg
->width
*srcbd
->bytesperpix
));
536 // displayCursorVMWareSVGA(&XSD(cl)->data, 0);
537 // XSD(cl)->mouse.visible = 0;
541 offset
= (msg
->srcX
+(msg
->srcY
*srcbd
->width
))*srcbd
->bytesperpix
;
542 srestadd
= (srcbd
->width
- msg
->width
)*srcbd
->bytesperpix
;
544 sbuffer
= srcbd
->VideoData
+offset
;
545 if (dstbd
->VideoData
== dstbd
->data
->vrambase
)
547 offset
= (msg
->destX
*dstbd
->bytesperpix
)+(msg
->destY
*dstbd
->data
->bytesperline
);
548 drestadd
= (dstbd
->data
->bytesperline
- (msg
->width
*dstbd
->bytesperpix
));
549 // displayCursorVMWareSVGA(&XSD(cl)->data, 0);
550 // XSD(cl)->mouse.visible = 0;
554 offset
= (msg
->destX
+(msg
->destY
*dstbd
->width
))*dstbd
->bytesperpix
;
555 drestadd
= (dstbd
->width
- msg
->width
)*dstbd
->bytesperpix
;
557 dbuffer
= dstbd
->VideoData
+offset
;
561 case vHidd_GC_DrawMode_Copy
:
566 // NOTE: this is only valid if the two bitmaps share the same bytes per pixel.
567 // we may want to pre-process it (see below in the mouse definition code)
568 CopyMem(sbuffer
, dbuffer
, xcnt
* dstbd
->bytesperpix
);
570 sbuffer
+= xcnt
* dstbd
->bytesperpix
;
572 dbuffer
+= xcnt
* dstbd
->bytesperpix
;
577 D(bug("[VMWareSVGA] mode = %ld src=%lx dst=%lx\n", mode
, src
, dst
);)
578 OOP_DoSuperMethod(cl
, o
, (OOP_Msg
)msg
);
581 // if (XSD(cl)->mouse.visible == 0)
583 // displayCursorVMWareSVGA(&XSD(cl)->data, 1);
584 // XSD(cl)->mouse.visible = 1;
590 box
.x2
= box
.x1
+msg
->width
+1;
591 box
.y2
= box
.y1
+msg
->height
+1;
593 VMWareSVGA_Damage_DeltaAdd(hwdata
, box
);
594 ReleaseSemaphore(&hwdata
->damage_control
);
596 D(bug("[VMWareSVGA] %s: done\n", __func__
);)
599 BOOL
VMWareSVGA__Hidd_Gfx__SetCursorShape(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_SetCursorShape
*msg
)
601 struct VMWareSVGA_staticdata
*data
= XSD(cl
);
603 D(bug("[VMWareSVGA] %s()\n", __func__
));
605 if (msg
->shape
== NULL
)
607 displayCursorVMWareSVGA(&XSD(cl
)->data
, 0);
608 data
->mouse
.oopshape
= NULL
;
609 FreeVec(data
->mouse
.shape
);
610 data
->mouse
.shape
= NULL
;
618 HIDDT_StdPixFmt pixfmt
;
621 OOP_GetAttr(msg
->shape
, aHidd_BitMap_Width
, &tmp
);
622 data
->mouse
.width
= tmp
;
623 OOP_GetAttr(msg
->shape
, aHidd_BitMap_Height
, &tmp
);
624 data
->mouse
.height
= tmp
;
625 OOP_GetAttr(msg
->shape
, aHidd_BitMap_PixFmt
, (IPTR
*)&pfmt
);
626 OOP_GetAttr(pfmt
, aHidd_PixFmt_StdPixFmt
, (IPTR
*)&pixfmt
);
627 OOP_GetAttr(msg
->shape
, aHidd_BitMap_ColorMap
, (IPTR
*)&colmap
);
628 data
->mouse
.oopshape
= msg
->shape
;
630 /* convert shape to vmware needs */
631 FreeVec(data
->mouse
.shape
);
632 tmp
= data
->mouse
.width
* data
->mouse
.height
;
633 data
->mouse
.shape
= AllocVec(tmp
* 4, MEMF_CLEAR
|MEMF_PUBLIC
);
634 if (data
->mouse
.shape
!= NULL
)
637 shape
= data
->mouse
.shape
;
639 // Get data from the bitmap. Using the ALPHA CURSOR we can now directly pre-process the bitmap to a suitable format
640 HIDD_BM_GetImage(msg
->shape
, (UBYTE
*)shape
, data
->mouse
.width
* 4, 0, 0, data
->mouse
.width
, data
->mouse
.height
, vHidd_StdPixFmt_BGRA32
);
642 defineCursorVMWareSVGA(&XSD(cl
)->data
, &data
->mouse
);
650 BOOL
VMWareSVGA__Hidd_Gfx__SetCursorPos(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_SetCursorPos
*msg
)
652 D(bug("[VMWareSVGA] %s()\n", __func__
));
654 XSD(cl
)->mouse
.x
= msg
->x
;
655 XSD(cl
)->mouse
.y
= msg
->y
;
657 moveCursorVMWareSVGA(&XSD(cl
)->data
, XSD(cl
)->mouse
.x
, XSD(cl
)->mouse
.y
);
662 VOID
VMWareSVGA__Hidd_Gfx__SetCursorVisible(OOP_Class
*cl
, OOP_Object
*o
, struct pHidd_Gfx_SetCursorVisible
*msg
)
664 D(bug("[VMWareSVGA] %s()\n", __func__
));
666 XSD(cl
)->mouse
.visible
= msg
->visible
;
667 displayCursorVMWareSVGA(&XSD(cl
)->data
, msg
->visible
? 1 : 0);
671 static int VMWareSVGA_InitStatic(LIBBASETYPEPTR LIBBASE
)
673 D(bug("[VMWareSVGA] %s()\n", __func__
));
675 LIBBASE
->vsd
.mouse
.x
=0;
676 LIBBASE
->vsd
.mouse
.y
=0;
677 LIBBASE
->vsd
.mouse
.shape
= NULL
;
679 if (!OOP_ObtainAttrBases(attrbases
))
681 D(bug("[VMWareSVGA] %s: attrbases init failed\n", __func__
));
685 D(bug("[VMWareSVGA] %s: initialised\n", __func__
));
690 static int VMWareSVGA_ExpungeStatic(LIBBASETYPEPTR LIBBASE
)
692 D(bug("[VMWareSVGA] %s()\n", __func__
));
694 OOP_ReleaseAttrBases(attrbases
);
696 D(bug("[VMWareSVGA] %s: done\n", __func__
));
701 ADD2INITLIB(VMWareSVGA_InitStatic
, 0)
702 ADD2EXPUNGELIB(VMWareSVGA_ExpungeStatic
, 0)