Changeset 30513 in vbox
- Timestamp:
- Jun 29, 2010 5:14:15 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 63218
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Config.kmk
r30428 r30513 4088 4088 TEMPLATE_VBOXCROGLR3GUESTDLL_EXTENDS_BY = prepending 4089 4089 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS = CHROMIUM_THREADSAFE VBOX_WITH_HGCM 4090 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.win = _WIN32_WINNT=0x0500WINDOWS=14090 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.win = WINDOWS=1 4091 4091 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.linux = Linux=1 _GNU_SOURCE 4092 4092 TEMPLATE_VBOXCROGLR3GUESTDLL_DEFS.solaris = SunOS=1 _GNU_SOURCE #GLEXT_64_TYPES_DEFINED -
trunk/src/VBox/Additions/common/crOpenGL/Makefile.kmk
r30440 r30513 84 84 VBoxOGL_DEFS += VBOX_OGL_GLX_USE_CSTUBS 85 85 endif 86 endif 87 88 ifdef VBOXWDDM 89 VBoxOGL_DEFS.win += VBOX_WITH_WDDM 90 VBoxOGL_SDKS += WINDDKWLH 86 91 endif 87 92 -
trunk/src/VBox/Additions/common/crOpenGL/load.c
r30487 r30513 31 31 #endif 32 32 33 #ifdef VBOX_WITH_WDDM 34 #include <d3d9types.h> 35 #include <D3dumddi.h> 36 #include "../../WINNT/Graphics/Miniport/wddm/VBoxVideoIf.h" 37 #include "../../WINNT/Graphics/Display/wddm/vboxdispmp.h" 38 #endif 39 33 40 /** 34 41 * If you change this, see the comments in tilesortspu_context.c … … 653 660 654 661 #ifdef CR_NEWWINTRACK 662 # ifdef VBOX_WITH_WDDM 663 static stubDispatchVisibleRegions(WindowInfo *pWindow) 664 { 665 DWORD dwCount; 666 LPRGNDATA lpRgnData; 667 668 dwCount = GetRegionData(pWindow->hVisibleRegion, 0, NULL); 669 lpRgnData = crAlloc(dwCount); 670 671 if (lpRgnData) 672 { 673 GetRegionData(pWindow->hVisibleRegion, dwCount, lpRgnData); 674 crDebug("Dispatched WindowVisibleRegion (%i, cRects=%i)", pWindow->spuWindow, lpRgnData->rdh.nCount); 675 stub.spuDispatch.WindowVisibleRegion(pWindow->spuWindow, lpRgnData->rdh.nCount, (GLint*) lpRgnData->Buffer); 676 crFree(lpRgnData); 677 } 678 else crWarning("GetRegionData failed, VisibleRegions update failed"); 679 } 680 681 static HRGN stubMakeRegionFromRects(PVBOXVIDEOCM_CMD_RECTS pRegions, uint32_t start) 682 { 683 HRGN hRgn, hTmpRgn; 684 uint32_t i; 685 686 if (pRegions->RectsInfo.cRects<=start) 687 { 688 return INVALID_HANDLE_VALUE; 689 } 690 691 hRgn = CreateRectRgn(0, 0, 0, 0); 692 for (i=start; i<pRegions->RectsInfo.cRects; ++i) 693 { 694 hTmpRgn = CreateRectRgnIndirect(&pRegions->RectsInfo.aRects[i]); 695 CombineRgn(hRgn, hRgn, hTmpRgn, RGN_OR); 696 DeleteObject(hTmpRgn); 697 } 698 return hRgn; 699 } 700 701 static void stubSyncTrUpdateWindowCB(unsigned long key, void *data1, void *data2) 702 { 703 WindowInfo *pWindow = (WindowInfo *) data1; 704 VBOXDISPMP_REGIONS *pRegions = (VBOXDISPMP_REGIONS*) data2; 705 bool bChanged = false; 706 HRGN hNewRgn = INVALID_HANDLE_VALUE; 707 708 if (pRegions->hWnd != pWindow->hWnd) 709 { 710 return; 711 } 712 713 if (!pWindow->mapped) 714 { 715 pWindow->mapped = GL_TRUE; 716 bChanged = true; 717 crDebug("Dispatched: WindowShow(%i, %i)", pWindow->spuWindow, pWindow->mapped); 718 stub.spu->dispatch_table.WindowShow(pWindow->spuWindow, pWindow->mapped); 719 } 720 721 if (pRegions->pRegions->fFlags.bAddVisibleRects && pRegions->pRegions->fFlags.bPositionRect) 722 { 723 int winX, winY; 724 unsigned int winW, winH; 725 726 winX = pRegions->pRegions->RectsInfo.aRects[0].left; 727 winY = pRegions->pRegions->RectsInfo.aRects[0].top; 728 winW = pRegions->pRegions->RectsInfo.aRects[0].right - winX; 729 winH = pRegions->pRegions->RectsInfo.aRects[0].bottom - winY; 730 731 if (stub.trackWindowPos && (winX!=pWindow->x || winY!=pWindow->y)) 732 { 733 crDebug("Dispatched WindowPosition (%i)", pWindow->spuWindow); 734 stub.spuDispatch.WindowPosition(pWindow->spuWindow, winX, winY); 735 pWindow->x = winX; 736 pWindow->y = winY; 737 bChanged = true; 738 } 739 740 if (stub.trackWindowSize && (winW!=pWindow->width || winH!=pWindow->height)) 741 { 742 crDebug("Dispatched WindowSize (%i)", pWindow->spuWindow); 743 stub.spuDispatch.WindowSize(pWindow->spuWindow, winW, winH); 744 pWindow->width = winW; 745 pWindow->height = winH; 746 bChanged = true; 747 } 748 749 hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 1); 750 } 751 else 752 { 753 hNewRgn = stubMakeRegionFromRects(pRegions->pRegions, 0); 754 } 755 756 if (hNewRgn!=INVALID_HANDLE_VALUE) 757 { 758 POINT pt; 759 pt.x = 0; 760 pt.y = 0; 761 ScreenToClient(pWindow->hWnd, &pt); 762 OffsetRgn(hNewRgn, pt.x, pt.y); 763 764 if (pWindow->hVisibleRegion!=INVALID_HANDLE_VALUE) 765 { 766 CombineRgn(hNewRgn, pWindow->hVisibleRegion, hNewRgn, 767 pRegions->pRegions->fFlags.bAddHiddenRects ? RGN_DIFF:RGN_OR); 768 769 if (!EqualRgn(pWindow->hVisibleRegion, hNewRgn)) 770 { 771 DeleteObject(pWindow->hVisibleRegion); 772 pWindow->hVisibleRegion = hNewRgn; 773 stubDispatchVisibleRegions(pWindow); 774 bChanged = true; 775 } 776 else 777 { 778 DeleteObject(hNewRgn); 779 } 780 } 781 else 782 { 783 if (pRegions->pRegions->fFlags.bAddVisibleRects) 784 { 785 pWindow->hVisibleRegion = hNewRgn; 786 stubDispatchVisibleRegions(pWindow); 787 bChanged = true; 788 } 789 } 790 } 791 792 if (bChanged) 793 { 794 stub.spu->dispatch_table.Flush(); 795 } 796 } 797 # endif 798 655 799 static void stubSyncTrCheckWindowsCB(unsigned long key, void *data1, void *data2) 656 800 { 657 801 WindowInfo *pWindow = (WindowInfo *) data1; 658 ContextInfo *pCtx = (ContextInfo *) data2;802 (void) data2; 659 803 660 804 if (pWindow->type!=CHROMIUM || pWindow->spuWindow==0) … … 683 827 #ifdef WINDOWS 684 828 MSG msg; 829 # ifdef VBOX_WITH_WDDM 830 static VBOXDISPMP_CALLBACKS VBoxDispMpTstCallbacks = {NULL, NULL, NULL}; 831 HMODULE hVBoxD3D = NULL; 832 VBOXDISPMP_REGIONS Regions; 833 HRESULT hr; 834 # endif 685 835 #endif 686 836 … … 690 840 #ifdef WINDOWS 691 841 PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 842 # ifdef VBOX_WITH_WDDM 843 if (GetModuleHandleEx(0, "VBoxDispD3D", &hVBoxD3D)) 844 { 845 PFNVBOXDISPMP_GETCALLBACKS pfnVBoxDispMpGetCallbacks; 846 pfnVBoxDispMpGetCallbacks = (PFNVBOXDISPMP_GETCALLBACKS)GetProcAddress(hVBoxD3D, TEXT("VBoxDispMpGetCallbacks")); 847 if (pfnVBoxDispMpGetCallbacks) 848 { 849 hr = pfnVBoxDispMpGetCallbacks(VBOXDISPMP_VERSION, &VBoxDispMpTstCallbacks); 850 if (S_OK==hr) 851 { 852 CRASSERT(VBoxDispMpTstCallbacks.pfnEnableEvents); 853 CRASSERT(VBoxDispMpTstCallbacks.pfnDisableEvents); 854 CRASSERT(VBoxDispMpTstCallbacks.pfnGetRegions); 855 856 hr = VBoxDispMpTstCallbacks.pfnEnableEvents(); 857 if (hr != S_OK) 858 { 859 crWarning("VBoxDispMpTstCallbacks.pfnEnableEvents failed"); 860 } 861 else 862 { 863 crDebug("running with VBoxDispD3D"); 864 } 865 } 866 else 867 { 868 crWarning("VBoxDispMpGetCallbacks failed"); 869 } 870 } 871 } 872 # endif 692 873 #endif 693 874 … … 703 884 if (!PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) 704 885 { 705 crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL); 706 RTThreadSleep(50); 886 # ifdef VBOX_WITH_WDDM 887 if (VBoxDispMpTstCallbacks.pfnGetRegions) 888 { 889 hr = VBoxDispMpTstCallbacks.pfnGetRegions(&Regions, 50); 890 if (S_OK==hr) 891 { 892 /*hacky way to make sure window wouldn't be deleted in another thread as we hold hashtable lock here*/ 893 crHashtableWalk(stub.windowTable, stubSyncTrUpdateWindowCB, &Regions); 894 } 895 else 896 { 897 if (WAIT_TIMEOUT!=hr) 898 { 899 crWarning("VBoxDispMpTstCallbacks.pfnGetRegions failed with 0x%x", hr); 900 } 901 } 902 } 903 else 904 # endif 905 { 906 crHashtableWalk(stub.windowTable, stubSyncTrCheckWindowsCB, NULL); 907 RTThreadSleep(50); 908 } 707 909 } 708 910 else … … 727 929 } 728 930 931 #ifdef VBOX_WITH_WDDM 932 if (VBoxDispMpTstCallbacks.pfnDisableEvents) 933 { 934 VBoxDispMpTstCallbacks.pfnDisableEvents(); 935 } 936 if (hVBoxD3D) 937 { 938 FreeLibrary(hVBoxD3D); 939 } 940 #endif 729 941 crDebug("Sync thread stopped"); 730 942 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.