Changeset 52199 in vbox
- Timestamp:
- Jul 25, 2014 7:47:39 PM (11 years ago)
- svn:sync-xref-src-repo-rev:
- 95259
- Location:
- trunk/src/VBox/Additions/x11/vboxvideo
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/x11/vboxvideo/setmode.c
r51393 r52199 117 117 else 118 118 cwReal = RT_MIN((int) cWidth, pScrn->displayWidth - x); 119 TRACE_LOG("pVBox-> afDisabled[%u]=%d\n",120 cDisplay, (int)pVBox-> afDisabled[cDisplay]);119 TRACE_LOG("pVBox->pScreens[%u].afDisabled=%d\n", 120 cDisplay, (int)pVBox->pScreens[cDisplay].afDisabled); 121 121 if (cDisplay == 0) 122 122 VBoxVideoSetModeRegisters(cwReal, cHeight, pScrn->displayWidth, 123 123 vboxBPP(pScrn), 0, x, y); 124 124 fFlags = VBVA_SCREEN_F_ACTIVE; 125 fFlags |= (pVBox-> afDisabled[cDisplay]? VBVA_SCREEN_F_DISABLED : 0);125 fFlags |= (pVBox->pScreens[cDisplay].afDisabled ? VBVA_SCREEN_F_DISABLED : 0); 126 126 VBoxHGSMIProcessDisplayInfo(&pVBox->guestCtx, cDisplay, x, y, 127 127 offStart, pVBox->cbLine, cwReal, cHeight, … … 175 175 unsigned i; 176 176 for (i = 0; i < pVBox->cScreens; ++i) 177 VBOXSetMode(pScrn, i, pVBox-> aScreenLocation[i].cx,178 pVBox-> aScreenLocation[i].cy,179 pVBox-> aScreenLocation[i].x,180 pVBox-> aScreenLocation[i].y);177 VBOXSetMode(pScrn, i, pVBox->pScreens[i].aScreenLocation.cx, 178 pVBox->pScreens[i].aScreenLocation.cy, 179 pVBox->pScreens[i].aScreenLocation.x, 180 pVBox->pScreens[i].aScreenLocation.y); 181 181 } 182 182 #endif -
trunk/src/VBox/Additions/x11/vboxvideo/vboxutils.c
r51242 r52199 215 215 for (i = 0; i < pVBox->cScreens; ++i) 216 216 { 217 pVBox-> aPreferredSize[i].cx = 1024;218 pVBox-> aPreferredSize[i].cy = 768;217 pVBox->pScreens[i].aPreferredSize.cx = 1024; 218 pVBox->pScreens[i].aPreferredSize.cy = 768; 219 219 } 220 220 /* Set up the first mode correctly to match the requested initial mode. */ 221 pScrn->modes->HDisplay = pVBox-> aPreferredSize[0].cx;222 pScrn->modes->VDisplay = pVBox-> aPreferredSize[0].cy;221 pScrn->modes->HDisplay = pVBox->pScreens[0].aPreferredSize.cx; 222 pScrn->modes->VDisplay = pVBox->pScreens[0].aPreferredSize.cy; 223 223 /* RandR 1.1 quirk: make sure that the initial resolution is always present 224 224 * in the mode list as RandR will always advertise a mode of the initial 225 225 * virtual resolution via GetScreenInfo. */ 226 226 pMode = vboxAddEmptyScreenMode(pScrn); 227 vboxFillDisplayMode(pScrn, pMode, NULL, pVBox-> aPreferredSize[0].cx,228 pVBox-> aPreferredSize[0].cy);227 vboxFillDisplayMode(pScrn, pMode, NULL, pVBox->pScreens[0].aPreferredSize.cx, 228 pVBox->pScreens[0].aPreferredSize.cy); 229 229 } 230 230 … … 255 255 if (!((int32_t *)prop->data)[i]) 256 256 continue; 257 pVBox-> aPreferredSize[i].cx = ((int32_t *)prop->data)[i] >> 16;258 pVBox-> aPreferredSize[i].cy = ((int32_t *)prop->data)[i] & 0xffff;257 pVBox->pScreens[i].aPreferredSize.cx = ((int32_t *)prop->data)[i] >> 16; 258 pVBox->pScreens[i].aPreferredSize.cy = ((int32_t *)prop->data)[i] & 0xffff; 259 259 } 260 260 } … … 288 288 if (pScrn->currentMode == pMode) 289 289 pMode = pMode->next; 290 pMode->HDisplay = pVBox-> aPreferredSize[0].cx;291 pMode->VDisplay = pVBox-> aPreferredSize[0].cy;290 pMode->HDisplay = pVBox->pScreens[0].aPreferredSize.cx; 291 pMode->VDisplay = pVBox->pScreens[0].aPreferredSize.cy; 292 292 } 293 293 -
trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
r52191 r52199 288 288 unsigned cDisplay = (uintptr_t)crtc->driver_private; 289 289 TRACE_LOG("cDisplay=%u, mode=%i\n", cDisplay, mode); 290 pVBox-> afDisabled[cDisplay]= (mode != DPMSModeOn);290 pVBox->pScreens[cDisplay].afDisabled = (mode != DPMSModeOn); 291 291 /* Don't fiddle with the hardware if we are switched 292 292 * to a virtual terminal. */ … … 296 296 return; 297 297 } 298 if ( pVBox-> aScreenLocation[cDisplay].cx299 && pVBox-> aScreenLocation[cDisplay].cy)298 if ( pVBox->pScreens[cDisplay].aScreenLocation.cx 299 && pVBox->pScreens[cDisplay].aScreenLocation.cy) 300 300 VBOXSetMode(crtc->scrn, cDisplay, 301 pVBox-> aScreenLocation[cDisplay].cx,302 pVBox-> aScreenLocation[cDisplay].cy,303 pVBox-> aScreenLocation[cDisplay].x,304 pVBox-> aScreenLocation[cDisplay].y);301 pVBox->pScreens[cDisplay].aScreenLocation.cx, 302 pVBox->pScreens[cDisplay].aScreenLocation.cy, 303 pVBox->pScreens[cDisplay].aScreenLocation.x, 304 pVBox->pScreens[cDisplay].aScreenLocation.y); 305 305 } 306 306 … … 335 335 TRACE_LOG("name=%s, HDisplay=%d, VDisplay=%d, x=%d, y=%d\n", adjusted_mode->name, 336 336 adjusted_mode->HDisplay, adjusted_mode->VDisplay, x, y); 337 pVBox-> afDisabled[cDisplay]= false;338 pVBox-> aScreenLocation[cDisplay].cx = adjusted_mode->HDisplay;339 pVBox-> aScreenLocation[cDisplay].cy = adjusted_mode->VDisplay;340 pVBox-> aScreenLocation[cDisplay].x = x;341 pVBox-> aScreenLocation[cDisplay].y = y;337 pVBox->pScreens[cDisplay].afDisabled = false; 338 pVBox->pScreens[cDisplay].aScreenLocation.cx = adjusted_mode->HDisplay; 339 pVBox->pScreens[cDisplay].aScreenLocation.cy = adjusted_mode->VDisplay; 340 pVBox->pScreens[cDisplay].aScreenLocation.x = x; 341 pVBox->pScreens[cDisplay].aScreenLocation.y = y; 342 342 /* Don't fiddle with the hardware if we are switched 343 343 * to a virtual terminal. */ … … 466 466 VBoxUpdateSizeHints(pScrn); 467 467 pMode = vbox_output_add_mode(pVBox, &pModes, NULL, 468 pVBox-> aPreferredSize[iScreen].cx,469 pVBox-> aPreferredSize[iScreen].cy, TRUE,468 pVBox->pScreens[iScreen].aPreferredSize.cx, 469 pVBox->pScreens[iScreen].aPreferredSize.cy, TRUE, 470 470 FALSE); 471 471 VBOXEDIDSet(output, pMode); … … 527 527 h = (*(uint32_t *)value->data) & 0xffff; 528 528 TRACE_LOG("screen=%u, property value=%dx%d\n", cDisplay, w, h); 529 pVBox-> aPreferredSize[cDisplay].cx = w;530 pVBox-> aPreferredSize[cDisplay].cy = h;529 pVBox->pScreens[cDisplay].aPreferredSize.cx = w; 530 pVBox->pScreens[cDisplay].aPreferredSize.cy = h; 531 531 return TRUE; 532 532 } … … 1096 1096 1097 1097 /* Setup our virtual CRTCs. */ 1098 pVBox->p aCrtcs[i]= xf86CrtcCreate(pScrn, &VBOXCrtcFuncs);1099 pVBox->p aCrtcs[i]->driver_private = (void *)(uintptr_t)i;1098 pVBox->pScreens[i].paCrtcs = xf86CrtcCreate(pScrn, &VBOXCrtcFuncs); 1099 pVBox->pScreens[i].paCrtcs->driver_private = (void *)(uintptr_t)i; 1100 1100 1101 1101 /* Set up our virtual outputs. */ 1102 1102 snprintf(szOutput, sizeof(szOutput), "VGA-%u", i); 1103 pVBox->p aOutputs[i] = xf86OutputCreate(pScrn, &VBOXOutputFuncs,1104 1103 pVBox->pScreens[i].paOutputs 1104 = xf86OutputCreate(pScrn, &VBOXOutputFuncs, szOutput); 1105 1105 1106 1106 /* We are not interested in the monitor section in the 1107 1107 * configuration file. */ 1108 xf86OutputUseScreenMonitor(pVBox->p aOutputs[i], FALSE);1109 pVBox->p aOutputs[i]->possible_crtcs = 1 << i;1110 pVBox->p aOutputs[i]->possible_clones = 0;1111 pVBox->p aOutputs[i]->driver_private = (void *)(uintptr_t)i;1108 xf86OutputUseScreenMonitor(pVBox->pScreens[i].paOutputs, FALSE); 1109 pVBox->pScreens[i].paOutputs->possible_crtcs = 1 << i; 1110 pVBox->pScreens[i].paOutputs->possible_clones = 0; 1111 pVBox->pScreens[i].paOutputs->driver_private = (void *)(uintptr_t)i; 1112 1112 TRACE_LOG("Created crtc (%p) and output %s (%p)\n", 1113 (void *)pVBox->p aCrtcs[i], szOutput,1114 (void *)pVBox->p aOutputs[i]);1113 (void *)pVBox->pScreens[i].paCrtcs, szOutput, 1114 (void *)pVBox->pScreens[i].paOutputs); 1115 1115 } 1116 1116 } … … 1140 1140 { 1141 1141 INT32 value = 0; 1142 RRChangeOutputProperty(pVBox->p aOutputs[i]->randr_output,1142 RRChangeOutputProperty(pVBox->pScreens[i].paOutputs->randr_output, 1143 1143 vboxAtomVBoxMode(), XA_INTEGER, 32, 1144 1144 PropModeReplace, 1, &value, TRUE, … … 1161 1161 pVBox->FBSize.cx = pScrn->currentMode->HDisplay; 1162 1162 pVBox->FBSize.cy = pScrn->currentMode->VDisplay; 1163 pVBox-> aScreenLocation[0].cx = pScrn->currentMode->HDisplay;1164 pVBox-> aScreenLocation[0].cy = pScrn->currentMode->VDisplay;1165 pVBox-> aScreenLocation[0].x = pScrn->frameX0;1166 pVBox-> aScreenLocation[0].y = pScrn->frameY0;1163 pVBox->pScreens[0].aScreenLocation.cx = pScrn->currentMode->HDisplay; 1164 pVBox->pScreens[0].aScreenLocation.cy = pScrn->currentMode->VDisplay; 1165 pVBox->pScreens[0].aScreenLocation.x = pScrn->frameX0; 1166 pVBox->pScreens[0].aScreenLocation.y = pScrn->frameY0; 1167 1167 #endif /* !VBOXVIDEO_13 */ 1168 1168 … … 1327 1327 pVBox->FBSize.cx = pMode->HDisplay; 1328 1328 pVBox->FBSize.cy = pMode->VDisplay; 1329 pVBox-> aScreenLocation[0].cx = pMode->HDisplay;1330 pVBox-> aScreenLocation[0].cy = pMode->VDisplay;1331 pVBox-> aScreenLocation[0].x = pScrn->frameX0;1332 pVBox-> aScreenLocation[0].y = pScrn->frameY0;1329 pVBox->pScreens[0].aScreenLocation.cx = pMode->HDisplay; 1330 pVBox->pScreens[0].aScreenLocation.cy = pMode->VDisplay; 1331 pVBox->pScreens[0].aScreenLocation.x = pScrn->frameX0; 1332 pVBox->pScreens[0].aScreenLocation.y = pScrn->frameY0; 1333 1333 #endif 1334 1334 if (!pScrn->vtSema) … … 1354 1354 1355 1355 TRACE_ENTRY(); 1356 pVBox-> aScreenLocation[0].x = x;1357 pVBox-> aScreenLocation[0].y = y;1356 pVBox->pScreens[0].aScreenLocation.x = x; 1357 pVBox->pScreens[0].aScreenLocation.y = y; 1358 1358 /* Don't fiddle with the hardware if we are switched 1359 1359 * to a virtual terminal. */ … … 1364 1364 return; 1365 1365 } 1366 VBOXSetMode(pScrn, 0, pVBox-> aScreenLocation[0].cx,1367 pVBox-> aScreenLocation[0].cy, x, y);1366 VBOXSetMode(pScrn, 0, pVBox->pScreens[0].aScreenLocation.cx, 1367 pVBox->pScreens[0].aScreenLocation.cy, x, y); 1368 1368 TRACE_EXIT(); 1369 1369 } -
trunk/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
r51393 r52199 142 142 #endif 143 143 144 /*XXX*/ 144 /** Structure containing all virtual monitor-specific information. */ 145 struct VBoxScreen 146 { 147 /** Position information for each virtual screen for the purposes of 148 * sending dirty rectangle information to the right one. */ 149 RTRECT2 aScreenLocation; 150 /** Has this screen been disabled by the guest? */ 151 Bool afDisabled; 152 #ifdef VBOXVIDEO_13 153 /** The virtual crtcs. */ 154 struct _xf86Crtc *paCrtcs; 155 /** The virtual outputs, logically not distinct from crtcs. */ 156 struct _xf86Output *paOutputs; 157 #endif 158 /** Offsets of VBVA buffers in video RAM */ 159 uint32_t aoffVBVABuffer; 160 /** Context information about the VBVA buffers for each screen */ 161 struct VBVABUFFERCONTEXT aVbvaCtx; 162 /** The current preferred resolution for the screen */ 163 RTRECTSIZE aPreferredSize; 164 }; 145 165 146 166 typedef struct VBOXRec … … 177 197 /** Number of screens attached */ 178 198 uint32_t cScreens; 179 /** Position information for each virtual screen for the purposes of 180 * sending dirty rectangle information to the right one. */ 181 RTRECT2 aScreenLocation[VBOX_VIDEO_MAX_SCREENS]; 199 /** Information about each virtual screen. */ 200 struct VBoxScreen *pScreens; 182 201 /** The last requested framebuffer size. */ 183 202 RTRECTSIZE FBSize; 184 /** Has this screen been disabled by the guest? */ 185 Bool afDisabled[VBOX_VIDEO_MAX_SCREENS]; 186 #ifdef VBOXVIDEO_13 187 /** The virtual crtcs */ 188 struct _xf86Crtc *paCrtcs[VBOX_VIDEO_MAX_SCREENS]; 189 struct _xf86Output *paOutputs[VBOX_VIDEO_MAX_SCREENS]; 190 #else 203 #ifndef VBOXVIDEO_13 191 204 /** The original CreateScreenResources procedure which we wrap with our own. 192 205 */ 193 206 CreateScreenResourcesProcPtr pfnCreateScreenResources; 194 207 #endif 195 /** Offsets of VBVA buffers in video RAM */196 uint32_t aoffVBVABuffer[VBOX_VIDEO_MAX_SCREENS];197 /** Context information about the VBVA buffers for each screen */198 struct VBVABUFFERCONTEXT aVbvaCtx[VBOX_VIDEO_MAX_SCREENS];199 /** The current preferred resolution for the screen */200 RTRECTSIZE aPreferredSize[VBOX_VIDEO_MAX_SCREENS];201 208 /** HGSMI guest heap context */ 202 209 HGSMIGUESTCOMMANDCONTEXT guestCtx; -
trunk/src/VBox/Additions/x11/vboxvideo/vbva.c
r51393 r52199 66 66 { 67 67 /* Just continue quietly if VBVA is not currently active. */ 68 struct VBVABUFFER *pVBVA = pVBox-> aVbvaCtx[j].pVBVA;68 struct VBVABUFFER *pVBVA = pVBox->pScreens[j].aVbvaCtx.pVBVA; 69 69 if ( !pVBVA 70 70 || !(pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED)) … … 72 72 for (i = 0; i < iRects; ++i) 73 73 { 74 if ( aRects[i].x1 > pVBox-> aScreenLocation[j].x75 + pVBox-> aScreenLocation[j].cx76 || aRects[i].y1 > pVBox-> aScreenLocation[j].y77 + pVBox-> aScreenLocation[j].cy78 || aRects[i].x2 < pVBox-> aScreenLocation[j].x79 || aRects[i].y2 < pVBox-> aScreenLocation[j].y)74 if ( aRects[i].x1 > pVBox->pScreens[j].aScreenLocation.x 75 + pVBox->pScreens[j].aScreenLocation.cx 76 || aRects[i].y1 > pVBox->pScreens[j].aScreenLocation.y 77 + pVBox->pScreens[j].aScreenLocation.cy 78 || aRects[i].x2 < pVBox->pScreens[j].aScreenLocation.x 79 || aRects[i].y2 < pVBox->pScreens[j].aScreenLocation.y) 80 80 continue; 81 81 cmdHdr.x = (int16_t)aRects[i].x1; … … 89 89 #endif 90 90 91 if (VBoxVBVABufferBeginUpdate(&pVBox-> aVbvaCtx[j],91 if (VBoxVBVABufferBeginUpdate(&pVBox->pScreens[j].aVbvaCtx, 92 92 &pVBox->guestCtx)) 93 93 { 94 VBoxVBVAWrite(&pVBox-> aVbvaCtx[j], &pVBox->guestCtx, &cmdHdr,94 VBoxVBVAWrite(&pVBox->pScreens[j].aVbvaCtx, &pVBox->guestCtx, &cmdHdr, 95 95 sizeof(cmdHdr)); 96 VBoxVBVABufferEndUpdate(&pVBox-> aVbvaCtx[j]);96 VBoxVBVABufferEndUpdate(&pVBox->pScreens[j].aVbvaCtx); 97 97 } 98 98 } … … 198 198 pVBox->cbView = pVBox->cbFBMax = offVRAMBaseMapping; 199 199 pVBox->cScreens = VBoxHGSMIGetMonitorCount(&pVBox->guestCtx); 200 pVBox->pScreens = calloc(pVBox->cScreens, sizeof(*pVBox->pScreens)); 201 if (pVBox->pScreens == NULL) 202 FatalError("Failed to allocate memory for screens array.\n"); 200 203 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Requested monitor count: %u\n", 201 204 pVBox->cScreens); … … 203 206 { 204 207 pVBox->cbFBMax -= VBVA_MIN_BUFFER_SIZE; 205 pVBox-> aoffVBVABuffer[i]= pVBox->cbFBMax;208 pVBox->pScreens[i].aoffVBVABuffer = pVBox->cbFBMax; 206 209 TRACE_LOG("VBVA buffer offset for screen %u: 0x%lx\n", i, 207 210 (unsigned long) pVBox->cbFBMax); 208 VBoxVBVASetupBufferContext(&pVBox-> aVbvaCtx[i],209 pVBox-> aoffVBVABuffer[i],211 VBoxVBVASetupBufferContext(&pVBox->pScreens[i].aVbvaCtx, 212 pVBox->pScreens[i].aoffVBVABuffer, 210 213 VBVA_MIN_BUFFER_SIZE); 211 214 } … … 261 264 262 265 pVBVA = (struct VBVABUFFER *) ( ((uint8_t *)pVBox->base) 263 + pVBox->aoffVBVABuffer[i]); 264 if (!VBoxVBVAEnable(&pVBox->aVbvaCtx[i], &pVBox->guestCtx, pVBVA, i)) 266 + pVBox->pScreens[i].aoffVBVABuffer); 267 if (!VBoxVBVAEnable(&pVBox->pScreens[i].aVbvaCtx, &pVBox->guestCtx, 268 pVBVA, i)) 265 269 rc = FALSE; 266 270 } … … 293 297 TRACE_ENTRY(); 294 298 for (i = 0; i < pVBox->cScreens; ++i) 295 VBoxVBVADisable(&pVBox-> aVbvaCtx[i], &pVBox->guestCtx, i);296 } 299 VBoxVBVADisable(&pVBox->pScreens[i].aVbvaCtx, &pVBox->guestCtx, i); 300 }
Note:
See TracChangeset
for help on using the changeset viewer.