VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Display/drv.c@ 27505

Last change on this file since 27505 was 25052, checked in by vboxsync, 15 years ago

HGSMI/VBVA: enable VRDP commands only if there are connected RDP clients.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 28.5 KB
Line 
1/** @file
2 *
3 * VirtualBox Windows NT/2000/XP guest video driver
4 *
5 * Display driver screen draw entry points.
6 *
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/* The driver operates in 3 modes:
23 * 1) BASE : Driver does not report to host about any operations.
24 * All Drv* are immediately routed to Eng*.
25 * 2) VBVA : Driver reports dirty rectangles to host.
26 * 3) VBVA + VRDP : Driver also creates orders pipeline from which VRDP
27 * can reconstruct all drawing operations, including
28 * bitmap updates.
29 *
30 * These modes affect only Drv* functions in this file.
31 *
32 * VBVA mode is enabled by a registry key for the miniport driver
33 * (as it is implemented now).
34 *
35 * VRDP mode is enabled when a VRDP client connects and VBVA is enabled.
36 * The host sets a bit flag in VBVAMemory when VRDP client is connected.
37 *
38 * The VRDP mode pipeline consists of 3 types of commands:
39 *
40 * 1) RDP orders: BitBlt, RectFill, Text.
41 * These are the simpliest ones.
42 *
43 * 2) Caching: Bitmap, glyph, brush.
44 * The driver maintains a bitmap (or other objects) cache.
45 * All source bitmaps are cached. The driver verifies
46 * iUniq and also computes CRC for these bitmaps
47 * for searching. The driver will use SURFOBJ::dhsurf
48 * field to save a pointer to in driver structure, even
49 * for Engine managed bitmaps (hope that will work).
50 *
51 *
52 * 3) Bitmap updates, when given draw operation can not be done
53 * using orders.
54 *
55 */
56
57#include "driver.h"
58
59#ifdef STAT_sunlover
60void dumpsurf (SURFOBJ *pso, char *s)
61{
62 DISPDBG((1, "Surface %s: %p\n", s, pso));
63 if (pso)
64 {
65 DISPDBG((1, " DHSURF dhsurf = %p\n", pso->dhsurf));
66 DISPDBG((1, " HSURF hsurf = %p\n", pso->hsurf));
67 DISPDBG((1, " DHPDEV dhpdev = %p\n", pso->dhpdev));
68 DISPDBG((1, " HDEV hdev = %p\n", pso->hdev));
69 DISPDBG((1, " SIZEL sizlBitmap = %dx%d\n", pso->sizlBitmap.cx, pso->sizlBitmap.cy));
70 DISPDBG((1, " ULONG cjBits = %p\n", pso->cjBits));
71 DISPDBG((1, " PVOID pvBits = %p\n", pso->pvBits));
72 DISPDBG((1, " PVOID pvScan0 = %p\n", pso->pvScan0));
73 DISPDBG((1, " LONG lDelta = %p\n", pso->lDelta));
74 DISPDBG((1, " ULONG iUniq = %p\n", pso->iUniq));
75 DISPDBG((1, " ULONG iBitmapFormat = %p\n", pso->iBitmapFormat));
76 DISPDBG((1, " USHORT iType = %p\n", pso->iType));
77 DISPDBG((1, " USHORT fjBitmap = %p\n", pso->fjBitmap));
78 }
79}
80#else
81#define dumpsurf(a, b)
82#endif /* STAT_sunlover */
83
84BOOL bIsScreenSurface (SURFOBJ *pso)
85{
86 if (pso)
87 {
88 PPDEV ppdev = (PPDEV)pso->dhpdev;
89
90 /* The screen surface has the 'pso->dhpdev' field,
91 * and is either the screen device surface with handle = hsurfScreen,
92 * or a surface derived from DDRAW with address equal to the framebuffer.
93 */
94 if ( ppdev
95 && ( pso->hsurf == ppdev->hsurfScreen
96 || pso->pvBits == ppdev->pjScreen
97 )
98 )
99 {
100 return TRUE;
101 }
102 }
103
104 return FALSE;
105}
106
107#ifndef VBOX_WITH_HGSMI
108#define VBVA_OPERATION(__psoDest, __fn, __a) do { \
109 if (bIsScreenSurface(__psoDest)) \
110 { \
111 PPDEV ppdev = (PPDEV)__psoDest->dhpdev; \
112 \
113 if (ppdev->pInfo && vboxHwBufferBeginUpdate (ppdev)) \
114 { \
115 vbva##__fn __a; \
116 \
117 if ( ppdev->pInfo->hostEvents.fu32Events \
118 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) \
119 { \
120 vrdpReset (ppdev); \
121 \
122 ppdev->pInfo->hostEvents.fu32Events &= \
123 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; \
124 } \
125 \
126 if (ppdev->vbva.pVbvaMemory->fu32ModeFlags \
127 & VBVA_F_MODE_VRDP) \
128 { \
129 vrdp##__fn __a; \
130 } \
131 \
132 vboxHwBufferEndUpdate (ppdev); \
133 } \
134 } \
135} while (0)
136#else
137#define VBVA_OPERATION(__psoDest, __fn, __a) do { \
138 if (bIsScreenSurface(__psoDest)) \
139 { \
140 PPDEV ppdev = (PPDEV)__psoDest->dhpdev; \
141 \
142 if (ppdev->bHGSMISupported && vboxHwBufferBeginUpdate (ppdev)) \
143 { \
144 vbva##__fn __a; \
145 \
146 if ( ppdev->pVBVA->hostFlags.u32HostEvents \
147 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET) \
148 { \
149 vrdpReset (ppdev); \
150 \
151 ppdev->pVBVA->hostFlags.u32HostEvents &= \
152 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET; \
153 } \
154 \
155 if (ppdev->pVBVA->hostFlags.u32HostEvents \
156 & VBVA_F_MODE_VRDP) \
157 { \
158 vrdp##__fn __a; \
159 } \
160 \
161 vboxHwBufferEndUpdate (ppdev); \
162 } \
163 } \
164} while (0)
165#endif /* VBOX_WITH_HGSMI */
166
167//#undef VBVA_OPERATION
168//#define VBVA_OPERATION(_psoDest, __fn, __a) do { } while (0)
169
170
171#if 0
172typedef struct _SURFOBJ {
173+00 DHSURF dhsurf;
174+04 HSURF hsurf;
175+08 DHPDEV dhpdev;
176+0c HDEV hdev;
177+10 SIZEL sizlBitmap;
178+18 ULONG cjBits;
179+1c PVOID pvBits;
180+20 PVOID pvScan0;
181+24 LONG lDelta;
182+28 ULONG iUniq;
183+2c ULONG iBitmapFormat;
184+30 USHORT iType;
185+32 USHORT fjBitmap;
186} SURFOBJ;
187#endif
188
189BOOL APIENTRY DrvBitBlt(
190 SURFOBJ *psoTrg,
191 SURFOBJ *psoSrc,
192 SURFOBJ *psoMask,
193 CLIPOBJ *pco,
194 XLATEOBJ *pxlo,
195 RECTL *prclTrg,
196 POINTL *pptlSrc,
197 POINTL *pptlMask,
198 BRUSHOBJ *pbo,
199 POINTL *pptlBrush,
200 ROP4 rop4
201 )
202{
203 BOOL bRc;
204
205 DISPDBG((1, "%s\n", __FUNCTION__));
206
207 DISPDBG((1, "psoTrg = %p, psoSrc = %p, psoMask = %p, pco = %p, pxlo = %p, prclTrg = %p, pptlSrc = %p, pptlMask = %p, pbo = %p, pptlBrush = %p, rop4 = %08X\n",
208 psoTrg, psoSrc, psoMask, pco, pxlo, prclTrg, pptlSrc, pptlMask, pbo, pptlBrush, rop4));
209
210 STATDRVENTRY(BitBlt, psoTrg);
211
212 bRc = EngBitBlt(CONV_SURF(psoTrg), CONV_SURF(psoSrc), psoMask, pco, pxlo, prclTrg, pptlSrc, pptlMask, pbo, pptlBrush, rop4);
213
214 VBVA_OPERATION(psoTrg,
215 BitBlt,
216 (psoTrg, psoSrc, psoMask, pco, pxlo, prclTrg, pptlSrc, pptlMask, pbo, pptlBrush, rop4));
217
218 return bRc;
219}
220
221BOOL APIENTRY DrvTextOut(
222 SURFOBJ *pso,
223 STROBJ *pstro,
224 FONTOBJ *pfo,
225 CLIPOBJ *pco,
226 RECTL *prclExtra, // Obsolete, always NULL
227 RECTL *prclOpaque,
228 BRUSHOBJ *pboFore,
229 BRUSHOBJ *pboOpaque,
230 POINTL *pptlOrg,
231 MIX mix
232 )
233{
234 BOOL bRc;
235
236 DISPDBG((1, "%s\n", __FUNCTION__));
237
238 STATDRVENTRY(TextOut, pso);
239
240 bRc = EngTextOut(CONV_SURF(pso), pstro, pfo, pco, prclExtra, prclOpaque, pboFore, pboOpaque, pptlOrg, mix);
241
242 VBVA_OPERATION(pso,
243 TextOut,
244 (pso, pstro, pfo, pco, prclExtra, prclOpaque, pboFore, pboOpaque, pptlOrg, mix));
245
246 return bRc;
247}
248
249
250BOOL APIENTRY DrvLineTo(
251 SURFOBJ *pso,
252 CLIPOBJ *pco,
253 BRUSHOBJ *pbo,
254 LONG x1,
255 LONG y1,
256 LONG x2,
257 LONG y2,
258 RECTL *prclBounds,
259 MIX mix
260 )
261{
262 BOOL bRc;
263
264 DISPDBG((1, "%s\n", __FUNCTION__));
265
266 STATDRVENTRY(LineTo, pso);
267
268 bRc = EngLineTo(CONV_SURF(pso), pco, pbo, x1, y1, x2, y2, prclBounds, mix);
269
270 VBVA_OPERATION(pso,
271 LineTo,
272 (pso, pco, pbo, x1, y1, x2, y2, prclBounds, mix));
273
274 return bRc;
275}
276
277BOOL APIENTRY DrvStretchBlt(
278 SURFOBJ *psoDest,
279 SURFOBJ *psoSrc,
280 SURFOBJ *psoMask,
281 CLIPOBJ *pco,
282 XLATEOBJ *pxlo,
283 COLORADJUSTMENT *pca,
284 POINTL *pptlHTOrg,
285 RECTL *prclDest,
286 RECTL *prclSrc,
287 POINTL *pptlMask,
288 ULONG iMode
289 )
290{
291 BOOL bRc;
292
293 DISPDBG((1, "%s\n", __FUNCTION__));
294
295 STATDRVENTRY(StretchBlt, psoDest);
296
297 bRc = EngStretchBlt(CONV_SURF(psoDest), CONV_SURF(psoSrc), psoMask, pco, pxlo, pca, pptlHTOrg,
298 prclDest, prclSrc, pptlMask, iMode);
299
300 VBVA_OPERATION(psoDest,
301 StretchBlt,
302 (psoDest, psoSrc, psoMask, pco, pxlo, pca, pptlHTOrg,
303 prclDest, prclSrc, pptlMask, iMode));
304
305 return bRc;
306}
307
308
309BOOL APIENTRY DrvCopyBits(
310 SURFOBJ *psoDest,
311 SURFOBJ *psoSrc,
312 CLIPOBJ *pco,
313 XLATEOBJ *pxlo,
314 RECTL *prclDest,
315 POINTL *pptlSrc
316 )
317{
318 RECTL rclDest = *prclDest;
319 POINTL ptlSrc = *pptlSrc;
320
321 BOOL bRc;
322 BOOL bDo = TRUE;
323
324 DISPDBG((1, "%s\n", __FUNCTION__));
325
326 DISPDBG((1, "psoDest = %p, psoSrc = %p, pco = %p, pxlo = %p, prclDest = %p, pptlSrc = %p\n",
327 psoDest, psoSrc, pco, pxlo, prclDest, pptlSrc));
328
329 STATDRVENTRY(CopyBits, psoDest);
330
331 dumpsurf(psoSrc, "psoSrc");
332 dumpsurf(psoDest, "psoDest");
333
334 STATPRINT;
335
336#ifdef VBOX_VBVA_ADJUST_RECT
337 /* Experimental fix for too large bitmap updates.
338 *
339 * Some application do a large bitmap update event if only
340 * a small part of the bitmap is actually changed.
341 *
342 * The driver will find the changed rectangle by comparing
343 * the current framebuffer content with the source bitmap.
344 *
345 * The optimization is only active when:
346 * - the VBVA extension is enabled;
347 * - the source bitmap is not cacheable;
348 * - the bitmap formats of both the source and the screen surfaces are equal.
349 *
350 */
351 if ( psoSrc
352 && !bIsScreenSurface(psoSrc)
353 && bIsScreenSurface(psoDest))
354 {
355 PPDEV ppdev = (PPDEV)psoDest->dhpdev;
356
357#ifndef VBOX_WITH_HGSMI
358 VBVAMEMORY *pVbvaMemory = ppdev->vbva.pVbvaMemory;
359
360 DISPDBG((1, "offscreen->screen\n"));
361
362 if ( pVbvaMemory
363 && (pVbvaMemory->fu32ModeFlags & VBVA_F_MODE_ENABLED))
364#else
365 DISPDBG((1, "offscreen->screen\n"));
366
367 if ( ppdev->pVBVA
368 && (ppdev->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))
369#endif /* VBOX_WITH_HGSMI */
370 {
371 if ( (psoSrc->fjBitmap & BMF_DONTCACHE) != 0
372 || psoSrc->iUniq == 0)
373 {
374 DISPDBG((1, "non-cacheable %d->%d (ppdev %p)\n", psoSrc->iBitmapFormat, psoDest->iBitmapFormat, ppdev));
375
376 /* It is possible to apply the fix. */
377 bDo = vbvaFindChangedRect (CONV_SURF(psoDest), CONV_SURF(psoSrc), &rclDest, &ptlSrc);
378 }
379 }
380 }
381
382 if (!bDo)
383 {
384 /* The operation is a NOP. Just return success. */
385 return TRUE;
386 }
387#endif /* VBOX_VBVA_ADJUST_RECT */
388
389 bRc = EngCopyBits(CONV_SURF(psoDest), CONV_SURF(psoSrc), pco, pxlo, &rclDest, &ptlSrc);
390
391 VBVA_OPERATION(psoDest,
392 CopyBits,
393 (psoDest, psoSrc, pco, pxlo, &rclDest, &ptlSrc));
394
395 return bRc;
396}
397
398BOOL APIENTRY DrvPaint(
399 SURFOBJ *pso,
400 CLIPOBJ *pco,
401 BRUSHOBJ *pbo,
402 POINTL *pptlBrushOrg,
403 MIX mix
404 )
405{
406 BOOL bRc;
407
408 DISPDBG((1, "%s\n", __FUNCTION__));
409
410 STATDRVENTRY(Paint, pso);
411
412 bRc = EngPaint (CONV_SURF(pso), pco, pbo, pptlBrushOrg, mix);
413
414 VBVA_OPERATION(pso,
415 Paint,
416 (pso, pco, pbo, pptlBrushOrg, mix));
417
418 return bRc;
419}
420
421BOOL APIENTRY DrvFillPath(
422 SURFOBJ *pso,
423 PATHOBJ *ppo,
424 CLIPOBJ *pco,
425 BRUSHOBJ *pbo,
426 POINTL *pptlBrushOrg,
427 MIX mix,
428 FLONG flOptions
429 )
430{
431 BOOL bRc;
432
433 DISPDBG((1, "%s\n", __FUNCTION__));
434
435 STATDRVENTRY(FillPath, pso);
436
437 bRc = EngFillPath(CONV_SURF(pso), ppo, pco, pbo, pptlBrushOrg, mix, flOptions);
438
439 VBVA_OPERATION(pso,
440 FillPath,
441 (pso, ppo, pco, pbo, pptlBrushOrg, mix, flOptions));
442
443 return bRc;
444}
445
446
447
448BOOL APIENTRY DrvStrokePath(
449 SURFOBJ *pso,
450 PATHOBJ *ppo,
451 CLIPOBJ *pco,
452 XFORMOBJ *pxo,
453 BRUSHOBJ *pbo,
454 POINTL *pptlBrushOrg,
455 LINEATTRS *plineattrs,
456 MIX mix
457 )
458{
459 BOOL bRc;
460
461 DISPDBG((1, "%s\n", __FUNCTION__));
462
463 STATDRVENTRY(StrokePath, pso);
464
465 bRc = EngStrokePath(CONV_SURF(pso), ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix);
466
467 VBVA_OPERATION(pso,
468 StrokePath,
469 (pso, ppo, pco, pxo, pbo, pptlBrushOrg, plineattrs, mix));
470
471 return bRc;
472}
473
474BOOL APIENTRY DrvStrokeAndFillPath(
475 SURFOBJ *pso,
476 PATHOBJ *ppo,
477 CLIPOBJ *pco,
478 XFORMOBJ *pxo,
479 BRUSHOBJ *pboStroke,
480 LINEATTRS *plineattrs,
481 BRUSHOBJ *pboFill,
482 POINTL *pptlBrushOrg,
483 MIX mixFill,
484 FLONG flOptions
485 )
486{
487 BOOL bRc;
488
489 DISPDBG((1, "%s\n", __FUNCTION__));
490
491 STATDRVENTRY(StrokeAndFillPath, pso);
492
493 bRc = EngStrokeAndFillPath(CONV_SURF(pso), ppo, pco, pxo, pboStroke, plineattrs, pboFill, pptlBrushOrg, mixFill, flOptions);
494
495 VBVA_OPERATION(pso,
496 StrokeAndFillPath,
497 (pso, ppo, pco, pxo, pboStroke, plineattrs, pboFill, pptlBrushOrg, mixFill, flOptions));
498
499 return bRc;
500}
501
502static void ssbDiscardTopSlot (PPDEV ppdev)
503{
504 SSB *pSSB = &ppdev->aSSB[--ppdev->cSSB];
505
506 if (pSSB->pBuffer)
507 {
508 EngFreeMem (pSSB->pBuffer);
509 pSSB->pBuffer = NULL;
510 }
511
512 pSSB->ident = 0;
513}
514
515static void ssbDiscardUpperSlots (PPDEV ppdev, ULONG_PTR ident)
516{
517 while (ppdev->cSSB > ident)
518 {
519 ssbDiscardTopSlot (ppdev);
520 }
521}
522
523static BOOL ssbCopy (SSB *pSSB, SURFOBJ *pso, RECTL *prcl, BOOL bToScreen)
524{
525 BYTE *pSrc;
526 BYTE *pDst;
527
528 LONG lDeltaSrc;
529 LONG lDeltaDst;
530
531 ULONG cWidth;
532 ULONG cHeight;
533
534 int cbPixel = format2BytesPerPixel(pso);
535
536 DISPDBG((1, "ssbCopy: pSSB = %p, pso = %p, prcl = %p, bToScreen = %d\n", pSSB, pso, prcl, bToScreen));
537
538 if (cbPixel == 0)
539 {
540 DISPDBG((1, "ssbCopy: unsupported pixel format!!!\n"));
541 return FALSE;
542 }
543
544 cWidth = prcl->right - prcl->left;
545 cHeight = prcl->bottom - prcl->top;
546
547 if (bToScreen)
548 {
549 if (pSSB->pBuffer == NULL)
550 {
551 DISPDBG((1, "ssbCopy: source buffer is NULL!!!\n"));
552 return FALSE;
553 }
554
555 pSrc = pSSB->pBuffer;
556 lDeltaSrc = cWidth * cbPixel;
557
558 pDst = (BYTE *)pso->pvScan0 +
559 pso->lDelta * prcl->top +
560 cbPixel * prcl->left;
561 lDeltaDst = pso->lDelta;
562 }
563 else
564 {
565 if (pSSB->pBuffer != NULL)
566 {
567 DISPDBG((1, "ssbCopy: source buffer is not NULL!!!\n"));
568 return FALSE;
569 }
570
571 pSSB->pBuffer = (BYTE *)EngAllocMem (0, cWidth * cHeight * cbPixel, ALLOC_TAG);
572
573 if (pSSB->pBuffer == NULL)
574 {
575 DISPDBG((1, "ssbCopy: Failed to allocate buffer!!!\n"));
576 return FALSE;
577 }
578
579 pDst = pSSB->pBuffer;
580 lDeltaDst = cWidth * cbPixel;
581
582 pSrc = (BYTE *)pso->pvScan0 +
583 pso->lDelta * prcl->top +
584 cbPixel * prcl->left;
585 lDeltaSrc = pso->lDelta;
586 }
587
588 DISPDBG((1, "ssbCopy: cHeight = %d, pDst = %p, pSrc = %p, lDeltaSrc = %d, lDeltaDst = %d\n",
589 cHeight, pDst, pSrc, lDeltaSrc, lDeltaDst));
590
591 while (cHeight--)
592 {
593 memcpy (pDst, pSrc, cWidth * cbPixel);
594
595 pDst += lDeltaDst;
596 pSrc += lDeltaSrc;
597 }
598
599 DISPDBG((1, "ssbCopy: completed.\n"));
600 return TRUE;
601}
602
603
604ULONG_PTR APIENTRY DrvSaveScreenBits(
605 SURFOBJ *pso,
606 ULONG iMode,
607 ULONG_PTR ident,
608 RECTL *prcl
609 )
610{
611 ULONG_PTR rc = 0; /* 0 means the function failure for every iMode. */
612
613 RECTL rcl;
614 SSB *pSSB;
615
616 SURFOBJ *psoOrg = pso;
617
618 BOOL bCallVBVA = FALSE;
619
620 PPDEV ppdev = (PPDEV)pso->dhpdev;
621
622 DISPDBG((1, "%s: %p, %d, %d, %d,%d %d,%d\n",
623 __FUNCTION__, pso, iMode, ident, prcl->left, prcl->top, prcl->right, prcl->bottom));
624
625 if (!ppdev)
626 {
627 return rc;
628 }
629
630 pso = CONV_SURF(pso);
631
632 /* Order the rectangle. */
633 if (prcl->left <= prcl->right)
634 {
635 rcl.left = prcl->left;
636 rcl.right = prcl->right;
637 }
638 else
639 {
640 rcl.left = prcl->right;
641 rcl.right = prcl->left;
642 }
643
644 if (prcl->top <= prcl->bottom)
645 {
646 rcl.top = prcl->top;
647 rcl.bottom = prcl->bottom;
648 }
649 else
650 {
651 rcl.top = prcl->bottom;
652 rcl.bottom = prcl->top;
653 }
654
655 /* Implementation of the save/restore is a bit complicated because RDP
656 * requires "the sequencing of saves and restores is such that they
657 * behave as a last-in, first-out stack.".
658 */
659 switch (iMode)
660 {
661 case SS_SAVE:
662 {
663 DISPDBG((1, "DrvSaveScreenBits: SS_SAVE %d\n", ppdev->cSSB));
664
665 if (ppdev->cSSB >= RT_ELEMENTS(ppdev->aSSB))
666 {
667 /* All slots are already in use. Fail. */
668 DISPDBG((1, "DrvSaveScreenBits: no more slots %d!!!\n", ppdev->cSSB));
669 break;
670 }
671
672 /* Get pointer to the slot where bits will be saved. */
673 pSSB = &ppdev->aSSB[ppdev->cSSB];
674
675 /* Allocate memory for screen bits and copy them to the buffer. */
676 if (ssbCopy (pSSB, pso, &rcl, FALSE /* bToScreen */))
677 {
678 /* Bits where successfully copied. Increase the active slot number
679 * and call VBVA levels, 'ident' is also assigned, the VBVA level
680 * will use it even for the SS_SAVE.
681 */
682 ident = rc = pSSB->ident = ++ppdev->cSSB;
683 bCallVBVA = TRUE;
684 }
685 } break;
686
687 case SS_RESTORE:
688 {
689 DISPDBG((1, "DrvSaveScreenBits: SS_RESTORE\n"));
690
691 if ( ppdev->cSSB == 0
692 || ident == 0
693 || ident > ppdev->cSSB)
694 {
695 DISPDBG((1, "DrvSaveScreenBits: no slot: ppdev->cSSB = %d!!!\n", ppdev->cSSB));
696 break;
697 }
698
699 if (ident < ppdev->cSSB)
700 {
701 ssbDiscardUpperSlots (ppdev, ident);
702 }
703
704 VBVA_ASSERT(ident == ppdev->cSSB);
705 VBVA_ASSERT(ident != 0);
706
707 pSSB = &ppdev->aSSB[ident - 1];
708
709 ssbCopy (pSSB, pso, &rcl, TRUE /* bToScreen */);
710
711 /* Bits must be discarded. */
712 ssbDiscardTopSlot (ppdev);
713
714 rc = TRUE;
715 bCallVBVA = TRUE;
716 } break;
717
718 case SS_FREE:
719 {
720 DISPDBG((1, "DrvSaveScreenBits: SS_FREE\n"));
721
722 if ( ppdev->cSSB == 0
723 || ident == 0
724 || ident > ppdev->cSSB)
725 {
726 DISPDBG((1, "DrvSaveScreenBits: no slot: ppdev->cSSB = %d!!!\n", ppdev->cSSB));
727 break;
728 }
729
730 if (ident < ppdev->cSSB)
731 {
732 ssbDiscardUpperSlots (ppdev, ident);
733 }
734
735 VBVA_ASSERT(ident == ppdev->cSSB);
736 VBVA_ASSERT(ident != 0);
737
738 /* Bits must be discarded. */
739 ssbDiscardTopSlot (ppdev);
740
741 rc = TRUE;
742 } break;
743 }
744
745 /* Now call the VBVA/VRDP levels. */
746 if (bCallVBVA)
747 {
748 DISPDBG((1, "DrvSaveScreenBits: calling VBVA\n"));
749 VBVA_OPERATION(psoOrg,
750 SaveScreenBits,
751 (psoOrg, iMode, ident, &rcl));
752 }
753
754 return rc;
755}
756
757BOOL APIENTRY DrvRealizeBrush(
758 BRUSHOBJ *pbo,
759 SURFOBJ *psoTarget,
760 SURFOBJ *psoPattern,
761 SURFOBJ *psoMask,
762 XLATEOBJ *pxlo,
763 ULONG iHatch
764 )
765{
766 BOOL bRc = FALSE;
767
768 DISPDBG((1, "%s\n", __FUNCTION__));
769
770 if (bIsScreenSurface(psoTarget))
771 {
772 PPDEV ppdev = (PPDEV)psoTarget->dhpdev;
773
774#ifndef VBOX_WITH_HGSMI
775 if ( ppdev->vbva.pVbvaMemory
776 && (ppdev->vbva.pVbvaMemory->fu32ModeFlags & VBVA_F_MODE_ENABLED))
777 {
778 if (ppdev->vbva.pVbvaMemory->fu32ModeFlags
779 & VBVA_F_MODE_VRDP_RESET)
780 {
781 vrdpReset (ppdev);
782
783 ppdev->vbva.pVbvaMemory->fu32ModeFlags &=
784 ~VBVA_F_MODE_VRDP_RESET;
785 }
786
787 if (ppdev->vbva.pVbvaMemory->fu32ModeFlags
788 & VBVA_F_MODE_VRDP)
789 {
790 bRc = vrdpRealizeBrush (pbo, psoTarget, psoPattern, psoMask, pxlo, iHatch);
791 }
792 }
793#else
794 if ( ppdev->pVBVA
795 && (ppdev->pVBVA->hostFlags.u32HostEvents & VBVA_F_MODE_ENABLED))
796 {
797 if (ppdev->pVBVA->hostFlags.u32HostEvents
798 & VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET)
799 {
800 vrdpReset (ppdev);
801
802 ppdev->pVBVA->hostFlags.u32HostEvents &=
803 ~VBOX_VIDEO_INFO_HOST_EVENTS_F_VRDP_RESET;
804 }
805
806 if (ppdev->pVBVA->hostFlags.u32HostEvents
807 & VBVA_F_MODE_VRDP)
808 {
809 bRc = vrdpRealizeBrush (pbo, psoTarget, psoPattern, psoMask, pxlo, iHatch);
810 }
811 }
812#endif /* VBOX_WITH_HGSMI */
813 }
814
815 return bRc;
816}
817
818#ifdef STAT_sunlover
819ULONG gStatCopyBitsOffscreenToScreen = 0;
820ULONG gStatCopyBitsScreenToScreen = 0;
821ULONG gStatBitBltOffscreenToScreen = 0;
822ULONG gStatBitBltScreenToScreen = 0;
823ULONG gStatUnchangedOffscreenToScreen = 0;
824ULONG gStatUnchangedOffscreenToScreenCRC = 0;
825ULONG gStatNonTransientEngineBitmaps = 0;
826ULONG gStatTransientEngineBitmaps = 0;
827ULONG gStatUnchangedBitmapsCRC = 0;
828ULONG gStatUnchangedBitmapsDeviceCRC = 0;
829ULONG gStatBitmapsCRC = 0;
830ULONG gStatBitBltScreenPattern = 0;
831ULONG gStatBitBltScreenSquare = 0;
832ULONG gStatBitBltScreenPatternReported = 0;
833ULONG gStatBitBltScreenSquareReported = 0;
834ULONG gStatCopyBitsScreenSquare = 0;
835
836ULONG gStatEnablePDEV = 0;
837ULONG gStatCompletePDEV = 0;
838ULONG gStatDisablePDEV = 0;
839ULONG gStatEnableSurface = 0;
840ULONG gStatDisableSurface = 0;
841ULONG gStatAssertMode = 0;
842ULONG gStatDisableDriver = 0;
843ULONG gStatCreateDeviceBitmap = 0;
844ULONG gStatDeleteDeviceBitmap = 0;
845ULONG gStatDitherColor = 0;
846ULONG gStatStrokePath = 0;
847ULONG gStatFillPath = 0;
848ULONG gStatStrokeAndFillPath = 0;
849ULONG gStatPaint = 0;
850ULONG gStatBitBlt = 0;
851ULONG gStatCopyBits = 0;
852ULONG gStatStretchBlt = 0;
853ULONG gStatSetPalette = 0;
854ULONG gStatTextOut = 0;
855ULONG gStatSetPointerShape = 0;
856ULONG gStatMovePointer = 0;
857ULONG gStatLineTo = 0;
858ULONG gStatSynchronize = 0;
859ULONG gStatGetModes = 0;
860ULONG gStatGradientFill = 0;
861ULONG gStatStretchBltROP = 0;
862ULONG gStatPlgBlt = 0;
863ULONG gStatAlphaBlend = 0;
864ULONG gStatTransparentBlt = 0;
865
866void statPrint (void)
867{
868 DISPDBG((0,
869 "BMPSTAT:\n"
870 " gStatCopyBitsOffscreenToScreen = %u\n"
871 " gStatCopyBitsScreenToScreen = %u\n"
872 " gStatBitBltOffscreenToScreen = %u\n"
873 " gStatBitBltScreenToScreen = %u\n"
874 " gStatUnchangedOffscreenToScreen = %u\n"
875 " gStatUnchangedOffscreenToScreenCRC = %u\n"
876 " gStatNonTransientEngineBitmaps = %u\n"
877 " gStatTransientEngineBitmaps = %u\n"
878 " gStatUnchangedBitmapsCRC = %u\n"
879 " gStatUnchangedBitmapsDeviceCRC = %u\n"
880 " gStatBitmapsCRC = %u\n"
881 " gStatBitBltScreenPattern = %u\n"
882 " gStatBitBltScreenSquare = %u\n"
883 " gStatBitBltScreenPatternReported = %u\n"
884 " gStatBitBltScreenSquareReported = %u\n"
885 " gStatCopyBitsScreenSquare = %u\n"
886 "\n"
887 " gStatEnablePDEV = %u\n"
888 " gStatCompletePDEV = %u\n"
889 " gStatDisablePDEV = %u\n"
890 " gStatEnableSurface = %u\n"
891 " gStatDisableSurface = %u\n"
892 " gStatAssertMode = %u\n"
893 " gStatDisableDriver = %u\n"
894 " gStatCreateDeviceBitmap = %u\n"
895 " gStatDeleteDeviceBitmap = %u\n"
896 " gStatDitherColor = %u\n"
897 " gStatStrokePath = %u\n"
898 " gStatFillPath = %u\n"
899 " gStatStrokeAndFillPath = %u\n"
900 " gStatPaint = %u\n"
901 " gStatBitBlt = %u\n"
902 " gStatCopyBits = %u\n"
903 " gStatStretchBlt = %u\n"
904 " gStatSetPalette = %u\n"
905 " gStatTextOut = %u\n"
906 " gStatSetPointerShape = %u\n"
907 " gStatMovePointer = %u\n"
908 " gStatLineTo = %u\n"
909 " gStatSynchronize = %u\n"
910 " gStatGetModes = %u\n"
911 " gStatGradientFill = %u\n"
912 " gStatStretchBltROP = %u\n"
913 " gStatPlgBlt = %u\n"
914 " gStatAlphaBlend = %u\n"
915 " gStatTransparentBlt = %u\n",
916 gStatCopyBitsOffscreenToScreen,
917 gStatCopyBitsScreenToScreen,
918 gStatBitBltOffscreenToScreen,
919 gStatBitBltScreenToScreen,
920 gStatUnchangedOffscreenToScreen,
921 gStatUnchangedOffscreenToScreenCRC,
922 gStatNonTransientEngineBitmaps,
923 gStatTransientEngineBitmaps,
924 gStatUnchangedBitmapsCRC,
925 gStatUnchangedBitmapsDeviceCRC,
926 gStatBitmapsCRC,
927 gStatBitBltScreenPattern,
928 gStatBitBltScreenSquare,
929 gStatBitBltScreenPatternReported,
930 gStatBitBltScreenSquareReported,
931 gStatCopyBitsScreenSquare,
932 gStatEnablePDEV,
933 gStatCompletePDEV,
934 gStatDisablePDEV,
935 gStatEnableSurface,
936 gStatDisableSurface,
937 gStatAssertMode,
938 gStatDisableDriver,
939 gStatCreateDeviceBitmap,
940 gStatDeleteDeviceBitmap,
941 gStatDitherColor,
942 gStatStrokePath,
943 gStatFillPath,
944 gStatStrokeAndFillPath,
945 gStatPaint,
946 gStatBitBlt,
947 gStatCopyBits,
948 gStatStretchBlt,
949 gStatSetPalette,
950 gStatTextOut,
951 gStatSetPointerShape,
952 gStatMovePointer,
953 gStatLineTo,
954 gStatSynchronize,
955 gStatGetModes,
956 gStatGradientFill,
957 gStatStretchBltROP,
958 gStatPlgBlt,
959 gStatAlphaBlend,
960 gStatTransparentBlt
961 ));
962}
963#endif /* STAT_sunlover */
964
Note: See TracBrowser for help on using the repository browser.

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