meow-7.2.2
Brad Payne (Vir Linden) 2010-04-19 13:53:57 -04:00
commit 7f0a778990
19 changed files with 178 additions and 71 deletions

View File

@ -36,6 +36,10 @@
// pull in the actual class definition
#include "llfasttimer_class.h"
//
// Important note: These implementations must be FAST!
//
#if LL_WINDOWS
//
// Windows implementation of CPU clock
@ -99,15 +103,17 @@ inline U64 LLFastTimer::getCPUClockCount64()
#endif
#if LL_LINUX || LL_SOLARIS
#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
//
// Linux and Solaris implementation of CPU clock - all architectures.
// 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.
// 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.
inline U64 LLFastTimer::getCPUClockCount64()
{
struct timespec tp;
@ -124,12 +130,12 @@ inline U32 LLFastTimer::getCPUClockCount32()
{
return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
}
#endif // (LL_LINUX || LL_SOLARIS))
#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
#if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
//
// Mac x86 implementation of CPU clock
// Mac+Linux+Solaris FAST x86 implementation of CPU clock
inline U32 LLFastTimer::getCPUClockCount32()
{
U64 x;

View File

@ -230,17 +230,17 @@ void LLFastTimer::DeclareTimer::updateCachedPointers()
}
//static
#if LL_LINUX || LL_SOLARIS || ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)) )
#if (LL_DARWIN || LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
return sClockResolution >> 8;
}
#else // windows or x86-mac
#else // windows or x86-mac or x86-linux or x86-solaris
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
static U64 sCPUClockFrequency = U64(CProcessor().GetCPUFrequency(50));
// we drop the low-order byte in out timers, so report a lower frequency
// we drop the low-order byte in our timers, so report a lower frequency
return sCPUClockFrequency >> 8;
}
#endif

View File

