SL-24485, SL-40331, SL-23136, SL-40330, SL-25816, SL-40567,

SL-40568: land moss/linuxmisc-r60383: misc linuxclient & opensource
fixes.

svn merge svn+ssh://svn.lindenlab.com/svn/linden/release@60383
svn+ssh://svn.lindenlab.com/svn/linden/branches/moss/linuxmisc-r60383 ->
release
master
Adam Moss 2007-04-18 09:17:53 +00:00
parent 0277259455
commit 208ccf8c2c
7 changed files with 356 additions and 120 deletions

View File

@ -4,13 +4,14 @@ along with the issue identifier corresponding to the patches we've
received from them. To see more about these contributions, visit received from them. To see more about these contributions, visit
http://jira.secondlife.com/ , and enter the issue identifier. http://jira.secondlife.com/ , and enter the issue identifier.
Alissa Sabre - VWR-81, VWR-83 Alissa Sabre - VWR-81, VWR-83, VWR-414
blino Nakamura - VWR-17 blino Nakamura - VWR-17
Drewan Keats - VWR-28 Drewan Keats - VWR-28
Dylan Haskell - VWR-72 Dylan Haskell - VWR-72
Dzonatas Sol - VWR-198 Dzonatas Sol - VWR-198
Eddy Stryker - VWR-15, VWR-23 Eddy Stryker - VWR-15, VWR-23
Ginko Bayliss - VWR-4 Ginko Bayliss - VWR-4
Hikkoshi Sakai - VWR-429
Hiro Sommambulist - VWR-66, VWR-97, VWR-100, VWR-105, VWR-108, VWR-118 Hiro Sommambulist - VWR-66, VWR-97, VWR-100, VWR-105, VWR-108, VWR-118
Jacek Antonelli - VWR-188 Jacek Antonelli - VWR-188
Joghert LeSabre - VWR-64 Joghert LeSabre - VWR-64

View File

