From 328b29f689464b9c4e603526cb81043f6f915e61 Mon Sep 17 00:00:00 2001 From: NicJA Date: Sat, 27 Apr 2019 00:57:48 +0000 Subject: [PATCH] use 32bit allocations .. mark the fifo command structure as volatile. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@56354 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/hidds/vmwaresvga/vmwaresvga_gallium.h | 2 +- workbench/hidds/vmwaresvga/vmwaresvga_hardware.c | 18 ++-- workbench/hidds/vmwaresvga/vmwaresvga_hardware.h | 110 +++++++++++------------ 3 files changed, 68 insertions(+), 62 deletions(-) diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_gallium.h b/workbench/hidds/vmwaresvga/vmwaresvga_gallium.h index b9c93713f8..f4afd85c5b 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_gallium.h +++ b/workbench/hidds/vmwaresvga/vmwaresvga_gallium.h @@ -63,7 +63,7 @@ struct HIDDGalliumVMWareSVGACtx struct svga_winsys_context wscbase; struct svga_winsys_screen *wscsws; - struct VMWareSVGAFIFO *command; + volatile struct VMWareSVGAFIFO *command; struct { #if (0) diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c index 53d801308b..ce8e82aa84 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c +++ b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.c @@ -78,7 +78,7 @@ extern struct ExecBase *SysBase; APTR VMWareSVGA_MemAlloc(struct HWData *data, ULONG size) { D(bug("[VMWareSVGA:HW] %s(%d)\n", __func__, size);) - return AllocMem(size, MEMF_CLEAR|MEMF_ANY); + return AllocMem(size, MEMF_CLEAR|MEMF_31BIT); } VOID VMWareSVGA_MemFree(struct HWData *data, APTR addr, ULONG size) @@ -181,7 +181,7 @@ VOID initVMWareSVGAFIFO(struct HWData *data) } data->fifocmdbuf.buffer = AllocMem(VMW_COMMAND_SIZE, MEMF_CLEAR|MEMF_ANY); bug("[VMWareSVGA:HW] %s: FIFO Cmd bounce-buffer @ 0x%p\n", __func__, data->fifocmdbuf.buffer); - InitSemaphore(&data->fifocmdbuf.fifocmdsema); + InitSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); } void waitVMWareSVGAFIFO(struct HWData *data) @@ -241,7 +241,7 @@ APTR reserveVMWareSVGAFIFO(struct HWData *data, ULONG size) return NULL; } - ObtainSemaphore(&data->fifocmdbuf.fifocmdsema); + ObtainSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); data->fifocmdbuf.reserved = size; while (1) { @@ -325,7 +325,7 @@ APTR reserveVMWareSVGAFIFO(struct HWData *data, ULONG size) if (canreserve) { fifo[SVGA_FIFO_RESERVED] = size; } - ReleaseSemaphore(&data->fifocmdbuf.fifocmdsema); + ReleaseSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); return cmdNext + (UBYTE *)fifo; } else { /* @@ -343,7 +343,7 @@ APTR reserveVMWareSVGAFIFO(struct HWData *data, ULONG size) */ if (needBounce) { data->bbused = TRUE; - ReleaseSemaphore(&data->fifocmdbuf.fifocmdsema); + ReleaseSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); return data->fifocmdbuf.buffer; } } /* while (1) */ @@ -370,6 +370,8 @@ VOID commitVMWareSVGAFIFO(struct HWData *data, ULONG size) return; } + ObtainSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); + data->fifocmdbuf.used += data->fifocmdbuf.reserved; data->fifocmdbuf.reserved = 0; @@ -396,18 +398,21 @@ VOID commitVMWareSVGAFIFO(struct HWData *data, ULONG size) chunkSize = max - cmdNext; else chunkSize = size; + bug("[VMWareSVGA:HW] %s: chunk size %d, size %d\n", __func__, chunkSize, size); fifo[SVGA_FIFO_RESERVED] = size; memcpy(cmdNext + (UBYTE *) fifo, buffer, chunkSize); memcpy(min + (UBYTE *) fifo, buffer + chunkSize, size - chunkSize); } else { /* - * Slowest path: copy one dword at a time, updating NEXT_CMD as + * Slowest path: copy one ULONG at a time, updating NEXT_CMD as * we go, so that we bound how much data the guest has written * and the host doesn't know to checkpoint. */ ULONG *dword = (ULONG *)buffer; + bug("[VMWareSVGA:HW] %s: copying %dbytes\n", __func__, size); + while (size > 0) { fifo[cmdNext >> VMWFIFO_CMD_SIZESHIFT] = *dword++; cmdNext += VMWFIFO_CMD_SIZE; @@ -437,6 +442,7 @@ VOID commitVMWareSVGAFIFO(struct HWData *data, ULONG size) if (canreserve) { fifo[SVGA_FIFO_RESERVED] = 0; } + ReleaseSemaphore((struct SignalSemaphore *)&data->fifocmdbuf.fifocmdsema); } VOID flushVMWareSVGAFIFO(struct HWData *data, ULONG *fence) diff --git a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h index d0a5c17408..6f79e9e991 100644 --- a/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h +++ b/workbench/hidds/vmwaresvga/vmwaresvga_hardware.h @@ -192,64 +192,64 @@ #define SVGA_CAP_ALPHA_BLEND 0x02000 struct VMWareSVGAFIFO { - struct SignalSemaphore fifocmdsema; - UBYTE *buffer; - ULONG size; - ULONG used; - ULONG reserved; + struct SignalSemaphore fifocmdsema; + UBYTE *buffer; + ULONG size; + ULONG used; + ULONG reserved; }; struct HWData { - APTR iobase; - APTR vrambase; - APTR mmiobase; - ULONG vramsize; - ULONG mmiosize; - - UWORD indexReg; - UWORD valueReg; - - struct VMWareSVGAFIFO fifocmdbuf; - ULONG bbused; - - 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; - - ULONG txrmax; /* max texture size */ - - APTR maskPool; - APTR irq; - ULONG hwint; - ULONG fifomin; - ULONG fence; - - 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; + + volatile struct VMWareSVGAFIFO fifocmdbuf; + ULONG bbused; + + 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; + + ULONG txrmax; /* max texture size */ + + 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) \ -- 2.11.4.GIT