@ -60,6 +60,10 @@
# include <windows.h>
#endif
#if LL_LINUX
#include "llsys.h"
#endif // LL_LINUX
#if !LL_DARWIN && !LL_SOLARIS
#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
@ -116,6 +120,11 @@ CProcessor::CProcessor()
////////////////////////////////////////////////////////////////////////////
F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
{
#if LL_LINUX
// use the shinier LLCPUInfo interface
return 1000000.0F * gSysCPU.getMHz();
#endif
#ifndef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
return 0;
#else
@ -781,7 +790,7 @@ bool CProcessor::AnalyzeAMDProcessor()
case 5: // Family = 5: K5 / K6 processor family
switch (CPUInfo.uiModel)
{
case 0: // Model = 0: K5 SSA 5 (Pentium Rating *ggg* 75, 90 and 100 Mhz)
case 0: // Model = 0: K5 SSA 5 (Pentium Rating *ggg* 75, 90 and 100 MHz)
strcpy(CPUInfo.strModel, "AMD K5 SSA5 (PR75, PR90, PR100)"); /* Flawfinder: ignore */
strncat(strCPUName, "AMD K5 SSA5 (PR75, PR90, PR100)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
break;

View File

@ -519,15 +519,15 @@ LLCPUInfo::LLCPUInfo()
mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions;
mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions;
mHasAltivec = info->_Ext.Altivec_Extensions;
mCPUMhz = (S32)(proc.GetCPUFrequency(50)/1000000.0);
mCPUMHz = (F64)(proc.GetCPUFrequency(50)/1000000.0F);
mFamily.assign( info->strFamily );
mCPUString = "Unknown";
#if LL_WINDOWS || LL_DARWIN || LL_SOLARIS
out << proc.strCPUName;
if (200 < mCPUMhz && mCPUMhz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check
if (200 < mCPUMHz && mCPUMHz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check
{
out << " (" << mCPUMhz << " MHz)";
out << " (" << mCPUMHz << " MHz)";
}
mCPUString = out.str();
@ -572,7 +572,7 @@ LLCPUInfo::LLCPUInfo()
if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
&& 200.0 < mhz && mhz < 10000.0)
{
mCPUMhz = (S32)llrint(mhz);
mCPUMHz = (F64)(mhz);
}
if (!cpuinfo["model name"].empty())
mCPUString = cpuinfo["model name"];
@ -595,9 +595,9 @@ bool LLCPUInfo::hasSSE2() const
return mHasSSE2;
}
S32 LLCPUInfo::getMhz() const
F64 LLCPUInfo::getMHz() const
{
return mCPUMhz;
return mCPUMHz;
}
std::string LLCPUInfo::getCPUString() const
@ -644,7 +644,7 @@ void LLCPUInfo::stream(std::ostream& s) const
s << "->mHasSSE: " << (U32)mHasSSE << std::endl;
s << "->mHasSSE2: " << (U32)mHasSSE2 << std::endl;
s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl;
s << "->mCPUMhz: " << mCPUMhz << std::endl;
s << "->mCPUMHz: " << mCPUMHz << std::endl;
s << "->mCPUString: " << mCPUString << std::endl;
}

View File

@ -81,7 +81,7 @@ public:
bool hasAltivec() const;
bool hasSSE() const;
bool hasSSE2() const;
S32 getMhz() const;
F64 getMHz() const;
// Family is "AMD Duron" or "Intel Pentium Pro"
const std::string& getFamily() const { return mFamily; }
@ -90,7 +90,7 @@ private:
bool mHasSSE;
bool mHasSSE2;
bool mHasAltivec;
S32 mCPUMhz;
F64 mCPUMHz;
std::string mFamily;
std::string mCPUString;
};

View File

@ -209,7 +209,7 @@ F64 calc_clock_frequency(U32 uiMeasureMSecs)
// Both Linux and Mac use gettimeofday for accurate time
F64 calc_clock_frequency(unsigned int uiMeasureMSecs)
{
return 1000000.0; // microseconds, so 1 Mhz.
return 1000000.0; // microseconds, so 1 MHz.
}
U64 get_clock_count()

View File

@ -1295,6 +1295,13 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
{
resetAxes(mAutoPilotTargetFacing);
}
// Restore previous flying state before invoking mAutoPilotFinishedCallback to allow
// callback function to change the flying state (like in near_sit_down_point()).
// If the user cancelled, don't change the fly state
if (!user_cancel)
{
setFlying(mAutoPilotFlyOnStop);
}
//NB: auto pilot can terminate for a reason other than reaching the destination
if (mAutoPilotFinishedCallback)
{
@ -1302,11 +1309,6 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
}
mLeaderID = LLUUID::null;
// If the user cancelled, don't change the fly state
if (!user_cancel)
{
setFlying(mAutoPilotFlyOnStop);
}
setControlFlags(AGENT_CONTROL_STOP);
if (user_cancel && !mAutoPilotBehaviorName.empty())

View File

@ -862,7 +862,7 @@ bool LLAppViewer::init()
minSpecs += "\n";
unsupported = true;
}
if(gSysCPU.getMhz() < minCPU)
if(gSysCPU.getMHz() < minCPU)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedCPU");
minSpecs += "\n";
@ -2524,7 +2524,7 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["CPUInfo"]["CPUString"] = gSysCPU.getCPUString();
gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily();
gDebugInfo["CPUInfo"]["CPUMhz"] = gSysCPU.getMhz();
gDebugInfo["CPUInfo"]["CPUMhz"] = (S32)gSysCPU.getMHz();
gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec();
gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE();
gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2();
@ -2537,7 +2537,7 @@ void LLAppViewer::writeSystemInfo()
// which may have been the intended grid. This can b
gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();
// *FIX:Mani - move this ddown in llappviewerwin32
// *FIX:Mani - move this down in llappviewerwin32
#ifdef LL_WINDOWS
DWORD thread_id = GetCurrentThreadId();
gDebugInfo["MainloopThreadID"] = (S32)thread_id;

View File

