Merge branch 'master' into DRTVWR-483
commit
67d8dda08c
|
|
@ -348,6 +348,7 @@ Charles Courtois
|
|||
Charlie Sazaland
|
||||
Chaser Zaks
|
||||
BUG-225599
|
||||
BUG-227485
|
||||
Cherry Cheevers
|
||||
ChickyBabes Zuzu
|
||||
Christopher Organiser
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ BOOL LLVorbisDecodeState::initDecode()
|
|||
mWAVBuffer.reserve(size_guess);
|
||||
mWAVBuffer.resize(WAV_HEADER_SIZE);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_WARNS("AudioEngine") << "Out of memory when trying to alloc buffer: " << size_guess << LL_ENDL;
|
||||
delete mInFilep;
|
||||
|
|
|
|||
|
|
@ -195,6 +195,8 @@ namespace
|
|||
|
||||
std::string amd_CPUFamilyName(int composed_family)
|
||||
{
|
||||
// https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures
|
||||
// https://developer.amd.com/resources/developer-guides-manuals/
|
||||
switch(composed_family)
|
||||
{
|
||||
case 4: return "AMD 80486/5x86";
|
||||
|
|
@ -202,6 +204,13 @@ namespace
|
|||
case 6: return "AMD K7";
|
||||
case 0xF: return "AMD K8";
|
||||
case 0x10: return "AMD K8L";
|
||||
case 0x12: return "AMD K10";
|
||||
case 0x14: return "AMD Bobcat";
|
||||
case 0x15: return "AMD Bulldozer";
|
||||
case 0x16: return "AMD Jaguar";
|
||||
case 0x17: return "AMD Zen/Zen+/Zen2";
|
||||
case 0x18: return "AMD Hygon Dhyana";
|
||||
case 0x19: return "AMD Zen 3";
|
||||
}
|
||||
return STRINGIZE("AMD <unknown 0x" << std::hex << composed_family << ">");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2251,7 +2251,7 @@ LLUZipHelper::EZipRresult LLUZipHelper::unzip_llsd(LLSD& data, std::istream& is,
|
|||
return ZR_SIZE_ERROR;
|
||||
}
|
||||
#endif
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
free(result);
|
||||
return ZR_MEM_ERROR;
|
||||
|
|
|
|||
|
|
@ -318,7 +318,7 @@ void HttpService::threadRun(LLCoreInt::HttpThread * thread)
|
|||
{
|
||||
LOG_UNHANDLED_EXCEPTION("");
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LLMemory::logMemoryInfo(TRUE);
|
||||
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ size_t BufferArray::append(const void * src, size_t len)
|
|||
{
|
||||
block = Block::alloc(BLOCK_ALLOC_SIZE);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LLMemory::logMemoryInfo(TRUE);
|
||||
|
||||
|
|
|
|||
|
|
@ -315,7 +315,7 @@ bool LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
|
|||
jpeg_destroy_decompress(&cinfo);
|
||||
}
|
||||
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
setLastError( "Out of memory");
|
||||
jpeg_destroy_decompress(&cinfo);
|
||||
|
|
|
|||
|
|
@ -210,7 +210,7 @@ BOOL LLPngWrapper::readPng(U8* src, S32 dataSize, LLImageRaw* rawImage, ImageInf
|
|||
releaseResources();
|
||||
return (FALSE);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
mErrorMessage = "LLPngWrapper";
|
||||
releaseResources();
|
||||
|
|
|
|||
|
|
@ -2399,9 +2399,9 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
|||
{ //face has no geometry, continue
|
||||
face.resizeIndices(3);
|
||||
face.resizeVertices(1);
|
||||
memset(face.mPositions, 0, sizeof(LLVector4a));
|
||||
memset(face.mNormals, 0, sizeof(LLVector4a));
|
||||
memset(face.mTexCoords, 0, sizeof(LLVector2));
|
||||
face.mPositions->clear();
|
||||
face.mNormals->clear();
|
||||
face.mTexCoords->setZero();
|
||||
memset(face.mIndices, 0, sizeof(U16)*3);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2489,7 +2489,11 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
|||
}
|
||||
else
|
||||
{
|
||||
memset(norm_out, 0, sizeof(LLVector4a)*num_verts);
|
||||
for (U32 j = 0; j < num_verts; ++j)
|
||||
{
|
||||
norm_out->clear();
|
||||
norm_out++; // or just norm_out[j].clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2519,7 +2523,11 @@ bool LLVolume::unpackVolumeFaces(std::istream& is, S32 size)
|
|||
}
|
||||
else
|
||||
{
|
||||
memset(tc_out, 0, sizeof(LLVector2)*num_verts);
|
||||
for (U32 j = 0; j < num_verts; j += 2)
|
||||
{
|
||||
tc_out->clear();
|
||||
tc_out++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -5288,7 +5296,7 @@ bool LLVolumeFace::cacheOptimize()
|
|||
triangle_data.resize(mNumIndices / 3);
|
||||
vertex_data.resize(mNumVertices);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LL_WARNS("LLVOLUME") << "Resize failed" << LL_ENDL;
|
||||
return false;
|
||||
|
|
@ -5442,7 +5450,7 @@ bool LLVolumeFace::cacheOptimize()
|
|||
{
|
||||
new_idx.resize(mNumVertices, -1);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
ll_aligned_free<64>(pos);
|
||||
ll_aligned_free_16(wght);
|
||||
|
|
@ -6968,11 +6976,16 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe
|
|||
{
|
||||
//LLVector4a *tan1 = new LLVector4a[vertexCount * 2];
|
||||
LLVector4a* tan1 = (LLVector4a*) ll_aligned_malloc_16(vertexCount*2*sizeof(LLVector4a));
|
||||
// new(tan1) LLVector4a;
|
||||
|
||||
LLVector4a* tan2 = tan1 + vertexCount;
|
||||
|
||||
memset(tan1, 0, vertexCount*2*sizeof(LLVector4a));
|
||||
|
||||
U32 count = vertexCount * 2;
|
||||
for (U32 i = 0; i < count; i++)
|
||||
{
|
||||
tan1[i].clear();
|
||||
}
|
||||
|
||||
for (U32 a = 0; a < triangleCount; a++)
|
||||
{
|
||||
U32 i1 = *index_array++;
|
||||
|
|
|
|||
|
|
@ -597,7 +597,7 @@ LLSD HttpCoroJSONHandler::handleSuccess(LLCore::HttpResponse * response, LLCore:
|
|||
{
|
||||
bas >> jsonRoot;
|
||||
}
|
||||
catch (std::runtime_error e)
|
||||
catch (std::runtime_error& e)
|
||||
{ // deserialization failed. Record the reason and pass back an empty map for markup.
|
||||
status = LLCore::HttpStatus(499, std::string(e.what()));
|
||||
return result;
|
||||
|
|
@ -625,7 +625,7 @@ LLSD HttpCoroJSONHandler::parseBody(LLCore::HttpResponse *response, bool &succes
|
|||
{
|
||||
bas >> jsonRoot;
|
||||
}
|
||||
catch (std::runtime_error e)
|
||||
catch (std::runtime_error&)
|
||||
{
|
||||
success = false;
|
||||
return LLSD();
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ void LLHTTPNode::get(LLHTTPNode::ResponsePtr response, const LLSD& context) cons
|
|||
{
|
||||
response->result(simpleGet());
|
||||
}
|
||||
catch (NotImplemented)
|
||||
catch (NotImplemented&)
|
||||
{
|
||||
response->methodNotAllowed();
|
||||
}
|
||||
|
|
@ -138,7 +138,7 @@ void LLHTTPNode::put(LLHTTPNode::ResponsePtr response, const LLSD& context, cons
|
|||
{
|
||||
response->result(simplePut(input));
|
||||
}
|
||||
catch (NotImplemented)
|
||||
catch (NotImplemented&)
|
||||
{
|
||||
response->methodNotAllowed();
|
||||
}
|
||||
|
|
@ -151,7 +151,7 @@ void LLHTTPNode::post(LLHTTPNode::ResponsePtr response, const LLSD& context, con
|
|||
{
|
||||
response->result(simplePost(input));
|
||||
}
|
||||
catch (NotImplemented)
|
||||
catch (NotImplemented&)
|
||||
{
|
||||
response->methodNotAllowed();
|
||||
}
|
||||
|
|
@ -164,7 +164,7 @@ void LLHTTPNode::del(LLHTTPNode::ResponsePtr response, const LLSD& context) cons
|
|||
{
|
||||
response->result(simpleDel(context));
|
||||
}
|
||||
catch (NotImplemented)
|
||||
catch (NotImplemented&)
|
||||
{
|
||||
response->methodNotAllowed();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -50,6 +50,10 @@
|
|||
#include "llglheaders.h"
|
||||
#include "llglslshader.h"
|
||||
|
||||
#if LL_WINDOWS
|
||||
#include "lldxhardware.h"
|
||||
#endif
|
||||
|
||||
#ifdef _DEBUG
|
||||
//#define GL_STATE_VERIFY
|
||||
#endif
|
||||
|
|
@ -395,6 +399,8 @@ PFNGLGETACTIVEATTRIBARBPROC glGetActiveAttribARB = NULL;
|
|||
PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB = NULL;
|
||||
|
||||
#if LL_WINDOWS
|
||||
PFNWGLGETGPUIDSAMDPROC wglGetGPUIDsAMD = NULL;
|
||||
PFNWGLGETGPUINFOAMDPROC wglGetGPUInfoAMD = NULL;
|
||||
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = NULL;
|
||||
#endif
|
||||
|
||||
|
|
@ -414,6 +420,7 @@ LLGLManager::LLGLManager() :
|
|||
|
||||
mHasMultitexture(FALSE),
|
||||
mHasATIMemInfo(FALSE),
|
||||
mHasAMDAssociations(FALSE),
|
||||
mHasNVXMemInfo(FALSE),
|
||||
mNumTextureUnits(1),
|
||||
mHasMipMapGeneration(FALSE),
|
||||
|
|
@ -498,7 +505,16 @@ void LLGLManager::initWGL()
|
|||
{
|
||||
LL_WARNS("RenderInit") << "No ARB create context extensions" << LL_ENDL;
|
||||
}
|
||||
|
||||
|
||||
// For retreiving information per AMD adapter,
|
||||
// because we can't trust curently selected/default one when there are multiple
|
||||
mHasAMDAssociations = ExtensionExists("WGL_AMD_gpu_association", gGLHExts.mSysExts);
|
||||
if (mHasAMDAssociations)
|
||||
{
|
||||
GLH_EXT_NAME(wglGetGPUIDsAMD) = (PFNWGLGETGPUIDSAMDPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetGPUIDsAMD");
|
||||
GLH_EXT_NAME(wglGetGPUInfoAMD) = (PFNWGLGETGPUINFOAMDPROC)GLH_EXT_GET_PROC_ADDRESS("wglGetGPUInfoAMD");
|
||||
}
|
||||
|
||||
if (ExtensionExists("WGL_EXT_swap_control", gGLHExts.mSysExts))
|
||||
{
|
||||
GLH_EXT_NAME(wglSwapIntervalEXT) = (PFNWGLSWAPINTERVALEXTPROC)GLH_EXT_GET_PROC_ADDRESS("wglSwapIntervalEXT");
|
||||
|
|
@ -684,23 +700,78 @@ bool LLGLManager::initGL()
|
|||
stop_glerror();
|
||||
|
||||
S32 old_vram = mVRAM;
|
||||
mVRAM = 0;
|
||||
|
||||
if (mHasATIMemInfo)
|
||||
#if LL_WINDOWS
|
||||
if (mHasAMDAssociations)
|
||||
{
|
||||
GLuint gl_gpus_count = wglGetGPUIDsAMD(0, 0);
|
||||
if (gl_gpus_count > 0)
|
||||
{
|
||||
GLuint* ids = new GLuint[gl_gpus_count];
|
||||
wglGetGPUIDsAMD(gl_gpus_count, ids);
|
||||
|
||||
GLuint mem_mb = 0;
|
||||
for (U32 i = 0; i < gl_gpus_count; i++)
|
||||
{
|
||||
wglGetGPUInfoAMD(ids[i],
|
||||
WGL_GPU_RAM_AMD,
|
||||
GL_UNSIGNED_INT,
|
||||
sizeof(GLuint),
|
||||
&mem_mb);
|
||||
if (mVRAM < mem_mb)
|
||||
{
|
||||
// basically pick the best AMD and trust driver/OS to know to switch
|
||||
mVRAM = mem_mb;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (mVRAM != 0)
|
||||
{
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (AMDAssociations):" << mVRAM << LL_ENDL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mHasATIMemInfo && mVRAM == 0)
|
||||
{ //ask the gl how much vram is free at startup and attempt to use no more than half of that
|
||||
S32 meminfo[4];
|
||||
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
|
||||
|
||||
mVRAM = meminfo[0]/1024;
|
||||
mVRAM = meminfo[0] / 1024;
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (ATIMemInfo):" << mVRAM << LL_ENDL;
|
||||
}
|
||||
else if (mHasNVXMemInfo)
|
||||
|
||||
if (mHasNVXMemInfo && mVRAM == 0)
|
||||
{
|
||||
S32 dedicated_memory;
|
||||
glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
|
||||
mVRAM = dedicated_memory/1024;
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (NVXMemInfo):" << mVRAM << LL_ENDL;
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (mVRAM < 256)
|
||||
{ //something likely went wrong using the above extensions, fall back to old method
|
||||
{
|
||||
// Something likely went wrong using the above extensions
|
||||
// try WMI first and fall back to old method (from dxdiag) if all else fails
|
||||
// Function will check all GPUs WMI knows of and will pick up the one with most
|
||||
// memory. We need to check all GPUs because system can switch active GPU to
|
||||
// weaker one, to preserve power when not under load.
|
||||
S32 mem = LLDXHardware::getMBVideoMemoryViaWMI();
|
||||
if (mem != 0)
|
||||
{
|
||||
mVRAM = mem;
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (WMI):" << mVRAM<< LL_ENDL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mVRAM < 256 && old_vram > 0)
|
||||
{
|
||||
// fall back to old method
|
||||
// Note: on Windows value will be from LLDXHardware.
|
||||
// Either received via dxdiag or via WMI by id from dxdiag.
|
||||
mVRAM = old_vram;
|
||||
}
|
||||
|
||||
|
|
@ -962,7 +1033,7 @@ void LLGLManager::initExtensions()
|
|||
mHasTextureRectangle = FALSE;
|
||||
#else // LL_MESA_HEADLESS //important, gGLHExts.mSysExts is uninitialized until after glh_init_extensions is called
|
||||
mHasMultitexture = glh_init_extensions("GL_ARB_multitexture");
|
||||
mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts);
|
||||
mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts); //Basic AMD method, also see mHasAMDAssociations
|
||||
mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts);
|
||||
mHasSeparateSpecularColor = glh_init_extensions("GL_EXT_separate_specular_color");
|
||||
mHasAnisotropic = glh_init_extensions("GL_EXT_texture_filter_anisotropic");
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@ public:
|
|||
// Extensions used by everyone
|
||||
BOOL mHasMultitexture;
|
||||
BOOL mHasATIMemInfo;
|
||||
BOOL mHasAMDAssociations;
|
||||
BOOL mHasNVXMemInfo;
|
||||
S32 mNumTextureUnits;
|
||||
BOOL mHasMipMapGeneration;
|
||||
|
|
|
|||
|
|
@ -618,6 +618,8 @@ extern PFNGLVARIANTARRAYOBJECTATIPROC glVariantObjectArrayATI;
|
|||
extern PFNGLGETVARIANTARRAYOBJECTFVATIPROC glGetVariantArrayObjectfvATI;
|
||||
extern PFNGLGETVARIANTARRAYOBJECTIVATIPROC glGetVariantArrayObjectivATI;
|
||||
|
||||
extern PFNWGLGETGPUIDSAMDPROC wglGetGPUIDsAMD;
|
||||
extern PFNWGLGETGPUINFOAMDPROC wglGetGPUInfoAMD;
|
||||
extern PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
|
||||
|
||||
// GL_ARB_occlusion_query
|
||||
|
|
|
|||
|
|
@ -36,6 +36,11 @@
|
|||
|
||||
#include <boost/regex.hpp>
|
||||
|
||||
#if LL_WINDOWS
|
||||
// because something pulls in window and lldxdiag dependencies which in turn need wbemuuid.lib
|
||||
#pragma comment(lib, "wbemuuid.lib")
|
||||
#endif
|
||||
|
||||
|
||||
// namespace LLExperienceCache
|
||||
// {
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ typedef BOOL ( WINAPI* PfnCoSetProxyBlanket )( IUnknown* pProxy, DWORD dwAuthnSv
|
|||
OLECHAR* pServerPrincName, DWORD dwAuthnLevel, DWORD dwImpLevel,
|
||||
RPC_AUTH_IDENTITY_HANDLE pAuthInfo, DWORD dwCapabilities );
|
||||
|
||||
HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
|
||||
HRESULT GetVideoMemoryViaWMI(WCHAR* strInputDeviceID, DWORD* pdwAdapterRam)
|
||||
{
|
||||
HRESULT hr;
|
||||
bool bGotMemory = false;
|
||||
|
|
@ -149,21 +149,26 @@ HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
|
|||
if ( !pVideoControllers[iController] )
|
||||
continue;
|
||||
|
||||
pPropName = SysAllocString( L"PNPDeviceID" );
|
||||
hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) )
|
||||
wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
if( SUCCEEDED( hr ) )
|
||||
// if strInputDeviceID is set find this specific device and return memory or specific device
|
||||
// if strInputDeviceID is not set return the best device
|
||||
if (strInputDeviceID)
|
||||
{
|
||||
if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
|
||||
bFound = true;
|
||||
pPropName = SysAllocString( L"PNPDeviceID" );
|
||||
hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
|
||||
#ifdef PRINTF_DEBUGGING
|
||||
if( FAILED( hr ) )
|
||||
wprintf( L"WMI: pVideoControllers[iController]->Get PNPDeviceID failed: 0x%0.8x\n", hr );
|
||||
#endif
|
||||
if( SUCCEEDED( hr ) && strInputDeviceID)
|
||||
{
|
||||
if( wcsstr( var.bstrVal, strInputDeviceID ) != 0 )
|
||||
bFound = true;
|
||||
}
|
||||
VariantClear( &var );
|
||||
if( pPropName ) SysFreeString( pPropName );
|
||||
}
|
||||
VariantClear( &var );
|
||||
if( pPropName ) SysFreeString( pPropName );
|
||||
|
||||
if( bFound )
|
||||
if( bFound || !strInputDeviceID )
|
||||
{
|
||||
pPropName = SysAllocString( L"AdapterRAM" );
|
||||
hr = pVideoControllers[iController]->Get( pPropName, 0L, &var, nullptr, nullptr );
|
||||
|
|
@ -175,13 +180,18 @@ HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
|
|||
if( SUCCEEDED( hr ) )
|
||||
{
|
||||
bGotMemory = true;
|
||||
*pdwAdapterRam = var.ulVal;
|
||||
*pdwAdapterRam = llmax(var.ulVal, *pdwAdapterRam);
|
||||
}
|
||||
VariantClear( &var );
|
||||
if( pPropName ) SysFreeString( pPropName );
|
||||
}
|
||||
|
||||
SAFE_RELEASE( pVideoControllers[iController] );
|
||||
|
||||
if (bFound)
|
||||
{
|
||||
break;
|
||||
}
|
||||
SAFE_RELEASE( pVideoControllers[iController] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -207,6 +217,17 @@ HRESULT GetVideoMemoryViaWMI( WCHAR* strInputDeviceID, DWORD* pdwAdapterRam )
|
|||
return E_FAIL;
|
||||
}
|
||||
|
||||
//static
|
||||
S32 LLDXHardware::getMBVideoMemoryViaWMI()
|
||||
{
|
||||
DWORD vram = 0;
|
||||
if (SUCCEEDED(GetVideoMemoryViaWMI(NULL, &vram)))
|
||||
{
|
||||
return vram / (1024 * 1024);;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Getting the version of graphics controller driver via WMI
|
||||
std::string LLDXHardware::getDriverVersionWMI()
|
||||
{
|
||||
|
|
@ -615,6 +636,8 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
|
|||
IDxDiagContainer *driver_containerp = NULL;
|
||||
DWORD dw_device_count;
|
||||
|
||||
mVRAM = 0;
|
||||
|
||||
// CoCreate a IDxDiagProvider*
|
||||
LL_DEBUGS("AppInit") << "CoCreateInstance IID_IDxDiagProvider" << LL_ENDL;
|
||||
hr = CoCreateInstance(CLSID_DxDiagProvider,
|
||||
|
|
@ -677,6 +700,8 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
|
|||
}
|
||||
|
||||
// Get device 0
|
||||
// By default 0 device is the primary one, howhever in case of various hybrid graphics
|
||||
// like itegrated AMD and PCI AMD GPUs system might switch.
|
||||
LL_DEBUGS("AppInit") << "devices_containerp->GetChildContainer" << LL_ENDL;
|
||||
hr = devices_containerp->GetChildContainer(L"0", &device_containerp);
|
||||
if(FAILED(hr) || !device_containerp)
|
||||
|
|
@ -689,12 +714,27 @@ BOOL LLDXHardware::getInfo(BOOL vram_only)
|
|||
WCHAR deviceID[512];
|
||||
|
||||
get_wstring(device_containerp, L"szDeviceID", deviceID, 512);
|
||||
|
||||
// Example: searches id like 1F06 in pnp string (aka VEN_10DE&DEV_1F06)
|
||||
// doesn't seem to work on some systems since format is unrecognizable
|
||||
// but in such case keyDeviceID works
|
||||
if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID, &vram)))
|
||||
{
|
||||
mVRAM = vram/(1024*1024);
|
||||
}
|
||||
else
|
||||
{
|
||||
get_wstring(device_containerp, L"szKeyDeviceID", deviceID, 512);
|
||||
LL_WARNS() << "szDeviceID" << deviceID << LL_ENDL;
|
||||
// '+9' to avoid ENUM\\PCI\\ prefix
|
||||
// Returns string like Enum\\PCI\\VEN_10DE&DEV_1F06&SUBSYS...
|
||||
// and since GetVideoMemoryViaWMI searches by PNPDeviceID it is sufficient
|
||||
if (SUCCEEDED(GetVideoMemoryViaWMI(deviceID + 9, &vram)))
|
||||
{
|
||||
mVRAM = vram / (1024 * 1024);
|
||||
}
|
||||
}
|
||||
|
||||
if (mVRAM == 0)
|
||||
{ // Get the English VRAM string
|
||||
std::string ram_str = get_string(device_containerp, L"szDisplayMemoryEnglish");
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,10 @@ public:
|
|||
|
||||
LLSD getDisplayInfo();
|
||||
|
||||
// Will get memory of best GPU in MB, return memory on sucsess, 0 on failure
|
||||
// Note: WMI is not accurate in some cases
|
||||
static S32 getMBVideoMemoryViaWMI();
|
||||
|
||||
// Find a particular device that matches the following specs.
|
||||
// Empty strings indicate that you don't care.
|
||||
// You can separate multiple devices with '|' chars to indicate you want
|
||||
|
|
|
|||
|
|
@ -741,17 +741,27 @@ void LLWindowWin32::restore()
|
|||
SetFocus(mWindowHandle);
|
||||
}
|
||||
|
||||
// See SL-12170
|
||||
// According to callstack "c0000005 Access violation" happened inside __try block,
|
||||
// deep in DestroyWindow and crashed viewer, which shouldn't be possible.
|
||||
// I tried manually causing this exception and it was caught without issues, so
|
||||
// I'm turning off optimizations for this part to be sure code executes as intended
|
||||
// (it is a straw, but I have no idea why else __try can get overruled)
|
||||
#pragma optimize("", off)
|
||||
bool destroy_window_handler(HWND &hWnd)
|
||||
{
|
||||
bool res;
|
||||
__try
|
||||
{
|
||||
return DestroyWindow(hWnd);
|
||||
res = DestroyWindow(hWnd);
|
||||
}
|
||||
__except (EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
return false;
|
||||
res = false;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
#pragma optimize("", on)
|
||||
|
||||
// close() destroys all OS-specific code associated with a window.
|
||||
// Usually called from LLWindowManager::destroyWindow()
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.4.1
|
||||
6.4.2
|
||||
|
|
|
|||
|
|
@ -2036,6 +2036,14 @@ U8 LLAgent::getRenderState()
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLAgent::endAnimationUpdateUI()
|
||||
{
|
||||
if (LLApp::isExiting()
|
||||
|| !gViewerWindow
|
||||
|| !gMenuBarView
|
||||
|| !gToolBarView
|
||||
|| !gStatusBar)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode())
|
||||
{
|
||||
// We're already done endAnimationUpdateUI for this transition.
|
||||
|
|
|
|||
|
|
@ -282,6 +282,11 @@ LLAgentCamera::~LLAgentCamera()
|
|||
//-----------------------------------------------------------------------------
|
||||
void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
|
||||
{
|
||||
if (gDisconnected)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (gAgent.getAutoPilot())
|
||||
{
|
||||
gAgent.stopAutoPilot(TRUE);
|
||||
|
|
|
|||
|
|
@ -62,7 +62,9 @@
|
|||
#include "llallocator.h"
|
||||
#include "llcalc.h"
|
||||
#include "llconversationlog.h"
|
||||
#if LL_WINDOWS
|
||||
#include "lldxhardware.h"
|
||||
#endif
|
||||
#include "lltexturestats.h"
|
||||
#include "lltrace.h"
|
||||
#include "lltracethreadrecorder.h"
|
||||
|
|
@ -1134,7 +1136,7 @@ bool LLAppViewer::init()
|
|||
try {
|
||||
initializeSecHandler();
|
||||
}
|
||||
catch (LLProtectedDataException ex)
|
||||
catch (LLProtectedDataException&)
|
||||
{
|
||||
LLNotificationsUtil::add("CorruptedProtectedDataStore");
|
||||
}
|
||||
|
|
@ -1348,7 +1350,7 @@ bool LLAppViewer::frame()
|
|||
{
|
||||
LOG_UNHANDLED_EXCEPTION("");
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
LLMemory::logMemoryInfo(TRUE);
|
||||
LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
|
||||
|
|
@ -1717,6 +1719,11 @@ bool LLAppViewer::cleanup()
|
|||
disconnectViewer();
|
||||
|
||||
LL_INFOS() << "Viewer disconnected" << LL_ENDL;
|
||||
|
||||
if (gKeyboard)
|
||||
{
|
||||
gKeyboard->resetKeys();
|
||||
}
|
||||
|
||||
display_cleanup();
|
||||
|
||||
|
|
@ -3995,7 +4002,10 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
|
|||
|
||||
void LLAppViewer::userQuit()
|
||||
{
|
||||
if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
|
||||
if (gDisconnected
|
||||
|| !gViewerWindow
|
||||
|| !gViewerWindow->getProgressView()
|
||||
|| gViewerWindow->getProgressView()->getVisible())
|
||||
{
|
||||
requestQuit();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2800,7 +2800,7 @@ void LLEnvironment::loadSkyWaterFromSettings(const LLSD &env_data, bool &valid,
|
|||
}
|
||||
else if (env_data.has("sky_llsd"))
|
||||
{
|
||||
LLSettingsSky::ptr_t sky = std::make_shared<LLSettingsVOSky>(env_data["sky_llsd"]);
|
||||
LLSettingsSky::ptr_t sky = LLSettingsVOSky::buildSky(env_data["sky_llsd"]);
|
||||
setEnvironment(ENV_LOCAL, sky);
|
||||
valid = true;
|
||||
}
|
||||
|
|
@ -2814,7 +2814,7 @@ void LLEnvironment::loadSkyWaterFromSettings(const LLSD &env_data, bool &valid,
|
|||
}
|
||||
else if (env_data.has("water_llsd"))
|
||||
{
|
||||
LLSettingsWater::ptr_t sky = std::make_shared<LLSettingsVOWater>(env_data["water_llsd"]);
|
||||
LLSettingsWater::ptr_t sky = LLSettingsVOWater::buildWater(env_data["water_llsd"]);
|
||||
setEnvironment(ENV_LOCAL, sky);
|
||||
valid = true;
|
||||
}
|
||||
|
|
@ -2899,8 +2899,8 @@ bool LLEnvironment::loadFromSettings()
|
|||
{
|
||||
S32 length = env_data["day_length"].asInteger();
|
||||
S32 offset = env_data["day_offset"].asInteger();
|
||||
LLSettingsDay::ptr_t day = std::make_shared<LLSettingsVODay>(env_data["day_llsd"]);
|
||||
setEnvironment(ENV_LOCAL, day, LLSettingsDay::Seconds(length), LLSettingsDay::Seconds(offset));
|
||||
LLSettingsDay::ptr_t pday = LLSettingsVODay::buildDay(env_data["day_llsd"]);
|
||||
setEnvironment(ENV_LOCAL, pday, LLSettingsDay::Seconds(length), LLSettingsDay::Seconds(offset));
|
||||
valid = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -110,7 +110,7 @@ void LLFloaterEvent::setEventID(const U32 event_id)
|
|||
// get the search URL and expand all of the substitutions
|
||||
// (also adds things like [LANGUAGE], [VERSION], [OS], etc.)
|
||||
std::ostringstream url;
|
||||
url << gSavedSettings.getString("EventURL") << event_id << "/" << std::endl;
|
||||
url << gSavedSettings.getString("EventURL") << event_id << std::endl;
|
||||
// and load the URL in the web view
|
||||
mBrowser->navigateTo(url.str());
|
||||
|
||||
|
|
|
|||
|
|
@ -1579,7 +1579,7 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
|
|||
|
||||
std::vector<U8> data;
|
||||
S32 binary_bucket_size = 0;
|
||||
LLHost sender = gAgent.getRegion()->getHost();
|
||||
LLHost sender = gAgent.getRegionHost();
|
||||
|
||||
LLSD::array_iterator i = messages.beginArray();
|
||||
LLSD::array_iterator iEnd = messages.endArray();
|
||||
|
|
|
|||
|
|
@ -1809,7 +1809,7 @@ void LLItemBridge::restoreToWorld()
|
|||
|
||||
msg->nextBlockFast(_PREHASH_InventoryData);
|
||||
itemp->packMessage(msg);
|
||||
msg->sendReliable(gAgent.getRegion()->getHost());
|
||||
msg->sendReliable(gAgent.getRegionHost());
|
||||
|
||||
//remove local inventory copy, sim will deal with permissions and removing the item
|
||||
//from the actual inventory if its a no-copy etc
|
||||
|
|
|
|||
|
|
@ -1888,7 +1888,7 @@ EMeshProcessingResult LLMeshRepoThread::lodReceived(const LLVolumeParams& mesh_p
|
|||
std::string mesh_string((char*)data, data_size);
|
||||
stream.str(mesh_string);
|
||||
}
|
||||
catch (std::bad_alloc)
|
||||
catch (std::bad_alloc&)
|
||||
{
|
||||
// out of memory, we won't be able to process this mesh
|
||||
return MESH_OUT_OF_MEMORY;
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LL
|
|||
LLSINGLETON_EMPTY_CTOR(LLRecentPeople);
|
||||
LOG_CLASS(LLRecentPeople);
|
||||
public:
|
||||
typedef std::map <LLUUID, F32> id_to_time_map_t;
|
||||
typedef std::map <LLUUID, F64> id_to_time_map_t;
|
||||
typedef boost::signals2::signal<void ()> signal_t;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ void initializeSecHandler()
|
|||
{
|
||||
handler->init();
|
||||
}
|
||||
catch (LLProtectedDataException e)
|
||||
catch (LLProtectedDataException& e)
|
||||
{
|
||||
exception_msg = e.what();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -158,6 +158,9 @@ class LLSettingsVODay : public LLSettingsDay
|
|||
public:
|
||||
typedef std::function<void(LLSettingsDay::ptr_t day)> asset_built_fn;
|
||||
|
||||
// Todo: find a way to make this cnstructor private
|
||||
// It shouldn't be used outside shared_prt and LLSettingsVODay
|
||||
// outside of settings only use buildDay(settings)
|
||||
LLSettingsVODay(const LLSD &data);
|
||||
|
||||
static ptr_t buildDay(LLSD settings);
|
||||
|
|
|
|||
|
|
@ -1879,8 +1879,7 @@ bool idle_startup()
|
|||
|
||||
display_startup();
|
||||
|
||||
// Load stored local environment if needed. Only should be done once at least
|
||||
// initial region data got loaded to avoid race condition with region's environment
|
||||
// Load stored local environment if needed.
|
||||
LLEnvironment::instance().loadFromSettings();
|
||||
|
||||
// *TODO : Uncomment that line once the whole grid migrated to SLM and suppress it from LLAgent::handleTeleportFinished() (llagent.cpp)
|
||||
|
|
|
|||
|
|
@ -986,6 +986,11 @@ EKeyboardMode LLViewerKeyboard::getMode()
|
|||
// Called from scanKeyboard.
|
||||
void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level)
|
||||
{
|
||||
if (LLApp::isExiting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 mode = getMode();
|
||||
// Consider keyboard scanning as NOT mouse event. JC
|
||||
MASK mask = gKeyboard->currentMask(FALSE);
|
||||
|
|
|
|||
|
|
@ -1385,8 +1385,6 @@ S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, fl
|
|||
{
|
||||
max_texmem = (S32Megabytes)128;
|
||||
}
|
||||
|
||||
LL_WARNS() << "VRAM amount not detected, defaulting to " << max_texmem << " MB" << LL_ENDL;
|
||||
}
|
||||
|
||||
S32Megabytes system_ram = gSysMemory.getPhysicalMemoryKB(); // In MB
|
||||
|
|
@ -1428,6 +1426,11 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem)
|
|||
return; //listener will re-enter this function
|
||||
}
|
||||
|
||||
if (gGLManager.mVRAM == 0)
|
||||
{
|
||||
LL_WARNS() << "VRAM amount not detected, defaulting to " << mem << " MB" << LL_ENDL;
|
||||
}
|
||||
|
||||
// TODO: set available resident texture mem based on use by other subsystems
|
||||
// currently max(12MB, VRAM/4) assumed...
|
||||
|
||||
|
|
|
|||
|
|
@ -2008,6 +2008,11 @@ void LLViewerWindow::initBase()
|
|||
LLPanel* panel_holder = main_view->getChild<LLPanel>("toolbar_view_holder");
|
||||
// Load the toolbar view from file
|
||||
gToolBarView = LLUICtrlFactory::getInstance()->createFromFile<LLToolBarView>("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance());
|
||||
if (!gToolBarView)
|
||||
{
|
||||
LL_ERRS() << "Failed to initialize viewer: Viewer couldn't process file panel_toolbar_view.xml, "
|
||||
<< "if this problem happens again, please validate your installation." << LL_ENDL;
|
||||
}
|
||||
gToolBarView->setShape(panel_holder->getLocalRect());
|
||||
// Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI())
|
||||
gToolBarView->setVisible(FALSE);
|
||||
|
|
@ -2893,7 +2898,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
|
|||
// If "Pressing letter keys starts local chat" option is selected, we are not in mouselook,
|
||||
// no view has keyboard focus, this is a printable character key (and no modifier key is
|
||||
// pressed except shift), then give focus to nearby chat (STORM-560)
|
||||
if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&
|
||||
if ( LLStartUp::getStartupState() >= STATE_STARTED &&
|
||||
gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() &&
|
||||
!keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) )
|
||||
{
|
||||
// Initialize nearby chat if it's missing
|
||||
|
|
|
|||
|
|
@ -198,6 +198,8 @@ const F32 NAMETAG_VERT_OFFSET_WEIGHT = 0.17f;
|
|||
const U32 LLVOAvatar::VISUAL_COMPLEXITY_UNKNOWN = 0;
|
||||
const F64 HUD_OVERSIZED_TEXTURE_DATA_SIZE = 1024 * 1024;
|
||||
|
||||
const F32 MAX_TEXTURE_WAIT_TIME_SEC = 60;
|
||||
|
||||
enum ERenderName
|
||||
{
|
||||
RENDER_NAME_NEVER,
|
||||
|
|
@ -664,6 +666,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
|
|||
mFullyLoadedInitialized(FALSE),
|
||||
mVisualComplexity(VISUAL_COMPLEXITY_UNKNOWN),
|
||||
mLoadedCallbacksPaused(FALSE),
|
||||
mLoadedCallbackTextures(0),
|
||||
mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)),
|
||||
mLastRezzedStatus(-1),
|
||||
mIsEditingAppearance(FALSE),
|
||||
|
|
@ -884,8 +887,9 @@ BOOL LLVOAvatar::hasGray() const
|
|||
S32 LLVOAvatar::getRezzedStatus() const
|
||||
{
|
||||
if (getIsCloud()) return 0;
|
||||
if (isFullyTextured() && allBakedTexturesCompletelyDownloaded()) return 3;
|
||||
if (isFullyTextured()) return 2;
|
||||
bool textured = isFullyTextured();
|
||||
if (textured && allBakedTexturesCompletelyDownloaded()) return 3;
|
||||
if (textured) return 2;
|
||||
llassert(hasGray());
|
||||
return 1; // gray
|
||||
}
|
||||
|
|
@ -4807,6 +4811,15 @@ U32 LLVOAvatar::renderSkinned()
|
|||
BOOL first_pass = TRUE;
|
||||
if (!LLDrawPoolAvatar::sSkipOpaque)
|
||||
{
|
||||
if (isUIAvatar() && mIsDummy)
|
||||
{
|
||||
LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR);
|
||||
if (hair_mesh)
|
||||
{
|
||||
num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
|
||||
{
|
||||
if (isTextureVisible(TEX_HEAD_BAKED) || isUIAvatar())
|
||||
|
|
@ -4814,7 +4827,7 @@ U32 LLVOAvatar::renderSkinned()
|
|||
LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD);
|
||||
if (head_mesh)
|
||||
{
|
||||
num_indices += head_mesh->render(mAdjustedPixelArea, TRUE, mIsDummy);
|
||||
num_indices += head_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy);
|
||||
}
|
||||
first_pass = FALSE;
|
||||
}
|
||||
|
|
@ -5321,12 +5334,28 @@ void LLVOAvatar::checkTextureLoading()
|
|||
}
|
||||
if(mLoadedCallbacksPaused == pause)
|
||||
{
|
||||
if (!pause && mFirstFullyVisible && mLoadedCallbackTextures < mCallbackTextureList.size())
|
||||
{
|
||||
// We still need to update 'loaded' textures count to decide on 'cloud' visibility
|
||||
// Alternatively this can be done on TextureLoaded callbacks, but is harder to properly track
|
||||
mLoadedCallbackTextures = 0;
|
||||
for (LLLoadedCallbackEntry::source_callback_list_t::iterator iter = mCallbackTextureList.begin();
|
||||
iter != mCallbackTextureList.end(); ++iter)
|
||||
{
|
||||
LLViewerFetchedTexture* tex = gTextureList.findImage(*iter);
|
||||
if (tex && (tex->getDiscardLevel() >= 0 || tex->isMissingAsset()))
|
||||
{
|
||||
mLoadedCallbackTextures++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ;
|
||||
}
|
||||
|
||||
if(mCallbackTextureList.empty()) //when is self or no callbacks. Note: this list for self is always empty.
|
||||
{
|
||||
mLoadedCallbacksPaused = pause ;
|
||||
mLoadedCallbackTextures = 0;
|
||||
return ; //nothing to check.
|
||||
}
|
||||
|
||||
|
|
@ -5334,7 +5363,9 @@ void LLVOAvatar::checkTextureLoading()
|
|||
{
|
||||
return ; //have not been invisible for enough time.
|
||||
}
|
||||
|
||||
|
||||
mLoadedCallbackTextures = pause ? mCallbackTextureList.size() : 0;
|
||||
|
||||
for(LLLoadedCallbackEntry::source_callback_list_t::iterator iter = mCallbackTextureList.begin();
|
||||
iter != mCallbackTextureList.end(); ++iter)
|
||||
{
|
||||
|
|
@ -5355,9 +5386,15 @@ void LLVOAvatar::checkTextureLoading()
|
|||
|
||||
tex->unpauseLoadedCallbacks(&mCallbackTextureList) ;
|
||||
tex->addTextureStats(START_AREA); //jump start the fetching again
|
||||
|
||||
// technically shouldn't need to account for missing, but callback might not have happened yet
|
||||
if (tex->getDiscardLevel() >= 0 || tex->isMissingAsset())
|
||||
{
|
||||
mLoadedCallbackTextures++; // consider it loaded (we have at least some data)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!pause)
|
||||
{
|
||||
|
|
@ -7591,14 +7628,13 @@ bool LLVOAvatar::getIsCloud() const
|
|||
);
|
||||
}
|
||||
|
||||
void LLVOAvatar::updateRezzedStatusTimers()
|
||||
void LLVOAvatar::updateRezzedStatusTimers(S32 rez_status)
|
||||
{
|
||||
// State machine for rezzed status. Statuses are -1 on startup, 0
|
||||
// = cloud, 1 = gray, 2 = downloading, 3 = full.
|
||||
// Purpose is to collect time data for each it takes avatar to reach
|
||||
// various loading landmarks: gray, textured (partial), textured fully.
|
||||
|
||||
S32 rez_status = getRezzedStatus();
|
||||
if (rez_status != mLastRezzedStatus)
|
||||
{
|
||||
LL_DEBUGS("Avatar") << avString() << "rez state change: " << mLastRezzedStatus << " -> " << rez_status << LL_ENDL;
|
||||
|
|
@ -7768,8 +7804,21 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse
|
|||
// returns true if the value has changed.
|
||||
BOOL LLVOAvatar::updateIsFullyLoaded()
|
||||
{
|
||||
const bool loading = getIsCloud();
|
||||
updateRezzedStatusTimers();
|
||||
S32 rez_status = getRezzedStatus();
|
||||
bool loading = getIsCloud();
|
||||
if (mFirstFullyVisible && !mIsControlAvatar)
|
||||
{
|
||||
loading = ((rez_status < 2)
|
||||
// Wait at least 60s for unfinished textures to finish on first load,
|
||||
// don't wait forever, it might fail. Even if it will eventually load by
|
||||
// itself and update mLoadedCallbackTextures (or fail and clean the list),
|
||||
// avatars are more time-sensitive than textures and can't wait that long.
|
||||
|| (mLoadedCallbackTextures < mCallbackTextureList.size() && mLastTexCallbackAddedTime.getElapsedTimeF32() < MAX_TEXTURE_WAIT_TIME_SEC)
|
||||
|| !mPendingAttachment.empty()
|
||||
|| (rez_status < 3 && !isFullyBaked())
|
||||
);
|
||||
}
|
||||
updateRezzedStatusTimers(rez_status);
|
||||
updateRuthTimer(loading);
|
||||
return processFullyLoadedChange(loading);
|
||||
}
|
||||
|
|
@ -7805,13 +7854,22 @@ void LLVOAvatar::updateRuthTimer(bool loading)
|
|||
|
||||
BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
|
||||
{
|
||||
// we wait a little bit before giving the all clear,
|
||||
// to let textures settle down
|
||||
const F32 PAUSE = 1.f;
|
||||
// We wait a little bit before giving the 'all clear', to let things to
|
||||
// settle down (models to snap into place, textures to get first packets)
|
||||
const F32 LOADED_DELAY = 1.f;
|
||||
const F32 FIRST_USE_DELAY = 3.f;
|
||||
|
||||
if (loading)
|
||||
mFullyLoadedTimer.reset();
|
||||
|
||||
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
|
||||
|
||||
if (mFirstFullyVisible)
|
||||
{
|
||||
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > FIRST_USE_DELAY);
|
||||
}
|
||||
else
|
||||
{
|
||||
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > LOADED_DELAY);
|
||||
}
|
||||
|
||||
if (!mPreviousFullyLoaded && !loading && mFullyLoaded)
|
||||
{
|
||||
|
|
@ -8101,6 +8159,7 @@ void LLVOAvatar::updateMeshTextures()
|
|||
LLViewerTexLayerSet* layerset = getTexLayerSet(i);
|
||||
if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() )
|
||||
{
|
||||
// use last known good layer (no new one)
|
||||
LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID);
|
||||
mBakedTextureDatas[i].mIsUsed = TRUE;
|
||||
|
||||
|
|
@ -8119,6 +8178,7 @@ void LLVOAvatar::updateMeshTextures()
|
|||
}
|
||||
else if (!isUsingLocalAppearance() && is_layer_baked[i])
|
||||
{
|
||||
// use new layer
|
||||
LLViewerFetchedTexture* baked_img =
|
||||
LLViewerTextureManager::staticCastToFetchedTexture(
|
||||
getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
|
||||
|
|
@ -8138,10 +8198,15 @@ void LLVOAvatar::updateMeshTextures()
|
|||
((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
|
||||
{
|
||||
baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ),
|
||||
src_callback_list, paused);
|
||||
src_callback_list, paused);
|
||||
}
|
||||
baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ),
|
||||
src_callback_list, paused );
|
||||
if (baked_img->getDiscardLevel() < 0 && !paused)
|
||||
{
|
||||
// mLoadedCallbackTextures will be updated by checkTextureLoading() below
|
||||
mLastTexCallbackAddedTime.reset();
|
||||
}
|
||||
|
||||
// this could add paused texture callbacks
|
||||
mLoadedCallbacksPaused |= paused;
|
||||
|
|
@ -8535,13 +8600,16 @@ void LLVOAvatar::onFirstTEMessageReceived()
|
|||
LL_DEBUGS("Avatar") << avString() << "layer_baked, setting onInitialBakedTextureLoaded as callback" << LL_ENDL;
|
||||
image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ),
|
||||
src_callback_list, paused );
|
||||
|
||||
if (image->getDiscardLevel() < 0 && !paused)
|
||||
{
|
||||
mLastTexCallbackAddedTime.reset();
|
||||
}
|
||||
// this could add paused texture callbacks
|
||||
mLoadedCallbacksPaused |= paused;
|
||||
}
|
||||
}
|
||||
|
||||
mMeshTexturesDirty = TRUE;
|
||||
mMeshTexturesDirty = TRUE;
|
||||
gPipeline.markGLRebuild(this);
|
||||
}
|
||||
}
|
||||
|
|
@ -9188,8 +9256,6 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture
|
|||
// static
|
||||
void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
|
||||
{
|
||||
|
||||
|
||||
LLUUID *avatar_idp = (LLUUID *)userdata;
|
||||
LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
|
||||
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ public:
|
|||
BOOL isFullyTextured() const;
|
||||
BOOL hasGray() const;
|
||||
S32 getRezzedStatus() const; // 0 = cloud, 1 = gray, 2 = textured, 3 = textured and fully downloaded.
|
||||
void updateRezzedStatusTimers();
|
||||
void updateRezzedStatusTimers(S32 status);
|
||||
|
||||
S32 mLastRezzedStatus;
|
||||
|
||||
|
|
@ -629,6 +629,8 @@ protected:
|
|||
|
||||
LLLoadedCallbackEntry::source_callback_list_t mCallbackTextureList ;
|
||||
BOOL mLoadedCallbacksPaused;
|
||||
S32 mLoadedCallbackTextures; // count of 'loaded' baked textures, filled from mCallbackTextureList
|
||||
LLFrameTimer mLastTexCallbackAddedTime;
|
||||
std::set<LLUUID> mTextureIDs;
|
||||
//--------------------------------------------------------------------
|
||||
// Local Textures
|
||||
|
|
|
|||
|
|
@ -1250,7 +1250,7 @@ BOOL LLVOAvatarSelf::detachAttachmentIntoInventory(const LLUUID &item_id)
|
|||
gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_id);
|
||||
gMessageSystem->sendReliable(gAgent.getRegion()->getHost());
|
||||
gMessageSystem->sendReliable(gAgent.getRegionHost());
|
||||
|
||||
// This object might have been selected, so let the selection manager know it's gone now
|
||||
LLViewerObject *found_obj = gObjectList.findObject(item_id);
|
||||
|
|
|
|||
|
|
@ -5158,6 +5158,7 @@ void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
|
|||
{
|
||||
// Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it.
|
||||
LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
|
||||
gAgent.setVoiceConnected(false);
|
||||
status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8740,29 +8740,24 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
|
|||
}
|
||||
}
|
||||
|
||||
const LLViewerObject *vobj = drawablep->getVObj();
|
||||
if (vobj)
|
||||
{
|
||||
LLVOAvatar *av = vobj->getAvatar();
|
||||
if (av)
|
||||
{
|
||||
if (av->isTooComplex() || av->isInMuteList() || dist_vec(av->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLViewerObject *root_obj = drawablep->getParent() ? drawablep->getParent()->getVObj() : vobj;
|
||||
if (root_obj && dist_vec(root_obj->getPosition(), LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
const LLViewerObject *vobj = drawablep->getVObj();
|
||||
if (vobj)
|
||||
{
|
||||
LLVOAvatar *av = vobj->getAvatar();
|
||||
if (av && (av->isTooComplex() || av->isInMuteList()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const LLVector3 position = drawablep->getPositionAgent();
|
||||
if (dist_vec(position, LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip + volume->getLightRadius())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LLVector4a center;
|
||||
center.load3(drawablep->getPositionAgent().mV);
|
||||
center.load3(position.mV);
|
||||
const F32* c = center.getF32ptr();
|
||||
F32 s = volume->getLightRadius()*1.5f;
|
||||
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
<file>AppleGothic.dfont</file>
|
||||
<file>AppleGothic.ttf</file>
|
||||
<file>AppleSDGothicNeo-Regular.otf</file>
|
||||
<file>AppleSDGothicNeo.ttc</file>
|
||||
<file>华文细黑.ttf</file>
|
||||
<file>PingFang.ttc</file>
|
||||
<file>STIXGeneral.otf</file>
|
||||
|
|
|
|||
|
|
@ -460,7 +460,7 @@
|
|||
name="Events">
|
||||
<menu_item_call.on_click
|
||||
function="Advanced.ShowURL"
|
||||
parameter="http://events.secondlife.com"/>
|
||||
parameter="https://secondlife.com/my/community/events"/>
|
||||
</menu_item_call>
|
||||
<menu_item_check
|
||||
label="Search..."
|
||||
|
|
|
|||
|
|
@ -1513,7 +1513,7 @@ Go to the [SECOND_LIFE] events web page?
|
|||
<tag>confirm</tag>
|
||||
<url option="0" name="url">
|
||||
|
||||
http://secondlife.com/events/
|
||||
https://secondlife.com/my/community/events
|
||||
</url>
|
||||
<usetemplate
|
||||
name="okcancelbuttons"
|
||||
|
|
|
|||
Loading…
Reference in New Issue