Merge git://github.com/AlericInglewood/SingularityViewer

This commit is contained in:
Siana Gearz
2011-06-28 23:53:01 +02:00
9 changed files with 34 additions and 199 deletions

View File

@@ -29,33 +29,22 @@
* COMPLETENESS OR PERFORMANCE. * COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$ * $/LicenseInfo$
*/ */
#include "linden_common.h" #include "linden_common.h"
#include "llfasttimer.h" #include "llfasttimer.h"
#include "llmemory.h" #include "llmemory.h"
#include "llprocessor.h" #include "llprocessor.h"
#if LL_WINDOWS #if LL_WINDOWS
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include "lltimer.h"
#elif LL_LINUX || LL_SOLARIS
#include <sys/time.h>
#include <sched.h>
#include "lltimer.h"
#elif LL_DARWIN
#include <sys/time.h>
#include "lltimer.h" // get_clock_count()
#else
#error "architecture not supported"
#endif #endif
#include "lltimer.h"
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// statics // statics
LLFastTimer::EFastTimerType LLFastTimer::sCurType = LLFastTimer::FTM_OTHER; LLFastTimer::EFastTimerType LLFastTimer::sCurType = LLFastTimer::FTM_OTHER;
int LLFastTimer::sCurDepth = 0; int LLFastTimer::sCurDepth = 0;
U64 LLFastTimer::sStart[LLFastTimer::FTM_MAX_DEPTH]; U64 LLFastTimer::sStart[LLFastTimer::FTM_MAX_DEPTH];
@@ -70,44 +59,12 @@ S32 LLFastTimer::sLastFrameIndex = -1;
int LLFastTimer::sPauseHistory = 0; int LLFastTimer::sPauseHistory = 0;
int LLFastTimer::sResetHistory = 0; int LLFastTimer::sResetHistory = 0;
#define USE_RDTSC 0 U64 LLFastTimer::sClockResolution = calc_clock_frequency(50U); // Resolution of get_clock_count()
#if LL_LINUX || LL_SOLARIS
U64 LLFastTimer::sClockResolution = 1000000000; // 1e9, Nanosecond resolution
#else
U64 LLFastTimer::sClockResolution = 1000000; // 1e6, Microsecond resolution
#endif
//static
#if (LL_DARWIN || LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{ {
return sClockResolution >> 8; return sClockResolution >> 8;
} }
#else // windows or x86-mac or x86-linux or x86-solaris
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
#if USE_RDTSC || !LL_WINDOWS
//getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
// we drop the low-order byte in our timers, so report a lower frequency
#else
// If we're not using RDTSC, each fasttimer tick is just a performance counter tick.
// Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency())
// since that would change displayed MHz stats for CPUs
static bool firstcall = true;
static U64 sCPUClockFrequency;
if (firstcall)
{
QueryPerformanceFrequency((LARGE_INTEGER*)&sCPUClockFrequency);
firstcall = false;
}
#endif
return sCPUClockFrequency >> 8;
}
#endif
void LLFastTimer::reset() void LLFastTimer::reset()
{ {
@@ -162,139 +119,17 @@ void LLFastTimer::reset()
// Important note: These implementations must be FAST! // Important note: These implementations must be FAST!
// //
#if LL_WINDOWS
//
// Windows implementation of CPU clock
//
//
// NOTE: put back in when we aren't using platform sdk anymore
//
// because MS has different signatures for these functions in winnt.h
// need to rename them to avoid conflicts
//#define _interlockedbittestandset _renamed_interlockedbittestandset
//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
//#include <intrin.h>
//#undef _interlockedbittestandset
//#undef _interlockedbittestandreset
//inline U32 LLFastTimer::getCPUClockCount32()
//{
// U64 time_stamp = __rdtsc();
// return (U32)(time_stamp >> 8);
//}
//
//// return full timer value, *not* shifted by 8 bits
//inline U64 LLFastTimer::getCPUClockCount64()
//{
// return __rdtsc();
//}
// shift off lower 8 bits for lower resolution but longer term timing // shift off lower 8 bits for lower resolution but longer term timing
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing // on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
#if USE_RDTSC
U32 LLFastTimer::getCPUClockCount32()
{
U32 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
shr eax,8
shl edx,24
or eax, edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
// return full timer value, *not* shifted by 8 bits
U64 LLFastTimer::getCPUClockCount64()
{
U64 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
mov eax,eax
mov edx,edx
mov dword ptr [ret_val+4], edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
std::string LLFastTimer::sClockType = "rdtsc";
#else
//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp //LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp
// These use QueryPerformanceCounter, which is arguably fine and also works on amd architectures. // On windows these use QueryPerformanceCounter, which is arguably fine and also works on amd architectures.
U32 LLFastTimer::getCPUClockCount32() U32 LLFastTimer::getCPUClockCount32()
{ {
return (U32)(get_clock_count()>>8); return get_clock_count() >> 8;
} }
U64 LLFastTimer::getCPUClockCount64() U64 LLFastTimer::getCPUClockCount64()
{ {
return get_clock_count(); return get_clock_count();
} }
std::string LLFastTimer::sClockType = "QueryPerformanceCounter";
#endif
#endif
#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
//
// Linux and Solaris implementation of CPU clock - non-x86.
// This is accurate but SLOW! Only use out of desperation.
//
// Try to use the MONOTONIC clock if available, this is a constant time counter
// with nanosecond resolution (but not necessarily accuracy) and attempts are
// made to synchronize this value between cores at kernel start. It should not
// be affected by CPU frequency. If not available use the REALTIME clock, but
// this may be affected by NTP adjustments or other user activity affecting
// the system time.
U64 LLFastTimer::getCPUClockCount64()
{
struct timespec tp;
#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time?
if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME
#endif
clock_gettime(CLOCK_REALTIME,&tp);
return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec;
}
U32 LLFastTimer::getCPUClockCount32()
{
return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
}
std::string LLFastTimer::sClockType = "clock_gettime";
#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
//
// Mac+Linux+Solaris FAST x86 implementation of CPU clock
U32 LLFastTimer::getCPUClockCount32()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return (U32)(x >> 8);
}
U64 LLFastTimer::getCPUClockCount64()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return x;
}
std::string LLFastTimer::sClockType = "rdtsc";
#endif

View File

@@ -256,7 +256,6 @@ public:
static void reset(); static void reset();
static U64 countsPerSecond(); static U64 countsPerSecond();
static std::string sClockType;
public: public:
static int sCurDepth; static int sCurDepth;
static U64 sStart[FTM_MAX_DEPTH]; static U64 sStart[FTM_MAX_DEPTH];

View File

@@ -142,9 +142,6 @@ std::string glob_to_regex(const std::string& glob)
switch (c) switch (c)
{ {
case '.':
regex+="\\.";
break;
case '*': case '*':
if (glob.begin() == i) if (glob.begin() == i)
{ {
@@ -177,6 +174,14 @@ std::string glob_to_regex(const std::string& glob)
case '!': case '!':
regex+= square_brace_open ? '^' : c; regex+= square_brace_open ? '^' : c;
break; break;
case '.': // This collection have different regex meaning
case '^': // And so need escaping
case '(':
case ')':
case '+':
case '|':
case '$':
regex+='\\';
default: default:
regex+=c; regex+=c;
break; break;

View File

@@ -66,7 +66,7 @@ std::string LLLogChat::makeLogFileName(std::string filename)
std::string LLLogChat::cleanFileName(std::string filename) std::string LLLogChat::cleanFileName(std::string filename)
{ {
std::string invalidChars = "\"\'\\/?*:<>|"; std::string invalidChars = "\"\'\\/?*:<>|[]{}~"; // Cannot match glob or illegal filename chars
S32 position = filename.find_first_of(invalidChars); S32 position = filename.find_first_of(invalidChars);
while (position != filename.npos) while (position != filename.npos)
{ {

View File

@@ -400,7 +400,7 @@ void LLPreviewAnim::gotAssetForSave(LLVFS *vfs,
// static // static
void LLPreviewAnim::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker) void LLPreviewAnim::gotAssetForSave_continued(char* buffer, S32 size, AIFilePicker* filepicker)
{ {
if (!filepicker->hasFilename()) if (filepicker->hasFilename())
{ {
std::string filename = filepicker->getFilename(); std::string filename = filepicker->getFilename();
std::ofstream export_file(filename.c_str(), std::ofstream::binary); std::ofstream export_file(filename.c_str(), std::ofstream::binary);

View File

@@ -126,7 +126,6 @@ LLToolBar::LLToolBar()
BOOL LLToolBar::postBuild() BOOL LLToolBar::postBuild()
{ {
childSetCommitCallback("communicate_btn", onClickCommunicate, this); childSetCommitCallback("communicate_btn", onClickCommunicate, this);
childSetControlName("communicate_btn", "ShowCommunicate");
childSetAction("chat_btn", onClickChat, this); childSetAction("chat_btn", onClickChat, this);
childSetControlName("chat_btn", "ChatVisible"); childSetControlName("chat_btn", "ChatVisible");

View File

@@ -154,16 +154,13 @@ std::string build_extensions_string(ELoadFilter filter)
} }
class AIFileUpload { class AIFileUpload {
protected:
AIFilePicker* mPicker;
public: public:
AIFileUpload(void) : mPicker(NULL) { } AIFileUpload(void) { }
virtual ~AIFileUpload() { llassert(!mPicker); if (mPicker) { mPicker->abort(); mPicker = NULL; } } virtual ~AIFileUpload() { }
public: public:
bool is_valid(std::string const& filename, ELoadFilter type); bool is_valid(std::string const& filename, ELoadFilter type);
void filepicker_callback(ELoadFilter type); void filepicker_callback(ELoadFilter type, AIFilePicker* picker);
void start_filepicker(ELoadFilter type, char const* context); void start_filepicker(ELoadFilter type, char const* context);
protected: protected:
@@ -179,21 +176,22 @@ void AIFileUpload::start_filepicker(ELoadFilter filter, char const* context)
// display(); // display();
} }
llassert(!mPicker); AIFilePicker* picker = AIFilePicker::create();
mPicker = AIFilePicker::create(); picker->open(filter, "", context);
mPicker->open(filter, "", context); // Note that when the call back is called then we're still in the main loop of
mPicker->run(boost::bind(&AIFileUpload::filepicker_callback, this, filter)); // the viewer and therefore the AIFileUpload still exists, since that is only
// destructed at the end of main when exiting the viewer.
picker->run(boost::bind(&AIFileUpload::filepicker_callback, this, filter, picker));
} }
void AIFileUpload::filepicker_callback(ELoadFilter type) void AIFileUpload::filepicker_callback(ELoadFilter type, AIFilePicker* picker)
{ {
if (mPicker->hasFilename()) if (picker->hasFilename())
{ {
std::string filename = mPicker->getFilename(); std::string filename = picker->getFilename();
if (is_valid(filename, type)) if (is_valid(filename, type))
handle_event(filename); handle_event(filename);
} }
mPicker = NULL;
} }
bool AIFileUpload::is_valid(std::string const& filename, ELoadFilter type) bool AIFileUpload::is_valid(std::string const& filename, ELoadFilter type)
@@ -478,7 +476,7 @@ class LLFileMinimizeAllWindows : public view_listener_t
}; };
// </edit> // </edit>
class LLFileSaveTexture : public view_listener_t class LLFileSavePreview : public view_listener_t
{ {
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)
{ {
@@ -1268,12 +1266,11 @@ void init_menu_file()
// <edit> // <edit>
(new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows"); (new LLFileMinimizeAllWindows())->registerListener(gMenuHolder, "File.MinimizeAllWindows");
// </edit> // </edit>
(new LLFileSaveTexture())->registerListener(gMenuHolder, "File.SaveTexture"); (new LLFileSavePreview())->registerListener(gMenuHolder, "File.SavePreview");
(new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot"); (new LLFileTakeSnapshot())->registerListener(gMenuHolder, "File.TakeSnapshot");
(new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk"); (new LLFileTakeSnapshotToDisk())->registerListener(gMenuHolder, "File.TakeSnapshotToDisk");
(new LLFileQuit())->registerListener(gMenuHolder, "File.Quit"); (new LLFileQuit())->registerListener(gMenuHolder, "File.Quit");
(new LLFileLogOut())->registerListener(gMenuHolder, "File.LogOut"); (new LLFileLogOut())->registerListener(gMenuHolder, "File.LogOut");
//Emerald has a second llFileSaveTexture here... Same as the original. Odd. -HgB
(new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload"); (new LLFileEnableUpload())->registerListener(gMenuHolder, "File.EnableUpload");
(new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs"); (new LLFileEnableSaveAs())->registerListener(gMenuHolder, "File.EnableSaveAs");
} }

View File

@@ -52,9 +52,9 @@
</menu_item_call> </menu_item_call>
<menu_item_separator bottom="-121" enabled="true" height="8" label="-----------" left="0" <menu_item_separator bottom="-121" enabled="true" height="8" label="-----------" left="0"
mouse_opaque="true" name="separator2" width="243" /> mouse_opaque="true" name="separator2" width="243" />
<menu_item_call bottom="-140" enabled="true" height="19" label="Save Texture As..." left="0" <menu_item_call bottom="-140" enabled="true" height="19" label="Save Preview As..." left="0"
mouse_opaque="true" name="Save Texture As..." width="243"> mouse_opaque="true" name="Save Preview As..." width="243">
<on_click function="File.SaveTexture" userdata="" /> <on_click function="File.SavePreview" userdata="" />
<on_enable function="File.EnableSaveAs" /> <on_enable function="File.EnableSaveAs" />
</menu_item_call> </menu_item_call>
<menu_item_separator bottom="-148" enabled="true" height="8" label="-----------" left="0" <menu_item_separator bottom="-148" enabled="true" height="8" label="-----------" left="0"

View File

@@ -79,7 +79,7 @@ AITHREADSAFESIMPLE(U64, AIStateMachine::sMaxCount, );
void AIStateMachine::updateSettings(void) void AIStateMachine::updateSettings(void)
{ {
Dout(dc::statemachine, "Initializing AIStateMachine::sMaxCount"); Dout(dc::statemachine, "Initializing AIStateMachine::sMaxCount");
*AIAccess<U64>(sMaxCount) = LLFastTimer::countsPerSecond() * gSavedSettings.getU32("StateMachineMaxTime") / 1000; *AIAccess<U64>(sMaxCount) = LLFastTimer::sClockResolution * gSavedSettings.getU32("StateMachineMaxTime") / 1000;
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -319,7 +319,7 @@ void AIStateMachine::mainloop(void*)
if (total_clocks >= max_count) if (total_clocks >= max_count)
{ {
#ifndef LL_RELEASE_FOR_DOWNLOAD #ifndef LL_RELEASE_FOR_DOWNLOAD
llwarns << "AIStateMachine::mainloop did run for " << (total_clocks * 1000 / LLFastTimer::countsPerSecond()) << " ms." << llendl; llwarns << "AIStateMachine::mainloop did run for " << (total_clocks * 1000 / LLFastTimer::sClockResolution) << " ms." << llendl;
#endif #endif
std::sort(active_statemachines.begin(), active_statemachines.end(), QueueElementComp()); std::sort(active_statemachines.begin(), active_statemachines.end(), QueueElementComp());
break; break;