@ -621,9 +621,9 @@ void LLFeatureManager::applyBaseMasks()
#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast
#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
if (gSysCPU.getMhz() < 800)
if (gSysCPU.getMHz() < 800)
#else
if (gSysCPU.getMhz() < 1100)
if (gSysCPU.getMHz() < 1100)
#endif
{
maskFeatures("CPUSlow");

View File

@ -1416,8 +1416,8 @@ void LLFolderView::startRenamingSelectedItem( void )
mRenamer->setVisible( TRUE );
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
mRenamer->setTopLostCallback(boost::bind(onRenamerLost, _1));
mRenamer->setFocusLostCallback(boost::bind(onRenamerLost, _1));
mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
mRenamer->setFocusLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
gViewerWindow->addPopup(mRenamer);
}
}
@ -2386,9 +2386,9 @@ S32 LLFolderView::notify(const LLSD& info)
/// Local function definitions
///----------------------------------------------------------------------------
//static
void LLFolderView::onRenamerLost( LLFocusableElement* renamer)
{
mRenameItem = NULL;
LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(renamer);
if (uictrl)
{

View File

@ -279,7 +279,7 @@ protected:
LLScrollContainer* mScrollContainer; // NULL if this is not a child of a scroll container.
void commitRename( const LLSD& data );
static void onRenamerLost( LLFocusableElement* renamer);
void onRenamerLost( LLFocusableElement* renamer);
void finishRenamingItem( void );
void closeRenamer( void );

View File

@ -2680,6 +2680,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
// This is the lost+found folder.
mItems.push_back(std::string("Empty Lost And Found"));
mDisabledItems.push_back(std::string("New Folder"));
mDisabledItems.push_back(std::string("New Script"));
mDisabledItems.push_back(std::string("New Note"));
mDisabledItems.push_back(std::string("New Gesture"));
mDisabledItems.push_back(std::string("New Clothes"));
mDisabledItems.push_back(std::string("New Body Parts"));
}
if(trash_id == mUUID)

View File

@ -200,7 +200,11 @@ void LLFloaterMove::setFlyingMode(BOOL fly)
if (instance)
{
instance->setFlyingModeImpl(fly);
BOOL is_sitting = isAgentAvatarValid() && gAgentAvatarp->isSitting();
LLVOAvatarSelf* avatar_object = gAgentAvatarp;
bool is_sitting = avatar_object
&& (avatar_object->getRegion() != NULL)
&& (!avatar_object->isDead())
&& avatar_object->isSitting();
instance->showModeButtons(!fly && !is_sitting);
}
if (fly)

View File

@ -133,10 +133,6 @@ mRemoveFromOutfitBtn(NULL), mLookObserver(NULL)
mLookItemTypes.push_back(LLLookItemType());
}
// TODO: make these strings translatable
mLookItemTypes[LIT_ALL] = LLLookItemType("All Items", ALL_ITEMS_MASK);
mLookItemTypes[LIT_WEARABLE] = LLLookItemType("Shape & Clothing", WEARABLE_MASK);
mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType("Attachments", ATTACHMENT_MASK);
}
@ -159,10 +155,15 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
BOOL LLPanelOutfitEdit::postBuild()
{
// gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
mLookItemTypes[LIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK);
mLookItemTypes[LIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK);
mLookItemTypes[LIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK);
mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name");
childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL);
childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);
mLookContents = getChild<LLScrollListCtrl>("look_items_list");
mLookContents->sortByColumn("look_item_sort", TRUE);
@ -174,7 +175,7 @@ BOOL LLPanelOutfitEdit::postBuild()
mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
LLComboBox* type_filter = getChild<LLComboBox>("inventory_filter");
LLComboBox* type_filter = getChild<LLComboBox>("filter_wearables_combobox");
type_filter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onTypeFilterChanged, this, _1));
type_filter->removeall();
for (U32 i = 0; i < mLookItemTypes.size(); ++i)
@ -236,6 +237,11 @@ void LLPanelOutfitEdit::showAddWearablesPanel()
childSetVisible("add_wearables_panel", childGetValue("add_btn"));
}
void LLPanelOutfitEdit::showWearablesFilter()
{
childSetVisible("filter_combobox_panel", childGetValue("filter_button"));
}
void LLPanelOutfitEdit::saveOutfit(bool as_new)
{
if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
@ -457,20 +463,18 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView
void LLPanelOutfitEdit::onOutfitItemSelectionChange(void)
{
S32 left_offset = -4;
S32 top_offset = -10;
LLScrollListItem* item = mLookContents->getLastSelectedItem();
if (!item)
return;
LLRect rect = item->getRect();
LLRect btn_rect(
left_offset + rect.mRight - 50,
top_offset + rect.mTop,
left_offset + rect.mRight - 30,
top_offset + rect.mBottom);
LLRect item_rect;
mLookContents->localRectToOtherView(item->getRect(), &item_rect, getChild<LLUICtrl>("outfit_wearables_panel"));
// TODO button(and item list) should be removed (when new widget is ready)
LLRect btn_rect = mEditWearableBtn->getRect();
btn_rect.set(item_rect.mRight - btn_rect.getWidth(), item_rect.mTop, item_rect.mRight, item_rect.mBottom);
mEditWearableBtn->setRect(btn_rect);
mEditWearableBtn->setShape(btn_rect);
mEditWearableBtn->setEnabled(TRUE);
if (!mEditWearableBtn->getVisible())

View File

@ -87,6 +87,7 @@ public:
// only update the location if there is none already available.
void showAddWearablesPanel();
void showWearablesFilter();
void saveOutfit(bool as_new = false);
void showSaveMenu();

View File

@ -163,7 +163,7 @@ LLViewerJoystick::LLViewerJoystick()
memset(mBtn, 0, sizeof(mBtn));
// factor in bandwidth? bandwidth = gViewerStats->mKBitStat
mPerfScale = 4000.f / gSysCPU.getMhz();
mPerfScale = 4000.f / gSysCPU.getMHz(); // hmm. why?
}
// -----------------------------------------------------------------------------

View File

@ -4428,6 +4428,9 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
}
gAgentCamera.setForceMouselook(force_mouselook);
// Forcing turning off flying here to prevent flying after pressing "Stand"
// to stand up from an object. See EXT-1655.
gAgent.setFlying(FALSE);
LLViewerObject* object = gObjectList.findObject(sitObjectID);
if (object)

