OpenGLTestApp.cpp revision e45ccb294fc1f6b4078d058eaff86100361a7358
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync/* $Id$ */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync/** @file
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * VBox host opengl support test application.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync/*
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * Copyright (C) 2009-2010 Oracle Corporation
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync *
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * available from http://www.virtualbox.org. This file is free software;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * you can redistribute it and/or modify it under the terms of the GNU
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * General Public License (GPL) as published by the Free Software
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync */
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/assert.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/buildconfig.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/err.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/getopt.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/initterm.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/stream.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#ifdef RT_OS_WINDOWS
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# include <Windows.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#if !defined(RT_OS_WINDOWS) && !defined(RT_OS_OS2)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# include <sys/resource.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# include <fcntl.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# include <unistd.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#endif
c8bcebedf264bc1287bcce50bdf66d08e28a88dcvboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <string.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#define VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include "package-generated.h"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/log.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <iprt/param.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/time.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/system.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/process.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <iprt/env.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <VBox/log.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#include <VBox/version.h>
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#endif
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#ifdef VBOX_WITH_CROGL
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncextern "C"
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync{
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync extern void * crSPULoad(void *, int, char *, char *, void *);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync extern void crSPUUnloadChain(void *);
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync}
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsyncstatic int vboxCheck3DAccelerationSupported()
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync{
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync LogRel(("Testing 3D Support:\n"));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync void *spu = crSPULoad(NULL, 0, (char*)"render", NULL, NULL);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync if (spu)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync crSPUUnloadChain(spu);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync LogRel(("Testing 3D Succeeded!\n"));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync return 0;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync }
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync LogRel(("Testing 3D Failed\n"));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <QGLWidget>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <QApplication>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#include <VBox/VBoxGL2D.h>
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsyncstatic int vboxCheck2DVideoAccelerationSupported()
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync{
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync LogRel(("Testing 2D Support:\n"));
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync static int dummyArgc = 1;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync static char * dummyArgv = (char*)"GlTest";
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync QApplication app (dummyArgc, &dummyArgv);
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync VBoxGLTmpContext ctx;
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync const QGLContext *pContext = ctx.makeCurrent();
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync if(pContext)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VBoxVHWAInfo supportInfo;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync supportInfo.init(pContext);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(supportInfo.isVHWASupported())
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync LogRel(("Testing 2D Succeeded!\n"));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync LogRel(("Failed to create gl context\n"));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync LogRel(("Testing 2D Failed\n"));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync#endif
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync#ifdef VBOXGLTEST_WITH_LOGGING
62592281fc2971692c6755401b5ce1ed61b96d7cvboxsyncstatic int vboxInitLogging(const char *pszFilename, bool bGenNameSuffix)
62592281fc2971692c6755401b5ce1ed61b96d7cvboxsync{
e68e2431dbeeab80792bbd9b1c64a68fc3358d0evboxsync PRTLOGGER loggerRelease;
b83d9b1072dd8491c7ffe37830e8fd10f2dba561vboxsync static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTUINT fFlags = RTLOGFLAGS_PREFIX_TIME_PROG;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync fFlags |= RTLOGFLAGS_USECRLF;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync#endif
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync char szError[RTPATH_MAX + 128] = "";
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync const char * pszFilenameFmt;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync RTLOGDEST enmLogDest;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync if(pszFilename)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync {
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync if(bGenNameSuffix)
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync pszFilenameFmt = "%s.%ld.log";
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync else
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync pszFilenameFmt = "%s";
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync enmLogDest = RTLOGDEST_FILE;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync }
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync else
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync {
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync pszFilenameFmt = NULL;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync enmLogDest = RTLOGDEST_STDOUT;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int vrc = RTLogCreateEx(&loggerRelease, fFlags, "all",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync enmLogDest, szError, sizeof(szError), pszFilenameFmt, pszFilename, RTTimeMilliTS());
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(vrc))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* some introductory information */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTTIMESPEC timeSpec;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char szTmp[256];
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTTimeSpecToString(RTTimeNow(&timeSpec), szTmp, sizeof(szTmp));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "VBoxTestGL %s r%u %s (%s %s) release log\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_BLEEDING_EDGE
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "Log opened %s\n",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync __DATE__, __TIME__, szTmp);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U, "OS Product: %s\n", szTmp);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U, "OS Release: %s\n", szTmp);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U, "OS Version: %s\n", szTmp);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync vrc = RTSystemQueryOSInfo(RTSYSOSINFO_SERVICE_PACK, szTmp, sizeof(szTmp));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U, "OS Service Pack: %s\n", szTmp);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync// RTLogRelLogger(loggerRelease, 0, ~0U, "Host RAM: %uMB RAM, available: %uMB\n",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync// uHostRamMb, uHostRamAvailMb);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* the package type is interesting for Linux distributions */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char szExecName[RTPATH_MAX];
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelLogger(loggerRelease, 0, ~0U,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "Executable: %s\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "Process ID: %u\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "Package type: %s"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_OSE
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync " (OSE)"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "\n",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync pszExecName ? pszExecName : "unknown",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTProcSelf(),
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync VBOX_PACKAGE_STRING);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* register this logger as the release logger */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTLogRelSetDefaultInstance(loggerRelease);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return VINF_SUCCESS;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return vrc;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncstatic int vboxInitQuietMode()
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#if !defined(RT_OS_WINDOWS) && !defined(RT_OS_OS2)
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync /* This small test application might crash on some hosts. Do never
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync * generate a core dump as most likely some OpenGL library is
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync * responsible. */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync struct rlimit lim = { 0, 0 };
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync setrlimit(RLIMIT_CORE, &lim);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync /* Redirect stderr to /dev/null */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int fd = open("/dev/null", O_WRONLY);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (fd != -1)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync dup2(fd, STDERR_FILENO);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsyncint main(int argc, char **argv)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync int rc = 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTR3Init();
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(argc < 2)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_CROGL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* backwards compatibility: check 3D */
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync rc = vboxCheck3DAccelerationSupported();
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync static const RTGETOPTDEF s_aOptionDefs[] =
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync { "--test", 't', RTGETOPT_REQ_STRING },
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync { "-test", 't', RTGETOPT_REQ_STRING },
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync { "--log", 'l', RTGETOPT_REQ_STRING },
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync };
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTGETOPTSTATE State;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = RTGetOptInit(&State, argc-1, argv+1, &s_aOptionDefs[0], RT_ELEMENTS(s_aOptionDefs), 0, 0);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync AssertRCReturn(rc, 49);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bool bTest2D = false;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_CROGL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bool bTest3D = false;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bool bLog = false;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bool bLogSuffix = false;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync const char * pLog = NULL;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync for (;;)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTGETOPTUNION Val;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = RTGetOpt(&State, &Val);
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync if (!rc)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync switch (rc)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync case 't':
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#ifdef VBOX_WITH_CROGL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!strcmp(Val.psz, "3D") || !strcmp(Val.psz, "3d"))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bTest3D = true;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (!strcmp(Val.psz, "2D") || !strcmp(Val.psz, "2d"))
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bTest2D = true;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync rc = 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = 1;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync case 'l':
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bLog = true;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync pLog = Val.psz;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = 0;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync case 'h':
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf(VBOX_PRODUCT " Helper for testing 2D/3D OpenGL capabilities %u.%u.%u\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "(C) 2009-" VBOX_C_YEAR " " VBOX_VENDOR "\n"
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync "All rights reserved.\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "Parameters:\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync " --test 2D test for 2D (video) OpenGL capabilities\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_CROGL
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync " --test 3D test for 3D OpenGL capabilities\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync " --log <log_file_name> log the GL test result to the given file\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "\n"
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync "Logging can alternatively be enabled by specifying the VBOXGLTEST_LOG=<log_file_name> env variable\n"
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync "\n",
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTBldCfgVersionMajor(), RTBldCfgVersionMinor(), RTBldCfgVersionBuild());
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync case 'V':
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync RTPrintf("$Revision: $\n");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return 0;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync case VERR_GETOPT_UNKNOWN_OPTION:
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync case VINF_GETOPT_NOT_OPTION:
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = 1;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync default:
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync /* complain? RTGetOptPrintError(rc, &Val); */
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if (rc)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync break;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(!rc)
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOXGLTEST_WITH_LOGGING
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(!bLog)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync {
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync /* check the VBOXGLTEST_LOG env var */
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync pLog = RTEnvGet("VBOXGLTEST_LOG");
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(pLog)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bLog = true;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync bLogSuffix = true;
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync if(bLog)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vboxInitLogging(pLog, bLogSuffix);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync else
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vboxInitQuietMode();
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_CROGL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(!rc && bTest3D)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vboxCheck3DAccelerationSupported();
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef VBOX_WITH_VIDEOHWACCEL
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync if(!rc && bTest2D)
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync rc = vboxCheck2DVideoAccelerationSupported();
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync#endif
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync }
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync /*RTR3Term();*/
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return rc;
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#ifdef RT_OS_WINDOWS
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncextern "C" int WINAPI WinMain(HINSTANCE hInstance,
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync HINSTANCE /*hPrevInstance*/, LPSTR lpCmdLine, int /*nShowCmd*/)
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync{
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync return main(__argc, __argv);
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync}
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync#endif
24b9d11a24f96f5da0351475e0b6486ec4cb0d30vboxsync
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync