Changeset 34571 in vbox for trunk/src/VBox/GuestHost
- Timestamp:
- Dec 1, 2010 1:45:57 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 68366
- Location:
- trunk/src/VBox/GuestHost/OpenGL
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h
r34054 r34571 26 26 #endif 27 27 28 #define SHCROGL_SSM_VERSION 2 328 #define SHCROGL_SSM_VERSION 24 29 29 30 30 #define CR_MAX_WINDOWS 100 -
trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c
r34110 r34571 48 48 #if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST) 49 49 #include <VBox/VBoxCrHgsmi.h> 50 #endif 51 52 /*@todo move define somewhere else, and make sure it's less than VBGLR0_MAX_HGCM_KERNEL_PARM*/ 53 /*If we fail to pass data in one chunk, send it in chunks of this size instead*/ 54 #define CR_HGCM_SPLIT_BUFFER_SIZE (8*_1M) 55 56 #ifndef MIN 57 # define MIN(a, b) ((a) < (b) ? (a) : (b)) 50 58 #endif 51 59 … … 657 665 } 658 666 } 667 return -rc; 659 668 } 660 669 else … … 936 945 937 946 rc = crVBoxHGCMCall(&parms, sizeof(parms)); 947 948 #ifdef RT_OS_LINUX 949 if (VERR_OUT_OF_RANGE==rc && CR_VBOXHGCM_USERALLOCATED==bufferKind) 950 { 951 /*Buffer is too big, so send it in split chunks*/ 952 CRVBOXHGCMWRITEBUFFER wbParms; 953 954 wbParms.hdr.result = VERR_WRONG_ORDER; 955 wbParms.hdr.u32ClientID = conn->u32ClientID; 956 wbParms.hdr.u32Function = SHCRGL_GUEST_FN_WRITE_BUFFER; 957 wbParms.hdr.cParms = SHCRGL_CPARMS_WRITE_BUFFER; 958 959 wbParms.iBufferID.type = VMMDevHGCMParmType_32bit; 960 wbParms.iBufferID.u.value32 = 0; 961 962 wbParms.cbBufferSize.type = VMMDevHGCMParmType_32bit; 963 wbParms.cbBufferSize.u.value32 = len; 964 965 wbParms.ui32Offset.type = VMMDevHGCMParmType_32bit; 966 wbParms.ui32Offset.u.value32 = 0; 967 968 wbParms.pBuffer.type = VMMDevHGCMParmType_LinAddr_In; 969 wbParms.pBuffer.u.Pointer.size = MIN(CR_HGCM_SPLIT_BUFFER_SIZE, len); 970 wbParms.pBuffer.u.Pointer.u.linearAddr = (uintptr_t) buf; 971 972 if (len<CR_HGCM_SPLIT_BUFFER_SIZE) 973 { 974 crError("VERR_OUT_OF_RANGE in crVBoxHGCMWriteReadExact for %u bytes write", len); 975 return; 976 } 977 978 while (wbParms.pBuffer.u.Pointer.size) 979 { 980 crDebug("SHCRGL_GUEST_FN_WRITE_BUFFER, offset=%u, size=%u", wbParms.ui32Offset.u.value32, wbParms.pBuffer.u.Pointer.size); 981 982 rc = crVBoxHGCMCall(&wbParms, sizeof(wbParms)); 983 if (RT_FAILURE(rc) || RT_FAILURE(wbParms.hdr.result)) 984 { 985 crError("SHCRGL_GUEST_FN_WRITE_BUFFER (%i) failed with %x %x\n", wbParms.pBuffer.u.Pointer.size, rc, wbParms.hdr.result); 986 return; 987 } 988 989 wbParms.ui32Offset.u.value32 += wbParms.pBuffer.u.Pointer.size; 990 wbParms.pBuffer.u.Pointer.u.linearAddr += (uintptr_t) wbParms.pBuffer.u.Pointer.size; 991 wbParms.pBuffer.u.Pointer.size = MIN(CR_HGCM_SPLIT_BUFFER_SIZE, len-wbParms.ui32Offset.u.value32); 992 } 993 994 /*now issue GUEST_FN_WRITE_READ_BUFFERED referencing the buffer we'd made*/ 995 { 996 CRVBOXHGCMWRITEREADBUFFERED wrbParms; 997 998 wrbParms.hdr.result = VERR_WRONG_ORDER; 999 wrbParms.hdr.u32ClientID = conn->u32ClientID; 1000 wrbParms.hdr.u32Function = SHCRGL_GUEST_FN_WRITE_READ_BUFFERED; 1001 wrbParms.hdr.cParms = SHCRGL_CPARMS_WRITE_READ_BUFFERED; 1002 1003 crMemcpy(&wrbParms.iBufferID, &wbParms.iBufferID, sizeof(HGCMFunctionParameter)); 1004 crMemcpy(&wrbParms.pWriteback, &parms.pWriteback, sizeof(HGCMFunctionParameter)); 1005 crMemcpy(&wrbParms.cbWriteback, &parms.cbWriteback, sizeof(HGCMFunctionParameter)); 1006 1007 rc = crVBoxHGCMCall(&wrbParms, sizeof(wrbParms)); 1008 1009 /*bit of hack to reuse code below*/ 1010 parms.hdr.result = wrbParms.hdr.result; 1011 crMemcpy(&parms.cbWriteback, &wrbParms.cbWriteback, sizeof(HGCMFunctionParameter)); 1012 crMemcpy(&parms.pWriteback, &wrbParms.pWriteback, sizeof(HGCMFunctionParameter)); 1013 } 1014 } 1015 #endif 938 1016 939 1017 if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
Note:
See TracChangeset
for help on using the changeset viewer.