VirtualBox

Changeset 49983 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Dec 19, 2013 12:23:17 PM (11 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
91415
Message:

Devices/Graphics: VMware SVGA II compatible graphics emulation (2D only), including the associated small API and VBoxManage changes, contributed by trivirt AG.

Location:
trunk/src/VBox/Devices
Files:
8 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r49887 r49983  
    138138#include "VBoxDD2.h"
    139139
     140#ifdef VBOX_WITH_VMSVGA
     141#include "DevVGA-SVGA.h"
     142#include "vmsvga/svga_reg.h"
     143#endif
    140144
    141145/*******************************************************************************
     
    20772081}
    20782082
     2083#ifdef VBOX_WITH_VMSVGA
     2084int vgaR3UpdateDisplay(VGAState *s, unsigned xStart, unsigned yStart, unsigned width, unsigned height)
     2085{
     2086    int bits;
     2087    uint32_t v;
     2088    vga_draw_line_func *vga_draw_line;
     2089
     2090    if (!s->fRenderVRAM)
     2091    {
     2092        s->pDrv->pfnUpdateRect(s->pDrv, xStart, yStart, width, height);
     2093        return VINF_SUCCESS;
     2094    }
     2095    /* @todo might crash if a blit follows a resolution change very quickly (seen this many times!) */
     2096
     2097    if (    s->svga.iWidth == -1
     2098        ||  s->svga.iHeight == -1
     2099        ||  s->svga.iBpp == UINT32_MAX)
     2100    {
     2101        /* Intermediate state; skip redraws. */
     2102        AssertFailed();
     2103        return VINF_SUCCESS;
     2104    }
     2105
     2106    switch(s->svga.iBpp) {
     2107    default:
     2108    case 0:
     2109    case 8:
     2110        AssertFailed();
     2111        return VERR_NOT_IMPLEMENTED;
     2112    case 15:
     2113        v = VGA_DRAW_LINE15;
     2114        bits = 16;
     2115        break;
     2116    case 16:
     2117        v = VGA_DRAW_LINE16;
     2118        bits = 16;
     2119        break;
     2120    case 24:
     2121        v = VGA_DRAW_LINE24;
     2122        bits = 24;
     2123        break;
     2124    case 32:
     2125        v = VGA_DRAW_LINE32;
     2126        bits = 32;
     2127        break;
     2128    }
     2129    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(s->pDrv->cBits)];
     2130
     2131    unsigned offsetSource = (xStart * bits) / 8 + s->svga.cbScanline * yStart;
     2132    unsigned offsetDest   = (xStart * RT_ALIGN(s->pDrv->cBits, 8)) / 8 + s->pDrv->cbScanline * yStart;
     2133
     2134    uint8_t *dest = s->pDrv->pu8Data      + offsetDest;
     2135    uint8_t *src  = s->CTX_SUFF(vram_ptr) + offsetSource;
     2136
     2137    for(unsigned y = yStart; y < yStart + height; y++)
     2138    {
     2139        vga_draw_line(s, dest, src, width);
     2140
     2141        dest += s->pDrv->cbScanline;
     2142        src  += s->svga.cbScanline;
     2143    }
     2144    s->pDrv->pfnUpdateRect(s->pDrv, xStart, yStart, width, height);
     2145
     2146    return VINF_SUCCESS;
     2147}
     2148
     2149/*
     2150 * graphic modes
     2151 */
     2152static int vmsvga_draw_graphic(PVGASTATE pThis, bool full_update, bool fFailOnResize, bool reset_dirty)
     2153{
     2154    int y, page_min, page_max, linesize, y_start;
     2155    int width, height, page0, page1, bwidth, bits;
     2156    int disp_width;
     2157    uint8_t *d;
     2158    uint32_t v, addr1, addr;
     2159    vga_draw_line_func *vga_draw_line;
     2160
     2161    if (    pThis->svga.iWidth == -1
     2162        ||  pThis->svga.iHeight == -1
     2163        ||  pThis->svga.iBpp == UINT32_MAX)
     2164    {
     2165        /* Intermediate state; skip redraws. */
     2166        return VINF_SUCCESS;
     2167    }
     2168
     2169    width  = pThis->svga.iWidth;
     2170    height = pThis->svga.iHeight;
     2171
     2172    disp_width = width;
     2173
     2174    switch(pThis->svga.iBpp) {
     2175    default:
     2176    case 0:
     2177    case 8:
     2178        AssertFailed();
     2179        return VERR_NOT_IMPLEMENTED;
     2180    case 15:
     2181        v = VGA_DRAW_LINE15;
     2182        bits = 16;
     2183        break;
     2184    case 16:
     2185        v = VGA_DRAW_LINE16;
     2186        bits = 16;
     2187        break;
     2188    case 24:
     2189        v = VGA_DRAW_LINE24;
     2190        bits = 24;
     2191        break;
     2192    case 32:
     2193        v = VGA_DRAW_LINE32;
     2194        bits = 32;
     2195        break;
     2196    }
     2197    vga_draw_line = vga_draw_line_table[v * 4 + get_depth_index(pThis->pDrv->cBits)];
     2198
     2199    if (pThis->cursor_invalidate)
     2200        pThis->cursor_invalidate(pThis);
     2201
     2202    addr1 = 0;  /* always start at the beginning of the framebuffer */
     2203    bwidth = (width * bits + 7) / 8;    /* The visible width of a scanline. */
     2204    y_start = -1;
     2205    page_min = 0x7fffffff;
     2206    page_max = -1;
     2207    d = pThis->pDrv->pu8Data;
     2208    linesize = pThis->pDrv->cbScanline;
     2209
     2210    for(y = 0; y < height; y++)
     2211    {
     2212        addr = addr1 + y * bwidth;
     2213
     2214        page0 = addr & ~PAGE_OFFSET_MASK;
     2215        page1 = (addr + bwidth - 1) & ~PAGE_OFFSET_MASK;
     2216        bool update = full_update | vga_is_dirty(pThis, page0) | vga_is_dirty(pThis, page1);
     2217        if (page1 - page0 > PAGE_SIZE)
     2218            /* if wide line, can use another page */
     2219            update |= vga_is_dirty(pThis, page0 + PAGE_SIZE);
     2220        /* explicit invalidation for the hardware cursor */
     2221        update |= (pThis->invalidated_y_table[y >> 5] >> (y & 0x1f)) & 1;
     2222        if (update)
     2223        {
     2224            if (y_start < 0)
     2225                y_start = y;
     2226            if (page0 < page_min)
     2227                page_min = page0;
     2228            if (page1 > page_max)
     2229                page_max = page1;
     2230            if (pThis->fRenderVRAM)
     2231                vga_draw_line(pThis, d, pThis->CTX_SUFF(vram_ptr) + addr, width);
     2232            if (pThis->cursor_draw_line)
     2233                pThis->cursor_draw_line(pThis, d, y);
     2234        } else
     2235        {
     2236            if (y_start >= 0)
     2237            {
     2238                /* flush to display */
     2239                Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
     2240                pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2241                y_start = -1;
     2242            }
     2243        }
     2244        d += linesize;
     2245    }
     2246    if (y_start >= 0)
     2247    {
     2248        /* flush to display */
     2249        Log(("Flush to display (%d,%d)(%d,%d)\n", 0, y_start, disp_width, y - y_start));
     2250        pThis->pDrv->pfnUpdateRect(pThis->pDrv, 0, y_start, disp_width, y - y_start);
     2251    }
     2252    /* reset modified pages */
     2253    if (page_max != -1 && reset_dirty)
     2254        vga_reset_dirty(pThis, page_min, page_max + PAGE_SIZE);
     2255    memset(pThis->invalidated_y_table, 0, ((height + 31) >> 5) * 4);
     2256    return VINF_SUCCESS;
     2257}
     2258#endif /* VBOX_WITH_VMSVGA */
     2259
    20792260/*
    20802261 * graphic modes
     
    22952476#define GMODE_GRAPH    1
    22962477#define GMODE_BLANK 2
     2478#ifdef VBOX_WITH_VMSVGA
     2479#define GMODE_SVGA      3
     2480#endif
    22972481
    22982482static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty)
     
    23482532
    23492533            /* Do a complete redraw, which will pick up a new screen resolution. */
     2534#ifdef VBOX_WITH_VMSVGA
     2535            if (pThis->svga.fEnabled) {
     2536                pThis->graphic_mode = GMODE_SVGA;
     2537                rc = vmsvga_draw_graphic(pThis, 1, false, reset_dirty);
     2538            }
     2539            else
     2540#endif
    23502541            if (pThis->gr[6] & 1) {
    23512542                pThis->graphic_mode = GMODE_GRAPH;
     
    23662557        }
    23672558
     2559#ifdef VBOX_WITH_VMSVGA
     2560        if (pThis->svga.fEnabled) {
     2561            graphic_mode = GMODE_SVGA;
     2562        }
     2563        else
     2564#endif
    23682565        if (!(pThis->ar_index & 0x20) || (pThis->sr[0x01] & 0x20)) {
    23692566            graphic_mode = GMODE_BLANK;
     
    23822579            rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
    23832580            break;
     2581#ifdef VBOX_WITH_VMSVGA
     2582        case GMODE_SVGA:
     2583            rc = vmsvga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty);
     2584            break;
     2585#endif
    23842586        case GMODE_BLANK:
    23852587        default:
     
    43214523    AssertRC(rc);
    43224524
     4525#ifdef VBOX_WITH_VMSVGA
     4526    if (    pThis->svga.fEnabled
     4527        &&  !pThis->svga.fTraces)
     4528    {
     4529        /* Nothing to do as the guest will explicitely update us about frame buffer changes. */
     4530        PDMCritSectLeave(&pThis->CritSect);
     4531        return VINF_SUCCESS;
     4532    }
     4533#endif
     4534
    43234535#ifndef VBOX_WITH_HGSMI
    43244536    /* This should be called only in non VBVA mode. */
     
    43564568    PPDMDEVINS pDevIns = pThis->CTX_SUFF(pDevIns);
    43574569
     4570#ifdef VBOX_WITH_VMSVGA
     4571    if (    !pThis->svga.fEnabled
     4572        ||  pThis->svga.fTraces)
     4573    {
     4574#endif
    43584575    /* The dirty bits array has been just cleared, reset handlers as well. */
    43594576    if (pThis->GCPhysVRAM && pThis->GCPhysVRAM != NIL_RTGCPHYS)
    43604577        PGMHandlerPhysicalReset(PDMDevHlpGetVM(pDevIns), pThis->GCPhysVRAM);
     4578#ifdef VBOX_WITH_VMSVGA
     4579    }
     4580#endif
    43614581    if (pThis->fRemappedVGA)
    43624582    {
     
    49905210}
    49915211
     5212#ifdef VBOX_WITH_VMSVGA
     5213int vgaR3RegisterVRAMHandler(PVGASTATE pVGAState, uint64_t cbFrameBuffer)
     5214{
     5215    PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
     5216
     5217    Assert(pVGAState->GCPhysVRAM);
     5218
     5219    int rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
     5220                                          PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
     5221                                          pVGAState->GCPhysVRAM, pVGAState->GCPhysVRAM + (cbFrameBuffer - 1),
     5222                                          vgaR3LFBAccessHandler, pVGAState,
     5223                                          g_DeviceVga.szR0Mod, "vgaR0LFBAccessHandler", pDevIns->pvInstanceDataR0,
     5224                                          g_DeviceVga.szRCMod, "vgaGCLFBAccessHandler", pDevIns->pvInstanceDataRC,
     5225                                          "VGA LFB");
     5226    AssertRC(rc);
     5227    return rc;
     5228}
     5229
     5230int vgaR3UnregisterVRAMHandler(PVGASTATE pVGAState)
     5231{
     5232    PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
     5233
     5234    Assert(pVGAState->GCPhysVRAM);
     5235    int rc = PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns), pVGAState->GCPhysVRAM);
     5236    AssertRC(rc);
     5237    return rc;
     5238}
     5239#endif
    49925240
    49935241/* -=-=-=-=-=- Ring 3: PCI Device -=-=-=-=-=- */
     
    50105258    PVGASTATE   pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
    50115259    LogFlow(("vgaR3IORegionMap: iRegion=%d GCPhysAddress=%RGp cb=%#x enmType=%d\n", iRegion, GCPhysAddress, cb, enmType));
     5260#ifdef VBOX_WITH_VMSVGA
     5261    AssertReturn((iRegion == ((pThis->fVMSVGAEnabled) ? 1 : 0)) && (enmType == ((pThis->fVMSVGAEnabled) ? PCI_ADDRESS_SPACE_MEM : PCI_ADDRESS_SPACE_MEM_PREFETCH)), VERR_INTERNAL_ERROR);   
     5262#else
    50125263    AssertReturn(iRegion == 0 && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR);
     5264#endif
    50135265
    50145266    if (GCPhysAddress != NIL_RTGCPHYS)
     
    50435295         */
    50445296        Assert(pThis->GCPhysVRAM);
     5297#ifdef VBOX_WITH_VMSVGA
     5298        Assert(!pThis->svga.fEnabled);
     5299#endif
    50455300        rc = PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns), pThis->GCPhysVRAM);
    50465301        AssertRC(rc);
     
    51205375#else
    51215376    SSMR3PutBool(pSSM, false);
    5122     return VINF_SUCCESS;
    51235377#endif
     5378#ifdef VBOX_WITH_VMSVGA
     5379    if (    rc == VINF_SUCCESS
     5380        &&  pThis->fVMSVGAEnabled)
     5381        rc = vmsvgaSaveExec(pDevIns, pSSM);
     5382#endif
     5383    return rc;
    51245384}
    51255385
     
    51725432#endif
    51735433        }
     5434#ifdef VBOX_WITH_VMSVGA
     5435        if (    uVersion >= VGA_SAVEDSTATE_VERSION_VMSVGA_2D
     5436            &&  pThis->fVMSVGAEnabled)
     5437        {
     5438            rc = vmsvgaLoadExec(pDevIns, pSSM, uVersion, uPass);
     5439            AssertRCReturn(rc, rc);
     5440        }
     5441#endif
    51745442    }
    51755443    return VINF_SUCCESS;
     
    54175685# endif
    54185686
     5687#ifdef VBOX_WITH_VMSVGA
     5688    if (pThis->fVMSVGAEnabled)
     5689        vmsvgaDestruct(pDevIns);
     5690#endif
     5691
    54195692    /*
    54205693     * Free MM heap pointers.
     
    55425815                                          "CustomVideoMode16\0"
    55435816                                          "MaxBiosXRes\0"
    5544                                           "MaxBiosYRes\0"))
     5817                                          "MaxBiosYRes\0"
     5818#ifdef VBOX_WITH_VMSVGA
     5819                                          "VMSVGAEnabled\0"
     5820#endif
     5821#ifdef VBOX_WITH_VMSVGA3D
     5822                                          "VMSVGA3dEnabled\0"
     5823                                          "HostWindowId\0"
     5824#endif
     5825                                          ))
    55455826        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    55465827                                N_("Invalid configuration for vga device"));
     
    55715852    Log(("VGA: VRamSize=%#x fGCenabled=%RTbool fR0Enabled=%RTbool\n", pThis->vram_size, pThis->fGCEnabled, pThis->fR0Enabled));
    55725853
     5854#ifdef VBOX_WITH_VMSVGA
     5855    rc = CFGMR3QueryBoolDef(pCfg, "VMSVGAEnabled", &pThis->fVMSVGAEnabled, false);
     5856    AssertLogRelRCReturn(rc, rc);
     5857    Log(("VMSVGA: VMSVGAEnabled   = %d\n", pThis->fVMSVGAEnabled));
     5858#endif
     5859#ifdef VBOX_WITH_VMSVGA3D
     5860    rc = CFGMR3QueryBoolDef(pCfg, "VMSVGA3dEnabled", &pThis->svga.f3DEnabled, false);
     5861    AssertLogRelRCReturn(rc, rc);
     5862    rc = CFGMR3QueryU64Def(pCfg, "HostWindowId", &pThis->svga.u64HostWindowId, 0);
     5863    AssertLogRelRCReturn(rc, rc);
     5864    Log(("VMSVGA: VMSVGA3dEnabled = %d\n", pThis->svga.f3DEnabled));
     5865    Log(("VMSVGA: HostWindowId    = 0x%x\n", pThis->svga.u64HostWindowId));
     5866#endif
     5867
    55735868    pThis->pDevInsR3 = pDevIns;
    55745869    pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
     
    55785873
    55795874    /* The PCI devices configuration. */
     5875#ifdef VBOX_WITH_VMSVGA
     5876    if (pThis->fVMSVGAEnabled)
     5877    {
     5878        /* Extend our VGA device with VMWare SVGA functionality. */
     5879        PCIDevSetVendorId(&pThis->Dev, PCI_VENDOR_ID_VMWARE);
     5880        PCIDevSetDeviceId(&pThis->Dev, PCI_DEVICE_ID_VMWARE_SVGA2);
     5881        PCIDevSetSubSystemVendorId(&pThis->Dev, PCI_VENDOR_ID_VMWARE);
     5882        PCIDevSetSubSystemId(&pThis->Dev, PCI_DEVICE_ID_VMWARE_SVGA2);
     5883    }
     5884    else
     5885    {
     5886#endif /* VBOX_WITH_VMSVGA */
    55805887    PCIDevSetVendorId(  &pThis->Dev, 0x80ee);   /* PCI vendor, just a free bogus value */
    55815888    PCIDevSetDeviceId(  &pThis->Dev, 0xbeef);
     5889#ifdef VBOX_WITH_VMSVGA
     5890    }
     5891#endif
    55825892    PCIDevSetClassSub(  &pThis->Dev,   0x00);   /* VGA controller */
    55835893    PCIDevSetClassBase( &pThis->Dev,   0x03);
     
    56235933     * Allocate the VRAM and map the first 512KB of it into GC so we can speed up VGA support.
    56245934     */
    5625     rc = PDMDevHlpMMIO2Register(pDevIns, 0 /* iRegion */, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
     5935#ifdef VBOX_WITH_VMSVGA
     5936    int iPCIRegionVRAM = (pThis->fVMSVGAEnabled) ? 1 : 0;
     5937
     5938    if (pThis->fVMSVGAEnabled)
     5939    {
     5940        /*
     5941         * Allocate and initialize the FIFO MMIO2 memory.
     5942         */
     5943        rc = PDMDevHlpMMIO2Register(pDevIns, 2 /*iRegion*/, VMSVGA_FIFO_SIZE, 0 /*fFlags*/, (void **)&pThis->svga.pFIFOR3, "VMSVGA-FIFO");
     5944        if (RT_FAILURE(rc))
     5945            return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     5946                                        N_("Failed to allocate %u bytes of memory for the VMSVGA device"), VMSVGA_FIFO_SIZE);
     5947        pThis->svga.pFIFOR0 = (RTR0PTR)pThis->svga.pFIFOR3;
     5948        pThis->svga.cbFIFO  = VMSVGA_FIFO_SIZE;
     5949    }
     5950#else
     5951    int iPCIRegionVRAM = 0;
     5952#endif
     5953    rc = PDMDevHlpMMIO2Register(pDevIns, iPCIRegionVRAM, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
    56265954    AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMIO2Register(%#x,) -> %Rrc\n", pThis->vram_size, rc), rc);
    56275955    pThis->vram_ptrR0 = (RTR0PTR)pThis->vram_ptrR3; /** @todo @bugref{1865} Map parts into R0 or just use PGM access (Mac only). */
     
    56305958    {
    56315959        RTRCPTR pRCMapping = 0;
    5632         rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, 0 /* iRegion */, 0 /* off */,  VGA_MAPPING_SIZE, "VGA VRam", &pRCMapping);
     5960        rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, iPCIRegionVRAM, 0 /* off */,  VGA_MAPPING_SIZE, "VGA VRam", &pRCMapping);
    56335961        AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMHyperMapMMIO2(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc);
    56345962        pThis->vram_ptrRC = pRCMapping;
     5963# ifdef VBOX_WITH_VMSVGA
     5964        /* Don't need a mapping in RC */
     5965# endif
    56355966    }
    56365967
     
    56395970    {
    56405971        RTR0PTR pR0Mapping = 0;
    5641         rc = PDMDevHlpMMIO2MapKernel(pDevIns, 0 /* iRegion */, 0 /* off */,  VGA_MAPPING_SIZE, "VGA VRam", &pR0Mapping);
     5972        rc = PDMDevHlpMMIO2MapKernel(pDevIns, iPCIRegionVRAM, 0 /* off */,  VGA_MAPPING_SIZE, "VGA VRam", &pR0Mapping);
    56425973        AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc);
    56435974        pThis->vram_ptrR0 = pR0Mapping;
     5975# ifdef VBOX_WITH_VMSVGA
     5976        if (pThis->fVMSVGAEnabled)
     5977        {
     5978            RTR0PTR pR0Mapping = 0;
     5979            rc = PDMDevHlpMMIO2MapKernel(pDevIns, 2 /* iRegion */, 0 /* off */,  VMSVGA_FIFO_SIZE, "VMSVGA-FIFO", &pR0Mapping);
     5980            AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", VMSVGA_FIFO_SIZE, rc), rc);
     5981            pThis->svga.pFIFOR0 = pR0Mapping;
     5982        }
     5983# endif
    56445984    }
    56455985#endif
     
    58956235        Log(("!!WARNING!!: pThis->dev.devfn=%d (ignore if testcase or not started by Main)\n", pThis->Dev.devfn));
    58966236
    5897     rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0 /* iRegion */, pThis->vram_size, PCI_ADDRESS_SPACE_MEM_PREFETCH, vgaR3IORegionMap);
     6237#ifdef VBOX_WITH_VMSVGA
     6238    if (pThis->fVMSVGAEnabled)
     6239    {
     6240        /* Register the io command ports. */
     6241        rc = PDMDevHlpPCIIORegionRegister (pDevIns, 0 /* iRegion */, 0x10, PCI_ADDRESS_SPACE_IO, vmsvgaR3IORegionMap);
     6242        if (RT_FAILURE (rc))
     6243            return rc;
     6244        /* VMware's MetalKit doesn't like PCI_ADDRESS_SPACE_MEM_PREFETCH */
     6245        rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1 /* iRegion */, pThis->vram_size, PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vgaR3IORegionMap);
     6246        if (RT_FAILURE(rc))
     6247            return rc;
     6248        rc = PDMDevHlpPCIIORegionRegister(pDevIns, 2 /* iRegion */, VMSVGA_FIFO_SIZE, PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vmsvgaR3IORegionMap);
     6249        if (RT_FAILURE(rc))
     6250            return rc;
     6251    }
     6252    else
     6253#endif /* VBOX_WITH_VMSVGA */
     6254    rc = PDMDevHlpPCIIORegionRegister(pDevIns, iPCIRegionVRAM, pThis->vram_size, PCI_ADDRESS_SPACE_MEM_PREFETCH, vgaR3IORegionMap);
    58986255    if (RT_FAILURE(rc))
    58996256        return rc;
     
    63036660    }
    63046661#endif
     6662
     6663#ifdef VBOX_WITH_VMSVGA
     6664    if (    rc == VINF_SUCCESS
     6665        &&  pThis->fVMSVGAEnabled)
     6666    {
     6667        rc = vmsvgaInit(pDevIns);
     6668    }
     6669#endif
     6670
    63056671    /*
    63066672     * Statistics.
     
    63516717    NULL,
    63526718    /* pfnPowerOn */
     6719#ifdef VBOX_WITH_VMSVGA
     6720    vmsvgaR3PowerOn,
     6721#else
    63536722    NULL,
     6723#endif
    63546724    /* pfnReset */
    63556725    vgaR3Reset,
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r49507 r49983  
    55
    66/*
    7  * Copyright (C) 2006-2012 Oracle Corporation
     7 * Copyright (C) 2006-2013 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    6464#endif /* VBOX_WITH_HGSMI */
    6565#include "DevVGASavedState.h"
     66
     67#ifdef VBOX_WITH_VMSVGA
     68# include "DevVGA-SVGA.h"
     69#endif
    6670
    6771# include <iprt/list.h>
     
    305309    R0PTRTYPE(uint8_t *)        vram_ptrR0;
    306310
     311#ifdef VBOX_WITH_VMSVGA
     312    struct
     313    {
     314        /** The host window handle */
     315        uint64_t                    u64HostWindowId;
     316        /** The R3 FIFO pointer. */
     317        R3PTRTYPE(uint32_t *)       pFIFOR3;
     318        /** The R0 FIFO pointer. */
     319        R0PTRTYPE(uint32_t *)       pFIFOR0;
     320        /** R3 Opaque pointer to svga state. */
     321        R3PTRTYPE(void *)           pSVGAState;
     322        /** R3 Opaque pointer to 3d state. */
     323        R3PTRTYPE(void *)           p3dState;
     324        /** R3 Opaque pointer to a copy of the first 32k of the framebuffer before switching into svga mode. */
     325        R3PTRTYPE(void *)           pFrameBufferBackup;
     326        /** Guest physical address of the FIFO memory range. */
     327        RTGCPHYS                    GCPhysFIFO;
     328        /** Size in bytes of the FIFO memory range. */
     329        uint32_t                    cbFIFO;
     330        /** SVGA id. */
     331        uint32_t                    u32SVGAId;
     332        /** SVGA extensions enabled or not. */
     333        uint32_t                    fEnabled;
     334        /** SVGA memory area configured status. */
     335        uint32_t                    fConfigured;
     336        /** Device is busy handling FIFO requests. */
     337        uint32_t                    fBusy;
     338        /** Traces (dirty page detection) enabled or not. */
     339        uint32_t                    fTraces;
     340        /** Guest OS identifier. */
     341        uint32_t                    u32GuestId;
     342        /** Scratch region size. */
     343        uint32_t                    cScratchRegion;
     344        /** Scratch array. */
     345        uint32_t                    au32ScratchRegion[VMSVGA_SCRATCH_SIZE];
     346        /** Irq status. */
     347        uint32_t                    u32IrqStatus;
     348        /** Irq mask. */
     349        uint32_t                    u32IrqMask;
     350        /** Pitch lock. */
     351        uint32_t                    u32PitchLock;
     352        /** Current GMR id. (SVGA_REG_GMR_ID) */
     353        uint32_t                    u32CurrentGMRId;
     354        /** Register caps. */
     355        uint32_t                    u32RegCaps;
     356        /** Physical address of command mmio range. */
     357        RTIOPORT                    BasePort;
     358        /** Port io index register. */
     359        uint32_t                    u32IndexReg;
     360        /** FIFO request semaphore. */
     361        RTSEMEVENT                  FIFORequestSem;
     362        /** FIFO IO Thread. */
     363        R3PTRTYPE(PPDMTHREAD)       pFIFOIOThread;
     364        int32_t                     iWidth;
     365        int32_t                     iHeight;
     366        uint32_t                    iBpp;
     367        uint32_t                    cbScanline;
     368        /** Maximum width supported. */
     369        uint32_t                    u32MaxWidth;
     370        /** Maximum height supported. */
     371        uint32_t                    u32MaxHeight;
     372        /** Action flags */
     373        uint32_t                    u32ActionFlags;
     374        /** SVGA 3d extensions enabled or not. */
     375        bool                        f3DEnabled;
     376        /** VRAM page monitoring enabled or not. */
     377        bool                        fVRAMTracking;
     378        bool                        Padding6[HC_ARCH_BITS == 64 ? 6 : 2];
     379    } svga;
     380#endif
     381
    307382    /** The number of monitors. */
    308383    uint32_t                    cMonitors;
     
    324399    /** Whether to render the guest VRAM to the framebuffer memory. False only for some LFB modes. */
    325400    bool                        fRenderVRAM;
     401#ifdef VBOX_WITH_VMSVGA
     402    /* Whether the SVGA emulation is enabled or not. */
     403    bool                        fVMSVGAEnabled;
     404    bool                        Padding1[1];
     405#else
    326406    bool                        Padding1[2];
     407#endif
    327408
    328409    /** The physical address the VRAM was assigned. */
     
    560641#endif /* VBOX_WITH_HGSMI */
    561642
     643# ifdef VBOX_WITH_VMSVGA
     644int vgaR3RegisterVRAMHandler(PVGASTATE pVGAState, uint64_t cbFrameBuffer);
     645int vgaR3UnregisterVRAMHandler(PVGASTATE pVGAState);
     646int vgaR3UpdateDisplay(PVGASTATE pVGAState, unsigned xStart, unsigned yStart, unsigned width, unsigned height);
     647# endif
     648
    562649#ifndef VBOX
    563650void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
  • trunk/src/VBox/Devices/Graphics/DevVGASavedState.h

    r49424 r49983  
    88
    99/*
    10  * Copyright (C) 2006-2012 Oracle Corporation
     10 * Copyright (C) 2006-2013 Oracle Corporation
    1111 *
    1212 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    2323#define Graphics_DevVGASavedState_h
    2424
     25#ifdef VBOX_WITH_VMSVGA
     26#define VGA_SAVEDSTATE_VERSION_VMSVGA_2D    10 /* <- internal build with 2d state only */
     27#define VGA_SAVEDSTATE_VERSION_VMSVGA       11
     28#define VGA_SAVEDSTATE_VERSION              11
     29#else
    2530#define VGA_SAVEDSTATE_VERSION              10
     31#endif
    2632#define VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA 10
    2733#define VGA_SAVEDSTATE_VERSION_INV_GCMDFIFO 8 /* <- states upto and including this version may contain invalid completed Guest Commands fifo entries */
  • trunk/src/VBox/Devices/Makefile.kmk

    r49577 r49983  
    240240 endif
    241241
     242 ifdef VBOX_WITH_VMSVGA
     243  VBoxDD_DEFS         += VBOX_WITH_VMSVGA
     244  VBoxDD_SOURCES      += Graphics/DevVGA-SVGA.cpp
     245 endif
     246 ifdef VBOX_WITH_VMSVGA3D
     247  VBoxDD_DEFS         += VBOX_WITH_VMSVGA3D
     248  VBoxDD_SOURCES      += Graphics/DevVGA-SVGA3d-shared.cpp
     249  ifeq ($(KBUILD_TARGET),win)
     250    VBoxDD_SOURCES += Graphics/DevVGA-SVGA3d-win.cpp
     251  else
     252    VBoxDD_SOURCES += Graphics/DevVGA-SVGA3d-ogl.cpp
     253    VBoxDD_LIBS    += $(PATH_STAGE_BIN)/vmsvgashader$(VBOX_SUFF_DLL)
     254  endif
     255  VBoxDD_LIBS.win      += d3d9.lib
     256  VBoxDD_LIBS.linux    += GL X11
     257 endif
     258
    242259 ifdef VBOX_WITH_VDMA
    243260  VBoxDD_DEFS           += VBOX_WITH_VDMA
     
    823840  ifdef VBOXWDDM_WITH_VBVA
    824841   VBoxDDGC_DEFS        += VBOXWDDM_WITH_VBVA
     842  endif
     843  ifdef VBOX_WITH_VMSVGA
     844   VBoxDDGC_DEFS         += VBOX_WITH_VMSVGA
     845   VBoxDDGC_SOURCES      += \
     846    Graphics/DevVGA-SVGA.cpp
     847  endif
     848  ifdef VBOX_WITH_VMSVGA3D
     849   VBoxDDGC_DEFS         += VBOX_WITH_VMSVGA3D
    825850  endif
    826851  ifdef VBOX_VDMA_WITH_WATCHDOG
     
    966991 endif
    967992
     993 ifdef VBOX_WITH_VMSVGA
     994  VBoxDDR0_DEFS         += VBOX_WITH_VMSVGA
     995  VBoxDDR0_SOURCES      += \
     996    Graphics/DevVGA-SVGA.cpp
     997 endif
     998 ifdef VBOX_WITH_VMSVGA3D
     999  VBoxDDR0_DEFS         += VBOX_WITH_VMSVGA3D
     1000 endif
     1001
    9681002 ifdef VBOX_WITH_HGSMI
    9691003  VBoxDDR0_DEFS         += VBOX_WITH_HGSMI
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette