From 64aa2e549d292db26eed08684b0083e3af22fdad Mon Sep 17 00:00:00 2001 From: NicJA Date: Fri, 26 Apr 2019 02:16:19 +0000 Subject: [PATCH] wip commit. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@56349 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/hidds/vmwaresvga/mmakefile.src | 2 +- workbench/hidds/vmwaresvga/vmwaresvga.conf | 2 + workbench/hidds/vmwaresvga/vmwaresvga_bitmap.h | 5 + .../hidds/vmwaresvga/vmwaresvga_bitmap_common.c | 185 +++++--- .../hidds/vmwaresvga/vmwaresvga_galliumclass.c | 65 ++- workbench/hidds/vmwaresvga/vmwaresvga_hardware.c | 503 ++++++++++++++++----- workbench/hidds/vmwaresvga/vmwaresvga_hardware.h | 101 +++-- workbench/hidds/vmwaresvga/vmwaresvga_hiddclass.c | 489 ++++++++++++++------ workbench/hidds/vmwaresvga/vmwaresvga_init.c | 37 +- workbench/hidds/vmwaresvga/vmwaresvga_intern.h | 33 +- .../hidds/vmwaresvga/vmwaresvga_offbitmapclass.c | 50 +- .../hidds/vmwaresvga/vmwaresvga_onbitmapclass.c | 69 +-- 12 files changed, 1106 insertions(+), 435 deletions(-) diff --git a/workbench/hidds/vmwaresvga/mmakefile.src b/workbench/hidds/vmwaresvga/mmakefile.src index ac6eeb1e4b..b1f08c6354 100644 --- a/workbench/hidds/vmwaresvga/mmakefile.src +++ b/workbench/hidds/vmwaresvga/mmakefile.src @@ -36,7 +36,7 @@ USER_INCLUDES += \ USER_CPPFLAGS += \ -DPACKAGE_VERSION=\"$(MESAGLVERSION)\" -#USER_CPPFLAGS += -DDEBUG=1 +USER_CPPFLAGS += -DDEBUG=1 USER_LDFLAGS := \ -L$(top_libdir) \ diff --git a/workbench/hidds/vmwaresvga/vmwaresvga.conf b/workbench/hidds/vmwaresvga/vmwaresvga.conf index 73db9cf7b0..c20be59551 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga.conf +++ b/workbench/hidds/vmwaresvga/vmwaresvga.conf @@ -20,6 +20,8 @@ Dispose Get .interface Hidd_Gfx CreateObject +ShowViewPorts +SetGamma CopyBox SetCursorShape SetCursorPos diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_bitmap.h b/workbench/hidds/vmwaresvga/vmwaresvga_bitmap.h index 53803dcd11..fa97542a45 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_bitmap.h +++ b/workbench/hidds/vmwaresvga/vmwaresvga_bitmap.h @@ -46,6 +46,8 @@ struct HWRegs { struct BitmapData { struct HWRegs regs; struct HWData *data; + struct SignalSemaphore bmsem; + UBYTE *VideoData; /* Pointing to video data */ ULONG width; /* Width of bitmap */ ULONG height; /* Height of bitmap */ @@ -56,6 +58,9 @@ struct BitmapData { struct MouseData *mouse; }; +#define LOCK_BITMAP { ObtainSemaphore(&data->bmsem); } +#define UNLOCK_BITMAP { ReleaseSemaphore(&data->bmsem); } + /* Only include vmwaresvgahardware.h now so that struct Box is known */ #include "vmwaresvga_hardware.h" diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_bitmap_common.c b/workbench/hidds/vmwaresvga/vmwaresvga_bitmap_common.c index 6727ca91e4..ba02a631b3 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_bitmap_common.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_bitmap_common.c @@ -1,11 +1,14 @@ /* - Copyright � 1995-2006, The AROS Development Team. All rights reserved. + Copyright © 1995-2019, The AROS Development Team. All rights reserved. $Id$ Desc: Lang: English. */ +#ifdef DEBUG +#undef DEBUG +#endif #define DEBUG 0 #include @@ -20,21 +23,36 @@ VOID MNAME_BM(Clear)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Clear *ms { struct BitmapData *data = OOP_INST_DATA(cl, o); IPTR width, height; + BOOL done = FALSE; - D(bug("[VMWareSVGA] Clear()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) + LOCK_BITMAP + /* Get width & height from bitmap */ - OOP_GetAttr(o, aHidd_BitMap_Width, &width); OOP_GetAttr(o, aHidd_BitMap_Height, &height); - writeVMWareSVGAFIFO(data->data, SVGA_CMD_RECT_FILL); - writeVMWareSVGAFIFO(data->data, GC_FG(msg->gc)); - writeVMWareSVGAFIFO(data->data, 0); - writeVMWareSVGAFIFO(data->data, 0); - writeVMWareSVGAFIFO(data->data, width); - writeVMWareSVGAFIFO(data->data, height); - syncVMWareSVGAFIFO(data->data); + if (VPVISFLAG) + { + if (data->data->capabilities & SVGA_CAP_RECT_FILL) + { + rectFillVMWareSVGA(data->data, GC_FG(msg->gc), 0, 0, width, height); + done = TRUE; + } + else + if ((data->data->capabilities & (SVGA_CAP_RECT_FILL|SVGA_CAP_RASTER_OP)) == (SVGA_CAP_RECT_FILL|SVGA_CAP_RASTER_OP)) + { + ropFillVMWareSVGA(data->data, GC_FG(msg->gc), 0, 0, width, height, 1); + done = TRUE; + } + if (done) + syncfenceVMWareSVGAFIFO(data->data, fenceVMWareSVGAFIFO(data->data)); + } + if (!done) + OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + + UNLOCK_BITMAP } #endif @@ -43,7 +61,7 @@ VOID MNAME_BM(Clear)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Clear *ms HIDDT_Pixel MNAME_BM(MapColor)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_MapColor *msg) { - D(bug("[VMWareSVGA] MapColor()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) return i; } @@ -51,7 +69,7 @@ HIDDT_Pixel MNAME_BM(MapColor)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap VOID MNAME_BM(UnMapPixel)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_UnmapPixel *msg) { - D(bug("[VMWareSVGA] UnMapPixel()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) } #endif @@ -66,6 +84,8 @@ BOOL MNAME_BM(SetColors)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_SetCo ULONG xc_i; ULONG col_i; + D(bug(DEBUGNAME " %s()\n", __func__);) + pf = BM_PIXFMT(o); if ( (vHidd_ColorModel_StaticPalette == HIDD_PF_COLMODEL(pf)) || @@ -118,13 +138,16 @@ VOID MNAME_BM(PutPixel)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutPix struct Box box; #endif + LOCK_BITMAP + putpixel(data, msg->x, msg->y, msg->pixel); #ifdef OnBitmap box.x1 = box.x2 = msg->x; box.y1 = box.y2 = msg->y; - refreshAreaVMWareSVGA(data->data, &box); + VMWareSVGA_Damage_DeltaAdd(data->data, &box); #endif - return; + + UNLOCK_BITMAP } /********* BitMap::GetPixel() *********************************/ @@ -174,6 +197,10 @@ VOID MNAME_BM(PutImage)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutIma LONG xcnt; UBYTE *src=(UBYTE *)msg->pixels; + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + if (msg->pixFmt == vHidd_StdPixFmt_Native32) { #ifdef OnBitmap @@ -198,17 +225,23 @@ VOID MNAME_BM(PutImage)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_PutIma ycnt--; } #ifdef OnBitmap - box.x1 = msg->x; - box.y1 = msg->y; - box.x2 = box.x1+msg->width-1; - box.y2 = box.y1+msg->height-1; - VMWareSVGA_Damage_DeltaAdd(data->data, box); + if (VPVISFLAG) + { + syncfenceVMWareSVGAFIFO(data->data, fenceVMWareSVGAFIFO(data->data)); + box.x1 = msg->x; + box.y1 = msg->y; + box.x2 = box.x1+msg->width-1; + box.y2 = box.y1+msg->height-1; + VMWareSVGA_Damage_DeltaAdd(data->data, &box); + } #endif } else { OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } + + UNLOCK_BITMAP } /********* BitMap::GetImage() ***************************/ @@ -223,6 +256,10 @@ VOID MNAME_BM(GetImage)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetIma LONG xcnt; UBYTE *src=msg->pixels; + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + if (msg->pixFmt == vHidd_StdPixFmt_Native32) { #ifdef OnBitmap @@ -251,6 +288,8 @@ VOID MNAME_BM(GetImage)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetIma { OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } + + UNLOCK_BITMAP } /********* BitMap::PutImageLUT() ***************************/ @@ -268,6 +307,10 @@ VOID MNAME_BM(PutImageLUT)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Put LONG xcnt; UBYTE *src=msg->pixels; + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + #ifdef OnBitmap offset = (msg->x*data->bytesperpix)+(msg->y*data->data->bytesperline); restadd = (data->data->bytesperline - (msg->width*data->bytesperpix)); @@ -304,99 +347,127 @@ VOID MNAME_BM(PutImageLUT)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Put ycnt--; } #ifdef OnBitmap - box.x1 = msg->x; - box.y1 = msg->y; - box.x2 = box.x1+msg->width-1; - box.y2 = box.y1+msg->height-1; - refreshAreaVMWareSVGA(data->data, &box); + if (VPVISFLAG) + { + syncfenceVMWareSVGAFIFO(data->data, fenceVMWareSVGAFIFO(data->data)); + box.x1 = msg->x; + box.y1 = msg->y; + box.x2 = box.x1+msg->width-1; + box.y2 = box.y1+msg->height-1; + VMWareSVGA_Damage_DeltaAdd(data->data, &box); + } #endif + + UNLOCK_BITMAP } /********* BitMap::GetImageLUT() ***************************/ VOID MNAME_BM(GetImageLUT)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_GetImageLUT *msg) { - D(bug("[VMWareSVGA] GetImageLUT()\n")); + struct BitmapData *data =OOP_INST_DATA(cl, o); + + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + + UNLOCK_BITMAP } /********* BitMap::FillRect() ***************************/ VOID MNAME_BM(FillRect)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_DrawRect *msg) { -#ifdef OnBitmap struct BitmapData *data =OOP_INST_DATA(cl, o); + + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + +#ifdef OnBitmap struct HWData *hw; HIDDT_Pixel pixel; HIDDT_DrawMode mode; + BOOL done=FALSE; pixel = GC_FG(msg->gc); mode = GC_DRMD(msg->gc); hw = data->data; - if (hw->capabilities & SVGA_CAP_RASTER_OP) + if ((VPVISFLAG) && (hw->capabilities & SVGA_CAP_RASTER_OP)) { + done = TRUE; switch (mode) { case vHidd_GC_DrawMode_Clear: - clearFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + clearFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_And: - andFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + andFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_AndReverse: - andReverseFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + andReverseFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Copy: - copyFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + copyFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_AndInverted: - andInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + andInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_NoOp: - noOpFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + noOpFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Xor: - xorFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + xorFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Or: - orFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + orFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Nor: - norFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + norFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Equiv: - equivFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + equivFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Invert: - invertFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + invertFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_OrReverse: - orReverseFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + orReverseFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_CopyInverted: - copyInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + copyInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_OrInverted: - orInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + orInvertedFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Nand: - nandFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + nandFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; case vHidd_GC_DrawMode_Set: - setFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX-msg->minX+1, msg->maxY-msg->minY+1); + setFillVMWareSVGA(data->data, pixel, msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1); break; default: - OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + done = FALSE; break; } + if (done) + { + struct Box box = { msg->minX, msg->minY, msg->maxX - msg->minX + 1, msg->maxY - msg->minY + 1}; + VMWareSVGA_Damage_DeltaAdd(data->data, &box); + syncfenceVMWareSVGAFIFO(data->data, fenceVMWareSVGAFIFO(data->data)); + } } - else + if (!done) { OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } #else OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); #endif + + UNLOCK_BITMAP } /*** BitMap::BlitColorExpansion() **********************************************/ @@ -412,6 +483,10 @@ VOID MNAME_BM(BlitColorExpansion)(OOP_Class *cl, OOP_Object *o, struct pHidd_Bit LONG x; LONG y; + D(bug(DEBUGNAME " %s()\n", __func__);) + + LOCK_BITMAP + fg = GC_FG(msg->gc); bg = GC_BG(msg->gc); cemd = GC_COLEXP(msg->gc); @@ -439,12 +514,18 @@ VOID MNAME_BM(BlitColorExpansion)(OOP_Class *cl, OOP_Object *o, struct pHidd_Bit } } #ifdef OnBitmap - box.x1 = msg->destX; - box.y1 = msg->destY; - box.x2 = msg->destX+msg->width-1; - box.y2 = msg->destY+msg->height-1; - refreshAreaVMWareSVGA(data->data, &box); + if (VPVISFLAG) + { + syncfenceVMWareSVGAFIFO(data->data, fenceVMWareSVGAFIFO(data->data)); + box.x1 = msg->destX; + box.y1 = msg->destY; + box.x2 = msg->destX+msg->width-1; + box.y2 = msg->destY+msg->height-1; + VMWareSVGA_Damage_DeltaAdd(data->data, &box); + } #endif + + UNLOCK_BITMAP } /*** BitMap::Get() *******************************************/ @@ -476,5 +557,7 @@ VOID MNAME_BM(UpdateRect)(OOP_Class *cl, OOP_Object *o, struct pHidd_BitMap_Upda struct HWData *pData = &XSD(cl)->data; struct Box box = { msg->x, msg->y, msg->x + msg->width + 1, msg->y + msg->height + 1}; - VMWareSVGA_Damage_DeltaAdd(pData, box); + D(bug(DEBUGNAME " %s()\n", __func__);) + + VMWareSVGA_Damage_DeltaAdd(pData, &box); } diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_galliumclass.c b/workbench/hidds/vmwaresvga/vmwaresvga_galliumclass.c index d4d717003d..b45c418809 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_galliumclass.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_galliumclass.c @@ -29,26 +29,19 @@ struct VMWareSVGAPBBuf void *map; }; -#if (AROS_BIG_ENDIAN == 1) -#define AROS_PIXFMT RECTFMT_RAW /* Big Endian Archs. */ -#else -#define AROS_PIXFMT RECTFMT_BGRA32 /* Little Endian Archs. */ -#endif - - // **************************************************************************** // winsys/support functions // **************************************************************************** static SVGA3dHardwareVersion VMWareSVGA_GetHWVersion(struct svga_winsys_screen *sws) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) #if (0) if (sws->have_gb_objects) { #endif - D(bug("[VMWareSVGA:Gallium] %s: returning SVGA3D_HWVERSION_WS8_B1\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s: returning SVGA3D_HWVERSION_WS8_B1\n", __func__);) return SVGA3D_HWVERSION_WS8_B1; #if (0) } @@ -62,7 +55,7 @@ static boolean VMWareSVGA_GetCap(struct svga_winsys_screen *sws, SVGA3dDevCapIndex index, SVGA3dDevCapResult *result) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) #if (0) if (index > vws->ioctl.num_cap_3d || @@ -101,7 +94,7 @@ static struct svga_winsys_surface *VMWareSVGA_SurfaceCreate( { struct svga_winsys_surface *surf = NULL; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) #if (0) surf = CALLOC_STRUCT(svga_winsys_surface); @@ -114,7 +107,7 @@ static struct svga_winsys_surface *VMWareSVGA_SurfaceFromHandle(struct svga_wins struct winsys_handle *whandle, SVGA3dSurfaceFormat *format) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return NULL; } @@ -124,7 +117,7 @@ static boolean VMWareSVGA_SurfaceGetHandle(struct svga_winsys_screen *sws, unsigned stride, struct winsys_handle *whandle) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return FALSE; } @@ -132,7 +125,7 @@ static boolean VMWareSVGA_SurfaceGetHandle(struct svga_winsys_screen *sws, static boolean VMWareSVGA_SurfaceIsFlushed(struct svga_winsys_screen *sws, struct svga_winsys_surface *surface) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return TRUE; } @@ -141,7 +134,7 @@ static void VMWareSVGA_SurfaceReference(struct svga_winsys_screen *sws, struct svga_winsys_surface **pdst, struct svga_winsys_surface *src) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static boolean VMWareSVGA_SurfaceCanCreate(struct svga_winsys_screen *sws, @@ -151,7 +144,7 @@ static boolean VMWareSVGA_SurfaceCanCreate(struct svga_winsys_screen *sws, uint32 numMipLevels, uint32 numSamples) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return TRUE; } @@ -163,7 +156,7 @@ static struct svga_winsys_buffer *VMWareSVGA_BufferCreate( struct svga_winsys_sc { struct VMWareSVGAPBBuf *buf; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) buf = CALLOC_STRUCT(VMWareSVGAPBBuf); @@ -174,20 +167,20 @@ static void *VMWareSVGA_BufferMap( struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf, unsigned usage ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return ((struct VMWareSVGAPBBuf *)(buf))->map; } static void VMWareSVGA_BufferUnMap( struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static void VMWareSVGA_BufferDestroy( struct svga_winsys_screen *sws, struct svga_winsys_buffer *buf ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) FREE(buf); } @@ -195,14 +188,14 @@ static void VMWareSVGA_FenceReference( struct svga_winsys_screen *sws, struct pipe_fence_handle **pdst, struct pipe_fence_handle *src ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static int VMWareSVGA_FenceSignalled( struct svga_winsys_screen *sws, struct pipe_fence_handle *fence, unsigned flag ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return 0; } @@ -212,7 +205,7 @@ static int VMWareSVGA_FenceFinish( struct svga_winsys_screen *sws, uint64_t timeout, unsigned flag ) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return 0; } @@ -224,7 +217,7 @@ static struct svga_winsys_gb_shader *VMWareSVGA_ShaderCreate(struct svga_winsys_ { struct svga_winsys_gb_shader *shader = NULL; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return shader; } @@ -232,14 +225,14 @@ static struct svga_winsys_gb_shader *VMWareSVGA_ShaderCreate(struct svga_winsys_ static void VMWareSVGA_ShaderDestroy(struct svga_winsys_screen *sws, struct svga_winsys_gb_shader *shader) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static struct svga_winsys_gb_query *VMWareSVGA_QueryCreate(struct svga_winsys_screen *sws, uint32 len) { struct svga_winsys_gb_query *query = NULL; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return query; } @@ -247,7 +240,7 @@ static struct svga_winsys_gb_query *VMWareSVGA_QueryCreate(struct svga_winsys_sc static void VMWareSVGA_QueryDestroy(struct svga_winsys_screen *sws, struct svga_winsys_gb_query *query) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static int VMWareSVGA_QueryInit(struct svga_winsys_screen *sws, @@ -255,7 +248,7 @@ static int VMWareSVGA_QueryInit(struct svga_winsys_screen *sws, unsigned offset, SVGA3dQueryState queryState) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) return 0; } @@ -266,25 +259,25 @@ static void VMWareSVGA_QueryGetResult(struct svga_winsys_screen *sws, SVGA3dQueryState *queryState, void *result, uint32 resultLen) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static void VMWareSVGA_StatsInc(enum svga_stats_count index) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static void VMWareSVGA_StatsTimePush(enum svga_stats_time index, struct svga_winsys_stats_timeframe *tf) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } static void VMWareSVGA_StatsTimePop() { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } @@ -296,7 +289,7 @@ OOP_Object *METHOD(GalliumVMWareSVGA, Root, New) { IPTR interfaceVers; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) interfaceVers = GetTagData(aHidd_Gallium_InterfaceVersion, -1, msg->attrList); if (interfaceVers != GALLIUM_INTERFACE_VERSION) @@ -352,7 +345,7 @@ OOP_Object *METHOD(GalliumVMWareSVGA, Root, New) VOID METHOD(GalliumVMWareSVGA, Root, Dispose) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } @@ -381,7 +374,7 @@ APTR METHOD(GalliumVMWareSVGA, Hidd_Gallium, CreatePipeScreen) struct HIDDGalliumVMWareSVGAData * data = OOP_INST_DATA(cl, o); struct pipe_screen *screen = NULL; - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) screen = svga_screen_create(&data->wsi); @@ -393,5 +386,5 @@ APTR METHOD(GalliumVMWareSVGA, Hidd_Gallium, CreatePipeScreen) VOID METHOD(GalliumVMWareSVGA, Hidd_Gallium, DisplayResource) { - D(bug("[VMWareSVGA:Gallium] %s()\n", __func__)); + D(bug("[VMWareSVGA:Gallium] %s()\n", __func__);) } diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c index 797f888f75..f16ea9a1be 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c @@ -9,7 +9,7 @@ #ifdef DEBUG #undef DEBUG #endif -#define DEBUG 1 /* no SysBase */ +#define DEBUG 0 /* no SysBase */ #include #include @@ -21,18 +21,53 @@ #include "vmwaresvga_intern.h" +#if (DEBUG0) +#define DIRQ(x) x +#define DDMG(x) +#define DFIFO(x) +#define DFIFOINF(x) x +#define DFENCE(x) x +#define DREFRESH(x) +#define DCURSOR(x) +#else +#define DIRQ(x) +#define DDMG(x) +#define DFIFO(x) +#define DFIFOINF(x) +#define DFENCE(x) +#define DREFRESH(x) +#define DCURSOR(x) +#endif + ULONG vmwareReadReg(struct HWData *data, ULONG reg) { outl(reg, data->indexReg); return inl(data->valueReg); } -void vmwareWriteReg(struct HWData *data, ULONG reg, ULONG val) +VOID vmwareWriteReg(struct HWData *data, ULONG reg, ULONG val) { outl(reg, data->indexReg); outl(val, data->valueReg); } +VOID vmwareHandlerIRQ(struct HWData *data, void *unused) +{ + UWORD port = (UWORD)((IPTR)data->iobase + SVGA_IRQSTATUS_PORT); + ULONG irqFlags = inl(port); + outl(irqFlags, port); + + DIRQ(bug("[VMWareSVGA] %s(%08x)\n", __func__, irqFlags);) + if (!irqFlags) + { + D(bug("[VMWareSVGA] %s: Spurrious IRQ!\n", __func__);) + } + else + { + } +} + + #undef SysBase extern struct ExecBase *SysBase; @@ -40,6 +75,8 @@ ULONG getVMWareSVGAID(struct HWData *data) { ULONG id; + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) + vmwareWriteReg(data, SVGA_REG_ID, SVGA_ID_2); id = vmwareReadReg(data, SVGA_REG_ID); if (id == SVGA_ID_2) @@ -53,52 +90,155 @@ ULONG getVMWareSVGAID(struct HWData *data) return SVGA_ID_INVALID; } +BOOL hasCapVMWareSVGAFIFO(struct HWData *data, ULONG fifocap) +{ + volatile ULONG *fifo = data->mmiobase; + if ((data->capabilities & SVGA_CAP_EXTENDED_FIFO) && + (fifo[SVGA_FIFO_MIN] > (fifocap << 2))) + { + return TRUE; + } + return FALSE; +} + VOID initVMWareSVGAFIFO(struct HWData *data) { - ULONG *fifo; - ULONG fifomin; + volatile ULONG *fifo = data->mmiobase; - vmwareWriteReg(data, SVGA_REG_CONFIG_DONE, 0); //Stop vmware from reading the fifo + DFIFOINF(bug("[VMWareSVGA:HW] %s()\n", __func__);) - fifo = data->mmiobase = (APTR)(IPTR)vmwareReadReg(data, SVGA_REG_MEM_START); - data->mmiosize = vmwareReadReg(data, SVGA_REG_MEM_SIZE) & ~3; + if (!data->fifomin) + { + if (data->capabilities & SVGA_CAP_EXTENDED_FIFO) + { + DFIFOINF(bug("[VMWareSVGA:HW] %s: Extended FIFO Capabilities\n", __func__);) + data->fifomin = vmwareReadReg(data, SVGA_REG_MEM_REGS); + data->fifocapabilities = fifo[SVGA_FIFO_CAPABILITIES]; + DFIFOINF( + if (data->fifocapabilities & SVGA_FIFO_CAP_FENCE) + bug("[VMWareSVGA] %s: Fence\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_ACCELFRONT) + bug("[VMWareSVGA] %s: Accelerate Front\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_PITCHLOCK) + bug("[VMWareSVGA] %s: Pitchlock\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_VIDEO) + bug("[VMWareSVGA] %s: Video\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_CURSOR_BYPASS_3) + bug("[VMWareSVGA] %s: Cursor-Bypass3\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_ESCAPE) + bug("[VMWareSVGA] %s: Escape\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_RESERVE) + bug("[VMWareSVGA] %s: FIFO Reserve\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_SCREEN_OBJECT) + bug("[VMWareSVGA] %s: Screen-Object\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_GMR2) + bug("[VMWareSVGA] %s: GMR2\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_3D_HWVERSION_REVISED) + bug("[VMWareSVGA] %s: 3DHWVersion-Revised\n", __func__); + if (data->fifocapabilities & SVGA_FIFO_CAP_SCREEN_OBJECT_2) + bug("[VMWareSVGA] %s: Screen-Object2\n", __func__); + ) + } + else + data->fifomin = SVGA_FIFO_CAPABILITIES; + } + DFIFOINF(bug("[VMWareSVGA:HW] %s: FIFO Min Regs = %d\n", __func__, data->fifomin)); - if (data->capabilities & SVGA_CAP_EXTENDED_FIFO) - fifomin = vmwareReadReg(data, SVGA_REG_MEM_REGS); - else - fifomin =4; - - fifo[SVGA_FIFO_MIN] = fifomin * sizeof(ULONG); + data->mmiosize = vmwareReadReg(data, SVGA_REG_MEM_SIZE); - /* reduce size of FIFO queue to prevent VMWare from failing */ - fifo[SVGA_FIFO_MAX] = (data->mmiosize > 65536) ? 65536 : data->mmiosize; - fifo[SVGA_FIFO_NEXT_CMD] = fifomin * sizeof(ULONG); - fifo[SVGA_FIFO_STOP] = fifomin * sizeof(ULONG); + vmwareWriteReg(data, SVGA_REG_CONFIG_DONE, 0); //Stop vmware from reading the fifo + + fifo[SVGA_FIFO_MIN] = (data->fifomin << VMWFIFO_CMD_SIZESHIFT); + fifo[SVGA_FIFO_MAX] = data->mmiosize; + fifo[SVGA_FIFO_NEXT_CMD] = fifo[SVGA_FIFO_MIN]; + fifo[SVGA_FIFO_STOP] = fifo[SVGA_FIFO_MIN]; vmwareWriteReg(data, SVGA_REG_CONFIG_DONE, 1); + + if (hasCapVMWareSVGAFIFO(data, SVGA_FIFO_GUEST_3D_HWVERSION)) + { + DFIFOINF(bug("[VMWareSVGA:HW] %s: Setting GUEST_3D_HWVERSION = %d\n", __func__, SVGA3D_HWVERSION_CURRENT)); + fifo[SVGA_FIFO_GUEST_3D_HWVERSION] = SVGA3D_HWVERSION_CURRENT; + } +} + +APTR reserveVMWareSVGAFIFO(struct HWData *data, ULONG size) +{ + volatile ULONG *fifo = data->mmiobase; + ULONG max = fifo[SVGA_FIFO_MAX]; + ULONG min = fifo[SVGA_FIFO_MIN]; + ULONG cmdNext = fifo[SVGA_FIFO_NEXT_CMD]; + if (size % VMWFIFO_CMD_SIZE) { + DFIFOINF(bug("[VMWareSVGA:HW] %s: size of %d not 32bit-aligned!!\n", __func__, size);) + } +} + +VOID commitVMWareSVGAFIFO(struct HWData *data, ULONG size) +{ + volatile ULONG *fifo = data->mmiobase; + ULONG max = fifo[SVGA_FIFO_MAX]; + ULONG min = fifo[SVGA_FIFO_MIN]; + ULONG cmdNext = fifo[SVGA_FIFO_NEXT_CMD]; +} + +ULONG fenceVMWareSVGAFIFO(struct HWData *data) +{ + ULONG fence = 1; + + if (hasCapVMWareSVGAFIFO(data, SVGA_FIFO_FENCE) && (data->fifocapabilities & SVGA_FIFO_CAP_FENCE)) + { + fence = data->fence++; + if (fence == 0) fence = 1; + + DFENCE(bug("[VMWareSVGA:HW] %s: inserting fence #%d\n", __func__, fence);) + + writeVMWareSVGAFIFO(data, SVGA_CMD_FENCE); + writeVMWareSVGAFIFO(data, fence); + syncVMWareSVGAFIFO(data); + } + return fence; +} + +VOID syncfenceVMWareSVGAFIFO(struct HWData *data, ULONG fence) +{ + volatile ULONG *fifo; + + if (hasCapVMWareSVGAFIFO(data, SVGA_FIFO_FENCE) && (data->fifocapabilities & SVGA_FIFO_CAP_FENCE)) + { + fifo = data->mmiobase; + if ((LONG)(fifo[SVGA_FIFO_FENCE] - fence) < 0) + { + DFENCE(bug("[VMWareSVGA:HW] %s: fence #%d hasnt been reached yet...\n", __func__, fence);) + + } + } } VOID syncVMWareSVGAFIFO(struct HWData *data) { + DFIFO(bug("[VMWareSVGA:HW] %s()\n", __func__);) + vmwareWriteReg(data, SVGA_REG_SYNC, 1); } VOID writeVMWareSVGAFIFO(struct HWData *data, ULONG val) { - ULONG *fifo; + volatile ULONG *fifo; + + DFIFO(bug("[VMWareSVGA:HW] %s()\n", __func__);) fifo = data->mmiobase; if ( - (fifo[SVGA_FIFO_NEXT_CMD]+4 == fifo[SVGA_FIFO_STOP]) || + (fifo[SVGA_FIFO_NEXT_CMD] + VMWFIFO_CMD_SIZE == fifo[SVGA_FIFO_STOP]) || ( - (fifo[SVGA_FIFO_NEXT_CMD] == (fifo[SVGA_FIFO_MAX]-4)) && + (fifo[SVGA_FIFO_NEXT_CMD] == (fifo[SVGA_FIFO_MAX] - VMWFIFO_CMD_SIZE)) && (fifo[SVGA_FIFO_STOP] == fifo[SVGA_FIFO_MIN]) ) ) syncVMWareSVGAFIFO(data); - fifo[fifo[SVGA_FIFO_NEXT_CMD] / 4] = val; - fifo[SVGA_FIFO_NEXT_CMD] += 4; + fifo[fifo[SVGA_FIFO_NEXT_CMD] >> VMWFIFO_CMD_SIZESHIFT] = val; + fifo[SVGA_FIFO_NEXT_CMD] += VMWFIFO_CMD_SIZE; if (fifo[SVGA_FIFO_NEXT_CMD] == fifo[SVGA_FIFO_MAX]) fifo[SVGA_FIFO_NEXT_CMD] = fifo[SVGA_FIFO_MIN]; @@ -108,15 +248,19 @@ BOOL initVMWareSVGAHW(struct HWData *data, OOP_Object *device) { ULONG id; + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) + id = getVMWareSVGAID(data); - if ((id == SVGA_ID_0) || (id == SVGA_ID_INVALID)) - { + if (id == SVGA_ID_INVALID) return FALSE; - } - initVMWareSVGAFIFO(data); + data->maskPool = CreatePool(MEMF_ANY, (32 << 3), (32 << 2)); - data->capabilities = vmwareReadReg(data, SVGA_REG_CAPABILITIES); + if (id >= SVGA_ID_1) + { + volatile ULONG *fifo = data->mmiobase; + data->capabilities = vmwareReadReg(data, SVGA_REG_CAPABILITIES); + } if (data->capabilities & SVGA_CAP_8BIT_EMULATION) { @@ -151,33 +295,21 @@ BOOL initVMWareSVGAHW(struct HWData *data, OOP_Object *device) data->vrambase = (APTR)(IPTR)vmwareReadReg(data, SVGA_REG_FB_START); data->pseudocolor = vmwareReadReg(data, SVGA_REG_PSEUDOCOLOR); - D(bug("[VMWareSVGA:HW] %s: VRAM at 0x%08x size %d\n", __func__, data->vrambase, data->vramsize)); - D(bug("[VMWareSVGA:HW] %s: no.displays: %d\n", __func__, data->displaycount)); - D(bug("[VMWareSVGA:HW] %s: caps : 0x%08x\n", __func__, data->capabilities)); - D(bug("[VMWareSVGA:HW] %s: no.displays: %d\n", __func__, data->displaycount)); - D(bug("[VMWareSVGA:HW] %s: depth: %d\n", __func__, data->depth)); - D(bug("[VMWareSVGA:HW] %s: bpp : %d\n", __func__, data->bitsperpixel)); - D(bug("[VMWareSVGA:HW] %s: maxw: %d\n", __func__, data->maxwidth)); - D(bug("[VMWareSVGA:HW] %s: maxh: %d\n", __func__, data->maxheight)); + D( + bug("[VMWareSVGA:HW] %s: VRAM at 0x%08x size %d\n", __func__, data->vrambase, data->vramsize); + bug("[VMWareSVGA:HW] %s: no.displays: %d\n", __func__, data->displaycount); + bug("[VMWareSVGA:HW] %s: depth: %d\n", __func__, data->depth); + bug("[VMWareSVGA:HW] %s: bpp : %d\n", __func__, data->bitsperpixel); + ) VMWareSVGA_RestartRenderTask(data); return TRUE; } -VOID setModeVMWareSVGA(struct HWData *data, ULONG width, ULONG height) +VOID getModeCfgVMWareSVGA(struct HWData *data) { - D(bug("[VMWareSVGA:HW] %s(%dx%d)\n", __func__, width, height)); - - vmwareWriteReg(data, SVGA_REG_ENABLE, 0); - - vmwareWriteReg(data, SVGA_REG_WIDTH, width); - vmwareWriteReg(data, SVGA_REG_HEIGHT, height); - - if (data->capabilities & SVGA_CAP_8BIT_EMULATION) - vmwareWriteReg(data, SVGA_REG_BITS_PER_PIXEL,data->bitsperpixel); - - vmwareWriteReg(data, SVGA_REG_ENABLE, 1); + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) data->fboffset = vmwareReadReg(data, SVGA_REG_FB_OFFSET); data->bytesperline = vmwareReadReg(data, SVGA_REG_BYTES_PER_LINE); @@ -189,10 +321,58 @@ VOID setModeVMWareSVGA(struct HWData *data, ULONG width, ULONG height) data->display_width = vmwareReadReg(data, SVGA_REG_WIDTH); data->display_height = vmwareReadReg(data, SVGA_REG_HEIGHT); + D(bug("[VMWareSVGA:HW] %s: %dx%d\n", __func__, data->display_width, data->display_height)); +} + +VOID enableVMWareSVGA(struct HWData *data) +{ + vmwareWriteReg(data, SVGA_REG_ENABLE, 1); +} + +VOID disableVMWareSVGA(struct HWData *data) +{ + vmwareWriteReg(data, SVGA_REG_ENABLE, 0); +} + +VOID initDisplayVMWareSVGA(struct HWData *data) +{ + enableVMWareSVGA(data); + getModeCfgVMWareSVGA(data); + initVMWareSVGAFIFO(data); +} + +VOID setModeVMWareSVGA(struct HWData *data, ULONG width, ULONG height) +{ + D(bug("[VMWareSVGA:HW] %s(%dx%d)\n", __func__, width, height)); + + disableVMWareSVGA(data); + + vmwareWriteReg(data, SVGA_REG_WIDTH, width); + vmwareWriteReg(data, SVGA_REG_HEIGHT, height); + + if (data->capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) + { + D(bug("[VMWareSVGA:HW] %s: Adjusting Display Topology\n", __func__);) + + vmwareWriteReg(data, SVGA_REG_DISPLAY_ID, 0); + vmwareWriteReg(data, SVGA_REG_DISPLAY_IS_PRIMARY, TRUE); + + vmwareWriteReg(data, SVGA_REG_DISPLAY_POSITION_X, 0); + vmwareWriteReg(data, SVGA_REG_DISPLAY_POSITION_Y, 0); + vmwareWriteReg(data, SVGA_REG_DISPLAY_WIDTH, width); + vmwareWriteReg(data, SVGA_REG_DISPLAY_HEIGHT, height); + } + + if (data->capabilities & SVGA_CAP_8BIT_EMULATION) + vmwareWriteReg(data, SVGA_REG_BITS_PER_PIXEL, data->bitsperpixel); + + initDisplayVMWareSVGA(data); } VOID refreshAreaVMWareSVGA(struct HWData *data, struct Box *box) { + DREFRESH(bug("[VMWareSVGA:HW] %s()\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_UPDATE); writeVMWareSVGAFIFO(data, box->x1); writeVMWareSVGAFIFO(data, box->y1); @@ -202,6 +382,8 @@ VOID refreshAreaVMWareSVGA(struct HWData *data, struct Box *box) VOID rectFillVMWareSVGA(struct HWData *data, ULONG color, LONG x, LONG y, LONG width, LONG height) { + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_RECT_FILL); writeVMWareSVGAFIFO(data, color); writeVMWareSVGAFIFO(data, x); @@ -213,6 +395,8 @@ VOID rectFillVMWareSVGA(struct HWData *data, ULONG color, LONG x, LONG y, LONG w VOID ropFillVMWareSVGA(struct HWData *data, ULONG color, LONG x, LONG y, LONG width, LONG height, ULONG mode) { + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_RECT_ROP_FILL); writeVMWareSVGAFIFO(data, color); writeVMWareSVGAFIFO(data, x); @@ -225,6 +409,8 @@ VOID ropFillVMWareSVGA(struct HWData *data, ULONG color, LONG x, LONG y, LONG wi VOID ropCopyVMWareSVGA(struct HWData *data, LONG sx, LONG sy, LONG dx, LONG dy, ULONG width, ULONG height, ULONG mode) { + D(bug("[VMWareSVGA:HW] %s()\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_RECT_ROP_COPY); writeVMWareSVGAFIFO(data, sx); writeVMWareSVGAFIFO(data, sy); @@ -238,68 +424,145 @@ VOID ropCopyVMWareSVGA(struct HWData *data, LONG sx, LONG sy, LONG dx, LONG dy, VOID defineCursorVMWareSVGA(struct HWData *data, struct MouseData *mouse) { - int i; ULONG size = mouse->width * mouse->height; - // TODO: This is utterly disgusting. Should be moved to either a proper static data area, or dynamic area down to the render task - ULONG xorMask[size]; + ULONG *xorMask, *xorBuffer; ULONG *image = mouse->shape; - ULONG *xorBuffer; - - writeVMWareSVGAFIFO(data, SVGA_CMD_DEFINE_ALPHA_CURSOR); - writeVMWareSVGAFIFO(data, 0); // id - writeVMWareSVGAFIFO(data, 0); // hotspot x - writeVMWareSVGAFIFO(data, 0); // hotspot y - writeVMWareSVGAFIFO(data, mouse->width); // width - writeVMWareSVGAFIFO(data, mouse->height); // height + int i; - xorBuffer = xorMask; + DCURSOR(bug("[VMWareSVGA:HW] %s()\n", __func__);) - for (i = 0; i < size; i++) + xorMask = (ULONG *)AllocVecPooled(data->maskPool, size << 2); + if (xorMask) { - ULONG pixel = *image ++; - *xorBuffer = pixel; - xorBuffer++; - } + DCURSOR(bug("[VMWareSVGA:HW] %s: xormask @ 0x%p\n", __func__, xorMask);) + xorBuffer = xorMask; + for (i = 0; i < size; i++) + { + ULONG pixel = *image ++; + *xorBuffer = pixel; + xorBuffer++; + } - xorBuffer = xorMask; - for (i = 0; i < size; i++) - { - writeVMWareSVGAFIFO(data, *xorBuffer++); - } + if (data->capabilities & SVGA_CAP_ALPHA_CURSOR) + { + DCURSOR(bug("[VMWareSVGA:HW] %s: rendering Alpha Cursor\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_DEFINE_ALPHA_CURSOR); + writeVMWareSVGAFIFO(data, VMWCURSOR_ID); // id + writeVMWareSVGAFIFO(data, 0); // hotspot x + writeVMWareSVGAFIFO(data, 0); // hotspot y + writeVMWareSVGAFIFO(data, mouse->width); // width + writeVMWareSVGAFIFO(data, mouse->height); // height + + xorBuffer = xorMask; + for (i = 0; i < size; i++) + { + writeVMWareSVGAFIFO(data, *xorBuffer++); + } - syncVMWareSVGAFIFO(data); + syncVMWareSVGAFIFO(data); + } + else + { +#if (0) + xandBuffer = (ULONG *)AllocVecPooled(data->maskPool, size << 2); + if (xandBuffer) + { + DCURSOR(bug("[VMWareSVGA:HW] %s: rendering masked Cursor\n", __func__);) + writeVMWareSVGAFIFO(data, SVGA_CMD_DEFINE_CURSOR); + writeVMWareSVGAFIFO(data, VMWCURSOR_ID); // id + writeVMWareSVGAFIFO(data, 0); // hotspot x + writeVMWareSVGAFIFO(data, 0); // hotspot y + writeVMWareSVGAFIFO(data, mouse->width); // width + writeVMWareSVGAFIFO(data, mouse->height); // height + + for (i = 0; i < size; i++) + { + writeVMWareSVGAFIFO(data, *xandBuffer++); + } + + xorBuffer = xorMask; + for (i = 0; i < size; i++) + { + writeVMWareSVGAFIFO(data, *xorBuffer++); + } + + syncVMWareSVGAFIFO(data); + FreeVecPooled(data->maskPool, xandBuffer); + } +#endif + } + FreeVecPooled(data->maskPool, xorMask); + } } VOID displayCursorVMWareSVGA(struct HWData *data, LONG mode) { -#if 0 - writeVMWareSVGAFIFO(data, SVGA_CMD_DISPLAY_CURSOR); - writeVMWareSVGAFIFO(data, 1); - writeVMWareSVGAFIFO(data, mode); - syncVMWareSVGAFIFO(data); -#else - vmwareWriteReg(data, SVGA_REG_CURSOR_ID, 1); - vmwareWriteReg(data, SVGA_REG_CURSOR_ON, mode); -#endif + volatile ULONG *fifo = data->mmiobase; + + DCURSOR(bug("[VMWareSVGA:HW] %s()\n", __func__);) + + if (hasCapVMWareSVGAFIFO(data, SVGA_FIFO_CURSOR_COUNT) && (data->fifocapabilities & SVGA_FIFO_CAP_CURSOR_BYPASS_3)) + { + ULONG count; + fifo[SVGA_FIFO_CURSOR_ON] = mode; + count = fifo[SVGA_FIFO_CURSOR_COUNT]; + fifo[SVGA_FIFO_CURSOR_COUNT] = ++count; + } + else + { + if (data->capabilities & SVGA_CAP_CURSOR_BYPASS_2) + { + vmwareWriteReg(data, SVGA_REG_CURSOR_ID, VMWCURSOR_ID); + vmwareWriteReg(data, SVGA_REG_CURSOR_ON, mode); + } + else + { + writeVMWareSVGAFIFO(data, SVGA_CMD_DISPLAY_CURSOR); + writeVMWareSVGAFIFO(data, VMWCURSOR_ID); + writeVMWareSVGAFIFO(data, mode); + syncVMWareSVGAFIFO(data); + } + } } VOID moveCursorVMWareSVGA(struct HWData *data, LONG x, LONG y) { -#if 0 - writeVMWareSVGAFIFO(data, SVGA_CMD_MOVE_CURSOR); - writeVMWareSVGAFIFO(data, x); - writeVMWareSVGAFIFO(data, y); - syncVMWareSVGAFIFO(data); -#else - vmwareWriteReg(data, SVGA_REG_CURSOR_ID, 1); - vmwareWriteReg(data, SVGA_REG_CURSOR_X, x); - vmwareWriteReg(data, SVGA_REG_CURSOR_Y, y); - vmwareWriteReg(data, SVGA_REG_CURSOR_ON, 1); -#endif + volatile ULONG *fifo = data->mmiobase; + + DCURSOR(bug("[VMWareSVGA:HW] %s()\n", __func__);) + + if (hasCapVMWareSVGAFIFO(data, SVGA_FIFO_CURSOR_COUNT) && (data->fifocapabilities & SVGA_FIFO_CAP_CURSOR_BYPASS_3)) + { + ULONG count; + fifo[SVGA_FIFO_CURSOR_ON] = SVGA_CURSOR_ON_SHOW; + fifo[SVGA_FIFO_CURSOR_X] = x; + fifo[SVGA_FIFO_CURSOR_Y] = y; + count = fifo[SVGA_FIFO_CURSOR_COUNT]; + fifo[SVGA_FIFO_CURSOR_COUNT] = ++count; + } + else + { + if (data->capabilities & SVGA_CAP_CURSOR_BYPASS_2) + { + vmwareWriteReg(data, SVGA_REG_CURSOR_ID, VMWCURSOR_ID); + vmwareWriteReg(data, SVGA_REG_CURSOR_X, x); + vmwareWriteReg(data, SVGA_REG_CURSOR_Y, y); + vmwareWriteReg(data, SVGA_REG_CURSOR_ON, SVGA_CURSOR_ON_SHOW); + } + else + { + writeVMWareSVGAFIFO(data, SVGA_CMD_MOVE_CURSOR); + writeVMWareSVGAFIFO(data, x); + writeVMWareSVGAFIFO(data, y); + syncVMWareSVGAFIFO(data); + } + } } VOID VMWareSVGA_Damage_Reset(struct HWData *hwdata) { + DDMG(bug("[VMWareSVGA:HW] %s()\n", __func__);) + ObtainSemaphore(&hwdata->damage_control); hwdata->delta_damage.x1 = INT_MAX; @@ -310,30 +573,55 @@ VOID VMWareSVGA_Damage_Reset(struct HWData *hwdata) ReleaseSemaphore(&hwdata->damage_control); } -VOID VMWareSVGA_Damage_DeltaAdd(struct HWData *hwdata, struct Box box) +VOID VMWareSVGA_Damage_DeltaAdd(struct HWData *hwdata, struct Box *box) { - ObtainSemaphore(&hwdata->damage_control); + ULONG tmpval; + + DDMG(bug("[VMWareSVGA:HW] %s()\n", __func__);) - if (box.x1 < hwdata->delta_damage.x1) + if (box->x1 > box->x2) { - hwdata->delta_damage.x1 = box.x1; + tmpval = box->x2; + box->x2 = box->x1; + box->x1 = tmpval; } - if (box.y1 < hwdata->delta_damage.y1) + if (box->y1 > box->y2) { - hwdata->delta_damage.y1 = box.y1; + tmpval = box->y2; + box->y2 = box->y1; + box->y1 = tmpval; } - if (box.x2 > hwdata->delta_damage.x2) + + ObtainSemaphore(&hwdata->damage_control); + if (box->x1 < hwdata->delta_damage.x1) { - hwdata->delta_damage.x2 = box.x2; + hwdata->delta_damage.x1 = box->x1; } - if (box.y2 > hwdata->delta_damage.y2) + if (box->y1 < hwdata->delta_damage.y1) { - hwdata->delta_damage.y2 = box.y2; + hwdata->delta_damage.y1 = box->y1; } + if (box->x2 > hwdata->delta_damage.x2) + { + hwdata->delta_damage.x2 = box->x2; + } + if (box->y2 > hwdata->delta_damage.y2) + { + hwdata->delta_damage.y2 = box->y2; + } +#if defined(VMWAREGFX_IMMEDIATEDRAW) + if (hwdata->shown) + { + refreshAreaVMWareSVGA(hwdata, &hwdata->delta_damage); + VMWareSVGA_Damage_Reset(hwdata); + syncVMWareSVGAFIFO(hwdata); + } +#endif ReleaseSemaphore(&hwdata->damage_control); } -void VMWareSVGA_RenderTask(struct HWData *hwdata) +#if !defined(VMWAREGFX_IMMEDIATEDRAW) +VOID VMWareSVGA_RenderTask(struct HWData *hwdata) { struct MsgPort render_thread_message_port; struct timerequest *timer_request; @@ -370,14 +658,13 @@ void VMWareSVGA_RenderTask(struct HWData *hwdata) if (!vmwareReadReg(hwdata, SVGA_REG_BUSY)) { ObtainSemaphore(&hwdata->damage_control); - struct Box damage = hwdata->delta_damage; - struct Box all_damage = {0, 0, hwdata->display_width, hwdata->display_height}; + struct Box *damage = &hwdata->delta_damage; - if (damage.x2 > damage.x1 && damage.y2 > damage.y1) + if ((damage->x2 > damage->x1) && (damage->y2 > damage->y1)) { - refreshAreaVMWareSVGA(hwdata, &all_damage); + refreshAreaVMWareSVGA(hwdata, &hwdata->delta_damage); VMWareSVGA_Damage_Reset(hwdata); - vmwareWriteReg(hwdata, SVGA_REG_SYNC, 1); + syncVMWareSVGAFIFO(hwdata); } ReleaseSemaphore(&hwdata->damage_control); } @@ -393,17 +680,19 @@ void VMWareSVGA_RenderTask(struct HWData *hwdata) CloseDevice(timer_request_as_io_request); } +#endif VOID VMWareSVGA_RestartRenderTask(struct HWData *hwdata) { // TODO: CleanUp and add defenses here InitSemaphore(&hwdata->damage_control); - +#if !defined(VMWAREGFX_IMMEDIATEDRAW) hwdata->render_task = NewCreateTask(TASKTAG_PC, VMWareSVGA_RenderTask, TASKTAG_NAME, "VMWare Render Task", TASKTAG_PRI, 1, TASKTAG_ARG1, hwdata, TAG_DONE); +#endif } diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h index e3066af780..904f8217a2 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h +++ b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "vmwaresvga_bitmap.h" @@ -191,35 +192,51 @@ #define SVGA_CAP_ALPHA_BLEND 0x02000 struct HWData { - UWORD indexReg; - UWORD valueReg; - ULONG depth; - ULONG redmask; - ULONG greenmask; - ULONG bluemask; - ULONG redshift; - ULONG greenshift; - ULONG blueshift; - ULONG bytesperpixel; - ULONG bitsperpixel; - ULONG bytesperline; - ULONG vramsize; - APTR vrambase; - ULONG maxwidth; - ULONG maxheight; - ULONG displaycount; - ULONG mmiosize; - APTR mmiobase; - ULONG fboffset; /* last byte in framebuffer of current screen mode */ - ULONG pseudocolor; - ULONG capabilities; - UWORD display_width; - UWORD display_height; - ULONG bytes_per_line; - - struct Box delta_damage; - struct Task *render_task; - struct SignalSemaphore damage_control; + APTR iobase; + APTR vrambase; + APTR mmiobase; + ULONG vramsize; + ULONG mmiosize; + + UWORD indexReg; + UWORD valueReg; + + ULONG capabilities; + ULONG fifocapabilities; + + struct HIDD_ViewPortData *shown; + + ULONG depth; + ULONG redmask; + ULONG greenmask; + ULONG bluemask; + ULONG redshift; + ULONG greenshift; + ULONG blueshift; + ULONG bytesperpixel; + ULONG bitsperpixel; + ULONG bytesperline; + + ULONG maxwidth; + ULONG maxheight; + ULONG displaycount; + + ULONG fboffset; /* last byte in framebuffer of current screen mode */ + ULONG pseudocolor; + + UWORD display_width; + UWORD display_height; + ULONG bytes_per_line; + + APTR maskPool; + APTR irq; + ULONG hwint; + ULONG fifomin; + ULONG fence; + + struct Box delta_damage; + struct Task *render_task; + struct SignalSemaphore damage_control; }; #define clearCopyVMWareSVGA(d, sx, sy, dx, dy, w, h) \ @@ -288,22 +305,36 @@ struct HWData { #define setFillVMWareSVGA(d, c, x, y, w, h) \ ropFillVMWareSVGA(d, c, x, y, w, h, SVGA_ROP_SET) -ULONG vmwareReadReg(struct HWData *data, ULONG reg); +ULONG vmwareReadReg(struct HWData *, ULONG); void vmwareWriteReg(struct HWData *, ULONG, ULONG); -VOID writeVMWareSVGAFIFO(struct HWData *, ULONG); -VOID syncVMWareSVGAFIFO(struct HWData *); + +VOID enableVMWareSVGA(struct HWData *); +VOID disableVMWareSVGA(struct HWData *); + BOOL initVMWareSVGAHW(struct HWData *, OOP_Object *); +VOID initDisplayVMWareSVGA(struct HWData *); +VOID getModeCfgVMWareSVGA(struct HWData *); VOID setModeVMWareSVGA(struct HWData *, ULONG, ULONG); VOID refreshAreaVMWareSVGA(struct HWData *, struct Box *); + VOID rectFillVMWareSVGA(struct HWData *, ULONG, LONG, LONG, LONG, LONG); VOID ropFillVMWareSVGA(struct HWData *, ULONG, LONG, LONG, LONG, LONG, ULONG); VOID ropCopyVMWareSVGA(struct HWData *, LONG, LONG, LONG, LONG, ULONG, ULONG, ULONG); + VOID defineCursorVMWareSVGA(struct HWData *, struct MouseData *); VOID displayCursorVMWareSVGA(struct HWData *, LONG); VOID moveCursorVMWareSVGA(struct HWData *, LONG, LONG); -VOID VMWareSVGA_Damage_Reset(struct HWData *hwdata); -VOID VMWareSVGA_Damage_DeltaAdd(struct HWData *hwdata, struct Box box); -VOID VMWareSVGA_RestartRenderTask(struct HWData *hwdata); +VOID writeVMWareSVGAFIFO(struct HWData *, ULONG); +VOID syncVMWareSVGAFIFO(struct HWData *); + +ULONG fenceVMWareSVGAFIFO(struct HWData *); +VOID syncfenceVMWareSVGAFIFO(struct HWData *, ULONG); + +VOID vmwareHandlerIRQ(struct HWData *, void *); + +VOID VMWareSVGA_Damage_Reset(struct HWData *); +VOID VMWareSVGA_Damage_DeltaAdd(struct HWData *, struct Box *); +VOID VMWareSVGA_RestartRenderTask(struct HWData *); #endif /* _VMWARESVGA_HARDWARE_H */ diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_hiddclass.c b/workbench/hidds/vmwaresvga/vmwaresvga_hiddclass.c index 37e8f955b8..553ae6b67f 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_hiddclass.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_hiddclass.c @@ -1,5 +1,5 @@ /* - Copyright � 1995-2019, The AROS Development Team. All rights reserved. + Copyright © 1995-2019, The AROS Development Team. All rights reserved. $Id$ Desc: Class for VMWare. @@ -15,8 +15,10 @@ #define __OOP_NOATTRBASES__ #include +#include #include #include + #include #include #include @@ -26,6 +28,9 @@ #include #include #include + +#include + #include #include @@ -33,9 +38,11 @@ #include LC_LIBDEFS_FILE +#if (DEBUG) #define DINFO(x) x - -#define DESCRIPTORNAME_LEN 32 +#else +#define DINFO(x) +#endif static OOP_AttrBase HiddAttrBase; static OOP_AttrBase HiddBitMapAttrBase; @@ -57,7 +64,7 @@ static struct OOP_ABDescr attrbases[] = {NULL, NULL } }; -STATIC ULONG mask_to_shift(ULONG mask) +static ULONG mask_to_shift(ULONG mask) { ULONG i; @@ -72,11 +79,65 @@ STATIC ULONG mask_to_shift(ULONG mask) return i; } -OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) +static ULONG VMWareSVGA__GetDefSyncSizes(ULONG syncno, ULONG *syncwid, ULONG *synchi) { - unsigned int sync_count, sync_modes, sync_curr, sync_displayid, sync_modeid; - ULONG max_width, max_height; +#define VMWARESVGA_DEFSYNCMAX 12 + switch (syncno % VMWARESVGA_DEFSYNCMAX) + { + case 1: + *syncwid = 800; + *synchi = 600; + break; + case 2: + *syncwid = 1024; + *synchi = 768; + break; + case 3: + *syncwid = 1280; + *synchi = 1024; + break; + case 4: + *syncwid = 1366; + *synchi = 768; + break; + case 5: + *syncwid = 1440; + *synchi = 900; + break; + case 6: + *syncwid = 1600; + *synchi = 1200; + break; + case 7: + *syncwid = 1680; + *synchi = 1050; + break; + case 8: + *syncwid = 1920; + *synchi = 1080; + break; + case 9: + *syncwid = 1920; + *synchi = 1200; + break; + case 10: + *syncwid = 2560; + *synchi = 1600; + break; + case 11: + *syncwid = 3840; + *synchi = 2160; + break; + default: + *syncwid = 640; + *synchi = 480; + break; + } + return (syncno % VMWARESVGA_DEFSYNCMAX); +} +OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) +{ struct TagItem pftags[] = { {aHidd_PixFmt_RedShift, 0 }, /* 0 */ @@ -97,91 +158,65 @@ OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New {aHidd_PixFmt_BitMapType, 0 }, /* 15 */ {TAG_DONE, 0UL } }; + struct TagItem *modetags; + ULONG max_width, max_height; + ULONG sync_Width, sync_Height; + ULONG sync_count, sync_modes, sync_curr, sync_actual, sync_displayid, sync_modeid; - /* TODO: Probe available sync modes */ -#define VMWARESVGA_SYNCMODES 12 - sync_modes = VMWARESVGA_SYNCMODES; - - // TODO: We don't really support multiple displays. We'll switch this back on when we can handle it - sync_count = sync_modes;// * XSD(cl)->data.displaycount; - - struct TagItem *modetags = AllocVec((sync_count + 2) * sizeof(struct TagItem), MEMF_CLEAR); + XSD(cl)->prefWidth = vmwareReadReg(&XSD(cl)->data, SVGA_REG_WIDTH); + XSD(cl)->prefHeight = vmwareReadReg(&XSD(cl)->data, SVGA_REG_HEIGHT); + DINFO(bug("[VMWareSVGA] %s: Default %dx%d\n", __func__, XSD(cl)->prefWidth, XSD(cl)->prefHeight)); + max_width = vmwareReadReg(&XSD(cl)->data, SVGA_REG_MAX_WIDTH); + max_height = vmwareReadReg(&XSD(cl)->data, SVGA_REG_MAX_HEIGHT); + DINFO(bug("[VMWareSVGA] %s: Max %dx%d\n", __func__, max_width, max_height)); + + DINFO(bug("[VMWareSVGA] %s: counting usable modes ...\n", __func__);) + /* Determine the number of sync modes we will expose (per display if applicable) */ + sync_count = VMWARESVGA_DEFSYNCMAX; + sync_modes = 0; + while (sync_count > 0) + { + sync_count = VMWareSVGA__GetDefSyncSizes(sync_count - 1, &sync_Width, &sync_Height) + 1; + DINFO(bug("[VMWareSVGA] %s: #%d ... %dx%d ", __func__, (VMWARESVGA_DEFSYNCMAX - sync_count) + 1, sync_Width, sync_Height);) + if ((sync_Width <= max_width) && (sync_Height <= max_height)) + { + DINFO(bug("is suitable");) + sync_modes += 1; + } + sync_count -= 1; + DINFO(bug("\n");) + } + DINFO(bug("[VMWareSVGA] %s: %d usable modes found\n", __func__, sync_modes);) + sync_count = sync_modes; +#if defined(VMWARESVGA_USEMULTIMON) + sync_count *= XSD(cl)->data.displaycount; +#endif + sync_curr = 1; +#if defined(VMWARESVGA_USE8BIT) + if ((data->capabilities & SVGA_CAP_8BIT_EMULATION) && (XSD(cl)->data.depth > 8)) + sync_curr += 1; +#endif + modetags = AllocVec((sync_count + sync_curr + 1) * sizeof(struct TagItem), MEMF_CLEAR); modetags[0].ti_Tag = aHidd_Gfx_PixFmtTags; modetags[0].ti_Data = (IPTR)pftags; - modetags[sync_count + 1].ti_Tag = TAG_DONE; - - sync_curr = 0; - -#if (0) - max_width = vmwareReadReg(&XSD(cl)->data, SVGA_REG_MAX_WIDTH); - max_height = vmwareReadReg(&XSD(cl)->data, VGA_REG_MAX_HEIGHT); +#if defined(VMWARESVGA_USE8BIT) + if ((data->capabilities & SVGA_CAP_8BIT_EMULATION) && (XSD(cl)->data.depth > 8)) + { + } #endif + sync_curr = 0; while (sync_curr < sync_count) { - sync_modeid = sync_curr % sync_modes; - sync_displayid = sync_curr/sync_modes; + char *sync_Description = AllocVec(SYNC_DESCNAME_LEN, MEMF_CLEAR); + struct TagItem *sync_mode = AllocVec(11 * sizeof(struct TagItem), MEMF_CLEAR); - ULONG sync_Width =0; - ULONG sync_Height=0; + sync_modeid = VMWareSVGA__GetDefSyncSizes(sync_curr, &sync_Width, &sync_Height); + sync_displayid = sync_curr/sync_modes; DINFO(bug("[VMWareSVGA] %s: Setting Sync Mode %d for Display %d\n", __func__, sync_modeid, sync_displayid)); - char *sync_Description = AllocVec(DESCRIPTORNAME_LEN, MEMF_CLEAR); - - switch (sync_modeid) - { - case 1: - sync_Width =800; - sync_Height=600; - break; - case 2: - sync_Width =1024; - sync_Height=768; - break; - case 3: - sync_Width =1280; - sync_Height=1024; - break; - case 4: - sync_Width =1366; - sync_Height=768; - break; - case 5: - sync_Width =1440; - sync_Height=900; - break; - case 6: - sync_Width =1600; - sync_Height=1200; - break; - case 7: - sync_Width =1680; - sync_Height=1050; - break; - case 8: - sync_Width =1920; - sync_Height=1080; - break; - case 9: - sync_Width =1920; - sync_Height=1200; - break; - case 10: - sync_Width =2560; - sync_Height=1600; - break; - case 11: - sync_Width =3840; - sync_Height=2160; - break; - default: - sync_Width =640; - sync_Height=480; - break; - } - if (sync_displayid == 0) { sprintf(sync_Description, "VMWareSVGA:%dx%d", sync_Width, sync_Height); @@ -192,38 +227,46 @@ OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New } DINFO(bug("[VMWareSVGA] %s: Description '%s'\n", __func__, sync_Description)); - struct TagItem *sync_mode = AllocVec(11 * sizeof(struct TagItem), MEMF_CLEAR); - sync_mode[0].ti_Tag = aHidd_Sync_Description; sync_mode[0].ti_Data = (IPTR)sync_Description; + sync_mode[1].ti_Tag = aHidd_Sync_PixelClock; + sync_mode[2].ti_Tag = aHidd_Sync_HDisp; sync_mode[2].ti_Data = sync_Width; + sync_mode[3].ti_Tag = aHidd_Sync_VDisp; sync_mode[3].ti_Data = sync_Height; + sync_mode[4].ti_Tag = aHidd_Sync_HSyncStart; + sync_mode[5].ti_Tag = aHidd_Sync_HSyncEnd; + sync_mode[6].ti_Tag = aHidd_Sync_HTotal; + sync_mode[7].ti_Tag = aHidd_Sync_VSyncStart; + sync_mode[8].ti_Tag = aHidd_Sync_VSyncEnd; + sync_mode[9].ti_Tag = aHidd_Sync_VTotal; + sync_mode[10].ti_Tag = TAG_DONE; modetags[1 + sync_curr].ti_Tag = aHidd_Gfx_SyncTags; modetags[1 + sync_curr].ti_Data = (IPTR)sync_mode; - sync_curr++; } + modetags[1 + sync_curr].ti_Tag = TAG_DONE; - struct TagItem yourtags[] = + struct TagItem svganewtags[] = { {aHidd_Gfx_ModeTags, (IPTR)modetags }, { aHidd_Name , (IPTR)"VMWareSVGA" }, { aHidd_HardwareName , (IPTR)"VMWare SVGA Gfx Adaptor" }, { aHidd_ProducerName , (IPTR)"VMWare Inc" }, - {TAG_MORE, 0UL } + {TAG_MORE, (IPTR)msg->attrList } }; - struct pRoot_New yourmsg; + struct pRoot_New svganewmsg; /* set pftags = 0 */ if (!XSD(cl)->data.pseudocolor) @@ -258,12 +301,15 @@ OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New pftags[11].ti_Data = XSD(cl)->data.bitsperpixel; pftags[12].ti_Data = vHidd_StdPixFmt_Native; pftags[15].ti_Data = vHidd_BitMapType_Chunky; +#if defined(VMWARESVGA_USE8BIT) + if ((data->capabilities & SVGA_CAP_8BIT_EMULATION) && (XSD(cl)->data.depth > 8)) + { + } +#endif - yourtags[1].ti_Data = (IPTR)msg->attrList; - - yourmsg.mID = msg->mID; - yourmsg.attrList = yourtags; - msg = &yourmsg; + svganewmsg.mID = msg->mID; + svganewmsg.attrList = svganewtags; + msg = &svganewmsg; EnterFunc(bug("[VMWareSVGA] New()\n")); o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); if (o) @@ -274,28 +320,40 @@ OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New XSD(cl)->mouse.shape = NULL; DINFO( bug("[VMWareSVGA] %s: Device capabilities: %08x\n", __func__, XSD(cl)->data.capabilities); + ) if (XSD(cl)->data.capabilities & SVGA_CAP_IRQMASK) - bug("[VMWareSVGA] %s: IRQ Mask\n", __func__); + { + UWORD port = (UWORD)((IPTR)XSD(cl)->data.iobase + SVGA_IRQSTATUS_PORT); + DINFO(bug("[VMWareSVGA] %s: IRQ Mask\n", __func__);) + vmwareWriteReg(&XSD(cl)->data, SVGA_REG_IRQMASK, 0); + outl(0xFF, port); + + DINFO(bug("[VMWareSVGA] %s: - Registering handler for IRQ #%d\n", __func__, XSD(cl)->data.hwint);) + XSD(cl)->data.irq = KrnAddIRQHandler(XSD(cl)->data.hwint, vmwareHandlerIRQ, &XSD(cl)->data, NULL); + vmwareWriteReg(&XSD(cl)->data, SVGA_REG_IRQMASK, SVGA_IRQFLAG_ERROR); + } + DINFO( if (XSD(cl)->data.capabilities & SVGA_CAP_EXTENDED_FIFO) bug("[VMWareSVGA] %s: Extended FIFO\n", __func__); - if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR) - bug("[VMWareSVGA] %s: HW Cursor\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_ALPHA_CURSOR) bug("[VMWareSVGA] %s: Alpha Cursor\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR_BYPASS) bug("[VMWareSVGA] %s: Cursor-Bypass\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR_BYPASS_2) bug("[VMWareSVGA] %s: Cursor-Bypass2\n", __func__); - if (XSD(cl)->data.capabilities & SVGA_CAP_RECT_COPY) - bug("[VMWareSVGA] %s: Copy Rect\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_8BIT_EMULATION) bug("[VMWareSVGA] %s: 8bit-emu\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_3D) bug("[VMWareSVGA] %s: 3D.\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_MULTIMON) bug("[VMWareSVGA] %s: Multimon\n", __func__); - if (XSD(cl)->data.capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) - bug("[VMWareSVGA] %s: Display Topology\n", __func__); + ) + if (XSD(cl)->data.capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) + { + DINFO(bug("[VMWareSVGA] %s: Display Topology\n", __func__);) + vmwareWriteReg(&XSD(cl)->data, SVGA_REG_NUM_GUEST_DISPLAYS, 1); + } + DINFO( if (XSD(cl)->data.capabilities & SVGA_CAP_PITCHLOCK) bug("[VMWareSVGA] %s: Pitchlock\n", __func__); if (XSD(cl)->data.capabilities & SVGA_CAP_GMR) @@ -307,6 +365,30 @@ OOP_Object *VMWareSVGA__Root__New(OOP_Class *cl, OOP_Object *o, struct pRoot_New if (XSD(cl)->data.capabilities & SVGA_CAP_SCREEN_OBJECT_2) bug("[VMWareSVGA] %s: Screen-Object2\n", __func__); ) + DINFO( + if (XSD(cl)->data.capabilities & SVGA_CAP_RECT_COPY) + bug("[VMWareSVGA] %s: Copy Rect\n", __func__); + if (XSD(cl)->data.capabilities & SVGA_CAP_RECT_FILL) + bug("[VMWareSVGA] %s: Fill Rect\n", __func__); + if (XSD(cl)->data.capabilities & SVGA_CAP_OFFSCREEN_1) + bug("[VMWareSVGA] %s: BitMap/Pixmap\n", __func__); + if (XSD(cl)->data.capabilities & SVGA_CAP_RECT_PAT_FILL) + bug("[VMWareSVGA] %s: Pattern Fill\n", __func__); + if ((XSD(cl)->data.capabilities & (SVGA_CAP_RECT_FILL|SVGA_CAP_RASTER_OP)) == (SVGA_CAP_RECT_FILL|SVGA_CAP_RASTER_OP)) + bug("[VMWareSVGA] %s: ROp Fill\n", __func__); + if ((XSD(cl)->data.capabilities & (SVGA_CAP_RECT_COPY|SVGA_CAP_RASTER_OP)) == (SVGA_CAP_RECT_COPY|SVGA_CAP_RASTER_OP)) + bug("[VMWareSVGA] %s: ROp Copy\n", __func__); + if ((XSD(cl)->data.capabilities & (SVGA_CAP_RECT_PAT_FILL|SVGA_CAP_RASTER_OP)) == (SVGA_CAP_RECT_PAT_FILL|SVGA_CAP_RASTER_OP)) + bug("[VMWareSVGA] %s: ROp Pattern Fill\n", __func__); + if (XSD(cl)->data.capabilities & SVGA_CAP_GLYPH) + bug("[VMWareSVGA] %s: Glyph\n", __func__); + if (XSD(cl)->data.capabilities & SVGA_CAP_GLYPH_CLIPPING) + bug("[VMWareSVGA] %s: Glyph Clipping\n", __func__); + ) +#if (0) + /* Set the ID so vmware knows we are here */ + vmwareWriteReg(&XSD(cl)->data, SVGA_REG_GUEST_ID, 0x09); +#endif } D(bug("[VMWareSVGA] %s: returning 0x%p\n", __func__, o);) @@ -330,9 +412,23 @@ VOID VMWareSVGA__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) switch (idx) { case aoHidd_Gfx_SupportsHWCursor: + { + found = TRUE; + if (XSD(cl)->data.capabilities & SVGA_CAP_CURSOR) + { + DINFO(bug("[VMWareSVGA] %s: HW Cursor\n", __func__);) + *msg->storage = (IPTR)TRUE; + } + else + *msg->storage = (IPTR)FALSE; + } + break; + + case aoHidd_Gfx_SupportsGamma: *msg->storage = (IPTR)TRUE; found = TRUE; break; + case aoHidd_Gfx_MemoryAttribs: { struct TagItem *matstate = (struct TagItem *)msg->storage; @@ -347,6 +443,7 @@ VOID VMWareSVGA__Root__Get(OOP_Class *cl, OOP_Object *o, struct pRoot_Get *msg) case tHidd_Gfx_MemTotal: case tHidd_Gfx_MemAddressableTotal: matag->ti_Data = (IPTR)vmwareReadReg(&XSD(cl)->data, SVGA_REG_VRAM_SIZE); + DINFO(bug("[VMWareSVGA] %s: Mem Size = %ld\n", __func__, matag->ti_Data);) break; case tHidd_Gfx_MemFree: case tHidd_Gfx_MemAddressableFree: @@ -367,7 +464,7 @@ OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, str { OOP_Object *object = NULL; - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) if (msg->cl == XSD(cl)->basebm) { @@ -380,7 +477,7 @@ OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, str { TAG_MORE, (IPTR)msg->attrList } }; - struct pHidd_Gfx_CreateObject yourmsg; + struct pHidd_Gfx_CreateObject comsg; displayable = GetTagData(aHidd_BitMap_Displayable, FALSE, msg->attrList); framebuffer = GetTagData(aHidd_BitMap_FrameBuffer, FALSE, msg->attrList); @@ -419,13 +516,14 @@ OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, str tags[0].ti_Tag = aHidd_BitMap_ClassPtr; tags[0].ti_Data = (IPTR)classptr; } - yourmsg.mID = msg->mID; - yourmsg.cl = msg->cl; - yourmsg.attrList = tags; + comsg.mID = msg->mID; + comsg.cl = msg->cl; + comsg.attrList = tags; - object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&yourmsg); + object = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg)&comsg); } - else if (XSD(cl)->basegallium && (msg->cl == XSD(cl)->basegallium)) + else if ((XSD(cl)->basegallium && (msg->cl == XSD(cl)->basegallium)) && + (XSD(cl)->data.capabilities & SVGA_CAP_3D)) { /* Create the gallium 3d driver object .. */ object = OOP_NewObject(NULL, CLID_Hidd_Gallium_VMWareSVGA, msg->attrList); @@ -437,6 +535,75 @@ OOP_Object *VMWareSVGA__Hidd_Gfx__CreateObject(OOP_Class *cl, OOP_Object *o, str return object; } +ULONG VMWareSVGA__Hidd_Gfx__ShowViewPorts(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_ShowViewPorts *msg) +{ + IPTR width = 0, bm_width, height = 0, bm_height; + struct HIDD_ViewPortData *currVPD; + + D(bug("[VMWareSVGA] %s()\n", __func__);) + +#if defined(VMWAREGFX_UPDATEFBONSHOWVP) + if ((currVPD = msg->Data) != 0) + { + if ((XSD(cl)->data.shown) && (XSD(cl)->mouse.visible)) + { + D(bug("[VMWareSVGA] %s: removing cursor...\n", __func__);) + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_HIDE); + } + + XSD(cl)->data.shown = currVPD; + D(bug("[VMWareSVGA] %s: shown = 0x%p\n", __func__, XSD(cl)->data.shown)); + + while ((currVPD) && (currVPD->Bitmap)) + { + OOP_GetAttr(currVPD->Bitmap, aHidd_BitMap_Width, (IPTR *)&bm_width); + if (bm_width > width) + width = bm_width; + OOP_GetAttr(currVPD->Bitmap, aHidd_BitMap_Height, (IPTR *)&bm_height); + if (bm_height > height) + height = bm_height; + currVPD = currVPD->Next; + } + D(bug("[VMWareSVGA] %s: %dx%d\n", __func__, width, height)); + + if (width == 0) + width = XSD(cl)->prefWidth; + if (height == 0) + height = XSD(cl)->prefHeight; + + setModeVMWareSVGA(&XSD(cl)->data, width, height); + syncfenceVMWareSVGAFIFO(&XSD(cl)->data, fenceVMWareSVGAFIFO(&XSD(cl)->data)); + if (XSD(cl)->mouse.visible) + { + D(bug("[VMWareSVGA] %s: displaying cursor...\n", __func__);) + defineCursorVMWareSVGA(&XSD(cl)->data, &XSD(cl)->mouse); + moveCursorVMWareSVGA(&XSD(cl)->data, XSD(cl)->mouse.x, XSD(cl)->mouse.y); + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_SHOW); + } + } + else + { + D(bug("[VMWareSVGA] %s: nothing to show ...\n", __func__);) + } +#endif + return OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); +} + +BOOL VMWareSVGA__Hidd_Gfx__SetGamma(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_Gamma *msg) +{ + D(bug("[VMWareSVGA] %s()\n", __func__);) +#if (0) + int i; + for (i = 0; i < 256; i++) { + D(bug("[VMWareSVGA] %s: #%d 0x%04x:0x%04x:0x%04x\n", __func__, i, msg->Red[i], msg->Green[i], msg->Blue[i]);) + vmwareWriteReg(&XSD(cl)->data, SVGA_PALETTE_BASE + i * 3 + 0, msg->Red[i] >> 8); + vmwareWriteReg(&XSD(cl)->data, SVGA_PALETTE_BASE + i * 3 + 1, msg->Green[i] >> 8); + vmwareWriteReg(&XSD(cl)->data, SVGA_PALETTE_BASE + i * 3 + 2, msg->Blue[i] >> 8); + } +#endif + return TRUE; +} + VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_CopyBox *msg) { UBYTE *src = NULL; @@ -445,7 +612,7 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf struct HWData *hwdata = &XSD(cl)->data; struct Box box = { msg->srcX, msg->srcY, msg->srcX + msg->width + 1, msg->srcY + msg->height + 1}; - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) ObtainSemaphore(&hwdata->damage_control); @@ -458,8 +625,10 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf } // TODO: This is nice and fast. but unfortunately has to go. We'll soon switch to a more refined accelerated blitting - else if (dst == src) + else if ((VPVISFLAG) && (dst == src) && (OOP_OCLASS(msg->dest) == XSD(cl)->vmwaresvgaonbmclass)) { + D(bug("[VMWareSVGA] %s: suitable bitmaps used ...\n", __func__);) + struct BitmapData *data; data = OOP_INST_DATA(OOP_OCLASS(msg->src), msg->src); switch (mode) @@ -513,7 +682,10 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf setCopyVMWareSVGA(data->data, msg->srcX, msg->srcY, msg->destX, msg->destY, msg->width, msg->height); break; default: + { + D(bug("[VMWareSVGA] %s: mode %d is not handled\n", __func__, mode);) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); + } } } else @@ -533,8 +705,10 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf { offset = (msg->srcX*srcbd->bytesperpix)+(msg->srcY*srcbd->data->bytesperline); srestadd = (srcbd->data->bytesperline - (msg->width*srcbd->bytesperpix)); -// displayCursorVMWareSVGA(&XSD(cl)->data, 0); -// XSD(cl)->mouse.visible = 0; + if ((VPVISFLAG) && (XSD(cl)->mouse.visible)) + { + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_REMOVE_FROM_FB); + } } else { @@ -546,8 +720,10 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf { offset = (msg->destX*dstbd->bytesperpix)+(msg->destY*dstbd->data->bytesperline); drestadd = (dstbd->data->bytesperline - (msg->width*dstbd->bytesperpix)); -// displayCursorVMWareSVGA(&XSD(cl)->data, 0); -// XSD(cl)->mouse.visible = 0; + if ((VPVISFLAG) && (XSD(cl)->mouse.visible)) + { + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_REMOVE_FROM_FB); + } } else { @@ -559,30 +735,32 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf switch (mode) { case vHidd_GC_DrawMode_Copy: - while (ycnt--) { - xcnt = msg->width; + D(bug("[VMWareSVGA] %s: using CopyMem\n", __func__);) + while (ycnt--) + { + xcnt = msg->width; - // NOTE: this is only valid if the two bitmaps share the same bytes per pixel. - // we may want to pre-process it (see below in the mouse definition code) - CopyMem(sbuffer, dbuffer, xcnt * dstbd->bytesperpix); + // NOTE: this is only valid if the two bitmaps share the same bytes per pixel. + // we may want to pre-process it (see below in the mouse definition code) + CopyMem(sbuffer, dbuffer, xcnt * dstbd->bytesperpix); - sbuffer += xcnt * dstbd->bytesperpix; - sbuffer += srestadd; - dbuffer += xcnt * dstbd->bytesperpix; - dbuffer += drestadd; + sbuffer += xcnt * dstbd->bytesperpix; + sbuffer += srestadd; + dbuffer += xcnt * dstbd->bytesperpix; + dbuffer += drestadd; + } } break; default: - D(bug("[VMWareSVGA] mode = %ld src=%lx dst=%lx\n", mode, src, dst);) + D(bug("[VMWareSVGA] mode = %ld, src @ 0x%p dst @ 0x%p\n", mode, src, dst);) OOP_DoSuperMethod(cl, o, (OOP_Msg)msg); } -// if (XSD(cl)->mouse.visible == 0) -// { -// displayCursorVMWareSVGA(&XSD(cl)->data, 1); -// XSD(cl)->mouse.visible = 1; -// } + if ((VPVISFLAG) && (XSD(cl)->mouse.visible)) + { + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_RESTORE_TO_FB); + } } box.x1 = msg->srcX; @@ -590,7 +768,7 @@ VOID VMWareSVGA__Hidd_Gfx__CopyBox(OOP_Class *cl, OOP_Object *o, struct pHidd_Gf box.x2 = box.x1+msg->width+1; box.y2 = box.y1+msg->height+1; - VMWareSVGA_Damage_DeltaAdd(hwdata, box); + VMWareSVGA_Damage_DeltaAdd(hwdata, &box); ReleaseSemaphore(&hwdata->damage_control); D(bug("[VMWareSVGA] %s: done\n", __func__);) @@ -600,11 +778,13 @@ BOOL VMWareSVGA__Hidd_Gfx__SetCursorShape(OOP_Class *cl, OOP_Object *o, struct p { struct VMWareSVGA_staticdata *data = XSD(cl); - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) if (msg->shape == NULL) { - displayCursorVMWareSVGA(&XSD(cl)->data, 0); + D(bug("[VMWareSVGA] %s: blanking cursor\n", __func__);) + if ((VPVISFLAG) && (XSD(cl)->visible)) + displayCursorVMWareSVGA(&XSD(cl)->data, SVGA_CURSOR_ON_HIDE); data->mouse.oopshape = NULL; FreeVec(data->mouse.shape); data->mouse.shape = NULL; @@ -613,33 +793,43 @@ BOOL VMWareSVGA__Hidd_Gfx__SetCursorShape(OOP_Class *cl, OOP_Object *o, struct p } else { - OOP_Object *pfmt; +#if (0) OOP_Object *colmap; + OOP_Object *pfmt; HIDDT_StdPixFmt pixfmt; +#endif IPTR tmp; OOP_GetAttr(msg->shape, aHidd_BitMap_Width, &tmp); data->mouse.width = tmp; OOP_GetAttr(msg->shape, aHidd_BitMap_Height, &tmp); data->mouse.height = tmp; +#if (0) OOP_GetAttr(msg->shape, aHidd_BitMap_PixFmt, (IPTR *)&pfmt); OOP_GetAttr(pfmt, aHidd_PixFmt_StdPixFmt, (IPTR *)&pixfmt); OOP_GetAttr(msg->shape, aHidd_BitMap_ColorMap, (IPTR *)&colmap); - data->mouse.oopshape = msg->shape; +#endif /* convert shape to vmware needs */ FreeVec(data->mouse.shape); tmp = data->mouse.width * data->mouse.height; - data->mouse.shape = AllocVec(tmp * 4, MEMF_CLEAR|MEMF_PUBLIC); + data->mouse.shape = AllocVec(tmp << 2, MEMF_CLEAR|MEMF_PUBLIC); if (data->mouse.shape != NULL) { UBYTE *shape; shape = data->mouse.shape; + data->mouse.oopshape = msg->shape; // Get data from the bitmap. Using the ALPHA CURSOR we can now directly pre-process the bitmap to a suitable format HIDD_BM_GetImage(msg->shape, (UBYTE *)shape, data->mouse.width * 4, 0, 0, data->mouse.width, data->mouse.height, vHidd_StdPixFmt_BGRA32); + if (XSD(cl)->visible) + { + struct BitmapData *bmdata = OOP_INST_DATA(XSD(cl)->vmwaresvgaonbmclass, XSD(cl)->visible); - defineCursorVMWareSVGA(&XSD(cl)->data, &data->mouse); + syncfenceVMWareSVGAFIFO(bmdata->data, (bmdata->data->fence - 1)); + defineCursorVMWareSVGA(bmdata->data, &data->mouse); + syncfenceVMWareSVGAFIFO(bmdata->data, fenceVMWareSVGAFIFO(bmdata->data)); + } return TRUE; } } @@ -649,28 +839,41 @@ BOOL VMWareSVGA__Hidd_Gfx__SetCursorShape(OOP_Class *cl, OOP_Object *o, struct p BOOL VMWareSVGA__Hidd_Gfx__SetCursorPos(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_SetCursorPos *msg) { - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) XSD(cl)->mouse.x = msg->x; XSD(cl)->mouse.y = msg->y; - moveCursorVMWareSVGA(&XSD(cl)->data, XSD(cl)->mouse.x, XSD(cl)->mouse.y); + if ((VPVISFLAG) && (XSD(cl)->visible)) + { + struct BitmapData *bmdata = OOP_INST_DATA(XSD(cl)->vmwaresvgaonbmclass, XSD(cl)->visible); + + syncfenceVMWareSVGAFIFO(bmdata->data, (bmdata->data->fence - 1)); + moveCursorVMWareSVGA(bmdata->data, XSD(cl)->mouse.x, XSD(cl)->mouse.y); + syncfenceVMWareSVGAFIFO(bmdata->data, fenceVMWareSVGAFIFO(bmdata->data)); + } return TRUE; } VOID VMWareSVGA__Hidd_Gfx__SetCursorVisible(OOP_Class *cl, OOP_Object *o, struct pHidd_Gfx_SetCursorVisible *msg) { - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) XSD(cl)->mouse.visible = msg->visible; - displayCursorVMWareSVGA(&XSD(cl)->data, msg->visible ? 1 : 0); -} + if ((VPVISFLAG) && (XSD(cl)->visible)) + { + struct BitmapData *bmdata = OOP_INST_DATA(XSD(cl)->vmwaresvgaonbmclass, XSD(cl)->visible); + syncfenceVMWareSVGAFIFO(bmdata->data, (bmdata->data->fence - 1)); + displayCursorVMWareSVGA(bmdata->data, msg->visible ? SVGA_CURSOR_ON_SHOW : SVGA_CURSOR_ON_HIDE); + syncfenceVMWareSVGAFIFO(bmdata->data, fenceVMWareSVGAFIFO(bmdata->data)); + } +} static int VMWareSVGA_InitStatic(LIBBASETYPEPTR LIBBASE) { - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) LIBBASE->vsd.mouse.x=0; LIBBASE->vsd.mouse.y=0; @@ -678,22 +881,22 @@ static int VMWareSVGA_InitStatic(LIBBASETYPEPTR LIBBASE) if (!OOP_ObtainAttrBases(attrbases)) { - D(bug("[VMWareSVGA] %s: attrbases init failed\n", __func__)); + D(bug("[VMWareSVGA] %s: attrbases init failed\n", __func__);) return FALSE; } - D(bug("[VMWareSVGA] %s: initialised\n", __func__)); + D(bug("[VMWareSVGA] %s: initialised\n", __func__);) return TRUE; } static int VMWareSVGA_ExpungeStatic(LIBBASETYPEPTR LIBBASE) { - D(bug("[VMWareSVGA] %s()\n", __func__)); + D(bug("[VMWareSVGA] %s()\n", __func__);) OOP_ReleaseAttrBases(attrbases); - D(bug("[VMWareSVGA] %s: done\n", __func__)); + D(bug("[VMWareSVGA] %s: done\n", __func__);) return TRUE; } diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_init.c b/workbench/hidds/vmwaresvga/vmwaresvga_init.c index 2d74d685e7..aa88384998 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_init.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_init.c @@ -45,33 +45,38 @@ AROS_UFH3(void, VMWSVGAEnumerator, AROS_USERFUNC_INIT struct VMWareSVGA_staticdata *xsd = (struct VMWareSVGA_staticdata *)hook->h_Data; - + IPTR io_base, fb_base, mmio_base, INTLine; IPTR ProductID, VendorID, SubClass; OOP_GetAttr(pciDevice, aHidd_PCIDevice_ProductID, &ProductID); OOP_GetAttr(pciDevice, aHidd_PCIDevice_VendorID, &VendorID); OOP_GetAttr(pciDevice, aHidd_PCIDevice_SubClass, &SubClass); - bug("[vmwaresvga.hidd] %s: VMWare SVGA device %04x\n", __func__, ProductID); + OOP_GetAttr(pciDevice, aHidd_PCIDevice_Base0, &io_base); + OOP_GetAttr(pciDevice, aHidd_PCIDevice_Base1, &fb_base); + OOP_GetAttr(pciDevice, aHidd_PCIDevice_Base2, &mmio_base); + xsd->data.iobase = (APTR)io_base; + xsd->data.vrambase = (APTR)fb_base; + xsd->data.mmiobase = (APTR)mmio_base; + OOP_GetAttr(pciDevice, aHidd_PCIDevice_INTLine, &INTLine); + xsd->data.hwint = (ULONG)INTLine; + + D(bug("[vmwaresvga.hidd] %s: VMWare SVGA device %04x\n", __func__, ProductID);) if (ProductID == DEVICE_VMWARE0710) { xsd->data.indexReg = SVGA_LEGACY_BASE_PORT + SVGA_INDEX_PORT * sizeof(ULONG); xsd->data.valueReg = SVGA_LEGACY_BASE_PORT + SVGA_VALUE_PORT * sizeof(ULONG); - bug("[vmwaresvga.hidd] %s: Found VMWare SVGA 0710 device\n", __func__); + D(bug("[vmwaresvga.hidd] %s: Found VMWare SVGA 0710 device\n", __func__);) xsd->card = pciDevice; } else if (ProductID == DEVICE_VMWARE0405) { - IPTR mmio; - - OOP_GetAttr(pciDevice, aHidd_PCIDevice_Base0, &mmio); - - xsd->data.indexReg = mmio + SVGA_INDEX_PORT; - xsd->data.valueReg = mmio + SVGA_VALUE_PORT; - - bug("[vmwaresvga.hidd] %s: Found VMWare SVGA 0405 device\n", __func__); + xsd->data.indexReg = io_base + SVGA_INDEX_PORT; + xsd->data.valueReg = io_base + SVGA_VALUE_PORT; + + D(bug("[vmwaresvga.hidd] %s: Found VMWare SVGA 0405 device\n", __func__);) xsd->card = pciDevice; } @@ -99,7 +104,7 @@ STATIC BOOL findCard(struct VMWareSVGA_staticdata *xsd) { if (!initVMWareSVGAHW(&xsd->data, xsd->card)) { - bug("[vmwaresvga.hidd] %s: Unsupported VMWare SVGA device found - skipping\n", __func__); + D(bug("[vmwaresvga.hidd] %s: Unsupported VMWare SVGA device found - skipping\n", __func__);) xsd->card = NULL; } } @@ -114,6 +119,10 @@ static int VMWareSVGA_Init(LIBBASETYPEPTR LIBBASE) if (xsd->VMWareSVGACyberGfxBase == NULL) goto failure; + xsd->VMWareSVGAKernelBase = OpenResource("kernel.resource"); + if (xsd->VMWareSVGAKernelBase == NULL) + goto failure; + if (!OOP_ObtainAttrBases(abd)) goto failure; @@ -135,11 +144,11 @@ static int VMWareSVGA_Init(LIBBASETYPEPTR LIBBASE) if (!findCard(xsd)) goto failure; - D(bug("[vmwaresvga.hidd] %s: Suitable adaptor found\n", __func__)); + D(bug("[vmwaresvga.hidd] %s: Suitable adaptor found\n", __func__);) return TRUE; failure: - D(bug("[vmwaresvga.hidd] %s: No suitable adaptors found\n", __func__)); + D(bug("[vmwaresvga.hidd] %s: No suitable adaptors found\n", __func__);) if (xsd->VMWareSVGACyberGfxBase) CloseLibrary(xsd->VMWareSVGACyberGfxBase); diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_intern.h b/workbench/hidds/vmwaresvga/vmwaresvga_intern.h index 20fd5a7673..8db8b86b2d 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_intern.h +++ b/workbench/hidds/vmwaresvga/vmwaresvga_intern.h @@ -14,16 +14,42 @@ #include #include +/***************** build options for debuggins and testing features ****************************/ +//#define VMWARESVGA_USEMULTIMON +//#define VMWARESVGA_USE8BIT +//#define VMWAREGFX_IMMEDIATEDRAW +//#define VMWAREGFX_UPDATEFBONSHOWVP +/***********************************************************************************************/ + +#if defined(VMWAREGFX_UPDATEFBONSHOWVP) +#define VPVISFLAG (XSD(cl)->data.shown) +#else +#define VPVISFLAG (TRUE) +#endif + #include "vmwaresvga_hardware.h" -#include "vmwaresvga_bitmap.h" #include "vmwaresvga_gallium.h" #define IID_Hidd_VMWareSVGA "hidd.gfx.vmwaresvga" #define CLID_Hidd_VMWareSVGA "hidd.gfx.vmwaresvga" +#define SYNC_DESCNAME_LEN 32 + +#define VMWFIFO_CMD_SIZESHIFT 2 +#define VMWFIFO_CMD_SIZE (1 << VMWFIFO_CMD_SIZESHIFT) + +#define VMWCURSOR_ID 1 + +#if (AROS_BIG_ENDIAN == 1) +#define AROS_PIXFMT RECTFMT_RAW /* Big Endian Archs. */ +#else +#define AROS_PIXFMT RECTFMT_BGRA32 /* Little Endian Archs. */ +#endif + struct VMWareSVGA_staticdata { struct MemHeader mh; struct Library *VMWareSVGACyberGfxBase; + APTR VMWareSVGAKernelBase; /* Base classes for CreateObject */ OOP_Class *basebm; @@ -40,13 +66,15 @@ struct VMWareSVGA_staticdata { OOP_Object *card; OOP_Object *pcihidd; + OOP_Object *visible; + OOP_AttrBase hiddGalliumAB; - struct BitmapData *visible; VOID (*activecallback)(APTR, OOP_Object *, BOOL); APTR callbackdata; struct MouseData mouse; struct HWData data; + ULONG prefWidth, prefHeight; }; struct VMWareSVGABase @@ -59,6 +87,7 @@ struct VMWareSVGABase #define XSD(cl) (&((struct VMWareSVGABase *)cl->UserData)->vsd) #define CyberGfxBase (XSD(cl)->VMWareSVGACyberGfxBase) +#define KernelBase (XSD(cl)->VMWareSVGAKernelBase) #undef HiddGalliumAttrBase #define HiddGalliumAttrBase (XSD(cl)->hiddGalliumAB) diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_offbitmapclass.c b/workbench/hidds/vmwaresvga/vmwaresvga_offbitmapclass.c index 37cf308792..cbdda816e3 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_offbitmapclass.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_offbitmapclass.c @@ -6,12 +6,6 @@ Lang: English. */ -#ifdef DEBUG -#undef DEBUG -#endif -#define DEBUG 0 -#include - #define __OOP_NOATTRBASES__ #include @@ -49,37 +43,53 @@ static struct OOP_ABDescr attrbases[] = {NULL, NULL } }; +#define DEBUGNAME "[VMWareSVGA:OffBitMap]" #define MNAME_ROOT(x) VMWareSVGAOffBM__Root__ ## x #define MNAME_BM(x) VMWareSVGAOffBM__Hidd_BitMap__ ## x #include "vmwaresvga_bitmap_common.c" +/* + include our debug overides after bitmap_common incase it sets its own values... + */ +#ifdef DEBUG +#undef DEBUG +#endif +#define DEBUG 0 +#include + /*********** BitMap::New() *************************************/ OOP_Object *MNAME_ROOT(New)(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) { - EnterFunc(bug("VMWareSVGA.BitMap::New()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) + o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg) msg); if (o) { struct BitmapData *data; LONG multi=1; IPTR width, height, depth; - OOP_Object *friend, *pf; + OOP_Object *bmfriend, *pf; + data = OOP_INST_DATA(cl, o); + /* clear all data */ memset(data, 0, sizeof(struct BitmapData)); + /* Get attr values */ OOP_GetAttr(o, aHidd_BitMap_Width, &width); OOP_GetAttr(o, aHidd_BitMap_Height, &height); OOP_GetAttr(o, aHidd_BitMap_PixFmt, (IPTR *)&pf); OOP_GetAttr(pf, aHidd_PixFmt_Depth, &depth); + /* Get the friend bitmap. This should be a displayable bitmap */ - OOP_GetAttr(o, aHidd_BitMap_Friend, (IPTR *)&friend); + OOP_GetAttr(o, aHidd_BitMap_Friend, (IPTR *)&bmfriend); + /* If you got a friend bitmap, copy its colormap */ - if (friend) + if (bmfriend) { - struct BitmapData *src = OOP_INST_DATA(cl, friend); + struct BitmapData *src = OOP_INST_DATA(cl, bmfriend); CopyMem(&src->cmap, &data->cmap, 4*16); } ASSERT (width != 0 && height != 0 && depth != 0); @@ -93,21 +103,26 @@ OOP_Object *MNAME_ROOT(New)(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) else if (depth>8) multi = 2; data->bytesperpix = multi; + data->VideoData = AllocVec(width*height*multi, MEMF_PUBLIC | MEMF_CLEAR); if (data->VideoData) { + InitSemaphore(&data->bmsem); data->data = &XSD(cl)->data; if (XSD(cl)->activecallback) XSD(cl)->activecallback(XSD(cl)->callbackdata, o, TRUE); - ReturnPtr("VMWareSVGA.BitMap::New()", OOP_Object *, o); } /* if got data->VideoData */ + else { OOP_MethodID disp_mid = OOP_GetMethodID(IID_Root, moRoot_Dispose); OOP_CoerceMethod(cl, o, (OOP_Msg) &disp_mid); + o = NULL; } - o = NULL; } /* if created object */ - ReturnPtr("VMWareSVGA.BitMap::New()", OOP_Object *, o); + + D(bug(DEBUGNAME " %s: returning 0x%p\n", __func__, o)); + + return o; } /********** Bitmap::Dispose() ***********************************/ @@ -116,7 +131,8 @@ VOID MNAME_ROOT(Dispose)(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) { struct BitmapData *data = OOP_INST_DATA(cl, o); - EnterFunc(bug("VMWareSVGA.BitMap::Dispose()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) + FreeVec(data->VideoData); OOP_DoSuperMethod(cl, o, msg); ReturnVoid("VMWareSVGA.BitMap::Dispose"); @@ -126,7 +142,7 @@ VOID MNAME_ROOT(Dispose)(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) static int VMWareSVGAOffBM_Init(LIBBASETYPEPTR LIBBASE) { - EnterFunc(bug("VMWareSVGAOffBM_Init\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) ReturnInt("VMWareSVGAOffBM_Init", ULONG, OOP_ObtainAttrBases(attrbases)); } @@ -135,7 +151,7 @@ static int VMWareSVGAOffBM_Init(LIBBASETYPEPTR LIBBASE) static int VMWareSVGAOffBM_Expunge(LIBBASETYPEPTR LIBBASE) { - EnterFunc(bug("VMWareSVGAOffBM_Expunge\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) OOP_ReleaseAttrBases(attrbases); diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_onbitmapclass.c b/workbench/hidds/vmwaresvga/vmwaresvga_onbitmapclass.c index 07b795a224..7e38e71af2 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_onbitmapclass.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_onbitmapclass.c @@ -6,12 +6,6 @@ Lang: English. */ -#ifdef DEBUG -#undef DEBUG -#endif -#define DEBUG 0 -#include - #define __OOP_NOATTRBASES__ #include @@ -50,88 +44,105 @@ static struct OOP_ABDescr attrbases[] = { NULL, NULL } }; +#define DEBUGNAME "[VMWareSVGA:OnBitMap]" #define MNAME_ROOT(x) VMWareSVGAOnBM__Root__ ## x #define MNAME_BM(x) VMWareSVGAOnBM__Hidd_BitMap__ ## x #define OnBitmap 1 #include "vmwaresvga_bitmap_common.c" +/* + include our debug overides after bitmap_common incase it sets its own values... + */ +#ifdef DEBUG +#undef DEBUG +#endif +#define DEBUG 0 +#include + /*********** BitMap::New() *************************************/ OOP_Object *MNAME_ROOT(New)(OOP_Class *cl, OOP_Object *o, struct pRoot_New *msg) { - EnterFunc(bug("VMWareSVGA.BitMap::New()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) + o = (OOP_Object *)OOP_DoSuperMethod(cl, o, (OOP_Msg) msg); if (o) { - struct BitmapData *data; + struct BitmapData *data = OOP_INST_DATA(cl, o); LONG multi=1; OOP_Object *pf; IPTR width, height, depth; HIDDT_ModeID modeid; - data = OOP_INST_DATA(cl, o); /* clear all data */ memset(data, 0, sizeof(struct BitmapData)); + /* Get attr values */ + OOP_GetAttr(o, aHidd_BitMap_Width, &width); OOP_GetAttr(o, aHidd_BitMap_Height, &height); OOP_GetAttr(o, aHidd_BitMap_PixFmt, (IPTR *)&pf); OOP_GetAttr(pf, aHidd_PixFmt_Depth, &depth); ASSERT (width != 0 && height != 0 && depth != 0); + /* We must only create depths that are supported by the friend drawable Currently we only support the default depth */ - width=(width+15) & ~15; + width = (width + 15) & ~15; data->width = width; data->height = height; data->bpp = depth; data->disp = -1; - if (depth>16) + if (depth > 16) multi = 4; - else if (depth>8) + else if (depth > 8) multi = 2; data->bytesperpix = multi; + data->data = &XSD(cl)->data; data->mouse = &XSD(cl)->mouse; - data->VideoData = data->data->vrambase; + /* We should be able to get modeID from the bitmap */ OOP_GetAttr(o, aHidd_BitMap_ModeID, &modeid); - if (modeid != vHidd_ModeID_Invalid) - { - /* - Because of not defined BitMap_Show method show - bitmap immediately - */ - setModeVMWareSVGA(&XSD(cl)->data, width, height); - XSD(cl)->visible = data; /* Set created object as visible */ - ReturnPtr("VMWareSVGA.BitMap::New()", OOP_Object *, o); - } + if (modeid == vHidd_ModeID_Invalid) { OOP_MethodID disp_mid = OOP_GetMethodID(IID_Root, moRoot_Dispose); OOP_CoerceMethod(cl, o, (OOP_Msg) &disp_mid); + o = NULL; + } + else + { + InitSemaphore(&data->bmsem); + data->VideoData = data->data->vrambase; + XSD(cl)->visible = o; +#if !defined(VMWAREGFX_UPDATEFBONSHOWVP) + setModeVMWareSVGA(&XSD(cl)->data, XSD(cl)->prefWidth, XSD(cl)->prefHeight); +#else + initDisplayVMWareSVGA(&XSD(cl)->data); +#endif } - o = NULL; } /* if created object */ - ReturnPtr("VMWareSVGA.BitMap::New()", OOP_Object *, o); + + D(bug(DEBUGNAME " %s: returning 0x%p\n", __func__, o)); + return o; } /********** Bitmap::Dispose() ***********************************/ VOID MNAME_ROOT(Dispose)(OOP_Class *cl, OOP_Object *o, OOP_Msg msg) { - EnterFunc(bug("VMWareSVGA.BitMap::Dispose()\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) OOP_DoSuperMethod(cl, o, msg); - ReturnVoid("VMWareSVGA.BitMap::Dispose"); } /*** init_onbmclass *********************************************************/ static int VMWareSVGAOnBM_Init(LIBBASETYPEPTR LIBBASE) { - EnterFunc(bug("VMWareSVGAOnBM_Init\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) ReturnInt("VMWareSVGAOnBM_Init", ULONG, OOP_ObtainAttrBases(attrbases)); } @@ -140,7 +151,7 @@ static int VMWareSVGAOnBM_Init(LIBBASETYPEPTR LIBBASE) static int VMWareSVGAOnBM_Expunge(LIBBASETYPEPTR LIBBASE) { - EnterFunc(bug("VMWareSVGAOnBM_Expunge\n")); + D(bug(DEBUGNAME " %s()\n", __func__);) OOP_ReleaseAttrBases(attrbases); -- 2.11.4.GIT