@ -1,6 +1,6 @@
/** /**
* @file llwindowsdl.cpp * @file llwindowsdl.cpp
* @brief Platform-dependent implementation of llwindow * @brief SDL implementation of LLWindow class
* *
* Copyright (c) 2001-$CurrentYear$, Linden Research, Inc. * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
* $License$ * $License$
@ -35,12 +35,6 @@
extern BOOL gDebugWindowProc; extern BOOL gDebugWindowProc;
// culled from winuser.h
//const S32 WHEEL_DELTA = 120; /* Value for rolling one detent */
// On the Mac, the scroll wheel reports a delta of 1 for each detent.
// There's also acceleration for faster scrolling, based on a slider in the system preferences.
const S32 WHEEL_DELTA = 1; /* Value for rolling one detent */
const S32 BITS_PER_PIXEL = 32;
const S32 MAX_NUM_RESOLUTIONS = 32; const S32 MAX_NUM_RESOLUTIONS = 32;
// //
@ -54,37 +48,11 @@ const S32 MAX_NUM_RESOLUTIONS = 32;
// TOFU HACK -- (*exactly* the same hack as LLWindowMacOSX for a similar // TOFU HACK -- (*exactly* the same hack as LLWindowMacOSX for a similar
// set of reasons): Stash a pointer to the LLWindowSDL object here and // set of reasons): Stash a pointer to the LLWindowSDL object here and
// maintain in the constructor and destructor. This assumes that there will // maintain in the constructor and destructor. This assumes that there will
// be only one object of this class at any time. Hopefully this is true. // be only one object of this class at any time. Currently this is true.
static LLWindowSDL *gWindowImplementation = NULL; static LLWindowSDL *gWindowImplementation = NULL;
static BOOL was_fullscreen = FALSE; static BOOL was_fullscreen = FALSE;
// Cross-platform bits:
void show_window_creation_error(const char* title)
{
llwarns << title << llendl;
shell_open( "help/window_creation_error.html");
/*
OSMessageBox(
"Second Life is unable to run because it can't set up your display.\n"
"We need to be able to make a 32-bit color window at 1024x768, with\n"
"an 8 bit alpha channel.\n"
"\n"
"First, be sure your monitor is set to True Color (32-bit) in\n"
"Start -> Control Panels -> Display -> Settings.\n"
"\n"
"Otherwise, this may be due to video card driver issues.\n"
"Please make sure you have the latest video card drivers installed.\n"
"ATI drivers are available at http://www.ati.com/\n"
"nVidia drivers are available at http://www.nvidia.com/\n"
"\n"
"If you continue to receive this message, contact customer service.",
title,
OSMB_OK);
*/
}
void maybe_lock_display(void) void maybe_lock_display(void)
{ {
@ -255,7 +223,7 @@ LLWindowSDL::LLWindowSDL(char *title, S32 x, S32 y, S32 width,
#endif // LL_GTK #endif // LL_GTK
// Get the original aspect ratio of the main device. // Get the original aspect ratio of the main device.
mOriginalAspectRatio = 1024.0 / 768.0; // !!! FIXME //(double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay); mOriginalAspectRatio = 1024.0 / 768.0; // !!! *FIX: ? //(double)CGDisplayPixelsWide(mDisplay) / (double)CGDisplayPixelsHigh(mDisplay);
if (!title) if (!title)
title = "SDL Window"; // *FIX: (???) title = "SDL Window"; // *FIX: (???)
@ -305,6 +273,105 @@ static SDL_Surface *Load_BMP_Resource(const char *basename)
return SDL_LoadBMP(path_buffer); return SDL_LoadBMP(path_buffer);
} }
#if LL_X11
// This is an XFree86/XOrg-specific hack for detecting the amount of Video RAM
// on this machine. It works by searching /var/log/var/log/Xorg.?.log or
// /var/log/XFree86.?.log for a ': VideoRAM: (%d+) kB' regex, where '?' is
// the X11 display number derived from $DISPLAY
static int x11_detect_VRAM_kb_fp(FILE *fp)
{
const int line_buf_size = 1000;
char line_buf[line_buf_size];
while (fgets(line_buf, line_buf_size, fp))
{
//lldebugs << "XLOG: " << line_buf << llendl;
// Why the ad-hoc parser instead of using a regex? Our
// favourite regex implementation - libboost_regex - is
// quite a heavy and troublesome dependency for the client, so
// it seems a shame to introduce it for such a simple task.
const char part1_template[] = ": VideoRAM: ";
const char part2_template[] = " kB";
char *part1 = strstr(line_buf, part1_template);
if (part1) // found start of matching line
{
part1 = &part1[strlen(part1_template)]; // -> after
char *part2 = strstr(part1, part2_template);
if (part2) // found end of matching line
{
// now everything between part1 and part2 is
// supposed to be numeric, describing the
// number of kB of Video RAM supported
int rtn = 0;
for (; part1 < part2; ++part1)
{
//lldebugs << "kB" << *part1 << llendl;
if (*part1 < '0' || *part1 > '9')
{
// unexpected char, abort parse
rtn = 0;
break;
}
rtn *= 10;
rtn += (*part1) - '0';
}
if (rtn > 0)
{
// got the kB number. return it now.
return rtn;
}
}
}
}
return 0; // 'could not detect'
}
static int x11_detect_VRAM_kb()
{
std::string x_log_location("/var/log/");
std::string fname;
int rtn = 0; // 'could not detect'
int display_num = 0;
FILE *fp;
char *display_env = getenv("DISPLAY"); // e.g. :0 or :0.0 or :1.0 etc
// parse DISPLAY number so we can go grab the right log file
if (display_env[0] == ':' &&
display_env[1] >= '0' && display_env[1] <= '9')
{
display_num = display_env[1] - '0';
}
// *TODO: we could be smarter and see which of Xorg/XFree86 has the
// freshest time-stamp.
// Try XOrg log first
fname = x_log_location;
fname += "Xorg.";
fname += ('0' + display_num);
fname += ".log";
fp = fopen(fname.c_str(), "r");
if (fp)
{
rtn = x11_detect_VRAM_kb_fp(fp);
fclose(fp);
}
// Try old XFree86 log otherwise
if (rtn == 0)
{
fname = x_log_location;
fname += "XFree86.";
fname += ('0' + display_num);
fname += ".log";
fp = fopen(fname.c_str(), "r");
if (fp)
{
rtn = x11_detect_VRAM_kb_fp(fp);
fclose(fp);
}
}
return rtn;
}
#endif // LL_X11
BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync) BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, BOOL fullscreen, BOOL disable_vsync)
{ {
//bool glneedsinit = false; //bool glneedsinit = false;
@ -491,67 +558,40 @@ BOOL LLWindowSDL::createContext(int x, int y, int width, int height, int bits, B
{ {
llinfos << "createContext: SKIPPING - !fullscreen, but +mWindow " << width << "x" << height << "x" << bits << llendl; llinfos << "createContext: SKIPPING - !fullscreen, but +mWindow " << width << "x" << height << "x" << bits << llendl;
} }
/*if (!load_all_glsyms(gllibname)) // Detect video memory size.
{ # if LL_X11
SDL_QuitSubSystem(SDL_INIT_VIDEO); gGLManager.mVRAM = x11_detect_VRAM_kb() / 1024;
return FALSE;
}*/
gGLManager.mVRAM = videoInfo->video_mem / 1024;
if (gGLManager.mVRAM != 0) if (gGLManager.mVRAM != 0)
{ {
llinfos << "Detected " << gGLManager.mVRAM << "MB VRAM." << llendl; llinfos << "X11 log-parser detected " << gGLManager.mVRAM << "MB VRAM." << llendl;
} else
# endif // LL_X11
{
// fallback to letting SDL detect VRAM.
// note: I've not seen SDL's detection ever actually find
// VRAM != 0, but if SDL *does* detect it then that's a bonus.
gGLManager.mVRAM = videoInfo->video_mem / 1024;
if (gGLManager.mVRAM != 0)
{
llinfos << "SDL detected " << gGLManager.mVRAM << "MB VRAM." << llendl;
}
} }
// If VRAM is not detected, that is handled later // If VRAM is not detected, that is handled later
#if 0 // *FIX: all video cards suck under Linux. :) // *TODO: Now would be an appropriate time to check for some
// Since we just created the context, it needs to be set up. // explicitly unsupported cards.
glNeedsInit = TRUE; //const char* RENDERER = (const char*) glGetString(GL_RENDERER);
if(glNeedsInit)
{
// Check for some explicitly unsupported cards.
const char* RENDERER = (const char*) glGetString(GL_RENDERER);
const char* CARD_LIST[] = GLint depthBits, stencilBits, redBits, greenBits, blueBits, alphaBits;
{ "RAGE 128",
"RIVA TNT2",
"Intel 810",
"3Dfx/Voodoo3",
"Radeon 7000",
"Radeon 7200",
"Radeon 7500",
"Radeon DDR",
"Radeon VE",
"GDI Generic" };
const S32 CARD_COUNT = sizeof(CARD_LIST)/sizeof(char*);
// Future candidates:
// ProSavage/Twister
// SuperSavage
S32 i;
for (i = 0; i < CARD_COUNT; i++)
{
if (check_for_card(RENDERER, CARD_LIST[i]))
{
close();
shell_open( "help/unsupported_card.html" );
return FALSE;
}
}
}
#endif
GLint depthBits, stencilBits, redBits, greenBits, blueBits, alphaBits;
glGetIntegerv(GL_RED_BITS, &redBits);
glGetIntegerv(GL_GREEN_BITS, &greenBits);
glGetIntegerv(GL_BLUE_BITS, &blueBits);
glGetIntegerv(GL_ALPHA_BITS, &alphaBits);
glGetIntegerv(GL_DEPTH_BITS, &depthBits);
glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
glGetIntegerv(GL_RED_BITS, &redBits);
glGetIntegerv(GL_GREEN_BITS, &greenBits);
glGetIntegerv(GL_BLUE_BITS, &blueBits);
glGetIntegerv(GL_ALPHA_BITS, &alphaBits);
glGetIntegerv(GL_DEPTH_BITS, &depthBits);
glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
llinfos << "GL buffer:" << llendl llinfos << "GL buffer:" << llendl
llinfos << " Red Bits " << S32(redBits) << llendl llinfos << " Red Bits " << S32(redBits) << llendl
llinfos << " Green Bits " << S32(greenBits) << llendl llinfos << " Green Bits " << S32(greenBits) << llendl
@ -1002,7 +1042,9 @@ void LLWindowSDL::beforeDialog()
{ {
// Everything that we/SDL asked for should happen before we // Everything that we/SDL asked for should happen before we
// potentially hand control over to GTK. // potentially hand control over to GTK.
maybe_lock_display();
XSync(mSDL_Display, False); XSync(mSDL_Display, False);
maybe_unlock_display();
} }
#endif // LL_X11 #endif // LL_X11
@ -1046,6 +1088,7 @@ void LLWindowSDL::x11_set_urgent(BOOL urgent)
llinfos << "X11 hint for urgency, " << urgent << llendl; llinfos << "X11 hint for urgency, " << urgent << llendl;
maybe_lock_display();
wm_hints = XGetWMHints(mSDL_Display, mSDL_XWindowID); wm_hints = XGetWMHints(mSDL_Display, mSDL_XWindowID);
if (!wm_hints) if (!wm_hints)
wm_hints = XAllocWMHints(); wm_hints = XAllocWMHints();
@ -1058,6 +1101,7 @@ void LLWindowSDL::x11_set_urgent(BOOL urgent)
XSetWMHints(mSDL_Display, mSDL_XWindowID, wm_hints); XSetWMHints(mSDL_Display, mSDL_XWindowID, wm_hints);
XFree(wm_hints); XFree(wm_hints);
XSync(mSDL_Display, False); XSync(mSDL_Display, False);
maybe_unlock_display();
} }
} }
#endif // LL_X11 #endif // LL_X11
@ -1762,10 +1806,12 @@ BOOL LLWindowSDL::SDLReallyCaptureInput(BOOL capture)
{ {
//llinfos << "X11 POINTER GRABBY" << llendl; //llinfos << "X11 POINTER GRABBY" << llendl;
//newmode = SDL_WM_GrabInput(wantmode); //newmode = SDL_WM_GrabInput(wantmode);
maybe_lock_display();
result = XGrabPointer(mSDL_Display, mSDL_XWindowID, result = XGrabPointer(mSDL_Display, mSDL_XWindowID,
True, 0, GrabModeAsync, True, 0, GrabModeAsync,
GrabModeAsync, GrabModeAsync,
None, None, CurrentTime); None, None, CurrentTime);
maybe_unlock_display();
if (GrabSuccess == result) if (GrabSuccess == result)
newmode = SDL_GRAB_ON; newmode = SDL_GRAB_ON;
else else
@ -1775,10 +1821,12 @@ BOOL LLWindowSDL::SDLReallyCaptureInput(BOOL capture)
//llinfos << "X11 POINTER UNGRABBY" << llendl; //llinfos << "X11 POINTER UNGRABBY" << llendl;
newmode = SDL_GRAB_OFF; newmode = SDL_GRAB_OFF;
//newmode = SDL_WM_GrabInput(SDL_GRAB_OFF); //newmode = SDL_WM_GrabInput(SDL_GRAB_OFF);
maybe_lock_display();
XUngrabPointer(mSDL_Display, CurrentTime); XUngrabPointer(mSDL_Display, CurrentTime);
// Make sure the ungrab happens RIGHT NOW. // Make sure the ungrab happens RIGHT NOW.
XSync(mSDL_Display, False); XSync(mSDL_Display, False);
maybe_unlock_display();
} else } else
{ {
newmode = SDL_GRAB_QUERY; // neutral newmode = SDL_GRAB_QUERY; // neutral
@ -1855,7 +1903,7 @@ void LLWindowSDL::gatherInput()
std::string saved_locale = setlocale(LC_ALL, NULL); std::string saved_locale = setlocale(LC_ALL, NULL);
// Do a limited number of pumps so SL doesn't starve! // Do a limited number of pumps so SL doesn't starve!
// FIXME - this should ideally be time-limited, not count-limited. // *TODO: this should ideally be time-limited, not count-limited.
gtk_main_iteration_do(0); // Always do one non-blocking pump gtk_main_iteration_do(0); // Always do one non-blocking pump
for (int iter=0; iter<10; ++iter) for (int iter=0; iter<10; ++iter)
if (gtk_events_pending()) if (gtk_events_pending())
@ -2081,8 +2129,8 @@ static SDL_Cursor *makeSDLCursorFromBMP(const char *filename, int hotx, int hoty
if (bmpsurface && bmpsurface->w%8==0) if (bmpsurface && bmpsurface->w%8==0)
{ {
SDL_Surface *cursurface; SDL_Surface *cursurface;
llinfos << "Loaded cursor file " << filename << " " lldebugs << "Loaded cursor file " << filename << " "
<< bmpsurface->w << "x" << bmpsurface->h << llendl; << bmpsurface->w << "x" << bmpsurface->h << llendl;
cursurface = SDL_CreateRGBSurface (SDL_SWSURFACE, cursurface = SDL_CreateRGBSurface (SDL_SWSURFACE,
bmpsurface->w, bmpsurface->w,
bmpsurface->h, bmpsurface->h,
@ -2262,14 +2310,14 @@ void LLWindowSDL::hideCursor()
{ {
if(!mCursorHidden) if(!mCursorHidden)
{ {
// llinfos << "hideCursor: hiding" << llendl; // llinfos << "hideCursor: hiding" << llendl;
mCursorHidden = TRUE; mCursorHidden = TRUE;
mHideCursorPermanent = TRUE; mHideCursorPermanent = TRUE;
SDL_ShowCursor(0); SDL_ShowCursor(0);
} }
else else
{ {
// llinfos << "hideCursor: already hidden" << llendl; // llinfos << "hideCursor: already hidden" << llendl;
} }
adjustCursorDecouple(); adjustCursorDecouple();
@ -2279,14 +2327,14 @@ void LLWindowSDL::showCursor()
{ {
if(mCursorHidden) if(mCursorHidden)
{ {
// llinfos << "showCursor: showing" << llendl; // llinfos << "showCursor: showing" << llendl;
mCursorHidden = FALSE; mCursorHidden = FALSE;
mHideCursorPermanent = FALSE; mHideCursorPermanent = FALSE;
SDL_ShowCursor(1); SDL_ShowCursor(1);
} }
else else
{ {
// llinfos << "showCursor: already visible" << llendl; // llinfos << "showCursor: already visible" << llendl;
} }
adjustCursorDecouple(); adjustCursorDecouple();
@ -2312,7 +2360,8 @@ void LLWindowSDL::hideCursorUntilMouseMove()
// //
// LLSplashScreenSDL // LLSplashScreenSDL - I don't think we'll bother to implement this; it's
// fairly obsolete at this point.
// //
LLSplashScreenSDL::LLSplashScreenSDL() LLSplashScreenSDL::LLSplashScreenSDL()
{ {
@ -2330,7 +2379,6 @@ void LLSplashScreenSDL::updateImpl(const char* mesg)
{ {
} }
void LLSplashScreenSDL::hideImpl() void LLSplashScreenSDL::hideImpl()
{ {
} }
@ -2418,7 +2466,7 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type)
G_CALLBACK (response_callback), G_CALLBACK (response_callback),
&response); &response);
// we should be able to us a gtk_dialog_run(), but it's // we should be able to use a gtk_dialog_run(), but it's
// apparently not written to exist in a world without a higher // apparently not written to exist in a world without a higher
// gtk_main(), so we manage its signal/destruction outselves. // gtk_main(), so we manage its signal/destruction outselves.
gtk_widget_show_all (win); gtk_widget_show_all (win);
@ -2440,7 +2488,7 @@ S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type)
} }
else else
{ {
fprintf(stderr, "MSGBOX: %s: %s\n", caption, text); llinfos << "MSGBOX: " << caption << ": " << text << llendl;
llinfos << "Skipping dialog because we're in fullscreen mode or GTK is not happy." << llendl; llinfos << "Skipping dialog because we're in fullscreen mode or GTK is not happy." << llendl;
rtn = OSBTN_OK; rtn = OSBTN_OK;
} }
@ -2536,7 +2584,7 @@ BOOL LLWindowSDL::dialog_color_picker ( F32 *r, F32 *g, F32 *b)
#else #else
S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type) S32 OSMessageBoxSDL(const char* text, const char* caption, U32 type)
{ {
fprintf(stderr, "MSGBOX: %s: %s\n", caption, text); llinfos << "MSGBOX: " << caption << ": " << text << llendl;
return 0; return 0;
} }
@ -2553,11 +2601,15 @@ void spawn_web_browser(const char* escaped_url)
llinfos << "spawn_web_browser: " << escaped_url << llendl; llinfos << "spawn_web_browser: " << escaped_url << llendl;
#if LL_LINUX #if LL_LINUX
# if LL_X11 # if LL_X11
if (gWindowImplementation && if (gWindowImplementation && gWindowImplementation->mSDL_Display)
gWindowImplementation->mSDL_Display) // Just in case - before forking. {
maybe_lock_display();
// Just in case - before forking.
XSync(gWindowImplementation->mSDL_Display, False); XSync(gWindowImplementation->mSDL_Display, False);
# endif // LL_X11 maybe_unlock_display();
}
# endif // LL_X11
std::string cmd; std::string cmd;
cmd = gDirUtilp->getAppRODataDir().c_str(); cmd = gDirUtilp->getAppRODataDir().c_str();
@ -2595,8 +2647,8 @@ void spawn_web_browser(const char* escaped_url)
void shell_open( const char* file_path ) void shell_open( const char* file_path )
{ {
// *FIX: (???) // *TODO: This function is deprecated and should probably go away.
fprintf(stderr, "shell_open: %s\n", file_path); llwarns << "Deprecated shell_open(): " << file_path << llendl;
} }
void *LLWindowSDL::getPlatformWindow() void *LLWindowSDL::getPlatformWindow()
@ -2604,18 +2656,14 @@ void *LLWindowSDL::getPlatformWindow()
#if LL_GTK && LL_LIBXUL_ENABLED #if LL_GTK && LL_LIBXUL_ENABLED
if (ll_try_gtk_init()) if (ll_try_gtk_init())
{ {
maybe_lock_display();
GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL); GtkWidget *win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
// These hacks were attempts to get Gecko to see the keyboard,
// but I think they're doomed to fail.
//GdkWindow *gdkwin = gdk_window_foreign_new(SDL_XWindowID);
//GTK_WIDGET(win)->window = gdkwin;
//gtk_widget_set_parent_window(win, gdkwin);
// show the hidden-widget while debugging (needs mozlib change) // show the hidden-widget while debugging (needs mozlib change)
//gtk_widget_show_all(GTK_WIDGET(win)); //gtk_widget_show_all(GTK_WIDGET(win));
gtk_widget_realize(GTK_WIDGET(win)); gtk_widget_realize(GTK_WIDGET(win));
maybe_unlock_display();
return win; return win;
} }
#endif // LL_GTK && LL_LIBXUL_ENABLED #endif // LL_GTK && LL_LIBXUL_ENABLED
@ -2625,8 +2673,18 @@ void *LLWindowSDL::getPlatformWindow()
void LLWindowSDL::bringToFront() void LLWindowSDL::bringToFront()
{ {
// *FIX: (???) // This is currently used when we are 'launched' to a specific
fprintf(stderr, "bringToFront\n"); // map position externally.
llinfos << "bringToFront" << llendl;
#if LL_X11
if (mSDL_Display && !mFullscreen)
{
maybe_lock_display();
XRaiseWindow(mSDL_Display, mSDL_XWindowID);
XSync(mSDL_Display, False);
maybe_unlock_display();
}
#endif // LL_X11
} }
#endif // LL_SDL #endif // LL_SDL

View File

@ -0,0 +1,173 @@
version 10
// NOTE: This is mostly identical to featuretable.txt with a few differences
// Should be combined into one table
//
// Generates lists of feature mask that can be applied on top of each other.
//
// // Begin comments
// list <name>
// Starts a feature list named <name>
// <name> <available> <recommended>
// <name> is the name of a feature
// <available> is 0 or 1, whether the feature is available
// <recommended> is an S32 which is the recommended value
//
// For now, the first list read sets up all of the default values
//
//
// All contains everything at their default settings for high end machines
// NOTE: All settings are set to the MIN of applied values, including 'all'!
//
list all
RenderVBO 1 1
RenderAniso 1 0
RenderAvatarMode 1 2
RenderAvatarVP 1 1
RenderDistance 1 128
RenderLighting 1 1
RenderObjectBump 1 1
RenderParticleCount 1 4096
RenderRippleWater 1 1
RenderTerrainDetail 1 2
VertexShaderEnable 1 1
//
// Class 0 Hardware (Unknown or just old)
//
list Class0
VertexShaderEnable 1 0
RenderVBO 1 0
RenderDistance 1 64
RenderAvatarVP 1 0
RenderAvatarMode 1 0
RenderLighting 1 0
RenderObjectBump 1 0
RenderRippleWater 1 0
//
// Class 1 Hardware
//
list Class1
VertexShaderEnable 1 0
RenderVBO 1 1
RenderDistance 1 96
RenderAvatarVP 1 1
RenderAvatarMode 1 0
RenderLighting 1 0
RenderObjectBump 1 0
RenderRippleWater 1 0
//
// Class 2 Hardware (make it purty)
//
list Class2
VertexShaderEnable 1 1
RenderAvatarVP 1 1
RenderAvatarMode 1 1
RenderLighting 1 1
RenderObjectBump 1 1
RenderRippleWater 1 1
//
// Class 3 Hardware (make it purty)
//
list Class3
VertexShaderEnable 1 1
RenderAvatarVP 1 1
RenderAvatarMode 1 1
RenderLighting 1 1
RenderObjectBump 1 1
RenderRippleWater 1 1
//
// No Pixel Shaders available
//
list NoPixelShaders
VertexShaderEnable 0 0
RenderAvatarVP 0 0
//
// No Vertex Shaders available
//
list NoVertexShaders
VertexShaderEnable 0 0
RenderAvatarVP 0 0
//
// "Default" setups for safe, low, medium, high
//
list safe
RenderVBO 1 0
RenderAniso 1 0
RenderAvatarVP 0 0
RenderLighting 1 0
RenderParticleCount 1 1024
RenderTerrainDetail 1 0
list low
RenderVBO 1 0
RenderAniso 1 0
RenderLighting 1 0
list medium
RenderLighting 1 0
//
// CPU based feature masks
//
// 1Ghz or less (equiv)
list CPUSlow
RenderParticleCount 1 1024
//
// RAM based feature masks
//
list RAM256MB
RenderObjectBump 0 0
//
// Graphics card based feature masks
//
list OpenGLPre15
RenderVBO 1 0
list Intel
RenderVBO 1 0
RenderAniso 1 0
RenderLighting 1 0
RenderTerrainDetail 1 0
list GeForce2
RenderVBO 1 1
RenderAniso 1 0
RenderLighting 1 0
RenderParticleCount 1 2048
RenderTerrainDetail 1 0
list GeForce3
list ATI
list Radeon8500
RenderLighting 1 0
RenderParticleCount 1 4096
// Hacked to be paranoid "safe"
list Radeon9700
RenderParticleCount 1 4096
// Hacked to be paranoid "safe"
list MobilityRadeon9000
RenderLighting 1 0
RenderParticleCount 1 4096
list GeForceFX

View File

@ -97,7 +97,6 @@ the Alpha release of the Linux client.
implemented on the Linux client and are therefore known not to work properly implemented on the Linux client and are therefore known not to work properly
at this time: at this time:
* QuickTime movie playback and movie recording * QuickTime movie playback and movie recording
* Video memory detection
* Full Unicode font rendering * Full Unicode font rendering
* Auto-updater * Auto-updater

View File

@ -7056,7 +7056,7 @@ void LLAgent::queryWearableCache()
// Look up affected baked textures. // Look up affected baked textures.
// If they exist: // If they exist:
// disallow updates for affected layersets (until dataserver responds with cache request.) // disallow updates for affected layersets (until dataserver responds with cache request.)
// If cache missturn updates back on and invalidate composite. // If cache miss, turn updates back on and invalidate composite.
// If cache hit, modify baked texture entries. // If cache hit, modify baked texture entries.
// //
// Cache requests contain list of hashes for each baked texture entry. // Cache requests contain list of hashes for each baked texture entry.

View File

@ -40,6 +40,8 @@ extern void write_debug(const std::string& str);
#if LL_DARWIN #if LL_DARWIN
const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt"; const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
#elif LL_LINUX
const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
#else #else
const char FEATURE_TABLE_FILENAME[] = "featuretable.txt"; const char FEATURE_TABLE_FILENAME[] = "featuretable.txt";
#endif #endif

View File

@ -64,7 +64,6 @@ class ViewerManifest(LLManifest):
self.end_prefix("html/*") self.end_prefix("html/*")
self.end_prefix("skins") self.end_prefix("skins")
self.path("featuretable.txt")
self.path("releasenotes.txt") self.path("releasenotes.txt")
self.path("lsl_guide.html") self.path("lsl_guide.html")
self.path("gpu_table.txt") self.path("gpu_table.txt")
@ -115,6 +114,8 @@ class WindowsManifest(ViewerManifest):
self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll') self.path(self.find_existing_file('ReleaseForDownload/llkdu.dll', 'llkdu.dll', '../../libraries/i686-win32/lib_release/llkdu.dll'), dst='llkdu.dll')
self.path(src="licenses-win32.txt", dst="licenses.txt") self.path(src="licenses-win32.txt", dst="licenses.txt")
self.path("featuretable.txt")
# For use in crash reporting (generates minidumps) # For use in crash reporting (generates minidumps)
self.path("dbghelp.dll") self.path("dbghelp.dll")
@ -388,6 +389,8 @@ class Linux_i686Manifest(LinuxManifest):
# recurse # recurse
self.end_prefix("res-sdl") self.end_prefix("res-sdl")
self.path("featuretable_linux.txt")
self.path("app_settings/mozilla-runtime-linux-i686") self.path("app_settings/mozilla-runtime-linux-i686")
if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"): if self.prefix("../../libraries/i686-linux/lib_release_client", "lib"):