std::wstring CardName() { // GL_VENDOR+GL_RENDERER are good enough here, so we don't use wgfx_CardName, // plus that can cause crashes with Nvidia Optimus and some netbooks // see http://trac.wildfiregames.com/ticket/1952 // http://trac.wildfiregames.com/ticket/1575 wchar_t cardName[128]; const char* vendor = (const char*)glGetString(GL_VENDOR); const char* renderer = (const char*)glGetString(GL_RENDERER); // (happens if called before ogl_Init or between glBegin and glEnd.) if(!vendor || !renderer) return L""; swprintf_s(cardName, ARRAY_SIZE(cardName), L"%hs %hs", vendor, renderer); // remove crap from vendor names. (don't dare touch the model name - // it's too risky, there are too many different strings) #define SHORTEN(what, charsToKeep)\ if(!wcsncmp(cardName, what, ARRAY_SIZE(what)-1))\ memmove(cardName+charsToKeep, cardName+ARRAY_SIZE(what)-1, (wcslen(cardName)-(ARRAY_SIZE(what)-1)+1)*sizeof(wchar_t)); SHORTEN(L"ATI Technologies Inc.", 3); SHORTEN(L"NVIDIA Corporation", 6); SHORTEN(L"S3 Graphics", 2); // returned by EnumDisplayDevices SHORTEN(L"S3 Graphics, Incorporated", 2); // returned by GL_VENDOR #undef SHORTEN return cardName; }
std::wstring CardName() { wchar_t cardName[128]; #if OS_WIN if(wgfx_CardName(cardName, ARRAY_SIZE(cardName)) != INFO::OK) #endif { const char* vendor = (const char*)glGetString(GL_VENDOR); const char* renderer = (const char*)glGetString(GL_RENDERER); // (happens if called before ogl_Init or between glBegin and glEnd.) if(!vendor || !renderer) return L""; swprintf_s(cardName, ARRAY_SIZE(cardName), L"%hs %hs", vendor, renderer); } // remove crap from vendor names. (don't dare touch the model name - // it's too risky, there are too many different strings) #define SHORTEN(what, charsToKeep)\ if(!wcsncmp(cardName, what, ARRAY_SIZE(what)-1))\ memmove(cardName+charsToKeep, cardName+ARRAY_SIZE(what)-1, (wcslen(cardName)-(ARRAY_SIZE(what)-1)+1)*sizeof(wchar_t)); SHORTEN(L"ATI Technologies Inc.", 3); SHORTEN(L"NVIDIA Corporation", 6); SHORTEN(L"S3 Graphics", 2); // returned by EnumDisplayDevices SHORTEN(L"S3 Graphics, Incorporated", 2); // returned by GL_VENDOR #undef SHORTEN return cardName; }
// // R_GenerateLookup // void R_GenerateLookup (int texnum) { texture_t* texture; texpatch_t* patch; patch_t* realpatch; int x; int x1; int x2; int i; short* collump; unsigned short* colofs; texture = ::g->s_textures[texnum]; // Composited texture not created yet. ::g->s_texturecomposite[texnum] = 0; ::g->s_texturecompositesize[texnum] = 0; collump = ::g->s_texturecolumnlump[texnum]; colofs = ::g->s_texturecolumnofs[texnum]; // Now count the number of columns // that are covered by more than one patch. // Fill in the lump / offset, so columns // with only a single patch are all done. std::vector<byte> patchcount(texture->width, 0); patch = texture->patches; for (i=0 , patch = texture->patches; i<texture->patchcount; i++, patch++) { realpatch = (patch_t*)W_CacheLumpNum (patch->patch, PU_CACHE_SHARED); x1 = patch->originx; x2 = x1 + SHORT(realpatch->width); if (x1 < 0) x = 0; else x = x1; if (x2 > texture->width) x2 = texture->width; for ( ; x<x2 ; x++) { patchcount[x]++; collump[x] = patch->patch; colofs[x] = SHORTEN(realpatch->columnofs[x-x1]) + 3; } } for (x=0 ; x<texture->width ; x++) { if (!patchcount[x]) { I_Printf ("R_GenerateLookup: column without a patch (%s)\n", texture->name); return; } // I_Error ("R_GenerateLookup: column without a patch"); if (patchcount[x] > 1) { // Use the cached block. collump[x] = -1; colofs[x] = ::g->s_texturecompositesize[texnum]; if (::g->s_texturecompositesize[texnum] > 0x10000-texture->height) { I_Error ("R_GenerateLookup: texture %i is >64k", texnum); } ::g->s_texturecompositesize[texnum] += texture->height; } } }