VirtualBox

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

Last change on this file since 36679 was 35503, checked in by vboxsync, 14 years ago

VBoxDisp: DrvDitherColor uses halftone approximation.

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