View File

@ -5644,6 +5644,8 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot);
gPipeline.markMoved(mDrawable, TRUE);
// Notice that removing sitDown() from here causes avatars sitting on
// objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655.
sitDown(TRUE);
mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
mRoot.setPosition(getPosition());

View File

@ -25,6 +25,10 @@
(unknown)
</panel.string>
<!-- Wearables filtering strings -->
<string name="Filter.All" value="All"/>
<string name="Filter.Clothes/Body" value="Clothes/Body"/>
<string name="Filter.Objects" value="Objects"/>
<button
follows="top|left"
@ -154,6 +158,16 @@
sort_column="look_item_sort"
name="look_item_sort" />
</scroll_list>
<!-- TODO remove this button. Added it temporary for QA to be able to test new edit wearable panel (see EXT-6564)-->
<button
follows="left|top|right"
height="20"
label="edit"
left="0"
top="0"
layout="topleft"
name="edit_wearable_btn"
width="40" />
<panel
background_visible="true"
@ -222,29 +236,18 @@
<layout_panel
auto_resize="true"
default_tab_group="3"
height="250"
min_height="120"
height="210"
min_height="210"
name="add_wearables_panel"
width="300"
tab_group="2"
user_resize="true"
visible="false">
<text
follows="top|left|right"
font="SansSerifBold"
height="13"
layout="topleft"
left="5"
name="status"
text_color="LtGray"
top="5"
value="Add Wearables"
use_ellipses="true"
width="275" />
<!-- *NOTE is not used, invisible and disabled -->
<filter_editor
background_image="TextField_Search_Off"
enabled="false"
follows="left|top|right"
font="SansSerif"
label="Filter"
@ -254,13 +257,79 @@
height="20"
name="look_item_filter"
text_color="black"
text_pad_left="25" />
text_pad_left="25"
visible="false"/>
<layout_stack
animate="true"
follows="all"
height="25"
width="300"
layout="topleft"
orientation="horizontal"
name="filter_panels"
top="0"
left="0">
<layout_panel
layout="topleft"
follows="left|top|right"
height="25"
label="IM Control Panel"
name="filter_button_panel"
width="150"
auto_resize="true"
user_resize="false">
<text
follows="top|left|right"
font="SansSerifBold"
height="13"
layout="topleft"
left="5"
name="add_to_outfit_label"
text_color="LtGray"
top="3"
value="Add to Outfit:"
use_ellipses="true"
width="270" />
<button
follows="top|right"
height="20"
image_hover_unselected="Toolbar_Middle_Over"
image_overlay=""
image_selected="Toolbar_Middle_Selected"
image_unselected="Toolbar_Middle_Off"
is_toggle="true"
label="O"
layout="topleft"
right="-1"
name="filter_button"
top="3"
width="20" />
</layout_panel>
<layout_panel
auto_resize="true"
height="25"
min_width="130"
name="filter_combobox_panel"
width="150"
user_resize="false"
visible="false">
<combo_box
follows="top|left|right"
height="20"
layout="topleft"
right="-5"
name="filter_wearables_combobox"
top="0"
width="130"/>
</layout_panel>
</layout_stack>
<inventory_panel
allow_multi_select="false"
border="false"
follows="left|top|right|bottom"
height="176"
height="155"
layout="topleft"
left="0"
mouse_opaque="false"