VirtualBox

Changeset 34571 in vbox for trunk/src/VBox/GuestHost


Ignore:
Timestamp:
Dec 1, 2010 1:45:57 PM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
68366
Message:

crOpenGL: fix compiz for high resolution guests

Location:
trunk/src/VBox/GuestHost/OpenGL
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/OpenGL/include/cr_server.h

    r34054 r34571  
    2626#endif
    2727
    28 #define SHCROGL_SSM_VERSION 23
     28#define SHCROGL_SSM_VERSION 24
    2929
    3030#define CR_MAX_WINDOWS 100
  • trunk/src/VBox/GuestHost/OpenGL/util/vboxhgcm.c

    r34110 r34571  
    4848#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
    4949#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))
    5058#endif
    5159
     
    657665            }
    658666        }
     667        return -rc;
    659668    }
    660669    else
     
    936945
    937946    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
    9381016
    9391017    if (RT_FAILURE(rc) || RT_FAILURE(parms.hdr.result))
Note: See TracChangeset for help on using the changeset viewer.

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