Changeset 49983 in vbox for trunk/src/VBox/Devices
- Timestamp:
- Dec 19, 2013 12:23:17 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 91415
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 8 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA.cpp
r49887 r49983 138 138 #include "VBoxDD2.h" 139 139 140 #ifdef VBOX_WITH_VMSVGA 141 #include "DevVGA-SVGA.h" 142 #include "vmsvga/svga_reg.h" 143 #endif 140 144 141 145 /******************************************************************************* … … 2077 2081 } 2078 2082 2083 #ifdef VBOX_WITH_VMSVGA 2084 int 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 */ 2152 static 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 2079 2260 /* 2080 2261 * graphic modes … … 2295 2476 #define GMODE_GRAPH 1 2296 2477 #define GMODE_BLANK 2 2478 #ifdef VBOX_WITH_VMSVGA 2479 #define GMODE_SVGA 3 2480 #endif 2297 2481 2298 2482 static int vga_update_display(PVGASTATE pThis, bool fUpdateAll, bool fFailOnResize, bool reset_dirty) … … 2348 2532 2349 2533 /* 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 2350 2541 if (pThis->gr[6] & 1) { 2351 2542 pThis->graphic_mode = GMODE_GRAPH; … … 2366 2557 } 2367 2558 2559 #ifdef VBOX_WITH_VMSVGA 2560 if (pThis->svga.fEnabled) { 2561 graphic_mode = GMODE_SVGA; 2562 } 2563 else 2564 #endif 2368 2565 if (!(pThis->ar_index & 0x20) || (pThis->sr[0x01] & 0x20)) { 2369 2566 graphic_mode = GMODE_BLANK; … … 2382 2579 rc = vga_draw_graphic(pThis, full_update, fFailOnResize, reset_dirty); 2383 2580 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 2384 2586 case GMODE_BLANK: 2385 2587 default: … … 4321 4523 AssertRC(rc); 4322 4524 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 4323 4535 #ifndef VBOX_WITH_HGSMI 4324 4536 /* This should be called only in non VBVA mode. */ … … 4356 4568 PPDMDEVINS pDevIns = pThis->CTX_SUFF(pDevIns); 4357 4569 4570 #ifdef VBOX_WITH_VMSVGA 4571 if ( !pThis->svga.fEnabled 4572 || pThis->svga.fTraces) 4573 { 4574 #endif 4358 4575 /* The dirty bits array has been just cleared, reset handlers as well. */ 4359 4576 if (pThis->GCPhysVRAM && pThis->GCPhysVRAM != NIL_RTGCPHYS) 4360 4577 PGMHandlerPhysicalReset(PDMDevHlpGetVM(pDevIns), pThis->GCPhysVRAM); 4578 #ifdef VBOX_WITH_VMSVGA 4579 } 4580 #endif 4361 4581 if (pThis->fRemappedVGA) 4362 4582 { … … 4990 5210 } 4991 5211 5212 #ifdef VBOX_WITH_VMSVGA 5213 int 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 5230 int 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 4992 5240 4993 5241 /* -=-=-=-=-=- Ring 3: PCI Device -=-=-=-=-=- */ … … 5010 5258 PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE); 5011 5259 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 5012 5263 AssertReturn(iRegion == 0 && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR); 5264 #endif 5013 5265 5014 5266 if (GCPhysAddress != NIL_RTGCPHYS) … … 5043 5295 */ 5044 5296 Assert(pThis->GCPhysVRAM); 5297 #ifdef VBOX_WITH_VMSVGA 5298 Assert(!pThis->svga.fEnabled); 5299 #endif 5045 5300 rc = PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns), pThis->GCPhysVRAM); 5046 5301 AssertRC(rc); … … 5120 5375 #else 5121 5376 SSMR3PutBool(pSSM, false); 5122 return VINF_SUCCESS;5123 5377 #endif 5378 #ifdef VBOX_WITH_VMSVGA 5379 if ( rc == VINF_SUCCESS 5380 && pThis->fVMSVGAEnabled) 5381 rc = vmsvgaSaveExec(pDevIns, pSSM); 5382 #endif 5383 return rc; 5124 5384 } 5125 5385 … … 5172 5432 #endif 5173 5433 } 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 5174 5442 } 5175 5443 return VINF_SUCCESS; … … 5417 5685 # endif 5418 5686 5687 #ifdef VBOX_WITH_VMSVGA 5688 if (pThis->fVMSVGAEnabled) 5689 vmsvgaDestruct(pDevIns); 5690 #endif 5691 5419 5692 /* 5420 5693 * Free MM heap pointers. … … 5542 5815 "CustomVideoMode16\0" 5543 5816 "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 )) 5545 5826 return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES, 5546 5827 N_("Invalid configuration for vga device")); … … 5571 5852 Log(("VGA: VRamSize=%#x fGCenabled=%RTbool fR0Enabled=%RTbool\n", pThis->vram_size, pThis->fGCEnabled, pThis->fR0Enabled)); 5572 5853 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 5573 5868 pThis->pDevInsR3 = pDevIns; 5574 5869 pThis->pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns); … … 5578 5873 5579 5874 /* 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 */ 5580 5887 PCIDevSetVendorId( &pThis->Dev, 0x80ee); /* PCI vendor, just a free bogus value */ 5581 5888 PCIDevSetDeviceId( &pThis->Dev, 0xbeef); 5889 #ifdef VBOX_WITH_VMSVGA 5890 } 5891 #endif 5582 5892 PCIDevSetClassSub( &pThis->Dev, 0x00); /* VGA controller */ 5583 5893 PCIDevSetClassBase( &pThis->Dev, 0x03); … … 5623 5933 * Allocate the VRAM and map the first 512KB of it into GC so we can speed up VGA support. 5624 5934 */ 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"); 5626 5954 AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMIO2Register(%#x,) -> %Rrc\n", pThis->vram_size, rc), rc); 5627 5955 pThis->vram_ptrR0 = (RTR0PTR)pThis->vram_ptrR3; /** @todo @bugref{1865} Map parts into R0 or just use PGM access (Mac only). */ … … 5630 5958 { 5631 5959 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); 5633 5961 AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMHyperMapMMIO2(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc); 5634 5962 pThis->vram_ptrRC = pRCMapping; 5963 # ifdef VBOX_WITH_VMSVGA 5964 /* Don't need a mapping in RC */ 5965 # endif 5635 5966 } 5636 5967 … … 5639 5970 { 5640 5971 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); 5642 5973 AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc); 5643 5974 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 5644 5984 } 5645 5985 #endif … … 5895 6235 Log(("!!WARNING!!: pThis->dev.devfn=%d (ignore if testcase or not started by Main)\n", pThis->Dev.devfn)); 5896 6236 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); 5898 6255 if (RT_FAILURE(rc)) 5899 6256 return rc; … … 6303 6660 } 6304 6661 #endif 6662 6663 #ifdef VBOX_WITH_VMSVGA 6664 if ( rc == VINF_SUCCESS 6665 && pThis->fVMSVGAEnabled) 6666 { 6667 rc = vmsvgaInit(pDevIns); 6668 } 6669 #endif 6670 6305 6671 /* 6306 6672 * Statistics. … … 6351 6717 NULL, 6352 6718 /* pfnPowerOn */ 6719 #ifdef VBOX_WITH_VMSVGA 6720 vmsvgaR3PowerOn, 6721 #else 6353 6722 NULL, 6723 #endif 6354 6724 /* pfnReset */ 6355 6725 vgaR3Reset, -
trunk/src/VBox/Devices/Graphics/DevVGA.h
r49507 r49983 5 5 6 6 /* 7 * Copyright (C) 2006-201 2Oracle Corporation7 * Copyright (C) 2006-2013 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 64 64 #endif /* VBOX_WITH_HGSMI */ 65 65 #include "DevVGASavedState.h" 66 67 #ifdef VBOX_WITH_VMSVGA 68 # include "DevVGA-SVGA.h" 69 #endif 66 70 67 71 # include <iprt/list.h> … … 305 309 R0PTRTYPE(uint8_t *) vram_ptrR0; 306 310 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 307 382 /** The number of monitors. */ 308 383 uint32_t cMonitors; … … 324 399 /** Whether to render the guest VRAM to the framebuffer memory. False only for some LFB modes. */ 325 400 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 326 406 bool Padding1[2]; 407 #endif 327 408 328 409 /** The physical address the VRAM was assigned. */ … … 560 641 #endif /* VBOX_WITH_HGSMI */ 561 642 643 # ifdef VBOX_WITH_VMSVGA 644 int vgaR3RegisterVRAMHandler(PVGASTATE pVGAState, uint64_t cbFrameBuffer); 645 int vgaR3UnregisterVRAMHandler(PVGASTATE pVGAState); 646 int vgaR3UpdateDisplay(PVGASTATE pVGAState, unsigned xStart, unsigned yStart, unsigned width, unsigned height); 647 # endif 648 562 649 #ifndef VBOX 563 650 void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, -
trunk/src/VBox/Devices/Graphics/DevVGASavedState.h
r49424 r49983 8 8 9 9 /* 10 * Copyright (C) 2006-201 2Oracle Corporation10 * Copyright (C) 2006-2013 Oracle Corporation 11 11 * 12 12 * This file is part of VirtualBox Open Source Edition (OSE), as … … 23 23 #define Graphics_DevVGASavedState_h 24 24 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 25 30 #define VGA_SAVEDSTATE_VERSION 10 31 #endif 26 32 #define VGA_SAVEDSTATE_VERSION_WITH_PENDVHWA 10 27 33 #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 240 240 endif 241 241 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 242 259 ifdef VBOX_WITH_VDMA 243 260 VBoxDD_DEFS += VBOX_WITH_VDMA … … 823 840 ifdef VBOXWDDM_WITH_VBVA 824 841 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 825 850 endif 826 851 ifdef VBOX_VDMA_WITH_WATCHDOG … … 966 991 endif 967 992 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 968 1002 ifdef VBOX_WITH_HGSMI 969 1003 VBoxDDR0_DEFS += VBOX_WITH_HGSMI
Note:
See TracChangeset
for help on using the changeset viewer.