VirtualBox

Changeset 3460

Show
Ignore:
Timestamp:
07/05/07 14:56:04 (2 years ago)
Author:
vboxsync
Message:

Extension checks

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/include/VBox/HostServices/VBoxOpenGLSvc.h

    r3341 r3460  
    6666#define VBOXOGL_FN_GLFLUSH              (2) 
    6767#define VBOXOGL_FN_GLFLUSHPTR           (3) 
     68#define VBOXOGL_FN_GLCHECKEXT           (4) 
    6869 
    6970/** @} */ 
     
    171172#define VBOXOGL_CPARMS_GLFLUSHPTR (5) 
    172173 
     174 
     175/** 
     176 * VBOXOGL_FN_GLCHECKEXT 
     177 */ 
     178 
     179/** Parameters structure. */ 
     180typedef struct 
     181{ 
     182    VBoxGuestHGCMCallInfo   hdr; 
     183 
     184    /** pointer, in 
     185     * Extension function name 
     186     */ 
     187    HGCMFunctionParameter   pszExtFnName; 
     188 
     189} VBoxOGLglCheckExt; 
     190 
     191/** Number of parameters */ 
     192#define VBOXOGL_CPARMS_GLCHECKEXT (1) 
     193 
    173194/** @} */ 
    174195 
  • trunk/src/VBox/Additions/WINNT/Graphics/OpenGL/VBoxOGL.cpp

    r3440 r3460  
    470470    return parms.retval.u.value64; 
    471471} 
     472 
     473/** 
     474 * Check if an OpenGL extension is available on the host 
     475 * 
     476 * @returns available or not 
     477 * @param   pszExtFunctionName   
     478 */ 
     479bool VBoxIsExtensionAvailable(const char *pszExtFunctionName) 
     480{ 
     481    PVBOX_OGL_THREAD_CTX pCtx = VBoxOGLGetThreadCtx(); 
     482    VBoxOGLglCheckExt parms; 
     483 
     484    AssertReturn(pCtx->pCurrentCmd > pCtx->pCmdBuffer, 0); 
     485 
     486    VBOX_INIT_CALL(&parms.hdr, GLCHECKEXT, pCtx); 
     487 
     488    parms.pszExtFnName.type                   = VMMDevHGCMParmType_LinAddr_In; 
     489    parms.pszExtFnName.u.Pointer.size         = strlen(pszExtFunctionName)+1; 
     490    parms.pszExtFnName.u.Pointer.u.linearAddr = (vmmDevHypPtr)pszExtFunctionName; 
     491 
     492    int rc = vboxHGCMCall(vboxOGLCtx.hGuestDrv, &parms, sizeof (parms)); 
     493 
     494    if (    VBOX_FAILURE(rc) 
     495        ||  VBOX_FAILURE(parms.hdr.result)) 
     496    { 
     497        DbgPrintf(("GLCHECKEXT failed with %x %x\n", rc, parms.hdr.result)); 
     498        return false; 
     499    } 
     500 
     501    return true; 
     502} 
  • trunk/src/VBox/Additions/WINNT/Graphics/OpenGL/VBoxOGL.h

    r3443 r3460  
    198198 
    199199/** 
     200 * Check if an OpenGL extension is available on the host 
     201 * 
     202 * @returns available or not 
     203 * @param   pszExtFunctionName   
     204 */ 
     205bool VBoxIsExtensionAvailable(const char *pszExtFunctionName); 
     206 
     207/** 
    200208 * Query the specified cached parameter 
    201209 *  
  • trunk/src/VBox/Additions/WINNT/Graphics/OpenGL/drv.cpp

    r3438 r3460  
    6464 
    6565 
    66  
    67 PROC APIENTRY DrvGetProcAddress(LPCSTR lpszProc) 
    68 { 
    69     PROC pfnProc = GetProcAddress(hDllVBoxOGL, lpszProc); 
    70     if (pfnProc == NULL) 
    71         DbgPrintf(("DrvGetProcAddress %s FAILED\n", lpszProc)); 
    72     else 
    73         DbgPrintf(("DrvGetProcAddress %s\n", lpszProc)); 
    74  
    75     return pfnProc; 
    76 } 
    7766 
    7867BOOL APIENTRY DrvValidateVersion(DWORD version) 
  • trunk/src/VBox/Additions/WINNT/Graphics/OpenGL/glext.cpp

    r3451 r3460  
    2525 
    2626#include "VBoxOGL.h" 
     27#define WGL_WGLEXT_PROTOTYPES 
    2728#include <VBox/HostServices/wglext.h> 
     29 
     30typedef struct 
     31{ 
     32    const char *pszExtName; 
     33    const char *pszExtFunctionName; 
     34    RTUINTPTR   pfnFunction; 
     35    bool        fAvailable; 
     36} OPENGL_EXT, *POPENGL_EXT; 
     37 
     38static OPENGL_EXT OpenGLExtensions[] =  
     39{ 
     40    {   "WGL_EXT_swap_control",             "wglSwapIntervalEXT",               (RTUINTPTR)wglSwapIntervalEXT,                      false }, 
     41    {   "WGL_EXT_swap_control",             "wglGetSwapIntervalEXT",            (RTUINTPTR)wglGetSwapIntervalEXT,                   false }, 
     42}; 
     43 
     44 
     45int vboxInitOpenGLExtensions() 
     46{ 
     47    const GLubyte *pszExtensions = glGetString(GL_EXTENSIONS); 
     48 
     49    for (int i=0;i<RT_ELEMENTS(OpenGLExtensions);i++) 
     50    { 
     51        if (strstr((char *)pszExtensions, OpenGLExtensions[i].pszExtFunctionName)) 
     52            OpenGLExtensions[i].fAvailable = VBoxIsExtensionAvailable(OpenGLExtensions[i].pszExtFunctionName); 
     53    } 
     54    return VINF_SUCCESS; 
     55} 
     56 
     57 
     58PROC APIENTRY DrvGetProcAddress(LPCSTR lpszProc) 
     59{ 
     60    PROC pfnProc; 
     61 
     62    for (int i=0;i<RT_ELEMENTS(OpenGLExtensions);i++) 
     63    { 
     64        if (    OpenGLExtensions[i].fAvailable 
     65            && !strcmp(OpenGLExtensions[i].pszExtFunctionName, lpszProc)) 
     66        { 
     67            pfnProc = (PROC)OpenGLExtensions[i].pfnFunction; 
     68        } 
     69    } 
     70    if (pfnProc == NULL) 
     71        DbgPrintf(("DrvGetProcAddress %s FAILED\n", lpszProc)); 
     72    else 
     73        DbgPrintf(("DrvGetProcAddress %s\n", lpszProc)); 
     74 
     75    return pfnProc; 
     76} 
     77 
     78BOOL WINAPI wglSwapIntervalEXT(int interval) 
     79{ 
     80    VBOX_OGL_GEN_SYNC_OP1_RET(BOOL, wglSwapIntervalEXT, interval); 
     81    return retval; 
     82} 
     83 
     84int WINAPI wglGetSwapIntervalEXT(void) 
     85{ 
     86    VBOX_OGL_GEN_SYNC_OP_RET(int, wglGetSwapIntervalEXT); 
     87    return retval; 
     88} 
     89 
     90 
     91 
     92 
    2893 
    2994#if 0 
     
    104169 GL_WIN_swap_hint  
    105170 WGL_EXT_extensions_string  
    106  WGL_EXT_swap_control  
    107171#endif 
    108172 
    109  
    110 BOOL WINAPI wglSwapIntervalEXT(int interval) 
    111 { 
    112     VBOX_OGL_GEN_SYNC_OP1_RET(BOOL, wglSwapIntervalEXT, interval); 
    113     return retval; 
    114 } 
    115  
    116 int WINAPI wglGetSwapIntervalEXT(void) 
    117 { 
    118     VBOX_OGL_GEN_SYNC_OP_RET(int, wglGetSwapIntervalEXT); 
    119     return retval; 
    120 } 
    121  
  • trunk/src/VBox/HostServices/SharedOpenGL/gldrv.h

    r3459 r3460  
    150150void vboxglDrvSwapBuffers(VBOXOGLCTX *pClient, uint8_t *pCmdBuffer); 
    151151 
     152bool vboxDrvIsExtensionAvailable(char *pszExtFunctionName); 
     153 
    152154#endif /* __VBOXGLWIN__H */ 
  • trunk/src/VBox/HostServices/SharedOpenGL/gllindrv.cpp

    r3338 r3460  
    216216    pClient->lastretval = 0; /** @todo */ 
    217217} 
     218 
     219bool vboxDrvIsExtensionAvailable(char *pszExtFunctionName) 
     220{ 
     221    return false; 
     222} 
     223 
  • trunk/src/VBox/HostServices/SharedOpenGL/glwindrv.cpp

    r3438 r3460  
    416416        ReleaseDC(0, pClient->hdc); 
    417417} 
     418 
     419bool vboxDrvIsExtensionAvailable(char *pszExtFunctionName) 
     420{ 
     421    return !!wglGetProcAddress(pszExtFunctionName); 
     422} 
  • trunk/src/VBox/HostServices/SharedOpenGL/service.cpp

    r3444 r3460  
    257257        }  
    258258 
     259        case VBOXOGL_FN_GLCHECKEXT: 
     260        { 
     261            Log(("svcCall: VBOXOGL_FN_GLCHECKEXT\n")); 
     262 
     263            /* Verify parameter count and types. */ 
     264            if (cParms != VBOXOGL_CPARMS_GLCHECKEXT) 
     265            { 
     266                rc = VERR_INVALID_PARAMETER; 
     267            } 
     268            else  
     269            if (    paParms[0].type != VBOX_HGCM_SVC_PARM_PTR       /* pszExtFnName */ 
     270               ) 
     271            { 
     272                rc = VERR_INVALID_PARAMETER; 
     273            } 
     274            else 
     275            { 
     276                /* Fetch parameters. */ 
     277                char    *pszExtFnName = (char *)paParms[0].u.pointer.addr; 
     278                uint32_t cbExtFnName  = paParms[0].u.pointer.size; 
     279 
     280                /* sanity checks */ 
     281                if (    cbExtFnName > 256 
     282                    ||  pszExtFnName[cbExtFnName-1] != 0 
     283                   ) 
     284                { 
     285                    rc = VERR_INVALID_PARAMETER; 
     286                } 
     287                else 
     288                { 
     289                    /* Execute the function. */ 
     290                    if (vboxDrvIsExtensionAvailable(pszExtFnName)) 
     291                        rc = VINF_SUCCESS; 
     292                    else 
     293                        rc = VERR_FILE_NOT_FOUND; 
     294 
     295                    if (VBOX_SUCCESS(rc)) 
     296                    { 
     297                        /* Update parameters.*/ 
     298                    } 
     299                } 
     300            } 
     301            break; 
     302        }  
     303 
    259304        default: 
    260305        { 

© 2008 Sun Microsystems, Inc.
ContactPrivacy policy