packspu_getstring.c revision 5586ae4e5888ee52fdd4b024f6340f7fc5a5f02f
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx/* Copyright (c) 2001, Stanford University
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * All rights reserved
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx *
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx * See the file LICENSE.txt for information on redistributing this software.
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx */
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "packspu.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "cr_packfunctions.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "state/cr_statefuncs.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "cr_string.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "packspu_proto.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include "cr_mem.h"
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#include <locale.h>
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic GLubyte gpszExtensions[10000];
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef CR_OPENGL_VERSION_2_0
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic GLubyte gpszShadingVersion[255]="";
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic void GetString(GLenum name, GLubyte *pszStr)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GET_THREAD(thread);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx int writeback = 1;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (pack_spu.swap)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx crPackGetStringSWAP(name, pszStr, &writeback);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx else
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx crPackGetString(name, pszStr, &writeback);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx packspuFlush( (void *) thread );
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic GLfloat
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxGetVersionString(void)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx static GLboolean fInitialized = GL_FALSE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx static GLfloat version = 0.;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (!fInitialized)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GLubyte return_value[100];
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_VERSION, return_value);
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng CRASSERT(crStrlen((char *)return_value) < 100);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx version = crStrToFloat((char *) return_value);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx version = crStateComputeVersion(version);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx fInitialized = GL_TRUE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return version;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic const GLubyte *
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxGetExtensions(void)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx static GLboolean fInitialized = GL_FALSE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (!fInitialized)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GLubyte return_value[10*1000];
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx const GLubyte *extensions, *ext;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GET_THREAD(thread);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx int writeback = 1;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (pack_spu.swap)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx crPackGetStringSWAP( GL_EXTENSIONS, return_value, &writeback );
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx else
19b23afcc35b3926d062efc1930e65c5fed1084dhx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx crPackGetString( GL_EXTENSIONS, return_value, &writeback );
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx packspuFlush( (void *) thread );
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx CRASSERT(crStrlen((char *)return_value) < 10*1000);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx /* OK, we got the result from the server. Now we have to
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx * intersect is with the set of extensions that Chromium understands
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx * and tack on the Chromium-specific extensions.
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx */
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx extensions = return_value;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx ext = crStateMergeExtensions(1, &extensions);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef Linux
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx /*@todo
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx *That's a hack to allow running Unity, it uses libnux which is calling extension functions
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx *without checking if it's being supported/exported.
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx *glActiveStencilFaceEXT seems to be actually supported but the extension string isn't exported (for ex. on ATI HD4870),
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx *which leads to libglew setting function pointer to NULL and crashing Unity.
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx */
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx sprintf((char*)gpszExtensions, "%s GL_EXT_stencil_two_side", ext);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#else
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx sprintf((char*)gpszExtensions, "%s", ext);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx fInitialized = GL_TRUE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return gpszExtensions;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef WINDOWS
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxstatic bool packspuRunningUnderWine(void)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return NULL != GetModuleHandle("wined3d.dll") || NULL != GetModuleHandle("wined3dwddm.dll") || NULL != GetModuleHandle("wined3dwddm-x86.dll");
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxconst GLubyte * PACKSPU_APIENTRY packspu_GetString( GLenum name )
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GET_CONTEXT(ctx);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx switch(name)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_EXTENSIONS:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return GetExtensions();
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_VERSION:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#if 0 && defined(WINDOWS)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (packspuRunningUnderWine())
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_VERSION, ctx->pszRealVersion);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealVersion;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx else
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx char *oldlocale;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx float version;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx oldlocale = setlocale(LC_NUMERIC, NULL);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx oldlocale = crStrdup(oldlocale);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx setlocale(LC_NUMERIC, "C");
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx version = GetVersionString();
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx sprintf((char*)ctx->glVersion, "%.1f Chromium %s", version, CR_VERSION_STRING);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (oldlocale)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx setlocale(LC_NUMERIC, oldlocale);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx crFree(oldlocale);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->glVersion;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_VENDOR:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef WINDOWS
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (packspuRunningUnderWine())
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_VENDOR, ctx->pszRealVendor);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealVendor;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx else
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return crStateGetString(name);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_RENDERER:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef WINDOWS
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (packspuRunningUnderWine())
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_RENDERER, ctx->pszRealRenderer);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealRenderer;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx else
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return crStateGetString(name);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef CR_OPENGL_VERSION_2_0
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_SHADING_LANGUAGE_VERSION:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx static GLboolean fInitialized = GL_FALSE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (!fInitialized)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_SHADING_LANGUAGE_VERSION, gpszShadingVersion);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx fInitialized = GL_TRUE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return gpszShadingVersion;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#ifdef GL_CR_real_vendor_strings
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_REAL_VENDOR:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_VENDOR, ctx->pszRealVendor);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealVendor;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_REAL_VERSION:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_VERSION, ctx->pszRealVersion);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealVersion;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx case GL_REAL_RENDERER:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx GetString(GL_REAL_RENDERER, ctx->pszRealRenderer);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return ctx->pszRealRenderer;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx#endif
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx default:
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx return crStateGetString(name);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hxvoid packspuInitStrings()
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx{
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx static GLboolean fInitialized = GL_FALSE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx if (!fInitialized)
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx {
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx packspu_GetString(GL_EXTENSIONS);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx packspu_GetString(GL_VERSION);
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx fInitialized = GL_TRUE;
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx }
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx}
84f7a9b9dca4f23b5f50edef0e59d7eb44301114hx