diff options
Diffstat (limited to 'indra')
447 files changed, 19682 insertions, 7160 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index bdbfc55fa2..410d25ad97 100755 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -63,10 +63,11 @@ add_subdirectory(${VIEWER_PREFIX}test) # viewer media plugins add_subdirectory(${LIBS_OPEN_PREFIX}media_plugins) -# llplugin testbed code (is this the right way to include it?) -if (LL_TESTS AND NOT LINUX) - add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest) -endif (LL_TESTS AND NOT LINUX) + # llplugin testbed code (is this the right way to include it?) + if (LL_TESTS AND NOT LINUX) + add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest) + add_subdirectory(${VIEWER_PREFIX}test_apps/llfbconnecttest) + endif (LL_TESTS AND NOT LINUX) if (LINUX) add_subdirectory(${VIEWER_PREFIX}linux_crash_logger) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index af2063ce6d..e4b63dc7cb 100755 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -16,22 +16,26 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n else (DEFINED ENV{revision}) find_program(MERCURIAL hg) - if (DEFINED MERCURIAL) + find_program(WORDCOUNT wc) + find_program(SED sed) + if (DEFINED MERCURIAL AND DEFINED WORDCOUNT AND DEFINED SED) execute_process( - COMMAND ${MERCURIAL} log -r tip --template "{rev}" + COMMAND ${MERCURIAL} log -r tip:0 --template '\\n' + COMMAND ${WORDCOUNT} -l + COMMAND ${SED} "s/ //g" OUTPUT_VARIABLE VIEWER_VERSION_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE ) if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$") message("Revision (from hg) ${VIEWER_VERSION_REVISION}") else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$") + message("Revision not set (repository not found?); using 0") set(VIEWER_VERSION_REVISION 0 ) - message("Revision not set, repository not found, using ${VIEWER_VERSION_REVISION}") endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$") - else (DEFINED MERCURIAL) + else (DEFINED MERCURIAL AND DEFINED WORDCOUNT AND DEFINED SED) + message("Revision not set: 'hg', 'wc' or 'sed' not found; using 0") set(VIEWER_VERSION_REVISION 0) - message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}") - endif (DEFINED MERCURIAL) + endif (DEFINED MERCURIAL AND DEFINED WORDCOUNT AND DEFINED SED) endif (DEFINED ENV{revision}) message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") else ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 308e378db0..264039390c 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -64,6 +64,7 @@ if(WINDOWS) endif(USE_TCMALLOC) if (FMODEX) + set(debug_files ${debug_files} fmodexL.dll) set(release_files ${release_files} fmodex.dll) endif (FMODEX) @@ -294,7 +295,8 @@ elseif(LINUX) endif (USE_TCMALLOC) if (FMODEX) - set(release_file ${release_files} "libfmodex.so") + set(debug_files ${debug_files} "libfmodexL.so") + set(release_files ${release_files} "libfmodex.so") endif (FMODEX) else(WINDOWS) diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake index 65bc1cabeb..163260137b 100644 --- a/indra/cmake/FMODEX.cmake +++ b/indra/cmake/FMODEX.cmake @@ -39,7 +39,7 @@ if (FMODEX) optimized fmodex) endif (WINDOWS) set(FMODEX_LIBRARIES ${FMODEX_LIBRARY}) - set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodex) + set(FMODEX_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/) endif (FMODEX_LIBRARY AND FMODEX_INCLUDE_DIR) endif (STANDALONE) endif (FMODEX) diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index 513b4583a5..74c472dc0e 100755 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1 +1,4 @@ Thu, Oct 17, 2013 6:49:30 PM + + + diff --git a/indra/lib/python/indra/base/lluuid.py b/indra/lib/python/indra/base/lluuid.py index 369ae4e92f..7413ffe10d 100755 --- a/indra/lib/python/indra/base/lluuid.py +++ b/indra/lib/python/indra/base/lluuid.py @@ -72,7 +72,7 @@ class UUID(object): ip = '' try: ip = socket.gethostbyname(socket.gethostname()) - except(socket.gaierror): + except(socket.gaierror, socket.error): # no ip address, so just default to somewhere in 10.x.x.x ip = '10' for i in range(3): diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 54049b5545..1d85aa2978 100755 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -85,7 +85,8 @@ def get_default_platform(dummy): }[sys.platform] DEFAULT_SRCTREE = os.path.dirname(sys.argv[0]) -RELEASE_CHANNEL = 'Second Life Release' +CHANNEL_VENDOR_BASE = 'Second Life' +RELEASE_CHANNEL = CHANNEL_VENDOR_BASE + ' Release' ARGUMENTS=[ dict(name='actions', @@ -112,13 +113,14 @@ ARGUMENTS=[ default="Release"), dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE), dict(name='grid', - description="""Which grid the client will try to connect to. Even - though it's not strictly a grid, 'firstlook' is also an acceptable - value for this parameter.""", - default=""), + description="""Which grid the client will try to connect to.""", + default=None), dict(name='channel', description="""The channel to use for updates, packaging, settings name, etc.""", default='CHANNEL UNSET'), + dict(name='channel_suffix', + description="""Addition to the channel for packaging and channel value, but not application name (used internally)""", + default=None), dict(name='installer_name', description=""" The name of the file that the installer should be packaged up into. Only used on Linux at the moment.""", @@ -213,9 +215,9 @@ def main(): print "Unable to read versionfile '%s'" % args['versionfile'] raise - # default and agni are default - if args['grid'] in ['default', 'agni']: - args['grid'] = '' + # unspecified, default, and agni are default + if args['grid'] in ['', 'default', 'agni']: + args['grid'] = None if 'actions' in args: args['actions'] = args['actions'].split() @@ -224,15 +226,101 @@ def main(): for opt in args: print "Option:", opt, "=", args[opt] + # pass in sourceid as an argument now instead of an environment variable + try: + args['sourceid'] = os.environ["sourceid"] + except KeyError: + args['sourceid'] = "" + + # Build base package. + touch = args.get('touch') + if touch: + print 'Creating base package' + args['package_id'] = "" # base package has no package ID wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) wm.do(*args['actions']) - + # Store package file for later if making touched file. + base_package_file = "" + if touch: + print 'Created base package ', wm.package_file + base_package_file = "" + wm.package_file + + # handle multiple packages if set + try: + additional_packages = os.environ["additional_packages"] + except KeyError: + additional_packages = "" + if additional_packages: + # Determine destination prefix / suffix for additional packages. + base_dest_postfix = args['dest'] + base_dest_prefix = "" + base_dest_parts = args['dest'].split(os.sep) + if len(base_dest_parts) > 1: + base_dest_postfix = base_dest_parts[len(base_dest_parts) - 1] + base_dest_prefix = base_dest_parts[0] + i = 1 + while i < len(base_dest_parts) - 1: + base_dest_prefix = base_dest_prefix + os.sep + base_dest_parts[i] + i = i + 1 + # Determine touched prefix / suffix for additional packages. + base_touch_postfix = "" + base_touch_prefix = "" + if touch: + base_touch_postfix = touch + base_touch_parts = touch.split('/') + if "arwin" in args['platform']: + if len(base_touch_parts) > 1: + base_touch_postfix = base_touch_parts[len(base_touch_parts) - 1] + base_touch_prefix = base_touch_parts[0] + i = 1 + while i < len(base_touch_parts) - 1: + base_touch_prefix = base_touch_prefix + '/' + base_touch_parts[i] + i = i + 1 + else: + if len(base_touch_parts) > 2: + base_touch_postfix = base_touch_parts[len(base_touch_parts) - 2] + '/' + base_touch_parts[len(base_touch_parts) - 1] + base_touch_prefix = base_touch_parts[0] + i = 1 + while i < len(base_touch_parts) - 2: + base_touch_prefix = base_touch_prefix + '/' + base_touch_parts[i] + i = i + 1 + # Store base channel name. + base_channel_name = args['channel'] + # Build each additional package. + package_id_list = additional_packages.split(" ") + args['channel'] = base_channel_name + for package_id in package_id_list: + try: + if package_id + "_viewer_channel_suffix" in os.environ: + args['channel_suffix'] = os.environ[package_id + "_viewer_channel_suffix"] + else: + args['channel_suffix'] = None + if package_id + "_sourceid" in os.environ: + args['sourceid'] = os.environ[package_id + "_sourceid"] + else: + args['sourceid'] = None + args['dest'] = base_dest_prefix + os.sep + package_id + os.sep + base_dest_postfix + except KeyError: + sys.stderr.write("Failed to create package for package_id: %s" % package_id) + sys.stderr.flush() + continue + if touch: + print 'Creating additional package for "', package_id, '" in ', args['dest'] + wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) + wm.do(*args['actions']) + if touch: + print 'Created additional package ', wm.package_file, ' for ', package_id + faketouch = base_touch_prefix + '/' + package_id + '/' + base_touch_postfix + fp = open(faketouch, 'w') + fp.write('set package_file=%s\n' % wm.package_file) + fp.close() + # Write out the package file in this format, so that it can easily be called # and used in a .bat file - yeah, it sucks, but this is the simplest... touch = args.get('touch') if touch: fp = open(touch, 'w') - fp.write('set package_file=%s\n' % wm.package_file) + fp.write('set package_file=%s\n' % base_package_file) fp.close() print 'touched', touch return 0 @@ -249,7 +337,7 @@ class LLManifest(object): manifests = {} def for_platform(self, platform, arch = None): if arch: - platform = platform + '_' + arch + platform = platform + '_' + arch + '_' return self.manifests[platform.lower()] for_platform = classmethod(for_platform) @@ -266,8 +354,6 @@ class LLManifest(object): self.created_paths = [] self.package_name = "Unknown" - def default_grid(self): - return self.args.get('grid', None) == '' def default_channel(self): return self.args.get('channel', None) == RELEASE_CHANNEL diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 3bb759d458..0f5d729e77 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -81,6 +81,7 @@ public: ~LLAvatarBoneInfo() { std::for_each(mChildList.begin(), mChildList.end(), DeletePointer()); + mChildList.clear(); } BOOL parseXml(LLXmlTreeNode* node); @@ -108,6 +109,7 @@ public: ~LLAvatarSkeletonInfo() { std::for_each(mBoneInfoList.begin(), mBoneInfoList.end(), DeletePointer()); + mBoneInfoList.clear(); } BOOL parseXml(LLXmlTreeNode* node); S32 getNumBones() const { return mNumBones; } @@ -132,14 +134,26 @@ LLAvatarAppearance::LLAvatarXmlInfo::LLAvatarXmlInfo() LLAvatarAppearance::LLAvatarXmlInfo::~LLAvatarXmlInfo() { std::for_each(mMeshInfoList.begin(), mMeshInfoList.end(), DeletePointer()); + mMeshInfoList.clear(); + std::for_each(mSkeletalDistortionInfoList.begin(), mSkeletalDistortionInfoList.end(), DeletePointer()); + mSkeletalDistortionInfoList.clear(); + std::for_each(mAttachmentInfoList.begin(), mAttachmentInfoList.end(), DeletePointer()); + mAttachmentInfoList.clear(); + deleteAndClear(mTexSkinColorInfo); deleteAndClear(mTexHairColorInfo); deleteAndClear(mTexEyeColorInfo); + std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer()); + mLayerInfoList.clear(); + std::for_each(mDriverInfoList.begin(), mDriverInfoList.end(), DeletePointer()); + mDriverInfoList.clear(); + std::for_each(mMorphMaskInfoList.begin(), mMorphMaskInfoList.end(), DeletePointer()); + mMorphMaskInfoList.clear(); } @@ -291,10 +305,6 @@ LLAvatarAppearance::~LLAvatarAppearance() clearSkeleton(); deleteAndClearArray(mCollisionVolumes); - deleteAndClear(mTexSkinColor); - deleteAndClear(mTexHairColor); - deleteAndClear(mTexEyeColor); - std::for_each(mPolyMeshes.begin(), mPolyMeshes.end(), DeletePairedPointer()); mPolyMeshes.clear(); diff --git a/indra/llappearance/lltexglobalcolor.cpp b/indra/llappearance/lltexglobalcolor.cpp index f38b982104..16b0260d1a 100644 --- a/indra/llappearance/lltexglobalcolor.cpp +++ b/indra/llappearance/lltexglobalcolor.cpp @@ -120,6 +120,7 @@ LLTexGlobalColorInfo::LLTexGlobalColorInfo() LLTexGlobalColorInfo::~LLTexGlobalColorInfo() { for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); + mParamColorInfoList.clear(); } BOOL LLTexGlobalColorInfo::parseXml(LLXmlTreeNode* node) diff --git a/indra/llappearance/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index a3a8616864..63d01999f0 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -195,6 +195,7 @@ LLTexLayerSetInfo::LLTexLayerSetInfo() : LLTexLayerSetInfo::~LLTexLayerSetInfo( ) { std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer()); + mLayerInfoList.clear(); } BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node) @@ -282,7 +283,10 @@ LLTexLayerSet::~LLTexLayerSet() { deleteCaches(); std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer()); + mLayerList.clear(); + std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer()); + mMaskLayerList.clear(); } //----------------------------------------------------------------------------- @@ -652,7 +656,9 @@ LLTexLayerInfo::LLTexLayerInfo() : LLTexLayerInfo::~LLTexLayerInfo( ) { std::for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer()); + mParamColorInfoList.clear(); std::for_each(mParamAlphaInfoList.begin(), mParamAlphaInfoList.end(), DeletePointer()); + mParamAlphaInfoList.clear(); } BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node) diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index 6c97a64ed7..8c31f8b4de 100755 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -135,7 +135,7 @@ int vfs_seek(void *datasource, ogg_int64_t offset, int whence) origin = -1; break; default: - llerrs << "Invalid whence argument to vfs_seek" << llendl; + LL_ERRS("AudioEngine") << "Invalid whence argument to vfs_seek" << LL_ENDL; return -1; } @@ -197,12 +197,12 @@ BOOL LLVorbisDecodeState::initDecode() vfs_callbacks.close_func = vfs_close; vfs_callbacks.tell_func = vfs_tell; - //llinfos << "Initing decode from vfile: " << mUUID << llendl; + LL_DEBUGS("AudioEngine") << "Initing decode from vfile: " << mUUID << LL_ENDL; mInFilep = new LLVFile(gVFS, mUUID, LLAssetType::AT_SOUND); if (!mInFilep || !mInFilep->getSize()) { - llwarns << "unable to open vorbis source vfile for reading" << llendl; + LL_WARNS("AudioEngine") << "unable to open vorbis source vfile for reading" << LL_ENDL; delete mInFilep; mInFilep = NULL; return FALSE; @@ -211,7 +211,7 @@ BOOL LLVorbisDecodeState::initDecode() int r = ov_open_callbacks(mInFilep, &mVF, NULL, 0, vfs_callbacks); if(r < 0) { - llwarns << r << " Input to vorbis decode does not appear to be an Ogg bitstream: " << mUUID << llendl; + LL_WARNS("AudioEngine") << r << " Input to vorbis decode does not appear to be an Ogg bitstream: " << mUUID << LL_ENDL; return(FALSE); } @@ -229,36 +229,36 @@ BOOL LLVorbisDecodeState::initDecode() if( vi->channels < 1 || vi->channels > LLVORBIS_CLIP_MAX_CHANNELS ) { abort_decode = true; - llwarns << "Bad channel count: " << vi->channels << llendl; + LL_WARNS("AudioEngine") << "Bad channel count: " << vi->channels << LL_ENDL; } } else // !vi { abort_decode = true; - llwarns << "No default bitstream found" << llendl; + LL_WARNS("AudioEngine") << "No default bitstream found" << LL_ENDL; } if( (size_t)sample_count > LLVORBIS_CLIP_REJECT_SAMPLES || (size_t)sample_count <= 0) { abort_decode = true; - llwarns << "Illegal sample count: " << sample_count << llendl; + LL_WARNS("AudioEngine") << "Illegal sample count: " << sample_count << LL_ENDL; } if( size_guess > LLVORBIS_CLIP_REJECT_SIZE || size_guess < 0) { abort_decode = true; - llwarns << "Illegal sample size: " << size_guess << llendl; + LL_WARNS("AudioEngine") << "Illegal sample size: " << size_guess << LL_ENDL; } if( abort_decode ) { - llwarns << "Canceling initDecode. Bad asset: " << mUUID << llendl; + LL_WARNS("AudioEngine") << "Canceling initDecode. Bad asset: " << mUUID << LL_ENDL; vorbis_comment* comment = ov_comment(&mVF,-1); if (comment && comment->vendor) { - llwarns << "Bad asset encoded by: " << comment->vendor << llendl; + LL_WARNS("AudioEngine") << "Bad asset encoded by: " << comment->vendor << LL_ENDL; } delete mInFilep; mInFilep = NULL; @@ -359,12 +359,12 @@ BOOL LLVorbisDecodeState::decodeSection() { if (!mInFilep) { - llwarns << "No VFS file to decode in vorbis!" << llendl; + LL_WARNS("AudioEngine") << "No VFS file to decode in vorbis!" << LL_ENDL; return TRUE; } if (mDone) { -// llwarns << "Already done with decode, aborting!" << llendl; +// LL_WARNS("AudioEngine") << "Already done with decode, aborting!" << LL_ENDL; return TRUE; } char pcmout[4096]; /*Flawfinder: ignore*/ @@ -377,14 +377,14 @@ BOOL LLVorbisDecodeState::decodeSection() eof = TRUE; mDone = TRUE; mValid = TRUE; -// llinfos << "Vorbis EOF" << llendl; +// LL_INFOS("AudioEngine") << "Vorbis EOF" << LL_ENDL; } else if (ret < 0) { /* error in the stream. Not a problem, just reporting it in case we (the app) cares. In this case, we don't. */ - llwarns << "BAD vorbis decode in decodeSection." << llendl; + LL_WARNS("AudioEngine") << "BAD vorbis decode in decodeSection." << LL_ENDL; mValid = FALSE; mDone = TRUE; @@ -393,7 +393,7 @@ BOOL LLVorbisDecodeState::decodeSection() } else { -// llinfos << "Vorbis read " << ret << "bytes" << llendl; +// LL_INFOS("AudioEngine") << "Vorbis read " << ret << "bytes" << LL_ENDL; /* we don't bother dealing with sample rate changes, etc, but. you'll have to*/ std::copy(pcmout, pcmout+ret, std::back_inserter(mWAVBuffer)); @@ -405,7 +405,7 @@ BOOL LLVorbisDecodeState::finishDecode() { if (!isValid()) { - llwarns << "Bogus vorbis decode state for " << getUUID() << ", aborting!" << llendl; + LL_WARNS("AudioEngine") << "Bogus vorbis decode state for " << getUUID() << ", aborting!" << LL_ENDL; return TRUE; // We've finished } @@ -480,7 +480,7 @@ BOOL LLVorbisDecodeState::finishDecode() if (36 == data_length) { - llwarns << "BAD Vorbis decode in finishDecode!" << llendl; + LL_WARNS("AudioEngine") << "BAD Vorbis decode in finishDecode!" << LL_ENDL; mValid = FALSE; return TRUE; // we've finished } @@ -497,7 +497,7 @@ BOOL LLVorbisDecodeState::finishDecode() { if (mBytesRead == 0) { - llwarns << "Unable to write file in LLVorbisDecodeState::finishDecode" << llendl; + LL_WARNS("AudioEngine") << "Unable to write file in LLVorbisDecodeState::finishDecode" << LL_ENDL; mValid = FALSE; return TRUE; // we've finished } @@ -515,7 +515,7 @@ BOOL LLVorbisDecodeState::finishDecode() LLVFile output(gVFS, mUUID, LLAssetType::AT_SOUND_WAV); output.write(&mWAVBuffer[0], mWAVBuffer.size()); #endif - //llinfos << "Finished decode for " << getUUID() << llendl; + LL_DEBUGS("AudioEngine") << "Finished decode for " << getUUID() << LL_ENDL; return TRUE; } @@ -524,7 +524,7 @@ void LLVorbisDecodeState::flushBadFile() { if (mInFilep) { - llwarns << "Flushing bad vorbis file from VFS for " << mUUID << llendl; + LL_WARNS("AudioEngine") << "Flushing bad vorbis file from VFS for " << mUUID << LL_ENDL; mInFilep->remove(); } } @@ -568,7 +568,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs) if (mCurrentDecodep->isDone() && !mCurrentDecodep->isValid()) { // We had an error when decoding, abort. - llwarns << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << llendl; + LL_WARNS("AudioEngine") << mCurrentDecodep->getUUID() << " has invalid vorbis data, aborting decode" << LL_ENDL; mCurrentDecodep->flushBadFile(); LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID()); adp->setHasValidData(false); @@ -590,7 +590,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs) LLAudioData *adp = gAudiop->getAudioData(mCurrentDecodep->getUUID()); if (!adp) { - llwarns << "Missing LLAudioData for decode of " << mCurrentDecodep->getUUID() << llendl; + LL_WARNS("AudioEngine") << "Missing LLAudioData for decode of " << mCurrentDecodep->getUUID() << LL_ENDL; } else if (mCurrentDecodep->isValid() && mCurrentDecodep->isDone()) { @@ -601,12 +601,12 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs) // At this point, we could see if anyone needs this sound immediately, but // I'm not sure that there's a reason to - we need to poll all of the playing // sounds anyway. - //llinfos << "Finished the vorbis decode, now what?" << llendl; + //LL_INFOS("AudioEngine") << "Finished the vorbis decode, now what?" << LL_ENDL; } else { adp->setHasCompletedDecode(true); - llinfos << "Vorbis decode failed for " << mCurrentDecodep->getUUID() << llendl; + LL_INFOS("AudioEngine") << "Vorbis decode failed for " << mCurrentDecodep->getUUID() << LL_ENDL; } mCurrentDecodep = NULL; } @@ -631,7 +631,7 @@ void LLAudioDecodeMgr::Impl::processQueue(const F32 num_secs) continue; } - lldebugs << "Decoding " << uuid << " from audio queue!" << llendl; + lldebugs << "Decoding " << uuid << " from audio queue!" << LL_ENDL; std::string uuid_str; std::string d_path; @@ -674,19 +674,19 @@ BOOL LLAudioDecodeMgr::addDecodeRequest(const LLUUID &uuid) if (gAudiop->hasDecodedFile(uuid)) { // Already have a decoded version, don't need to decode it. - //llinfos << "addDecodeRequest for " << uuid << " has decoded file already" << llendl; + LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " has decoded file already" << LL_ENDL; return TRUE; } if (gAssetStorage->hasLocalAsset(uuid, LLAssetType::AT_SOUND)) { // Just put it on the decode queue. - //llinfos << "addDecodeRequest for " << uuid << " has local asset file already" << llendl; + LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " has local asset file already" << LL_ENDL; mImpl->mDecodeQueue.push(uuid); return TRUE; } - //llinfos << "addDecodeRequest for " << uuid << " no file available" << llendl; + LL_DEBUGS("AudioEngine") << "addDecodeRequest for " << uuid << " no file available" << LL_ENDL; return FALSE; } diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index 06e752cf34..ca614f5395 100755 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -123,7 +123,7 @@ bool LLAudioEngine::init(const S32 num_channels, void* userdata) // Initialize the decode manager gAudioDecodeMgrp = new LLAudioDecodeMgr; - llinfos << "LLAudioEngine::init() AudioEngine successfully initialized" << llendl; + LL_INFOS("AudioEngine") << "LLAudioEngine::init() AudioEngine successfully initialized" << LL_ENDL; return true; } @@ -308,7 +308,7 @@ void LLAudioEngine::idle(F32 max_decode_time) LLAudioChannel *channelp = getFreeChannel(max_priority); if (channelp) { - //llinfos << "Replacing source in channel due to priority!" << llendl; + LL_DEBUGS("AudioEngine") << "Replacing source in channel due to priority!" << LL_ENDL; max_sourcep->setChannel(channelp); channelp->setSource(max_sourcep); if (max_sourcep->isSyncSlave()) @@ -479,7 +479,7 @@ void LLAudioEngine::idle(F32 max_decode_time) { if (!mBuffers[i]->mInUse && mBuffers[i]->mLastUseTimer.getElapsedTimeF32() > 30.f) { - //llinfos << "Flushing unused buffer!" << llendl; + LL_DEBUGS("AudioEngine") << "Flushing unused buffer!" << LL_ENDL; mBuffers[i]->mAudioDatap->mBufferp = NULL; delete mBuffers[i]; mBuffers[i] = NULL; @@ -591,8 +591,8 @@ LLAudioBuffer * LLAudioEngine::getFreeBuffer() if (buffer_id >= 0) { - lldebugs << "Taking over unused buffer " << buffer_id << llendl; - //llinfos << "Flushing unused buffer!" << llendl; + lldebugs << "Taking over unused buffer " << buffer_id << LL_ENDL; + LL_DEBUGS("AudioEngine") << "Flushing unused buffer!" << LL_ENDL; mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL; delete mBuffers[buffer_id]; mBuffers[buffer_id] = createBuffer(); @@ -673,6 +673,8 @@ void LLAudioEngine::cleanupBuffer(LLAudioBuffer *bufferp) bool LLAudioEngine::preloadSound(const LLUUID &uuid) { + LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL; + gAudiop->getAudioData(uuid); // We don't care about the return value, this is just to make sure // that we have an entry, which will mean that the audio engine knows about this @@ -684,7 +686,7 @@ bool LLAudioEngine::preloadSound(const LLUUID &uuid) // At some point we need to have the audio/asset system check the static VFS // before it goes off and fetches stuff from the server. - //llwarns << "Used internal preload for non-local sound" << llendl; + LL_DEBUGS("AudioEngine") << "Used internal preload for non-local sound "<< uuid << LL_ENDL; return false; } @@ -815,7 +817,7 @@ void LLAudioEngine::triggerSound(const LLUUID &audio_uuid, const LLUUID& owner_i const S32 type, const LLVector3d &pos_global) { // Create a new source (since this can't be associated with an existing source. - //llinfos << "Localized: " << audio_uuid << llendl; + LL_DEBUGS("AudioEngine") << "Localized: " << audio_uuid << LL_ENDL; if (mMuted) { @@ -982,11 +984,14 @@ void LLAudioEngine::cleanupAudioSource(LLAudioSource *asp) iter = mAllSources.find(asp->getID()); if (iter == mAllSources.end()) { - llwarns << "Cleaning up unknown audio source!" << llendl; - return; + LL_WARNS("AudioEngine") << "Cleaning up unknown audio source!" << LL_ENDL; + } + else + { + LL_DEBUGS("AudioEngine") << "Cleaning up audio sources for "<< asp->getID() <<LL_ENDL; + delete asp; + mAllSources.erase(iter); } - delete asp; - mAllSources.erase(iter); } @@ -1013,16 +1018,18 @@ bool LLAudioEngine::hasDecodedFile(const LLUUID &uuid) bool LLAudioEngine::hasLocalFile(const LLUUID &uuid) { // See if it's in the VFS. - return gVFS->getExists(uuid, LLAssetType::AT_SOUND); + bool have_local = gVFS->getExists(uuid, LLAssetType::AT_SOUND); + LL_DEBUGS("AudioEngine") << "sound uuid "<<uuid<<" exists in VFS"<<LL_ENDL; + return have_local; } void LLAudioEngine::startNextTransfer() { - //llinfos << "LLAudioEngine::startNextTransfer()" << llendl; + //LL_DEBUGS("AudioEngine") << "LLAudioEngine::startNextTransfer()" << LL_ENDL; if (mCurrentTransfer.notNull() || getMuted()) { - //llinfos << "Transfer in progress, aborting" << llendl; + //LL_DEBUGS("AudioEngine") << "Transfer in progress, aborting" << LL_ENDL; return; } @@ -1203,7 +1210,7 @@ void LLAudioEngine::startNextTransfer() if (asset_id.notNull()) { - llinfos << "Getting asset data for: " << asset_id << llendl; + LL_INFOS("AudioEngine") << "Getting audio asset data for: " << asset_id << LL_ENDL; gAudiop->mCurrentTransfer = asset_id; gAudiop->mCurrentTransferTimer.reset(); gAssetStorage->getAssetData(asset_id, LLAssetType::AT_SOUND, @@ -1211,7 +1218,7 @@ void LLAudioEngine::startNextTransfer() } else { - //llinfos << "No pending transfers?" << llendl; + //LL_DEBUGS("AudioEngine") << "No pending transfers?" << LL_ENDL; } } @@ -1221,7 +1228,7 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E { if (result_code) { - llinfos << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << llendl; + LL_INFOS("AudioEngine") << "Boom, error in audio file transfer: " << LLAssetStorage::getErrorString( result_code ) << " (" << result_code << ")" << LL_ENDL; // Need to mark data as bad to avoid constant rerequests. LLAudioData *adp = gAudiop->getAudioData(uuid); if (adp) @@ -1238,11 +1245,11 @@ void LLAudioEngine::assetCallback(LLVFS *vfs, const LLUUID &uuid, LLAssetType::E if (!adp) { // Should never happen - llwarns << "Got asset callback without audio data for " << uuid << llendl; + LL_WARNS("AudioEngine") << "Got asset callback without audio data for " << uuid << LL_ENDL; } else { - // llinfos << "Got asset callback with good audio data for " << uuid << ", making decode request" << llendl; + LL_DEBUGS("AudioEngine") << "Got asset callback with good audio data for " << uuid << ", making decode request" << LL_ENDL; adp->setHasValidData(true); adp->setHasLocalData(true); gAudioDecodeMgrp->addDecodeRequest(uuid); @@ -1321,7 +1328,7 @@ void LLAudioSource::update() } else if (adp->hasCompletedDecode()) // Only mark corrupted after decode is done { - llwarns << "Marking LLAudioSource corrupted for " << adp->getID() << llendl; + LL_WARNS("AudioEngine") << "Marking LLAudioSource corrupted for " << adp->getID() << LL_ENDL; mCorrupted = true ; } } @@ -1357,7 +1364,6 @@ bool LLAudioSource::setupChannel() if (!adp->getBuffer()) { // We're not ready to play back the sound yet, so don't try and allocate a channel for it. - //llwarns << "Aborting, no buffer" << llendl; return false; } @@ -1375,7 +1381,7 @@ bool LLAudioSource::setupChannel() // Ugh, we don't have any free channels. // Now we have to reprioritize. // For now, just don't play the sound. - //llwarns << "Aborting, no free channels" << llendl; + //llwarns << "Aborting, no free channels" << LL_ENDL; return false; } @@ -1474,7 +1480,7 @@ bool LLAudioSource::isDone() const { // We don't have a channel assigned, and it's been // over 15 seconds since we tried to play it. Don't bother. - //llinfos << "No channel assigned, source is done" << llendl; + LL_DEBUGS("AudioEngine") << "No channel assigned, source is done" << LL_ENDL; return true; } else @@ -1640,7 +1646,7 @@ LLAudioChannel::LLAudioChannel() : LLAudioChannel::~LLAudioChannel() { // Need to disconnect any sources which are using this channel. - //llinfos << "Cleaning up audio channel" << llendl; + LL_DEBUGS("AudioEngine") << "Cleaning up audio channel" << LL_ENDL; if (mCurrentSourcep) { mCurrentSourcep->setChannel(NULL); @@ -1651,29 +1657,29 @@ LLAudioChannel::~LLAudioChannel() void LLAudioChannel::setSource(LLAudioSource *sourcep) { - //llinfos << this << ": setSource(" << sourcep << ")" << llendl; - if (!sourcep) { // Clearing the source for this channel, don't need to do anything. - //llinfos << "Clearing source for channel" << llendl; + LL_DEBUGS("AudioEngine") << "Clearing source" << ( mCurrentSourcep ? mCurrentSourcep->getID() : LLUUID::null ) << LL_ENDL; cleanup(); mCurrentSourcep = NULL; mWaiting = false; - return; } - - if (sourcep == mCurrentSourcep) + else { - // Don't reallocate the channel, this will make FMOD goofy. - //llinfos << "Calling setSource with same source!" << llendl; - } - - mCurrentSourcep = sourcep; + LL_DEBUGS("AudioEngine") << "( id: " << sourcep->getID() << ")" << LL_ENDL; + if (sourcep == mCurrentSourcep) + { + // Don't reallocate the channel, this will make FMOD goofy. + //LL_DEBUGS("AudioEngine") << "Calling setSource with same source!" << LL_ENDL; + } - updateBuffer(); - update3DPosition(); + mCurrentSourcep = sourcep; + + updateBuffer(); + update3DPosition(); + } } @@ -1768,7 +1774,7 @@ bool LLAudioData::load() if (mBufferp) { // We already have this sound in a buffer, don't do anything. - llinfos << "Already have a buffer for this sound, don't bother loading!" << llendl; + LL_INFOS("AudioEngine") << "Already have a buffer for this sound, don't bother loading!" << LL_ENDL; return true; } @@ -1776,7 +1782,7 @@ bool LLAudioData::load() if (!mBufferp) { // No free buffers, abort. - llinfos << "Not able to allocate a new audio buffer, aborting." << llendl; + LL_INFOS("AudioEngine") << "Not able to allocate a new audio buffer, aborting." << LL_ENDL; return true; } diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp index e9b74b8f41..36e8044a25 100644 --- a/indra/llaudio/llaudioengine_fmodex.cpp +++ b/indra/llaudio/llaudioengine_fmodex.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2014, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -55,11 +55,13 @@ LLAudioEngine_FMODEX::LLAudioEngine_FMODEX(bool enable_profiler) mWindDSP = NULL; mSystem = NULL; mEnableProfiler = enable_profiler; + mWindDSPDesc = new FMOD_DSP_DESCRIPTION(); } LLAudioEngine_FMODEX::~LLAudioEngine_FMODEX() { + delete mWindDSPDesc; } @@ -320,8 +322,8 @@ void LLAudioEngine_FMODEX::shutdown() llinfos << "LLAudioEngine_FMODEX::shutdown() closing FMOD Ex" << llendl; if ( mSystem ) // speculative fix for MAINT-2657 { - mSystem->close(); - mSystem->release(); + mSystem->close(); + mSystem->release(); } llinfos << "LLAudioEngine_FMODEX::shutdown() done closing FMOD Ex" << llendl; @@ -347,15 +349,14 @@ bool LLAudioEngine_FMODEX::initWind() if (!mWindDSP) { - FMOD_DSP_DESCRIPTION dspdesc; - memset(&dspdesc, 0, sizeof(FMOD_DSP_DESCRIPTION)); //Set everything to zero - strncpy(dspdesc.name,"Wind Unit", sizeof(dspdesc.name)); //Set name to "Wind Unit" - dspdesc.channels=2; - dspdesc.read = &windCallback; //Assign callback. - if(Check_FMOD_Error(mSystem->createDSP(&dspdesc, &mWindDSP), "FMOD::createDSP")) + memset(mWindDSPDesc, 0, sizeof(*mWindDSPDesc)); //Set everything to zero + strncpy(mWindDSPDesc->name, "Wind Unit", sizeof(mWindDSPDesc->name)); + mWindDSPDesc->channels = 2; + mWindDSPDesc->read = &windCallback; // Assign callback - may be called from arbitrary threads + if (Check_FMOD_Error(mSystem->createDSP(mWindDSPDesc, &mWindDSP), "FMOD::createDSP")) return false; - if(mWindGen) + if (mWindGen) delete mWindGen; float frequency = 44100; @@ -364,6 +365,7 @@ bool LLAudioEngine_FMODEX::initWind() mWindDSP->setUserData((void*)mWindGen); } + // *TODO: Should this guard against multiple plays? if (mWindDSP) { mSystem->playDSP(FMOD_CHANNEL_FREE, mWindDSP, false, 0); @@ -741,6 +743,9 @@ void LLAudioChannelFMODEX::set3DMode(bool use3d) } } +// *NOTE: This is almost certainly being called on the mixer thread, +// not the main thread. May have implications for callees or audio +// engine shutdown. FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *originalbuffer, float *newbuffer, unsigned int length, int inchannels, int outchannels) { diff --git a/indra/llaudio/llaudioengine_fmodex.h b/indra/llaudio/llaudioengine_fmodex.h index 415a9ed0ef..ca389d489f 100644 --- a/indra/llaudio/llaudioengine_fmodex.h +++ b/indra/llaudio/llaudioengine_fmodex.h @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2014, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,6 +41,7 @@ namespace FMOD class Sound; class DSP; } +typedef struct FMOD_DSP_DESCRIPTION FMOD_DSP_DESCRIPTION; //Interfaces class LLAudioEngine_FMODEX : public LLAudioEngine @@ -74,6 +75,7 @@ protected: LLWindGen<MIXBUFFERFORMAT> *mWindGen; + FMOD_DSP_DESCRIPTION *mWindDSPDesc; FMOD::DSP *mWindDSP; FMOD::System *mSystem; bool mEnableProfiler; diff --git a/indra/llaudio/lllistener_fmodex.cpp b/indra/llaudio/lllistener_fmodex.cpp index 2509a7aebc..31ab47a635 100644 --- a/indra/llaudio/lllistener_fmodex.cpp +++ b/indra/llaudio/lllistener_fmodex.cpp @@ -94,6 +94,11 @@ void LLListener_FMODEX::orient(LLVector3 up, LLVector3 at) //----------------------------------------------------------------------- void LLListener_FMODEX::commitDeferredChanges() { + if(!mSystem) + { + return; + } + mSystem->update(); } diff --git a/indra/llcharacter/llbvhloader.cpp b/indra/llcharacter/llbvhloader.cpp index 2a0df26384..8c02a25367 100755 --- a/indra/llcharacter/llbvhloader.cpp +++ b/indra/llcharacter/llbvhloader.cpp @@ -203,6 +203,7 @@ LLBVHLoader::LLBVHLoader(const char* buffer, ELoadStatus &loadStatus, S32 &error LLBVHLoader::~LLBVHLoader() { std::for_each(mJoints.begin(),mJoints.end(),DeletePointer()); + mJoints.clear(); } //------------------------------------------------------------------------ diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 07ef52228e..2241a59513 100755 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -81,7 +81,9 @@ LLKeyframeMotion::JointMotionList::JointMotionList() LLKeyframeMotion::JointMotionList::~JointMotionList() { for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); + mConstraints.clear(); for_each(mJointMotionArray.begin(), mJointMotionArray.end(), DeletePointer()); + mJointMotionArray.clear(); } U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo() @@ -447,6 +449,7 @@ LLKeyframeMotion::LLKeyframeMotion(const LLUUID &id) LLKeyframeMotion::~LLKeyframeMotion() { for_each(mConstraints.begin(), mConstraints.end(), DeletePointer()); + mConstraints.clear(); } //----------------------------------------------------------------------------- diff --git a/indra/llcharacter/llmultigesture.cpp b/indra/llcharacter/llmultigesture.cpp index e2d284834f..411bb094fd 100755 --- a/indra/llcharacter/llmultigesture.cpp +++ b/indra/llcharacter/llmultigesture.cpp @@ -59,6 +59,7 @@ LLMultiGesture::LLMultiGesture() LLMultiGesture::~LLMultiGesture() { std::for_each(mSteps.begin(), mSteps.end(), DeletePointer()); + mSteps.clear(); } void LLMultiGesture::reset() diff --git a/indra/llcharacter/llpose.cpp b/indra/llcharacter/llpose.cpp index 55e1b6e9ea..b1a7ebb159 100755 --- a/indra/llcharacter/llpose.cpp +++ b/indra/llcharacter/llpose.cpp @@ -461,6 +461,7 @@ LLPoseBlender::LLPoseBlender() LLPoseBlender::~LLPoseBlender() { for_each(mJointStateBlenderPool.begin(), mJointStateBlenderPool.end(), DeletePairedPointer()); + mJointStateBlenderPool.clear(); } //----------------------------------------------------------------------------- diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp index 642bd82e90..d12f157910 100755 --- a/indra/llcommon/llavatarname.cpp +++ b/indra/llcommon/llavatarname.cpp @@ -44,6 +44,7 @@ static const std::string DISPLAY_NAME_EXPIRES("display_name_expires"); static const std::string DISPLAY_NAME_NEXT_UPDATE("display_name_next_update"); bool LLAvatarName::sUseDisplayNames = true; +bool LLAvatarName::sUseUsernames = true; // Minimum time-to-live (in seconds) for a name entry. // Avatar name should always guarantee to expire reasonably soon by default @@ -81,6 +82,16 @@ bool LLAvatarName::useDisplayNames() return sUseDisplayNames; } +void LLAvatarName::setUseUsernames(bool use) +{ + sUseUsernames = use; +} + +bool LLAvatarName::useUsernames() +{ + return sUseUsernames; +} + LLSD LLAvatarName::asLLSD() const { LLSD sd; @@ -168,7 +179,11 @@ std::string LLAvatarName::getCompleteName() const } else { - name = mDisplayName + " (" + mUsername + ")"; + name = mDisplayName; + if(sUseUsernames) + { + name += " (" + mUsername + ")"; + } } } else diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h index 5d2fccc5ba..1cb3ae421f 100755 --- a/indra/llcommon/llavatarname.h +++ b/indra/llcommon/llavatarname.h @@ -54,6 +54,9 @@ public: static void setUseDisplayNames(bool use); static bool useDisplayNames(); + static void setUseUsernames(bool use); + static bool useUsernames(); + // A name object is valid if not temporary and not yet expired (default is expiration not checked) bool isValidName(F64 max_unrefreshed = 0.0f) const { return !mIsTemporaryName && (mExpires >= max_unrefreshed); } @@ -128,6 +131,9 @@ private: // Global flag indicating if display name should be used or not // This will affect the output of the high level "get" methods static bool sUseDisplayNames; + + // Flag indicating if username should be shown after display name or not + static bool sUseUsernames; }; #endif diff --git a/indra/llcommon/lldeadmantimer.h b/indra/llcommon/lldeadmantimer.h index 0dde16b717..980976e176 100644 --- a/indra/llcommon/lldeadmantimer.h +++ b/indra/llcommon/lldeadmantimer.h @@ -155,11 +155,9 @@ public: /// void ringBell(time_type now, unsigned int count); - /// Checks on the status of the timer Declare that something interesting happened. This has two - /// effects on an unexpired-timer. 1) The expiration time - /// is extended for 'horizon' seconds after the 'now' value. - /// 2) An internal counter associated with the event is incremented. - /// This count is returned via the @see isExpired() method. + /// Checks the status of the timer. If the timer has expired, + /// also returns various timer-related stats. Unlike ringBell(), + /// does not extend the horizon, it only checks for expiration. /// /// @param now Current time as returned by @see /// LLTimer::getCurrentClockCount(). If zero, @@ -192,7 +190,7 @@ public: bool isExpired(time_type now, F64 & started, F64 & stopped, U64 & count, U64 & user_cpu, U64 & sys_cpu); - /// Identical to the six-arugment form except is does without the + /// Identical to the six-arugment form except it does without the /// CPU time return if the caller isn't interested in it. bool isExpired(time_type now, F64 & started, F64 & stopped, U64 & count); diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index d2af004cde..853f279c95 100755 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -429,8 +429,8 @@ namespace LLError ~Settings() { - for_each(recorders.begin(), recorders.end(), - DeletePointer()); + for_each(recorders.begin(), recorders.end(), DeletePointer()); + recorders.clear(); } static Settings*& getPtr(); diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp index 01b6e60d2b..58db7d0d17 100755 --- a/indra/llcommon/llfasttimer.cpp +++ b/indra/llcommon/llfasttimer.cpp @@ -119,6 +119,7 @@ public: ~NamedTimerFactory() { std::for_each(mTimers.begin(), mTimers.end(), DeletePairedPointer()); + mTimers.clear(); delete mTimerRoot; } diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 8276ec836a..f962485284 100755 --- a/indra/llcommon/llsd.cpp +++ b/indra/llcommon/llsd.cpp @@ -506,6 +506,8 @@ namespace LLSD::array_iterator beginArray() { return mData.begin(); } LLSD::array_iterator endArray() { return mData.end(); } + LLSD::reverse_array_iterator rbeginArray() { return mData.rbegin(); } + LLSD::reverse_array_iterator rendArray() { return mData.rend(); } virtual LLSD::array_const_iterator beginArray() const { return mData.begin(); } virtual LLSD::array_const_iterator endArray() const { return mData.end(); } @@ -947,6 +949,9 @@ LLSD::array_iterator LLSD::endArray() { return makeArray(impl).endArray(); } LLSD::array_const_iterator LLSD::beginArray() const{ return safe(impl).beginArray(); } LLSD::array_const_iterator LLSD::endArray() const { return safe(impl).endArray(); } +LLSD::reverse_array_iterator LLSD::rbeginArray() { return makeArray(impl).rbeginArray(); } +LLSD::reverse_array_iterator LLSD::rendArray() { return makeArray(impl).rendArray(); } + namespace llsd { diff --git a/indra/llcommon/llsd.h b/indra/llcommon/llsd.h index 5eb69059ac..deb87d7497 100755 --- a/indra/llcommon/llsd.h +++ b/indra/llcommon/llsd.h @@ -320,11 +320,15 @@ public: typedef std::vector<LLSD>::iterator array_iterator; typedef std::vector<LLSD>::const_iterator array_const_iterator; + typedef std::vector<LLSD>::reverse_iterator reverse_array_iterator; array_iterator beginArray(); array_iterator endArray(); array_const_iterator beginArray() const; array_const_iterator endArray() const; + + reverse_array_iterator rbeginArray(); + reverse_array_iterator rendArray(); //@} /** @name Type Testing */ diff --git a/indra/llcommon/llstl.h b/indra/llcommon/llstl.h index d3941e1bc9..0a39288f5a 100755 --- a/indra/llcommon/llstl.h +++ b/indra/llcommon/llstl.h @@ -98,6 +98,7 @@ struct DeletePointerArray // The general form is: // // std::for_each(somemap.begin(), somemap.end(), DeletePairedPointer()); +// somemap.clear(); // Don't leave dangling pointers around struct DeletePairedPointer { diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 0730b2ed8b..e63045659e 100755 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -114,6 +114,9 @@ static const F32 MEM_INFO_THROTTLE = 20; static const F32 MEM_INFO_WINDOW = 10*60; #if LL_WINDOWS +// We cannot trust GetVersionEx function on Win8.1 , we should check this value when creating OS string +static const U32 WINNT_WINBLUE = 0x0603; + #ifndef DLLVERSIONINFO typedef struct _DllVersionInfo { @@ -214,6 +217,26 @@ static bool regex_search_no_exc(const S& string, M& match, const R& regex) } } +#if LL_WINDOWS +// GetVersionEx should not works correct with Windows 8.1 and the later version. We need to check this case +static bool check_for_version(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) +{ + OSVERSIONINFOEXW osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; + DWORDLONG const dwlConditionMask = VerSetConditionMask( + VerSetConditionMask( + VerSetConditionMask( + 0, VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION, VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); + + osvi.dwMajorVersion = wMajorVersion; + osvi.dwMinorVersion = wMinorVersion; + osvi.wServicePackMajor = wServicePackMajor; + + return VerifyVersionInfoW(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE; +} +#endif + LLOSInfo::LLOSInfo() : mMajorVer(0), mMinorVer(0), mBuild(0), mOSVersionString("") @@ -222,6 +245,7 @@ LLOSInfo::LLOSInfo() : #if LL_WINDOWS OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; + BOOL bShouldUseShellVersion = false; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); @@ -284,11 +308,19 @@ LLOSInfo::LLOSInfo() : } else if(osvi.dwMinorVersion == 2) { + if (check_for_version(HIBYTE(WINNT_WINBLUE), LOBYTE(WINNT_WINBLUE), 0)) + { + mOSStringSimple = "Microsoft Windows 8.1 "; + bShouldUseShellVersion = true; // GetVersionEx failed, going to use shell version + } + else + { if(osvi.wProductType == VER_NT_WORKSTATION) mOSStringSimple = "Microsoft Windows 8 "; else mOSStringSimple = "Windows Server 2012 "; } + } ///get native system info if available.. typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo @@ -354,9 +386,8 @@ LLOSInfo::LLOSInfo() : } else { - tmpstr = llformat("%s (Build %d)", - csdversion.c_str(), - (osvi.dwBuildNumber & 0xffff)); + tmpstr = !bShouldUseShellVersion ? llformat("%s (Build %d)", csdversion.c_str(), (osvi.dwBuildNumber & 0xffff)): + llformat("%s (Build %d)", csdversion.c_str(), shell32_build); } mOSString = mOSStringSimple + tmpstr; @@ -392,7 +423,7 @@ LLOSInfo::LLOSInfo() : std::string compatibility_mode; if(got_shell32_version) { - if(osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor) + if((osvi.dwMajorVersion != shell32_major || osvi.dwMinorVersion != shell32_minor) && !bShouldUseShellVersion) { compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)", shell32_major, diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp index fb2d43e3b0..aa66ceb4ec 100755 --- a/indra/llcrashlogger/llcrashlogger.cpp +++ b/indra/llcrashlogger/llcrashlogger.cpp @@ -44,7 +44,7 @@ #include "llsdserialize.h" #include "llproxy.h" -LLPumpIO* gServicePump; +LLPumpIO* gServicePump = NULL; BOOL gBreak = false; BOOL gSent = false; @@ -80,7 +80,8 @@ LLCrashLogger::LLCrashLogger() : LLCrashLogger::~LLCrashLogger() { - + delete gServicePump; + gServicePump = NULL; } // TRIM_SIZE must remain larger than LINE_SEARCH_SIZE. diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 37c603348e..5eb5fb442d 100755 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -414,117 +414,6 @@ BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const } -bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp, - const LLUUID& agent_id, - const uuid_vec_t& group_ids, - const BOOL is_agent_identified, - const BOOL is_agent_transacted, - const BOOL is_agent_ageverified) -{ - S32 current_group_access = parcelp->blockAccess(agent_id, LLUUID::null, is_agent_identified, is_agent_transacted, is_agent_ageverified); - S32 count; - bool is_allowed = (current_group_access == BA_ALLOWED) ? true: false; - LLUUID group_id; - - count = group_ids.size(); - for (int i = 0; i < count && !is_allowed; i++) - { - group_id = group_ids[i]; - current_group_access = parcelp->blockAccess(agent_id, group_id, is_agent_identified, is_agent_transacted, is_agent_ageverified); - - if (current_group_access == BA_ALLOWED) is_allowed = true; - } - - return !is_allowed; -} - -BOOL LLParcel::isAgentBanned(const LLUUID& agent_id) const -{ - // Test ban list - if (mBanList.find(agent_id) != mBanList.end()) - { - return TRUE; - } - - return FALSE; -} - -S32 LLParcel::blockAccess(const LLUUID& agent_id, const LLUUID& group_id, - const BOOL is_agent_identified, - const BOOL is_agent_transacted, - const BOOL is_agent_ageverified) const -{ - // Test ban list - if (isAgentBanned(agent_id)) - { - return BA_BANNED; - } - - // Always allow owner on (unless he banned himself, useful for - // testing). We will also allow estate owners/managers in if they - // are not explicitly banned. - if (agent_id == mOwnerID) - { - return BA_ALLOWED; - } - - // Special case when using pass list where group access is being restricted but not - // using access list. In this case group members are allowed only if they buy a pass. - // We return BA_NOT_IN_LIST if not in list - BOOL passWithGroup = getParcelFlag(PF_USE_PASS_LIST) && !getParcelFlag(PF_USE_ACCESS_LIST) - && getParcelFlag(PF_USE_ACCESS_GROUP) && !mGroupID.isNull() && group_id == mGroupID; - - - // Test group list - if (getParcelFlag(PF_USE_ACCESS_GROUP) - && !mGroupID.isNull() - && group_id == mGroupID - && !passWithGroup) - { - return BA_ALLOWED; - } - - // Test access list - if (getParcelFlag(PF_USE_ACCESS_LIST) || passWithGroup ) - { - if (mAccessList.find(agent_id) != mAccessList.end()) - { - return BA_ALLOWED; - } - - return BA_NOT_ON_LIST; - } - - // If we're not doing any other limitations, all users - // can enter, unless - if ( !getParcelFlag(PF_USE_ACCESS_GROUP) - && !getParcelFlag(PF_USE_ACCESS_LIST)) - { - //If the land is group owned, and you are in the group, bypass these checks - if(getIsGroupOwned() && group_id == mGroupID) - { - return BA_ALLOWED; - } - - // Test for "payment" access levels - // Anonymous - No Payment Info on File - if(getParcelFlag(PF_DENY_ANONYMOUS) && !is_agent_identified && !is_agent_transacted) - { - return BA_NO_ACCESS_LEVEL; - } - // AgeUnverified - Not Age Verified - if(getParcelFlag(PF_DENY_AGEUNVERIFIED) && !is_agent_ageverified) - { - return BA_NOT_AGE_VERIFIED; - } - - return BA_ALLOWED; - } - - return BA_NOT_IN_GROUP; - -} - void LLParcel::setArea(S32 area, S32 sim_object_limit) { diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h index 0279e8bef9..c4363a48df 100755 --- a/indra/llinventory/llparcel.h +++ b/indra/llinventory/llparcel.h @@ -527,23 +527,6 @@ public: // Can this agent change the shape of the land? BOOL allowTerraformBy(const LLUUID &agent_id) const; - // Returns 0 if access is OK, otherwise a BA_ return code above. - S32 blockAccess(const LLUUID& agent_id, - const LLUUID& group_id, - const BOOL is_agent_identified, - const BOOL is_agent_transacted, - const BOOL is_agent_ageverified) const; - - // Only checks if the agent is explicitly banned from this parcel - BOOL isAgentBanned(const LLUUID& agent_id) const; - - static bool isAgentBlockedFromParcel(LLParcel* parcelp, - const LLUUID& agent_id, - const uuid_vec_t& group_ids, - const BOOL is_agent_identified, - const BOOL is_agent_transacted, - const BOOL is_agent_ageverified); - bool operator==(const LLParcel &rhs) const; // Calculate rent - area * rent * discount rate diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 2b865b4a8e..cc5742ff7a 100755 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -166,7 +166,8 @@ void calc_tangent_from_triangle( F32 rd = s1*t2-s2*t1; - float r = ((rd*rd) > FLT_EPSILON) ? 1.0F / rd : 1024.f; //some made up large ratio for division by zero + float r = ((rd*rd) > FLT_EPSILON) ? (1.0f / rd) + : ((rd > 0.0f) ? 1024.f : -1024.f); //some made up large ratio for division by zero llassert(llfinite(r)); llassert(!llisnan(r)); @@ -6746,7 +6747,7 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) return TRUE; } -//adapted from Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”. Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html +//adapted from Lengyel, Eric. "Computing Tangent Space Basis Vectors for an Arbitrary Mesh". Terathon Software 3D Graphics Library, 2001. http://www.terathon.com/code/tangent.html void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal, const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent) { @@ -6789,7 +6790,8 @@ void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVe F32 rd = s1*t2-s2*t1; - float r = ((rd*rd) > FLT_EPSILON) ? 1.0F / rd : 1024.f; //some made up large ratio for division by zero + float r = ((rd*rd) > FLT_EPSILON) ? (1.0f / rd) + : ((rd > 0.0f) ? 1024.f : -1024.f); //some made up large ratio for division by zero llassert(llfinite(r)); llassert(!llisnan(r)); diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h index b047f86e6e..8c8c315808 100755 --- a/indra/llmath/v4color.h +++ b/indra/llmath/v4color.h @@ -50,7 +50,7 @@ class LLColor4 LLColor4(F32 r, F32 g, F32 b); // Initializes LLColor4 to (r, g, b, 1) LLColor4(F32 r, F32 g, F32 b, F32 a); // Initializes LLColor4 to (r. g, b, a) LLColor4(U32 clr); // Initializes LLColor4 to (r=clr>>24, etc)) - LLColor4(const F32 *vec); // Initializes LLColor4 to (vec[0]. vec[1], vec[2], 1) + LLColor4(const F32 *vec); // Initializes LLColor4 to (vec[0]. vec[1], vec[2], vec[3]) LLColor4(const LLColor3 &vec, F32 a = 1.f); // Initializes LLColor4 to (vec, a) explicit LLColor4(const LLSD& sd); explicit LLColor4(const LLColor4U& color4u); // "explicit" to avoid automatic conversion diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 9a68093427..31dd264021 100755 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -680,6 +680,15 @@ void LLAvatarNameCache::setUseDisplayNames(bool use) } } +void LLAvatarNameCache::setUseUsernames(bool use) +{ + if (use != LLAvatarName::useUsernames()) + { + LLAvatarName::setUseUsernames(use); + mUseDisplayNamesSignal(); + } +} + void LLAvatarNameCache::erase(const LLUUID& agent_id) { sCache.erase(agent_id); diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h index 2a8eb46187..3a19cee3ed 100755 --- a/indra/llmessage/llavatarnamecache.h +++ b/indra/llmessage/llavatarnamecache.h @@ -80,6 +80,8 @@ namespace LLAvatarNameCache // Set display name: flips the switch and triggers the callbacks. void setUseDisplayNames(bool use); + void setUseUsernames(bool use); + void insert(const LLUUID& agent_id, const LLAvatarName& av_name); void erase(const LLUUID& agent_id); diff --git a/indra/llmessage/llbuffer.cpp b/indra/llmessage/llbuffer.cpp index 01da20f060..aaa49d2ed6 100755 --- a/indra/llmessage/llbuffer.cpp +++ b/indra/llmessage/llbuffer.cpp @@ -225,7 +225,7 @@ LLBufferArray::LLBufferArray() : LLBufferArray::~LLBufferArray() { std::for_each(mBuffers.begin(), mBuffers.end(), DeletePointer()); - + mBuffers.clear(); delete mMutexp; } diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 267c48e1d2..13d779ff83 100755 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -278,7 +278,9 @@ LLCacheName::Impl::Impl(LLMessageSystem* msg) LLCacheName::Impl::~Impl() { for_each(mCache.begin(), mCache.end(), DeletePairedPointer()); + mCache.clear(); for_each(mReplyQueue.begin(), mReplyQueue.end(), DeletePointer()); + mReplyQueue.clear(); } boost::signals2::connection LLCacheName::Impl::addPending(const LLUUID& id, const LLCacheNameCallback& callback) diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index efbc804cbc..9e68c68858 100755 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -296,7 +296,7 @@ LLCurl::Easy* LLCurl::Easy::getEasy() // Enable a brief cache period for now. This was zero for the longest time // which caused some routers grief and generated unneeded traffic. For the - // threded resolver, we're using system resolution libraries and non-zero values + // threaded resolver, we're using system resolution libraries and non-zero values // are preferred. The c-ares resolver is another matter and it might not // track server changes as well. CURLcode result = curl_easy_setopt(easy->mCurlEasyHandle, CURLOPT_DNS_CACHE_TIMEOUT, 15); @@ -1741,6 +1741,7 @@ void LLCurl::cleanupClass() #if SAFE_SSL CRYPTO_set_locking_callback(NULL); for_each(sSSLMutex.begin(), sSSLMutex.end(), DeletePointer()); + sSSLMutex.clear(); #endif LL_CHECK_MEMORY diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index 6110b035dc..11648717ad 100755 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -217,7 +217,8 @@ static void request( Injector* body_injector, LLCurl::ResponderPtr responder, const F32 timeout = HTTP_REQUEST_EXPIRY_SECS, - const LLSD& headers = LLSD() + const LLSD& headers = LLSD(), + bool follow_redirects = true ) { if (!LLHTTPClient::hasPump()) @@ -231,7 +232,7 @@ static void request( } LLPumpIO::chain_t chain; - LLURLRequest* req = new LLURLRequest(method, url); + LLURLRequest* req = new LLURLRequest(method, url, follow_redirects); if(!req->isValid())//failed { if (responder) @@ -334,7 +335,8 @@ void LLHTTPClient::getByteRange( S32 bytes, ResponderPtr responder, const LLSD& hdrs, - const F32 timeout) + const F32 timeout, + bool follow_redirects /* = true */) { LLSD headers = hdrs; if(offset > 0 || bytes > 0) @@ -342,37 +344,42 @@ void LLHTTPClient::getByteRange( std::string range = llformat("bytes=%d-%d", offset, offset+bytes-1); headers["Range"] = range; } - request(url,LLURLRequest::HTTP_GET, NULL, responder, timeout, headers); + request(url,LLURLRequest::HTTP_GET, NULL, responder, timeout, headers, follow_redirects); } void LLHTTPClient::head( const std::string& url, ResponderPtr responder, const LLSD& headers, - const F32 timeout) + const F32 timeout, + bool follow_redirects /* = true */) { - request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout, headers); + request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout, headers, follow_redirects); } -void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout) +void LLHTTPClient::get(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout, + bool follow_redirects /* = true */) { - request(url, LLURLRequest::HTTP_GET, NULL, responder, timeout, headers); + request(url, LLURLRequest::HTTP_GET, NULL, responder, timeout, headers, follow_redirects); } -void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const LLSD& headers, const F32 timeout) +void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const LLSD& headers, + const F32 timeout, bool follow_redirects /* = true */) { - request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout, headers); + request(url, LLURLRequest::HTTP_HEAD, NULL, responder, timeout, headers, follow_redirects); } -void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const F32 timeout) +void LLHTTPClient::getHeaderOnly(const std::string& url, ResponderPtr responder, const F32 timeout, + bool follow_redirects /* = true */) { - getHeaderOnly(url, responder, LLSD(), timeout); + getHeaderOnly(url, responder, LLSD(), timeout, follow_redirects); } -void LLHTTPClient::get(const std::string& url, const LLSD& query, ResponderPtr responder, const LLSD& headers, const F32 timeout) +void LLHTTPClient::get(const std::string& url, const LLSD& query, ResponderPtr responder, const LLSD& headers, + const F32 timeout, bool follow_redirects /* = true */) { LLURI uri; uri = LLURI::buildHTTP(url, LLSD::emptyArray(), query); - get(uri.asString(), responder, headers, timeout); + get(uri.asString(), responder, headers, timeout, follow_redirects); } // A simple class for managing data returned from a curl http request. diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h index a7236ba169..5de257a4f6 100755 --- a/indra/llmessage/llhttpclient.h +++ b/indra/llmessage/llhttpclient.h @@ -63,10 +63,15 @@ public: const std::string& url, ResponderPtr, const LLSD& headers = LLSD(), - const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void getByteRange(const std::string& url, S32 offset, S32 bytes, ResponderPtr, const LLSD& headers=LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void get(const std::string& url, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void get(const std::string& url, const LLSD& query, ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, + bool follow_redirects = true); + static void getByteRange(const std::string& url, S32 offset, S32 bytes, ResponderPtr, + const LLSD& headers=LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, + bool follow_redirects = true); + static void get(const std::string& url, ResponderPtr, const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, bool follow_redirects = true); + static void get(const std::string& url, const LLSD& query, ResponderPtr, const LLSD& headers = LLSD(), + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, bool follow_redirects = true); static void put( const std::string& url, @@ -74,8 +79,10 @@ public: ResponderPtr, const LLSD& headers = LLSD(), const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void getHeaderOnly(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); - static void getHeaderOnly(const std::string& url, ResponderPtr, const LLSD& headers, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS); + static void getHeaderOnly(const std::string& url, ResponderPtr, const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, + bool follow_redirects = true); + static void getHeaderOnly(const std::string& url, ResponderPtr, const LLSD& headers, + const F32 timeout=HTTP_REQUEST_EXPIRY_SECS, bool follow_redirects = true); static void post( const std::string& url, diff --git a/indra/llmessage/llhttpnode.cpp b/indra/llmessage/llhttpnode.cpp index 5c2f73eccb..f6ccb5bdda 100755 --- a/indra/llmessage/llhttpnode.cpp +++ b/indra/llmessage/llhttpnode.cpp @@ -76,8 +76,8 @@ LLHTTPNode::LLHTTPNode() // virtual LLHTTPNode::~LLHTTPNode() { - std::for_each(impl.mNamedChildren.begin(), impl.mNamedChildren.end(), - DeletePairedPointer()); + std::for_each(impl.mNamedChildren.begin(), impl.mNamedChildren.end(), DeletePairedPointer()); + impl.mNamedChildren.clear(); delete impl.mWildcardChild; diff --git a/indra/llmessage/llhttpsender.cpp b/indra/llmessage/llhttpsender.cpp index c48cbc42a6..d0bd343db6 100755 --- a/indra/llmessage/llhttpsender.cpp +++ b/indra/llmessage/llhttpsender.cpp @@ -38,7 +38,7 @@ namespace { typedef std::map<LLHost, LLHTTPSender*> SenderMap; static SenderMap senderMap; - static LLHTTPSender* defaultSender = new LLHTTPSender(); + static LLPointer<LLHTTPSender> defaultSender(new LLHTTPSender()); } //virtual @@ -90,6 +90,5 @@ void LLHTTPSender::clearSender(const LLHost& host) //static void LLHTTPSender::setDefaultSender(LLHTTPSender* sender) { - delete defaultSender; defaultSender = sender; } diff --git a/indra/llmessage/llhttpsender.h b/indra/llmessage/llhttpsender.h index 88920db24d..ff8fa2f95b 100755 --- a/indra/llmessage/llhttpsender.h +++ b/indra/llmessage/llhttpsender.h @@ -32,7 +32,7 @@ class LLHost; class LLSD; -class LLHTTPSender +class LLHTTPSender : public LLThreadSafeRefCount { public: diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index db4a38ea9e..f7118f8ccf 100755 --- a/indra/llmessage/llinstantmessage.h +++ b/indra/llmessage/llinstantmessage.h @@ -126,7 +126,7 @@ enum EInstantMessage IM_LURE_ACCEPTED = 23, IM_LURE_DECLINED = 24, IM_GODLIKE_LURE_USER = 25, - IM_YET_TO_BE_USED = 26, + IM_TELEPORT_REQUEST = 26, // IM that notifie of a new group election. // Name is name of person who called vote. diff --git a/indra/llmessage/llmessagetemplate.h b/indra/llmessage/llmessagetemplate.h index ae8e0087c1..005a49cedf 100755 --- a/indra/llmessage/llmessagetemplate.h +++ b/indra/llmessage/llmessagetemplate.h @@ -118,6 +118,7 @@ public: ~LLMsgData() { for_each(mMemberBlocks.begin(), mMemberBlocks.end(), DeletePairedPointer()); + mMemberBlocks.clear(); } void addBlock(LLMsgBlkData *blockp) diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp index ab91f74abe..94bc7cb045 100755 --- a/indra/llmessage/lltemplatemessagereader.cpp +++ b/indra/llmessage/lltemplatemessagereader.cpp @@ -91,15 +91,17 @@ void LLTemplateMessageReader::getData(const char *blockname, const char *varname } LLMsgBlkData *msg_block_data = iter->second; - LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; + LLMsgBlkData::msg_var_data_map_t &var_data_map = msg_block_data->mMemberVarData; - if (!vardata.getName()) + if (var_data_map.find(vnamep) == var_data_map.end()) { llerrs << "Variable "<< vnamep << " not in message " << mCurrentRMessageData->mName<< " block " << bnamep << llendl; return; } + LLMsgVarData& vardata = msg_block_data->mMemberVarData[vnamep]; + if (size && size != vardata.getSize()) { llerrs << "Msg " << mCurrentRMessageData->mName diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index de9e2fe294..683065357d 100755 --- a/indra/llmessage/llurlrequest.cpp +++ b/indra/llmessage/llurlrequest.cpp @@ -150,16 +150,19 @@ std::string LLURLRequest::actionAsVerb(LLURLRequest::ERequestAction action) return VERBS[action]; } -LLURLRequest::LLURLRequest(LLURLRequest::ERequestAction action) : - mAction(action) +LLURLRequest::LLURLRequest(LLURLRequest::ERequestAction action, bool follow_redirects /* = true */) : + mAction(action), + mFollowRedirects(follow_redirects) { initialize(); } LLURLRequest::LLURLRequest( LLURLRequest::ERequestAction action, - const std::string& url) : - mAction(action) + const std::string& url, + bool follow_redirects /* = true */) : + mAction(action), + mFollowRedirects(follow_redirects) { initialize(); setURL(url); @@ -479,12 +482,18 @@ bool LLURLRequest::configure() case HTTP_HEAD: mDetail->mCurlRequest->setopt(CURLOPT_HEADER, 1); mDetail->mCurlRequest->setopt(CURLOPT_NOBODY, 1); - mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1); + if (mFollowRedirects) + { + mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1); + } rv = true; break; case HTTP_GET: mDetail->mCurlRequest->setopt(CURLOPT_HTTPGET, 1); - mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1); + if (mFollowRedirects) + { + mDetail->mCurlRequest->setopt(CURLOPT_FOLLOWLOCATION, 1); + } // Set Accept-Encoding to allow response compression mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, ""); diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h index 44d358d906..20d6e30d17 100755 --- a/indra/llmessage/llurlrequest.h +++ b/indra/llmessage/llurlrequest.h @@ -95,7 +95,7 @@ public: * * @param action One of the ERequestAction enumerations. */ - LLURLRequest(ERequestAction action); + LLURLRequest(ERequestAction action, bool follow_redirects = true); /** * @brief Constructor. @@ -103,7 +103,7 @@ public: * @param action One of the ERequestAction enumerations. * @param url The url of the request. It should already be encoded. */ - LLURLRequest(ERequestAction action, const std::string& url); + LLURLRequest(ERequestAction action, const std::string& url, bool follow_redirects = true); /** * @brief Destructor. @@ -219,10 +219,11 @@ protected: }; EState mState; ERequestAction mAction; + bool mFollowRedirects; LLURLRequestDetail* mDetail; LLIOPipe::ptr_t mCompletionCallback; - S32 mRequestTransferedBytes; - S32 mResponseTransferedBytes; + S32 mRequestTransferedBytes; + S32 mResponseTransferedBytes; static CURLcode _sslCtxCallback(CURL * curl, void *sslctx, void *param); diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index ae95087377..c3642ccbe8 100755 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -3032,12 +3032,23 @@ void LLMessageSystem::setExceptionFunc(EMessageException e, BOOL LLMessageSystem::callExceptionFunc(EMessageException exception) { callbacks_t::iterator it = mExceptionCallbacks.find(exception); - if(it != mExceptionCallbacks.end()) + if(it == mExceptionCallbacks.end()) { - ((*it).second.first)(this, (*it).second.second,exception); - return TRUE; + return FALSE; } - return FALSE; + + exception_t& ex = it->second; + msg_exception_callback ex_cb = ex.first; + + if (!ex_cb) + { + LL_WARNS("Messaging") << "LLMessageSystem::callExceptionFunc: bad message exception callback." << llendl; + return FALSE; + } + + (ex_cb)(this, ex.second, exception); + + return TRUE; } void LLMessageSystem::setTimingFunc(msg_timing_callback func, void* data) diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp index 82017ab3fa..9f4d65e723 100755 --- a/indra/llplugin/llplugincookiestore.cpp +++ b/indra/llplugin/llplugincookiestore.cpp @@ -87,6 +87,16 @@ std::string LLPluginCookieStore::Cookie::getKey() const return result; } +std::string LLPluginCookieStore::Cookie::getDomain() const +{ + std::string result; + if(mDomainEnd > mDomainStart) + { + result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart); + } + return result; +} + bool LLPluginCookieStore::Cookie::parse(const std::string &host) { bool first_field = true; @@ -662,3 +672,21 @@ void LLPluginCookieStore::removeCookie(const std::string &key) } } +void LLPluginCookieStore::removeCookiesByDomain(const std::string &domain) +{ + cookie_map_t::iterator iter = mCookies.begin(); + while(iter != mCookies.end()) + { + if(iter->second->getDomain() == domain) + { + cookie_map_t::iterator doErase = iter; + iter++; + delete doErase->second; + mCookies.erase(doErase); + } + else + { + iter++; + } + } +} diff --git a/indra/llplugin/llplugincookiestore.h b/indra/llplugin/llplugincookiestore.h index 91289d38a5..a2fdeab647 100755 --- a/indra/llplugin/llplugincookiestore.h +++ b/indra/llplugin/llplugincookiestore.h @@ -67,6 +67,8 @@ public: // quote or unquote a string as per the definition of 'quoted-string' in rfc2616 static std::string quoteString(const std::string &s); static std::string unquoteString(const std::string &s); + + void removeCookiesByDomain(const std::string &domain); private: @@ -79,6 +81,7 @@ private: // Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map. std::string getKey() const; + std::string getDomain() const; const std::string &getCookie() const { return mCookie; }; bool isSessionCookie() const { return mDate.isNull(); }; diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 058bef43a5..84c782e958 100755 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -125,6 +125,7 @@ LLFontFreetype::~LLFontFreetype() // Delete glyph info std::for_each(mCharGlyphInfoMap.begin(), mCharGlyphInfoMap.end(), DeletePairedPointer()); + mCharGlyphInfoMap.clear(); // mFontBitmapCachep will be cleaned up by LLPointer destructor. // mFallbackFonts cleaned up by LLPointer destructor diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 35620bb656..1c50a51d02 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -717,7 +717,14 @@ BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms) BOOL LLGLSLShader::link(BOOL suppress_errors) { - return LLShaderMgr::instance()->linkProgramObject(mProgramObject, suppress_errors); + BOOL success = LLShaderMgr::instance()->linkProgramObject(mProgramObject, suppress_errors); + + if (!suppress_errors) + { + LLShaderMgr::instance()->dumpObjectLog(mProgramObject, !success, mName); + } + + return success; } void LLGLSLShader::bind() diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index 0ac30b4d63..b481cf7095 100755 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -2196,7 +2196,15 @@ void LLRender::texCoord2fv(const GLfloat* tc) void LLRender::color4ub(const GLubyte& r, const GLubyte& g, const GLubyte& b, const GLubyte& a) { - mColorsp[mCount] = LLColor4U(r,g,b,a); + if (!LLGLSLShader::sCurBoundShaderPtr || + LLGLSLShader::sCurBoundShaderPtr->mAttributeMask & LLVertexBuffer::MAP_COLOR) + { + mColorsp[mCount] = LLColor4U(r,g,b,a); + } + else + { //not using shaders or shader reads color from a uniform + diffuseColor4ub(r,g,b,a); + } } void LLRender::color4ubv(const GLubyte* c) { diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index b82b370d6e..fe8110904d 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -364,35 +364,55 @@ void LLRenderTarget::release() sBytesAllocated -= mResX*mResY*4; } - else if (mUseDepth && mFBO) - { //detach shared depth buffer + else if (mFBO) + { glBindFramebuffer(GL_FRAMEBUFFER, mFBO); - if (mStencil) - { //attached as a renderbuffer - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); - mStencil = false; + + if (mUseDepth) + { //detach shared depth buffer + if (mStencil) + { //attached as a renderbuffer + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + mStencil = false; + } + else + { //attached as a texture + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0); + } + mUseDepth = false; } - else - { //attached as a texture - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0); + } + + // Detach any extra color buffers (e.g. SRGB spec buffers) + // + if (mFBO && (mTex.size() > 1)) + { + S32 z; + for (z = mTex.size() - 1; z >= 1; z--) + { + sBytesAllocated -= mResX*mResY*4; + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+z, LLTexUnit::getInternalType(mUsage), 0, 0); + stop_glerror(); + LLImageGL::deleteTextures(1, &mTex[z]); } - mUseDepth = false; } if (mFBO) { glDeleteFramebuffers(1, (GLuint *) &mFBO); + stop_glerror(); mFBO = 0; } if (mTex.size() > 0) { - sBytesAllocated -= mResX*mResY*4*mTex.size(); - LLImageGL::deleteTextures(mTex.size(), &mTex[0]); + sBytesAllocated -= mResX*mResY*4; + LLImageGL::deleteTextures(1, &mTex[0]); + } + mTex.clear(); mInternalFormat.clear(); - } mResX = mResY = 0; diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index d230574752..6e04fc82df 100755 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -505,9 +505,25 @@ static std::string get_object_log(GLhandleARB ret) return res; } -void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns) +void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns, const std::string& filename) { std::string log = get_object_log(ret); + + if (log.length() > 0 || warns) + { + if (!filename.empty()) + { + if (warns) + { + LL_WARNS("ShaderLoading") << "From " << filename << ":" << LL_ENDL; + } + else + { + LL_INFOS("ShaderLoading") << "From " << filename << ":" << LL_ENDL; + } + } + } + if ( log.length() > 0 ) { if (warns) @@ -558,7 +574,7 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade file = LLFile::fopen(fname.str(), "r"); /* Flawfinder: ignore */ if (file) { - LL_INFOS("ShaderLoading") << "Loading file: shaders/class" << gpu_class << "/" << filename << " (Want class " << gpu_class << ")" << LL_ENDL; + LL_DEBUGS("ShaderLoading") << "Loading file: shaders/class" << gpu_class << "/" << filename << " (Want class " << gpu_class << ")" << LL_ENDL; break; // done } } @@ -812,8 +828,8 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade if (error != GL_NO_ERROR || success == GL_FALSE) { //an error occured, print log - LL_WARNS("ShaderLoading") << "GLSL Compilation Error: (" << error << ") in " << filename << LL_ENDL; - dumpObjectLog(ret); + LL_WARNS("ShaderLoading") << "GLSL Compilation Error:" << LL_ENDL; + dumpObjectLog(ret, TRUE, filename); #if LL_WINDOWS std::stringstream ostr; //dump shader source for debugging @@ -938,11 +954,6 @@ BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) suppress_errors = FALSE; } #endif - if (!suppress_errors) - { - dumpObjectLog(obj, !success); - } - return success; } @@ -1146,6 +1157,7 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("env_intensity"); mReservedUniforms.push_back("matrixPalette"); + mReservedUniforms.push_back("translationPalette"); mReservedUniforms.push_back("screenTex"); mReservedUniforms.push_back("screenDepth"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 51c27fc8b6..394b38f832 100755 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -176,6 +176,7 @@ public: ENVIRONMENT_INTENSITY, AVATAR_MATRIX, + AVATAR_TRANSLATION, WATER_SCREENTEX, WATER_SCREENDEPTH, @@ -224,7 +225,7 @@ DISPLAY_GAMMA, virtual void initAttribsAndUniforms(void); BOOL attachShaderFeatures(LLGLSLShader * shader); - void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE); + void dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE, const std::string& filename = ""); BOOL linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE); BOOL validateProgramObject(GLhandleARB obj); GLhandleARB loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines = NULL, S32 texture_index_channels = -1); diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 34a08603fa..589ceac501 100755 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -75,6 +75,7 @@ set(llui_SOURCE_FILES llmultislider.cpp llmultisliderctrl.cpp llnotifications.cpp + llnotificationslistener.cpp llnotificationsutil.cpp llpanel.cpp llprogressbar.cpp @@ -128,6 +129,7 @@ set(llui_SOURCE_FILES llviewmodel.cpp llview.cpp llviewquery.cpp + llviewereventrecorder.cpp llwindowshade.cpp llxuiparser.cpp ) @@ -183,6 +185,7 @@ set(llui_HEADER_FILES llmultislider.h llnotificationptr.h llnotifications.h + llnotificationslistener.h llnotificationsutil.h llnotificationtemplate.h llnotificationvisibilityrule.h @@ -240,6 +243,7 @@ set(llui_HEADER_FILES llviewinject.h llviewmodel.h llview.h + llviewereventrecorder.h llviewquery.h llwindowshade.h llxuiparser.h diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 44f2c1efe9..3cfe5ac57f 100755 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -49,6 +49,7 @@ #include "lluictrlfactory.h" #include "llhelp.h" #include "lldockablefloater.h" +#include "llviewereventrecorder.h" static LLDefaultChildRegistry::Register<LLButton> r("button"); @@ -443,6 +444,8 @@ BOOL LLButton::handleMouseDown(S32 x, S32 y, MASK mask) */ LLUICtrl::handleMouseDown(x, y, mask); + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-55,-55,getPathname()); + if(mMouseDownSignal) (*mMouseDownSignal)(this, LLSD()); mMouseDownTimer.start(); @@ -473,6 +476,7 @@ BOOL LLButton::handleMouseUp(S32 x, S32 y, MASK mask) * by calling LLUICtrl::mMouseUpSignal(x, y, mask); */ LLUICtrl::handleMouseUp(x, y, mask); + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-55,-55,getPathname()); // Regardless of where mouseup occurs, handle callback if(mMouseUpSignal) (*mMouseUpSignal)(this, LLSD()); @@ -637,7 +641,7 @@ void LLButton::draw() bool use_glow_effect = FALSE; LLColor4 highlighting_color = LLColor4::white; - LLColor4 glow_color; + LLColor4 glow_color = LLColor4::white; LLRender::eBlendType glow_type = LLRender::BT_ADD_WITH_ALPHA; LLUIImage* imagep = NULL; diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h index e67f39b21b..3f13691a30 100755 --- a/indra/llui/llchatentry.h +++ b/indra/llui/llchatentry.h @@ -62,8 +62,8 @@ public: virtual void draw(); virtual void onCommit(); - /*virtual*/ void onFocusReceived(); - /*virtual*/ void onFocusLost(); + /*virtual*/ void onFocusReceived(); + /*virtual*/ void onFocusLost(); void enableSingleLineMode(bool single_line_mode); boost::signals2::connection setTextExpandedCallback(const commit_signal_t::slot_type& cb); diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index d4e14d9419..56be52f69a 100755 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -534,6 +534,13 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p) } } +void LLComboBox::setLeftTextPadding(S32 pad) +{ + S32 left_pad, right_pad; + mTextEntry->getTextPadding(&left_pad, &right_pad); + mTextEntry->setTextPadding(pad, right_pad); +} + void* LLComboBox::getCurrentUserdata() { LLScrollListItem* item = mList->getFirstSelected(); diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index 64dbaea306..67393504e7 100755 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -191,6 +191,8 @@ public: //======================================================================== + void setLeftTextPadding(S32 pad); + void* getCurrentUserdata(); void setPrearrangeCallback( commit_callback_t cb ) { mPrearrangeCallback = cb; } diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp index 5f69c6af31..304d21d0df 100755 --- a/indra/llui/lldraghandle.cpp +++ b/indra/llui/lldraghandle.cpp @@ -315,14 +315,15 @@ BOOL LLDragHandle::handleHover(S32 x, S32 y, MASK mask) S32 delta_y = screen_y - mDragLastScreenY; // if dragging a docked floater we want to undock - if (((LLFloater*)getParent())->isDocked()) + LLFloater * parent = dynamic_cast<LLFloater *>(getParent()); + if (parent && parent->isDocked()) { const S32 SLOP = 12; if (delta_y <= -SLOP || delta_y >= SLOP) { - ((LLFloater*)getParent())->setDocked(false, false); + parent->setDocked(false, false); return TRUE; } else diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 273ceb4038..c462b2aa52 100755 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -29,7 +29,7 @@ // mini-map floater, etc. #include "linden_common.h" - +#include "llviewereventrecorder.h" #include "llfloater.h" #include "llfocusmgr.h" @@ -528,7 +528,6 @@ LLFloater::~LLFloater() setVisible(false); // We're not visible if we're destroyed storeVisibilityControl(); storeDockStateControl(); - delete mMinimizeSignal; } @@ -642,7 +641,10 @@ void LLFloater::handleVisibilityChange ( BOOL new_visibility ) void LLFloater::openFloater(const LLSD& key) { - llinfos << "Opening floater " << getName() << llendl; + llinfos << "Opening floater " << getName() << " full path: " << getPathname() << llendl; + + LLViewerEventRecorder::instance().logVisibilityChange( getPathname(), getName(), true,"floater"); // Last param is event subtype or empty string + mKey = key; // in case we need to open ourselves again if (getSoundFlags() != SILENT @@ -696,6 +698,7 @@ void LLFloater::openFloater(const LLSD& key) void LLFloater::closeFloater(bool app_quitting) { llinfos << "Closing floater " << getName() << llendl; + LLViewerEventRecorder::instance().logVisibilityChange( getPathname(), getName(), false,"floater"); // Last param is event subtype or empty string if (app_quitting) { LLFloater::sQuitting = true; @@ -1134,7 +1137,11 @@ void LLFloater::handleReshape(const LLRect& new_rect, bool by_user) if (by_user && !getHost()) { - static_cast<LLFloaterView*>(getParent())->adjustToFitScreen(this, !isMinimized()); + LLFloaterView * floaterVp = dynamic_cast<LLFloaterView*>(getParent()); + if (floaterVp) + { + floaterVp->adjustToFitScreen(this, !isMinimized()); + } } // if not minimized, adjust all snapped dependents to new shape @@ -1335,7 +1342,7 @@ void LLFloater::setFocus( BOOL b ) { return; } - LLUICtrl* last_focus = gFocusMgr.getLastFocusForGroup(this); + LLView* last_focus = gFocusMgr.getLastFocusForGroup(this); // a descendent already has focus BOOL child_had_focus = hasFocus(); @@ -1345,7 +1352,8 @@ void LLFloater::setFocus( BOOL b ) if (b) { // only push focused floaters to front of stack if not in midst of ctrl-tab cycle - if (!getHost() && !((LLFloaterView*)getParent())->getCycleMode()) + LLFloaterView * parent = dynamic_cast<LLFloaterView *>(getParent()); + if (!getHost() && parent && !parent->getCycleMode()) { if (!isFrontmost()) { @@ -1543,6 +1551,17 @@ BOOL LLFloater::handleScrollWheel(S32 x, S32 y, S32 clicks) } // virtual +BOOL LLFloater::handleMouseUp(S32 x, S32 y, MASK mask) +{ + lldebugs << "LLFloater::handleMouseUp calling LLPanel (really LLView)'s handleMouseUp (first initialized xui to: " << getPathname() << " )" << llendl; + BOOL handled = LLPanel::handleMouseUp(x,y,mask); // Not implemented in LLPanel so this actually calls LLView + if (handled) { + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-55,-55,getPathname()); + } + return handled; +} + +// virtual BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask) { if( mMinimized ) @@ -1562,7 +1581,11 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask) else { bringToFront( x, y ); - return LLPanel::handleMouseDown( x, y, mask ); + BOOL handled = LLPanel::handleMouseDown( x, y, mask ); + if (handled) { + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-55,-55,getPathname()); + } + return handled; } } @@ -1600,7 +1623,7 @@ void LLFloater::bringToFront( S32 x, S32 y ) } else { - LLFloaterView* parent = (LLFloaterView*) getParent(); + LLFloaterView* parent = dynamic_cast<LLFloaterView*>( getParent() ); if (parent) { parent->bringToFront( this ); @@ -1639,7 +1662,11 @@ void LLFloater::setFrontmost(BOOL take_focus) { // there are more than one floater view // so we need to query our parent directly - ((LLFloaterView*)getParent())->bringToFront(this, take_focus); + LLFloaterView * parent = dynamic_cast<LLFloaterView*>( getParent() ); + if (parent) + { + parent->bringToFront(this, take_focus); + } // Make sure to set the appropriate transparency type (STORM-732). updateTransparency(hasFocus() || getIsChrome() ? TT_ACTIVE : TT_INACTIVE); @@ -1802,7 +1829,7 @@ void LLFloater::onClickClose( LLFloater* self ) self->onClickCloseBtn(); } -void LLFloater::onClickCloseBtn() +void LLFloater::onClickCloseBtn(bool app_quitting) { closeFloater(false); } @@ -1932,6 +1959,7 @@ void LLFloater::drawShadow(LLPanel* panel) void LLFloater::updateTransparency(LLView* view, ETypeTransparency transparency_type) { + if (!view) return; child_list_t children = *view->getChildList(); child_list_t::iterator it = children.begin(); @@ -2368,6 +2396,9 @@ LLRect LLFloaterView::findNeighboringPosition( LLFloater* reference_floater, LLF void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus) { + if (!child) + return; + if (mFrontChild == child) { if (give_focus && !gFocusMgr.childHasKeyboardFocus(child)) @@ -2723,8 +2754,6 @@ void LLFloaterView::refresh() } } -const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; - void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_outside, BOOL snap_in_toolbars/* = false*/) { if (floater->getParent() != this) @@ -2777,11 +2806,29 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out } } + const LLRect& floater_rect = floater->getRect(); + + S32 delta_left = mToolbarLeftRect.notEmpty() ? mToolbarLeftRect.mRight - floater_rect.mRight : 0; + S32 delta_bottom = mToolbarBottomRect.notEmpty() ? mToolbarBottomRect.mTop - floater_rect.mTop : 0; + S32 delta_right = mToolbarRightRect.notEmpty() ? mToolbarRightRect.mLeft - floater_rect.mLeft : 0; + // move window fully onscreen if (floater->translateIntoRect( snap_in_toolbars ? getSnapRect() : gFloaterView->getRect(), allow_partial_outside ? FLOATER_MIN_VISIBLE_PIXELS : S32_MAX )) { floater->clearSnapTarget(); } + else if (delta_left > 0 && floater_rect.mTop < mToolbarLeftRect.mTop && floater_rect.mBottom > mToolbarLeftRect.mBottom) + { + floater->translate(delta_left, 0); + } + else if (delta_bottom > 0 && floater_rect.mLeft > mToolbarBottomRect.mLeft && floater_rect.mRight < mToolbarBottomRect.mRight) + { + floater->translate(0, delta_bottom); + } + else if (delta_right < 0 && floater_rect.mTop < mToolbarRightRect.mTop && floater_rect.mBottom > mToolbarRightRect.mBottom) + { + floater->translate(delta_right, 0); + } } void LLFloaterView::draw() @@ -2827,10 +2874,13 @@ LLFloater *LLFloaterView::getFocusedFloater() const { for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it) { - LLUICtrl* ctrlp = (*child_it)->isCtrl() ? static_cast<LLUICtrl*>(*child_it) : NULL; - if ( ctrlp && ctrlp->hasFocus() ) + if ((*child_it)->isCtrl()) { - return static_cast<LLFloater *>(ctrlp); + LLFloater* ctrlp = dynamic_cast<LLFloater*>(*child_it); + if ( ctrlp && ctrlp->hasFocus() ) + { + return ctrlp; + } } } return NULL; @@ -2981,6 +3031,25 @@ void LLFloaterView::popVisibleAll(const skip_list_t& skip_list) LLFloaterReg::blockShowFloaters(false); } +void LLFloaterView::setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect) +{ + switch (tb) + { + case LLToolBarEnums::TOOLBAR_LEFT: + mToolbarLeftRect = toolbar_rect; + break; + case LLToolBarEnums::TOOLBAR_BOTTOM: + mToolbarBottomRect = toolbar_rect; + break; + case LLToolBarEnums::TOOLBAR_RIGHT: + mToolbarRightRect = toolbar_rect; + break; + default: + llwarns << "setToolbarRect() passed odd toolbar number " << (S32) tb << llendl; + break; + } +} + void LLFloater::setInstanceName(const std::string& name) { if (name != mInstanceName) diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 59448530d9..12eb3cdbfa 100755 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -32,6 +32,7 @@ #define LL_FLOATER_H #include "llpanel.h" +#include "lltoolbar.h" #include "lluuid.h" //#include "llnotificationsutil.h" #include <set> @@ -289,6 +290,7 @@ public: S32 getHeaderHeight() const { return mHeaderHeight; } virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask); @@ -389,7 +391,7 @@ protected: void destroy(); // Don't call this directly. You probably want to call closeFloater() - virtual void onClickCloseBtn(); + virtual void onClickCloseBtn(bool app_quitting = false); virtual void updateTitleButtons(); @@ -513,6 +515,8 @@ private: // LLFloaterView // Parent of all floating panels +const S32 FLOATER_MIN_VISIBLE_PIXELS = 16; + class LLFloaterView : public LLUICtrl { public: @@ -571,10 +575,15 @@ public: void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; } LLFloater* getFrontmostClosableFloater(); + void setToolbarRect(LLToolBarEnums::EToolBarLocation tb, const LLRect& toolbar_rect); + private: void hiddenFloaterClosed(LLFloater* floater); LLRect mLastSnapRect; + LLRect mToolbarLeftRect; + LLRect mToolbarBottomRect; + LLRect mToolbarRightRect; LLHandle<LLView> mSnapView; BOOL mFocusCycleMode; S32 mSnapOffsetBottom; diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 724d190307..f03c8d444b 100755 --- a/indra/llui/llfocusmgr.cpp +++ b/indra/llui/llfocusmgr.cpp @@ -469,7 +469,7 @@ void LLFocusMgr::setAppHasFocus(BOOL focus) mAppHasFocus = focus; } -LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const +LLView* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const { if (subtree_root) { @@ -477,7 +477,7 @@ LLUICtrl* LLFocusMgr::getLastFocusForGroup(LLView* subtree_root) const if (found_it != mImpl->mFocusHistory.end()) { // found last focus for this subtree - return static_cast<LLUICtrl*>(found_it->second.get()); + return found_it->second.get(); } } return NULL; diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h index 25ae1d2579..1c7326260c 100755 --- a/indra/llui/llfocusmgr.h +++ b/indra/llui/llfocusmgr.h @@ -97,7 +97,7 @@ public: void triggerFocusFlash(); BOOL getAppHasFocus() const { return mAppHasFocus; } void setAppHasFocus(BOOL focus); - LLUICtrl* getLastFocusForGroup(LLView* subtree_root) const; + LLView* getLastFocusForGroup(LLView* subtree_root) const; void clearLastFocusForGroup(LLView* subtree_root); // If setKeyboardFocus(NULL) is called, and there is a non-NULL default diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index cf449217f5..f32a52e6c6 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -185,7 +185,7 @@ LLFolderView::LLFolderView(const Params& p) mAutoOpenCandidate = NULL; mAutoOpenTimer.stop(); mKeyboardSelection = FALSE; - mIndentation = p.folder_indentation; + mIndentation = getParentFolder() ? getParentFolder()->getIndentation() + mLocalIndentation : 0; //clear label // go ahead and render root folder as usual @@ -1613,7 +1613,7 @@ void LLFolderView::update() { getFolderViewModel()->getFilter().clearModified(); } - + // automatically show matching items, and select first one if we had a selection if (mNeedsAutoSelect) { @@ -1653,13 +1653,13 @@ void LLFolderView::update() BOOL is_visible = isInVisibleChain(); - // Puts folders/items in proper positions + //Puts folders/items in proper positions // arrange() takes the model filter flag into account and call sort() if necessary (CHUI-849) // It also handles the open/close folder animation - if (is_visible) + if ( is_visible ) { sanitizeSelection(); - if (needsArrange()) + if( needsArrange() ) { S32 height = 0; S32 width = 0; diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 6c147ccc12..aa2343226c 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -307,7 +307,12 @@ std::set<LLFolderViewItem*> LLFolderViewItem::getSelectionList() const // addToFolder() returns TRUE if it succeeds. FALSE otherwise void LLFolderViewItem::addToFolder(LLFolderViewFolder* folder) { - folder->addItem(this); + folder->addItem(this); + + // Compute indentation since parent folder changed + mIndentation = (getParentFolder()) + ? getParentFolder()->getIndentation() + mLocalIndentation + : 0; } @@ -521,7 +526,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask ) BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask ) { - static LLCachedControl<S32> drag_and_drop_threshold(*LLUI::sSettingGroups["config"],"DragAndDropDistanceThreshold"); + static LLCachedControl<S32> drag_and_drop_threshold(*LLUI::sSettingGroups["config"],"DragAndDropDistanceThreshold", 3); mIsMouseOverTitle = (y > (getRect().getHeight() - mItemHeight)); @@ -940,6 +945,11 @@ LLFolderViewFolder::~LLFolderViewFolder( void ) void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder) { folder->addFolder(this); + + // Compute indentation since parent folder changed + mIndentation = (getParentFolder()) + ? getParentFolder()->getIndentation() + mLocalIndentation + : 0; } static LLFastTimer::DeclareTimer FTM_ARRANGE("Arrange"); @@ -1109,7 +1119,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height ) BOOL LLFolderViewFolder::needsArrange() { - return mLastArrangeGeneration < getRoot()->getArrangeGeneration(); + return mLastArrangeGeneration < getRoot()->getArrangeGeneration(); } // Passes selection information on to children and record selection diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index 26d27d1f34..39153977bf 100755 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -76,8 +76,11 @@ inline BOOL LLKeywordToken::isTail(const llwchar* s) const LLKeywords::~LLKeywords() { std::for_each(mWordTokenMap.begin(), mWordTokenMap.end(), DeletePairedPointer()); + mWordTokenMap.clear(); std::for_each(mLineTokenList.begin(), mLineTokenList.end(), DeletePointer()); + mLineTokenList.clear(); std::for_each(mDelimiterTokenList.begin(), mDelimiterTokenList.end(), DeletePointer()); + mDelimiterTokenList.clear(); } BOOL LLKeywords::loadFromFile( const std::string& filename ) diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index f854e1785d..6a57158eaa 100755 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -693,8 +693,11 @@ void LLMenuItemTearOffGL::onCommit() { if (getMenu()->getTornOff()) { - LLTearOffMenu* torn_off_menu = (LLTearOffMenu*)(getMenu()->getParent()); - torn_off_menu->closeFloater(); + LLTearOffMenu * torn_off_menu = dynamic_cast<LLTearOffMenu*>(getMenu()->getParent()); + if (torn_off_menu) + { + torn_off_menu->closeFloater(); + } } else { @@ -1097,7 +1100,8 @@ void LLMenuItemBranchGL::setHighlight( BOOL highlight ) BOOL auto_open = getEnabled() && (!branch->getVisible() || branch->getTornOff()); // torn off menus don't open sub menus on hover unless they have focus - if (getMenu()->getTornOff() && !((LLFloater*)getMenu()->getParent())->hasFocus()) + LLFloater * menu_parent = dynamic_cast<LLFloater *>(getMenu()->getParent()); + if (getMenu()->getTornOff() && menu_parent && !menu_parent->hasFocus()) { auto_open = FALSE; } @@ -1118,7 +1122,11 @@ void LLMenuItemBranchGL::setHighlight( BOOL highlight ) { if (branch->getTornOff()) { - ((LLFloater*)branch->getParent())->setFocus(FALSE); + LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent()); + if (branch_parent) + { + branch_parent->setFocus(FALSE); + } branch->clearHoverItem(); } else @@ -1175,11 +1183,19 @@ BOOL LLMenuItemBranchGL::handleKeyHere( KEY key, MASK mask ) BOOL handled = branch->clearHoverItem(); if (branch->getTornOff()) { - ((LLFloater*)branch->getParent())->setFocus(FALSE); + LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent()); + if (branch_parent) + { + branch_parent->setFocus(FALSE); + } } if (handled && getMenu()->getTornOff()) { - ((LLFloater*)getMenu()->getParent())->setFocus(TRUE); + LLFloater * menu_parent = dynamic_cast<LLFloater *>(getMenu()->getParent()); + if (menu_parent) + { + menu_parent->setFocus(TRUE); + } } return handled; } @@ -1219,9 +1235,13 @@ void LLMenuItemBranchGL::openMenu() if (branch->getTornOff()) { - gFloaterView->bringToFront((LLFloater*)branch->getParent()); - // this might not be necessary, as torn off branches don't get focus and hence no highligth - branch->highlightNextItem(NULL); + LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent()); + if (branch_parent) + { + gFloaterView->bringToFront(branch_parent); + // this might not be necessary, as torn off branches don't get focus and hence no highligth + branch->highlightNextItem(NULL); + } } else if( !branch->getVisible() ) { @@ -1348,7 +1368,11 @@ void LLMenuItemBranchDownGL::openMenu( void ) { if (branch->getTornOff()) { - gFloaterView->bringToFront((LLFloater*)branch->getParent()); + LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent()); + if (branch_parent) + { + gFloaterView->bringToFront(branch_parent); + } } else { @@ -1403,7 +1427,11 @@ void LLMenuItemBranchDownGL::setHighlight( BOOL highlight ) { if (branch->getTornOff()) { - ((LLFloater*)branch->getParent())->setFocus(FALSE); + LLFloater * branch_parent = dynamic_cast<LLFloater *>(branch->getParent()); + if (branch_parent) + { + branch_parent->setFocus(FALSE); + } branch->clearHoverItem(); } else @@ -1826,20 +1854,28 @@ BOOL LLMenuGL::jumpKeysActive() { LLMenuItemGL* highlighted_item = getHighlightedItem(); BOOL active = getVisible() && getEnabled(); - if (getTornOff()) - { - // activation of jump keys on torn off menus controlled by keyboard focus - active = active && ((LLFloater*)getParent())->hasFocus(); - } - else + if (active) { - // Are we the terminal active menu? - // Yes, if parent menu item deems us to be active (just being visible is sufficient for top-level menus) - // and we don't have a highlighted menu item pointing to an active sub-menu - active = active && (!getParentMenuItem() || getParentMenuItem()->isActive()) // I have a parent that is active... - && (!highlighted_item || !highlighted_item->isActive()); //... but no child that is active + if (getTornOff()) + { + // activation of jump keys on torn off menus controlled by keyboard focus + LLFloater * parent = dynamic_cast<LLFloater *>(getParent()); + if (parent) + { + active = parent->hasFocus(); + } + } + else + { + // Are we the terminal active menu? + // Yes, if parent menu item deems us to be active (just being visible is sufficient for top-level menus) + // and we don't have a highlighted menu item pointing to an active sub-menu + active = (!getParentMenuItem() || getParentMenuItem()->isActive()) // I have a parent that is active... + && (!highlighted_item || !highlighted_item->isActive()); //... but no child that is active + } } + return active; } @@ -1855,7 +1891,12 @@ BOOL LLMenuGL::isOpen() return TRUE; } // otherwise we are only active if we have keyboard focus - return ((LLFloater*)getParent())->hasFocus(); + LLFloater * parent = dynamic_cast<LLFloater *>(getParent()); + if (parent) + { + return parent->hasFocus(); + } + return FALSE; } else { @@ -2714,7 +2755,11 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa // same as giving focus to it if (!cur_item && getTornOff()) { - ((LLFloater*)getParent())->setFocus(TRUE); + LLFloater * parent = dynamic_cast<LLFloater *>(getParent()); + if (parent) + { + parent->setFocus(TRUE); + } } // Current item position in the items list @@ -2816,7 +2861,11 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa // same as giving focus to it if (!cur_item && getTornOff()) { - ((LLFloater*)getParent())->setFocus(TRUE); + LLFloater * parent = dynamic_cast<LLFloater *>(getParent()); + if (parent) + { + parent->setFocus(TRUE); + } } // Current item reverse position from the end of the list diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp index 8c2be44904..4d6e189b92 100755 --- a/indra/llui/llmodaldialog.cpp +++ b/indra/llui/llmodaldialog.cpp @@ -34,7 +34,7 @@ #include "llui.h" #include "llwindow.h" #include "llkeyboard.h" - +#include "llmenugl.h" // static std::list<LLModalDialog*> LLModalDialog::sModalStack; @@ -161,6 +161,18 @@ void LLModalDialog::setVisible( BOOL visible ) BOOL LLModalDialog::handleMouseDown(S32 x, S32 y, MASK mask) { + LLView* popup_menu = LLMenuGL::sMenuContainer->getVisibleMenu(); + if (popup_menu != NULL) + { + S32 mx, my; + LLUI::getMousePositionScreen(&mx, &my); + LLRect menu_screen_rc = popup_menu->calcScreenRect(); + if(!menu_screen_rc.pointInRect(mx, my)) + { + LLMenuGL::sMenuContainer->hideMenus(); + } + } + if (mModal) { if (!LLFloater::handleMouseDown(x, y, mask)) @@ -173,6 +185,8 @@ BOOL LLModalDialog::handleMouseDown(S32 x, S32 y, MASK mask) { LLFloater::handleMouseDown(x, y, mask); } + + return TRUE; } @@ -183,6 +197,22 @@ BOOL LLModalDialog::handleHover(S32 x, S32 y, MASK mask) getWindow()->setCursor(UI_CURSOR_ARROW); lldebugst(LLERR_USER_INPUT) << "hover handled by " << getName() << llendl; } + + LLView* popup_menu = LLMenuGL::sMenuContainer->getVisibleMenu(); + if (popup_menu != NULL) + { + S32 mx, my; + LLUI::getMousePositionScreen(&mx, &my); + LLRect menu_screen_rc = popup_menu->calcScreenRect(); + if(menu_screen_rc.pointInRect(mx, my)) + { + S32 local_x = mx - popup_menu->getRect().mLeft; + S32 local_y = my - popup_menu->getRect().mBottom; + popup_menu->handleHover(local_x, local_y, mask); + gFocusMgr.setMouseCapture(NULL); + } + } + return TRUE; } @@ -210,6 +240,7 @@ BOOL LLModalDialog::handleDoubleClick(S32 x, S32 y, MASK mask) BOOL LLModalDialog::handleRightMouseDown(S32 x, S32 y, MASK mask) { + LLMenuGL::sMenuContainer->hideMenus(); childrenHandleRightMouseDown(x, y, mask); return TRUE; } diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 3186c5460a..5c288c3f03 100755 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1206,6 +1206,7 @@ LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything), mIgnoreAllNotifications(false) { + mListener.reset(new LLNotificationsListener(*this)); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2)); } diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 3b620084ee..6ac4a98806 100755 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -98,6 +98,8 @@ #include "llrefcount.h" #include "llsdparam.h" +#include "llnotificationslistener.h" + class LLAvatarName; typedef enum e_notification_priority { @@ -978,6 +980,8 @@ private: bool mIgnoreAllNotifications; + boost::scoped_ptr<LLNotificationsListener> mListener; + std::vector<LLNotificationChannelPtr> mDefaultChannels; }; diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp new file mode 100644 index 0000000000..9e8e943ee6 --- /dev/null +++ b/indra/llui/llnotificationslistener.cpp @@ -0,0 +1,359 @@ +/** + * @file llnotificationslistener.cpp + * @author Brad Kittenbrink + * @date 2009-07-08 + * @brief Implementation for llnotificationslistener. + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "llnotificationslistener.h" +#include "llnotifications.h" +#include "llnotificationtemplate.h" +#include "llsd.h" +#include "llui.h" + +LLNotificationsListener::LLNotificationsListener(LLNotifications & notifications) : + LLEventAPI("LLNotifications", + "LLNotifications listener to (e.g.) pop up a notification"), + mNotifications(notifications) +{ + add("requestAdd", + "Add a notification with specified [\"name\"], [\"substitutions\"] and [\"payload\"].\n" + "If optional [\"reply\"] specified, arrange to send user response on that LLEventPump.", + &LLNotificationsListener::requestAdd); + /* add("listChannels", + "Post to [\"reply\"] a map of info on existing channels", + &LLNotificationsListener::listChannels, + LLSD().with("reply", LLSD())); + */ + add("listChannelNotifications", + "Post to [\"reply\"] an array of info on notifications in channel [\"channel\"]", + &LLNotificationsListener::listChannelNotifications, + LLSD().with("reply", LLSD()).with("channel", LLSD())); + add("respond", + "Respond to notification [\"uuid\"] with data in [\"response\"]", + &LLNotificationsListener::respond, + LLSD().with("uuid", LLSD())); + add("cancel", + "Cancel notification [\"uuid\"]", + &LLNotificationsListener::cancel, + LLSD().with("uuid", LLSD())); + add("ignore", + "Ignore future notification [\"name\"]\n" + "(from <notification name= > in notifications.xml)\n" + "according to boolean [\"ignore\"].\n" + "If [\"name\"] is omitted or undefined, [un]ignore all future notifications.\n" + "Note that ignored notifications are not forwarded unless intercepted before\n" + "the \"Ignore\" channel.", + &LLNotificationsListener::ignore); + add("forward", + "Forward to [\"pump\"] future notifications on channel [\"channel\"]\n" + "according to boolean [\"forward\"]. When enabled, only types matching\n" + "[\"types\"] are forwarded, as follows:\n" + "omitted or undefined: forward all notifications\n" + "string: forward only the specific named [sig]type\n" + "array of string: forward any notification matching any named [sig]type.\n" + "When boolean [\"respond\"] is true, we auto-respond to each forwarded\n" + "notification.", + &LLNotificationsListener::forward, + LLSD().with("channel", LLSD())); +} + +// This is here in the .cpp file so we don't need the definition of class +// Forwarder in the header file. +LLNotificationsListener::~LLNotificationsListener() +{ +} + +void LLNotificationsListener::requestAdd(const LLSD& event_data) const +{ + if(event_data.has("reply")) + { + mNotifications.add(event_data["name"], + event_data["substitutions"], + event_data["payload"], + boost::bind(&LLNotificationsListener::NotificationResponder, + this, + event_data["reply"].asString(), + _1, _2 + ) + ); + } + else + { + mNotifications.add(event_data["name"], + event_data["substitutions"], + event_data["payload"]); + } +} + +void LLNotificationsListener::NotificationResponder(const std::string& reply_pump, + const LLSD& notification, + const LLSD& response) const +{ + LLSD reponse_event; + reponse_event["notification"] = notification; + reponse_event["response"] = response; + LLEventPumps::getInstance()->obtain(reply_pump).post(reponse_event); +} +/* +void LLNotificationsListener::listChannels(const LLSD& params) const +{ + LLReqID reqID(params); + LLSD response(reqID.makeResponse()); + for (LLNotifications:: + + + + for (LLNotifications::ChannelMap::const_iterator cmi(mNotifications.mChannels.begin()), + cmend(mNotifications.mChannels.end()); + cmi != cmend; ++cmi) + { + LLSD channelInfo; + channelInfo["parent"] = cmi->second->getParentChannelName(); + response[cmi->first] = channelInfo; + } + LLEventPumps::instance().obtain(params["reply"]).post(response); +} +*/ +void LLNotificationsListener::listChannelNotifications(const LLSD& params) const +{ + LLReqID reqID(params); + LLSD response(reqID.makeResponse()); + LLNotificationChannelPtr channel(mNotifications.getChannel(params["channel"])); + if (channel) + { + LLSD notifications(LLSD::emptyArray()); + for (LLNotificationChannel::Iterator ni(channel->begin()), nend(channel->end()); + ni != nend; ++ni) + { + notifications.append(asLLSD(*ni)); + } + response["notifications"] = notifications; + } + LLEventPumps::instance().obtain(params["reply"]).post(response); +} + +void LLNotificationsListener::respond(const LLSD& params) const +{ + LLNotificationPtr notification(mNotifications.find(params["uuid"])); + if (notification) + { + notification->respond(params["response"]); + } +} + +void LLNotificationsListener::cancel(const LLSD& params) const +{ + LLNotificationPtr notification(mNotifications.find(params["uuid"])); + if (notification) + { + mNotifications.cancel(notification); + } +} + +void LLNotificationsListener::ignore(const LLSD& params) const +{ + // Calling a method named "ignore", but omitting its "ignore" Boolean + // argument, should by default cause something to be ignored. Explicitly + // pass ["ignore"] = false to cancel ignore. + bool ignore = true; + if (params.has("ignore")) + { + ignore = params["ignore"].asBoolean(); + } + // This method can be used to affect either a single notification name or + // all future notifications. The two use substantially different mechanisms. + if (params["name"].isDefined()) + { + // ["name"] was passed: ignore just that notification + LLNotificationTemplatePtr templatep = mNotifications.getTemplate(params["name"]); + if (templatep) + { + templatep->mForm->setIgnored(ignore); + } + } + else + { + // no ["name"]: ignore all future notifications + mNotifications.setIgnoreAllNotifications(ignore); + } +} + +class LLNotificationsListener::Forwarder: public LLEventTrackable +{ + LOG_CLASS(LLNotificationsListener::Forwarder); +public: + Forwarder(LLNotifications& llnotifications, const std::string& channel): + mNotifications(llnotifications), + mRespond(false) + { + // Connect to the specified channel on construction. Because + // LLEventTrackable is a base, we should automatically disconnect when + // destroyed. + LLNotificationChannelPtr channelptr(llnotifications.getChannel(channel)); + if (channelptr) + { + // Insert our processing as a "passed filter" listener. This way + // we get to run before all the "changed" listeners, and we get to + // swipe it (hide it from the other listeners) if desired. + channelptr->connectPassedFilter(boost::bind(&Forwarder::handle, this, _1)); + } + } + + void setPumpName(const std::string& name) { mPumpName = name; } + void setTypes(const LLSD& types) { mTypes = types; } + void setRespond(bool respond) { mRespond = respond; } + +private: + bool handle(const LLSD& notification) const; + bool matchType(const LLSD& filter, const std::string& type) const; + + LLNotifications& mNotifications; + std::string mPumpName; + LLSD mTypes; + bool mRespond; +}; + +void LLNotificationsListener::forward(const LLSD& params) +{ + std::string channel(params["channel"]); + // First decide whether we're supposed to start forwarding or stop it. + // Default to true. + bool forward = true; + if (params.has("forward")) + { + forward = params["forward"].asBoolean(); + } + if (! forward) + { + // This is a request to stop forwarding notifications on the specified + // channel. The rest of the params don't matter. + // Because mForwarders contains scoped_ptrs, erasing the map entry + // DOES delete the heap Forwarder object. Because Forwarder derives + // from LLEventTrackable, destroying it disconnects it from the + // channel. + mForwarders.erase(channel); + return; + } + // From here on, we know we're being asked to start (or modify) forwarding + // on the specified channel. Find or create an appropriate Forwarder. + ForwarderMap::iterator + entry(mForwarders.insert(ForwarderMap::value_type(channel, ForwarderMap::mapped_type())).first); + if (! entry->second) + { + entry->second.reset(new Forwarder(mNotifications, channel)); + } + // Now, whether this Forwarder is brand-new or not, update it with the new + // request info. + Forwarder& fwd(*entry->second); + fwd.setPumpName(params["pump"]); + fwd.setTypes(params["types"]); + fwd.setRespond(params["respond"]); +} + +bool LLNotificationsListener::Forwarder::handle(const LLSD& notification) const +{ + LL_INFOS("LLNotificationsListener") << "handle(" << notification << ")" << LL_ENDL; + if (notification["sigtype"].asString() == "delete") + { + LL_INFOS("LLNotificationsListener") << "ignoring delete" << LL_ENDL; + // let other listeners see the "delete" operation + return false; + } + LLNotificationPtr note(mNotifications.find(notification["id"])); + if (! note) + { + LL_INFOS("LLNotificationsListener") << notification["id"] << " not found" << LL_ENDL; + return false; + } + if (! matchType(mTypes, note->getType())) + { + LL_INFOS("LLNotificationsListener") << "didn't match types " << mTypes << LL_ENDL; + // We're not supposed to intercept this particular notification. Let + // other listeners process it. + return false; + } + LL_INFOS("LLNotificationsListener") << "sending via '" << mPumpName << "'" << LL_ENDL; + // This is a notification we care about. Forward it through specified + // LLEventPump. + LLEventPumps::instance().obtain(mPumpName).post(asLLSD(note)); + // Are we also being asked to auto-respond? + if (mRespond) + { + LL_INFOS("LLNotificationsListener") << "should respond" << LL_ENDL; + note->respond(LLSD::emptyMap()); + // Did that succeed in removing the notification? Only cancel() if + // it's still around -- otherwise we get an LL_ERRS crash! + note = mNotifications.find(notification["id"]); + if (note) + { + LL_INFOS("LLNotificationsListener") << "respond() didn't clear, canceling" << LL_ENDL; + mNotifications.cancel(note); + } + } + // If we've auto-responded to this notification, then it's going to be + // deleted. Other listeners would get the change operation, try to look it + // up and be baffled by lookup failure. So when we auto-respond, suppress + // this notification: don't pass it to other listeners. + return mRespond; +} + +bool LLNotificationsListener::Forwarder::matchType(const LLSD& filter, const std::string& type) const +{ + // Decide whether this notification matches filter: + // undefined: forward all notifications + if (filter.isUndefined()) + { + return true; + } + // array of string: forward any notification matching any named type + if (filter.isArray()) + { + for (LLSD::array_const_iterator ti(filter.beginArray()), tend(filter.endArray()); + ti != tend; ++ti) + { + if (ti->asString() == type) + { + return true; + } + } + // Didn't match any entry in the array + return false; + } + // string: forward only the specific named type + return (filter.asString() == type); +} + +LLSD LLNotificationsListener::asLLSD(LLNotificationPtr note) +{ + LLSD notificationInfo(note->asLLSD()); + // For some reason the following aren't included in LLNotification::asLLSD(). + notificationInfo["summary"] = note->summarize(); + notificationInfo["id"] = note->id(); + notificationInfo["type"] = note->getType(); + notificationInfo["message"] = note->getMessage(); + notificationInfo["label"] = note->getLabel(); + return notificationInfo; +} diff --git a/indra/llui/llnotificationslistener.h b/indra/llui/llnotificationslistener.h new file mode 100644 index 0000000000..f9f7641de6 --- /dev/null +++ b/indra/llui/llnotificationslistener.h @@ -0,0 +1,69 @@ +/** + * @file llnotificationslistener.h + * @author Brad Kittenbrink + * @date 2009-07-08 + * @brief Wrap subset of LLNotifications API in event API for test scripts. + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLNOTIFICATIONSLISTENER_H +#define LL_LLNOTIFICATIONSLISTENER_H + +#include "lleventapi.h" +#include "llnotificationptr.h" +#include <boost/shared_ptr.hpp> +#include <map> +#include <string> + +class LLNotifications; +class LLSD; + +class LLNotificationsListener : public LLEventAPI +{ +public: + LLNotificationsListener(LLNotifications & notifications); + ~LLNotificationsListener(); + +private: + void requestAdd(LLSD const & event_data) const; + + void NotificationResponder(const std::string& replypump, + const LLSD& notification, + const LLSD& response) const; + + void listChannels(const LLSD& params) const; + void listChannelNotifications(const LLSD& params) const; + void respond(const LLSD& params) const; + void cancel(const LLSD& params) const; + void ignore(const LLSD& params) const; + void forward(const LLSD& params); + + static LLSD asLLSD(LLNotificationPtr); + + class Forwarder; + typedef std::map<std::string, boost::shared_ptr<Forwarder> > ForwarderMap; + ForwarderMap mForwarders; + LLNotifications & mNotifications; +}; + +#endif // LL_LLNOTIFICATIONSLISTENER_H diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index e63b41f97c..17b9b91ba7 100755 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -330,17 +330,16 @@ private: // local static instance for registering a particular panel class template<typename T> -class LLRegisterPanelClassWrapper -: public LLRegisterPanelClass + class LLPanelInjector { public: - // reigister with either the provided builder, or the generic templated builder - LLRegisterPanelClassWrapper(const std::string& tag); + // register with either the provided builder, or the generic templated builder + LLPanelInjector(const std::string& tag); }; template<typename T> -LLRegisterPanelClassWrapper<T>::LLRegisterPanelClassWrapper(const std::string& tag) + LLPanelInjector<T>::LLPanelInjector(const std::string& tag) { LLRegisterPanelClass::instance().addPanelClass(tag,&LLRegisterPanelClass::defaultPanelClassBuilder<T>); } diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index cbcce0ece5..238eae21c2 100755 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -519,7 +519,7 @@ bool LLScrollContainer::addChild(LLView* view, S32 tab_group) void LLScrollContainer::updateScroll() { - if (!mScrolledView) + if (!getVisible() || !mScrolledView) { return; } diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 6e03f604a2..d4bbea0f8e 100755 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -320,7 +320,9 @@ LLScrollListCtrl::~LLScrollListCtrl() delete mSortCallback; std::for_each(mItemList.begin(), mItemList.end(), DeletePointer()); + mItemList.clear(); std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); + mColumns.clear(); } @@ -1855,7 +1857,7 @@ void LLScrollListCtrl::showNameDetails(std::string id, bool is_group) // open the resident's details or the group details std::string sltype = is_group ? "group" : "agent"; std::string slurl = "secondlife:///app/" + sltype + "/" + id + "/about"; - LLUrlAction::clickAction(slurl); + LLUrlAction::clickAction(slurl, true); } void LLScrollListCtrl::copyNameToClipboard(std::string id, bool is_group) diff --git a/indra/llui/llscrolllistitem.cpp b/indra/llui/llscrolllistitem.cpp index 5a1e96ab03..cc7f42e49a 100755 --- a/indra/llui/llscrolllistitem.cpp +++ b/indra/llui/llscrolllistitem.cpp @@ -50,6 +50,7 @@ LLScrollListItem::LLScrollListItem( const Params& p ) LLScrollListItem::~LLScrollListItem() { std::for_each(mColumns.begin(), mColumns.end(), DeletePointer()); + mColumns.clear(); } void LLScrollListItem::addColumn(const LLScrollListCell::Params& p) diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index fd98155704..2b9286f663 100755 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -27,7 +27,7 @@ #include "linden_common.h" #include "lltabcontainer.h" - +#include "llviewereventrecorder.h" #include "llfocusmgr.h" #include "lllocalcliprect.h" #include "llrect.h" @@ -281,6 +281,7 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) LLTabContainer::~LLTabContainer() { std::for_each(mTabList.begin(), mTabList.end(), DeletePointer()); + mTabList.clear(); } //virtual @@ -578,6 +579,11 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) tab_button->setFocus(TRUE); } } + if (handled) { + // Note: May need to also capture local coords right here ? + LLViewerEventRecorder::instance().update_xui(getPathname( )); + } + return handled; } @@ -629,30 +635,33 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) BOOL handled = FALSE; BOOL has_scroll_arrows = (getMaxScrollPos() > 0) && !getTabsHidden(); + S32 local_x = x - getRect().mLeft; + S32 local_y = y - getRect().mBottom; + if (has_scroll_arrows) { if (mJumpPrevArrowBtn && mJumpPrevArrowBtn->getRect().pointInRect(x, y)) { - S32 local_x = x - mJumpPrevArrowBtn->getRect().mLeft; - S32 local_y = y - mJumpPrevArrowBtn->getRect().mBottom; + local_x = x - mJumpPrevArrowBtn->getRect().mLeft; + local_y = y - mJumpPrevArrowBtn->getRect().mBottom; handled = mJumpPrevArrowBtn->handleMouseUp(local_x, local_y, mask); } else if (mJumpNextArrowBtn && mJumpNextArrowBtn->getRect().pointInRect(x, y)) { - S32 local_x = x - mJumpNextArrowBtn->getRect().mLeft; - S32 local_y = y - mJumpNextArrowBtn->getRect().mBottom; + local_x = x - mJumpNextArrowBtn->getRect().mLeft; + local_y = y - mJumpNextArrowBtn->getRect().mBottom; handled = mJumpNextArrowBtn->handleMouseUp(local_x, local_y, mask); } else if (mPrevArrowBtn && mPrevArrowBtn->getRect().pointInRect(x, y)) { - S32 local_x = x - mPrevArrowBtn->getRect().mLeft; - S32 local_y = y - mPrevArrowBtn->getRect().mBottom; + local_x = x - mPrevArrowBtn->getRect().mLeft; + local_y = y - mPrevArrowBtn->getRect().mBottom; handled = mPrevArrowBtn->handleMouseUp(local_x, local_y, mask); } else if (mNextArrowBtn && mNextArrowBtn->getRect().pointInRect(x, y)) { - S32 local_x = x - mNextArrowBtn->getRect().mLeft; - S32 local_y = y - mNextArrowBtn->getRect().mBottom; + local_x = x - mNextArrowBtn->getRect().mLeft; + local_y = y - mNextArrowBtn->getRect().mBottom; handled = mNextArrowBtn->handleMouseUp(local_x, local_y, mask); } } @@ -676,6 +685,10 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) } gFocusMgr.setMouseCapture(NULL); } + if (handled) { + // Note: may need to capture local coords here + LLViewerEventRecorder::instance().update_xui(getPathname( )); + } return handled; } @@ -1059,21 +1072,21 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel) if (mIsVertical) { - p.name(std::string("vert tab button")); - p.image_unselected(mMiddleTabParams.tab_left_image_unselected); - p.image_selected(mMiddleTabParams.tab_left_image_selected); - p.follows.flags = p.follows.flags() | FOLLOWS_TOP; + p.name("vtab_"+std::string(child->getName())); + p.image_unselected(mMiddleTabParams.tab_left_image_unselected); + p.image_selected(mMiddleTabParams.tab_left_image_selected); + p.follows.flags = p.follows.flags() | FOLLOWS_TOP; } else - { - p.name(std::string(child->getName()) + " tab"); - p.visible(false); - p.image_unselected(tab_img); - p.image_selected(tab_selected_img); - p.follows.flags = p.follows.flags() | (getTabPosition() == TOP ? FOLLOWS_TOP : FOLLOWS_BOTTOM); - // Try to squeeze in a bit more text - p.pad_left( mLabelPadLeft ); - p.pad_right(2); + { + p.name("htab_"+std::string(child->getName())); + p.visible(false); + p.image_unselected(tab_img); + p.image_selected(tab_selected_img); + p.follows.flags = p.follows.flags() | (getTabPosition() == TOP ? FOLLOWS_TOP : FOLLOWS_BOTTOM); + // Try to squeeze in a bit more text + p.pad_left( mLabelPadLeft ); + p.pad_right(2); } // *TODO : It seems wrong not to use p in both cases considering the way p is initialized diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index cc171661ce..4144a42fd6 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -167,6 +167,7 @@ LLTextBase::Params::Params() max_text_length("max_length", 255), font_shadow("font_shadow"), wrap("wrap"), + trusted_content("trusted_content", true), use_ellipses("use_ellipses", false), parse_urls("parse_urls", false), parse_highlights("parse_highlights", false) @@ -211,6 +212,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mLineSpacingPixels(p.line_spacing.pixels), mClip(p.clip), mClipPartial(p.clip_partial && !p.allow_scroll), + mTrustedContent(p.trusted_content), mTrackEnd( p.track_end ), mScrollIndex(-1), mSelectionStart( 0 ), @@ -1029,7 +1031,7 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLTextBase::handleMouseUp(S32 x, S32 y, MASK mask) { LLTextSegmentPtr cur_segment = getSegmentAtLocalPos(x, y); - if (cur_segment && cur_segment->handleMouseUp(x, y, mask)) + if (hasMouseCapture() && cur_segment && cur_segment->handleMouseUp(x, y, mask)) { // Did we just click on a link? if (mURLClickSignal @@ -3164,7 +3166,7 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask) // Only process the click if it's actually in this segment, not to the right of the end-of-line. if(mEditor.getSegmentAtLocalPos(x, y, false) == this) { - LLUrlAction::clickAction(getStyle()->getLinkHREF()); + LLUrlAction::clickAction(getStyle()->getLinkHREF(), mEditor.isContentTrusted()); return TRUE; } } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index a74e97cac8..3603f55c3f 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -291,7 +291,8 @@ public: parse_urls, parse_highlights, clip, - clip_partial; + clip_partial, + trusted_content; Optional<S32> v_pad, h_pad; @@ -361,6 +362,7 @@ public: bool getWordWrap() { return mWordWrap; } bool getUseEllipses() { return mUseEllipses; } bool truncate(); // returns true of truncation occurred + bool isContentTrusted() {return mTrustedContent;} // TODO: move into LLTextSegment? void createUrlContextMenu(S32 x, S32 y, const std::string &url); // create a popup context menu for the given Url @@ -634,6 +636,7 @@ protected: bool mBGVisible; // render background? bool mClip; // clip text to widget rect bool mClipPartial; // false if we show lines that are partially inside bounding rect + bool mTrustedContent; // if false, does not allow to execute SURL links from this editor bool mPlainText; // didn't use Image or Icon segments bool mAutoIndent; S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 11cfa1d263..d175204e6d 100755 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -60,10 +60,13 @@ BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask) if (!handled && mClickedCallback) { + handled = TRUE; + } + + if (handled) + { // Route future Mouse messages here preemptively. (Release on mouse up.) gFocusMgr.setMouseCapture( this ); - - handled = TRUE; } return handled; @@ -71,7 +74,7 @@ BOOL LLTextBox::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) { - BOOL handled = FALSE; + BOOL handled = LLTextBase::handleMouseUp(x, y, mask); if (getSoundFlags() & MOUSE_UP) { @@ -93,10 +96,6 @@ BOOL LLTextBox::handleMouseUp(S32 x, S32 y, MASK mask) handled = TRUE; } } - else - { - handled = LLTextBase::handleMouseUp(x, y, mask); - } return handled; } diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 0c16e06109..02c81c0744 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -310,7 +310,7 @@ LLTextEditor::~LLTextEditor() // Scrollbar is deleted by LLView std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer()); - + mUndoStack.clear(); // context menu is owned by menu holder, not us //delete mContextMenu; } @@ -666,6 +666,14 @@ void LLTextEditor::selectAll() updatePrimary(); } +void LLTextEditor::selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_pos) +{ + setCursorPos(prev_cursor_pos); + startSelection(); + setCursorPos(next_cursor_pos); + endSelection(); +} + BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; @@ -713,7 +721,6 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) setCursorAtLocalPos( x, y, true ); startSelection(); } - gFocusMgr.setMouseCapture( this ); } handled = TRUE; @@ -722,6 +729,10 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) // Delay cursor flashing resetCursorBlink(); + if (handled && !gFocusMgr.getMouseCapture()) + { + gFocusMgr.setMouseCapture( this ); + } return handled; } @@ -1609,7 +1620,7 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask) } } - if (handled) + if (handled && !gFocusMgr.getMouseCapture()) { updatePrimary(); } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 32b543ec0e..d3b7bc0eb7 100755 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -144,6 +144,8 @@ public: virtual void selectAll(); virtual BOOL canSelectAll() const; + void selectByCursorPosition(S32 prev_cursor_pos, S32 next_cursor_pos); + virtual bool canLoadOrSaveToFile(); void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE); diff --git a/indra/llui/lltoolbar.cpp b/indra/llui/lltoolbar.cpp index 928e82cb8c..ee82e0403b 100755 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -118,7 +118,8 @@ LLToolBar::LLToolBar(const LLToolBar::Params& p) mButtonLeaveSignal(NULL), mButtonRemoveSignal(NULL), mDragAndDropTarget(false), - mCaretIcon(NULL) + mCaretIcon(NULL), + mCenterPanel(NULL) { mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_WITH_TEXT] = p.button_icon_and_text; mButtonParams[LLToolBarEnums::BTNTYPE_ICONS_ONLY] = p.button_icon; @@ -200,14 +201,15 @@ void LLToolBar::initFromParams(const LLToolBar::Params& p) center_panel_p.auto_resize = false; center_panel_p.user_resize = false; center_panel_p.mouse_opaque = false; - LLLayoutPanel* center_panel = LLUICtrlFactory::create<LLLayoutPanel>(center_panel_p); - mCenteringStack->addChild(center_panel); + mCenterPanel = LLUICtrlFactory::create<LLCenterLayoutPanel>(center_panel_p); + mCenteringStack->addChild(mCenterPanel); LLPanel::Params button_panel_p(p.button_panel); - button_panel_p.rect = center_panel->getLocalRect(); - button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT; + button_panel_p.rect = mCenterPanel->getLocalRect(); + button_panel_p.follows.flags = FOLLOWS_BOTTOM|FOLLOWS_LEFT; mButtonPanel = LLUICtrlFactory::create<LLPanel>(button_panel_p); - center_panel->addChild(mButtonPanel); + mCenterPanel->setButtonPanel(mButtonPanel); + mCenterPanel->addChild(mButtonPanel); mCenteringStack->addChild(LLUICtrlFactory::create<LLLayoutPanel>(border_panel_p)); @@ -1242,3 +1244,15 @@ const std::string LLToolBarButton::getToolTip() const return tooltip; } +void LLToolBar::LLCenterLayoutPanel::handleReshape(const LLRect& rect, bool by_user) +{ + LLLayoutPanel::handleReshape(rect, by_user); + + if (!mReshapeCallback.empty()) + { + LLRect r; + localRectToOtherView(mButtonPanel->getRect(), &r, gFloaterView); + r.stretch(FLOATER_MIN_VISIBLE_PIXELS); + mReshapeCallback(mLocationId, r); + } +} diff --git a/indra/llui/lltoolbar.h b/indra/llui/lltoolbar.h index 743951a41f..9e17eaed8b 100755 --- a/indra/llui/lltoolbar.h +++ b/indra/llui/lltoolbar.h @@ -125,6 +125,19 @@ namespace LLToolBarEnums SIDE_TOP, }; + enum EToolBarLocation + { + TOOLBAR_NONE = 0, + TOOLBAR_LEFT, + TOOLBAR_RIGHT, + TOOLBAR_BOTTOM, + + TOOLBAR_COUNT, + + TOOLBAR_FIRST = TOOLBAR_LEFT, + TOOLBAR_LAST = TOOLBAR_BOTTOM, + }; + LLLayoutStack::ELayoutOrientation getOrientation(SideType sideType); } @@ -150,6 +163,30 @@ class LLToolBar { friend class LLToolBarButton; public: + + class LLCenterLayoutPanel : public LLLayoutPanel + { + public: + typedef struct LLLayoutPanel::Params Params; + typedef boost::function<void(LLToolBarEnums::EToolBarLocation tb, const LLRect& rect)> reshape_callback_t; + + virtual ~LLCenterLayoutPanel() {} + /*virtual*/ void handleReshape(const LLRect& rect, bool by_user); + + void setLocationId(LLToolBarEnums::EToolBarLocation id) { mLocationId = id; } + void setReshapeCallback(reshape_callback_t cb) { mReshapeCallback = cb; } + void setButtonPanel(LLPanel * panel) { mButtonPanel = panel; } + + protected: + friend class LLUICtrlFactory; + LLCenterLayoutPanel(const Params& params) : LLLayoutPanel(params), mButtonPanel(NULL) {} + + private: + reshape_callback_t mReshapeCallback; + LLToolBarEnums::EToolBarLocation mLocationId; + LLPanel * mButtonPanel; + }; + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { Mandatory<LLToolBarEnums::ButtonType> button_display_mode; @@ -198,6 +235,7 @@ public: void setHandleDragCallback(tool_handledrag_callback_t cb) { mHandleDragItemCallback = cb; } void setHandleDropCallback(tool_handledrop_callback_t cb) { mHandleDropCallback = cb; } bool isReadOnly() const { return mReadOnly; } + LLCenterLayoutPanel * getCenterLayoutPanel() const { return mCenterPanel; } LLToolBarButton* createButton(const LLCommandId& id); @@ -270,6 +308,7 @@ private: // related widgets LLLayoutStack* mCenteringStack; + LLCenterLayoutPanel* mCenterPanel; LLPanel* mButtonPanel; LLHandle<class LLContextMenu> mPopupMenuHandle; LLHandle<class LLView> mRemoveButtonHandle; diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 0a0e0e164e..0bc4424a8c 100755 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -405,11 +405,6 @@ public: const std::string& comment = "Declared In Code") : LLCachedControl<T>(LLUI::getControlControlGroup(name), name, default_value, comment) {} - - // This constructor will signal an error if the control doesn't exist in the control group - LLUICachedControl(const std::string& name) - : LLCachedControl<T>(LLUI::getControlControlGroup(name), name) - {} }; namespace LLInitParam diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index b9c843e931..1722bf27bd 100755 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -29,7 +29,7 @@ #define LLUICTRL_CPP #include "lluictrl.h" - +#include "llviewereventrecorder.h" #include "llfocusmgr.h" #include "llpanel.h" #include "lluictrlfactory.h" @@ -308,22 +308,40 @@ void LLUICtrl::onMouseLeave(S32 x, S32 y, MASK mask) //virtual BOOL LLUICtrl::handleMouseDown(S32 x, S32 y, MASK mask) { + + lldebugs << "LLUICtrl::handleMouseDown calling LLView)'s handleMouseUp (first initialized xui to: " << getPathname() << " )" << llendl; + BOOL handled = LLView::handleMouseDown(x,y,mask); + if (mMouseDownSignal) { (*mMouseDownSignal)(this,x,y,mask); } + lldebugs << "LLUICtrl::handleMousedown - handled is returning as: " << handled << " " << llendl; + + if (handled) { + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-56,-56,getPathname()); + } return handled; } //virtual BOOL LLUICtrl::handleMouseUp(S32 x, S32 y, MASK mask) { + + lldebugs << "LLUICtrl::handleMouseUp calling LLView)'s handleMouseUp (first initialized xui to: " << getPathname() << " )" << llendl; + BOOL handled = LLView::handleMouseUp(x,y,mask); + if (handled) { + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-56,-56,getPathname()); + } if (mMouseUpSignal) { (*mMouseUpSignal)(this,x,y,mask); } + + lldebugs << "LLUICtrl::handleMouseUp - handled for xui " << getPathname() << " - is returning as: " << handled << " " << llendl; + return handled; } diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp index 23e574cb74..12537d9dd1 100755 --- a/indra/llui/llurlaction.cpp +++ b/indra/llui/llurlaction.cpp @@ -87,14 +87,14 @@ void LLUrlAction::executeSLURL(std::string url) { if (sExecuteSLURLCallback) { - sExecuteSLURLCallback(url); + sExecuteSLURLCallback(url ,true); } } -void LLUrlAction::clickAction(std::string url) +void LLUrlAction::clickAction(std::string url, bool trusted_content) { // Try to handle as SLURL first, then http Url - if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url) ) + if ( (sExecuteSLURLCallback) && !sExecuteSLURLCallback(url, trusted_content) ) { if (sOpenURLCallback) { diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h index e731376b95..5f3626490c 100755 --- a/indra/llui/llurlaction.h +++ b/indra/llui/llurlaction.h @@ -66,7 +66,7 @@ public: static void showLocationOnMap(std::string url); /// perform the appropriate action for left-clicking on a Url - static void clickAction(std::string url); + static void clickAction(std::string url, bool trusted_content); /// copy the label for a Url to the clipboard static void copyLabelToClipboard(std::string url); @@ -86,7 +86,7 @@ public: /// specify the callbacks to enable this class's functionality typedef boost::function<void (const std::string&)> url_callback_t; - typedef boost::function<bool(const std::string& url)> execute_url_callback_t; + typedef boost::function<bool(const std::string& url, bool trusted_content)> execute_url_callback_t; static void setOpenURLCallback(url_callback_t cb); static void setOpenURLInternalCallback(url_callback_t cb); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index b1cc502c4b..840f67968d 100755 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -1067,7 +1067,8 @@ LLUrlEntrySLLabel::LLUrlEntrySLLabel() std::string LLUrlEntrySLLabel::getLabel(const std::string &url, const LLUrlLabelCallback &cb) { - return getLabelFromWikiLink(url); + std::string label = getLabelFromWikiLink(url); + return (!LLUrlRegistry::instance().hasUrl(label)) ? label : getUrl(url); } std::string LLUrlEntrySLLabel::getUrl(const std::string &string) const diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 3613a40e2c..5ee2169b66 100755 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -48,7 +48,9 @@ #include "lluictrlfactory.h" #include "lltooltip.h" #include "llsdutil.h" - +#include "llsdserialize.h" +#include "llviewereventrecorder.h" +#include "llkeyboard.h" // for ui edit hack #include "llbutton.h" #include "lllineeditor.h" @@ -642,13 +644,33 @@ void LLView::setVisible(BOOL visible) // virtual void LLView::handleVisibilityChange ( BOOL new_visibility ) { + BOOL old_visibility; + BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus(); BOOST_FOREACH(LLView* viewp, mChildList) { // only views that are themselves visible will have their overall visibility affected by their ancestors - if (viewp->getVisible()) + old_visibility=viewp->getVisible(); + + if(log_visibility_change) + { + if (old_visibility!=new_visibility) + { + LLViewerEventRecorder::instance().logVisibilityChange( viewp->getPathname(), viewp->getName(), new_visibility,"widget"); + } + } + + if (old_visibility) { viewp->handleVisibilityChange ( new_visibility ); } + + if(log_visibility_change) + { + // Consider changing returns to confirm success and know which widget grabbed it + // For now assume success and log at highest xui possible + // NOTE we log actual state - which may differ if it somehow failed to set visibility + lldebugs << "LLView::handleVisibilityChange - now: " << getVisible() << " xui: " << viewp->getPathname() << " name: " << viewp->getName() << llendl; + } } } @@ -697,6 +719,7 @@ bool LLView::visibleEnabledAndContains(S32 local_x, S32 local_y) && getEnabled(); } +// This is NOT event recording related void LLView::logMouseEvent() { if (sDebugMouseHandling) @@ -743,7 +766,14 @@ LLView* LLView::childrenHandleMouseEvent(const METHOD& method, S32 x, S32 y, XDA if ((viewp->*method)( local_x, local_y, extra ) || (allow_mouse_block && viewp->blockMouseEvent( local_x, local_y ))) { + lldebugs << "LLView::childrenHandleMouseEvent calling updatemouseeventinfo - local_x|global x "<< local_x << " " << x << "local/global y " << local_y << " " << y << llendl; + lldebugs << "LLView::childrenHandleMouseEvent getPathname for viewp result: " << viewp->getPathname() << "for this view: " << getPathname() << llendl; + + LLViewerEventRecorder::instance().updateMouseEventInfo(x,y,-55,-55,getPathname()); + + // This is NOT event recording related viewp->logMouseEvent(); + return viewp; } } @@ -766,6 +796,7 @@ LLView* LLView::childrenHandleToolTip(S32 x, S32 y, MASK mask) if (viewp->handleToolTip(local_x, local_y, mask) || viewp->blockMouseEvent(local_x, local_y)) { + // This is NOT event recording related viewp->logMouseEvent(); return viewp; } @@ -824,6 +855,7 @@ LLView* LLView::childrenHandleHover(S32 x, S32 y, MASK mask) if (viewp->handleHover(local_x, local_y, mask) || viewp->blockMouseEvent(local_x, local_y)) { + // This is NOT event recording related viewp->logMouseEvent(); return viewp; } @@ -907,10 +939,12 @@ BOOL LLView::handleKey(KEY key, MASK mask, BOOL called_from_parent) if (!handled) { + // For event logging we don't care which widget handles it + // So we capture the key at the end of this function once we know if it was handled handled = handleKeyHere( key, mask ); - if (handled && LLView::sDebugKeys) + if (handled) { - llinfos << "Key handled by " << getName() << llendl; + llwarns << "Key handled by " << getName() << llendl; } } } @@ -958,6 +992,11 @@ BOOL LLView::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) handled = mParentView->handleUnicodeChar(uni_char, FALSE); } + if (handled) + { + LLViewerEventRecorder::instance().logKeyUnicodeEvent(uni_char); + } + return handled; } @@ -987,12 +1026,16 @@ BOOL LLView::hasMouseCapture() BOOL LLView::handleMouseUp(S32 x, S32 y, MASK mask) { - return childrenHandleMouseUp( x, y, mask ) != NULL; + LLView* r = childrenHandleMouseUp( x, y, mask ); + + return (r!=NULL); } BOOL LLView::handleMouseDown(S32 x, S32 y, MASK mask) { - return childrenHandleMouseDown( x, y, mask ) != NULL; + LLView* r= childrenHandleMouseDown(x, y, mask ); + + return (r!=NULL); } BOOL LLView::handleDoubleClick(S32 x, S32 y, MASK mask) @@ -1065,7 +1108,7 @@ LLView* LLView::childrenHandleDoubleClick(S32 x, S32 y, MASK mask) LLView* LLView::childrenHandleMouseUp(S32 x, S32 y, MASK mask) { - return childrenHandleMouseEvent(&LLView::handleMouseUp, x, y, mask); + return childrenHandleMouseEvent(&LLView::handleMouseUp, x, y, mask); } LLView* LLView::childrenHandleRightMouseUp(S32 x, S32 y, MASK mask) @@ -1271,52 +1314,55 @@ void LLView::reshape(S32 width, S32 height, BOOL called_from_parent) // move child views according to reshape flags BOOST_FOREACH(LLView* viewp, mChildList) { - LLRect child_rect( viewp->mRect ); - - if (viewp->followsRight() && viewp->followsLeft()) - { - child_rect.mRight += delta_width; - } - else if (viewp->followsRight()) + if (viewp != NULL) { - child_rect.mLeft += delta_width; - child_rect.mRight += delta_width; - } - else if (viewp->followsLeft()) - { - // left is 0, don't need to adjust coords - } - else - { - // BUG what to do when we don't follow anyone? - // for now, same as followsLeft - } + LLRect child_rect( viewp->mRect ); - if (viewp->followsTop() && viewp->followsBottom()) - { - child_rect.mTop += delta_height; - } - else if (viewp->followsTop()) - { - child_rect.mTop += delta_height; - child_rect.mBottom += delta_height; - } - else if (viewp->followsBottom()) - { - // bottom is 0, so don't need to adjust coords - } - else - { - // BUG what to do when we don't follow? - // for now, same as bottom - } + if (viewp->followsRight() && viewp->followsLeft()) + { + child_rect.mRight += delta_width; + } + else if (viewp->followsRight()) + { + child_rect.mLeft += delta_width; + child_rect.mRight += delta_width; + } + else if (viewp->followsLeft()) + { + // left is 0, don't need to adjust coords + } + else + { + // BUG what to do when we don't follow anyone? + // for now, same as followsLeft + } - S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft; - S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom; - viewp->translate( delta_x, delta_y ); - if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) - { - viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); + if (viewp->followsTop() && viewp->followsBottom()) + { + child_rect.mTop += delta_height; + } + else if (viewp->followsTop()) + { + child_rect.mTop += delta_height; + child_rect.mBottom += delta_height; + } + else if (viewp->followsBottom()) + { + // bottom is 0, so don't need to adjust coords + } + else + { + // BUG what to do when we don't follow? + // for now, same as bottom + } + + S32 delta_x = child_rect.mLeft - viewp->getRect().mLeft; + S32 delta_y = child_rect.mBottom - viewp->getRect().mBottom; + viewp->translate( delta_x, delta_y ); + if (child_rect.getWidth() != viewp->getRect().getWidth() || child_rect.getHeight() != viewp->getRect().getHeight()) + { + viewp->reshape(child_rect.getWidth(), child_rect.getHeight()); + } } } } diff --git a/indra/llui/llviewereventrecorder.cpp b/indra/llui/llviewereventrecorder.cpp new file mode 100644 index 0000000000..546a0f5866 --- /dev/null +++ b/indra/llui/llviewereventrecorder.cpp @@ -0,0 +1,296 @@ +/** + * @file llviewereventrecorder.cpp + * @brief Viewer event recording and playback support for mouse and keyboard events + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * + * Copyright (c) 2013, Linden Research, Inc. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + + +#include "llviewereventrecorder.h" +#include "llui.h" +#include "llleap.h" + +LLViewerEventRecorder::LLViewerEventRecorder() { + + clear(UNDEFINED); + logEvents = false; + // Remove any previous event log file + std::string old_log_ui_events_to_llsd_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.old"); + LLFile::remove(old_log_ui_events_to_llsd_file); + + + mLogFilename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLife_Events_log.llsd"); + LLFile::rename(mLogFilename, old_log_ui_events_to_llsd_file); + +} + + +bool LLViewerEventRecorder::displayViewerEventRecorderMenuItems() { + return LLUI::sSettingGroups["config"]->getBOOL("ShowEventRecorderMenuItems"); +} + + +void LLViewerEventRecorder::setEventLoggingOn() { + if (! mLog.is_open()) { + mLog.open(mLogFilename, llofstream::out); + } + logEvents=true; + lldebugs << "LLViewerEventRecorder::setEventLoggingOn event logging turned on" << llendl; +} + +void LLViewerEventRecorder::setEventLoggingOff() { + logEvents=false; + mLog.flush(); + mLog.close(); + lldebugs << "LLViewerEventRecorder::setEventLoggingOff event logging turned off" << llendl; +} + + + LLViewerEventRecorder::~LLViewerEventRecorder() { + if (mLog.is_open()) { + mLog.close(); + } +} + +void LLViewerEventRecorder::clear_xui() { + xui.clear(); +} + +void LLViewerEventRecorder::clear(S32 r) { + + xui.clear(); + + local_x=r; + local_y=r; + + global_x=r; + global_y=r; + + +} + +void LLViewerEventRecorder::setMouseLocalCoords(S32 x, S32 y) { + local_x=x; + local_y=y; +} + +void LLViewerEventRecorder::setMouseGlobalCoords(S32 x, S32 y) { + global_x=x; + global_y=y; +} + +void LLViewerEventRecorder::updateMouseEventInfo(S32 local_x, S32 local_y, S32 global_x, S32 global_y, std::string mName) { + + LLView * target_view = LLUI::resolvePath(LLUI::getRootView(), xui); + if (! target_view) { + lldebugs << "LLViewerEventRecorder::updateMouseEventInfo - xui path on file at moment is NOT valid - so DO NOT record these local coords" << llendl; + return; + } + lldebugs << "LLViewerEventRecorder::updateMouseEventInfo b4 updatemouseeventinfo - local_x|global x "<< this->local_x << " " << this->global_x << "local/global y " << this->local_y << " " << this->global_y << " mname: " << mName << " xui: " << xui << llendl; + + + if (this->local_x < 1 && this->local_y<1 && local_x && local_y) { + this->local_x=local_x; + this->local_y=local_y; + } + this->global_x=global_x; + this->global_y=global_y; + + // ONLY record deepest xui path for hierarchy searches - or first/only xui for floaters/panels reached via mouse captor - and llmousehandler + if (mName!="" && mName!="/" && xui=="") { + // xui=std::string("/")+mName+xui; + //xui=mName+xui; + xui = mName; // TODO review confirm we never call with partial path - also cAN REMOVE CHECK FOR "" - ON OTHER HAND IT'S PRETTY HARMLESS + } + + lldebugs << "LLViewerEventRecorder::updateMouseEventInfo after updatemouseeventinfo - local_x|global x "<< this->local_x << " " << this->global_x << "local/global y " << this->local_y << " " << this->global_y << " mname: " << mName << " xui: " << xui << llendl; +} + +void LLViewerEventRecorder::logVisibilityChange(std::string xui, std::string name, BOOL visibility, std::string event_subtype) { + + LLSD event=LLSD::emptyMap(); + + event.insert("event",LLSD(std::string("visibility"))); + + if (visibility) { + event.insert("visibility",LLSD(true)); + } else { + event.insert("visibility",LLSD(false)); + } + + if (event_subtype!="") { + event.insert("event_subtype", LLSD(event_subtype)); + } + + if(name!="") { + event.insert("name",LLSD(name)); + } + + if (xui!="") { + event.insert("path",LLSD(xui)); + } + + event.insert("timestamp",LLSD(LLDate::now().asString())); + recordEvent(event); +} + + +std::string LLViewerEventRecorder::get_xui() { + return xui; +} +void LLViewerEventRecorder::update_xui(std::string xui) { + if (xui!="" && this->xui=="" ) { + lldebugs << "LLViewerEventRecorder::update_xui to " << xui << llendl; + this->xui=xui; + } else { + lldebugs << "LLViewerEventRecorder::update_xui called with empty string" << llendl; + } +} + +void LLViewerEventRecorder::logKeyEvent(KEY key, MASK mask) { + + // NOTE: Event recording only logs keydown events - the viewer itself hides keyup events at a fairly low level in the code and does not appear to care about them anywhere + + LLSD event = LLSD::emptyMap(); + + event.insert("event",LLSD("type")); + + // keysym ...or + // keycode...or + // char + event.insert("keysym",LLSD(LLKeyboard::stringFromKey(key))); + + // path (optional) - for now we are not recording path for key events during record - should not be needed for full record and playback of recorded steps + // as a vita script - it does become useful if you edit the resulting vita script and wish to remove some steps leading to a key event - that sort of edit might + // break the test script and it would be useful to have more context to make these sorts of edits safer + + // TODO replace this with a call which extracts to an array of names of masks (just like vita expects during playback) + // This is looking more and more like an object is a good idea, for this part a handy method call to setMask(mask) would be nice :-) + // call the func - llkeyboard::llsdStringarrayFromMask + + LLSD key_mask=LLSD::emptyArray(); + + if (mask & MASK_CONTROL) { key_mask.append(LLSD("CTL")); } // Mac command key - has code of 0x1 in llcommon/indra_contstants + if (mask & MASK_ALT) { key_mask.append(LLSD("ALT")); } + if (mask & MASK_SHIFT) { key_mask.append(LLSD("SHIFT")); } + if (mask & MASK_MAC_CONTROL) { key_mask.append(LLSD("MAC_CONTROL")); } + + event.insert("mask",key_mask); + event.insert("timestamp",LLSD(LLDate::now().asString())); + + // Although vita has keyDown and keyUp requests it does not have type as a high-level concept + // (maybe it should) - instead it has a convenience method that generates the keydown and keyup events + // Here we will use "type" as our event type + + lldebugs << "LLVIewerEventRecorder::logKeyEvent Serialized LLSD for event " << event.asString() << "\n" << llendl; + + + //lldebugs << "[VITA] key_name: " << LLKeyboard::stringFromKey(key) << "mask: "<< mask << "handled by " << getName() << llendl; + lldebugs << "LLVIewerEventRecorder::logKeyEvent key_name: " << LLKeyboard::stringFromKey(key) << "mask: "<< mask << llendl; + + + recordEvent(event); + +} + +void LLViewerEventRecorder::playbackRecording() { + + LLSD LeapCommand; + + // ivita sets this on startup, it also sends commands to the viewer to make start, stop, and playback menu items visible in viewer + LeapCommand =LLUI::sSettingGroups["config"]->getLLSD("LeapPlaybackEventsCommand"); + + lldebugs << "[VITA] launching playback - leap command is: " << LLSDXMLStreamer(LeapCommand) << llendl; + LLLeap::create("", LeapCommand, false); // exception=false + +} + + +void LLViewerEventRecorder::recordEvent(LLSD event) { + lldebugs << "LLViewerEventRecorder::recordEvent event written to log: " << LLSDXMLStreamer(event) << llendl; + mLog << event << std::endl; + +} +void LLViewerEventRecorder::logKeyUnicodeEvent(llwchar uni_char) { + if (! logEvents) return; + + // Note: keyUp is not captured since the viewer seems to not care about keyUp events + + LLSD event=LLSD::emptyMap(); + + event.insert("timestamp",LLSD(LLDate::now().asString())); + + + // keysym ...or + // keycode...or + // char + + lldebugs << "Wrapped in conversion to wstring " << wstring_to_utf8str(LLWString( 1, uni_char)) << "\n" << llendl; + + event.insert("char", + LLSD( wstring_to_utf8str(LLWString( 1,uni_char)) ) + ); + + // path (optional) - for now we are not recording path for key events during record - should not be needed for full record and playback of recorded steps + // as a vita script - it does become useful if you edit the resulting vita script and wish to remove some steps leading to a key event - that sort of edit might + // break the test script and it would be useful to have more context to make these sorts of edits safer + + // TODO need to consider mask keys too? Doesn't seem possible - at least not easily at this point + + event.insert("event",LLSD("keyDown")); + + lldebugs << "[VITA] unicode key: " << uni_char << llendl; + lldebugs << "[VITA] dumpxml " << LLSDXMLStreamer(event) << "\n" << llendl; + + + recordEvent(event); + +} + +void LLViewerEventRecorder::logMouseEvent(std::string button_state,std::string button_name) +{ + if (! logEvents) return; + + LLSD event=LLSD::emptyMap(); + + event.insert("event",LLSD(std::string("mouse"+ button_state))); + event.insert("button",LLSD(button_name)); + if (xui!="") { + event.insert("path",LLSD(xui)); + } + + if (local_x>0 && local_y>0) { + event.insert("local_x",LLSD(local_x)); + event.insert("local_y",LLSD(local_y)); + } + + if (global_x>0 && global_y>0) { + event.insert("global_x",LLSD(global_x)); + event.insert("global_y",LLSD(global_y)); + } + event.insert("timestamp",LLSD(LLDate::now().asString())); + recordEvent(event); + + + clear(UNDEFINED); + + +} diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h new file mode 100644 index 0000000000..375efcc3de --- /dev/null +++ b/indra/llui/llviewereventrecorder.h @@ -0,0 +1,103 @@ +/** + * @file llviewereventrecorder.h + * @brief Viewer event recording and playback support for mouse and keyboard events + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * + * Copyright (c) 2013, Linden Research, Inc. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_VIEWER_EVENT_RECORDER +#define LL_VIEWER_EVENT_RECORDER + + +#include "linden_common.h" + +#include "lldir.h" +#include "llsd.h" +#include "llfile.h" +#include "llvfile.h" +#include "lldate.h" +#include "llsdserialize.h" +#include "llkeyboard.h" +#include "llstring.h" + +#include <sstream> + +#include "llsingleton.h" // includes llerror which we need here so we can skip the include here + +class LLViewerEventRecorder : public LLSingleton<LLViewerEventRecorder> +{ + + public: + + LLViewerEventRecorder(); // TODO Protect constructor better if we can (not happy in private section) - could add a factory... - we are singleton + ~LLViewerEventRecorder(); + + + void updateMouseEventInfo(S32 local_x,S32 local_y, S32 global_x, S32 global_y, std::string mName); + void setMouseLocalCoords(S32 x,S32 y); + void setMouseGlobalCoords(S32 x,S32 y); + + void logMouseEvent(std::string button_state, std::string button_name ); + void logKeyEvent(KEY key, MASK mask); + void logKeyUnicodeEvent(llwchar uni_char); + + void logVisibilityChange(std::string xui, std::string name, BOOL visibility, std::string event_subtype); + + void clear_xui(); + std::string get_xui(); + void update_xui(std::string xui); + + bool getLoggingStatus(){return logEvents;}; + void setEventLoggingOn(); + void setEventLoggingOff(); + + void playbackRecording(); + + bool displayViewerEventRecorderMenuItems(); + + + protected: + // On if we wish to log events at the moment - toggle via Develop/Recorder submenu + bool logEvents; + + std::string mLogFilename; + llofstream mLog; + + + private: + + // Mouse event info + S32 global_x; + S32 global_y; + S32 local_x; + S32 local_y; + + // XUI path of UI element + std::string xui; + + // Actually write the event out to llsd log file + void recordEvent(LLSD event); + + void clear(S32 r); + + static const S32 UNDEFINED=-1; +}; +#endif diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp index 460d2a8b4f..229608231c 100755 --- a/indra/llvfs/lldiriterator.cpp +++ b/indra/llvfs/lldiriterator.cpp @@ -119,16 +119,25 @@ bool LLDirIterator::Impl::next(std::string &fname) fs::directory_iterator end_itr; // default construction yields past-the-end bool found = false; - while (mIter != end_itr && !found) + + // Check if path is a directory. + try { - boost::smatch match; - std::string name = mIter->path().filename().string(); - if (found = boost::regex_match(name, match, mFilterExp)) + while (mIter != end_itr && !found) { - fname = name; + boost::smatch match; + std::string name = mIter->path().filename().string(); + if (found = boost::regex_match(name, match, mFilterExp)) + { + fname = name; + } + + ++mIter; } - - ++mIter; + } + catch (const fs::filesystem_error& e) + { + llwarns << e.what() << llendl; } return found; diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp index 82c926620a..7b589f5b96 100755 --- a/indra/llvfs/llvfs.cpp +++ b/indra/llvfs/llvfs.cpp @@ -578,6 +578,7 @@ LLVFS::~LLVFS() mFreeBlocksByLength.clear(); for_each(mFreeBlocksByLocation.begin(), mFreeBlocksByLocation.end(), DeletePairedPointer()); + mFreeBlocksByLocation.clear(); unlockAndClose(mDataFP); mDataFP = NULL; @@ -1835,6 +1836,7 @@ void LLVFS::audit() } for_each(audit_blocks.begin(), audit_blocks.end(), DeletePointer()); + audit_blocks.clear(); } diff --git a/indra/llwindow/lldxhardware.cpp b/indra/llwindow/lldxhardware.cpp index 3579b5d42f..b0f4bc5503 100755 --- a/indra/llwindow/lldxhardware.cpp +++ b/indra/llwindow/lldxhardware.cpp @@ -171,6 +171,7 @@ std::string LLDXDriverFile::dump() LLDXDevice::~LLDXDevice() { for_each(mDriverFiles.begin(), mDriverFiles.end(), DeletePairedPointer()); + mDriverFiles.clear(); } std::string LLDXDevice::dump() @@ -230,6 +231,7 @@ LLDXHardware::LLDXHardware() void LLDXHardware::cleanup() { // for_each(mDevices.begin(), mDevices.end(), DeletePairedPointer()); + // mDevices.clear(); } /* diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 7415c9d8dc..b393a3796d 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -376,13 +376,6 @@ attributedStringInfo getSegments(NSAttributedString *str) [[self inputContext] handleEvent:theEvent]; } - if ([[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSCarriageReturnCharacter || - [[theEvent charactersIgnoringModifiers] characterAtIndex:0] == NSEnterCharacter) - { - // callKeyDown won't return the value we expect for enter or return. Handle them as a separate case. - [[self inputContext] handleEvent:theEvent]; - } - // OS X intentionally does not send us key-up information on cmd-key combinations. // This behaviour is not a bug, and only applies to cmd-combinations (no others). // Since SL assumes we receive those, we fake it here. diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index 9712ae1d91..eadff8a6b4 100755 --- a/indra/llwindow/llwindowcallbacks.cpp +++ b/indra/llwindow/llwindowcallbacks.cpp @@ -122,6 +122,7 @@ void LLWindowCallbacks::handleResize(LLWindow *window, const S32 width, const S3 void LLWindowCallbacks::handleFocus(LLWindow *window) { + LL_WARNS("COCOA") << "Called handleFocus proto" << LL_ENDL; } void LLWindowCallbacks::handleFocusLost(LLWindow *window) diff --git a/indra/llwindow/llwindowmacosx-objc.h b/indra/llwindow/llwindowmacosx-objc.h index 2cae6f3f72..81b25601a9 100755 --- a/indra/llwindow/llwindowmacosx-objc.h +++ b/indra/llwindow/llwindowmacosx-objc.h @@ -25,6 +25,9 @@ * $/LicenseInfo$ */ +#ifndef LL_LLWINDOWMACOSX_OBJC_H +#define LL_LLWINDOWMACOSX_OBJC_H + #include <map> #include <vector> @@ -144,3 +147,5 @@ NSWindowRef getMainAppWindow(); GLViewRef getGLView(); unsigned int getModifiers(); + +#endif // LL_LLWINDOWMACOSX_OBJC_H diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 56472e6b45..11c0b51086 100755 --- a/indra/llwindow/llwindowmacosx.cpp +++ b/indra/llwindow/llwindowmacosx.cpp @@ -331,7 +331,16 @@ void callMouseExit() void callWindowFocus() { - gWindowImplementation->getCallbacks()->handleFocus(gWindowImplementation); + if ( gWindowImplementation && gWindowImplementation->getCallbacks() ) + { + gWindowImplementation->getCallbacks()->handleFocus (gWindowImplementation); + } + else + { + LL_WARNS("COCOA") << "Window Implementation or callbacks not yet initialized." << LL_ENDL; + } + + } void callWindowUnfocus() @@ -1300,6 +1309,8 @@ void LLWindowMacOSX::setupFailure(const std::string& text, const std::string& ca OSMessageBox(text, caption, type); } + // Note on event recording - QUIT is a known special case and we are choosing NOT to record it for the record and playback feature + // it is handled at a very low-level const char* cursorIDToName(int id) { switch (id) diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index 16f2290787..97fad7feb0 100755 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -391,7 +391,7 @@ LLControlVariable* LLControlGroup::declareControl(const std::string& name, eCont } else { - llwarns << "Control named " << name << " already exists, ignoring new declaration." << llendl; + LL_WARNS("Settings") << "Control named " << name << " already exists, ignoring new declaration." << LL_ENDL; } return existing_control; } @@ -630,14 +630,14 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require if (!xml_controls.parseFile(filename)) { - llwarns << "Unable to open control file " << filename << llendl; + LL_WARNS("Settings") << "Unable to open control file " << filename << LL_ENDL; return 0; } LLXmlTreeNode* rootp = xml_controls.getRoot(); if (!rootp || !rootp->hasAttribute("version")) { - llwarns << "No valid settings header found in control file " << filename << llendl; + LL_WARNS("Settings") << "No valid settings header found in control file " << filename << LL_ENDL; return 0; } @@ -650,7 +650,7 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require // Check file version if (version != CURRENT_VERSION) { - llinfos << filename << " does not appear to be a version " << CURRENT_VERSION << " controls file" << llendl; + LL_INFOS("Settings") << filename << " does not appear to be a version " << CURRENT_VERSION << " controls file" << LL_ENDL; return 0; } @@ -668,7 +668,7 @@ U32 LLControlGroup::loadFromFileLegacy(const std::string& filename, BOOL require if (!name.empty()) { //read in to end of line - llwarns << "LLControlGroup::loadFromFile() : Trying to set \"" << name << "\", setting doesn't exist." << llendl; + LL_WARNS("Settings") << "LLControlGroup::loadFromFile() : Trying to set \"" << name << "\", setting doesn't exist." << LL_ENDL; } child_nodep = rootp->getNextChild(); continue; @@ -822,7 +822,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only LLControlVariable* control = iter->second; if (!control) { - llwarns << "Tried to save invalid control: " << iter->first << llendl; + LL_WARNS("Settings") << "Tried to save invalid control: " << iter->first << LL_ENDL; } else if( control->shouldSave(nondefault_only) ) { @@ -838,12 +838,12 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only { LLSDSerialize::toPrettyXML(settings, file); file.close(); - llinfos << "Saved to " << filename << llendl; + LL_INFOS("Settings") << "Saved to " << filename << LL_ENDL; } else { // This is a warning because sometime we want to use settings files which can't be written... - llwarns << "Unable to open settings file: " << filename << llendl; + LL_WARNS("Settings") << "Unable to open settings file: " << filename << LL_ENDL; return 0; } return num_saved; @@ -856,14 +856,14 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v infile.open(filename); if(!infile.is_open()) { - llwarns << "Cannot find file " << filename << " to load." << llendl; + LL_WARNS("Settings") << "Cannot find file " << filename << " to load." << LL_ENDL; return 0; } if (LLSDParser::PARSE_FAILURE == LLSDSerialize::fromXML(settings, infile)) { infile.close(); - llwarns << "Unable to parse LLSD control file " << filename << ". Trying Legacy Method." << llendl; + LL_WARNS("Settings") << "Unable to parse LLSD control file " << filename << ". Trying Legacy Method." << LL_ENDL; return loadFromFileLegacy(filename, TRUE, TYPE_STRING); } @@ -976,6 +976,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v ++validitems; } + LL_DEBUGS("Settings") << "Loaded " << validitems << " settings from " << filename << LL_ENDL; return validitems; } @@ -1012,7 +1013,7 @@ void main() BOOL_CONTROL baz; U32 count = gGlobals.loadFromFile("controls.ini"); - llinfos << "Loaded " << count << " controls" << llendl; + LL_INFOS("Settings") << "Loaded " << count << " controls" << LL_ENDL; // test insertion foo = new LLControlVariable<F32>("gFoo", 5.f, 1.f, 20.f); @@ -1273,19 +1274,19 @@ LLColor4 convert_from_llsd<LLColor4>(const LLSD& sd, eControlType type, const st LLColor4 color(sd); if (color.mV[VRED] < 0.f || color.mV[VRED] > 1.f) { - llwarns << "Color " << control_name << " red value out of range: " << color << llendl; + LL_WARNS("Settings") << "Color " << control_name << " red value out of range: " << color << LL_ENDL; } else if (color.mV[VGREEN] < 0.f || color.mV[VGREEN] > 1.f) { - llwarns << "Color " << control_name << " green value out of range: " << color << llendl; + LL_WARNS("Settings") << "Color " << control_name << " green value out of range: " << color << LL_ENDL; } else if (color.mV[VBLUE] < 0.f || color.mV[VBLUE] > 1.f) { - llwarns << "Color " << control_name << " blue value out of range: " << color << llendl; + LL_WARNS("Settings") << "Color " << control_name << " blue value out of range: " << color << LL_ENDL; } else if (color.mV[VALPHA] < 0.f || color.mV[VALPHA] > 1.f) { - llwarns << "Color " << control_name << " alpha value out of range: " << color << llendl; + LL_WARNS("Settings") << "Color " << control_name << " alpha value out of range: " << color << LL_ENDL; } return LLColor4(sd); diff --git a/indra/llxml/llcontrol.h b/indra/llxml/llcontrol.h index e1f9be80dd..f46d21408b 100755 --- a/indra/llxml/llcontrol.h +++ b/indra/llxml/llcontrol.h @@ -408,16 +408,6 @@ public: } } - LLCachedControl(LLControlGroup& group, - const std::string& name) - { - mCachedControlPtr = LLControlCache<T>::getInstance(name); - if (mCachedControlPtr.isNull()) - { - mCachedControlPtr = new LLControlCache<T>(group, name); - } - } - operator const T&() const { return mCachedControlPtr->getValue(); } operator boost::function<const T&()> () const { return boost::function<const T&()>(*this); } const T& operator()() { return mCachedControlPtr->getValue(); } diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp index aac349bf57..49a1c9dba3 100755 --- a/indra/media_plugins/winmmshim/winmm_shim.cpp +++ b/indra/media_plugins/winmmshim/winmm_shim.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2010&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2010-2014, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,8 +30,8 @@ using std::wstring; -static float sVolumeLevel = 1.f; -static bool sMute = false; +static float sVolumeLevel = 1.f; // Could be covered by critical section, +static bool sMute = false; // not needed with atomicity and alignment. static CRITICAL_SECTION sCriticalSection; BOOL APIENTRY DllMain( HMODULE hModule, @@ -39,37 +39,44 @@ BOOL APIENTRY DllMain( HMODULE hModule, LPVOID lpReserved ) { - InitializeCriticalSection(&sCriticalSection); + if (DLL_PROCESS_ATTACH == ul_reason_for_call) + { + InitializeCriticalSection(&sCriticalSection); + } return TRUE; } void ll_winmm_shim_initialize(){ - static bool initialized = false; - // do this only once - EnterCriticalSection(&sCriticalSection); + static volatile bool initialized = false; + + // do this only once using double-check locking if (!initialized) - { // bind to original winmm.dll - TCHAR system_path[MAX_PATH]; - TCHAR dll_path[MAX_PATH]; - ::GetSystemDirectory(system_path, MAX_PATH); - - // grab winmm.dll from system path, where it should live - wsprintf(dll_path, "%s\\winmm.dll", system_path); - HMODULE winmm_handle = ::LoadLibrary(dll_path); - - if (winmm_handle != NULL) - { // we have a dll, let's get out pointers! - initialized = true; - init_function_pointers(winmm_handle); - ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - } - else - { - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + { + EnterCriticalSection(&sCriticalSection); + if (!initialized) + { // bind to original winmm.dll + TCHAR system_path[MAX_PATH]; + TCHAR dll_path[MAX_PATH]; + ::GetSystemDirectory(system_path, MAX_PATH); + + // grab winmm.dll from system path, where it should live + wsprintf(dll_path, "%s\\winmm.dll", system_path); + HMODULE winmm_handle = ::LoadLibrary(dll_path); + + if (winmm_handle != NULL) + { // we have a dll, let's get out pointers! + init_function_pointers(winmm_handle); + ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); + initialized = true; // Last thing after completing setup + } + else + { + // failed to initialize real winmm.dll + ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); + } } + LeaveCriticalSection(&sCriticalSection); } - LeaveCriticalSection(&sCriticalSection); } @@ -84,7 +91,7 @@ extern "C" int mBitsPerSample; }; typedef std::map<HWAVEOUT, WaveOutFormat*> wave_out_map_t; - static wave_out_map_t sWaveOuts; + static wave_out_map_t sWaveOuts; // Covered by sCriticalSection MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) { @@ -100,7 +107,9 @@ extern "C" && ((fdwOpen & WAVE_FORMAT_QUERY) == 0)) // not just querying for format support { // remember the requested bits per sample, and associate with the given handle WaveOutFormat* wave_outp = new WaveOutFormat(pwfx->wBitsPerSample); + EnterCriticalSection(&sCriticalSection); sWaveOuts.insert(std::make_pair(*phwo, wave_outp)); + LeaveCriticalSection(&sCriticalSection); } return result; } @@ -108,13 +117,15 @@ extern "C" MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) { ll_winmm_shim_initialize(); + EnterCriticalSection(&sCriticalSection); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { // forget what we know about this handle delete found_it->second; sWaveOuts.erase(found_it); } - return waveOutClose_orig( hwo); + LeaveCriticalSection(&sCriticalSection); + return waveOutClose_orig(hwo); } MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) @@ -128,11 +139,19 @@ extern "C" } else if (sVolumeLevel != 1.f) { // need to apply volume level + int bits_per_sample(0); + + EnterCriticalSection(&sCriticalSection); wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); if (found_it != sWaveOuts.end()) { - WaveOutFormat* formatp = found_it->second; - switch (formatp->mBitsPerSample){ + bits_per_sample = found_it->second->mBitsPerSample; + } + LeaveCriticalSection(&sCriticalSection); + if (bits_per_sample) + { + switch (bits_per_sample) + { case 8: { char volume = (char)(sVolumeLevel * 127.f); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index d3835a5b2a..17e340d136 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -191,6 +191,7 @@ set(viewer_SOURCE_FILES llexpandabletextbox.cpp llexternaleditor.cpp llface.cpp + llfacebookconnect.cpp llfasttimerview.cpp llfavoritesbar.cpp llfeaturemanager.cpp @@ -266,6 +267,7 @@ set(viewer_SOURCE_FILES llfloaterregiondebugconsole.cpp llfloaterregioninfo.cpp llfloaterreporter.cpp + llfloaterregionrestarting.cpp llfloaterscriptdebug.cpp llfloaterscriptlimits.cpp llfloatersearch.cpp @@ -273,6 +275,7 @@ set(viewer_SOURCE_FILES llfloatersettingsdebug.cpp llfloatersidepanelcontainer.cpp llfloatersnapshot.cpp + llfloatersocial.cpp llfloatersounddevices.cpp llfloaterspellchecksettings.cpp llfloatertelehub.cpp @@ -508,6 +511,7 @@ set(viewer_SOURCE_FILES llsidetraypanelcontainer.cpp llsky.cpp llslurl.cpp + llsnapshotlivepreview.cpp llspatialpartition.cpp llspeakers.cpp llspeakingindicatormanager.cpp @@ -776,6 +780,7 @@ set(viewer_HEADER_FILES llexpandabletextbox.h llexternaleditor.h llface.h + llfacebookconnect.h llfasttimerview.h llfavoritesbar.h llfeaturemanager.h @@ -851,6 +856,7 @@ set(viewer_HEADER_FILES llfloaterregiondebugconsole.h llfloaterregioninfo.h llfloaterreporter.h + llfloaterregionrestarting.h llfloaterscriptdebug.h llfloaterscriptlimits.h llfloatersearch.h @@ -858,6 +864,7 @@ set(viewer_HEADER_FILES llfloatersettingsdebug.h llfloatersidepanelcontainer.h llfloatersnapshot.h + llfloatersocial.h llfloatersounddevices.h llfloaterspellchecksettings.h llfloatertelehub.h @@ -1082,6 +1089,7 @@ set(viewer_HEADER_FILES llsidetraypanelcontainer.h llsky.h llslurl.h + llsnapshotlivepreview.h llspatialpartition.h llspeakers.h llspeakingindicatormanager.h @@ -1742,6 +1750,7 @@ if (WINDOWS) ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py --actions=copy + --arch=${ARCH} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} @@ -1809,6 +1818,7 @@ if (WINDOWS) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --arch=${ARCH} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} @@ -1933,7 +1943,6 @@ if (LINUX) --configuration=${CMAKE_CFG_INTDIR} --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged --grid=${GRID} - --installer_name=${product} --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched DEPENDS @@ -2011,6 +2020,7 @@ if (DARWIN) ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py --actions=copy + --arch=${ARCH} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} @@ -2043,6 +2053,7 @@ if (DARWIN) COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --arch=${ARCH} --artwork=${ARTWORK_DIR} --build=${CMAKE_CURRENT_BINARY_DIR} --buildtype=${CMAKE_BUILD_TYPE} diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index cff2619cfb..aaf18d2948 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.6.9 +3.7.5 diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 4659673333..60c942094a 100755 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -216,6 +216,16 @@ is_running_function="Floater.IsOpen" is_running_parameters="snapshot" /> + <command name="social" + available_in_toybox="true" + icon="Command_Social_Icon" + label_ref="Command_Social_Label" + tooltip_ref="Command_Social_Tooltip" + execute_function="Floater.ToggleOrBringToFront" + execute_parameters="social" + is_running_function="Floater.IsOpen" + is_running_parameters="social" + /> <command name="speak" available_in_toybox="true" icon="Command_Speak_Icon" diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0e9266dad4..d39bf6c3c2 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1203,7 +1203,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>0</integer> + <integer>1</integer> </map> <key>BulkChangeShareWithGroup</key> <map> @@ -3569,13 +3569,13 @@ <key>FPSLogFrequency</key> <map> <key>Comment</key> - <string>Seconds between display of FPS in log (0 for never)</string> + <string>Seconds between display of FPS in log (0 for never)</string> <key>Persist</key> - <integer>1</integer> + <integer>1</integer> <key>Type</key> - <string>F32</string> + <string>F32</string> <key>Value</key> - <real>10.0</real> + <real>10.0</real> </map> <key>FilterItemsMaxTimePerFrameVisible</key> <map> @@ -4941,6 +4941,16 @@ <key>Value</key> <array /> </map> + <key>LeapPlaybackEventsCommand</key> + <map> + <key>Comment</key> + <string>Command line to use leap to launch playback of event recordings</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>LLSD</string> + <key>Value</key> + </map> <key>LSLFindCaseInsensitivity</key> <map> <key>Comment</key> @@ -5932,6 +5942,17 @@ <key>Value</key> <real>1.6</real> </map> + <key>MaxPersistentNotifications</key> + <map> + <key>Comment</key> + <string>Maximum amount of persistent notifications</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <real>250</real> + </map> <key>MaxSelectDistance</key> <map> <key>Comment</key> @@ -8675,7 +8696,7 @@ <key>RenderDepthOfField</key> <map> <key>Comment</key> - <string>Whether to use depth of field effect when lighting and shadows are enabled</string> + <string>Whether to use depth of field effect when Advanced Lighting Model is enabled</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9840,7 +9861,7 @@ <key>RenderUseVAO</key> <map> <key>Comment</key> - <string>[EXPERIMENTAL] Use GL Vertex Array Objects</string> + <string>[EXPERIMENTAL] Use GL Vertex Array Objects.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9970,7 +9991,18 @@ <key>Value</key> <integer>0</integer> </map> - <key>RevokePermsOnStopAnimation</key> + <key>ReportBugURL</key> + <map> + <key>Comment</key> + <string>URL used for filing bugs from viewer</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://jira.secondlife.com/secure/CreateIssueDetails!init.jspa?pid=10610&issuetype=1&environment=[ENVIRONMENT]&customfield_10253=[LOCATION]</string> + </map> + <key>RevokePermsOnStopAnimation</key> <map> <key>Comment</key> <string>Clear animation permssions when choosing "Stop Animating Me"</string> @@ -10476,6 +10508,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ShowEventRecorderMenuItems</key> + <map> + <key>Comment</key> + <string>Whether or not Event Recorder menu choices - Start / Stop event recording should appear in the (currently) Develop menu</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ShowGestureButton</key> <map> <key>Comment</key> @@ -12632,6 +12675,17 @@ <key>Value</key> <string>00000000-0000-0000-0000-000000000000</string> </map> + <key>UISndRestart</key> + <map> + <key>Comment</key> + <string>Sound file for region restarting (uuid for sound asset)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>b92a0f64-7709-8811-40c5-16afd624a45f</string> + </map> <key>UISndSnapshot</key> <map> <key>Comment</key> @@ -13116,6 +13170,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>SocialPhotoResolution</key> + <map> + <key>Comment</key> + <string>Default resolution when sharing photo using the social floater</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>[i800,i600]</string> + </map> <key>sourceid</key> <map> <key>Comment</key> @@ -13334,7 +13399,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>-1</string> + <string>0</string> </map> <key>VivoxDebugSIPURIHostName</key> <map> @@ -14860,17 +14925,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>DisablePrecacheDelayAfterTeleporting</key> - <map> - <key>Comment</key> - <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>FMODExProfilerEnable</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 636caf5ef3..500151c935 100755 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -77,6 +77,17 @@ <key>Value</key> <integer>412</integer> </map> + <key>ConversationsParticipantListCollapsed</key> + <map> + <key>Comment</key> + <string>Stores the expanded/collapsed state of Nearby chat participant list</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>true</integer> + </map> <key>InstantMessageLogPath</key> <map> <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl index bc63d07d72..c98e7d1cd3 100755 --- a/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/avatarSkinV.glsl @@ -33,8 +33,8 @@ mat4 getSkinnedTransform() mat4 ret; int i = int(floor(weight.x)); float x = fract(weight.x); - - ret[0] = mix(matrixPalette[i+0], matrixPalette[i+1], x); + + ret[0] = mix(matrixPalette[i+0], matrixPalette[i+1], x); ret[1] = mix(matrixPalette[i+15],matrixPalette[i+16], x); ret[2] = mix(matrixPalette[i+30],matrixPalette[i+31], x); ret[3] = vec4(0,0,0,1); diff --git a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl index efd0d03965..57129c3bd1 100755 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -22,27 +22,46 @@ * $/LicenseInfo$ */ - - ATTRIBUTE vec4 weight4; -uniform mat4 matrixPalette[32]; +uniform mat3 matrixPalette[52]; +uniform vec3 translationPalette[52]; mat4 getObjectSkinnedTransform() { - int i; + int i; vec4 w = fract(weight4); vec4 index = floor(weight4); + index = min(index, vec4(51.0)); + index = max(index, vec4( 0.0)); + float scale = 1.0/(w.x+w.y+w.z+w.w); w *= scale; - mat4 mat = matrixPalette[int(index.x)]*w.x; - mat += matrixPalette[int(index.y)]*w.y; - mat += matrixPalette[int(index.z)]*w.z; - mat += matrixPalette[int(index.w)]*w.w; + int i1 = int(index.x); + int i2 = int(index.y); + int i3 = int(index.z); + int i4 = int(index.w); - return mat; + mat3 mat = matrixPalette[i1]*w.x; + mat += matrixPalette[i2]*w.y; + mat += matrixPalette[i3]*w.z; + mat += matrixPalette[i4]*w.w; + + vec3 trans = translationPalette[i1]*w.x; + trans += translationPalette[i2]*w.y; + trans += translationPalette[i3]*w.z; + trans += translationPalette[i4]*w.w; + + mat4 ret; + + ret[0] = vec4(mat[0], 0); + ret[1] = vec4(mat[1], 0); + ret[2] = vec4(mat[2], 0); + ret[3] = vec4(trans, 1.0); + + return ret; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index e5f7366b70..2b5f001873 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -534,6 +534,7 @@ void main() #ifdef FOR_IMPOSTOR vec4 color; color.rgb = diff.rgb; + color.a = 1.0; #ifdef USE_VERTEX_COLOR float final_alpha = diff.a * vertex_color.a; diff --git a/indra/llcommon/llversionviewer.h b/indra/newview/app_settings/shaders/class1/interface/benchmarkF.glsl index 6a5ff314e4..1936e0dcaa 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/newview/app_settings/shaders/class1/interface/benchmarkF.glsl @@ -1,10 +1,9 @@ /** - * @file llversionviewer.h - * @brief + * @file benchmarkF.glsl * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2011, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,18 +23,17 @@ * $/LicenseInfo$ */ -#ifndef LL_LLVERSIONVIEWER_H -#define LL_LLVERSIONVIEWER_H - -const S32 LL_VERSION_MAJOR = 3; -const S32 LL_VERSION_MINOR = 4; -const S32 LL_VERSION_PATCH = 6; -const S32 LL_VERSION_BUILD = 0; +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif -const char * const LL_CHANNEL = "Second Life Developer"; +uniform sampler2D diffuseMap; -#if LL_DARWIN -const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer"; -#endif +VARYING vec2 tc0; -#endif +void main() +{ + frag_color = texture2D(diffuseMap, tc0); +} diff --git a/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl b/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl new file mode 100644 index 0000000000..7beb20ede4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/interface/benchmarkV.glsl @@ -0,0 +1,38 @@ +/** + * @file benchmarkV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +VARYING vec2 tc0; + +void main() +{ + gl_Position = vec4(position, 1.0); + + tc0 = (position.xy*0.5+0.5); +} + diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl index 67dc500493..da02534dbb 100755 --- a/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorF.glsl @@ -31,12 +31,13 @@ out vec4 frag_color; uniform sampler2D tex0; -VARYING vec4 vertex_color; +uniform vec4 color; + VARYING vec2 vary_texcoord0; void main() { - float alpha = texture2D(tex0, vary_texcoord0.xy).a * vertex_color.a; + float alpha = texture2D(tex0, vary_texcoord0.xy).a * color.a; - frag_color = vec4(vertex_color.rgb, alpha); + frag_color = vec4(color.rgb, alpha); } diff --git a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl index c58f9dfdaf..f33115d78d 100755 --- a/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/solidcolorV.glsl @@ -26,16 +26,13 @@ uniform mat4 modelview_projection_matrix; ATTRIBUTE vec3 position; -ATTRIBUTE vec4 diffuse_color; ATTRIBUTE vec2 texcoord0; -VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; void main() { gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); - vertex_color = diffuse_color; vary_texcoord0 = texcoord0; } diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml index 29c019719d..86f9912815 100755 --- a/indra/newview/app_settings/toolbars.xml +++ b/indra/newview/app_settings/toolbars.xml @@ -6,6 +6,7 @@ <command name="speak"/> <command name="destinations"/> <command name="people"/> + <command name="social"/> <command name="profile"/> <command name="move"/> <command name="view"/> diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml index e5b385f4aa..5268498d56 100755 --- a/indra/newview/character/avatar_lad.xml +++ b/indra/newview/character/avatar_lad.xml @@ -3825,7 +3825,11 @@ <volume_morph name="BELLY" scale="0.075 0.04 0.03" - pos="0.07 0 -0.07"/> + pos="0.07 0 -0.02"/> + <volume_morph + name="PELVIS" + scale="0.075 0.04 0.03" + pos="0.07 0 -0.02"/> </param_morph> </param> @@ -3844,7 +3848,16 @@ camera_elevation=".1" camera_distance="1" camera_angle="15"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0273 0.0273 0.0273" + pos="0.038 0.024 -0.016"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0273 0.0273 0.0273" + pos="0.038 -0.024 -0.016"/> + </param_morph> </param> <param @@ -3861,7 +3874,16 @@ value_max="1" camera_elevation="0" camera_distance=".28"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="-0.05 0.0 0.0" + pos="-0.01 -0.01 -0.02"/> + <volume_morph + name="RIGHT_PEC" + scale="-0.05 0.0 0.0" + pos="-0.01 -0.01 -0.02"/> + </param_morph> </param> <param @@ -3878,7 +3900,16 @@ value_max="1" camera_elevation="0" camera_distance=".28"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="-0.051 0.0 0.0" + pos="-0.02 -0.01 -0.03"/> + <volume_morph + name="RIGHT_PEC" + scale="-0.051 0.0 0.0" + pos="-0.02 -0.01 -0.03"/> + </param_morph> </param> <param @@ -3944,6 +3975,10 @@ scale="0.0 -0.01 0.0" pos="0.0 0.0 0"/> <volume_morph + name="UPPER_BACK" + scale="-0.01 -0.01 0.0" + pos="0.0 0.0 0"/> + <volume_morph name="CHEST" scale="-0.01 -0.01 0.0" pos="0.01 0.0 0"/> @@ -3994,6 +4029,10 @@ scale="-0.01 -0.01 0.0" pos="0.01 0.0 0"/> <volume_morph + name="UPPER_BACK" + scale="-0.01 -0.01 0.0" + pos="0.0 0.0 0"/> + <volume_morph name="CHEST" scale="-0.02 -0.02 0.0" pos="0.01 0.0 0"/> @@ -4042,6 +4081,32 @@ scale="0.02 0.03 0.03" pos="0 0 -0.03"/> <volume_morph + name="PELVIS" + scale="0.02 0.03 0.03" + pos="0 0 -0.03"/> + <volume_morph + name="UPPER_BACK" + scale="0.01 0.03 0.0" + pos="-0.03 0 0"/> + <volume_morph + name="LOWER_BACK" + scale="0.04 0.06 0.0" + pos="-0.06 0 0"/> + <volume_morph + name="LEFT_HANDLE" + pos="0.0 0.08 0.0"/> + <volume_morph + name="RIGHT_HANDLE" + pos="0.0 -0.08 0.0"/> + <volume_morph + name="LEFT_PEC" + scale="0.0367 0.0367 0.016" + pos="0.00 -0.005 -0.013"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0367 0.0367 0.016" + pos="0.00 0.005 -0.013"/> + <volume_morph name="BELLY" scale="0.09 0.08 0.07" pos="0 0 -0.05"/> @@ -4093,7 +4158,16 @@ value_max="2" camera_elevation=".3" camera_distance=".8"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.004 0.0 -0.01"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.004 0.0 -0.01"/> + </param_morph> </param> <param @@ -4143,6 +4217,15 @@ <volume_morph name="BELLY" scale="0.0 0.02 0.0"/> + <volume_morph + name="LOWER_BACK" + scale="0.0 0.02 0.0"/> + <volume_morph + name="LEFT_HANDLE" + pos="0.0 0.025 0.0"/> + <volume_morph + name="RIGHT_HANDLE" + pos="0.0 -0.025 0.0"/> </param_morph> </param> @@ -4162,7 +4245,16 @@ value_max="1.3" camera_elevation=".3" camera_distance=".8"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 -0.026 0.0"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.026 0.0"/> + </param_morph> </param> <param @@ -4177,11 +4269,20 @@ label_min="Big Pectorals" label_max="Sunken Chest" value_default="0" - value_min="-.5" + value_min="-1.0" value_max="1.1" camera_elevation=".3" camera_distance="1.2"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="-0.03 -0.024 -0.01"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="-0.03 0.024 -0.01"/> + </param_morph> </param> <!-- ############# # @@ -4206,6 +4307,14 @@ scale="0.03 0.03 0.0" pos="-0.03 0 0.02"/> <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.008 -0.03 0.01"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.008 0.03 0.01"/> + <volume_morph name="L_CLAVICLE" scale="0.02 0.0 0.01" pos="-0.02 0 0"/> @@ -4376,7 +4485,16 @@ value_default="0" value_min="-3" value_max="3"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.0 -0.01"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.0 -0.01"/> + </param_morph> </param> <param @@ -4389,7 +4507,16 @@ value_default="0" value_min="-1.25" value_max="1.25"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 -0.026 0.0"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.026 -0.0"/> + </param_morph> </param> <param @@ -4402,7 +4529,12 @@ value_default="0" value_min="-1" value_max="1"> - <param_morph /> + <param_morph> + <volume_morph + name="BELLY" + scale="0.0 0.0 0.0" + pos="0.0 0.0 0.05"/> + </param_morph> </param> <param @@ -4415,7 +4547,16 @@ value_default="0" value_min="-2" value_max="2"> - <param_morph /> + <param_morph> + <volume_morph + name="LEFT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.03 0.0"/> + <volume_morph + name="RIGHT_PEC" + scale="0.0 0.0 0.0" + pos="0.0 0.03 0.0"/> + </param_morph> </param> <!-- @@ -4518,6 +4659,10 @@ name="PELVIS" scale="-0.01 0.0 0.0" pos="0.01 0 0.0"/> + <volume_morph + name="BUTT" + scale="0.0 0.0886 0.0" + pos="0.03 0 0.0"/> </param_morph> </param> @@ -4949,7 +5094,11 @@ value_default="0" value_min="-1" value_max="1"> - <param_morph /> + <param_morph> + <volume_morph + name="BUTT" + pos="0.0 0.0 0.05"/> + </param_morph> </param> <param @@ -4962,7 +5111,11 @@ value_default="0" value_min="-1" value_max="1"> - <param_morph /> + <param_morph> + <volume_morph + name="BUTT" + pos="0.0 0.05 0.0"/> + </param_morph> </param> <!-- diff --git a/indra/newview/character/avatar_skeleton.xml b/indra/newview/character/avatar_skeleton.xml index 5e73804f2d..6b07bbc1d3 100755 --- a/indra/newview/character/avatar_skeleton.xml +++ b/indra/newview/character/avatar_skeleton.xml @@ -1,11 +1,18 @@ <?xml version="1.0" encoding="US-ASCII" standalone="yes"?> -<linden_skeleton version="1.0" num_bones="46" num_collision_volumes="19"> +<linden_skeleton version="1.0" num_bones="53" num_collision_volumes="26"> <bone name="mPelvis" pos="0.000 0.000 1.067" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 1.067015"> <collision_volume name="PELVIS" pos = "-0.01 0 -0.02" rot="0.000000 8.00000 0.000000" scale="0.12 0.16 0.17"/> + <collision_volume name="BUTT" pos = "-0.06 0 -0.1" rot="0.000000 0.00000 0.000000" scale="0.1 0.1 0.1"/> <bone name="mTorso" pos="0.000 0.000 0.084" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 0.000000 0.084073"> <collision_volume name="BELLY" pos = "0.028 0 0.04" rot="0.000000 8.00000 0.000000" scale="0.09 0.13 0.15"/> + <collision_volume name="LOWER_BACK" pos = "0.0 0.0 0.023" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/> + <collision_volume name="LEFT_HANDLE" pos = "0.0 0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/> + <collision_volume name="RIGHT_HANDLE" pos = "0.0 -0.10 0.058" rot="0.000000 0.00000 0.000000" scale="0.05 0.05 0.05"/> <bone name="mChest" pos="-0.015 0.000 0.205" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.015368 0.000000 0.204877"> <collision_volume name="CHEST" pos = "0.028 0 0.07" rot="0.000000 -10.00000 0.000000" scale="0.11 0.15 0.2"/> + <collision_volume name="UPPER_BACK" pos = "0.0 0.0 0.017" rot="0.000000 0.00000 0.000000" scale="0.09 0.13 0.15"/> + <collision_volume name="LEFT_PEC" pos = "0.119 0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/> + <collision_volume name="RIGHT_PEC" pos = "0.119 -0.082 0.042" rot="0.000000 4.29000 0.000000" scale="0.05 0.05 0.05"/> <bone name="mNeck" pos="-0.010 0.000 0.251" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="-0.009507 0.000000 0.251108"> <collision_volume name="NECK" pos = "0.0 0 0.02" rot="0.000000 0.000000 0.000000" scale="0.05 0.06 0.08"/> <bone name="mHead" pos="0.000 -0.000 0.076" rot="0.000000 0.000000 0.000000" scale="1.000 1.000 1.000" pivot="0.000000 -0.000000 0.075630"> diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 0bdd425504..a2d68eb550 100755 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 35 +version 36 // The version number above should be implemented IF AND ONLY IF some // change has been made that is sufficiently important to justify // resetting the graphics preferences of all users to the recommended @@ -628,3 +628,6 @@ Disregard128DefaultDrawDistance 1 0 list NVIDIA_GeForce_Go_7400 Disregard128DefaultDrawDistance 1 0 +list OSX_10_6_8 +RenderDeferred 0 0 + diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 23a065caff..8efc4ee87d 100755 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -22,11 +22,11 @@ // // Class Numbers: // 0 - Defaults to low graphics settings. No shaders on by default -// 1 - Defaults to mid graphics settings. Basic shaders on by default -// 2 - Defaults to high graphics settings. Atmospherics on by default. -// 3 - Same as 2, but with lighting and shadows enabled. -// 4 - Same as 3, but with ambient occlusion enabled. -// 5 - Same as 4, but with shadows set to "Sun/Moon+Projectors." +// 1 - Defaults to low-mid graphics settings. Basic shaders on by default +// 2 - Defaults to mid graphics settings. Atmospherics on by default +// 3 - Defaults to mid-high graphics settings. Advanced Lighting Model on by default +// 4 - Defaults to high graphics settings. Ambient Occlusion on by default +// 5 - Defaults to high-ultra graphics settings. Shadows set to "Sun/Moon+Projectors." // // Supported Number: // 0 - We claim to not support this card. @@ -35,7 +35,9 @@ 3Dfx .*3Dfx.* 0 0 0 0 3Dlabs .*3Dlabs.* 0 0 0 0 +Hijacker .*Mohr.*Hijacker.* 0 0 0 0 ATI 3D-Analyze .*ATI.*3D-Analyze.* 0 0 0 0 +ATI ARES .*ATI.*ARES.* 0 0 0 0 ATI All-in-Wonder 7500 .*ATI.*All-in-Wonder 75.* 0 1 0 0 ATI All-in-Wonder 8500 .*ATI.*All-in-Wonder 85.* 0 1 0 0 ATI All-in-Wonder 9200 .*ATI.*All-in-Wonder 92.* 0 1 0 0 @@ -47,15 +49,14 @@ ATI All-in-Wonder X1800 .*ATI.*All-in-Wonder X18.* 3 1 0 0 ATI All-in-Wonder X1900 .*ATI.*All-in-Wonder X19.* 3 1 0 0 ATI All-in-Wonder PCI-E .*ATI.*All-in-Wonder.*PCI-E.* 1 1 0 0 ATI All-in-Wonder Radeon .*ATI.*All-in-Wonder Radeon.* 0 1 0 0 -ATI Radeon X1300 .*ATI.*(ASUS|Radeon).*X13.* 2 1 1 2.1 -ATI Radeon X1500 .*ATI.*(ASUS|Radeon).*X15.* 2 1 1 2.1 -ATI Radeon X1600 .*ATI.*(ASUS|Radeon).*X16.* 2 1 1 2.1 -ATI Radeon X1700 .*ATI.*(ASUS|Radeon).*X17.* 2 1 1 2.1 -ATI Radeon X1800 .*ATI.*(Radeon|Diamond) X18.* ?.* 3 1 1 2.1 -ATI Radeon X1900 .*ATI.*(Radeon|Diamond|ASUS) X19.* ?.* 2 1 1 2.1 -ATI Radeon X17xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 -ATI Radeon X16xx .*ATI.*(Radeon|Diamond) X17.* ?.* 1 1 1 2.1 -ATI Radeon X28xx .*ATI.*(Radeon|Diamond) X28.. ?.* 1 1 1 2.1 +ATI Radeon X1300 .*ATI.*(Radeon|Diamond|ASUS) *X13.* ?.* 2 1 1 2.1 +ATI Radeon X1400 .*ATI.*(Radeon|Diamond|ASUS) *X14.* ?.* 2 1 1 2.1 +ATI Radeon X1500 .*ATI.*(Radeon|Diamond|ASUS) *X15.* ?.* 2 1 1 2.1 +ATI Radeon X1600 .*ATI.*(Radeon|Diamond|ASUS) *X16.* ?.* 2 1 1 2.1 +ATI Radeon X1700 .*ATI.*(Radeon|Diamond|ASUS) *X17.* ?.* 2 1 1 2.1 +ATI Radeon X1800 .*ATI.*(Radeon|Diamond|ASUS) *X18.* ?.* 3 1 1 2.1 +ATI Radeon X1900 .*ATI.*(Radeon|Diamond|ASUS) *X19.* ?.* 2 1 1 2.1 +ATI Radeon X2800 .*ATI.*(Radeon|Diamond|ASUS) *X28.* ?.* 2 1 1 2.1 ATI Display Adapter .*ATI.*display adapter.* 1 1 1 4.1 ATI FireGL 5200 .*ATI.*FireGL V52.* 1 1 1 2.1 ATI FireGL 5xxx .*ATI.*FireGL V5.* 2 1 1 3.3 @@ -74,26 +75,6 @@ ATI M56 .*ATI.*M56.* 1 1 0 0 ATI M71 .*ATI.*M71.* 1 1 0 0 ATI M72 .*ATI.*M72.* 1 1 0 0 ATI M76 .*ATI.*M76.* 3 1 0 0 -ATI Radeon HD 6300M .*ATI.*AMD Radeon.* (HD|HD )63..M 2 1 1 4.2 -ATI Radeon HD 6400M .*ATI.*AMD Radeon.* (HD|HD )64..M 2 1 1 4.2 -ATI Radeon HD 6500M .*ATI.*AMD Radeon.* (HD|HD )65..M 2 1 1 4.2 -ATI Radeon HD 6600M .*ATI.*AMD Radeon.* (HD 6|6)6..M 3 1 1 4.2 -ATI Radeon HD 6700M .*ATI.*AMD Radeon.* (HD|HD )67..M 3 1 1 4.2 -ATI Radeon HD 6800M .*ATI.*AMD Radeon.* (HD|HD )68..M 3 1 1 4.2 -ATI Radeon HD 6300G .*ATI.*AMD Radeon.* (HD|HD )63..G 2 1 1 4.2 -ATI Radeon HD 6400G .*ATI.*AMD Radeon.* (HD|HD )64..G 2 1 1 4.2 -ATI Radeon HD 6500G .*ATI.*AMD Radeon.* (HD|HD )65..G 2 1 1 4.2 -ATI Radeon HD 6600G .*ATI.*AMD Radeon.* (HD|HD )66..G 3 1 1 4.2 -ATI Radeon HD 7100 .*ATI.*(Radeon|ASUS).* (HD|HD )71.* 2 1 0 0 -ATI Radeon HD 7200 .*ATI.*(Radeon|ASUS).* (HD|HD )72.* 2 1 0 4.2 -ATI Radeon HD 7300 .*ATI.*(Radeon|ASUS).* (HD|HD )73.* 2 1 0 4.2 -ATI Radeon HD 7400 .*ATI.*(Radeon|ASUS).* (HD|HD )74.* 2 1 0 4.2 -ATI Radeon HD 7500 .*ATI.*(Radeon|ASUS).* (HD|HD )75.* 3 1 1 4.2 -ATI Radeon HD 7600 .*ATI.*(Radeon|ASUS).* (HD|HD )76.* 3 1 0 4.2 -ATI Radeon HD 7700 .*ATI.*(Radeon|ASUS).* (HD|HD )77.* 4 1 1 4.2 -ATI Radeon HD 7800 .*ATI.*(Radeon|ASUS).* (HD|HD )78.* 5 1 1 4.2 -ATI Radeon HD 7900 .*ATI.*(Radeon|ASUS).* (HD|HD )79.* 5 1 1 4.2 -ATI Radeon HD 7000 Series .*ATI.*(Radeon|ASUS).* (HD|HD )7000 Series.* 3 1 1 4.2 ATI Mobility Radeon 4100 .*ATI.*Mobility.* 41.. 1 1 1 3.3 ATI Mobility Radeon 5000 .*ATI.*Mobility.* 50.. 1 1 1 4.2 ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1 1 1.3 @@ -128,42 +109,66 @@ ATI Mobility Radeon HD 5400 .*ATI.*Mobility.*HD 54.* 2 1 1 4.2 ATI Mobility Radeon HD 5500 .*ATI.*Mobility.*HD 55.* 3 1 0 4.2 ATI Mobility Radeon HD 5600 .*ATI.*Mobility.*HD 56.* 3 1 1 4.2 ATI Mobility Radeon HD 5700 .*ATI.*Mobility.*HD 57.* 3 1 1 4.1 -ATI Mobility Radeon HD 6200 .*ATI.*Mobility.*HD 62.* 3 1 0 0 -ATI Mobility Radeon HD 6300 .*ATI.*Mobility.*HD 63.* 3 1 1 4.2 -ATI Mobility Radeon HD 6400M .*ATI.*Mobility.*HD 64.* 3 1 0 0 -ATI Mobility Radeon HD 6500M .*ATI.*Mobility.*HD 65.* 5 1 1 4.2 -ATI Mobility Radeon HD 6600M .*ATI.*Mobility.*HD 66.* 5 1 0 0 -ATI Mobility Radeon HD 6700M .*ATI.*Mobility.*HD 67.* 5 1 0 0 -ATI Mobility Radeon HD 6800M .*ATI.*Mobility.*HD 68.* 5 1 0 0 -ATI Mobility Radeon HD 6900M .*ATI.*Mobility.*HD 69.* 5 1 0 0 -ATI Mobility Radeon Graphics .*ATI Mobility Radeon Graphics.* 1 1 0 4 +ATI Mobility Radeon X1000 .*ATI.*Mobility.*Radeon ?X1..* 2 1 0 2.1 +ATI Mobility Radeon X1200 .*ATI.*Mobility.*Radeon ?X12.* 2 1 0 2.1 +ATI Mobility Radeon X2000 .*ATI.*Mobility.*Radeon ?X20.* 2 1 0 2.1 +ATI Mobility Radeon X2300 .*ATI.*Mobility.*Radeon ?X23.* 2 1 0 2.1 +ATI Mobility Radeon X2500 .*ATI.*Mobility.*Radeon ?X25.* 2 1 0 2.1 +ATI Mobility Radeon XX000 .*ATI.*Mobility.*Radeon ?Xx.* 2 1 0 2.1 +ATI Radeon HD 5xx .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)5x. 1 1 1 4 +ATI Radeon HD 6200D/G/M .*ATI.*AMD Radeon.* (HD|HD )62..[DGM].* 3 1 0 4.2 +ATI Radeon HD 6300D/G/M .*ATI.*AMD Radeon.* (HD|HD )63..[DGM].* 3 1 1 4.2 +ATI Radeon HD 6400D/G/M .*ATI.*AMD Radeon.* (HD|HD )64..[DGM].* 3 1 0 4.2 +ATI Radeon HD 6500D/G/M .*ATI.*AMD Radeon.* (HD|HD )65..[DGM].* 4 1 1 4.2 +ATI Radeon HD 6600D/G/M .*ATI.*AMD Radeon.* (HD|HD )66..[DGM].* 4 1 0 4.2 +ATI Radeon HD 6700D/G/M .*ATI.*AMD Radeon.* (HD|HD )67..[DGM].* 4 1 0 4.2 +ATI Radeon HD 6800D/G/M .*ATI.*AMD Radeon.* (HD|HD )68..[DGM].* 4 1 0 4.2 +ATI Radeon HD 6900D/G/M .*ATI.*AMD Radeon.* (HD|HD )69..[DGM].* 4 1 0 4.2 +ATI Radeon HD 7200D/G/M .*ATI.*AMD Radeon.* (HD|HD )72..[DGM].* 3 1 0 4.2 +ATI Radeon HD 7300D/G/M .*ATI.*AMD Radeon.* (HD|HD )73..[DGM].* 3 1 0 4.2 +ATI Radeon HD 7400D/G/M .*ATI.*AMD Radeon.* (HD|HD )74..[DGM].* 3 1 0 4.2 +ATI Radeon HD 7500D/G/M .*ATI.*AMD Radeon.* (HD|HD )75..[DGM].* 4 1 0 4.2 +ATI Radeon HD 7600D/G/M .*ATI.*AMD Radeon.* (HD|HD )76..[DGM].* 4 1 0 4.2 +ATI Radeon HD 7700D/G/M .*ATI.*AMD Radeon.* (HD|HD )77..[DGM].* 4 1 0 4.2 +ATI Radeon HD 7800D/G/M .*ATI.*AMD Radeon.* (HD|HD )78..[DGM].* 4 1 0 4.2 +ATI Radeon HD 7900D/G/M .*ATI.*AMD Radeon.* (HD|HD )79..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8200D/G/M .*ATI.*AMD Radeon.* (HD|HD )82..[DGM].* 3 1 0 4.2 +ATI Radeon HD 8300D/G/M .*ATI.*AMD Radeon.* (HD|HD )83..[DGM].* 3 1 0 4.2 +ATI Radeon HD 8400D/G/M .*ATI.*AMD Radeon.* (HD|HD )84..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8500D/G/M .*ATI.*AMD Radeon.* (HD|HD )85..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8600D/G/M .*ATI.*AMD Radeon.* (HD|HD )86..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8700D/G/M .*ATI.*AMD Radeon.* (HD|HD )87..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8800D/G/M .*ATI.*AMD Radeon.* (HD|HD )88..[DGM].* 4 1 0 4.2 +ATI Radeon HD 8900D/G/M .*ATI.*AMD Radeon.* (HD|HD )89..[DGM].* 4 1 0 4.2 ATI Radeon HD 2300 .*ATI.*Radeon.* (HD|HD )23.. 0 1 1 3.3 -ATI Radeon HD 2400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)24.. 1 1 1 4 -ATI Radeon HD 2600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)26.. 2 1 1 4 +ATI Radeon HD 2400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)24.. 1 1 1 4 +ATI Radeon HD 2600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)26.. 2 1 1 4 ATI Radeon HD 2900 .*ATI.*Radeon.* (HD|HD )29.. 3 1 1 3.3 ATI Radeon HD 3000 .*ATI.*Radeon.* (HD|HD )30.. 0 1 0 0 ATI Radeon HD 3100 .*ATI.*Radeon.* (HD|HD )31.. 1 1 0 0 ATI Radeon HD 3200 .*ATI.*Radeon.* (HD|HD )32.. 1 1 1 4 ATI Radeon HD 3300 .*ATI.*Radeon.* (HD|HD )33.. 1 1 1 3.3 -ATI Radeon HD 3400 .*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)34.. 1 1 1 4 +ATI Radeon HD 3400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |AH||AX|EAH)34.. 1 1 1 4 ATI Radeon HD 3500 .*ATI.*Radeon.* (HD|HD )35.. 2 1 0 0 -ATI Radeon HD 3600 .*ATI.*(Radeon|ASUS).* (HD|HD |AH|EAH)36.. 3 1 1 4 +ATI Radeon HD 3600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |AH||AX|EAH)36.. 3 1 1 4 ATI Radeon HD 3700 .*ATI.*Radeon.* (HD|HD )37.. 3 1 0 3.3 ATI HD3700 .*ATI.* HD37.. 3 1 0 3.3 -ATI Radeon HD 3800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)38.. 3 1 1 4 +ATI Radeon HD 3800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH|AX|)38.. 3 1 1 4 ATI Radeon HD 4100 .*ATI.*Radeon.* (HD|HD )41.. 1 1 0 0 ATI Radeon HD 4200 .*ATI.*Radeon.* (HD|HD )42.. 1 1 1 4 -ATI Radeon HD 4300 .*ATI.*(Radeon|ASUS).* (HD4|HD 4|EAH4|4)3.. 2 1 1 4 +ATI Radeon HD 4300 .*ATI.*(Radeon|ASUS).* (AH|AX|HD4|HD 4|EAH4|4)3.. 2 1 1 4 ATI Radeon HD 4400 .*ATI.*Radeon.* (HD|HD )44.. 2 1 0 0 -ATI Radeon HD 4500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)45.. 2 1 1 3.3 -ATI Radeon HD 4600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)46.. 3 1 1 4 -ATI Radeon HD 4700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)47.. 3 1 1 3.3 -ATI Radeon HD 4800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)48.. 3 1 1 4 -ATI Radeon HD 5400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)54.. 3 1 1 4.2 -ATI Radeon HD 5500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)55.. 3 1 1 4.2 -ATI Radeon HD 5600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)56.. 3 1 1 4.2 -ATI Radeon HD 5700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)57.. 3 1 1 4.2 -ATI Radeon HD 5800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)58.. 4 1 1 4.2 +ATI Radeon HD 4500 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)45.. 2 1 1 3.3 +ATI RADEON E4690 .*ATI.*RADEON.* E46.. 3 1 1 4 +ATI Radeon HD 4600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)46.. 3 1 1 4 +ATI Radeon HD 4700 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)47.. 3 1 1 3.3 +ATI Radeon HD 4800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)48.. 3 1 1 4 +ATI Radeon HD 5000 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)50.. 3 1 1 4.2 +ATI Radeon HD 5400 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)54.. 3 1 1 4.2 +ATI Radeon HD 5500 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)55.. 3 1 1 4.2 +ATI Radeon HD 5600 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)56.. 3 1 1 4.2 +ATI Radeon HD 5700 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)57.. 3 1 1 4.2 +ATI Radeon HD 5800 .*ATI.*(Radeon|ASUS).* (AH|AX|HD|HD |EAH)58.. 4 1 1 4.2 ATI Radeon HD 5900 .*ATI.*Radeon.* (HD|HD )59.. 4 1 1 4.2 ATI Radeon HD 6200 .*ATI.*Radeon.* (HD|HD )62.. 0 1 1 4.2 ATI Radeon HD 6300 .*ATI.*Radeon.* (HD|HD )63.. 1 1 1 4.2 @@ -173,11 +178,31 @@ ATI Radeon HD 6600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)66.. 3 1 1 4.2 ATI Radeon HD 6700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)67.. 3 1 1 4.2 ATI Radeon HD 6800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)68.. 4 1 1 4.2 ATI Radeon HD 6900 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)69.. 5 1 1 4.2 +ATI Radeon HD 6x00 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)6x.. 5 1 1 4.2 +ATI Radeon HD 7100 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)71.* 2 1 0 0 +ATI Radeon HD 7200 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)72.* 2 1 0 4.2 +ATI Radeon HD 7300 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)73.* 2 1 0 4.2 +ATI Radeon HD 7400 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)74.* 2 1 0 4.2 +ATI Radeon HD 7500 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)75.* 3 1 1 4.2 +ATI Radeon HD 7600 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)76.* 3 1 0 4.2 +ATI Radeon HD 7700 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)77.* 4 1 1 4.2 +ATI Radeon HD 7800 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)78.* 5 1 1 4.2 +ATI Radeon HD 7900 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)79.* 5 1 1 4.2 +ATI Radeon HD 7000 Series .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)7000 Series.* 3 1 1 4.2 +ATI Radeon HD 8200 .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)82.* 2 1 0 4.2 +ATI Radeon HD 8300 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)83.* 2 1 0 4.2 +ATI Radeon HD 8400 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)84.* 2 1 0 4.2 +ATI Radeon HD 8500 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)85.* 3 1 1 4.2 +ATI Radeon HD 8600 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)86.* 3 1 0 4.2 +ATI Radeon HD 8700 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)87.* 4 1 1 4.2 +ATI Radeon HD 8800 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)88.* 5 1 1 4.2 +ATI Radeon HD 8900 (OEM) .*ATI.*(Radeon|ASUS).* (HD|HD |EAH)89.* 5 1 1 4.2 ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0 0 0 ATI Radeon 2100 .*ATI.*Radeon 21.. 0 1 1 2.1 ATI Radeon 3000 .*ATI.*Radeon 30.. 1 1 1 4 ATI Radeon 3100 .*ATI.*Radeon 31.. 0 1 1 3.3 ATI Radeon 5xxx .*ATI.*Radeon 5... 3 1 0 0 +ATI Radeon 6xxx .*ATI.*Radeon 6... 0 1 0 0 ATI Radeon 7xxx .*ATI.*Radeon 7... 0 1 1 2 ATI Radeon 8xxx .*ATI.*Radeon 8... 0 1 0 0 ATI Radeon 9000 .*ATI.*Radeon 90.. 0 1 1 1.3 @@ -187,6 +212,8 @@ ATI Radeon 9500 .*ATI.*Radeon 95.. 0 1 1 2.1 ATI Radeon 9600 .*ATI.*Radeon 96.. 0 1 1 2.1 ATI Radeon 9700 .*ATI.*Radeon 97.. 1 1 0 0 ATI Radeon 9800 .*ATI.*Radeon 98.. 1 1 1 2.1 +ATI Radeon R7 .*ATI.*(Radeon|ASUS).* R7.* 4 1 0 4.2 +ATI Radeon R9 .*ATI.*(Radeon|ASUS).* R9.* 5 1 0 4.2 ATI Radeon RV250 .*ATI.*RV250.* 0 1 0 0 ATI Radeon RV600 .*ATI.*RV6.* 1 1 0 0 ATI Radeon RX700 .*ATI.*RX70.* 1 1 0 0 @@ -195,6 +222,7 @@ ATI RS880M .*ATI.*RS880M 1 1 0 0 ATI Radeon RX9550 .*ATI.*RX9550.* 1 1 0 0 ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0 0 0 ATI Radeon X300 .*ATI.*Radeon X3.* 1 1 1 2.1 +ATI RADEON X300SE .*ATI.*RADEON[ ]*X300SE* 1 1 1 2.1 ATI Radeon X400 .*ATI.*Radeon ?X4.* 0 1 0 0 ATI Radeon X500 .*ATI.*Radeon ?X5.* 1 1 1 2.1 ATI Radeon X600 .*ATI.*(Radeon |ASUS Extreme A)X6.* 1 1 1 2.1 @@ -202,10 +230,14 @@ ATI Radeon X700 .*ATI.*Radeon ?X7.* 2 1 1 2.1 ATI Radeon X800 .*ATI.*Radeon ?X8.* 1 1 1 2.1 ATI Radeon X900 .*ATI.*Radeon ?X9.* 2 1 0 0 ATI Radeon X1000 .*ATI.*Radeon ?X10.* 2 1 0 2.1 +ATI Radeon X1100 .*ATI.*Radeon ?X11.* 2 1 0 2.1 ATI Radeon X1200 .*ATI.*Radeon ?X12.* 2 1 0 2.1 -ATI Radeon X1400 .*ATI.*Radeon ?X14.* 2 1 0 2.1 +ATI Radeon X1xxx .*ATI.*Radeon ?X1xx.* 2 1 0 2.1 +ATI Radeon X12xx .*ATI.*Radeon ?X12x.* 2 1 0 2.1 +ATI Radeon X2xxx .*ATI.*Radeon ?X2x.* 2 1 0 2.1 ATI Radeon X2300 .*ATI.*Radeon ?X23.* 2 1 0 2.1 ATI Radeon Xpress .*ATI.*Radeon Xpress.* 0 1 1 2.1 +ATI Radeon .*ATI.*Radeon$ 3 1 0 0 ATI Rage 128 .*ATI.*Rage 128.* 0 1 0 0 ATI R300 (9700) .*R300.* 0 1 1 2.1 ATI R350 (9800) .*R350.* 1 1 0 0 @@ -224,7 +256,9 @@ ATI RX480 (Xpress 200P) .*RX480.* 0 1 0 0 ATI RX700 .*RX700.* 1 1 0 0 AMD ANTILLES (HD 6990) .*(AMD|ATI).*Antilles.* 3 1 0 0 ATI ROBSON .*(AMD|ATI).*ROBSON.* 3 1 0 4 +AMD ARUBA (HD 6800) .*(AMD|ATI).*ARUBA.* 3 1 1 2.1 AMD BARTS (HD 6800) .*(AMD|ATI).*Barts.* 3 1 1 2.1 +AMD BA (HD 6800) .*(AMD|ATI).*BA.* 3 1 1 2.1 AMD WRESTLER .*(AMD|ATI).*WRESTLER.* 3 1 1 4 AMD SUMO .*(AMD|ATI).*SUMO.* 3 1 1 4.1 AMD CAICOS (HD 6400) .*(AMD|ATI).*Caicos.* 3 1 0 0 @@ -236,6 +270,8 @@ AMD JUNIPER (HD 5700) .*(AMD|ATI).*Juniper.* 3 1 0 0 AMD PARK .*(AMD|ATI).*Park.* 3 1 0 0 AMD REDWOOD (HD 5500/5600) .*(AMD|ATI).*Redwood.* 3 1 0 1.4 AMD TURKS (HD 6500/6600) .*(AMD|ATI).*Turks.* 3 1 0 2.1 +AMD PITCAIRN (HD 7870) .*(AMD|ATI).*Pitcairn.* 3 1 0 2.1 +AMD TAHITI (HD 7000) .*(AMD|ATI).*Tahiti.* 3 1 0 2.1 AMD RS780 (HD 3200) .*RS780.* 0 1 1 2.1 AMD RS880 (HD 4200) .*RS880.* 0 1 1 3.2 AMD RV610 (HD 2400) .*RV610.* 1 1 0 0 @@ -253,15 +289,15 @@ AMD RV790 (HD 4800) .*RV790.* 3 1 0 0 ATI 760G/Radeon 3000 .*ATI.*AMD 760G.* 1 1 1 3.3 ATI 780L/Radeon 3000 .*ATI.*AMD 780L.* 1 1 0 0 ATI Radeon DDR .*ATI.*Radeon ?DDR.* 0 1 0 0 -ATI FirePro 2000 .*ATI.*FirePro 2.* 2 1 1 4.2 -ATI FirePro 3000 .*ATI.*FirePro V3.* 2 1 0 0 -ATI FirePro 4000 .*ATI.*FirePro V4.* 2 1 0 4.1 -ATI FirePro 5000 .*ATI.*FirePro V5.* 3 1 0 0 -ATI FirePro 7000 .*ATI.*FirePro V7.* 3 1 0 0 +ATI FirePro 2000 .*ATI.*FirePro [V]*2.* 2 1 1 4.2 +ATI FirePro 3000 .*ATI.*FirePro [V]*3.* 2 1 0 0 +ATI FirePro 4000 .*ATI.*FirePro [V]*4.* 2 1 0 4.1 +ATI FirePro 5000 .*ATI.*FirePro [V]*5.* 3 1 0 0 +ATI FirePro 7000 .*ATI.*FirePro [V]*7.* 3 1 0 0 ATI FirePro M .*ATI.*FirePro M.* 3 1 1 4.2 -ATI R300 (9700) .*R300.* 0 1 1 2.1 Intel X3100 .*Intel.*X3100.* 1 1 1 2.1 Intel GMA 3600 .*Intel.* 3600.* 0 1 1 3 +Intel Royal BNA .*Intel.*Royal[ ]*BNA.* 0 0 0 0 Intel 830M .*Intel.*830M 0 0 0 0 Intel 845G .*Intel.*845G 0 0 1 1.4 Intel 855GM .*Intel.*855GM 0 0 1 1.4 @@ -282,11 +318,20 @@ Intel Brookdale .*Intel.*Brookdale.* 0 0 1 1.3 Intel Cantiga .*Intel.*Cantiga.* 0 0 1 2 Intel Eaglelake .*Intel.*Eaglelake.* 1 1 1 2 Intel Graphics Media HD .*Intel.*Graphics Media.*HD.* 1 1 1 2.1 -Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 4 +Intel HD Graphics 2500 .*Intel.*HD Graphics 25.* 2 1 0 4.2 +Intel HD Graphics 2000 .*Intel.*HD Graphics 2.* 2 1 0 3.1 Intel HD Graphics 3000 .*Intel.*HD Graphics 3.* 3 1 1 3.1 -Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4 +Intel HD Graphics 4200 .*Intel.*HD Graphics 42.* 3 1 0 4.2 +Intel HD Graphics 4400 .*Intel.*HD Graphics 44.* 3 1 0 4.2 +Intel HD Graphics 4600 .*Intel.*HD Graphics 46.* 3 1 0 4.2 +Intel HD Graphics 4000 .*Intel.*HD Graphics 4.* 3 1 1 4.2 +Intel Intel Iris Pro Graphics 5200 .*Intel.*Iris Pro Graphics 52.* 4 1 0 4 +Intel Intel Iris Graphics 5100 .*Intel.*Iris Graphics 51.* 4 1 0 4 +Intel Intel Iris OpenGL Engine .*Intel.*Iris (Pro )*OpenGL.* 4 1 0 4 +Intel HD Graphics 5000 .*Intel.*HD Graphics 5.* 4 1 0 4 Intel HD Graphics .*Intel.*HD Graphics.* 2 1 1 4 Intel Mobile 4 Series .*Intel.*Mobile.* 4 Series.* 0 1 1 2.1 +Intel Mobile 45 Express .*Intel.*Mobile.* 45 Express Chipset.* 0 1 0 2.1 Intel 4 Series Internal .*Intel.* 4 Series Internal.* 1 1 1 2.1 Intel Media Graphics HD .*Intel.*Media Graphics HD.* 0 1 0 0 Intel Montara .*Intel.*Montara.* 0 0 1 1.3 @@ -299,116 +344,197 @@ Intel 3D-Analyze .*Intel.*3D-Analyze.* 2 1 0 0 Matrox .*Matrox.* 0 0 0 0 Mesa .*Mesa.* 1 0 1 3 Gallium .*Gallium.* 1 1 1 2.1 -NVIDIA G100M .*NVIDIA .* 10[0-9]M.* 4 1 1 3.3 -NVIDIA G 110M .*NVIDIA .* 11[0-9]M.* 1 1 1 3.3 -NVIDIA G 120M .*NVIDIA .* 12[0-9]M.* 1 1 1 3.3 -NVIDIA G 200M .*NVIDIA .* 20[0-9]M.* 1 1 0 0 -NVIDIA G 410M .*NVIDIA .* 41[0-9]M.* 3 1 1 4.2 -NVIDIA GT 130M .*NVIDIA .*GT 13[0-9]M.* 3 1 1 3.3 -NVIDIA GT 140M .*NVIDIA .*GT 14[0-9]M.* 3 1 1 3.3 -NVIDIA GT 150M .*NVIDIA .*GTS 15[0-9]M.* 2 1 0 0 -NVIDIA GTS 160M .*NVIDIA .*GTS 16[0-9]M.* 2 1 0 0 -NVIDIA G210M .*NVIDIA .*G21[0-9]M.* 3 1 0 3.3 +NVIDIA GeForce Pre-Release .*NVIDIA .*GeForce[ ]Pre-Release.* 2 1 1 3.3 +NVIDIA D1xP1 .*NVIDIA .*D1[0-4]P1.* 0 0 0 0 +NVIDIA Mystery PCI Card .*NVIDIA .Corporation [/]PCI]/]SSE2.* 0 0 0 0 +NVIDIA Quadro FX 770M .*Quadro.*FX 77[0-9]M.* 2 1 0 3.3 +NVIDIA Quadro FX 1500M .*Quadro.*FX 150[0-9]M.* 1 1 0 2.1 +NVIDIA Quadro FX 1600M .*Quadro.*FX 160[0-9]M.* 2 1 0 3.3 +NVIDIA Quadro FX 2500M .*Quadro.*FX 250[0-9]M.* 2 1 0 2.1 +NVIDIA Quadro FX 2700M .*Quadro.*FX 270[0-9]M.* 3 1 0 3.3 +NVIDIA Quadro FX 2800M .*Quadro.*FX 280[0-9]M.* 3 1 0 3.3 +NVIDIA Quadro FX 3500 .*Quadro.*FX 3500.* 2 1 0 2.1 +NVIDIA Quadro FX 3600 .*Quadro.*FX 3600.* 3 1 0 3.3 +NVIDIA Quadro FX 3700 .*Quadro.*FX 3700.* 3 1 0 3.3 +NVIDIA Quadro FX 3800 .*Quadro.*FX 3800.* 3 1 0 3.3 +NVIDIA Quadro FX 4500 .*Quadro.*FX 45.* 3 1 0 2.1 +NVIDIA Quadro FX 880M .*Quadro.*FX 88[0-9]M.* 3 1 0 3.3 +NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro FX 4800.* 3 1 0 3.1 +NVIDIA Quadro FX .*NVIDIA .*Quadro FX.* 1 1 0 3.3 +NVIDIA Quadro NVS 1xxM .*NVIDIA .*(Quadro)* NVS *1.[05]M.* 0 1 1 3.3 +NVIDIA Quadro NVS 300M .*NVIDIA .*(Quadro)*[ ]+NVS *30[0-9]M.* 2 1 0 0 +NVIDIA Quadro NVS 320M .*NVIDIA .*(Quadro)*[ ]+NVS *32[0-9]M.* 2 1 0 0 +NVIDIA Quadro NVS 2100M .*NVIDIA .*(Quadro)*[ ]+NVS *210[0-9]M.* 2 1 0 3.3 +NVIDIA Quadro NVS 3100M .*NVIDIA .*(Quadro)*[ ]+NVS *310[0-9]M.* 2 1 0 3.3 +NVIDIA Quadro NVS 4200M .*NVIDIA .*(Quadro)*[ ]+NVS *420[0-9]M.* 2 1 0 4.2 +NVIDIA Quadro NVS 5100M .*NVIDIA .*(Quadro)*[ ]+NVS *510[0-9]M.* 2 1 0 0 +NVIDIA Quadro NVS 5200M .*NVIDIA .*(Quadro)*[ ]+NVS *520[0-9]M.* 2 1 0 0 +NVIDIA Quadro NVS 5400M .*NVIDIA .*(Quadro)*[ ]+NVS *540[0-9]M.* 2 1 0 0 +NVIDIA Quadro NVS .*NVIDIA .*(Quadro)*[ ]+NVS 0 1 0 4.2 +NVIDIA Quadro2 .*Quadro2.* 0 1 0 1.5 +NVIDIA Quadro 1000M .*Quadro.* (K1|1)00[0-9]M.* 2 1 0 4.2 +NVIDIA Quadro 1100M .*Quadro.* *110[0-9]M.* 2 1 0 3.3 +NVIDIA Quadro K600 .*Quadro.* (K6|6)0[0-9][^0].* 2 1 0 4.2 +NVIDIA Quadro K1000 .*Quadro.* (K1|1)00[0-9].* 2 1 0 4.2 +NVIDIA Quadro 2000 M/D .*Quadro.* (K2|2)000.* 3 1 0 4.2 +NVIDIA Quadro 3000M .*Quadro.* (K3|3)00[0-9]M.* 3 1 0 4.2 +NVIDIA Quadro 4000M .*Quadro.* (K4|4)00[0-9]M.* 3 1 0 4.2 +NVIDIA Quadro 4000 .*Quadro.* (K4|4)000.* 3 1 0 4.2 +NVIDIA Quadro 50x0 M .*Quadro.* (K5|5)0.0.* 3 1 0 4.2 +NVIDIA Quadro 6000 .*Quadro.* (K6|6)000.* 3 1 0 0 +NVIDIA Quadro 400 .*Quadro.* 400.* 2 1 0 3.3 +NVIDIA Quadro 600 .*Quadro.* 600.* 2 1 0 4.2 +NVIDIA Quadro4 .*Quadro4.* 0 1 0 1.5 +NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 +NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0 +NVIDIA G 100M .*NVIDIA .*G *10[0-9]M.* 1 1 1 3.3 +NVIDIA G 110M .*NVIDIA .*G *11[0-9]M.* 1 1 1 3.3 +NVIDIA G 120M .*NVIDIA .*G *12[0-9]M.* 1 1 1 3.3 +NVIDIA G 200M .*NVIDIA .*G *20[0-9]M.* 1 1 0 0 +NVIDIA G 410M .*NVIDIA .*G *41[0-9]M.* 3 1 1 4.2 +NVIDIA GT 130M .*NVIDIA .*GT *13[0-9]M.* 3 1 1 3.3 +NVIDIA GT 140M .*NVIDIA .*GT *14[0-9]M.* 3 1 1 3.3 +NVIDIA GT 150M .*NVIDIA .*GTS *15[0-9]M.* 2 1 0 0 +NVIDIA GTS 160M .*NVIDIA .*GTS *16[0-9]M.* 2 1 0 0 +NVIDIA G210M .*NVIDIA .*G *21[0-9]M.* 3 1 0 3.3 NVIDIA GT 220M .*NVIDIA .*GT 22[0-9]M.* 3 1 1 3.3 NVIDIA GT 230M .*NVIDIA .*GT 23[0-9]M.* 3 1 1 3.3 NVIDIA GT 240M .*NVIDIA .*GT 24[0-9]M.* 3 1 1 3.3 +NVIDIA GT 260M .*NVIDIA .*GT 26[0-9]M.* 3 1 1 3.3 NVIDIA GTS 250M .*NVIDIA .*GTS 25[0-9]M.* 3 1 0 3.3 NVIDIA GTS 260M .*NVIDIA .*GTS 26[0-9]M.* 3 1 0 0 NVIDIA GTX 260M .*NVIDIA .*GTX 26[0-9]M.* 3 1 0 3.3 NVIDIA GTX 270M .*NVIDIA .*GTX 27[0-9]M.* 3 1 0 0 NVIDIA GTX 280M .*NVIDIA .*GTX 28[0-9]M.* 3 1 0 3.3 NVIDIA 300M .*NVIDIA .*GT 30[0-9]M.* 3 1 1 4.2 -NVIDIA G 310M .*NVIDIA .* 31[0-9]M.* 2 1 0 3.3 -NVIDIA GT 320M .*NVIDIA .* 32[0-9]M.* 3 1 0 3.3 -NVIDIA GT 330M .*NVIDIA .*GT 33[0-9]M.* 3 1 1 3.3 -NVIDIA GT 340M .*NVIDIA .*GT 34[0-9]M.* 4 1 1 3.3 +NVIDIA G 310M .*NVIDIA .*G[T]* 31[0-9]M.* 2 1 0 3.3 +NVIDIA GT 320M .*NVIDIA .*G[T]* 32[0-9]M.* 3 1 0 3.3 +NVIDIA GT 330M .*NVIDIA .*G[T]* 33[0-9]M.* 3 1 1 3.3 +NVIDIA GT 340M .*NVIDIA .*G[T]* 34[0-9]M.* 4 1 1 3.3 NVIDIA GTS 350M .*NVIDIA .*GTS 35[0-9]M.* 4 1 1 3.3 NVIDIA GTS 360M .*NVIDIA .*GTS 36[0-9]M.* 5 1 1 3.3 -NVIDIA 400M .*NVIDIA .* 40[0-9]M.* 2 1 0 0 -NVIDIA 410M .*NVIDIA .* 41[0-9]M.* 3 1 0 0 -NVIDIA GT 420M .*NVIDIA .*GT 42[0-9]M.* 3 1 1 4.2 -NVIDIA GT 430M .*NVIDIA .*GT 43[0-9]M.* 3 1 1 4.2 -NVIDIA GT 440M .*NVIDIA .*GT 44[0-9]M.* 3 1 1 4.2 -NVIDIA GT 450M .*NVIDIA .*GT 45[0-9]M.* 3 1 0 0 -NVIDIA GTX 460M .*NVIDIA .*GTX 46[0-9]M.* 4 1 1 4.3 -NVIDIA GTX 470M .*NVIDIA .*GTX 47[0-9]M.* 3 1 0 4.2 -NVIDIA GTX 480M .*NVIDIA .*GTX 48[0-9]M.* 3 1 1 4.2 -NVIDIA GT 520M .*NVIDIA .*GT 52[0-9]M.* 3 1 1 4.2 -NVIDIA GT 530M .*NVIDIA .*GT 53[0-9]M.* 3 1 1 4.2 -NVIDIA GT 540M .*NVIDIA .*GT 54[0-9]M.* 3 1 1 4.2 -NVIDIA GT 550M .*GeForce GT 55[0-9]M.* 3 1 1 4.2 -NVIDIA GTX 560M .*NVIDIA .*GTX 56[0-9]M.* 3 1 0 4.2 -NVIDIA GTX 570M .*NVIDIA .*GTX 57[0-9]M.* 5 1 0 4.2 -NVIDIA GTX 580M .*NVIDIA .*GTX 58[0-9]M.* 5 1 1 4.2 -NVIDIA 610M .*NVIDIA.* 61[0-9]M.* 3 1 1 4.2 -NVIDIA GT 620M .*NVIDIA .*GT 62[0-9]M.* 3 1 0 4.2 -NVIDIA GT 630M .*NVIDIA .*GT 63[0-9]M.* 3 1 0 4.2 -NVIDIA GT 640M .*NVIDIA .*GT 64[0-9]M.* 3 1 0 4.2 -NVIDIA GT 650M .*NVIDIA .*GT 65[0-9]M.* 3 1 0 4.2 -NVIDIA GTX 660M .*NVIDIA .*GTX 66[0-9]M.* 5 1 0 4.3 -NVIDIA GTX 670M .*NVIDIA .*GTX 67[0-9]M.* 5 1 1 4.2 -NVIDIA GTX 680M .*NVIDIA .*GTX 68[0-9]M.* 5 1 0 4.2 -NVIDIA GTX 690M .*NVIDIA .*GTX 69[0-9]M.* 5 1 0 0 +NVIDIA 310M .*NVIDIA .*31[0-9]M.* 2 1 0 3.3 +NVIDIA 320M .*NVIDIA .*320M.* 2 1 0 3.3 +NVIDIA 400M .*NVIDIA .*[ ]+40[0-9]M.* 2 1 0 0 +NVIDIA 410M .*NVIDIA .*[ ]+41[0-9]M.* 3 1 0 0 +NVIDIA GT 420M .*NVIDIA .*GT *42[0-9]M.* 3 1 1 4.3 +NVIDIA GT 430M .*NVIDIA .*GT *43[0-9]M.* 3 1 1 4.3 +NVIDIA GT 440M .*NVIDIA .*GT *44[0-9]M.* 3 1 1 4.3 +NVIDIA GT 450M .*NVIDIA .*GT *45[0-9]M.* 3 1 0 0 +NVIDIA GTX 460M .*NVIDIA .*GTX *46[0-9]M.* 4 1 1 4.3 +NVIDIA GTX 470M .*NVIDIA .*GTX *47[0-9]M.* 3 1 0 4.3 +NVIDIA GTX 480M .*NVIDIA .*GTX *48[0-9]M.* 3 1 1 4.3 +NVIDIA GT 520M .*NVIDIA .*GT *52[0-9]M.* 3 1 1 4.3 +NVIDIA GT 530M .*NVIDIA .*GT *53[0-9]M.* 3 1 1 4.3 +NVIDIA GT 540M .*NVIDIA .*GT *54[0-9]M.* 3 1 1 4.3 +NVIDIA GT 550M .*NVIDIA .*GT *55[0-9]M.* 3 1 1 4.3 +NVIDIA GTX 560M .*NVIDIA .*GTX *56[0-9]M.* 3 1 0 4.3 +NVIDIA GTX 570M .*NVIDIA .*GTX *57[0-9]M.* 5 1 0 4.3 +NVIDIA GTX 580M .*NVIDIA .*GTX *58[0-9]M.* 5 1 1 4.3 +NVIDIA 610M .*NVIDIA.* 61[0-9]M.* 3 1 1 4.3 +NVIDIA GT 620M .*NVIDIA .*GT *62[0-9]M.* 3 1 0 4.3 +NVIDIA GT 630M .*NVIDIA .*GT *63[0-9]M.* 3 1 0 4.3 +NVIDIA GT 640M .*NVIDIA .*GT *64[0-9]M.* 3 1 0 4.3 +NVIDIA GT 650M .*NVIDIA .*GT *65[0-9]M.* 3 1 0 4.3 +NVIDIA GTX 660M .*NVIDIA .*GTX *66[0-9]M.* 5 1 0 4.3 +NVIDIA GTX 670M .*NVIDIA .*GTX *67[0-9]M.* 5 1 1 4.3 +NVIDIA GTX 680M .*NVIDIA .*GTX *68[0-9]M.* 5 1 0 4.3 +NVIDIA GTX 690M .*NVIDIA .*GTX *69[0-9]M.* 5 1 0 4.3 +NVIDIA 710M .*NVIDIA.* 71[0-9]M.* 3 1 0 4.3 +NVIDIA GT 720M .*NVIDIA .*GT *72[0-9]M.* 3 1 0 4.3 +NVIDIA GT 730M .*NVIDIA .*GT *73[0-9]M.* 3 1 0 4.3 +NVIDIA GT 740M .*NVIDIA .*GT *74[0-9]M.* 3 1 0 4.3 +NVIDIA GT 750M .*NVIDIA .*GT *75[0-9]M.* 3 1 0 4.3 +NVIDIA GTX 760M .*NVIDIA .*GTX *76[0-9]M.* 5 1 0 4.3 +NVIDIA GTX 770M .*NVIDIA .*GTX *77[0-9]M.* 5 1 0 4.3 +NVIDIA GTX 780M .*NVIDIA .*GTX *78[0-9]M.* 5 1 0 4.3 NVIDIA G100 .*NVIDIA .*G10.* 3 1 1 4.2 NVIDIA GT 120 .*NVIDIA .*GT 12.* 2 1 0 3.3 NVIDIA GT 130 .*NVIDIA .*GT 13.* 2 1 0 3.3 NVIDIA GT 140 .*NVIDIA .*GT 14.* 2 1 0 3.3 +NVIDIA GT 150 .*NVIDIA .*GT 15.* 2 1 1 3.3 NVIDIA GTS 150 .*NVIDIA .*GTS 15.* 2 1 0 0 -NVIDIA 200 .*NVIDIA .*GeForce 20.* 2 1 1 3.3 -NVIDIA G200 .*NVIDIA .*GeForce G20.* 2 1 1 3.3 -NVIDIA G210 .*NVIDIA .*GeForce G210.* 3 1 1 3.3 -NVIDIA 210 .*NVIDIA .*GeForce 210.* 3 1 1 3.3 -NVIDIA GT 220 .*NVIDIA .*GT 22.* 2 1 1 3.3 -NVIDIA GT 230 .*NVIDIA .*GT 23.* 2 1 1 3.3 -NVIDIA GT 240 .*NVIDIA .*GT 24.* 4 1 1 3.3 -NVIDIA GTS 240 .*NVIDIA .*GTS 24.* 4 1 1 3.3 -NVIDIA GTS 250 .*NVIDIA .*GTS 25.* 4 1 1 3.3 -NVIDIA GTX 260 .*NVIDIA .*GTX 26.* 4 1 1 3.3 -NVIDIA GTX 270 .*NVIDIA .*GTX 27.* 4 1 0 3.3 -NVIDIA GTX 280 .*NVIDIA .*GTX 28.* 4 1 1 3.3 -NVIDIA GTX 290 .*NVIDIA .*GTX 29.* 5 1 0 3.3 -NVIDIA 310 .*NVIDIA .*GeForce 310.* 3 1 1 3.3 -NVIDIA 315 .*NVIDIA .*GeForce 315.* 3 1 1 3.3 -NVIDIA GT 320 .*NVIDIA .*GT 32.* 3 1 0 3.3 -NVIDIA GT 330 .*NVIDIA .*GT 33.* 3 1 0 3.3 -NVIDIA GT 340 .*NVIDIA .*GT 34.* 3 1 0 3.3 -NVIDIA 405 .*NVIDIA .* 405.* 3 1 0 3.3 -NVIDIA GT 420 .*NVIDIA .*GT 42.* 3 1 1 4.2 -NVIDIA GT 430 .*NVIDIA .*GT 43.* 3 1 1 4.3 -NVIDIA GT 440 .*NVIDIA .*GT 44.* 4 1 0 4.3 -NVIDIA GTS 450 .*NVIDIA .*GTS 45.* 4 1 1 4.2 -NVIDIA GTX 460 .*NVIDIA .*GTX 46.* 5 1 1 4.3 -NVIDIA GTX 470 .*NVIDIA .*GTX 47.* 5 1 1 4.2 -NVIDIA GTX 480 .*NVIDIA .*GTX 48.* 5 1 1 4.2 -NVIDIA 510 .*NVIDIA .* 510.* 3 1 0 4.2 -NVIDIA GT 520 .*NVIDIA .*GT 52.* 3 1 1 4.2 -NVIDIA GT 530 .*NVIDIA .*GT 53.* 3 1 1 4.2 -NVIDIA GT 540 .*NVIDIA .*GT 54.* 3 1 1 4.2 -NVIDIA GTX 550 .*NVIDIA .*GTX 55.* 5 1 1 4.3 -NVIDIA GTX 560 .*NVIDIA .*GTX 56.* 5 1 1 4.3 -NVIDIA GTX 570 .*NVIDIA .*GTX 57.* 5 1 1 4.2 -NVIDIA GTX 580 .*NVIDIA .*GTX 58.* 5 1 1 4.3 -NVIDIA GTX 590 .*NVIDIA .*GTX 59.* 5 1 1 4.2 -NVIDIA 605 .*NVIDIA .* 605.* 3 1 1 4.2 -NVIDIA GT 610 .*NVIDIA .*GT 61.* 3 1 1 4.2 -NVIDIA GT 620 .*NVIDIA .*GT 62.* 3 1 0 4.2 -NVIDIA GT 630 .*NVIDIA .*GT 63.* 3 1 0 4.2 -NVIDIA GT 640 .*NVIDIA .*GT 64.* 3 1 0 4.2 -NVIDIA GT 650 .*NVIDIA .*GT 65.* 3 1 1 4.2 -NVIDIA GTX 650 .*NVIDIA .*GTX 65.* 3 1 1 4.2 -NVIDIA GTX 660 .*NVIDIA .*GTX 66.* 5 1 0 4.3 -NVIDIA GTX 670 .*NVIDIA .*GTX 67.* 5 1 1 4.2 -NVIDIA GTX 680 .*NVIDIA .*GTX 68.* 5 1 1 4.2 -NVIDIA GTX 690 .*NVIDIA .*GTX 69.* 5 1 1 4.2 +NVIDIA 200 .*NVIDIA .[ ]+200[^0].* 2 1 1 3.3 +NVIDIA G200 .*NVIDIA .*G[ ]*200.* 2 1 1 3.3 +NVIDIA G210 .*NVIDIA .*G[ ]*210.* 3 1 1 3.3 +NVIDIA 205 .*NVIDIA .*205[^0]*.* 3 1 1 3.3 +NVIDIA 210 .*NVIDIA .*210$ 3 1 1 3.3 +NVIDIA GeForce 210 .*NVIDIA .*(GeForce)[ ]210[^0]*$ 3 1 1 3.3 +NVIDIA GT 220 .*NVIDIA .*GT *22.* 2 1 1 3.3 +NVIDIA GT 230 .*NVIDIA .*GT *23.* 2 1 1 3.3 +NVIDIA GT 240 .*NVIDIA .*GT *24.* 4 1 1 3.3 +NVIDIA GTS 240 .*NVIDIA .*GTS *24.* 4 1 1 3.3 +NVIDIA GTS 250 .*NVIDIA .*GTS *25.* 4 1 1 3.3 +NVIDIA GTS 360 .*NVIDIA .*GTS *36.* 4 1 1 3.3 +NVIDIA GTX 260 .*NVIDIA .*GTX *26.* 4 1 1 3.3 +NVIDIA GTX 270 .*NVIDIA .*GTX *27.* 4 1 0 3.3 +NVIDIA GTX 280 .*NVIDIA .*GTX *28.* 4 1 1 3.3 +NVIDIA GTX 290 .*NVIDIA .*GTX *29.* 5 1 0 3.3 +NVIDIA GT 320 .*NVIDIA .*GT *32.* 3 1 0 3.3 +NVIDIA GT 330 .*NVIDIA .*GT *33.* 3 1 0 3.3 +NVIDIA GT 340 .*NVIDIA .*GT *34.* 3 1 0 0 +NVIDIA 310 .*NVIDIA .*310[^0M]*.* 3 1 1 3.3 +NVIDIA 315 .*NVIDIA .*315[^0M]*.* 3 1 1 3.3 +NVIDIA 320 .*NVIDIA .*320[^0M]*.* 3 1 1 3.3 +NVIDIA 405 .*NVIDIA .*405[^0]*.* 3 1 0 3.3 +NVIDIA 410 .*NVIDIA .*410[^0]*.* 3 1 0 3.3 +NVIDIA GT 415 .*NVIDIA .*GT *415.* 3 1 1 4.3 +NVIDIA GT 420 .*NVIDIA .*GT *42.* 3 1 1 4.3 +NVIDIA GT 430 .*NVIDIA .*GT *43.* 3 1 1 4.3 +NVIDIA GT 440 .*NVIDIA .*GT *44.* 4 1 1 4.3 +NVIDIA GT 450 .*NVIDIA .*GT *45.* 4 1 1 4.3 +NVIDIA GTS 450 .*NVIDIA .*GTS *45.* 4 1 1 4.3 +NVIDIA GTX 460 .*NVIDIA .*GTX *46.* 5 1 1 4.3 +NVIDIA GTX 470 .*NVIDIA .*GTX *47.* 5 1 1 4.3 +NVIDIA GTX 480 .*NVIDIA .*GTX *48.* 5 1 1 4.3 +NVIDIA 505 .*NVIDIA .*505[^0]*.* 3 1 0 0 +NVIDIA 510 .*NVIDIA .*510[^0]*.* 3 1 0 0 +NVIDIA GT 520 .*NVIDIA .*GT *52.* 3 1 1 4.3 +NVIDIA GT 530 .*NVIDIA .*GT *53.* 3 1 1 4.3 +NVIDIA GT 540 .*NVIDIA .*GT *54.* 3 1 1 4.3 +NVIDIA GT 550 .*NVIDIA .*GT *55.* 3 1 1 4.3 +NVIDIA GTX 550 .*NVIDIA .*GTX *55.* 5 1 1 4.3 +NVIDIA GTX 560 .*NVIDIA .*GTX *56.* 5 1 1 4.3 +NVIDIA GTX 570 .*NVIDIA .*GTX *57.* 5 1 1 4.3 +NVIDIA GTX 580 .*NVIDIA .*GTX *58.* 5 1 1 4.3 +NVIDIA GTX 590 .*NVIDIA .*GTX *59.* 5 1 1 4.3 +NVIDIA 605 .*NVIDIA .*605[^0]*.* 3 1 1 4.3 +NVIDIA GT 61x .*NVIDIA .*GT 61.* 3 1 1 4.3 +NVIDIA GT 62x .*NVIDIA .*GT 62.* 3 1 0 4.3 +NVIDIA GT 63x .*NVIDIA .*GT 63.* 3 1 0 4.3 +NVIDIA GT 64x .*NVIDIA .*GT 64.* 3 1 0 4.3 +NVIDIA GT 65x .*NVIDIA .*GT 65.* 3 1 1 4.3 +NVIDIA GTX 64x .*NVIDIA .*GTX 64.* 3 1 1 4.3 +NVIDIA GTX 65x .*NVIDIA .*GTX 65.* 3 1 1 4.3 +NVIDIA GTX 66x .*NVIDIA .*GTX 66.* 5 1 0 4.3 +NVIDIA GTX 67x .*NVIDIA .*GTX 67.* 5 1 1 4.3 +NVIDIA GTX 68x .*NVIDIA .*GTX 68.* 5 1 1 4.3 +NVIDIA GTX 69x .*NVIDIA .*GTX 69.* 5 1 1 4.3 +NVIDIA GT 71x .*NVIDIA .*GT *71.* 3 1 0 4.3 +NVIDIA GT 72x .*NVIDIA .*GT *72.* 3 1 0 4.3 +NVIDIA GT 73x .*NVIDIA .*GT *73.* 3 1 0 4.3 +NVIDIA GT 74x .*NVIDIA .*GT *74.* 3 1 0 4.3 +NVIDIA GTX 75x .*NVIDIA .*GTX *75.* 3 1 0 4.3 +NVIDIA GTX 76x .*NVIDIA .*GTX *76.* 5 1 0 4.3 +NVIDIA GTX 77x .*NVIDIA .*GTX *77.* 5 1 0 4.3 +NVIDIA GTX 78x .*NVIDIA .*GTX *78.* 5 1 0 4.3 +NVIDIA GTX TITAN .*NVIDIA .*GTX *TITAN.* 5 1 0 4.3 NVIDIA C51 .*NVIDIA .*C51.* 0 1 1 2 NVIDIA G72 .*NVIDIA .*G72.* 1 1 0 0 NVIDIA G73 .*NVIDIA .*G73.* 1 1 0 0 NVIDIA G84 .*NVIDIA .*G84.* 2 1 0 0 NVIDIA G86 .*NVIDIA .*G86.* 3 1 0 0 NVIDIA G92 .*NVIDIA .*G92.* 3 1 0 0 +NVIDIA GK106 .*NVIDIA .*GK106.* 5 1 0 4.3 NVIDIA GeForce .*GeForce 256.* 0 0 0 0 NVIDIA GeForce 2 .*GeForce ?2 ?.* 0 1 1 1.5 +NVIDIA GeForce 3 .*GeForce ?3 ?.* 2 1 1 2.1 +NVIDIA GeForce 3 Ti .*GeForce ?3 Ti.* 0 1 0 0 NVIDIA GeForce 4 .*NVIDIA .*GeForce ?4.* 0 1 1 1.5 +NVIDIA GeForce 4 Go .*NVIDIA .*GeForce ?4.*Go.* 0 1 0 0 +NVIDIA GeForce 4 MX .*NVIDIA .*GeForce ?4 MX.* 0 1 0 0 +NVIDIA GeForce 4 PCX .*NVIDIA .*GeForce ?4 PCX.* 0 1 0 0 +NVIDIA GeForce 4 Ti .*NVIDIA .*GeForce ?4 Ti.* 0 1 0 0 NVIDIA GeForce 6100 .*NVIDIA .*GeForce 61.* 3 1 1 4.2 NVIDIA GeForce 6200 .*NVIDIA .*GeForce 62.* 0 1 1 2.1 NVIDIA GeForce 6500 .*NVIDIA .*GeForce 65.* 1 1 1 2.1 @@ -486,8 +612,6 @@ NVIDIA GeForce Go 7900 .*NVIDIA .*GeForce Go 79.* 1 1 1 2.1 NVIDIA D9M .*NVIDIA .*D9M.* 1 1 0 0 NVIDIA G94 .*NVIDIA .*G94.* 3 1 0 0 NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1 0 0 -NVIDIA ION 2 .*NVIDIA .*ION 2.* 2 1 0 0 -NVIDIA ION .*NVIDIA Corporation.*ION.* 2 1 1 3.3 NVIDIA NB8M .*NVIDIA .*NB8M.* 1 1 0 0 NVIDIA NB8P .*NVIDIA .*NB8P.* 2 1 0 0 NVIDIA NB9E .*NVIDIA .*NB9E.* 3 1 0 0 @@ -495,7 +619,9 @@ NVIDIA NB9M .*NVIDIA .*NB9M.* 1 1 0 0 NVIDIA NB9P .*NVIDIA .*NB9P.* 2 1 0 0 NVIDIA N10 .*NVIDIA .*N10.* 1 1 0 2.1 NVIDIA GeForce PCX .*GeForce PCX.* 0 1 0 1.5 -NVIDIA Generic .*NVIDIA .*Unknown.* 0 0 0 2.1 +NVIDIA PCI .*NVIDIA PCI[ ]* 0 0 0 2.1 +NVIDIA Generic .*NVIDIA Generic.* 0 0 0 2.1 +NVIDIA Generic Unknown .*NVIDIA .*Unknown.* 0 0 0 2.1 NVIDIA NV17 .*NVIDIA .*NV17.* 0 1 0 0 NVIDIA NV34 .*NVIDIA .*NV34.* 0 1 0 0 NVIDIA NV35 .*NVIDIA .*NV35.* 0 1 0 0 @@ -513,45 +639,14 @@ NVIDIA MCP77 .*NVIDIA .*MCP77.* 1 1 0 0 NVIDIA MCP78 .*NVIDIA .*MCP78.* 1 1 0 0 NVIDIA MCP79 .*NVIDIA .*MCP79.* 1 1 0 0 NVIDIA MCP7A .*NVIDIA .*MCP7A.* 1 1 0 0 -NVIDIA Quadro2 .*Quadro2.* 0 1 0 1.5 -NVIDIA Quadro 1000M .*Quadro.* (K1|1)00[0-9]M.* 2 1 0 4.2 -NVIDIA Quadro 2000 M/D .*Quadro.* (K2|2)000.* 3 1 0 4.2 -NVIDIA Quadro 3000M .*Quadro.* (K3|3)00[0-9]M.* 3 1 0 4.2 -NVIDIA Quadro 4000M .*Quadro.* (K4|4)00[0-9]M.* 3 1 0 4.2 -NVIDIA Quadro 4000 .*Quadro 4000.* 3 1 0 4.2 -NVIDIA Quadro 50x0 M .*Quadro.* 50.0.* 3 1 0 4.2 -NVIDIA Quadro 6000 .*Quadro.* 6000.* 3 1 0 0 -NVIDIA Quadro 400 .*Quadro.* 400.* 2 1 0 3.3 -NVIDIA Quadro 600 .*Quadro.* 600.* 2 1 0 4.2 -NVIDIA Quadro4 .*Quadro4.* 0 1 0 1.5 -NVIDIA Quadro DCC .*Quadro DCC.* 0 1 0 0 -NVIDIA Quadro CX .*Quadro.*CX.* 3 1 0 0 -NVIDIA Quadro FX 770M .*Quadro.*FX 77[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro FX 1500M .*Quadro.*FX 150[0-9]M.* 1 1 0 2.1 -NVIDIA Quadro FX 1600M .*Quadro.*FX 160[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro FX 2500M .*Quadro.*FX 250[0-9]M.* 2 1 0 2.1 -NVIDIA Quadro FX 2700M .*Quadro.*FX 270[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 2800M .*Quadro.*FX 280[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 3500 .*Quadro.*FX 3500.* 2 1 0 2.1 -NVIDIA Quadro FX 3600 .*Quadro.*FX 3600.* 3 1 0 3.3 -NVIDIA Quadro FX 3700 .*Quadro.*FX 3700.* 3 1 0 3.3 -NVIDIA Quadro FX 3800 .*Quadro.*FX 3800.* 3 1 0 3.3 -NVIDIA Quadro FX 4500 .*Quadro.*FX 45.* 3 1 0 2.1 -NVIDIA Quadro FX 880M .*Quadro.*FX 88[0-9]M.* 3 1 0 3.3 -NVIDIA Quadro FX 4800 .*NVIDIA .*Quadro FX 4800.* 3 1 0 3.1 -NVIDIA Quadro FX .*Quadro FX.* 1 1 0 3.3 -NVIDIA Quadro NVS 1xxM .*Quadro NVS 1.[05]M.* 0 1 1 3.3 -NVIDIA Quadro NVS 300M .*NVIDIA .*NVS 30[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 320M .*NVIDIA .*NVS 32[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS 2100M .*NVIDIA .*NVS 210[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 3100M .*NVIDIA .*NVS 310[0-9]M.* 2 1 0 3.3 -NVIDIA Quadro NVS 4200M .*NVIDIA .*NVS 420[0-9]M.* 2 1 0 4.2 -NVIDIA Quadro NVS 5100M .*NVIDIA .*NVS 510[0-9]M.* 2 1 0 0 -NVIDIA Quadro NVS .*NVIDIA .*NVS 0 1 0 4.2 NVIDIA Corporation N12P .*NVIDIA .*N12P.* 1 1 1 4.1 NVIDIA Corporation N11M .*NVIDIA .*N11M.* 2 1 0 3.1 NVIDIA RIVA TNT .*RIVA TNT.* 0 0 0 1.5 -S3 .*S3 Graphics.* 0 0 1 1.4 +NVIDIA GRID .*NVIDIA .*GRID.* 0 0 0 1.5 +NVIDIA ION 2 .*NVIDIA .* *[I][O][N] 2.* 2 1 0 0 +NVIDIA ION a .*NVIDIA .*[I][O][N]$ 2 1 1 3.3 +NVIDIA ION b .*NVIDIA .*(Corporation) [I][O][N].* 2 1 1 3.3 +S3 .*S3 *(Graphics)*.* 0 0 1 1.4 SiS SiS.* 0 0 1 1.5 Trident Trident.* 0 0 0 0 Tungsten Graphics Tungsten.* 0 0 0 0 @@ -559,5 +654,9 @@ XGI XGI.* 0 0 0 0 VIA VIA.* 0 0 0 0 Apple Generic Apple.*Generic.* 0 0 0 0 Apple Software Renderer Apple.*Software Renderer.* 0 0 0 0 +Oracle VirtualBox.* 0 1 1 2.1 Humper Humper.* 0 1 1 2.1 PowerVR SGX545 .*PowerVR SGX.* 1 1 1 3 +ATI GeForce Lulz .*ATI.*GeForce.* 0 0 0 0 + + diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 8a6114f0d5..c4f503ef4e 100755 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -72,16 +72,8 @@ LangString LanguageCode ${LANG_RUSSIAN} "ru" LangString LanguageCode ${LANG_TURKISH} "tr"
LangString LanguageCode ${LANG_TRADCHINESE} "zh"
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py)
-;; For example:
-;; !define INSTFLAGS "%(flags)s"
-;; !define INSTNAME "SecondLife%(grid_caps)s"
-;; !define SHORTCUT "Second Life (%(grid_caps)s)"
-;; !define URLNAME "secondlife%(grid)s"
-;; !define UNINSTALL_SETTINGS 1
-
-%%GRID_VARS%%
+;; this placeholder is replaced by viewer_manifest.py
+%%INST_VARS%%
Name ${INSTNAME}
@@ -109,7 +101,6 @@ Page instfiles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Var INSTPROG
Var INSTEXE
-Var INSTFLAGS
Var INSTSHORTCUT
Var COMMANDLINE ; command line passed to this installer, set in .onInit
Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer
@@ -147,7 +138,7 @@ label_ask_launch: label_launch:
# Assumes SetOutPath $INSTDIR
- Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS $SHORTCUT_LANG_PARAM'
+ Exec '"$INSTDIR\$INSTEXE" $SHORTCUT_LANG_PARAM'
label_no_launch:
Pop $R0
FunctionEnd
@@ -310,6 +301,23 @@ Function CheckNetworkConnection Return
FunctionEnd
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; Function CheckOldExeName
+; Viewer versions < 3.6.12 used the name 'SecondLife.exe'
+; If that name is found in the install folder, delete it to invalidate any
+; old shortcuts to it that may be in non-standard locations, so that the user
+; does not end up running the old version (potentially getting caught in an
+; infinite update loop). See MAINT-3575
+; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+Function CheckOldExeName
+ IfFileExists "$INSTDIR\SecondLife.exe" CHECKOLDEXE_FOUND CHECKOLDEXE_DONE
+
+CHECKOLDEXE_FOUND:
+ Delete "$INSTDIR\SecondLife.exe"
+CHECKOLDEXE_DONE:
+FunctionEnd
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Function CheckWillUninstallV2
@@ -682,6 +690,9 @@ Delete "$INSTDIR\*.glsl" Delete "$INSTDIR\motions\*.lla"
Delete "$INSTDIR\trial\*.html"
Delete "$INSTDIR\newview.exe"
+Delete "$INSTDIR\SecondLife.exe"
+;; MAINT-3099 workaround - prevent these log files, if present, from causing a user alert
+Delete "$INSTDIR\VivoxVoiceService-*.log"
;; Remove entire help directory
Delete "$INSTDIR\help\Advanced\*"
RMDir "$INSTDIR\help\Advanced"
@@ -720,7 +731,6 @@ ShowUninstDetails show Section Uninstall
; Start with some default values.
-StrCpy $INSTFLAGS ""
StrCpy $INSTPROG "${INSTNAME}"
StrCpy $INSTEXE "${INSTEXE}"
StrCpy $INSTSHORTCUT "${SHORTCUT}"
@@ -919,7 +929,6 @@ Section "" ; (default section) SetShellVarContext all ; install for all users (if you change this, change it in the uninstall as well)
; Start with some default values.
-StrCpy $INSTFLAGS "${INSTFLAGS}"
StrCpy $INSTPROG "${INSTNAME}"
StrCpy $INSTEXE "${INSTEXE}"
StrCpy $INSTSHORTCUT "${SHORTCUT}"
@@ -931,6 +940,7 @@ Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this v Call CloseSecondLife ; Make sure we're not running
Call CheckNetworkConnection ; ping secondlife.com
Call CheckWillUninstallV2 ; See if a V2 install exists and will be removed.
+Call CheckOldExeName ; Clean up a previous version of the exe
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
StrCmp $DO_UNINSTALL_V2 "" PRESERVE_DONE
@@ -966,7 +976,7 @@ StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)" CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT"
SetOutPath "$INSTDIR"
CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+ "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \
@@ -985,9 +995,9 @@ CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \ ; Other shortcuts
SetOutPath "$INSTDIR"
CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+ "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \
- "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM"
+ "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM"
CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \
'"$INSTDIR\uninst.exe"' ''
@@ -996,7 +1006,6 @@ CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ ; Write registry
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "" "$INSTDIR"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" "${VERSION_LONG}"
-WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Flags" "$INSTFLAGS"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Shortcut" "$INSTSHORTCUT"
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Exe" "$INSTEXE"
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)"
@@ -1009,13 +1018,13 @@ WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
;; URL param must be last item passed to viewer, it ignores subsequent params
;; to avoid parameter injection attacks.
-WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
+WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
;; URL param must be last item passed to viewer, it ignores subsequent params
;; to avoid parameter injection attacks.
-WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
+WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" -url "%1"'
; write out uninstaller
WriteUninstaller "$INSTDIR\uninst.exe"
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 49f77e6c34..f150ceda67 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -259,11 +259,9 @@ bool handleSlowMotionAnimation(const LLSD& newvalue) return true; } -// static -void LLAgent::parcelChangedCallback() +void LLAgent::setCanEditParcel() // called via mParcelChangedSignal { bool can_edit = LLToolMgr::getInstance()->canEdit(); - gAgent.mCanEditParcel = can_edit; } @@ -425,6 +423,8 @@ LLAgent::LLAgent() : mListener.reset(new LLAgentListener(*this)); + addParcelChangedCallback(&setCanEditParcel); + mMoveTimer.stop(); } @@ -451,8 +451,6 @@ void LLAgent::init() mLastKnownRequestMaturity = mLastKnownResponseMaturity; mIsDoSendMaturityPreferenceToServer = true; - LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&LLAgent::parcelChangedCallback)); - if (!mTeleportFinishedSlot.connected()) { mTeleportFinishedSlot = LLViewerParcelMgr::getInstance()->setTeleportFinishedCallback(boost::bind(&LLAgent::handleTeleportFinished, this)); @@ -835,22 +833,33 @@ void LLAgent::handleServerBakeRegionTransition(const LLUUID& region_id) } } +void LLAgent::changeParcels() +{ + LL_DEBUGS("AgentLocation") << "Calling ParcelChanged callbacks" << LL_ENDL; + // Notify anything that wants to know about parcel changes + mParcelChangedSignal(); +} + +boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_callback_t cb) +{ + return mParcelChangedSignal.connect(cb); +} + //----------------------------------------------------------------------------- // setRegion() //----------------------------------------------------------------------------- void LLAgent::setRegion(LLViewerRegion *regionp) { - bool teleport = true; - + bool notifyRegionChange; + llassert(regionp); if (mRegionp != regionp) { - // std::string host_name; - // host_name = regionp->getHost().getHostName(); - + notifyRegionChange = true; + std::string ip = regionp->getHost().getString(); - llinfos << "Moving agent into region: " << regionp->getName() - << " located at " << ip << llendl; + LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() + << " located at " << ip << LL_ENDL; if (mRegionp) { // We've changed regions, we're now going to change our agent coordinate frame. @@ -878,9 +887,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp) { gSky.mVOGroundp->setRegion(regionp); } - - // Notify windlight managers - teleport = (gAgent.getTeleportState() != LLAgent::TELEPORT_NONE); } else { @@ -902,8 +908,14 @@ void LLAgent::setRegion(LLViewerRegion *regionp) // Pass new region along to metrics components that care about this level of detail. LLAppViewer::metricsUpdateRegion(regionp->getHandle()); } + else + { + notifyRegionChange = false; + } mRegionp = regionp; + // TODO - most of what follows probably should be moved into callbacks + // Pass the region host to LLUrlEntryParcel to resolve parcel name // with a server request. LLUrlEntryParcel::setRegionHost(getRegionHost()); @@ -922,15 +934,6 @@ void LLAgent::setRegion(LLViewerRegion *regionp) LLFloaterMove::sUpdateFlyingStatus(); - if (teleport) - { - LLEnvManagerNew::instance().onTeleport(); - } - else - { - LLEnvManagerNew::instance().onRegionCrossing(); - } - // If the newly entered region is using server bakes, and our // current appearance is non-baked, request appearance update from // server. @@ -943,6 +946,12 @@ void LLAgent::setRegion(LLViewerRegion *regionp) // Need to handle via callback after caps arrive. mRegionp->setCapabilitiesReceivedCallback(boost::bind(&LLAgent::handleServerBakeRegionTransition,this,_1)); } + + if (notifyRegionChange) + { + LL_DEBUGS("AgentLocation") << "Calling RegionChanged callbacks" << LL_ENDL; + mRegionChangedSignal(); + } } @@ -967,6 +976,16 @@ LLHost LLAgent::getRegionHost() const } } +boost::signals2::connection LLAgent::addRegionChangedCallback(const region_changed_signal_t::slot_type& cb) +{ + return mRegionChangedSignal.connect(cb); +} + +void LLAgent::removeRegionChangedCallback(boost::signals2::connection callback) +{ + mRegionChangedSignal.disconnect(callback); +} + //----------------------------------------------------------------------------- // inPrelude() //----------------------------------------------------------------------------- @@ -1092,10 +1111,18 @@ const LLVector3d &LLAgent::getPositionGlobal() const //----------------------------------------------------------------------------- const LLVector3 &LLAgent::getPositionAgent() { - if (isAgentAvatarValid() && !gAgentAvatarp->mDrawable.isNull()) + if (isAgentAvatarValid()) + { + if(gAgentAvatarp->mDrawable.isNull()) + { + mFrameAgent.setOrigin(gAgentAvatarp->getPositionAgent()); + } + else { mFrameAgent.setOrigin(gAgentAvatarp->getRenderPosition()); } + } + return mFrameAgent.getOrigin(); } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 7fac17d098..0766407494 100755 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -231,15 +231,54 @@ private: LLVector3 mHomePosRegion; //-------------------------------------------------------------------- - // Region + // Parcel //-------------------------------------------------------------------- public: + void changeParcels(); // called by LLViewerParcelMgr when we cross a parcel boundary + + // Register a boost callback to be called when the agent changes parcels + typedef boost::function<void()> parcel_changed_callback_t; + boost::signals2::connection addParcelChangedCallback(parcel_changed_callback_t); + +private: + typedef boost::signals2::signal<void()> parcel_changed_signal_t; + parcel_changed_signal_t mParcelChangedSignal; + + //-------------------------------------------------------------------- + // Region + //-------------------------------------------------------------------- + public: void setRegion(LLViewerRegion *regionp); LLViewerRegion *getRegion() const; LLHost getRegionHost() const; BOOL inPrelude(); -private: + + /** + * Register a boost callback to be called when the agent changes regions + * Note that if you need to access a capability for the region, you may need to wait + * for the capabilities to be received, since in some cases your region changed + * callback will be called before the capabilities have been received. Your callback + * may need to look something like: + * + * LLViewerRegion* region = gAgent.getRegion(); + * if (region->capabilitiesReceived()) + * { + * useCapability(region); + * } + * else // Need to handle via callback after caps arrive. + * { + * region->setCapabilitiesReceivedCallback(boost::bind(&useCapability,region,_1)); + * // you may or may not want to remove that callback + * } + */ + typedef boost::signals2::signal<void()> region_changed_signal_t; + + boost::signals2::connection addRegionChangedCallback(const region_changed_signal_t::slot_type& cb); + void removeRegionChangedCallback(boost::signals2::connection callback); + + private: LLViewerRegion *mRegionp; + region_changed_signal_t mRegionChangedSignal; //-------------------------------------------------------------------- // History @@ -640,9 +679,10 @@ private: public: bool canEditParcel() const { return mCanEditParcel; } private: + static void setCanEditParcel(); bool mCanEditParcel; - static void parcelChangedCallback(); + /******************************************************************************** ** ** diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index b9ec304b7e..3410a37890 100755 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -112,6 +112,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const case LOCATION_FORMAT_NORMAL: buffer = llformat("%s", region_name.c_str()); break; + case LOCATION_FORMAT_NORMAL_COORDS: + buffer = llformat("%s (%d, %d, %d)", + region_name.c_str(), + pos_x, pos_y, pos_z); + break; case LOCATION_FORMAT_NO_COORDS: buffer = llformat("%s%s%s", region_name.c_str(), @@ -143,6 +148,11 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const case LOCATION_FORMAT_NORMAL: buffer = llformat("%s, %s", parcel_name.c_str(), region_name.c_str()); break; + case LOCATION_FORMAT_NORMAL_COORDS: + buffer = llformat("%s (%d, %d, %d)", + parcel_name.c_str(), + pos_x, pos_y, pos_z); + break; case LOCATION_FORMAT_NO_MATURITY: buffer = llformat("%s, %s (%d, %d, %d)", parcel_name.c_str(), diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h index dda5dc1fd1..bb48dad14c 100755 --- a/indra/newview/llagentui.h +++ b/indra/newview/llagentui.h @@ -35,6 +35,7 @@ public: enum ELocationFormat { LOCATION_FORMAT_NORMAL, // Parcel + LOCATION_FORMAT_NORMAL_COORDS, // Parcel (x, y, z) LOCATION_FORMAT_LANDMARK, // Parcel, Region LOCATION_FORMAT_NO_MATURITY, // Parcel, Region (x, y, z) LOCATION_FORMAT_NO_COORDS, // Parcel, Region - Maturity diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 1edbbe2a2e..fa810aac76 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1538,7 +1538,11 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj std::set<LLUUID> requested_item_ids; std::set<LLUUID> current_item_ids; for (S32 i=0; i<obj_item_array.count(); i++) - requested_item_ids.insert(obj_item_array[i].get()->getLinkedUUID()); + { + const LLUUID & requested_id = obj_item_array[i].get()->getLinkedUUID(); + //llinfos << "Requested attachment id " << requested_id << llendl; + requested_item_ids.insert(requested_id); + } // Build up list of objects to be removed and items currently attached. llvo_vec_t objects_to_remove; @@ -1555,17 +1559,28 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj if (objectp) { LLUUID object_item_id = objectp->getAttachmentItemID(); + + bool remove_attachment = true; if (requested_item_ids.find(object_item_id) != requested_item_ids.end()) - { - // Object currently worn, was requested. + { // Object currently worn, was requested to keep it // Flag as currently worn so we won't have to add it again. - current_item_ids.insert(object_item_id); + remove_attachment = false; } - else + else if (objectp->isTempAttachment()) + { // Check if we should keep this temp attachment + remove_attachment = LLAppearanceMgr::instance().shouldRemoveTempAttachment(objectp->getID()); + } + + if (remove_attachment) { - // object currently worn, not requested. + // llinfos << "found object to remove, id " << objectp->getID() << ", item " << objectp->getAttachmentItemID() << llendl; objects_to_remove.push_back(objectp); } + else + { + // llinfos << "found object to keep, id " << objectp->getID() << ", item " << objectp->getAttachmentItemID() << llendl; + current_item_ids.insert(object_item_id); + } } } } diff --git a/indra/newview/llappdelegate-objc.mm b/indra/newview/llappdelegate-objc.mm index 91251ed7c0..988058aad3 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -40,6 +40,11 @@ [super dealloc]; } +- (void) applicationWillFinishLaunching:(NSNotification *)notification +{ + [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; +} + - (void) applicationDidFinishLaunching:(NSNotification *)notification { frameTimer = nil; @@ -55,7 +60,7 @@ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; - [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; + // [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; } - (void) handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index fd9236c8b3..da1609297e 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3415,21 +3415,50 @@ void LLAppearanceMgr::removeItemsFromAvatar(const uuid_vec_t& ids_to_remove) llwarns << "called with empty list, nothing to do" << llendl; } for (uuid_vec_t::const_iterator it = ids_to_remove.begin(); it != ids_to_remove.end(); ++it) - { + { const LLUUID& id_to_remove = *it; const LLUUID& linked_item_id = gInventory.getLinkedItemID(id_to_remove); removeCOFItemLinks(linked_item_id); - } - updateAppearanceFromCOF(); + addDoomedTempAttachment(linked_item_id); } + updateAppearanceFromCOF(); +} void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove) { LLUUID linked_item_id = gInventory.getLinkedItemID(id_to_remove); removeCOFItemLinks(linked_item_id); + addDoomedTempAttachment(linked_item_id); updateAppearanceFromCOF(); } + +// Adds the given item ID to mDoomedTempAttachmentIDs iff it's a temp attachment +void LLAppearanceMgr::addDoomedTempAttachment(const LLUUID& id_to_remove) +{ + LLViewerObject * attachmentp = gAgentAvatarp->findAttachmentByID(id_to_remove); + if (attachmentp && + attachmentp->isTempAttachment()) + { // If this is a temp attachment and we want to remove it, record the ID + // so it will be deleted when attachments are synced up with COF + mDoomedTempAttachmentIDs.insert(id_to_remove); + //llinfos << "Will remove temp attachment id " << id_to_remove << llendl; + } +} + +// Find AND REMOVES the given UUID from mDoomedTempAttachmentIDs +bool LLAppearanceMgr::shouldRemoveTempAttachment(const LLUUID& item_id) +{ + doomed_temp_attachments_t::iterator iter = mDoomedTempAttachmentIDs.find(item_id); + if (iter != mDoomedTempAttachmentIDs.end()) + { + mDoomedTempAttachmentIDs.erase(iter); + return true; + } + return false; +} + + bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body) { if (!item || !item->isWearableType()) return false; diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index 46252afbde..5ec80f1cf0 100755 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -142,6 +142,9 @@ public: void removeAllClothesFromAvatar(); void removeAllAttachmentsFromAvatar(); + // Special handling of temp attachments, which are not in the COF + bool shouldRemoveTempAttachment(const LLUUID& item_id); + //has the current outfit changed since it was loaded? bool isOutfitDirty() { return mOutfitIsDirty; } @@ -239,6 +242,12 @@ private: std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer; + // Set of temp attachment UUIDs that should be removed + typedef std::set<LLUUID> doomed_temp_attachments_t; + doomed_temp_attachments_t mDoomedTempAttachmentIDs; + + void addDoomedTempAttachment(const LLUUID& id_to_remove); + ////////////////////////////////////////////////////////////////////////////////// // Item-specific convenience functions public: diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f67142d1ed..e3c89f1a5f 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -40,6 +40,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llagentlanguage.h" +#include "llagentui.h" #include "llagentwearables.h" #include "llfloaterimcontainer.h" #include "llwindow.h" @@ -60,6 +61,7 @@ #include "llcurl.h" #include "llcalc.h" #include "llconversationlog.h" +#include "lldxhardware.h" #include "lltexturestats.h" #include "lltexturestats.h" #include "llviewerwindow.h" @@ -75,10 +77,10 @@ #include "lluicolortable.h" #include "llurldispatcher.h" #include "llurlhistory.h" -//#include "llfirstuse.h" #include "llrender.h" #include "llteleporthistory.h" #include "lltoast.h" +#include "llsdutil_math.h" #include "lllocationhistory.h" #include "llfasttimerview.h" #include "llvector4a.h" @@ -223,6 +225,10 @@ #include "llmachineid.h" #include "llmainlooprepeater.h" + +#include "llviewereventrecorder.h" + + // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either // this app, or another 'component' of the viewer. App globals should be @@ -696,6 +702,7 @@ LLAppViewer::LLAppViewer() : LLAppViewer::~LLAppViewer() { delete mSettingsLocationList; + LLViewerEventRecorder::instance().~LLViewerEventRecorder(); LLLoginInstance::instance().setUpdaterService(0); @@ -750,7 +757,7 @@ bool LLAppViewer::init() initLoggingAndGetLastDuration(); processMarkerFiles(); - + // // OK to write stuff to logs now, we've now crash reported if necessary // @@ -1225,8 +1232,8 @@ void LLAppViewer::checkMemory() } mMemCheckTimer.reset() ; - //update the availability of memory - LLMemory::updateMemoryInfo() ; + //update the availability of memory + LLMemory::updateMemoryInfo() ; bool is_low = LLMemory::isMemoryPoolLow() ; @@ -1756,7 +1763,7 @@ bool LLAppViewer::cleanup() gAudiop->setStreamingAudioImpl(NULL); // shut down the audio subsystem - gAudiop->shutdown(); + gAudiop->shutdown(); delete gAudiop; gAudiop = NULL; @@ -2250,13 +2257,13 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, BOOST_FOREACH(const SettingsFile& file, group.files) { - llinfos << "Attempting to load settings for the group " << file.name() - << " - from location " << location_key << llendl; + LL_INFOS("Settings") << "Attempting to load settings for the group " << file.name() + << " - from location " << location_key << LL_ENDL; LLControlGroup* settings_group = LLControlGroup::getInstance(file.name); if(!settings_group) { - llwarns << "No matching settings group for name " << file.name() << llendl; + LL_WARNS("Settings") << "No matching settings group for name " << file.name() << LL_ENDL; continue; } @@ -2285,7 +2292,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, if(settings_group->loadFromFile(full_settings_path, set_defaults, file.persistent)) { // success! - llinfos << "Loaded settings file " << full_settings_path << llendl; + LL_INFOS("Settings") << "Loaded settings file " << full_settings_path << LL_ENDL; } else { // failed to load @@ -2299,7 +2306,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key, // only complain if we actually have a filename at this point if (!full_settings_path.empty()) { - llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl; + LL_INFOS("Settings") << "Cannot load " << full_settings_path << " - No settings found." << LL_ENDL; } } } @@ -2395,8 +2402,6 @@ bool LLAppViewer::initConfiguration() gSavedSettings.setString("ClientSettingsFile", gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global"))); - gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel()); - #ifndef LL_RELEASE_FOR_DOWNLOAD // provide developer build only overrides for these control variables that are not // persisted to settings.xml @@ -2460,8 +2465,8 @@ bool LLAppViewer::initConfiguration() gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, clp.getOption("settings")[0]); gSavedSettings.setString("ClientSettingsFile", user_settings_filename); - llinfos << "Using command line specified settings filename: " - << user_settings_filename << llendl; + LL_INFOS("Settings") << "Using command line specified settings filename: " + << user_settings_filename << LL_ENDL; } // - load overrides from user_settings @@ -2477,8 +2482,8 @@ bool LLAppViewer::initConfiguration() { std::string session_settings_filename = clp.getOption("sessionsettings")[0]; gSavedSettings.setString("SessionSettingsFile", session_settings_filename); - llinfos << "Using session settings filename: " - << session_settings_filename << llendl; + LL_INFOS("Settings") << "Using session settings filename: " + << session_settings_filename << LL_ENDL; } loadSettingsFromDirectory("Session"); @@ -2486,8 +2491,8 @@ bool LLAppViewer::initConfiguration() { std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0]; gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename); - llinfos << "Using user session settings filename: " - << user_session_settings_filename << llendl; + LL_INFOS("Settings") << "Using user session settings filename: " + << user_session_settings_filename << LL_ENDL; } loadSettingsFromDirectory("UserSession"); @@ -2571,8 +2576,12 @@ bool LLAppViewer::initConfiguration() { llwarns << "Failed --set " << name << ": setting name unknown." << llendl; } + } } } + + if (clp.hasOption("logevents")) { + LLViewerEventRecorder::instance().setEventLoggingOn(); } std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel")); @@ -2593,11 +2602,11 @@ bool LLAppViewer::initConfiguration() std::string test_name(gSavedSettings.getString("LogMetrics")); if (! test_name.empty()) { - LLFastTimer::sMetricLog = TRUE ; + LLFastTimer::sMetricLog = TRUE ; // '--logmetrics' is specified with a named test metric argument so the data gathering is done only on that test // In the absence of argument, every metric would be gathered (makes for a rather slow run and hard to decipher report...) llinfos << "'--logmetrics' argument : " << test_name << llendl; - LLFastTimer::sLogName = test_name; + LLFastTimer::sLogName = test_name; } if (clp.hasOption("graphicslevel")) @@ -2645,17 +2654,33 @@ bool LLAppViewer::initConfiguration() // What can happen is that someone can use IE (or potentially // other browsers) and do the rough equivalent of command // injection and steal passwords. Phoenix. SL-55321 + LLSLURL start_slurl; std::string CmdLineLoginLocation(gSavedSettings.getString("CmdLineLoginLocation")); if(! CmdLineLoginLocation.empty()) { - LLSLURL start_slurl(CmdLineLoginLocation); + start_slurl = CmdLineLoginLocation; LLStartUp::setStartSLURL(start_slurl); if(start_slurl.getType() == LLSLURL::LOCATION) - { + { LLGridManager::getInstance()->setGridChoice(start_slurl.getGrid()); } } + //RN: if we received a URL, hand it off to the existing instance. + // don't call anotherInstanceRunning() when doing URL handoff, as + // it relies on checking a marker file which will not work when running + // out of different directories + + if (start_slurl.isValid() && + (gSavedSettings.getBOOL("SLURLPassToOtherInstance"))) + { + if (sendURLToOtherInstance(start_slurl.getSLURLString())) + { + // successfully handed off URL to existing instance, exit + return false; + } + } + const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent"); if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) { @@ -2795,7 +2820,7 @@ bool LLAppViewer::initConfiguration() LL_DEBUGS("AppInit")<<"set start from NextLoginLocation: "<<nextLoginLocation<<LL_ENDL; LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation)); } - else if ((clp.hasOption("login") || clp.hasOption("autologin")) + else if ( ( clp.hasOption("login") || clp.hasOption("autologin")) && gSavedSettings.getString("CmdLineLoginLocation").empty()) { // If automatic login from command line with --login switch @@ -2971,26 +2996,26 @@ namespace { { LL_WARNS("UpdaterService") << "no info url supplied - defaulting to hard coded release notes pattern" << LL_ENDL; - // truncate version at the rightmost '.' - std::string version_short(data["version"]); - size_t short_length = version_short.rfind('.'); - if (short_length != std::string::npos) - { - version_short.resize(short_length); - } + // truncate version at the rightmost '.' + std::string version_short(data["version"]); + size_t short_length = version_short.rfind('.'); + if (short_length != std::string::npos) + { + version_short.resize(short_length); + } - LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); - relnotes_url.setArg("[VERSION_SHORT]", version_short); + LLUIString relnotes_url("[RELEASE_NOTES_BASE_URL][CHANNEL_URL]/[VERSION_SHORT]"); + relnotes_url.setArg("[VERSION_SHORT]", version_short); - // *TODO thread the update service's response through to this point - std::string const & channel = LLVersionInfo::getChannel(); - boost::shared_ptr<char> channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); + // *TODO thread the update service's response through to this point + std::string const & channel = LLVersionInfo::getChannel(); + boost::shared_ptr<char> channel_escaped(curl_escape(channel.c_str(), channel.size()), &curl_free); - relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); - relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL")); + relnotes_url.setArg("[CHANNEL_URL]", channel_escaped.get()); + relnotes_url.setArg("[RELEASE_NOTES_BASE_URL]", LLTrans::getString("RELEASE_NOTES_BASE_URL")); substitutions["INFO_URL"] = relnotes_url.getString(); } - + LLNotificationsUtil::add(notification_name, substitutions, LLSD(), apply_callback); } @@ -3238,6 +3263,183 @@ void LLAppViewer::writeDebugInfo() out_file.close(); } +LLSD LLAppViewer::getViewerInfo() const +{ + // The point of having one method build an LLSD info block and the other + // construct the user-visible About string is to ensure that the same info + // is available to a getInfo() caller as to the user opening + // LLFloaterAbout. + LLSD info; + LLSD version; + version.append(LLVersionInfo::getMajor()); + version.append(LLVersionInfo::getMinor()); + version.append(LLVersionInfo::getPatch()); + version.append(LLVersionInfo::getBuild()); + info["VIEWER_VERSION"] = version; + info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion(); + info["BUILD_DATE"] = __DATE__; + info["BUILD_TIME"] = __TIME__; + info["CHANNEL"] = LLVersionInfo::getChannel(); + + // return a URL to the release notes for this viewer, such as: + // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 + std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); + if (! LLStringUtil::endsWith(url, "/")) + url += "/"; + url += LLURI::escape(LLVersionInfo::getChannel()) + "/"; + url += LLURI::escape(LLVersionInfo::getVersion()); + + info["VIEWER_RELEASE_NOTES_URL"] = url; + +#if LL_MSVC + info["COMPILER"] = "MSVC"; + info["COMPILER_VERSION"] = _MSC_VER; +#elif LL_GNUC + info["COMPILER"] = "GCC"; + info["COMPILER_VERSION"] = GCC_VERSION; +#endif + + // Position + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + LLVector3d pos = gAgent.getPositionGlobal(); + info["POSITION"] = ll_sd_from_vector3d(pos); + info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos)); + info["REGION"] = gAgent.getRegion()->getName(); + info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName(); + info["HOSTIP"] = gAgent.getRegion()->getHost().getString(); + info["SERVER_VERSION"] = gLastVersionChannel; + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + info["SLURL"] = slurl.getSLURLString(); + } + + // CPU + info["CPU"] = gSysCPU.getCPUString(); + info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024); + // Moved hack adjustment to Windows memory size into llsys.cpp + info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString(); + info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR)); + info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER)); + +#if LL_WINDOWS + LLSD driver_info = gDXHardware.getDisplayInfo(); + if (driver_info.has("DriverVersion")) + { + info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"]; + } +#endif + + info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION)); + info["LIBCURL_VERSION"] = LLCurl::getVersionString(); + info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); + bool want_fullname = true; + info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); + if(LLVoiceClient::getInstance()->voiceEnabled()) + { + LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); + std::ostringstream version_string; + version_string << version.serverType << " " << version.serverVersion << std::endl; + info["VOICE_VERSION"] = version_string.str(); + } + else + { + info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); + } + + // TODO: Implement media plugin version query + info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; + + if (gPacketsIn > 0) + { + info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent(); + info["PACKETS_IN"] = F32(gPacketsIn); + info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); + } + + if (mServerReleaseNotesURL.empty()) + { + if (gAgent.getRegion()) + { + info["SERVER_RELEASE_NOTES_URL"] = LLTrans::getString("RetrievingData"); + } + } + else if (LLStringUtil::startsWith(mServerReleaseNotesURL, "http")) // it's an URL + { + info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(mServerReleaseNotesURL) + " " + LLTrans::getString("ReleaseNotes") + "]"; + } + else + { + info["SERVER_RELEASE_NOTES_URL"] = mServerReleaseNotesURL; + } + + return info; +} + +std::string LLAppViewer::getViewerInfoString() const +{ + std::ostringstream support; + + LLSD info(getViewerInfo()); + + // Render the LLSD from getInfo() as a format_map_t + LLStringUtil::format_map_t args; + + // allow the "Release Notes" URL label to be localized + args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); + + for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); + ii != iend; ++ii) + { + if (! ii->second.isArray()) + { + // Scalar value + if (ii->second.isUndefined()) + { + args[ii->first] = LLTrans::getString("none_text"); + } + else + { + // don't forget to render value asString() + args[ii->first] = ii->second.asString(); + } + } + else + { + // array value: build KEY_0, KEY_1 etc. entries + for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) + { + args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); + } + } + } + + // Now build the various pieces + support << LLTrans::getString("AboutHeader", args); + if (info.has("REGION")) + { + support << "\n\n" << LLTrans::getString("AboutPosition", args); + } + support << "\n\n" << LLTrans::getString("AboutSystem", args); + support << "\n"; + if (info.has("GRAPHICS_DRIVER_VERSION")) + { + support << "\n" << LLTrans::getString("AboutDriver", args); + } + support << "\n" << LLTrans::getString("AboutLibs", args); + if (info.has("COMPILER")) + { + support << "\n" << LLTrans::getString("AboutCompiler", args); + } + if (info.has("PACKETS_IN")) + { + support << '\n' << LLTrans::getString("AboutTraffic", args); + } + return support.str(); +} + + void LLAppViewer::cleanupSavedSettings() { gSavedSettings.setBOOL("MouseSun", FALSE); @@ -3462,9 +3664,9 @@ void LLAppViewer::handleViewerCrash() if (gDirUtilp) { std::string crash_marker_file_name = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, - gLLErrorActivated - ? LLERROR_MARKER_FILE_NAME - : ERROR_MARKER_FILE_NAME); + gLLErrorActivated + ? LLERROR_MARKER_FILE_NAME + : ERROR_MARKER_FILE_NAME); LLAPRFile crash_marker_file ; crash_marker_file.open(crash_marker_file_name, LL_APR_WB); if (crash_marker_file.getFileHandle()) @@ -3475,7 +3677,7 @@ void LLAppViewer::handleViewerCrash() else { LL_WARNS("MarkerFile") << "Cannot create error marker file " << crash_marker_file_name << LL_ENDL; - } + } } else { @@ -3614,7 +3816,7 @@ void LLAppViewer::processMarkerFiles() } if (mSecondInstance) - { + { LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' owned by another instance" << LL_ENDL; } else if (marker_is_same_version) @@ -3628,7 +3830,7 @@ void LLAppViewer::processMarkerFiles() { LL_INFOS("MarkerFile") << "Exec marker '"<< mMarkerFileName << "' found, but versions did not match" << LL_ENDL; } - } + } else // marker did not exist... last exec (if any) did not freeze { // Create the marker file for this execution & lock it; it will be deleted on a clean exit @@ -3682,12 +3884,12 @@ void LLAppViewer::processMarkerFiles() { gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; - } - else - { + } + else + { gLastExecEvent = LAST_EXEC_LLERROR_CRASH; LL_INFOS("MarkerFile") << "LLError marker '"<< llerror_marker_file << "' crashed, setting LastExecEvent to LLERROR_CRASH" << LL_ENDL; - } + } } else { @@ -3700,20 +3902,20 @@ void LLAppViewer::processMarkerFiles() if(LLAPRFile::isExist(error_marker_file, NULL, LL_APR_RB)) { if (markerIsSameVersion(error_marker_file)) - { + { if (gLastExecEvent == LAST_EXEC_LOGOUT_FROZE) - { + { gLastExecEvent = LAST_EXEC_LOGOUT_CRASH; LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to LOGOUT_CRASH" << LL_ENDL; - } - else - { - gLastExecEvent = LAST_EXEC_OTHER_CRASH; - LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; - } } else { + gLastExecEvent = LAST_EXEC_OTHER_CRASH; + LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' crashed, setting LastExecEvent to " << gLastExecEvent << LL_ENDL; + } + } + else + { LL_INFOS("MarkerFile") << "Error marker '"<< error_marker_file << "' marker found, but versions did not match" << LL_ENDL; } LLAPRFile::remove(error_marker_file); @@ -3725,29 +3927,29 @@ void LLAppViewer::removeMarkerFile(bool leave_logout_marker) if (!mSecondInstance) { LL_DEBUGS("MarkerFile") << (leave_logout_marker?"leave":"remove") <<" logout" << LL_ENDL; - if (mMarkerFile.getFileHandle()) - { + if (mMarkerFile.getFileHandle()) + { LL_DEBUGS("MarkerFile") << "removing exec marker '"<<mMarkerFileName<<"'"<< LL_ENDL; mMarkerFile.close() ; - LLAPRFile::remove( mMarkerFileName ); - } - else - { + LLAPRFile::remove( mMarkerFileName ); + } + else + { LL_WARNS("MarkerFile") << "marker '"<<mMarkerFileName<<"' not open"<< LL_ENDL; - } - if (!leave_logout_marker) + } + if (!leave_logout_marker) + { + if (mLogoutMarkerFile.getFileHandle()) { - if (mLogoutMarkerFile.getFileHandle()) - { LL_DEBUGS("MarkerFile") << "removing logout marker '"<<mLogoutMarkerFileName<<"'"<< LL_ENDL; - mLogoutMarkerFile.close(); - } - else - { + mLogoutMarkerFile.close(); + } + else + { LL_WARNS("MarkerFile") << "logout marker '"<<mLogoutMarkerFileName<<"' not open"<< LL_ENDL; - } - LLAPRFile::remove( mLogoutMarkerFileName ); } + LLAPRFile::remove( mLogoutMarkerFileName ); + } } else { @@ -4690,7 +4892,7 @@ void LLAppViewer::idle() if (!(logoutRequestSent() && hasSavedFinalSnapshot())) { - gObjectList.update(gAgent, *LLWorld::getInstance()); + gObjectList.update(gAgent); } } @@ -5379,7 +5581,7 @@ void LLAppViewer::handleLoginComplete() void LLAppViewer::launchUpdater() { - LLSD query_map = LLSD::emptyMap(); + LLSD query_map = LLSD::emptyMap(); query_map["os"] = gPlatform; // *TODO change userserver to be grid on both viewer and sim, since @@ -5576,7 +5778,7 @@ void LLAppViewer::metricsSend(bool enable_reporting) // Make a copy of the main stats to send into another thread. // Receiving thread takes ownership. LLViewerAssetStats * main_stats(new LLViewerAssetStats(*gViewerAssetStatsMain)); - + // Send a report request into 'thread1' to get the rest of the data // and provide some additional parameters while here. LLAppViewer::sTextureFetch->commandSendMetrics(caps_url, diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 3ae8a78845..05326c2baf 100755 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -86,6 +86,10 @@ public: const LLOSInfo& getOSInfo() const { return mSysOSInfo; } + void setServerReleaseNotesURL(const std::string& url) { mServerReleaseNotesURL = url; } + LLSD getViewerInfo() const; + std::string getViewerInfoString() const; + // Report true if under the control of a debugger. A null-op default. virtual bool beingDebugged() { return false; } @@ -246,6 +250,8 @@ private: LLOSInfo mSysOSInfo; bool mReportedCrash; + std::string mServerReleaseNotesURL; + // Thread objects. static LLTextureCache* sTextureCache; static LLImageDecodeThread* sImageDecodeThread; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 3cf3c739d9..2764025d75 100755 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -172,21 +172,20 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) nvapi_error(status); return; } + + // (5) Now we apply (or save) our changes to the system + status = NvAPI_DRS_SaveSettings(hSession); + if (status != NVAPI_OK) + { + nvapi_error(status); + return; + } } else if (status != NVAPI_OK) { nvapi_error(status); return; } - - - - // (5) Now we apply (or save) our changes to the system - status = NvAPI_DRS_SaveSettings(hSession); - if (status != NVAPI_OK) - { - nvapi_error(status); - } } //#define DEBUGGING_SEH_FILTER 1 @@ -201,14 +200,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance, LPSTR lpCmdLine, int nCmdShow) { -#ifdef INCLUDE_VLD - // only works for debug builds (hard coded into vld.h) - #ifdef _DEBUG - // start with Visual Leak Detector turned off - VLDGlobalDisable(); - #endif // _DEBUG -#endif // INCLUDE_VLD - const S32 MAX_HEAPS = 255; DWORD heap_enable_lfh_error[MAX_HEAPS]; S32 num_heaps = 0; diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index 1d72397cbc..dd9354fe3a 100755 --- a/indra/newview/llautoreplace.cpp +++ b/indra/newview/llautoreplace.cpp @@ -39,7 +39,7 @@ void LLAutoReplace::autoreplaceCallback(S32& replacement_start, S32& replacement replacement_length = 0; replacement_string.clear(); - static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace"); + static LLCachedControl<bool> perform_autoreplace(gSavedSettings, "AutoReplace", 0); if (perform_autoreplace) { S32 word_end = cursor_pos - 1; @@ -679,7 +679,7 @@ bool LLAutoReplaceSettings::decreaseListPriority(std::string listName) std::string LLAutoReplaceSettings::replaceWord(const std::string currentWord) { std::string returnedWord = currentWord; // in case no replacement is found - static LLCachedControl<bool> autoreplace_enabled(gSavedSettings, "AutoReplace"); + static LLCachedControl<bool> autoreplace_enabled(gSavedSettings, "AutoReplace", false); if ( autoreplace_enabled ) { LL_DEBUGS("AutoReplace")<<"checking '"<<currentWord<<"'"<< LL_ENDL; diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index b513a52ff7..70cc48f12b 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -73,6 +73,8 @@ #include "llcallingcard.h" #include "llslurl.h" // IDEVO #include "llsidepanelinventory.h" +#include "llavatarname.h" +#include "llagentui.h" // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) @@ -391,6 +393,72 @@ void LLAvatarActions::pay(const LLUUID& id) } } +void LLAvatarActions::teleport_request_callback(const LLSD& notification, const LLSD& response) +{ + S32 option; + if (response.isInteger()) + { + option = response.asInteger(); + } + else + { + option = LLNotificationsUtil::getSelectedOption(notification, response); + } + + if (0 == option) + { + LLMessageSystem* msg = gMessageSystem; + + msg->newMessageFast(_PREHASH_ImprovedInstantMessage); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + + msg->nextBlockFast(_PREHASH_MessageBlock); + msg->addBOOLFast(_PREHASH_FromGroup, FALSE); + msg->addUUIDFast(_PREHASH_ToAgentID, notification["substitutions"]["uuid"] ); + msg->addU8Fast(_PREHASH_Offline, IM_ONLINE); + msg->addU8Fast(_PREHASH_Dialog, IM_TELEPORT_REQUEST); + msg->addUUIDFast(_PREHASH_ID, LLUUID::null); + msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary + + std::string name; + LLAgentUI::buildFullname(name); + + msg->addStringFast(_PREHASH_FromAgentName, name); + msg->addStringFast(_PREHASH_Message, response["message"]); + msg->addU32Fast(_PREHASH_ParentEstateID, 0); + msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null); + msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent()); + + gMessageSystem->addBinaryDataFast( + _PREHASH_BinaryBucket, + EMPTY_BINARY_BUCKET, + EMPTY_BINARY_BUCKET_SIZE); + + gAgent.sendReliableMessage(); + } +} + +// static +void LLAvatarActions::teleportRequest(const LLUUID& id) +{ + LLSD notification; + notification["uuid"] = id; + LLAvatarName av_name; + if (!LLAvatarNameCache::get(id, &av_name)) + { + // unlikely ... they just picked this name from somewhere... + LLAvatarNameCache::get(id, boost::bind(&LLAvatarActions::teleportRequest, id)); + return; // reinvoke this when the name resolves + } + notification["NAME"] = av_name.getCompleteName(); + + LLSD payload; + + LLNotificationsUtil::add("TeleportRequestPrompt", notification, payload, teleport_request_callback); +} + // static void LLAvatarActions::kick(const LLUUID& id) { diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 6e1198cd09..403414558e 100755 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -111,6 +111,12 @@ public: static void pay(const LLUUID& id); /** + * Request teleport from other avatar + */ + static void teleportRequest(const LLUUID& id); + static void teleport_request_callback(const LLSD& notification, const LLSD& response); + + /** * Share items with the avatar. */ static void share(const LLUUID& id); diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp index 9e3225a264..d6a72b0c05 100644 --- a/indra/newview/llavatarrenderinfoaccountant.cpp +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -256,7 +256,7 @@ void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regio { llinfos << "LRI: Sending avatar render info for " << avatar->getID() << ": " << info << llendl; - llinfos << "LRI: geometry " << avatar->getAttachmentGeometryBytes() + llinfos << "LRI: other info geometry " << avatar->getAttachmentGeometryBytes() << ", area " << avatar->getAttachmentSurfaceArea() << llendl; } @@ -336,7 +336,7 @@ void LLAvatarRenderInfoAccountant::idle() sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS); } - static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions"); + static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0); static U32 prev_render_auto_mute_functions = (U32) -1; if (prev_render_auto_mute_functions != render_auto_mute_functions) { diff --git a/indra/newview/llblocklist.cpp b/indra/newview/llblocklist.cpp index 066cb71677..3849fbeb54 100755 --- a/indra/newview/llblocklist.cpp +++ b/indra/newview/llblocklist.cpp @@ -41,10 +41,14 @@ static const LLBlockListNameTypeComparator NAME_TYPE_COMPARATOR; LLBlockList::LLBlockList(const Params& p) : LLFlatListViewEx(p), mSelectedItem(NULL), - mDirty(true) + mDirty(true), + mShouldAddAll(true), + mActionType(NONE), + mMuteListSize(0) { LLMuteList::getInstance()->addObserver(this); + mMuteListSize = LLMuteList::getInstance()->getMutes().size(); // Set up context menu. LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; @@ -73,6 +77,41 @@ LLBlockList::~LLBlockList() LLMuteList::getInstance()->removeObserver(this); } +void LLBlockList::createList() +{ + std::vector<LLMute> mutes = LLMuteList::instance().getMutes(); + std::vector<LLMute>::const_iterator mute_it = mutes.begin(); + + for (; mute_it != mutes.end(); ++mute_it) + { + addNewItem(&*mute_it); + } +} + +BlockListActionType LLBlockList::getCurrentMuteListActionType() +{ + BlockListActionType type = NONE; + U32 curSize = LLMuteList::getInstance()->getMutes().size(); + if( curSize > mMuteListSize) + type = ADD; + else if(curSize < mMuteListSize) + type = REMOVE; + + return type; +} + +void LLBlockList::onChangeDetailed(const LLMute &mute) +{ + mActionType = getCurrentMuteListActionType(); + + mCurItemId = mute.mID; + mCurItemName = mute.mName; + mCurItemType = mute.mType; + mCurItemFlags = mute.mFlags; + + refresh(); +} + BOOL LLBlockList::handleRightMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask); @@ -88,6 +127,16 @@ BOOL LLBlockList::handleRightMouseDown(S32 x, S32 y, MASK mask) return handled; } +void LLBlockList::removeListItem(const LLMute* mute) +{ + removeItemByUUID(mute->mID); +} + +void LLBlockList::hideListItem(LLBlockedListItem* item, bool show) +{ + item->setVisible(show); +} + void LLBlockList::setNameFilter(const std::string& filter) { std::string filter_upper = filter; @@ -136,28 +185,56 @@ void LLBlockList::refresh() bool have_filter = !mNameFilter.empty(); // save selection to restore it after list rebuilt - LLUUID selected = getSelectedUUID(); + LLUUID selected = getSelectedUUID(), next_selected; - // calling refresh may be initiated by removing currently selected item - // so select next item and save the selection to restore it after list rebuilt + if(mShouldAddAll) // creating list of blockers + { + clear(); + createList(); + mShouldAddAll = false; + } + else + { + // handle remove/add functionality + LLMute mute(mCurItemId, mCurItemName, mCurItemType, mCurItemFlags); + if(mActionType == ADD) + { + addNewItem(&mute); + } + else if(mActionType == REMOVE) + { + if(selected == mute.mID) + { + // we are going to remove currently selected item, so select next item and save the selection to restore it if (!selectNextItemPair(false, true)) { selectNextItemPair(true, true); } - LLUUID next_selected = getSelectedUUID(); - - clear(); - - std::vector<LLMute> mutes = LLMuteList::instance().getMutes(); - std::vector<LLMute>::const_iterator mute_it = mutes.begin(); + next_selected = getSelectedUUID(); + } + removeListItem(&mute); + } + mActionType = NONE; + } - for (; mute_it != mutes.end(); ++mute_it) + // handle filter functionality + if(have_filter || (!have_filter && !mPrevNameFilter.empty())) { - if (have_filter && !findInsensitive(mute_it->mName, mNameFilter)) - continue; + // we should update visibility of our items if previous filter was not empty + std::vector < LLPanel* > allItems; + getItems(allItems); + std::vector < LLPanel* >::iterator it = allItems.begin(); - addNewItem(&*mute_it); + for(; it != allItems.end() ; ++it) + { + LLBlockedListItem * curItem = dynamic_cast<LLBlockedListItem *> (*it); + if(curItem) + { + hideListItem(curItem, findInsensitive(curItem->getName(), mNameFilter)); + } + } } + mPrevNameFilter = mNameFilter; if (getItemPair(selected)) { @@ -169,6 +246,7 @@ void LLBlockList::refresh() // previously selected item was removed, so select next item selectItemPair(getItemPair(next_selected), true); } + mMuteListSize = LLMuteList::getInstance()->getMutes().size(); // Sort the list. sort(); diff --git a/indra/newview/llblocklist.h b/indra/newview/llblocklist.h index 1a215710f4..bac79f869e 100755 --- a/indra/newview/llblocklist.h +++ b/indra/newview/llblocklist.h @@ -34,6 +34,8 @@ class LLBlockedListItem; class LLMute; +enum BlockListActionType {NONE, ADD, REMOVE}; + /** * List of blocked avatars and objects. * This list represents contents of the LLMuteList. @@ -56,7 +58,8 @@ public: LLToggleableMenu* getContextMenu() const { return mContextMenu.get(); } LLBlockedListItem* getBlockedItem() const; - virtual void onChange() { refresh(); } + virtual void onChange() { } + virtual void onChangeDetailed(const LLMute& ); virtual void draw(); void setNameFilter(const std::string& filter); @@ -67,18 +70,32 @@ public: private: void addNewItem(const LLMute* mute); + void removeListItem(const LLMute* mute); + void hideListItem(LLBlockedListItem* item, bool show); void setDirty(bool dirty = true) { mDirty = dirty; } bool findInsensitive(std::string haystack, const std::string& needle_upper); bool isActionEnabled(const LLSD& userdata); void onCustomAction (const LLSD& userdata); + void createList(); + BlockListActionType getCurrentMuteListActionType(); LLHandle<LLToggleableMenu> mContextMenu; LLBlockedListItem* mSelectedItem; std::string mNameFilter; bool mDirty; + bool mShouldAddAll; + BlockListActionType mActionType; + U32 mMuteListSize; + + // This data is used to save information about item that currently changed(added or removed) + LLUUID mCurItemId; + std::string mCurItemName; + LLMute::EType mCurItemType; + U32 mCurItemFlags; + std::string mPrevNameFilter; }; diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 14583e402d..91741c2a77 100755 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -115,7 +115,9 @@ LLAvatarTracker::~LLAvatarTracker() { deleteTrackingData(); std::for_each(mObservers.begin(), mObservers.end(), DeletePointer()); + mObservers.clear(); std::for_each(mBuddyInfo.begin(), mBuddyInfo.end(), DeletePairedPointer()); + mBuddyInfo.clear(); } void LLAvatarTracker::track(const LLUUID& avatar_id, const std::string& name) diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp index 8b2d9e639f..fa23251d95 100755 --- a/indra/newview/llchannelmanager.cpp +++ b/indra/newview/llchannelmanager.cpp @@ -113,29 +113,33 @@ void LLChannelManager::onLoginCompleted() } else { - // create a channel for the StartUp Toast - LLScreenChannelBase::Params p; - p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); - p.channel_align = CA_RIGHT; - mStartUpChannel = createChannel(p); - - if(!mStartUpChannel) - { - onStartUpToastClose(); - } - else - { - gViewerWindow->getRootView()->addChild(mStartUpChannel); - - // init channel's position and size - S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); - S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); - mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); - mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); - - mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); - mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); - } + // TODO: Seems this code leads to MAINT-3536 new crash in XML_ParserFree. + // Need to investigate this and fix possible problems with notifications in startup time + // Viewer can normally receive and show of postponed notifications about purchasing in marketplace on startup time. + // Other types of postponed notifications did not tested. + //// create a channel for the StartUp Toast + //LLScreenChannelBase::Params p; + //p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID")); + //p.channel_align = CA_RIGHT; + //mStartUpChannel = createChannel(p); + + //if(!mStartUpChannel) + //{ + // onStartUpToastClose(); + //} + //else + //{ + // gViewerWindow->getRootView()->addChild(mStartUpChannel); + + // // init channel's position and size + // S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin"); + // S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth"); + // mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound); + // mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4)); + + // mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this)); + // mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime")); + //} } LLPersistentNotificationStorage::getInstance()->loadNotifications(); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 43a733f918..abeaf958eb 100755 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -60,6 +60,8 @@ #include "llstring.h" #include "llurlaction.h" #include "llviewercontrol.h" +#include "llviewerobjectlist.h" +#include "llmutelist.h" static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history"); @@ -181,6 +183,22 @@ public: { LLAvatarActions::startIM(getAvatarId()); } + else if (level == "teleport") + { + LLAvatarActions::offerTeleport(getAvatarId()); + } + else if (level == "request_teleport") + { + LLAvatarActions::teleportRequest(getAvatarId()); + } + else if (level == "voice_call") + { + LLAvatarActions::startCall(getAvatarId()); + } + else if (level == "chat_history") + { + LLAvatarActions::viewChatHistory(getAvatarId()); + } else if (level == "add") { LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom); @@ -189,13 +207,75 @@ public: { LLAvatarActions::removeFriendDialog(getAvatarId()); } + else if (level == "invite_to_group") + { + LLAvatarActions::inviteToGroup(getAvatarId()); + } + else if (level == "zoom_in") + { + handle_zoom_to_object(getAvatarId()); + } + else if (level == "map") + { + LLAvatarActions::showOnMap(getAvatarId()); + } + else if (level == "share") + { + LLAvatarActions::share(getAvatarId()); + } + else if (level == "pay") + { + LLAvatarActions::pay(getAvatarId()); + } + else if(level == "block_unblock") + { + mute(getAvatarId(), LLMute::flagVoiceChat); + } + else if(level == "mute_unmute") + { + mute(getAvatarId(), LLMute::flagTextChat); + } + } + + bool onAvatarIconContextMenuItemChecked(const LLSD& userdata) + { + std::string level = userdata.asString(); + + if (level == "is_blocked") + { + return LLMuteList::getInstance()->isMuted(getAvatarId(), LLMute::flagVoiceChat); + } + if (level == "is_muted") + { + return LLMuteList::getInstance()->isMuted(getAvatarId(), LLMute::flagTextChat); + } + return false; + } + + void mute(const LLUUID& participant_id, U32 flags) + { + BOOL is_muted = LLMuteList::getInstance()->isMuted(participant_id, flags); + std::string name; + gCacheName->getFullName(participant_id, name); + LLMute mute(participant_id, name, LLMute::AGENT); + + if (!is_muted) + { + LLMuteList::getInstance()->add(mute, flags); + } + else + { + LLMuteList::getInstance()->remove(mute, flags); + } } BOOL postBuild() { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar registrar_enable; registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2)); + registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2)); registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2)); LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -460,7 +540,7 @@ protected: if(menu) { - bool is_friend = LLAvatarTracker::instance().getBuddyInfo(mAvatarID) != NULL; + bool is_friend = LLAvatarActions::isFriend(mAvatarID); menu->setItemEnabled("Add Friend", !is_friend); menu->setItemEnabled("Remove Friend", is_friend); @@ -470,13 +550,37 @@ protected: menu->setItemEnabled("Add Friend", false); menu->setItemEnabled("Send IM", false); menu->setItemEnabled("Remove Friend", false); + menu->setItemEnabled("Offer Teleport",false); + menu->setItemEnabled("Request Teleport",false); + menu->setItemEnabled("Voice Call", false); + menu->setItemEnabled("Chat History", false); + menu->setItemEnabled("Invite Group", false); + menu->setItemEnabled("Zoom In", false); + menu->setItemEnabled("Share", false); + menu->setItemEnabled("Pay", false); + menu->setItemEnabled("Block Unblock", false); + menu->setItemEnabled("Mute Text", false); } - - if (mSessionID == LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, mAvatarID)) + else + { + LLUUID currentSessionID = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, mAvatarID); + if (mSessionID == currentSessionID) { menu->setItemVisible("Send IM", false); } + menu->setItemEnabled("Offer Teleport", LLAvatarActions::canOfferTeleport(mAvatarID)); + menu->setItemEnabled("Request Teleport", LLAvatarActions::canOfferTeleport(mAvatarID)); + menu->setItemEnabled("Voice Call", LLAvatarActions::canCall()); + + // We should only show 'Zoom in' item in a nearby chat + bool should_show_zoom = !LLIMModel::getInstance()->findIMSession(currentSessionID); + menu->setItemVisible("Zoom In", should_show_zoom && gObjectList.findObject(mAvatarID)); + menu->setItemEnabled("Block Unblock", LLAvatarActions::canBlock(mAvatarID)); + menu->setItemEnabled("Mute Text", LLAvatarActions::canBlock(mAvatarID)); + menu->setItemEnabled("Chat History", LLLogChat::isTranscriptExist(mAvatarID)); + } + menu->setItemEnabled("Map", (LLAvatarTracker::instance().isBuddyOnline(mAvatarID) && is_agent_mappable(mAvatarID)) || gAgent.isGodlike() ); menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); LLMenuGL::showPopup(this, menu, x, y); @@ -627,6 +731,7 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p) editor_params.follows.flags = FOLLOWS_ALL; editor_params.enabled = false; // read only editor_params.show_context_menu = "true"; + editor_params.trusted_content = false; mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this); mEditor->setIsFriendCallback(LLAvatarActions::isFriend); } @@ -968,6 +1073,22 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL // notify processing if (chat.mNotifId.notNull()) { + bool create_toast = true; + for (LLToastNotifyPanel::instance_iter ti(LLToastNotifyPanel::beginInstances()) + , tend(LLToastNotifyPanel::endInstances()); ti != tend; ++ti) + { + LLToastNotifyPanel& panel = *ti; + LLIMToastNotifyPanel * imtoastp = dynamic_cast<LLIMToastNotifyPanel *>(&panel); + const std::string& notification_name = panel.getNotificationName(); + if (notification_name == "OfferFriendship" && panel.isControlPanelEnabled() && imtoastp) + { + create_toast = false; + break; + } + } + + if (create_toast) + { LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId); if (notification != NULL) { @@ -989,6 +1110,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL mEditor->appendWidget(params, "\n", false); } } + } // usual messages showing else diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 88884042d4..131aea9da3 100755 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -220,18 +220,25 @@ void LLNotificationChiclet::setCounter(S32 counter) bool LLNotificationChiclet::ChicletNotificationChannel::filterNotification( LLNotificationPtr notification ) { - if (notification->getName() == "ScriptDialog") + bool displayNotification; + if ( (notification->getName() == "ScriptDialog") // special case for scripts + // if there is no toast window for the notification, filter it + || (!LLNotificationWellWindow::getInstance()->findItemByID(notification->getID())) + ) { - return false; + displayNotification = false; } - - if( !(notification->canLogToIM() && notification->hasFormElements()) - && (!notification->getPayload().has("give_inventory_notification") - || notification->getPayload()["give_inventory_notification"])) + else if( !(notification->canLogToIM() && notification->hasFormElements()) + && (!notification->getPayload().has("give_inventory_notification") + || notification->getPayload()["give_inventory_notification"])) { - return true; + displayNotification = true; } - return false; + else + { + displayNotification = false; + } + return displayNotification; } ////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp index e86d6930e8..e200e0ee9e 100755 --- a/indra/newview/llcofwearables.cpp +++ b/indra/newview/llcofwearables.cpp @@ -43,7 +43,7 @@ #include "llpaneloutfitedit.h" #include "lltrans.h" -static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables"); +static LLPanelInjector<LLCOFWearables> t_cof_wearables("cof_wearables"); const LLSD REARRANGE = LLSD().with("rearrange", LLSD()); diff --git a/indra/newview/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 5ab108b39f..44212298cf 100755 --- a/indra/newview/llconversationloglist.cpp +++ b/indra/newview/llconversationloglist.cpp @@ -313,6 +313,10 @@ void LLConversationLogList::onCustomAction(const LLSD& userdata) { LLAvatarActions::offerTeleport(selected_conversation_participant_id); } + else if ("request_teleport" == command_name) + { + LLAvatarActions::teleportRequest(selected_conversation_participant_id); + } else if("add_friend" == command_name) { if (!LLAvatarActions::isFriend(selected_conversation_participant_id)) diff --git a/indra/newview/llconversationmodel.cpp b/indra/newview/llconversationmodel.cpp index 192a594c9d..affa24f78c 100755 --- a/indra/newview/llconversationmodel.cpp +++ b/indra/newview/llconversationmodel.cpp @@ -132,6 +132,7 @@ void LLConversationItem::buildParticipantMenuOptions(menuentry_vec_t& items, U32 items.push_back(std::string("view_profile")); items.push_back(std::string("im")); items.push_back(std::string("offer_teleport")); + items.push_back(std::string("request_teleport")); items.push_back(std::string("voice_call")); items.push_back(std::string("chat_history")); items.push_back(std::string("separator_chat_history")); diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp index 9faa12b2ee..90800fee58 100644 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -267,6 +267,21 @@ BOOL LLConversationViewSession::handleMouseDown( S32 x, S32 y, MASK mask ) //This node (conversation) was selected and a child (participant) was not if(result && getRoot()) { + if(getRoot()->getCurSelectedItem() == this) + { + LLConversationItem* item = dynamic_cast<LLConversationItem *>(getViewModelItem()); + LLUUID session_id = item? item->getUUID() : LLUUID(); + + LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); + if (im_container->isConversationsPaneCollapsed() && im_container->getSelectedSession() == session_id) + { + im_container->collapseMessagesPane(!im_container->isMessagesPaneCollapsed()); + } + else + { + im_container->collapseMessagesPane(false); + } + } selectConversationItem(); } @@ -318,7 +333,6 @@ void LLConversationViewSession::selectConversationItem() LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); im_container->flashConversationItemWidget(session_id,false); im_container->selectConversationPair(session_id, false); - im_container->collapseMessagesPane(false); } } diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 6c5d229dba..e27dc279f4 100755 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -382,9 +382,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) bool is_particle_or_hud_particle = group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_PARTICLE || group->mSpatialPartition->mPartitionType == LLViewerRegion::PARTITION_HUD_PARTICLE; - bool draw_glow_for_this_partition = mVertexShaderLevel > 0 && // no shaders = no glow. - // All particle systems seem to come off the wire with texture entries which claim that they glow. This is probably a bug in the data. Suppress. - !is_particle_or_hud_particle; + bool draw_glow_for_this_partition = mVertexShaderLevel > 0; // no shaders = no glow. static LLFastTimer::DeclareTimer FTM_RENDER_ALPHA_GROUP_LOOP("Alpha Group"); LLFastTimer t(FTM_RENDER_ALPHA_GROUP_LOOP); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index f622d5a63a..24f467f954 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -55,6 +55,7 @@ static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK; static U32 sBufferUsage = GL_STREAM_DRAW_ARB; static U32 sShaderLevel = 0; +#define JOINT_COUNT 52 LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL; BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE; @@ -1582,10 +1583,11 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL; //build matrix palette - LLMatrix4a mp[64]; + LLMatrix4a mp[JOINT_COUNT]; LLMatrix4* mat = (LLMatrix4*) mp; - for (U32 j = 0; j < skin->mJointNames.size(); ++j) + U32 count = llmin((U32) skin->mJointNames.size(), (U32) JOINT_COUNT); + for (U32 j = 0; j < count; ++j) { LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); if (joint) @@ -1642,6 +1644,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* LLVector4a& n = vol_face.mNormals[j]; bind_shape_matrix.rotate(n, t); final_mat.rotate(t, dst); + dst.normalize3fast(); norm[j] = dst; } } @@ -1708,9 +1711,9 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) { if (sShaderLevel > 0) { //upload matrix palette to shader - LLMatrix4 mat[32]; + LLMatrix4 mat[JOINT_COUNT]; - U32 count = llmin((U32) skin->mJointNames.size(), (U32) 32); + U32 count = llmin((U32) skin->mJointNames.size(), (U32) JOINT_COUNT); for (U32 i = 0; i < count; ++i) { @@ -1724,10 +1727,42 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) stop_glerror(); - LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv(LLViewerShaderMgr::AVATAR_MATRIX, + F32 mp[JOINT_COUNT*9]; + + F32 transp[JOINT_COUNT*3]; + + for (U32 i = 0; i < count; ++i) + { + F32* m = (F32*) mat[i].mMatrix; + + U32 idx = i*9; + + mp[idx+0] = m[0]; + mp[idx+1] = m[1]; + mp[idx+2] = m[2]; + + mp[idx+3] = m[4]; + mp[idx+4] = m[5]; + mp[idx+5] = m[6]; + + mp[idx+6] = m[8]; + mp[idx+7] = m[9]; + mp[idx+8] = m[10]; + + idx = i*3; + + transp[idx+0] = m[12]; + transp[idx+1] = m[13]; + transp[idx+2] = m[14]; + } + + LLDrawPoolAvatar::sVertexProgram->uniformMatrix3fv(LLViewerShaderMgr::AVATAR_MATRIX, count, FALSE, - (GLfloat*) mat[0].mMatrix); + (GLfloat*) mp); + + LLDrawPoolAvatar::sVertexProgram->uniform3fv(LLShaderMgr::AVATAR_TRANSLATION, count, transp); + stop_glerror(); } diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index 8926f64c64..0bc7ae766c 100755 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -37,8 +37,6 @@ #include "llviewershadermgr.h" #include "llrender.h" -#define GE_FORCE_WORKAROUND LL_DARWIN - static LLGLSLShader* simple_shader = NULL; static LLGLSLShader* fullbright_shader = NULL; @@ -660,14 +658,6 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass) } else { - -// Work-around until we can figure out why the right shader causes -// the GeForce driver to go tango uniform on OS X 10.6.8 only -// -#if GE_FORCE_WORKAROUND - gObjectFullbrightAlphaMaskProgram.bind(); - gObjectFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); -#else if (LLPipeline::sUnderWaterRender) { gDeferredFullbrightAlphaMaskWaterProgram.bind(); @@ -678,9 +668,7 @@ void LLDrawPoolFullbrightAlphaMask::beginPostDeferredPass(S32 pass) gDeferredFullbrightAlphaMaskProgram.bind(); gDeferredFullbrightAlphaMaskProgram.uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f); } -#endif } - } void LLDrawPoolFullbrightAlphaMask::renderPostDeferred(S32 pass) @@ -699,13 +687,6 @@ void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass) } else { - -// Work-around until we can figure out why the right shader causes -// the GeForce driver to go tango uniform on OS X 10.6.8 only -// -#if GE_FORCE_WORKAROUND - gObjectFullbrightAlphaMaskProgram.unbind(); -#else if (LLPipeline::sUnderWaterRender) { gDeferredFullbrightAlphaMaskWaterProgram.unbind(); @@ -714,8 +695,6 @@ void LLDrawPoolFullbrightAlphaMask::endPostDeferredPass(S32 pass) { gDeferredFullbrightAlphaMaskProgram.unbind(); } -#endif - } LLRenderPass::endRenderPass(pass); } diff --git a/indra/newview/llenvmanager.cpp b/indra/newview/llenvmanager.cpp index 86fe6754dc..589cf28615 100755 --- a/indra/newview/llenvmanager.cpp +++ b/indra/newview/llenvmanager.cpp @@ -92,9 +92,11 @@ void LLEnvPrefs::setUseDayCycle(const std::string& name) } //============================================================================= -LLEnvManagerNew::LLEnvManagerNew() +LLEnvManagerNew::LLEnvManagerNew(): + mInterpNextChangeMessage(true), + mCurRegionUUID(LLUUID::null), + mLastReceivedID(LLUUID::null) { - mInterpNextChangeMessage = true; // Set default environment settings. mUserPrefs.mUseRegionSettings = true; @@ -102,6 +104,9 @@ LLEnvManagerNew::LLEnvManagerNew() mUserPrefs.mWaterPresetName = "Default"; mUserPrefs.mSkyPresetName = "Default"; mUserPrefs.mDayCycleName = "Default"; + + LL_DEBUGS("Windlight")<<LL_ENDL; + gAgent.addRegionChangedCallback(boost::bind(&LLEnvManagerNew::onRegionChange, this)); } bool LLEnvManagerNew::getUseRegionSettings() const @@ -300,6 +305,11 @@ void LLEnvManagerNew::loadUserPrefs() mUserPrefs.mUseRegionSettings = gSavedSettings.getBOOL("UseEnvironmentFromRegion"); mUserPrefs.mUseDayCycle = gSavedSettings.getBOOL("UseDayCycle"); + + if (mUserPrefs.mUseRegionSettings) + { + requestRegionSettings(); + } } void LLEnvManagerNew::saveUserPrefs() @@ -398,6 +408,7 @@ void LLEnvManagerNew::dumpPresets() void LLEnvManagerNew::requestRegionSettings() { + LL_DEBUGS("Windlight") << LL_ENDL; LLEnvironmentRequest::initiate(); } @@ -422,11 +433,6 @@ boost::signals2::connection LLEnvManagerNew::setRegionSettingsChangeCallback(con return mRegionSettingsChangeSignal.connect(cb); } -boost::signals2::connection LLEnvManagerNew::setRegionChangeCallback(const region_change_signal_t::slot_type& cb) -{ - return mRegionChangeSignal.connect(cb); -} - boost::signals2::connection LLEnvManagerNew::setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb) { return mRegionSettingsAppliedSignal.connect(cb); @@ -457,25 +463,13 @@ const std::string LLEnvManagerNew::getScopeString(LLEnvKey::EScope scope) } } -void LLEnvManagerNew::onRegionCrossing() -{ - LL_DEBUGS("Windlight") << "Crossed region" << LL_ENDL; - onRegionChange(true); -} - -void LLEnvManagerNew::onTeleport() -{ - LL_DEBUGS("Windlight") << "Teleported" << LL_ENDL; - onRegionChange(false); -} - void LLEnvManagerNew::onRegionSettingsResponse(const LLSD& content) { // If the message was valid, grab the UUID from it and save it for next outbound update message. mLastReceivedID = content[0]["messageID"].asUUID(); // Refresh cached region settings. - LL_DEBUGS("Windlight") << "Caching region environment settings: " << content << LL_ENDL; + LL_DEBUGS("Windlight") << "Received region environment settings: " << content << LL_ENDL; F32 sun_hour = 0; // *TODO LLEnvironmentSettings new_settings(content[1], content[2], content[3], sun_hour); mCachedRegionPrefs = new_settings; @@ -594,6 +588,7 @@ void LLEnvManagerNew::updateWaterFromPrefs(bool interpolate) void LLEnvManagerNew::updateManagersFromPrefs(bool interpolate) { + LL_DEBUGS("Windlight")<<LL_ENDL; // Apply water settings. updateWaterFromPrefs(interpolate); @@ -651,28 +646,35 @@ bool LLEnvManagerNew::useDefaultWater() } -void LLEnvManagerNew::onRegionChange(bool interpolate) +void LLEnvManagerNew::onRegionChange() { // Avoid duplicating region setting requests // by checking whether the region is actually changing. LLViewerRegion* regionp = gAgent.getRegion(); LLUUID region_uuid = regionp ? regionp->getRegionID() : LLUUID::null; - if (region_uuid == mCurRegionUUID) + if (region_uuid != mCurRegionUUID) { - return; + // Clear locally modified region settings. + mNewRegionPrefs.clear(); + + // *TODO: clear environment settings of the previous region? + + // Request environment settings of the new region. + mCurRegionUUID = region_uuid; + // for region crossings, interpolate the change; for teleports, don't + mInterpNextChangeMessage = (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE); + LL_DEBUGS("Windlight") << (mInterpNextChangeMessage ? "Crossed" : "Teleported") + << " to new region: " << region_uuid + << LL_ENDL; + requestRegionSettings(); + } + else + { + LL_DEBUGS("Windlight") << "disregarding region change; interp: " + << (mInterpNextChangeMessage ? "true" : "false") + << " regionp: " << regionp + << " old: " << mCurRegionUUID + << " new: " << region_uuid + << LL_ENDL; } - - // Clear locally modified region settings. - mNewRegionPrefs.clear(); - - // *TODO: clear environment settings of the previous region? - - // Request environment settings of the new region. - LL_DEBUGS("Windlight") << "New viewer region: " << region_uuid << LL_ENDL; - mCurRegionUUID = region_uuid; - mInterpNextChangeMessage = interpolate; - requestRegionSettings(); - - // Let interested parties know agent region has been changed. - mRegionChangeSignal(); } diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h index ad56761bc7..c7877303fc 100755 --- a/indra/newview/llenvmanager.h +++ b/indra/newview/llenvmanager.h @@ -166,7 +166,6 @@ class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew> public: typedef boost::signals2::signal<void()> prefs_change_signal_t; typedef boost::signals2::signal<void()> region_settings_change_signal_t; - typedef boost::signals2::signal<void()> region_change_signal_t; typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t; LLEnvManagerNew(); @@ -222,15 +221,12 @@ public: bool sendRegionSettings(const LLEnvironmentSettings& new_settings); boost::signals2::connection setPreferencesChangeCallback(const prefs_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsChangeCallback(const region_settings_change_signal_t::slot_type& cb); - boost::signals2::connection setRegionChangeCallback(const region_change_signal_t::slot_type& cb); boost::signals2::connection setRegionSettingsAppliedCallback(const region_settings_applied_signal_t::slot_type& cb); static bool canEditRegionSettings(); /// @return true if we have access to editing region environment static const std::string getScopeString(LLEnvKey::EScope scope); // Public callbacks. - void onRegionCrossing(); - void onTeleport(); void onRegionSettingsResponse(const LLSD& content); void onRegionSettingsApplyResponse(bool ok); @@ -251,7 +247,7 @@ private: bool useDefaultSky(); bool useDefaultWater(); - void onRegionChange(bool interpolate); + void onRegionChange(); /// Emitted when user environment preferences change. prefs_change_signal_t mUsePrefsChangeSignal; @@ -260,9 +256,6 @@ private: region_settings_change_signal_t mRegionSettingsChangeSignal; /// Emitted when agent region changes. Move to LLAgent? - region_change_signal_t mRegionChangeSignal; - - /// Emitted when agent region changes. Move to LLAgent? region_settings_applied_signal_t mRegionSettingsAppliedSignal; LLEnvPrefs mUserPrefs; /// User environment preferences. diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 369273bca6..ae62be0ad0 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -1386,7 +1386,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } } - static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); + static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false); #ifdef GL_TRANSFORM_FEEDBACK_BUFFER if (use_transform_feedback && @@ -1526,7 +1526,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0); - gGL.popMatrix(); if (cur_shader) diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 66b5f13740..c9037ce1eb 100755 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -194,7 +194,8 @@ public: void setSize(S32 numVertices, S32 num_indices = 0, bool align = false); - BOOL genVolumeBBoxes(const LLVolume &volume, S32 f,const LLMatrix4& mat, BOOL global_volume = FALSE); + BOOL genVolumeBBoxes(const LLVolume &volume, S32 f, + const LLMatrix4& mat_vert_in, BOOL global_volume = FALSE); void init(LLDrawable* drawablep, LLViewerObject* objp); void destroy(); diff --git a/indra/newview/llfacebookconnect.cpp b/indra/newview/llfacebookconnect.cpp new file mode 100644 index 0000000000..9a20ce8f1b --- /dev/null +++ b/indra/newview/llfacebookconnect.cpp @@ -0,0 +1,582 @@ +/** + * @file llfacebookconnect.h + * @author Merov, Cho, Gil + * @brief Connection to Facebook Service + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfacebookconnect.h" + +#include "llagent.h" +#include "llcallingcard.h" // for LLAvatarTracker +#include "llcommandhandler.h" +#include "llhttpclient.h" +#include "llnotificationsutil.h" +#include "llurlaction.h" +#include "llimagepng.h" +#include "llimagejpeg.h" +#include "lltrans.h" +#include "llevents.h" +#include "llviewerregion.h" + +#include "llfloaterwebcontent.h" +#include "llfloaterreg.h" + +boost::scoped_ptr<LLEventPump> LLFacebookConnect::sStateWatcher(new LLEventStream("FacebookConnectState")); +boost::scoped_ptr<LLEventPump> LLFacebookConnect::sInfoWatcher(new LLEventStream("FacebookConnectInfo")); +boost::scoped_ptr<LLEventPump> LLFacebookConnect::sContentWatcher(new LLEventStream("FacebookConnectContent")); + +// Local functions +void log_facebook_connect_error(const std::string& request, U32 status, const std::string& reason, const std::string& code, const std::string& description) +{ + // Note: 302 (redirect) is *not* an error that warrants logging + if (status != 302) + { + LL_WARNS("FacebookConnect") << request << " request failed with a " << status << " " << reason << ". Reason: " << code << " (" << description << ")" << LL_ENDL; + } +} + +void toast_user_for_success() +{ + LLSD args; + args["MESSAGE"] = LLTrans::getString("facebook_post_success"); + LLNotificationsUtil::add("FacebookConnect", args); +} + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookConnectHandler : public LLCommandHandler +{ +public: + LLFacebookConnectHandler() : LLCommandHandler("fbc", UNTRUSTED_THROTTLE) { } + + bool handle(const LLSD& tokens, const LLSD& query_map, LLMediaCtrl* web) + { + if (tokens.size() > 0) + { + if (tokens[0].asString() == "connect") + { + // this command probably came from the fbc_web browser, so close it + LLFloater* fbc_web = LLFloaterReg::getInstance("fbc_web"); + if (fbc_web) + { + fbc_web->closeFloater(); + } + + // connect to facebook + if (query_map.has("code")) + { + LLFacebookConnect::instance().connectToFacebook(query_map["code"], query_map.get("state")); + } + return true; + } + } + return false; + } +}; +LLFacebookConnectHandler gFacebookConnectHandler; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookConnectResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookConnectResponder); +public: + + LLFacebookConnectResponder() + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_IN_PROGRESS); + } + + virtual void completed(U32 status, const std::string& reason, const LLSD& content) + { + if (isGoodStatus(status)) + { + LL_DEBUGS("FacebookConnect") << "Connect successful. content: " << content << LL_ENDL; + + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTED); + } + else if (status != 302) + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_FAILED); + log_facebook_connect_error("Connect", status, reason, content.get("error_code"), content.get("error_description")); + } + } + + void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + if (status == 302) + { + LLFacebookConnect::instance().openFacebookWeb(content["location"]); + } + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookShareResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookShareResponder); +public: + + LLFacebookShareResponder() + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_POSTING); + } + + virtual void completed(U32 status, const std::string& reason, const LLSD& content) + { + if (isGoodStatus(status)) + { + toast_user_for_success(); + LL_DEBUGS("FacebookConnect") << "Post successful. content: " << content << LL_ENDL; + + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_POSTED); + } + else if (status == 404) + { + LLFacebookConnect::instance().connectToFacebook(); + } + else + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_POST_FAILED); + log_facebook_connect_error("Share", status, reason, content.get("error_code"), content.get("error_description")); + } + } + + void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + if (status == 302) + { + LLFacebookConnect::instance().openFacebookWeb(content["location"]); + } + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookDisconnectResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookDisconnectResponder); +public: + + LLFacebookDisconnectResponder() + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_DISCONNECTING); + } + + void setUserDisconnected() + { + // Clear data + LLFacebookConnect::instance().clearInfo(); + LLFacebookConnect::instance().clearContent(); + //Notify state change + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_NOT_CONNECTED); + } + + virtual void completed(U32 status, const std::string& reason, const LLSD& content) + { + if (isGoodStatus(status)) + { + LL_DEBUGS("FacebookConnect") << "Disconnect successful. content: " << content << LL_ENDL; + setUserDisconnected(); + + } + //User not found so already disconnected + else if(status == 404) + { + LL_DEBUGS("FacebookConnect") << "Already disconnected. content: " << content << LL_ENDL; + setUserDisconnected(); + } + else + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_DISCONNECT_FAILED); + log_facebook_connect_error("Disconnect", status, reason, content.get("error_code"), content.get("error_description")); + } + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookConnectedResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookConnectedResponder); +public: + + LLFacebookConnectedResponder(bool auto_connect) : mAutoConnect(auto_connect) + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_IN_PROGRESS); + } + + virtual void completed(U32 status, const std::string& reason, const LLSD& content) + { + if (isGoodStatus(status)) + { + LL_DEBUGS("FacebookConnect") << "Connect successful. content: " << content << LL_ENDL; + + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTED); + } + else + { + // show the facebook login page if not connected yet + if (status == 404) + { + if (mAutoConnect) + { + LLFacebookConnect::instance().connectToFacebook(); + } + else + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_NOT_CONNECTED); + } + } + else + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_FAILED); + log_facebook_connect_error("Connected", status, reason, content.get("error_code"), content.get("error_description")); + } + } + } + +private: + bool mAutoConnect; +}; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookInfoResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookInfoResponder); +public: + + virtual void completed(U32 status, const std::string& reason, const LLSD& info) + { + if (isGoodStatus(status)) + { + llinfos << "Facebook: Info received" << llendl; + LL_DEBUGS("FacebookConnect") << "Getting Facebook info successful. info: " << info << LL_ENDL; + LLFacebookConnect::instance().storeInfo(info); + } + else + { + log_facebook_connect_error("Info", status, reason, info.get("error_code"), info.get("error_description")); + } + } + + void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + if (status == 302) + { + LLFacebookConnect::instance().openFacebookWeb(content["location"]); + } + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +class LLFacebookFriendsResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLFacebookFriendsResponder); +public: + + virtual void completed(U32 status, const std::string& reason, const LLSD& content) + { + if (isGoodStatus(status)) + { + LL_DEBUGS("FacebookConnect") << "Getting Facebook friends successful. content: " << content << LL_ENDL; + LLFacebookConnect::instance().storeContent(content); + } + else + { + log_facebook_connect_error("Friends", status, reason, content.get("error_code"), content.get("error_description")); + } + } + + void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + if (status == 302) + { + LLFacebookConnect::instance().openFacebookWeb(content["location"]); + } + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// +LLFacebookConnect::LLFacebookConnect() +: mConnectionState(FB_NOT_CONNECTED), + mConnected(false), + mInfo(), + mContent(), + mRefreshInfo(false), + mRefreshContent(false), + mReadFromMaster(false) +{ +} + +void LLFacebookConnect::openFacebookWeb(std::string url) +{ + // Open the URL in an internal browser window without navigation UI + LLFloaterWebContent::Params p; + p.url(url).show_chrome(true); + p.url(url).allow_address_entry(false); + p.url(url).allow_back_forward_navigation(false); + p.url(url).trusted_content(true); + LLFloater *floater = LLFloaterReg::showInstance("fbc_web", p); + //the internal web browser has a bug that prevents it from gaining focus unless a mouse event occurs first (it seems). + //So when showing the internal web browser, set focus to it's containing floater "fbc_web". When a mouse event + //occurs on the "webbrowser" panel part of the floater, a mouse cursor will properly show and the "webbrowser" will gain focus. + //fbc_web floater contains the "webbrowser" panel. JIRA: ACME-744 + gFocusMgr.setKeyboardFocus( floater ); + + //LLUrlAction::openURLExternal(url); +} + +std::string LLFacebookConnect::getFacebookConnectURL(const std::string& route, bool include_read_from_master) +{ + std::string url(""); + LLViewerRegion *regionp = gAgent.getRegion(); + if (regionp) + { + url = regionp->getCapability("FacebookConnect"); + url += route; + + if (include_read_from_master && mReadFromMaster) + { + url += "?read_from_master=true"; + } + } + return url; +} + +void LLFacebookConnect::connectToFacebook(const std::string& auth_code, const std::string& auth_state) +{ + LLSD body; + if (!auth_code.empty()) + body["code"] = auth_code; + if (!auth_state.empty()) + body["state"] = auth_state; + + LLHTTPClient::put(getFacebookConnectURL("/connection"), body, new LLFacebookConnectResponder()); +} + +void LLFacebookConnect::disconnectFromFacebook() +{ + LLHTTPClient::del(getFacebookConnectURL("/connection"), new LLFacebookDisconnectResponder()); +} + +void LLFacebookConnect::checkConnectionToFacebook(bool auto_connect) +{ + const bool follow_redirects = false; + const F32 timeout = HTTP_REQUEST_EXPIRY_SECS; + LLHTTPClient::get(getFacebookConnectURL("/connection", true), new LLFacebookConnectedResponder(auto_connect), + LLSD(), timeout, follow_redirects); +} + +void LLFacebookConnect::loadFacebookInfo() +{ + if(mRefreshInfo) + { + const bool follow_redirects = false; + const F32 timeout = HTTP_REQUEST_EXPIRY_SECS; + LLHTTPClient::get(getFacebookConnectURL("/info", true), new LLFacebookInfoResponder(), + LLSD(), timeout, follow_redirects); + } +} + +void LLFacebookConnect::loadFacebookFriends() +{ + if(mRefreshContent) + { + const bool follow_redirects = false; + const F32 timeout = HTTP_REQUEST_EXPIRY_SECS; + LLHTTPClient::get(getFacebookConnectURL("/friends", true), new LLFacebookFriendsResponder(), + LLSD(), timeout, follow_redirects); + } +} + +void LLFacebookConnect::postCheckin(const std::string& location, const std::string& name, const std::string& description, const std::string& image, const std::string& message) +{ + LLSD body; + if (!location.empty()) + body["location"] = location; + if (!name.empty()) + body["name"] = name; + if (!description.empty()) + body["description"] = description; + if (!image.empty()) + body["image"] = image; + if (!message.empty()) + body["message"] = message; + + // Note: we can use that route for different publish action. We should be able to use the same responder. + LLHTTPClient::post(getFacebookConnectURL("/share/checkin", true), body, new LLFacebookShareResponder()); +} + +void LLFacebookConnect::sharePhoto(const std::string& image_url, const std::string& caption) +{ + LLSD body; + body["image"] = image_url; + body["caption"] = caption; + + // Note: we can use that route for different publish action. We should be able to use the same responder. + LLHTTPClient::post(getFacebookConnectURL("/share/photo", true), body, new LLFacebookShareResponder()); +} + +void LLFacebookConnect::sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption) +{ + std::string imageFormat; + if (dynamic_cast<LLImagePNG*>(image.get())) + { + imageFormat = "png"; + } + else if (dynamic_cast<LLImageJPEG*>(image.get())) + { + imageFormat = "jpg"; + } + else + { + llwarns << "Image to upload is not a PNG or JPEG" << llendl; + return; + } + + // All this code is mostly copied from LLWebProfile::post() + const std::string boundary = "----------------------------0123abcdefab"; + + LLSD headers; + headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + + std::ostringstream body; + + // *NOTE: The order seems to matter. + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"caption\"\r\n\r\n" + << caption << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"image\"; filename=\"snapshot." << imageFormat << "\"\r\n" + << "Content-Type: image/" << imageFormat << "\r\n\r\n"; + + // Insert the image data. + // *FIX: Treating this as a string will probably screw it up ... + U8* image_data = image->getData(); + for (S32 i = 0; i < image->getDataSize(); ++i) + { + body << image_data[i]; + } + + body << "\r\n--" << boundary << "--\r\n"; + + // postRaw() takes ownership of the buffer and releases it later. + size_t size = body.str().size(); + U8 *data = new U8[size]; + memcpy(data, body.str().data(), size); + + // Note: we can use that route for different publish action. We should be able to use the same responder. + LLHTTPClient::postRaw(getFacebookConnectURL("/share/photo", true), data, size, new LLFacebookShareResponder(), headers); +} + +void LLFacebookConnect::updateStatus(const std::string& message) +{ + LLSD body; + body["message"] = message; + + // Note: we can use that route for different publish action. We should be able to use the same responder. + LLHTTPClient::post(getFacebookConnectURL("/share/wall", true), body, new LLFacebookShareResponder()); +} + +void LLFacebookConnect::storeInfo(const LLSD& info) +{ + mInfo = info; + mRefreshInfo = false; + + sInfoWatcher->post(info); +} + +const LLSD& LLFacebookConnect::getInfo() const +{ + return mInfo; +} + +void LLFacebookConnect::clearInfo() +{ + mInfo = LLSD(); +} + +void LLFacebookConnect::storeContent(const LLSD& content) +{ + mContent = content; + mRefreshContent = false; + + sContentWatcher->post(content); +} + +const LLSD& LLFacebookConnect::getContent() const +{ + return mContent; +} + +void LLFacebookConnect::clearContent() +{ + mContent = LLSD(); +} + +void LLFacebookConnect::setDataDirty() +{ + mRefreshInfo = true; + mRefreshContent = true; +} + +void LLFacebookConnect::setConnectionState(LLFacebookConnect::EConnectionState connection_state) +{ + if(connection_state == FB_CONNECTED) + { + mReadFromMaster = true; + setConnected(true); + setDataDirty(); + } + else if(connection_state == FB_NOT_CONNECTED) + { + setConnected(false); + } + else if(connection_state == FB_POSTED) + { + mReadFromMaster = false; + } + + if (mConnectionState != connection_state) + { + LLSD state_info; + state_info["enum"] = connection_state; + sStateWatcher->post(state_info); + } + + mConnectionState = connection_state; +} + +void LLFacebookConnect::setConnected(bool connected) +{ + mConnected = connected; +} diff --git a/indra/newview/llfacebookconnect.h b/indra/newview/llfacebookconnect.h new file mode 100644 index 0000000000..a77ac24167 --- /dev/null +++ b/indra/newview/llfacebookconnect.h @@ -0,0 +1,106 @@ +/** + * @file llfacebookconnect.h + * @author Merov, Cho, Gil + * @brief Connection to Facebook Service + * + * $LicenseInfo:firstyear=2013&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2013, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFACEBOOKCONNECT_H +#define LL_LLFACEBOOKCONNECT_H + +#include "llsingleton.h" +#include "llimage.h" + +class LLEventPump; + +/** + * @class LLFacebookConnect + * + * Manages authentication to, and interaction with, a web service allowing the + * the viewer to get Facebook OpenGraph data. + */ +class LLFacebookConnect : public LLSingleton<LLFacebookConnect> +{ + LOG_CLASS(LLFacebookConnect); +public: + enum EConnectionState + { + FB_NOT_CONNECTED = 0, + FB_CONNECTION_IN_PROGRESS = 1, + FB_CONNECTED = 2, + FB_CONNECTION_FAILED = 3, + FB_POSTING = 4, + FB_POSTED = 5, + FB_POST_FAILED = 6, + FB_DISCONNECTING = 7, + FB_DISCONNECT_FAILED = 8 + }; + + void connectToFacebook(const std::string& auth_code = "", const std::string& auth_state = ""); // Initiate the complete FB connection. Please use checkConnectionToFacebook() in normal use. + void disconnectFromFacebook(); // Disconnect from the FBC service. + void checkConnectionToFacebook(bool auto_connect = false); // Check if an access token is available on the FBC service. If not, call connectToFacebook(). + + void loadFacebookInfo(); + void loadFacebookFriends(); + void postCheckin(const std::string& location, const std::string& name, const std::string& description, const std::string& picture, const std::string& message); + void sharePhoto(const std::string& image_url, const std::string& caption); + void sharePhoto(LLPointer<LLImageFormatted> image, const std::string& caption); + void updateStatus(const std::string& message); + + void storeInfo(const LLSD& info); + const LLSD& getInfo() const; + void clearInfo(); + void storeContent(const LLSD& content); + const LLSD& getContent() const; + void clearContent(); + void setDataDirty(); + + void setConnectionState(EConnectionState connection_state); + void setConnected(bool connected); + bool isConnected() { return mConnected; } + bool isTransactionOngoing() { return ((mConnectionState == FB_CONNECTION_IN_PROGRESS) || (mConnectionState == FB_POSTING) || (mConnectionState == FB_DISCONNECTING)); } + EConnectionState getConnectionState() { return mConnectionState; } + + void openFacebookWeb(std::string url); + +private: + friend class LLSingleton<LLFacebookConnect>; + + LLFacebookConnect(); + ~LLFacebookConnect() {}; + std::string getFacebookConnectURL(const std::string& route = "", bool include_read_from_master = false); + + EConnectionState mConnectionState; + BOOL mConnected; + LLSD mInfo; + LLSD mContent; + bool mRefreshInfo; + bool mRefreshContent; + bool mReadFromMaster; + + static boost::scoped_ptr<LLEventPump> sStateWatcher; + static boost::scoped_ptr<LLEventPump> sInfoWatcher; + static boost::scoped_ptr<LLEventPump> sContentWatcher; +}; + +#endif // LL_LLFACEBOOKCONNECT_H diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index 8e1a1df211..06119620de 100755 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -1545,7 +1545,7 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std:: return ; } } -void LLFastTimerView::onClickCloseBtn() +void LLFastTimerView::onClickCloseBtn(bool) { setVisible(false); } diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index 5766cfa0b0..1349b1e99c 100755 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -63,7 +63,7 @@ public: F64 getTime(const std::string& name); protected: - virtual void onClickCloseBtn(); + virtual void onClickCloseBtn(bool app_quitting = false); private: typedef std::vector<std::vector<S32> > bar_positions_t; bar_positions_t mBarStart; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index c47618e1ec..ba6f26d3ef 100755 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -350,7 +350,7 @@ bool LLFeatureManager::parseFeatureTable(std::string filename) } mTableVersion = version; - + LLFeatureList *flp = NULL; bool parse_ok = true; while (file >> name && parse_ok) @@ -381,11 +381,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename) file >> name; if (!mMaskList.count(name)) { - flp = new LLFeatureList(name); - mMaskList[name] = flp; - } - else - { + flp = new LLFeatureList(name); + mMaskList[name] = flp; + } + else + { LL_WARNS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL; parse_ok = false; } @@ -394,11 +394,11 @@ bool LLFeatureManager::parseFeatureTable(std::string filename) { if (flp) { - S32 available; - F32 recommended; - file >> available >> recommended; - flp->addFeature(name, available, recommended); - } + S32 available; + F32 recommended; + file >> available >> recommended; + flp->addFeature(name, available, recommended); + } else { LL_WARNS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; @@ -444,7 +444,7 @@ bool LLFeatureManager::loadGPUClass() // the HTTP table failed to parse, so delete it LLFile::remove(http_path); LL_WARNS("RenderInit") << "Removed invalid gpu table '" << http_path << "'" << LL_ENDL; - } + } } if (!parse_ok) @@ -459,7 +459,7 @@ bool LLFeatureManager::loadGPUClass() bool LLFeatureManager::parseGPUTable(std::string filename) { llifstream file; - + LL_INFOS("RenderInit") << "Attempting to parse GPU table from " << filename << LL_ENDL; file.open(filename); @@ -925,6 +925,14 @@ void LLFeatureManager::applyBaseMasks() maskFeatures("VRAMGT512"); } +#if LL_DARWIN + const LLOSInfo& osInfo = LLAppViewer::instance()->getOSInfo(); + if (osInfo.mMajorVer == 10 && osInfo.mMinorVer < 7) + { + maskFeatures("OSX_10_6_8"); + } +#endif + // now mask by gpu string // Replaces ' ' with '_' in mGPUString to deal with inability for parser to handle spaces std::string gpustr = mGPUString; diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index c151b51c23..16eacc9392 100755 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -422,6 +422,19 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) L"PNG Images (*.png)\0*.png\0" \ L"\0"; break; + case FFSAVE_TGAPNG: + if (filename.empty()) + { + wcsncpy( mFilesW,L"untitled.png", FILENAME_BUFFER_SIZE); /*Flawfinder: ignore*/ + //PNG by default + } + mOFN.lpstrDefExt = L"png"; + mOFN.lpstrFilter = + L"PNG Images (*.png)\0*.png\0" \ + L"Targa Images (*.tga)\0*.tga\0" \ + L"\0"; + break; + case FFSAVE_JPEG: if (filename.empty()) { @@ -640,13 +653,16 @@ bool LLFilePicker::doNavSaveDialog(ESaveFilter filter, const std::string& filena creator = "TVOD"; extension = "wav"; break; - case FFSAVE_TGA: type = "TPIC"; creator = "prvw"; extension = "tga"; break; - + case FFSAVE_TGAPNG: + type = "PNG"; + creator = "prvw"; + extension = "png"; + break; case FFSAVE_BMP: type = "BMPf"; creator = "prvw"; @@ -921,6 +937,22 @@ void LLFilePicker::chooser_responder(GtkWidget *widget, gint response, gpointer g_slist_free (file_list); } + // let's save the extension of the last added file(considering current filter) + GtkFileFilter *gfilter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(widget)); + if(gfilter) + { + std::string filter = gtk_file_filter_get_name(gfilter); + + if(filter == LLTrans::getString("png_image_files")) + { + picker->mCurrentExtension = ".png"; + } + else if(filter == LLTrans::getString("targa_image_files")) + { + picker->mCurrentExtension = ".tga"; + } + } + // set the default path for this usage context. const char* cur_folder = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(widget)); if (cur_folder != NULL) @@ -1092,6 +1124,24 @@ static std::string add_dictionary_filter_to_gtkchooser(GtkWindow *picker) LLTrans::getString("dictionary_files") + " (*.dic; *.xcu)"); } +static std::string add_save_texture_filter_to_gtkchooser(GtkWindow *picker) +{ + GtkFileFilter *gfilter_tga = gtk_file_filter_new(); + GtkFileFilter *gfilter_png = gtk_file_filter_new(); + + gtk_file_filter_add_pattern(gfilter_tga, "*.tga"); + gtk_file_filter_add_mime_type(gfilter_png, "image/png"); + std::string caption = LLTrans::getString("save_texture_image_files") + " (*.tga; *.png)"; + gtk_file_filter_set_name(gfilter_tga, LLTrans::getString("targa_image_files").c_str()); + gtk_file_filter_set_name(gfilter_png, LLTrans::getString("png_image_files").c_str()); + + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), + gfilter_png); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(picker), + gfilter_tga); + return caption; +} + BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ) { BOOL rtn = FALSE; @@ -1129,6 +1179,15 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename (picker, "image/bmp", LLTrans::getString("bitmap_image_files") + " (*.bmp)"); suggest_ext = ".bmp"; break; + case FFSAVE_PNG: + caption += add_simple_mime_filter_to_gtkchooser + (picker, "image/png", LLTrans::getString("png_image_files") + " (*.png)"); + suggest_ext = ".png"; + break; + case FFSAVE_TGAPNG: + caption += add_save_texture_filter_to_gtkchooser(picker); + suggest_ext = ".png"; + break; case FFSAVE_AVI: caption += add_simple_mime_filter_to_gtkchooser (picker, "video/x-msvideo", @@ -1181,9 +1240,17 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename } gtk_widget_show_all(GTK_WIDGET(picker)); + gtk_main(); rtn = (getFileCount() == 1); + + if(rtn && filter == FFSAVE_TGAPNG) + { + std::string selected_file = mFiles.back(); + mFiles.pop_back(); + mFiles.push_back(selected_file + mCurrentExtension); + } } gViewerWindow->getWindow()->afterDialog(); diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index 0d279f73f3..f0f82c51db 100755 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -107,6 +107,7 @@ public: FFSAVE_PNG = 13, FFSAVE_JPEG = 14, FFSAVE_SCRIPT = 15, + FFSAVE_TGAPNG = 16 }; // open the dialog. This is a modal operation @@ -175,6 +176,8 @@ private: // we remember the last path that was accessed for a particular usage std::map <std::string, std::string> mContextToPathMap; std::string mCurContextName; + // we also remember the extension of the last added file. + std::string mCurrentExtension; #endif std::vector<std::string> mFiles; diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index fea8e34729..4331a63346 100755 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -70,8 +70,6 @@ extern LLMemoryInfo gSysMemory; extern U32 gPacketsIn; -static std::string get_viewer_release_notes_url(); - ///---------------------------------------------------------------------------- /// Class LLServerReleaseNotesURLFetcher ///---------------------------------------------------------------------------- @@ -108,8 +106,6 @@ public: static LLSD getInfo(); void onClickCopyToClipboard(); - void updateServerReleaseNotesURL(const std::string& url); - private: void setSupportText(const std::string& server_release_notes_url); }; @@ -219,107 +215,9 @@ BOOL LLFloaterAbout::postBuild() return TRUE; } -// static LLSD LLFloaterAbout::getInfo() { - // The point of having one method build an LLSD info block and the other - // construct the user-visible About string is to ensure that the same info - // is available to a getInfo() caller as to the user opening - // LLFloaterAbout. - LLSD info; - LLSD version; - version.append(LLVersionInfo::getMajor()); - version.append(LLVersionInfo::getMinor()); - version.append(LLVersionInfo::getPatch()); - version.append(LLVersionInfo::getBuild()); - info["VIEWER_VERSION"] = version; - info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion(); - info["BUILD_DATE"] = __DATE__; - info["BUILD_TIME"] = __TIME__; - info["CHANNEL"] = LLVersionInfo::getChannel(); - - info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url(); - -#if LL_MSVC - info["COMPILER"] = "MSVC"; - info["COMPILER_VERSION"] = _MSC_VER; -#elif LL_GNUC - info["COMPILER"] = "GCC"; - info["COMPILER_VERSION"] = GCC_VERSION; -#endif - - // Position - LLViewerRegion* region = gAgent.getRegion(); - if (region) - { - LLVector3d pos = gAgent.getPositionGlobal(); - info["POSITION"] = ll_sd_from_vector3d(pos); - info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos)); - info["REGION"] = gAgent.getRegion()->getName(); - info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName(); - info["HOSTIP"] = gAgent.getRegion()->getHost().getString(); - info["SERVER_VERSION"] = gLastVersionChannel; - LLSLURL slurl; - LLAgentUI::buildSLURL(slurl); - info["SLURL"] = slurl.getSLURLString(); - } - - // CPU - info["CPU"] = gSysCPU.getCPUString(); - info["MEMORY_MB"] = LLSD::Integer(gSysMemory.getPhysicalMemoryKB() / 1024); - // Moved hack adjustment to Windows memory size into llsys.cpp - info["OS_VERSION"] = LLAppViewer::instance()->getOSInfo().getOSString(); - info["GRAPHICS_CARD_VENDOR"] = (const char*)(glGetString(GL_VENDOR)); - info["GRAPHICS_CARD"] = (const char*)(glGetString(GL_RENDERER)); - -#if LL_WINDOWS - LLSD driver_info = gDXHardware.getDisplayInfo(); - if (driver_info.has("DriverVersion")) - { - info["GRAPHICS_DRIVER_VERSION"] = driver_info["DriverVersion"]; - } -#endif - - info["OPENGL_VERSION"] = (const char*)(glGetString(GL_VERSION)); - info["LIBCURL_VERSION"] = LLCurl::getVersionString(); - info["J2C_VERSION"] = LLImageJ2C::getEngineInfo(); - bool want_fullname = true; - info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); - if(LLVoiceClient::getInstance()->voiceEnabled()) - { - LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion(); - std::ostringstream version_string; - version_string << version.serverType << " " << version.serverVersion << std::endl; - info["VOICE_VERSION"] = version_string.str(); - } - else - { - info["VOICE_VERSION"] = LLTrans::getString("NotConnected"); - } - - // TODO: Implement media plugin version query - info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; - - if (gPacketsIn > 0) - { - info["PACKETS_LOST"] = LLViewerStats::getInstance()->mPacketsLostStat.getCurrent(); - info["PACKETS_IN"] = F32(gPacketsIn); - info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); - } - - return info; -} - -static std::string get_viewer_release_notes_url() -{ - // return a URL to the release notes for this viewer, such as: - // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0.123456 - std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); - if (! LLStringUtil::endsWith(url, "/")) - url += "/"; - url += LLVersionInfo::getChannel() + "/"; - url += LLVersionInfo::getVersion(); - return LLWeb::escapeURL(url); + return LLAppViewer::instance()->getViewerInfo(); } class LLFloaterAboutListener: public LLEventAPI @@ -356,93 +254,22 @@ void LLFloaterAbout::onClickCopyToClipboard() support_widget->deselect(); } -void LLFloaterAbout::updateServerReleaseNotesURL(const std::string& url) -{ - setSupportText(url); -} - void LLFloaterAbout::setSupportText(const std::string& server_release_notes_url) { #if LL_WINDOWS getWindow()->incBusyCount(); getWindow()->setCursor(UI_CURSOR_ARROW); #endif - LLSD info(getInfo()); #if LL_WINDOWS getWindow()->decBusyCount(); getWindow()->setCursor(UI_CURSOR_ARROW); #endif - if (LLStringUtil::startsWith(server_release_notes_url, "http")) // it's an URL - { - info["SERVER_RELEASE_NOTES_URL"] = "[" + LLWeb::escapeURL(server_release_notes_url) + " " + LLTrans::getString("ReleaseNotes") + "]"; - } - else - { - info["SERVER_RELEASE_NOTES_URL"] = server_release_notes_url; - } - LLViewerTextEditor *support_widget = getChild<LLViewerTextEditor>("support_editor", true); - std::ostringstream support; - - // Render the LLSD from getInfo() as a format_map_t - LLStringUtil::format_map_t args; - - // allow the "Release Notes" URL label to be localized - args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes"); - - for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap()); - ii != iend; ++ii) - { - if (! ii->second.isArray()) - { - // Scalar value - if (ii->second.isUndefined()) - { - args[ii->first] = getString("none"); - } - else - { - // don't forget to render value asString() - args[ii->first] = ii->second.asString(); - } - } - else - { - // array value: build KEY_0, KEY_1 etc. entries - for (LLSD::Integer n(0), size(ii->second.size()); n < size; ++n) - { - args[STRINGIZE(ii->first << '_' << n)] = ii->second[n].asString(); - } - } - } - - // Now build the various pieces - support << getString("AboutHeader", args); - if (info.has("REGION")) - { - support << "\n\n" << getString("AboutPosition", args); - } - support << "\n\n" << getString("AboutSystem", args); - support << "\n"; - if (info.has("GRAPHICS_DRIVER_VERSION")) - { - support << "\n" << getString("AboutDriver", args); - } - support << "\n" << getString("AboutLibs", args); - if (info.has("COMPILER")) - { - support << "\n" << getString("AboutCompiler", args); - } - if (info.has("PACKETS_IN")) - { - support << '\n' << getString("AboutTraffic", args); - } - support_widget->clear(); - support_widget->appendText(support.str(), + support_widget->appendText(LLAppViewer::instance()->getViewerInfoString(), FALSE, LLStyle::Params() .color(LLUIColorTable::instance().getColor("TextFgReadOnlyColor"))); @@ -489,9 +316,9 @@ void LLServerReleaseNotesURLFetcher::completedHeader(U32 status, const std::stri std::string location = content["location"].asString(); if (location.empty()) { - location = floater_about->getString("ErrorFetchingServerReleaseNotesURL"); + location = LLTrans::getString("ErrorFetchingServerReleaseNotesURL"); } - floater_about->updateServerReleaseNotesURL(location); + LLAppViewer::instance()->setServerReleaseNotesURL(location); } } diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 76f62a7880..07bd262c00 100755 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -82,6 +82,11 @@ BOOL LLFloaterBulkPermission::postBuild() mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy"); mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer"); + // fix invalid permissions case (in case initial settings were generated by a viewer affected by MAINT-3339) + if( !mBulkChangeNextOwnerTransfer && !mBulkChangeEveryoneCopy) + { + mBulkChangeNextOwnerTransfer = true; + } return TRUE; } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index c85d048c5a..d0939b3eee 100755 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -151,7 +151,7 @@ void LLPanelCameraItem::setValue(const LLSD& value) getChildView("selected_picture")->setVisible( value["selected"]); } -static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); +static LLPanelInjector<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel"); //------------------------------------------------------------------------------- // LLPanelCameraZoom diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index 4a85160f95..a303c2c6b3 100755 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -44,7 +44,8 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")), mAccountName(session_id[LL_FCP_ACCOUNT_NAME]), mCompleteName(session_id[LL_FCP_COMPLETE_NAME]), - mMutex(NULL) + mMutex(NULL), + mShowHistory(false) { } @@ -91,7 +92,6 @@ BOOL LLFloaterConversationPreview::postBuild() mPageSpinner->setMinValue(1); mPageSpinner->set(1); mPageSpinner->setEnabled(false); - mChatHistoryLoaded = false; LLLogChat::startChatHistoryThread(file, load_params); return LLFloater::postBuild(); } @@ -111,33 +111,29 @@ void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std: std::string total_page_num = llformat("/ %d", mCurrentPage+1); getChild<LLTextBox>("page_num_label")->setValue(total_page_num); - mChatHistoryLoaded = true; + mShowHistory = true; } } void LLFloaterConversationPreview::draw() { - if(mChatHistoryLoaded) + if(mShowHistory) { showHistory(); - mChatHistoryLoaded = false; + mShowHistory = false; } LLFloater::draw(); } void LLFloaterConversationPreview::onOpen(const LLSD& key) { - if(mChatHistoryLoaded) - { - showHistory(); - } + mShowHistory = true; } void LLFloaterConversationPreview::showHistory() { - // additional protection to avoid changes of mMessages in setPages() + // additional protection to avoid changes of mMessages in setPages LLMutexLock lock(&mMutex); - if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size()) { return; @@ -198,10 +194,11 @@ void LLFloaterConversationPreview::showHistory() void LLFloaterConversationPreview::onMoreHistoryBtnClick() { mCurrentPage = (int)(mPageSpinner->getValueF32()); - if (--mCurrentPage < 0) + if (!mCurrentPage) { return; } - showHistory(); + mCurrentPage--; + mShowHistory = true; } diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h index f8796127ba..b0488f4ff1 100755 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -62,7 +62,7 @@ private: std::string mAccountName; std::string mCompleteName; std::string mChatHistoryFileName; - bool mChatHistoryLoaded; + bool mShowHistory; }; #endif /* LLFLOATERCONVERSATIONPREVIEW_H_ */ diff --git a/indra/newview/llfloatereditdaycycle.cpp b/indra/newview/llfloatereditdaycycle.cpp index b63677b258..78e20e3bf0 100755 --- a/indra/newview/llfloatereditdaycycle.cpp +++ b/indra/newview/llfloatereditdaycycle.cpp @@ -145,7 +145,7 @@ void LLFloaterEditDayCycle::initCallbacks(void) // Connect to env manager events. LLEnvManagerNew& env_mgr = LLEnvManagerNew::instance(); env_mgr.setRegionSettingsChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsChange, this)); - env_mgr.setRegionChangeCallback(boost::bind(&LLFloaterEditDayCycle::onRegionChange, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLFloaterEditDayCycle::onRegionChange, this)); env_mgr.setRegionSettingsAppliedCallback(boost::bind(&LLFloaterEditDayCycle::onRegionSettingsApplied, this, _1)); // Connect to day cycle manager events. diff --git a/indra/newview/llfloatergroupinvite.cpp b/indra/newview/llfloatergroupinvite.cpp index 49da4e64b3..d0f3289769 100755 --- a/indra/newview/llfloatergroupinvite.cpp +++ b/indra/newview/llfloatergroupinvite.cpp @@ -30,6 +30,8 @@ #include "llpanelgroupinvite.h" #include "lltrans.h" #include "lldraghandle.h" +#include "llagent.h" +#include "llgroupmgr.h" class LLFloaterGroupInvite::impl { @@ -123,6 +125,12 @@ void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agen LLFloaterGroupInvite *fgi = get_if_there(impl::sInstances, group_id, (LLFloaterGroupInvite*)NULL); + + // refresh group information + gAgent.sendAgentDataUpdateRequest(); + LLGroupMgr::getInstance()->clearGroupData(group_id); + + if (!fgi) { fgi = new LLFloaterGroupInvite(group_id); diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index 2c3b34e128..566f9bc9cc 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -88,12 +88,10 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param LLFloaterIMContainer::~LLFloaterIMContainer() { mConversationsEventStream.stopListening("ConversationsRefresh"); - gIdleCallbacks.deleteFunction(idle, this); - mNewMessageConnection.disconnect(); LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this); - + if (mMicroChangedSignal.connected()) { mMicroChangedSignal.disconnect(); @@ -101,6 +99,7 @@ LLFloaterIMContainer::~LLFloaterIMContainer() gSavedPerAccountSettings.setBOOL("ConversationsListPaneCollapsed", mConversationsPane->isCollapsed()); gSavedPerAccountSettings.setBOOL("ConversationsMessagePaneCollapsed", mMessagesPane->isCollapsed()); + gSavedPerAccountSettings.setBOOL("ConversationsParticipantListCollapsed", !isParticipantListExpanded()); if (!LLSingleton<LLIMMgr>::destroyed()) { @@ -250,6 +249,11 @@ BOOL LLFloaterIMContainer::postBuild() // Init the sort order now that the root had been created setSortOrder(LLConversationSort(gSavedSettings.getU32("ConversationSortOrder"))); + //We should expand nearby chat participants list for the new user + if(gAgent.isFirstLogin() || !gSavedPerAccountSettings.getBOOL("ConversationsParticipantListCollapsed")) + { + expandConversation(); + } // Keep the xml set title around for when we have to overwrite it mGeneralTitle = getTitle(); @@ -662,10 +666,10 @@ void LLFloaterIMContainer::setVisible(BOOL visible) LLFloater* session_floater = widget->getSessionFloater(); if (session_floater != nearby_chat) { - widget->setVisibleIfDetached(visible); - } + widget->setVisibleIfDetached(visible); } } + } // Now, do the normal multifloater show/hide LLMultiFloater::setVisible(visible); @@ -700,13 +704,13 @@ void LLFloaterIMContainer::setVisibleAndFrontmost(BOOL take_focus, const LLSD& k // Only select other sessions if (!getSelectedSession().isNull()) { - selectConversationPair(getSelectedSession(), false, take_focus); + selectConversationPair(getSelectedSession(), false, take_focus); } if (mInitialized && mIsFirstLaunch) { collapseMessagesPane(gSavedPerAccountSettings.getBOOL("ConversationsMessagePaneCollapsed")); mIsFirstLaunch = false; - } +} } void LLFloaterIMContainer::updateResizeLimits() @@ -715,6 +719,16 @@ void LLFloaterIMContainer::updateResizeLimits() assignResizeLimits(); } +bool LLFloaterIMContainer::isMessagesPaneCollapsed() +{ + return mMessagesPane->isCollapsed(); +} + +bool LLFloaterIMContainer::isConversationsPaneCollapsed() +{ + return mConversationsPane->isCollapsed(); +} + void LLFloaterIMContainer::collapseMessagesPane(bool collapse) { if (mMessagesPane->isCollapsed() == collapse) @@ -784,8 +798,8 @@ void LLFloaterIMContainer::collapseConversationsPane(bool collapse, bool save_is mConversationsPane->setTargetDim(gSavedPerAccountSettings.getS32("ConversationsListPaneWidth")); } - S32 delta_width = - gSavedPerAccountSettings.getS32("ConversationsListPaneWidth") - mConversationsPane->getMinDim(); + S32 delta_width = gSavedPerAccountSettings.getS32("ConversationsListPaneWidth") + - mConversationsPane->getMinDim() - mConversationsStack->getPanelSpacing() + 1; reshapeFloaterAndSetResizeLimits(collapse, delta_width); @@ -834,7 +848,7 @@ void LLFloaterIMContainer::assignResizeLimits() S32 conv_pane_target_width = is_conv_pane_expanded ? ( is_msg_pane_expanded?mConversationsPane->getRect().getWidth():mConversationsPane->getExpandedMinDim() ) - : mConversationsPane->getMinDim(); + : mConversationsPane->getMinDim(); S32 msg_pane_min_width = is_msg_pane_expanded ? mMessagesPane->getExpandedMinDim() : 0; S32 new_min_width = conv_pane_target_width + msg_pane_min_width + summary_width_of_visible_borders; @@ -995,7 +1009,7 @@ void LLFloaterIMContainer::setSortOrder(const LLConversationSort& order) conversation_floater->setSortOrder(order); } } - + gSavedSettings.setU32("ConversationSortOrder", (U32)order); } @@ -1080,6 +1094,10 @@ void LLFloaterIMContainer::doToParticipants(const std::string& command, uuid_vec { LLAvatarActions::offerTeleport(selectedIDS); } + else if ("request_teleport" == command) + { + LLAvatarActions::teleportRequest(selectedIDS.front()); + } else if ("voice_call" == command) { LLAvatarActions::startCall(userID); @@ -1182,7 +1200,7 @@ void LLFloaterIMContainer::doToSelectedConversation(const std::string& command, } else if("chat_history" == command) { - if (selectedIDS.size() > 0) + if (selectedIDS.size() > 0) { LLAvatarActions::viewChatHistory(selectedIDS.front()); } @@ -1204,7 +1222,7 @@ void LLFloaterIMContainer::doToSelectedConversation(const std::string& command, { LLFloaterReg::showInstance("preview_conversation", LLSD(LLUUID::null), true); } - } +} } } @@ -1235,7 +1253,7 @@ void LLFloaterIMContainer::doToSelectedGroup(const LLSD& userdata) if (action == "group_profile") { - LLGroupActions::show(mSelectedSession); + LLGroupActions::show(mSelectedSession); } else if (action == "activate_group") { @@ -2082,6 +2100,19 @@ void LLFloaterIMContainer::expandConversation() } } } +bool LLFloaterIMContainer::isParticipantListExpanded() +{ + bool is_expanded = false; + if(!mConversationsPane->isCollapsed()) + { + LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(get_ptr_in_map(mConversationsWidgets,getSelectedSession())); + if (widget) + { + is_expanded = widget->isOpen(); + } + } + return is_expanded; +} // By default, if torn off session is currently frontmost, LLFloater::isFrontmost() will return FALSE, which can lead to some bugs // So LLFloater::isFrontmost() is overriden here to check both selected session and the IM floater itself @@ -2098,7 +2129,7 @@ BOOL LLFloaterIMContainer::isFrontmost() // For conversations, closeFloater() (linked to Ctrl-W) does not actually close the floater but the active conversation. // This is intentional so it doesn't confuse the user. onClickCloseBtn() closes the whole floater. -void LLFloaterIMContainer::onClickCloseBtn() +void LLFloaterIMContainer::onClickCloseBtn(bool app_quitting/* = false*/) { // Always unminimize before trying to close. // Most of the time the user will never see this state. @@ -2107,7 +2138,7 @@ void LLFloaterIMContainer::onClickCloseBtn() LLMultiFloater::setMinimized(FALSE); } - LLFloater::closeFloater(); + LLFloater::closeFloater(app_quitting); } void LLFloaterIMContainer::closeHostedFloater() @@ -2154,7 +2185,7 @@ void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/) if(app_quitting) { closeAllConversations(); - onClickCloseBtn(); + onClickCloseBtn(app_quitting); } else { diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index 36da457cac..f6d973b9b3 100755 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -90,6 +90,8 @@ public: static void onCurrentChannelChanged(const LLUUID& session_id); void collapseMessagesPane(bool collapse); + bool isMessagesPaneCollapsed(); + bool isConversationsPaneCollapsed(); // Callbacks static void idle(void* user_data); @@ -134,7 +136,7 @@ private: void onStubCollapseButtonClicked(); void processParticipantsStyleUpdate(); void onSpeakButtonClicked(); - /*virtual*/ void onClickCloseBtn(); + /*virtual*/ void onClickCloseBtn(bool app_quitting = false); /*virtual*/ void closeHostedFloater(); void collapseConversationsPane(bool collapse, bool save_is_allowed=true); @@ -172,6 +174,7 @@ private: void toggleAllowTextChat(const LLUUID& participant_uuid); void toggleMute(const LLUUID& participant_id, U32 flags); void openNearbyChat(); + bool isParticipantListExpanded(); LLButton* mExpandCollapseBtn; LLButton* mStubCollapseBtn; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 3d77ea4f0b..323e84751f 100755 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -308,7 +308,8 @@ void LLFloaterIMNearbyChat::onClose(bool app_quitting) } // virtual -void LLFloaterIMNearbyChat::onClickCloseBtn() +void LLFloaterIMNearbyChat::onClickCloseBtn(bool) + { if (!isTornOff()) { @@ -493,11 +494,11 @@ void LLFloaterIMNearbyChat::onChatBoxKeystroke() if (!rest_of_match.empty()) { mInputEditor->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part - // Select to end of line, starting from the character // after the last one the user typed. - mInputEditor->selectNext(rest_of_match, false); + mInputEditor->selectByCursorPosition(utf8_out_str.size()-rest_of_match.size(),utf8_out_str.size()); } + } else if (matchChatTypeTrigger(utf8_trigger, &utf8_out_str)) { diff --git a/indra/newview/llfloaterimnearbychat.h b/indra/newview/llfloaterimnearbychat.h index 05b48cccb0..f0daacd6a9 100755 --- a/indra/newview/llfloaterimnearbychat.h +++ b/indra/newview/llfloaterimnearbychat.h @@ -95,7 +95,7 @@ protected: void onChatFontChange(LLFontGL* fontp); /*virtual*/ void onTearOffClicked(); - /*virtual*/ void onClickCloseBtn(); + /*virtual*/ void onClickCloseBtn(bool app_qutting = false); static LLWString stripChannelNumber(const LLWString &mesg, S32* channel); EChatType processChatTypeTriggers(EChatType type, std::string &str); diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 5cb9df5625..84921849d0 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -61,6 +61,9 @@ #include "llnotificationmanager.h" #include "llautoreplace.h" +const F32 ME_TYPING_TIMEOUT = 4.0f; +const F32 OTHER_TYPING_TIMEOUT = 9.0f; + floater_showed_signal_t LLFloaterIMSession::sIMFloaterShowedSignal; LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id) @@ -75,7 +78,10 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id) mTypingTimer(), mTypingTimeoutTimer(), mPositioned(false), - mSessionInitialized(false) + mSessionInitialized(false), + mMeTypingTimer(), + mOtherTypingTimer(), + mImInfo() { mIsNearbyChat = false; @@ -96,13 +102,31 @@ LLFloaterIMSession::LLFloaterIMSession(const LLUUID& session_id) void LLFloaterIMSession::refresh() { if (mMeTyping) -{ + { + // Send an additional Start Typing packet every ME_TYPING_TIMEOUT seconds + if (mMeTypingTimer.getElapsedTimeF32() > ME_TYPING_TIMEOUT && false == mShouldSendTypingState) + { + LL_DEBUGS("TypingMsgs") << "Send additional Start Typing packet" << LL_ENDL; + LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE); + mMeTypingTimer.reset(); + } + // Time out if user hasn't typed for a while. if (mTypingTimeoutTimer.getElapsedTimeF32() > LLAgent::TYPING_TIMEOUT_SECS) { - setTyping(false); + setTyping(false); + LL_DEBUGS("TypingMsgs") << "Send stop typing due to timeout" << LL_ENDL; } } + + // Clear <name is typing> message if no data received for OTHER_TYPING_TIMEOUT seconds + if (mOtherTyping && mOtherTypingTimer.getElapsedTimeF32() > OTHER_TYPING_TIMEOUT) + { + LL_DEBUGS("TypingMsgs") << "Received: is typing cleared due to timeout" << LL_ENDL; + removeTypingIndicator(mImInfo); + mOtherTyping = false; + } + } // virtual @@ -112,7 +136,7 @@ void LLFloaterIMSession::onTearOffClicked() } // virtual -void LLFloaterIMSession::onClickCloseBtn() +void LLFloaterIMSession::onClickCloseBtn(bool) { LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID); @@ -953,13 +977,21 @@ void LLFloaterIMSession::setTyping(bool typing) // much network traffic. Only send in person-to-person IMs. if ( mShouldSendTypingState && mDialog == IM_NOTHING_SPECIAL ) { - // Still typing, send 'start typing' notification or - // send 'stop typing' notification immediately - if (!mMeTyping || mTypingTimer.getElapsedTimeF32() > 1.f) + if ( mMeTyping ) { - LLIMModel::instance().sendTypingState(mSessionID, - mOtherParticipantUUID, mMeTyping); - mShouldSendTypingState = false; + if ( mTypingTimer.getElapsedTimeF32() > 1.f ) + { + // Still typing, send 'start typing' notification + LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, TRUE); + mShouldSendTypingState = false; + mMeTypingTimer.reset(); + } + } + else + { + // Send 'stop typing' notification immediately + LLIMModel::instance().sendTypingState(mSessionID, mOtherParticipantUUID, FALSE); + mShouldSendTypingState = false; } } @@ -975,10 +1007,12 @@ void LLFloaterIMSession::setTyping(bool typing) void LLFloaterIMSession::processIMTyping(const LLIMInfo* im_info, BOOL typing) { + LL_DEBUGS("TypingMsgs") << "typing=" << typing << LL_ENDL; if ( typing ) { // other user started typing addTypingIndicator(im_info); + mOtherTypingTimer.reset(); } else { @@ -1202,10 +1236,40 @@ BOOL LLFloaterIMSession::inviteToSession(const uuid_vec_t& ids) void LLFloaterIMSession::addTypingIndicator(const LLIMInfo* im_info) { +/* Operation of "<name> is typing" state machine: +Not Typing state: + + User types in P2P IM chat ... Send Start Typing, save Started time, + start Idle Timer (N seconds) go to Typing state + +Typing State: + + User enters a non-return character: if Now - Started > ME_TYPING_TIMEOUT, send + Start Typing, restart Idle Timer + User enters a return character: stop Idle Timer, send IM and Stop + Typing, go to Not Typing state + Idle Timer expires: send Stop Typing, go to Not Typing state + +The recipient has a complementary state machine in which a Start Typing +that is not followed by either an IM or another Start Typing within OTHER_TYPING_TIMEOUT +seconds switches the sender out of typing state. + +This has the nice quality of being self-healing for lost start/stop +messages while adding messages only for the (relatively rare) case of a +user who types a very long message (one that takes more than ME_TYPING_TIMEOUT seconds +to type). + +Note: OTHER_TYPING_TIMEOUT must be > ME_TYPING_TIMEOUT for proper operation of the state machine + +*/ + // We may have lost a "stop-typing" packet, don't add it twice if (im_info && !mOtherTyping) { mOtherTyping = true; + mOtherTypingTimer.reset(); + // Save im_info so that removeTypingIndicator can be properly called because a timeout has occurred + mImInfo = im_info; // Update speaker LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID); diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h index a0e0171b34..2b9d06e744 100755 --- a/indra/newview/llfloaterimsession.h +++ b/indra/newview/llfloaterimsession.h @@ -141,7 +141,7 @@ private: /*virtual*/ void refresh(); /*virtual*/ void onTearOffClicked(); - /*virtual*/ void onClickCloseBtn(); + /*virtual*/ void onClickCloseBtn(bool app_qutting); // Update the window title and input field help text /*virtual*/ void updateSessionName(const std::string& name); @@ -187,6 +187,8 @@ private: LLFrameTimer mTypingTimer; LLFrameTimer mTypingTimeoutTimer; bool mSessionNameUpdatedForTyping; + LLFrameTimer mMeTypingTimer; + LLFrameTimer mOtherTypingTimer; bool mSessionInitialized; LLSD mQueuedMsgsForInit; @@ -196,6 +198,8 @@ private: // connection to voice channel state change signal boost::signals2::connection mVoiceChannelStateChangeConnection; + + const LLIMInfo* mImInfo; }; #endif // LL_FLOATERIMSESSION_H diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp index 0ccfdb9a7b..29511f56ff 100755 --- a/indra/newview/llfloaterimsessiontab.cpp +++ b/indra/newview/llfloaterimsessiontab.cpp @@ -825,6 +825,7 @@ void LLFloaterIMSessionTab::updateCallBtnState(bool callIsActive) void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self) { LLFloaterIMContainer* host_floater = dynamic_cast<LLFloaterIMContainer*>(self->getHost()); + bool should_be_expanded = false; if (host_floater) { // Hide the messages pane if a floater is hosted in the Conversations @@ -835,7 +836,7 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self) if (!self->mIsP2PChat) { // The state must toggle the collapsed state of the panel - bool should_be_expanded = self->mParticipantListPanel->isCollapsed(); + should_be_expanded = self->mParticipantListPanel->isCollapsed(); // Update the expand/collapse flag of the participant list panel and save it gSavedSettings.setBOOL("IMShowControlPanel", should_be_expanded); @@ -847,6 +848,10 @@ void LLFloaterIMSessionTab::onSlide(LLFloaterIMSessionTab* self) } self->assignResizeLimits(); + if (should_be_expanded) + { + self->forceReshape(); + } } void LLFloaterIMSessionTab::onCollapseToLine(LLFloaterIMSessionTab* self) diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 6ef4d8717d..b16ef6dd79 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -1791,10 +1791,15 @@ void LLPanelLandObjects::onCommitClean(LLUICtrl *caller, void* user_data) LLParcel* parcel = lop->mParcel->getParcel(); if (parcel) { - lop->mOtherTime = atoi(lop->mCleanOtherObjectsTime->getText().c_str()); + S32 return_time = atoi(lop->mCleanOtherObjectsTime->getText().c_str()); + // Only send return time if it has changed + if (return_time != lop->mOtherTime) + { + lop->mOtherTime = return_time; - parcel->setCleanOtherTime(lop->mOtherTime); - send_other_clean_time_message(parcel->getLocalID(), lop->mOtherTime); + parcel->setCleanOtherTime(lop->mOtherTime); + send_other_clean_time_message(parcel->getLocalID(), lop->mOtherTime); + } } } @@ -2097,7 +2102,6 @@ void LLPanelLandOptions::refresh() // virtual void LLPanelLandOptions::draw() { - refreshSearch(); // Is this necessary? JC LLPanel::draw(); } @@ -2111,9 +2115,8 @@ void LLPanelLandOptions::refreshSearch() mCheckShowDirectory->set(FALSE); mCheckShowDirectory->setEnabled(FALSE); - // *TODO:Translate - const std::string& none_string = LLParcel::getCategoryUIString(LLParcel::C_NONE); - mCategoryCombo->setSimple(none_string); + const std::string& none_string = LLParcel::getCategoryString(LLParcel::C_NONE); + mCategoryCombo->setValue(none_string); mCategoryCombo->setEnabled(FALSE); return; } @@ -2140,10 +2143,9 @@ void LLPanelLandOptions::refreshSearch() mCheckShowDirectory ->set(show_directory); // Set by string in case the order in UI doesn't match the order by index. - // *TODO:Translate LLParcel::ECategory cat = parcel->getCategory(); - const std::string& category_string = LLParcel::getCategoryUIString(cat); - mCategoryCombo->setSimple(category_string); + const std::string& category_string = LLParcel::getCategoryString(cat); + mCategoryCombo->setValue(category_string); std::string tooltip; bool enable_show_directory = false; @@ -2377,7 +2379,7 @@ void LLPanelLandAccess::refresh() { BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST); BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP); - BOOL public_access = !use_access_list && !use_group; + BOOL public_access = !use_access_list; getChild<LLUICtrl>("public_access")->setValue(public_access ); getChild<LLUICtrl>("GroupCheck")->setValue(use_group ); @@ -2544,6 +2546,10 @@ void LLPanelLandAccess::refresh_ui() getChildView("HoursSpin")->setEnabled(FALSE); getChildView("AccessList")->setEnabled(FALSE); getChildView("BannedList")->setEnabled(FALSE); + getChildView("add_allowed")->setEnabled(FALSE); + getChildView("remove_allowed")->setEnabled(FALSE); + getChildView("add_banned")->setEnabled(FALSE); + getChildView("remove_banned")->setEnabled(FALSE); LLParcel *parcel = mParcel->getParcel(); if (parcel) @@ -2582,7 +2588,6 @@ void LLPanelLandAccess::refresh_ui() { getChildView("Only Allow")->setToolTip(std::string()); } - getChildView("GroupCheck")->setEnabled(FALSE); getChildView("PassCheck")->setEnabled(FALSE); getChildView("pass_combo")->setEnabled(FALSE); getChildView("AccessList")->setEnabled(FALSE); @@ -2592,11 +2597,7 @@ void LLPanelLandAccess::refresh_ui() getChildView("limit_payment")->setEnabled(FALSE); getChildView("limit_age_verified")->setEnabled(FALSE); - std::string group_name; - if (gCacheName->getGroupName(parcel->getGroupID(), group_name)) - { - getChildView("GroupCheck")->setEnabled(can_manage_allowed); - } + BOOL group_access = getChild<LLUICtrl>("GroupCheck")->getValue().asBoolean(); BOOL sell_passes = getChild<LLUICtrl>("PassCheck")->getValue().asBoolean(); getChildView("PassCheck")->setEnabled(can_manage_allowed); @@ -2607,6 +2608,11 @@ void LLPanelLandAccess::refresh_ui() getChildView("HoursSpin")->setEnabled(can_manage_allowed); } } + std::string group_name; + if (gCacheName->getGroupName(parcel->getGroupID(), group_name)) + { + getChildView("GroupCheck")->setEnabled(can_manage_allowed); + } getChildView("AccessList")->setEnabled(can_manage_allowed); S32 allowed_list_count = parcel->mAccessList.size(); getChildView("add_allowed")->setEnabled(can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST); @@ -2653,17 +2659,6 @@ void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata) return; } - // If we disabled public access, enable group access by default (if applicable) - BOOL public_access = self->getChild<LLUICtrl>("public_access")->getValue().asBoolean(); - if (public_access == FALSE) - { - std::string group_name; - if (gCacheName->getGroupName(parcel->getGroupID(), group_name)) - { - self->getChild<LLUICtrl>("GroupCheck")->setValue(public_access ? FALSE : TRUE); - } - } - onCommitAny(ctrl, userdata); } @@ -2697,7 +2692,6 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) if (public_access) { use_access_list = FALSE; - use_access_group = FALSE; limit_payment = self->getChild<LLUICtrl>("limit_payment")->getValue().asBoolean(); limit_age_verified = self->getChild<LLUICtrl>("limit_age_verified")->getValue().asBoolean(); } diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 19cec55837..855836af7a 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -535,9 +535,16 @@ BOOL LLFloaterModelPreview::postBuild() mUploadBtn = getChild<LLButton>("ok_btn"); mCalculateBtn = getChild<LLButton>("calculate_btn"); - mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this)); + if (LLConvexDecomposition::getInstance() != NULL) + { + mCalculateBtn->setClickedCallback(boost::bind(&LLFloaterModelPreview::onClickCalculateBtn, this)); - toggleCalculateButton(true); + toggleCalculateButton(true); + } + else + { + mCalculateBtn->setEnabled(false); + } return TRUE; } diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index 298454724b..161259d049 100755 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -34,11 +34,11 @@ #include <boost/signals2.hpp> +#include "llagent.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llcombobox.h" #include "llcontrol.h" -#include "llenvmanager.h" #include "llfloaterpathfindingcharacters.h" #include "llfloaterpathfindinglinksets.h" #include "llfloaterreg.h" @@ -224,7 +224,7 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) if (!mRegionBoundarySlot.connected()) { - mRegionBoundarySlot = LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterPathfindingConsole::onRegionBoundaryCross, this)); + mRegionBoundarySlot = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterPathfindingConsole::onRegionBoundaryCross, this)); } if (!mTeleportFailedSlot.connected()) diff --git a/indra/newview/llfloaterpathfindingobjects.cpp b/indra/newview/llfloaterpathfindingobjects.cpp index 20c1215bcb..d72ee073e1 100755 --- a/indra/newview/llfloaterpathfindingobjects.cpp +++ b/indra/newview/llfloaterpathfindingobjects.cpp @@ -41,7 +41,6 @@ #include "llavatarnamecache.h" #include "llbutton.h" #include "llcheckboxctrl.h" -#include "llenvmanager.h" #include "llfloater.h" #include "llfontgl.h" #include "llnotifications.h" @@ -85,7 +84,7 @@ void LLFloaterPathfindingObjects::onOpen(const LLSD &pKey) if (!mRegionBoundaryCrossingSlot.connected()) { - mRegionBoundaryCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); + mRegionBoundaryCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterPathfindingObjects::onRegionBoundaryCrossed, this)); } if (!mGodLevelChangeSlot.connected()) diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index b0009fd94f..f0c010b545 100755 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -135,6 +135,7 @@ LLFloaterPay::LLFloaterPay(const LLSD& key) LLFloaterPay::~LLFloaterPay() { std::for_each(mCallbackData.begin(), mCallbackData.end(), DeletePointer()); + mCallbackData.clear(); // Name callbacks will be automatically disconnected since LLFloater is trackable // In case this floater is currently waiting for a reply. diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 1969435ba1..b50a2e6f85 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -238,6 +238,7 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response void handleNameTagOptionChanged(const LLSD& newvalue) { + LLAvatarNameCache::setUseUsernames(gSavedSettings.getBOOL("NameTagShowUsernames")); LLVOAvatar::invalidateNameTags(); } @@ -618,9 +619,12 @@ void LLFloaterPreference::cancel() // hide translation settings floater LLFloaterReg::hideInstance("prefs_translation"); - // hide translation settings floater + // hide autoreplace settings floater LLFloaterReg::hideInstance("prefs_autoreplace"); + // hide spellchecker settings folder + LLFloaterReg::hideInstance("prefs_spellchecker"); + // cancel hardware menu LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings"); if (hardware_settings) @@ -1819,7 +1823,7 @@ private: callback_t mCallback; }; //---------------------------------------------------------------------------- -static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); +static LLPanelInjector<LLPanelPreference> t_places("panel_preference"); LLPanelPreference::LLPanelPreference() : LLPanel(), mBandWidthUpdater(NULL) @@ -2059,8 +2063,8 @@ private: std::list<std::string> mAccountIndependentSettings; }; -static LLRegisterPanelClassWrapper<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); -static LLRegisterPanelClassWrapper<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy"); +static LLPanelInjector<LLPanelPreferenceGraphics> t_pref_graph("panel_preference_graphics"); +static LLPanelInjector<LLPanelPreferencePrivacy> t_pref_privacy("panel_preference_privacy"); BOOL LLPanelPreferenceGraphics::postBuild() { diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 50c013a49d..73c0963a1d 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -91,6 +91,7 @@ #include "lltrans.h" #include "llagentui.h" #include "llmeshrepository.h" +#include "llfloaterregionrestarting.h" const S32 TERRAIN_TEXTURE_COUNT = 4; const S32 CORNER_COUNT = 4; @@ -219,7 +220,7 @@ BOOL LLFloaterRegionInfo::postBuild() &processEstateOwnerRequest); // Request region info when agent region changes. - LLEnvManagerNew::instance().setRegionChangeCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); + gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionInfo::requestRegionInfo, this)); return TRUE; } @@ -1734,7 +1735,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data) LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Allowed Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeAllowedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -1750,7 +1751,7 @@ void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data) LLSD args; args["NUM_ADDED"] = llformat("%d",ids.size()); args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS); - args["LIST_TYPE"] = "Banned Residents"; + args["LIST_TYPE"] = LLTrans::getString("RegionInfoListTypeBannedAgents"); args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS); LLNotificationsUtil::add("MaxAgentOnRegionBatch", args); delete change_info; @@ -2815,9 +2816,10 @@ bool LLDispatchSetEstateAccess::operator()( } - std::string msg = llformat("Banned residents: (%d, max %d)", - totalBannedAgents, - ESTATE_MAX_ACCESS_IDS); + LLStringUtil::format_map_t args; + args["[BANNEDAGENTS]"] = llformat("%d", totalBannedAgents); + args["[MAXBANNED]"] = llformat("%d", ESTATE_MAX_ACCESS_IDS); + std::string msg = LLTrans::getString("RegionInfoBannedResidents", args); panel->getChild<LLUICtrl>("ban_resident_label")->setValue(LLSD(msg)); if (banned_agent_name_list) @@ -2837,9 +2839,10 @@ bool LLDispatchSetEstateAccess::operator()( if (access_flags & ESTATE_ACCESS_MANAGERS) { - std::string msg = llformat("Estate Managers: (%d, max %d)", - num_estate_managers, - ESTATE_MAX_MANAGERS); + LLStringUtil::format_map_t args; + args["[ESTATEMANAGERS]"] = llformat("%d", num_estate_managers); + args["[MAXMANAGERS]"] = llformat("%d", ESTATE_MAX_MANAGERS); + std::string msg = LLTrans::getString("RegionInfoEstateManagers", args); panel->getChild<LLUICtrl>("estate_manager_label")->setValue(LLSD(msg)); LLNameListCtrl* estate_manager_name_list = diff --git a/indra/newview/llfloaterregionrestarting.cpp b/indra/newview/llfloaterregionrestarting.cpp new file mode 100644 index 0000000000..95d4265bb4 --- /dev/null +++ b/indra/newview/llfloaterregionrestarting.cpp @@ -0,0 +1,176 @@ +/** + * @file llfloaterregionrestarting.cpp + * @brief Shows countdown timer during region restart + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterregionrestarting.h" + +#include "llfloaterreg.h" +#include "lluictrl.h" +#include "llagent.h" +#include "llagentcamera.h" +#include "llviewerwindow.h" + +static S32 sSeconds; +static U32 sShakeState; + +LLFloaterRegionRestarting::LLFloaterRegionRestarting(const LLSD& key) : + LLFloater(key), + LLEventTimer(1) +{ + mName = (std::string)key["NAME"]; + sSeconds = (LLSD::Integer)key["SECONDS"]; +} + +LLFloaterRegionRestarting::~LLFloaterRegionRestarting() +{ + mRegionChangedConnection.disconnect(); +} + +BOOL LLFloaterRegionRestarting::postBuild() +{ + mRegionChangedConnection = gAgent.addRegionChangedCallback(boost::bind(&LLFloaterRegionRestarting::regionChange, this)); + + LLStringUtil::format_map_t args; + std::string text; + + args["[NAME]"] = mName; + text = getString("RegionName", args); + LLTextBox* textbox = getChild<LLTextBox>("region_name"); + textbox->setValue(text); + + sShakeState = SHAKE_START; + + refresh(); + + return TRUE; +} + +void LLFloaterRegionRestarting::regionChange() +{ + close(); +} + +BOOL LLFloaterRegionRestarting::tick() +{ + refresh(); + + return FALSE; +} + +void LLFloaterRegionRestarting::refresh() +{ + LLStringUtil::format_map_t args; + std::string text; + + args["[SECONDS]"] = llformat("%d", sSeconds); + getChild<LLTextBox>("restart_seconds")->setValue(getString("RestartSeconds", args)); + + sSeconds = sSeconds - 1; + if(sSeconds < 0.0) + { + sSeconds = 0; + } +} + +void LLFloaterRegionRestarting::draw() +{ + LLFloater::draw(); + + const F32 SHAKE_INTERVAL = 0.025; + const F32 SHAKE_TOTAL_DURATION = 1.8; // the length of the default alert tone for this + const F32 SHAKE_INITIAL_MAGNITUDE = 1.5; + const F32 SHAKE_HORIZONTAL_BIAS = 0.25; + F32 time_shaking; + + if(SHAKE_START == sShakeState) + { + mShakeTimer.setTimerExpirySec(SHAKE_INTERVAL); + sShakeState = SHAKE_LEFT; + mShakeIterations = 0; + mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE; + } + + if(SHAKE_DONE != sShakeState && mShakeTimer.hasExpired()) + { + gAgentCamera.unlockView(); + + switch(sShakeState) + { + case SHAKE_LEFT: + gAgentCamera.setPanLeftKey(mShakeMagnitude * SHAKE_HORIZONTAL_BIAS); + sShakeState = SHAKE_UP; + break; + + case SHAKE_UP: + gAgentCamera.setPanUpKey(mShakeMagnitude); + sShakeState = SHAKE_RIGHT; + break; + + case SHAKE_RIGHT: + gAgentCamera.setPanRightKey(mShakeMagnitude * SHAKE_HORIZONTAL_BIAS); + sShakeState = SHAKE_DOWN; + break; + + case SHAKE_DOWN: + gAgentCamera.setPanDownKey(mShakeMagnitude); + mShakeIterations++; + time_shaking = SHAKE_INTERVAL * (mShakeIterations * 4 /* left, up, right, down */); + if(SHAKE_TOTAL_DURATION <= time_shaking) + { + sShakeState = SHAKE_DONE; + mShakeMagnitude = 0.0; + } + else + { + sShakeState = SHAKE_LEFT; + F32 percent_done_shaking = (SHAKE_TOTAL_DURATION - time_shaking) / SHAKE_TOTAL_DURATION; + mShakeMagnitude = SHAKE_INITIAL_MAGNITUDE * (percent_done_shaking * percent_done_shaking); // exponential decay + } + break; + + default: + break; + } + mShakeTimer.setTimerExpirySec(SHAKE_INTERVAL); + } +} + +void LLFloaterRegionRestarting::close() +{ + LLFloaterRegionRestarting* floaterp = LLFloaterReg::findTypedInstance<LLFloaterRegionRestarting>("region_restarting"); + + if (floaterp) + { + floaterp->closeFloater(); + } +} + +void LLFloaterRegionRestarting::updateTime(S32 time) +{ + sSeconds = time; + sShakeState = SHAKE_START; +} diff --git a/indra/newview/llfloaterregionrestarting.h b/indra/newview/llfloaterregionrestarting.h new file mode 100644 index 0000000000..46416db2c8 --- /dev/null +++ b/indra/newview/llfloaterregionrestarting.h @@ -0,0 +1,69 @@ +/** + * @file llfloaterregionrestarting.h + * @brief Shows countdown timer during region restart + * + * $LicenseInfo:firstyear=2006&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLFLOATERREGIONRESTARTING_H +#define LL_LLFLOATERREGIONRESTARTING_H + +#include "llfloater.h" +#include "lltextbox.h" +#include "lleventtimer.h" + +class LLFloaterRegionRestarting : public LLFloater, public LLEventTimer +{ + friend class LLFloaterReg; + +public: + static void close(); + static void updateTime(S32 time); + +private: + LLFloaterRegionRestarting(const LLSD& key); + virtual ~LLFloaterRegionRestarting(); + virtual BOOL postBuild(); + virtual BOOL tick(); + virtual void refresh(); + virtual void draw(); + virtual void regionChange(); + + std::string mName; + U32 mShakeIterations; + F32 mShakeMagnitude; + LLTimer mShakeTimer; + + boost::signals2::connection mRegionChangedConnection; + + enum + { + SHAKE_START, + SHAKE_LEFT, + SHAKE_UP, + SHAKE_RIGHT, + SHAKE_DOWN, + SHAKE_DONE + }; +}; + +#endif // LL_LLFLOATERREGIONRESTARTING_H diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 5f9556a870..c5248719e9 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -57,7 +57,7 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key) getChild<LLPanel>(sMainPanelName)->onOpen(key); } -void LLFloaterSidePanelContainer::onClickCloseBtn() +void LLFloaterSidePanelContainer::onClickCloseBtn(bool) { LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 491723471f..65ec8f604e 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,7 +51,7 @@ public: /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClickCloseBtn(); + /*virtual*/ void onClickCloseBtn(bool app_quitting = false); LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index d8d62e5bbb..ea385d7baf 100755 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -28,60 +28,23 @@ #include "llfloatersnapshot.h" -#include "llfloaterreg.h" - -// Viewer includes #include "llagent.h" -#include "llagentcamera.h" -#include "llcallbacklist.h" -#include "llcriticaldamp.h" -#include "llfloaterperms.h" -#include "llui.h" -#include "llfocusmgr.h" -#include "llbutton.h" +#include "llfacebookconnect.h" +#include "llfloaterreg.h" +#include "llfloatersocial.h" +#include "llcheckboxctrl.h" #include "llcombobox.h" -#include "lleconomy.h" -#include "lllandmarkactions.h" -#include "llpanelsnapshot.h" +#include "llpostcard.h" +#include "llresmgr.h" // LLLocale +#include "llsdserialize.h" #include "llsidetraypanelcontainer.h" -#include "llsliderctrl.h" +#include "llsnapshotlivepreview.h" #include "llspinctrl.h" #include "llviewercontrol.h" -#include "lluictrlfactory.h" -#include "llviewerstats.h" -#include "llviewercamera.h" -#include "llviewerwindow.h" -#include "llviewermenufile.h" // upload_new_resource() -#include "llcheckboxctrl.h" -#include "llslurl.h" #include "lltoolfocus.h" #include "lltoolmgr.h" -#include "llwebsharing.h" -#include "llworld.h" -#include "llagentui.h" - -// Linden library includes -#include "llfontgl.h" -#include "llsys.h" -#include "llrender.h" -#include "v3dmath.h" -#include "llmath.h" -#include "lldir.h" -#include "llsdserialize.h" -#include "llgl.h" -#include "llglheaders.h" -#include "llimagejpeg.h" -#include "llimagepng.h" -#include "llimagebmp.h" -#include "llimagej2c.h" -#include "lllocalcliprect.h" -#include "llnotificationsutil.h" -#include "llpostcard.h" -#include "llresmgr.h" // LLLocale -#include "llvfile.h" -#include "llvfs.h" #include "llwebprofile.h" -#include "llwindow.h" +#include "llwebsharing.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs @@ -91,949 +54,12 @@ LLSnapshotFloaterView* gSnapshotFloaterView = NULL; const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; -F32 SHINE_TIME = 0.5f; -F32 SHINE_WIDTH = 0.6f; -F32 SHINE_OPACITY = 0.3f; -F32 FALL_TIME = 0.6f; -S32 BORDER_WIDTH = 6; - const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 static LLDefaultChildRegistry::Register<LLSnapshotFloaterView> r("snapshot_floater_view"); -///---------------------------------------------------------------------------- -/// Class LLSnapshotLivePreview -///---------------------------------------------------------------------------- -class LLSnapshotLivePreview : public LLView -{ - LOG_CLASS(LLSnapshotLivePreview); -public: - enum ESnapshotType - { - SNAPSHOT_POSTCARD, - SNAPSHOT_TEXTURE, - SNAPSHOT_LOCAL, - SNAPSHOT_WEB - }; - - - struct Params : public LLInitParam::Block<Params, LLView::Params> - { - Params() - { - name = "snapshot_live_preview"; - mouse_opaque = false; - } - }; - - - LLSnapshotLivePreview(const LLSnapshotLivePreview::Params& p); - ~LLSnapshotLivePreview(); - - /*virtual*/ void draw(); - /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); - - void setSize(S32 w, S32 h); - void setWidth(S32 w) { mWidth[mCurImageIndex] = w; } - void setHeight(S32 h) { mHeight[mCurImageIndex] = h; } - void getSize(S32& w, S32& h) const; - S32 getWidth() const { return mWidth[mCurImageIndex]; } - S32 getHeight() const { return mHeight[mCurImageIndex]; } - S32 getDataSize() const { return mDataSize; } - void setMaxImageSize(S32 size) ; - S32 getMaxImageSize() {return mMaxImageSize ;} - - ESnapshotType getSnapshotType() const { return mSnapshotType; } - LLFloaterSnapshot::ESnapshotFormat getSnapshotFormat() const { return mSnapshotFormat; } - BOOL getSnapshotUpToDate() const { return mSnapshotUpToDate; } - BOOL isSnapshotActive() { return mSnapshotActive; } - LLViewerTexture* getThumbnailImage() const { return mThumbnailImage ; } - S32 getThumbnailWidth() const { return mThumbnailWidth ; } - S32 getThumbnailHeight() const { return mThumbnailHeight ; } - BOOL getThumbnailLock() const { return mThumbnailUpdateLock ; } - BOOL getThumbnailUpToDate() const { return mThumbnailUpToDate ;} - LLViewerTexture* getCurrentImage(); - F32 getImageAspect(); - F32 getAspect() ; - const LLRect& getImageRect() const { return mImageRect[mCurImageIndex]; } - BOOL isImageScaled() const { return mImageScaled[mCurImageIndex]; } - void setImageScaled(BOOL scaled) { mImageScaled[mCurImageIndex] = scaled; } - const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; } - - void setSnapshotType(ESnapshotType type) { mSnapshotType = type; } - void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } - void setSnapshotQuality(S32 quality); - void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; } - void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); - void saveWeb(); - void saveTexture(); - BOOL saveLocal(); - - LLPointer<LLImageFormatted> getFormattedImage() const { return mFormattedImage; } - LLPointer<LLImageRaw> getEncodedImage() const { return mPreviewImageEncoded; } - - /// Sets size of preview thumbnail image and thhe surrounding rect. - BOOL setThumbnailImageSize() ; - void generateThumbnailImage(BOOL force_update = FALSE) ; - void resetThumbnailImage() { mThumbnailImage = NULL ; } - void drawPreviewRect(S32 offset_x, S32 offset_y) ; - - // Returns TRUE when snapshot generated, FALSE otherwise. - static BOOL onIdle( void* snapshot_preview ); - - // callback for region name resolve - void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z); - -private: - LLColor4 mColor; - LLPointer<LLViewerTexture> mViewerImage[2]; //used to represent the scene when the frame is frozen. - LLRect mImageRect[2]; - S32 mWidth[2]; - S32 mHeight[2]; - BOOL mImageScaled[2]; - S32 mMaxImageSize ; - - //thumbnail image - LLPointer<LLViewerTexture> mThumbnailImage ; - S32 mThumbnailWidth ; - S32 mThumbnailHeight ; - LLRect mPreviewRect ; - BOOL mThumbnailUpdateLock ; - BOOL mThumbnailUpToDate ; - - S32 mCurImageIndex; - LLPointer<LLImageRaw> mPreviewImage; - LLPointer<LLImageRaw> mPreviewImageEncoded; - LLPointer<LLImageFormatted> mFormattedImage; - LLFrameTimer mSnapshotDelayTimer; - S32 mShineCountdown; - LLFrameTimer mShineAnimTimer; - F32 mFlashAlpha; - BOOL mNeedsFlash; - LLVector3d mPosTakenGlobal; - S32 mSnapshotQuality; - S32 mDataSize; - ESnapshotType mSnapshotType; - LLFloaterSnapshot::ESnapshotFormat mSnapshotFormat; - BOOL mSnapshotUpToDate; - LLFrameTimer mFallAnimTimer; - LLVector3 mCameraPos; - LLQuaternion mCameraRot; - BOOL mSnapshotActive; - LLViewerWindow::ESnapshotType mSnapshotBufferType; - -public: - static std::set<LLSnapshotLivePreview*> sList; - BOOL mKeepAspectRatio ; -}; - -std::set<LLSnapshotLivePreview*> LLSnapshotLivePreview::sList; - -LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Params& p) -: LLView(p), - mColor(1.f, 0.f, 0.f, 0.5f), - mCurImageIndex(0), - mPreviewImage(NULL), - mThumbnailImage(NULL) , - mThumbnailWidth(0), - mThumbnailHeight(0), - mPreviewImageEncoded(NULL), - mFormattedImage(NULL), - mShineCountdown(0), - mFlashAlpha(0.f), - mNeedsFlash(TRUE), - mSnapshotQuality(gSavedSettings.getS32("SnapshotQuality")), - mDataSize(0), - mSnapshotType(SNAPSHOT_POSTCARD), - mSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))), - mSnapshotUpToDate(FALSE), - mCameraPos(LLViewerCamera::getInstance()->getOrigin()), - mCameraRot(LLViewerCamera::getInstance()->getQuaternion()), - mSnapshotActive(FALSE), - mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR) -{ - setSnapshotQuality(gSavedSettings.getS32("SnapshotQuality")); - mSnapshotDelayTimer.setTimerExpirySec(0.0f); - mSnapshotDelayTimer.start(); -// gIdleCallbacks.addFunction( &LLSnapshotLivePreview::onIdle, (void*)this ); - sList.insert(this); - setFollowsAll(); - mWidth[0] = gViewerWindow->getWindowWidthRaw(); - mWidth[1] = gViewerWindow->getWindowWidthRaw(); - mHeight[0] = gViewerWindow->getWindowHeightRaw(); - mHeight[1] = gViewerWindow->getWindowHeightRaw(); - mImageScaled[0] = FALSE; - mImageScaled[1] = FALSE; - - mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; - mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; - mThumbnailUpdateLock = FALSE ; - mThumbnailUpToDate = FALSE ; -} - -LLSnapshotLivePreview::~LLSnapshotLivePreview() -{ - // delete images - mPreviewImage = NULL; - mPreviewImageEncoded = NULL; - mFormattedImage = NULL; - -// gIdleCallbacks.deleteFunction( &LLSnapshotLivePreview::onIdle, (void*)this ); - sList.erase(this); -} - -void LLSnapshotLivePreview::setMaxImageSize(S32 size) -{ - if(size < MAX_SNAPSHOT_IMAGE_SIZE) - { - mMaxImageSize = size; - } - else - { - mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; - } -} - -LLViewerTexture* LLSnapshotLivePreview::getCurrentImage() -{ - return mViewerImage[mCurImageIndex]; -} - -F32 LLSnapshotLivePreview::getAspect() -{ - F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight()); - F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); - - if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot")) - { - return image_aspect_ratio; - } - else - { - return window_aspect_ratio; - } -} - -F32 LLSnapshotLivePreview::getImageAspect() -{ - if (!getCurrentImage()) - { - return 0.f; - } - - return getAspect() ; -} - -void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay) -{ - // Invalidate current image. - lldebugs << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << llendl; - if (getSnapshotUpToDate()) - { - S32 old_image_index = mCurImageIndex; - mCurImageIndex = (mCurImageIndex + 1) % 2; - setSize(mWidth[old_image_index], mHeight[old_image_index]); - mFallAnimTimer.start(); - } - mSnapshotUpToDate = FALSE; - - // Update snapshot source rect depending on whether we keep the aspect ratio. - LLRect& rect = mImageRect[mCurImageIndex]; - rect.set(0, getRect().getHeight(), getRect().getWidth(), 0); - - F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight()); - F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); - - if (mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot")) - { - if (image_aspect_ratio > window_aspect_ratio) - { - // trim off top and bottom - S32 new_height = llround((F32)getRect().getWidth() / image_aspect_ratio); - rect.mBottom += (getRect().getHeight() - new_height) / 2; - rect.mTop -= (getRect().getHeight() - new_height) / 2; - } - else if (image_aspect_ratio < window_aspect_ratio) - { - // trim off left and right - S32 new_width = llround((F32)getRect().getHeight() * image_aspect_ratio); - rect.mLeft += (getRect().getWidth() - new_width) / 2; - rect.mRight -= (getRect().getWidth() - new_width) / 2; - } - } - - // Stop shining animation. - mShineAnimTimer.stop(); - - // Update snapshot if requested. - if (new_snapshot) - { - mSnapshotDelayTimer.start(); - mSnapshotDelayTimer.setTimerExpirySec(delay); - LLFloaterSnapshot::preUpdate(); - } - - // Update thumbnail if requested. - if(new_thumbnail) - { - mThumbnailUpToDate = FALSE ; - } -} - -void LLSnapshotLivePreview::setSnapshotQuality(S32 quality) -{ - llclamp(quality, 0, 100); - if (quality != mSnapshotQuality) - { - mSnapshotQuality = quality; - gSavedSettings.setS32("SnapshotQuality", quality); - mSnapshotUpToDate = FALSE; - } -} - -void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y) -{ - F32 line_width ; - glGetFloatv(GL_LINE_WIDTH, &line_width) ; - glLineWidth(2.0f * line_width) ; - LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ; - gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y, - mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, FALSE ) ; - glLineWidth(line_width) ; - - //draw four alpha rectangles to cover areas outside of the snapshot image - if(!mKeepAspectRatio) - { - LLColor4 alpha_color(0.5f, 0.5f, 0.5f, 0.8f) ; - S32 dwl = 0, dwr = 0 ; - if(mThumbnailWidth > mPreviewRect.getWidth()) - { - dwl = (mThumbnailWidth - mPreviewRect.getWidth()) >> 1 ; - dwr = mThumbnailWidth - mPreviewRect.getWidth() - dwl ; - - gl_rect_2d(mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mTop + offset_y, - mPreviewRect.mLeft + offset_x, mPreviewRect.mBottom + offset_y, alpha_color, TRUE ) ; - gl_rect_2d( mPreviewRect.mRight + offset_x, mPreviewRect.mTop + offset_y, - mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mBottom + offset_y, alpha_color, TRUE ) ; - } - - if(mThumbnailHeight > mPreviewRect.getHeight()) - { - S32 dh = (mThumbnailHeight - mPreviewRect.getHeight()) >> 1 ; - gl_rect_2d(mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mBottom + offset_y , - mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mBottom + offset_y - dh, alpha_color, TRUE ) ; - - dh = mThumbnailHeight - mPreviewRect.getHeight() - dh ; - gl_rect_2d( mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mTop + offset_y + dh, - mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mTop + offset_y, alpha_color, TRUE ) ; - } - } -} - -//called when the frame is frozen. -void LLSnapshotLivePreview::draw() -{ - if (getCurrentImage() && - mPreviewImageEncoded.notNull() && - getSnapshotUpToDate()) - { - LLColor4 bg_color(0.f, 0.f, 0.3f, 0.4f); - gl_rect_2d(getRect(), bg_color); - const LLRect& rect = getImageRect(); - LLRect shadow_rect = rect; - shadow_rect.stretch(BORDER_WIDTH); - gl_drop_shadow(shadow_rect.mLeft, shadow_rect.mTop, shadow_rect.mRight, shadow_rect.mBottom, LLColor4(0.f, 0.f, 0.f, mNeedsFlash ? 0.f :0.5f), 10); - - LLColor4 image_color(1.f, 1.f, 1.f, 1.f); - gGL.color4fv(image_color.mV); - gGL.getTexUnit(0)->bind(getCurrentImage()); - // calculate UV scale - F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)getCurrentImage()->getWidth(), 1.f); - F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)getCurrentImage()->getHeight(), 1.f); - gGL.pushMatrix(); - { - gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f); - gGL.begin(LLRender::QUADS); - { - gGL.texCoord2f(uv_width, uv_height); - gGL.vertex2i(rect.getWidth(), rect.getHeight() ); - - gGL.texCoord2f(0.f, uv_height); - gGL.vertex2i(0, rect.getHeight() ); - - gGL.texCoord2f(0.f, 0.f); - gGL.vertex2i(0, 0); - - gGL.texCoord2f(uv_width, 0.f); - gGL.vertex2i(rect.getWidth(), 0); - } - gGL.end(); - } - gGL.popMatrix(); - - gGL.color4f(1.f, 1.f, 1.f, mFlashAlpha); - gl_rect_2d(getRect()); - if (mNeedsFlash) - { - if (mFlashAlpha < 1.f) - { - mFlashAlpha = lerp(mFlashAlpha, 1.f, LLCriticalDamp::getInterpolant(0.02f)); - } - else - { - mNeedsFlash = FALSE; - } - } - else - { - mFlashAlpha = lerp(mFlashAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f)); - } - - // Draw shining animation if appropriate. - if (mShineCountdown > 0) - { - mShineCountdown--; - if (mShineCountdown == 0) - { - mShineAnimTimer.start(); - } - } - else if (mShineAnimTimer.getStarted()) - { - lldebugs << "Drawing shining animation" << llendl; - F32 shine_interp = llmin(1.f, mShineAnimTimer.getElapsedTimeF32() / SHINE_TIME); - - // draw "shine" effect - LLLocalClipRect clip(getLocalRect()); - { - // draw diagonal stripe with gradient that passes over screen - S32 x1 = gViewerWindow->getWindowWidthScaled() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f))); - S32 x2 = x1 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); - S32 x3 = x2 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); - S32 y1 = 0; - S32 y2 = gViewerWindow->getWindowHeightScaled(); - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.begin(LLRender::QUADS); - { - gGL.color4f(1.f, 1.f, 1.f, 0.f); - gGL.vertex2i(x1, y1); - gGL.vertex2i(x1 + gViewerWindow->getWindowWidthScaled(), y2); - gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); - gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); - gGL.vertex2i(x2, y1); - - gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); - gGL.vertex2i(x2, y1); - gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); - gGL.color4f(1.f, 1.f, 1.f, 0.f); - gGL.vertex2i(x3 + gViewerWindow->getWindowWidthScaled(), y2); - gGL.vertex2i(x3, y1); - } - gGL.end(); - } - - // if we're at the end of the animation, stop - if (shine_interp >= 1.f) - { - mShineAnimTimer.stop(); - } - } - } - - // draw framing rectangle - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4f(1.f, 1.f, 1.f, 1.f); - const LLRect& outline_rect = getImageRect(); - gGL.begin(LLRender::QUADS); - { - gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); - gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); - gGL.vertex2i(outline_rect.mRight, outline_rect.mTop); - gGL.vertex2i(outline_rect.mLeft, outline_rect.mTop); - - gGL.vertex2i(outline_rect.mLeft, outline_rect.mBottom); - gGL.vertex2i(outline_rect.mRight, outline_rect.mBottom); - gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); - gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); - - gGL.vertex2i(outline_rect.mLeft, outline_rect.mTop); - gGL.vertex2i(outline_rect.mLeft, outline_rect.mBottom); - gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); - gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); - - gGL.vertex2i(outline_rect.mRight, outline_rect.mBottom); - gGL.vertex2i(outline_rect.mRight, outline_rect.mTop); - gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); - gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); - } - gGL.end(); - } - - // draw old image dropping away - if (mFallAnimTimer.getStarted()) - { - S32 old_image_index = (mCurImageIndex + 1) % 2; - if (mViewerImage[old_image_index].notNull() && mFallAnimTimer.getElapsedTimeF32() < FALL_TIME) - { - lldebugs << "Drawing fall animation" << llendl; - F32 fall_interp = mFallAnimTimer.getElapsedTimeF32() / FALL_TIME; - F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f); - LLColor4 image_color(1.f, 1.f, 1.f, alpha); - gGL.color4fv(image_color.mV); - gGL.getTexUnit(0)->bind(mViewerImage[old_image_index]); - // calculate UV scale - // *FIX get this to work with old image - BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull(); - F32 uv_width = rescale ? llmin((F32)mWidth[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f) : 1.f; - F32 uv_height = rescale ? llmin((F32)mHeight[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f) : 1.f; - gGL.pushMatrix(); - { - LLRect& rect = mImageRect[old_image_index]; - gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f); - gGL.rotatef(-45.f * fall_interp, 0.f, 0.f, 1.f); - gGL.begin(LLRender::QUADS); - { - gGL.texCoord2f(uv_width, uv_height); - gGL.vertex2i(rect.getWidth(), rect.getHeight() ); - - gGL.texCoord2f(0.f, uv_height); - gGL.vertex2i(0, rect.getHeight() ); - - gGL.texCoord2f(0.f, 0.f); - gGL.vertex2i(0, 0); - gGL.texCoord2f(uv_width, 0.f); - gGL.vertex2i(rect.getWidth(), 0); - } - gGL.end(); - } - gGL.popMatrix(); - } - } -} - -/*virtual*/ -void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_parent) -{ - LLRect old_rect = getRect(); - LLView::reshape(width, height, called_from_parent); - if (old_rect.getWidth() != width || old_rect.getHeight() != height) - { - lldebugs << "window reshaped, updating thumbnail" << llendl; - updateSnapshot(FALSE, TRUE); - } -} - -BOOL LLSnapshotLivePreview::setThumbnailImageSize() -{ - if(getWidth() < 10 || getHeight() < 10) - { - return FALSE ; - } - S32 window_width = gViewerWindow->getWindowWidthRaw() ; - S32 window_height = gViewerWindow->getWindowHeightRaw() ; - - F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); - - // UI size for thumbnail - // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h. - const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect(); - S32 max_width = thumbnail_rect.getWidth(); - S32 max_height = thumbnail_rect.getHeight(); - - if (window_aspect_ratio > (F32)max_width / max_height) - { - // image too wide, shrink to width - mThumbnailWidth = max_width; - mThumbnailHeight = llround((F32)max_width / window_aspect_ratio); - } - else - { - // image too tall, shrink to height - mThumbnailHeight = max_height; - mThumbnailWidth = llround((F32)max_height * window_aspect_ratio); - } - - if(mThumbnailWidth > window_width || mThumbnailHeight > window_height) - { - return FALSE ;//if the window is too small, ignore thumbnail updating. - } - - S32 left = 0 , top = mThumbnailHeight, right = mThumbnailWidth, bottom = 0 ; - if(!mKeepAspectRatio) - { - F32 ratio_x = (F32)getWidth() / window_width ; - F32 ratio_y = (F32)getHeight() / window_height ; - - //if(getWidth() > window_width || - // getHeight() > window_height ) - { - if(ratio_x > ratio_y) - { - top = (S32)(top * ratio_y / ratio_x) ; - } - else - { - right = (S32)(right * ratio_x / ratio_y) ; - } - } - //else - //{ - // right = (S32)(right * ratio_x) ; - // top = (S32)(top * ratio_y) ; - //} - left = (S32)((mThumbnailWidth - right) * 0.5f) ; - bottom = (S32)((mThumbnailHeight - top) * 0.5f) ; - top += bottom ; - right += left ; - } - mPreviewRect.set(left - 1, top + 1, right + 1, bottom - 1) ; - - return TRUE ; -} - -void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) -{ - if(mThumbnailUpdateLock) //in the process of updating - { - return ; - } - if(getThumbnailUpToDate() && !force_update)//already updated - { - return ; - } - if(getWidth() < 10 || getHeight() < 10) - { - return ; - } - - ////lock updating - mThumbnailUpdateLock = TRUE ; - - if(!setThumbnailImageSize()) - { - mThumbnailUpdateLock = FALSE ; - mThumbnailUpToDate = TRUE ; - return ; - } - - if(mThumbnailImage) - { - resetThumbnailImage() ; - } - - LLPointer<LLImageRaw> raw = new LLImageRaw; - if(!gViewerWindow->thumbnailSnapshot(raw, - mThumbnailWidth, mThumbnailHeight, - gSavedSettings.getBOOL("RenderUIInSnapshot"), - FALSE, - mSnapshotBufferType) ) - { - raw = NULL ; - } - - if(raw) - { - raw->expandToPowerOfTwo(); - mThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); - mThumbnailUpToDate = TRUE ; - } - - //unlock updating - mThumbnailUpdateLock = FALSE ; -} - - -// Called often. Checks whether it's time to grab a new snapshot and if so, does it. -// Returns TRUE if new snapshot generated, FALSE otherwise. -//static -BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) -{ - LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; - if (previewp->getWidth() == 0 || previewp->getHeight() == 0) - { - llwarns << "Incorrect dimensions: " << previewp->getWidth() << "x" << previewp->getHeight() << llendl; - return FALSE; - } - - // If we're in freeze-frame mode and camera has moved, update snapshot. - LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin(); - LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion(); - if (gSavedSettings.getBOOL("FreezeTime") && - (new_camera_pos != previewp->mCameraPos || dot(new_camera_rot, previewp->mCameraRot) < 0.995f)) - { - previewp->mCameraPos = new_camera_pos; - previewp->mCameraRot = new_camera_rot; - // request a new snapshot whenever the camera moves, with a time delay - BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); - lldebugs << "camera moved, updating thumbnail" << llendl; - previewp->updateSnapshot( - autosnap, // whether a new snapshot is needed or merely invalidate the existing one - FALSE, // or if 1st arg is false, whether to produce a new thumbnail image. - autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); // shutter delay if 1st arg is true. - } - - // see if it's time yet to snap the shot and bomb out otherwise. - previewp->mSnapshotActive = - (previewp->mSnapshotDelayTimer.getStarted() && previewp->mSnapshotDelayTimer.hasExpired()) - && !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active - if ( ! previewp->mSnapshotActive) - { - return FALSE; - } - - // time to produce a snapshot - previewp->setThumbnailImageSize(); - - lldebugs << "producing snapshot" << llendl; - if (!previewp->mPreviewImage) - { - previewp->mPreviewImage = new LLImageRaw; - } - - if (!previewp->mPreviewImageEncoded) - { - previewp->mPreviewImageEncoded = new LLImageRaw; - } - - previewp->setVisible(FALSE); - previewp->setEnabled(FALSE); - - previewp->getWindow()->incBusyCount(); - previewp->setImageScaled(FALSE); - - // grab the raw image and encode it into desired format - if(gViewerWindow->rawSnapshot( - previewp->mPreviewImage, - previewp->getWidth(), - previewp->getHeight(), - previewp->mKeepAspectRatio,//gSavedSettings.getBOOL("KeepAspectForSnapshot"), - previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE, - gSavedSettings.getBOOL("RenderUIInSnapshot"), - FALSE, - previewp->mSnapshotBufferType, - previewp->getMaxImageSize())) - { - previewp->mPreviewImageEncoded->resize( - previewp->mPreviewImage->getWidth(), - previewp->mPreviewImage->getHeight(), - previewp->mPreviewImage->getComponents()); - - if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE) - { - lldebugs << "Encoding new image of format J2C" << llendl; - LLPointer<LLImageJ2C> formatted = new LLImageJ2C; - LLPointer<LLImageRaw> scaled = new LLImageRaw( - previewp->mPreviewImage->getData(), - previewp->mPreviewImage->getWidth(), - previewp->mPreviewImage->getHeight(), - previewp->mPreviewImage->getComponents()); - - scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE); - previewp->setImageScaled(TRUE); - if (formatted->encode(scaled, 0.f)) - { - previewp->mDataSize = formatted->getDataSize(); - formatted->decode(previewp->mPreviewImageEncoded, 0); - } - } - else - { - // delete any existing image - previewp->mFormattedImage = NULL; - // now create the new one of the appropriate format. - LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat(); - lldebugs << "Encoding new image of format " << format << llendl; - - switch(format) - { - case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: - previewp->mFormattedImage = new LLImagePNG(); - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: - previewp->mFormattedImage = new LLImageJPEG(previewp->mSnapshotQuality); - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP: - previewp->mFormattedImage = new LLImageBMP(); - break; - } - if (previewp->mFormattedImage->encode(previewp->mPreviewImage, 0)) - { - previewp->mDataSize = previewp->mFormattedImage->getDataSize(); - // special case BMP to copy instead of decode otherwise decode will crash. - if(format == LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP) - { - previewp->mPreviewImageEncoded->copy(previewp->mPreviewImage); - } - else - { - previewp->mFormattedImage->decode(previewp->mPreviewImageEncoded, 0); - } - } - } - - LLPointer<LLImageRaw> scaled = new LLImageRaw( - previewp->mPreviewImageEncoded->getData(), - previewp->mPreviewImageEncoded->getWidth(), - previewp->mPreviewImageEncoded->getHeight(), - previewp->mPreviewImageEncoded->getComponents()); - - if(!scaled->isBufferInvalid()) - { - // leave original image dimensions, just scale up texture buffer - if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024) - { - // go ahead and shrink image to appropriate power of 2 for display - scaled->biasedScaleToPowerOfTwo(1024); - previewp->setImageScaled(TRUE); - } - else - { - // expand image but keep original image data intact - scaled->expandToPowerOfTwo(1024, FALSE); - } - - previewp->mViewerImage[previewp->mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE); - LLPointer<LLViewerTexture> curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex]; - gGL.getTexUnit(0)->bind(curr_preview_image); - if (previewp->getSnapshotType() != SNAPSHOT_TEXTURE) - { - curr_preview_image->setFilteringOption(LLTexUnit::TFO_POINT); - } - else - { - curr_preview_image->setFilteringOption(LLTexUnit::TFO_ANISOTROPIC); - } - curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP); - - previewp->mSnapshotUpToDate = TRUE; - previewp->generateThumbnailImage(TRUE) ; - - previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal(); - previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame - } - } - previewp->getWindow()->decBusyCount(); - // only show fullscreen preview when in freeze frame mode - previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame")); - previewp->mSnapshotDelayTimer.stop(); - previewp->mSnapshotActive = FALSE; - - if(!previewp->getThumbnailUpToDate()) - { - previewp->generateThumbnailImage() ; - } - lldebugs << "done creating snapshot" << llendl; - LLFloaterSnapshot::postUpdate(); - - return TRUE; -} - -void LLSnapshotLivePreview::setSize(S32 w, S32 h) -{ - lldebugs << "setSize(" << w << ", " << h << ")" << llendl; - setWidth(w); - setHeight(h); -} - -void LLSnapshotLivePreview::getSize(S32& w, S32& h) const -{ - w = getWidth(); - h = getHeight(); -} - -void LLSnapshotLivePreview::saveTexture() -{ - lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl; - // gen a new uuid for this asset - LLTransactionID tid; - tid.generate(); - LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - - LLPointer<LLImageJ2C> formatted = new LLImageJ2C; - LLPointer<LLImageRaw> scaled = new LLImageRaw(mPreviewImage->getData(), - mPreviewImage->getWidth(), - mPreviewImage->getHeight(), - mPreviewImage->getComponents()); - - scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE); - lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl; - - if (formatted->encode(scaled, 0.0f)) - { - LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE); - std::string pos_string; - LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL); - std::string who_took_it; - LLAgentUI::buildFullname(who_took_it); - LLAssetStorage::LLStoreAssetCallback callback = NULL; - S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - void *userdata = NULL; - upload_new_resource(tid, // tid - LLAssetType::AT_TEXTURE, - "Snapshot : " + pos_string, - "Taken by " + who_took_it + " at " + pos_string, - 0, - LLFolderType::FT_SNAPSHOT_CATEGORY, - LLInventoryType::IT_SNAPSHOT, - PERM_ALL, // Note: Snapshots to inventory is a special case of content upload - LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads - LLFloaterPerms::getEveryonePerms(), - "Snapshot : " + pos_string, - callback, expected_upload_cost, userdata); - gViewerWindow->playSnapshotAnimAndSound(); - } - else - { - LLNotificationsUtil::add("ErrorEncodingSnapshot"); - llwarns << "Error encoding snapshot" << llendl; - } - - LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT ); - - mDataSize = 0; -} - -BOOL LLSnapshotLivePreview::saveLocal() -{ - BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); - - if(success) - { - gViewerWindow->playSnapshotAnimAndSound(); - } - return success; -} - -void LLSnapshotLivePreview::saveWeb() -{ - // *FIX: Will break if the window closes because of CloseSnapshotOnKeep! - // Needs to pass on ownership of the image. - LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); - if(!jpg) - { - llwarns << "Formatted image not a JPEG" << llendl; - return; - } - - LLSD metadata; - metadata["description"] = getChild<LLLineEditor>("description")->getText(); - - LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), - boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); - - gViewerWindow->playSnapshotAnimAndSound(); -} - -void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) -{ - metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - - LLWebSharing::instance().shareSnapshot(snapshot, metadata); -} ///---------------------------------------------------------------------------- /// Class LLFloaterSnapshot::Impl @@ -2037,7 +1063,7 @@ BOOL LLFloaterSnapshot::postBuild() getChild<LLUICtrl>("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot")); childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); - + LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1)); @@ -2070,6 +1096,9 @@ BOOL LLFloaterSnapshot::postBuild() impl.updateControls(this); impl.updateLayout(this); + + previewp->setThumbnailPlaceholderRect(getThumbnailPlaceholderRect()); + return TRUE; } @@ -2235,7 +1264,9 @@ S32 LLFloaterSnapshot::notify(const LLSD& info) void LLFloaterSnapshot::update() { LLFloaterSnapshot* inst = LLFloaterReg::findTypedInstance<LLFloaterSnapshot>("snapshot"); - if (!inst) + LLFloaterSocial* floater_social = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + + if (!inst && !floater_social) return; BOOL changed = FALSE; @@ -2245,7 +1276,8 @@ void LLFloaterSnapshot::update() { changed |= LLSnapshotLivePreview::onIdle(*iter); } - if(changed) + + if (inst && changed) { lldebugs << "changed" << llendl; inst->impl.updateControls(inst); diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index afe135fa40..82af8c7a9d 100755 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -27,7 +27,6 @@ #ifndef LL_LLFLOATERSNAPSHOT_H #define LL_LLFLOATERSNAPSHOT_H -#include "llimage.h" #include "llfloater.h" class LLSpinCtrl; diff --git a/indra/newview/llfloatersocial.cpp b/indra/newview/llfloatersocial.cpp new file mode 100644 index 0000000000..e8c6b179cf --- /dev/null +++ b/indra/newview/llfloatersocial.cpp @@ -0,0 +1,898 @@ +/** +* @file llfloatersocial.cpp +* @brief Implementation of llfloatersocial +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "llfloatersocial.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfacebookconnect.h" +#include "llfloaterreg.h" +#include "lliconctrl.h" +#include "llresmgr.h" // LLLocale +#include "llsdserialize.h" +#include "llloadingindicator.h" +#include "llplugincookiestore.h" +#include "llslurl.h" +#include "lltrans.h" +#include "llsnapshotlivepreview.h" +#include "llviewerregion.h" +#include "llviewercontrol.h" +#include "llviewermedia.h" + +static LLPanelInjector<LLSocialStatusPanel> t_panel_status("llsocialstatuspanel"); +static LLPanelInjector<LLSocialPhotoPanel> t_panel_photo("llsocialphotopanel"); +static LLPanelInjector<LLSocialCheckinPanel> t_panel_checkin("llsocialcheckinpanel"); +static LLPanelInjector<LLSocialAccountPanel> t_panel_account("llsocialaccountpanel"); + +const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte +const std::string DEFAULT_CHECKIN_LOCATION_URL = "http://maps.secondlife.com/"; +const std::string DEFAULT_CHECKIN_ICON_URL = "http://map.secondlife.com.s3.amazonaws.com/map_placeholder.png"; +const std::string DEFAULT_CHECKIN_QUERY_PARAMETERS = "?sourceid=slshare_checkin&utm_source=facebook&utm_medium=checkin&utm_campaign=slshare"; +const std::string DEFAULT_PHOTO_QUERY_PARAMETERS = "?sourceid=slshare_photo&utm_source=facebook&utm_medium=photo&utm_campaign=slshare"; + +std::string get_map_url() +{ + LLVector3d center_agent; + if (gAgent.getRegion()) + { + center_agent = gAgent.getRegion()->getCenterGlobal(); + } + int x_pos = center_agent[0] / 256.0; + int y_pos = center_agent[1] / 256.0; + std::string map_url = gSavedSettings.getString("CurrentMapServerURL") + llformat("map-1-%d-%d-objects.jpg", x_pos, y_pos); + return map_url; +} + +/////////////////////////// +//LLSocialStatusPanel////// +/////////////////////////// + +LLSocialStatusPanel::LLSocialStatusPanel() : + mMessageTextEditor(NULL), + mPostButton(NULL), + mCancelButton(NULL) +{ + mCommitCallbackRegistrar.add("SocialSharing.SendStatus", boost::bind(&LLSocialStatusPanel::onSend, this)); +} + +BOOL LLSocialStatusPanel::postBuild() +{ + mMessageTextEditor = getChild<LLUICtrl>("status_message"); + mPostButton = getChild<LLUICtrl>("post_status_btn"); + mCancelButton = getChild<LLUICtrl>("cancel_status_btn"); + + return LLPanel::postBuild(); +} + +void LLSocialStatusPanel::draw() +{ + if (mMessageTextEditor && mPostButton && mCancelButton) + { + bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); + std::string message = mMessageTextEditor->getValue().asString(); + mMessageTextEditor->setEnabled(no_ongoing_connection); + mCancelButton->setEnabled(no_ongoing_connection); + mPostButton->setEnabled(no_ongoing_connection && !message.empty()); + } + + LLPanel::draw(); +} + +void LLSocialStatusPanel::onSend() +{ + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialStatusPanel"); // just in case it is already listening + LLEventPumps::instance().obtain("FacebookConnectState").listen("LLSocialStatusPanel", boost::bind(&LLSocialStatusPanel::onFacebookConnectStateChange, this, _1)); + + // Connect to Facebook if necessary and then post + if (LLFacebookConnect::instance().isConnected()) + { + sendStatus(); + } + else + { + LLFacebookConnect::instance().checkConnectionToFacebook(true); + } +} + +bool LLSocialStatusPanel::onFacebookConnectStateChange(const LLSD& data) +{ + switch (data.get("enum").asInteger()) + { + case LLFacebookConnect::FB_CONNECTED: + sendStatus(); + break; + + case LLFacebookConnect::FB_POSTED: + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialStatusPanel"); + clearAndClose(); + break; + } + + return false; +} + +void LLSocialStatusPanel::sendStatus() +{ + std::string message = mMessageTextEditor->getValue().asString(); + if (!message.empty()) + { + LLFacebookConnect::instance().updateStatus(message); + } +} + +void LLSocialStatusPanel::clearAndClose() +{ + mMessageTextEditor->setValue(""); + + LLFloater* floater = getParentByType<LLFloater>(); + if (floater) + { + floater->closeFloater(); + } +} + +/////////////////////////// +//LLSocialPhotoPanel/////// +/////////////////////////// + +LLSocialPhotoPanel::LLSocialPhotoPanel() : +mSnapshotPanel(NULL), +mResolutionComboBox(NULL), +mRefreshBtn(NULL), +mWorkingLabel(NULL), +mThumbnailPlaceholder(NULL), +mCaptionTextBox(NULL), +mPostButton(NULL) +{ + mCommitCallbackRegistrar.add("SocialSharing.SendPhoto", boost::bind(&LLSocialPhotoPanel::onSend, this)); + mCommitCallbackRegistrar.add("SocialSharing.RefreshPhoto", boost::bind(&LLSocialPhotoPanel::onClickNewSnapshot, this)); +} + +LLSocialPhotoPanel::~LLSocialPhotoPanel() +{ + if(mPreviewHandle.get()) + { + mPreviewHandle.get()->die(); + } +} + +BOOL LLSocialPhotoPanel::postBuild() +{ + setVisibleCallback(boost::bind(&LLSocialPhotoPanel::onVisibilityChange, this, _2)); + + mSnapshotPanel = getChild<LLUICtrl>("snapshot_panel"); + mResolutionComboBox = getChild<LLUICtrl>("resolution_combobox"); + mResolutionComboBox->setCommitCallback(boost::bind(&LLSocialPhotoPanel::updateResolution, this, TRUE)); + mRefreshBtn = getChild<LLUICtrl>("new_snapshot_btn"); + mWorkingLabel = getChild<LLUICtrl>("working_lbl"); + mThumbnailPlaceholder = getChild<LLUICtrl>("thumbnail_placeholder"); + mCaptionTextBox = getChild<LLUICtrl>("photo_caption"); + mPostButton = getChild<LLUICtrl>("post_photo_btn"); + mCancelButton = getChild<LLUICtrl>("cancel_photo_btn"); + + return LLPanel::postBuild(); +} + +void LLSocialPhotoPanel::draw() +{ + LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); + + // Enable interaction only if no transaction with the service is on-going (prevent duplicated posts) + bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); + mCancelButton->setEnabled(no_ongoing_connection); + mCaptionTextBox->setEnabled(no_ongoing_connection); + mResolutionComboBox->setEnabled(no_ongoing_connection); + mRefreshBtn->setEnabled(no_ongoing_connection); + + // Display the preview if one is available + if (previewp && previewp->getThumbnailImage()) + { + const LLRect& thumbnail_rect = mThumbnailPlaceholder->getRect(); + const S32 thumbnail_w = previewp->getThumbnailWidth(); + const S32 thumbnail_h = previewp->getThumbnailHeight(); + + // calc preview offset within the preview rect + const S32 local_offset_x = (thumbnail_rect.getWidth() - thumbnail_w) / 2 ; + const S32 local_offset_y = (thumbnail_rect.getHeight() - thumbnail_h) / 2 ; + + // calc preview offset within the floater rect + // Hack : To get the full offset, we need to take into account each and every offset of each widgets up to the floater. + // This is almost as arbitrary as using a fixed offset so that's what we do here for the sake of simplicity. + // *TODO : Get the offset looking through the hierarchy of widgets, should be done in postBuild() so to avoid traversing the hierarchy each time. + S32 offset_x = thumbnail_rect.mLeft + local_offset_x - 1; + S32 offset_y = thumbnail_rect.mBottom + local_offset_y - 39; + + mSnapshotPanel->localPointToOtherView(offset_x, offset_y, &offset_x, &offset_y, getParentByType<LLFloater>()); + + gGL.matrixMode(LLRender::MM_MODELVIEW); + // Apply floater transparency to the texture unless the floater is focused. + F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + LLColor4 color = LLColor4::white; + gl_draw_scaled_image(offset_x, offset_y, + thumbnail_w, thumbnail_h, + previewp->getThumbnailImage(), color % alpha); + + previewp->drawPreviewRect(offset_x, offset_y) ; + } + + // Update the visibility of the working (computing preview) label + mWorkingLabel->setVisible(!(previewp && previewp->getSnapshotUpToDate())); + + // Enable Post if we have a preview to send and no on going connection being processed + mPostButton->setEnabled(no_ongoing_connection && (previewp && previewp->getSnapshotUpToDate())); + + // Draw the rest of the panel on top of it + LLPanel::draw(); +} + +LLSnapshotLivePreview* LLSocialPhotoPanel::getPreviewView() +{ + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)mPreviewHandle.get(); + return previewp; +} + +void LLSocialPhotoPanel::onVisibilityChange(const LLSD& new_visibility) +{ + bool visible = new_visibility.asBoolean(); + if (visible) + { + if (mPreviewHandle.get()) + { + LLSnapshotLivePreview* preview = getPreviewView(); + if(preview) + { + lldebugs << "opened, updating snapshot" << llendl; + preview->updateSnapshot(TRUE); + } + } + else + { + LLRect full_screen_rect = getRootView()->getRect(); + LLSnapshotLivePreview::Params p; + p.rect(full_screen_rect); + LLSnapshotLivePreview* previewp = new LLSnapshotLivePreview(p); + mPreviewHandle = previewp->getHandle(); + + previewp->setSnapshotType(previewp->SNAPSHOT_WEB); + previewp->setSnapshotFormat(LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); + //previewp->setSnapshotQuality(98); + previewp->setThumbnailPlaceholderRect(mThumbnailPlaceholder->getRect()); + + updateControls(); + } + } +} + +void LLSocialPhotoPanel::onClickNewSnapshot() +{ + LLSnapshotLivePreview* previewp = getPreviewView(); + if (previewp) + { + //setStatus(Impl::STATUS_READY); + lldebugs << "updating snapshot" << llendl; + previewp->updateSnapshot(TRUE); + } +} + +void LLSocialPhotoPanel::onSend() +{ + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialPhotoPanel"); // just in case it is already listening + LLEventPumps::instance().obtain("FacebookConnectState").listen("LLSocialPhotoPanel", boost::bind(&LLSocialPhotoPanel::onFacebookConnectStateChange, this, _1)); + + // Connect to Facebook if necessary and then post + if (LLFacebookConnect::instance().isConnected()) + { + sendPhoto(); + } + else + { + LLFacebookConnect::instance().checkConnectionToFacebook(true); + } +} + +bool LLSocialPhotoPanel::onFacebookConnectStateChange(const LLSD& data) +{ + switch (data.get("enum").asInteger()) + { + case LLFacebookConnect::FB_CONNECTED: + sendPhoto(); + break; + + case LLFacebookConnect::FB_POSTED: + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialPhotoPanel"); + clearAndClose(); + break; + } + + return false; +} + +void LLSocialPhotoPanel::sendPhoto() +{ + // Get the caption + std::string caption = mCaptionTextBox->getValue().asString(); + + // Get the image + LLSnapshotLivePreview* previewp = getPreviewView(); + + // Post to Facebook + LLFacebookConnect::instance().sharePhoto(previewp->getFormattedImage(), caption); + + updateControls(); +} + +void LLSocialPhotoPanel::clearAndClose() +{ + mCaptionTextBox->setValue(""); + + LLFloater* floater = getParentByType<LLFloater>(); + if (floater) + { + floater->closeFloater(); + } +} + +void LLSocialPhotoPanel::updateControls() +{ + LLSnapshotLivePreview* previewp = getPreviewView(); + BOOL got_bytes = previewp && previewp->getDataSize() > 0; + BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); + LLSnapshotLivePreview::ESnapshotType shot_type = (previewp ? previewp->getSnapshotType() : LLSnapshotLivePreview::SNAPSHOT_POSTCARD); + + // *TODO: Separate maximum size for Web images from postcards + lldebugs << "Is snapshot up-to-date? " << got_snap << llendl; + + LLLocale locale(LLLocale::USER_LOCALE); + std::string bytes_string; + if (got_snap) + { + LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); + } + + //getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : getString("unknown")); <---uses localized string + getChild<LLUICtrl>("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : "unknown"); + getChild<LLUICtrl>("file_size_label")->setColor( + shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD + && got_bytes + && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" )); + + updateResolution(FALSE); +} + +void LLSocialPhotoPanel::updateResolution(BOOL do_update) +{ + LLComboBox* combobox = static_cast<LLComboBox *>(mResolutionComboBox); + + std::string sdstring = combobox->getSelectedValue(); + LLSD sdres; + std::stringstream sstream(sdstring); + LLSDSerialize::fromNotation(sdres, sstream, sdstring.size()); + + S32 width = sdres[0]; + S32 height = sdres[1]; + + LLSnapshotLivePreview * previewp = static_cast<LLSnapshotLivePreview *>(mPreviewHandle.get()); + if (previewp && combobox->getCurrentIndex() >= 0) + { + S32 original_width = 0 , original_height = 0 ; + previewp->getSize(original_width, original_height) ; + + if (width == 0 || height == 0) + { + // take resolution from current window size + lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl; + previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); + } + else + { + // use the resolution from the selected pre-canned drop-down choice + lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl; + previewp->setSize(width, height); + } + + checkAspectRatio(width); + + previewp->getSize(width, height); + + if(original_width != width || original_height != height) + { + previewp->setSize(width, height); + + // hide old preview as the aspect ratio could be wrong + lldebugs << "updating thumbnail" << llendl; + + previewp->updateSnapshot(FALSE, TRUE); + if(do_update) + { + lldebugs << "Will update controls" << llendl; + updateControls(); + LLSocialPhotoPanel::onClickNewSnapshot(); + } + } + + } +} + +void LLSocialPhotoPanel::checkAspectRatio(S32 index) +{ + LLSnapshotLivePreview *previewp = getPreviewView() ; + + BOOL keep_aspect = FALSE; + + if (0 == index) // current window size + { + keep_aspect = TRUE; + } + else // predefined resolution + { + keep_aspect = FALSE; + } + + if (previewp) + { + previewp->mKeepAspectRatio = keep_aspect; + } +} + +LLUICtrl* LLSocialPhotoPanel::getRefreshBtn() +{ + return mRefreshBtn; +} + +//////////////////////// +//LLSocialCheckinPanel// +//////////////////////// + +LLSocialCheckinPanel::LLSocialCheckinPanel() : + mMapUrl(""), + mReloadingMapTexture(false) +{ + mCommitCallbackRegistrar.add("SocialSharing.SendCheckin", boost::bind(&LLSocialCheckinPanel::onSend, this)); +} + +BOOL LLSocialCheckinPanel::postBuild() +{ + // Keep pointers to widgets so we don't traverse the UI hierarchy too often + mPostButton = getChild<LLUICtrl>("post_place_btn"); + mCancelButton = getChild<LLUICtrl>("cancel_place_btn"); + mMessageTextEditor = getChild<LLUICtrl>("place_caption"); + mMapLoadingIndicator = getChild<LLUICtrl>("map_loading_indicator"); + mMapPlaceholder = getChild<LLIconCtrl>("map_placeholder"); + mMapDefault = getChild<LLIconCtrl>("map_default"); + mMapCheckBox = getChild<LLCheckBoxCtrl>("add_place_view_cb"); + + return LLPanel::postBuild(); +} + +void LLSocialCheckinPanel::draw() +{ + bool no_ongoing_connection = !(LLFacebookConnect::instance().isTransactionOngoing()); + mPostButton->setEnabled(no_ongoing_connection); + mCancelButton->setEnabled(no_ongoing_connection); + mMessageTextEditor->setEnabled(no_ongoing_connection); + mMapCheckBox->setEnabled(no_ongoing_connection); + + std::string map_url = get_map_url(); + // Did we change location? + if (map_url != mMapUrl) + { + mMapUrl = map_url; + // Load the map tile + mMapTexture = LLViewerTextureManager::getFetchedTextureFromUrl(mMapUrl, FTT_MAP_TILE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mMapTexture->setBoostLevel(LLGLTexture::BOOST_MAP); + mReloadingMapTexture = true; + // In the meantime, put the "loading" indicator on, hide the tile map and disable the checkbox + mMapLoadingIndicator->setVisible(true); + mMapPlaceholder->setVisible(false); + } + // Are we done loading the map tile? + if (mReloadingMapTexture && mMapTexture->isFullyLoaded()) + { + // Don't do it again next time around + mReloadingMapTexture = false; + // Convert the map texture to the appropriate image object + LLPointer<LLUIImage> ui_image = new LLUIImage(mMapUrl, mMapTexture); + // Load the map widget with the correct map tile image + mMapPlaceholder->setImage(ui_image); + // Now hide the loading indicator, bring the tile in view and reenable the checkbox with its previous value + mMapLoadingIndicator->setVisible(false); + mMapPlaceholder->setVisible(true); + } + // Show the default icon if that's the checkbox value (the real one...) + // This will hide/show the loading indicator and/or tile underneath + mMapDefault->setVisible(!(mMapCheckBox->get())); + + LLPanel::draw(); +} + +void LLSocialCheckinPanel::onSend() +{ + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialCheckinPanel"); // just in case it is already listening + LLEventPumps::instance().obtain("FacebookConnectState").listen("LLSocialCheckinPanel", boost::bind(&LLSocialCheckinPanel::onFacebookConnectStateChange, this, _1)); + + // Connect to Facebook if necessary and then post + if (LLFacebookConnect::instance().isConnected()) + { + sendCheckin(); + } + else + { + LLFacebookConnect::instance().checkConnectionToFacebook(true); + } +} + +bool LLSocialCheckinPanel::onFacebookConnectStateChange(const LLSD& data) +{ + switch (data.get("enum").asInteger()) + { + case LLFacebookConnect::FB_CONNECTED: + sendCheckin(); + break; + + case LLFacebookConnect::FB_POSTED: + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialCheckinPanel"); + clearAndClose(); + break; + } + + return false; +} + +void LLSocialCheckinPanel::sendCheckin() +{ + // Get the location SLURL + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + std::string slurl_string = slurl.getSLURLString(); + + // Use a valid http:// URL if the scheme is secondlife:// + LLURI slurl_uri(slurl_string); + if (slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME) + { + slurl_string = DEFAULT_CHECKIN_LOCATION_URL; + } + + // Add query parameters so Google Analytics can track incoming clicks! + slurl_string += DEFAULT_CHECKIN_QUERY_PARAMETERS; + + // Get the region name + std::string region_name = gAgent.getRegion()->getName(); + + // Get the region description + std::string description; + LLAgentUI::buildLocationString(description, LLAgentUI::LOCATION_FORMAT_NORMAL_COORDS, gAgent.getPositionAgent()); + + // Optionally add the region map view + bool add_map_view = mMapCheckBox->getValue().asBoolean(); + std::string map_url = (add_map_view ? get_map_url() : DEFAULT_CHECKIN_ICON_URL); + + // Get the caption + std::string caption = mMessageTextEditor->getValue().asString(); + + // Post to Facebook + LLFacebookConnect::instance().postCheckin(slurl_string, region_name, description, map_url, caption); +} + +void LLSocialCheckinPanel::clearAndClose() +{ + mMessageTextEditor->setValue(""); + + LLFloater* floater = getParentByType<LLFloater>(); + if (floater) + { + floater->closeFloater(); + } +} + +/////////////////////////// +//LLSocialAccountPanel////// +/////////////////////////// + +LLSocialAccountPanel::LLSocialAccountPanel() : +mAccountCaptionLabel(NULL), +mAccountNameLabel(NULL), +mPanelButtons(NULL), +mConnectButton(NULL), +mDisconnectButton(NULL) +{ + mCommitCallbackRegistrar.add("SocialSharing.Connect", boost::bind(&LLSocialAccountPanel::onConnect, this)); + mCommitCallbackRegistrar.add("SocialSharing.Disconnect", boost::bind(&LLSocialAccountPanel::onDisconnect, this)); + + setVisibleCallback(boost::bind(&LLSocialAccountPanel::onVisibilityChange, this, _2)); +} + +BOOL LLSocialAccountPanel::postBuild() +{ + mAccountCaptionLabel = getChild<LLTextBox>("account_caption_label"); + mAccountNameLabel = getChild<LLTextBox>("account_name_label"); + mPanelButtons = getChild<LLUICtrl>("panel_buttons"); + mConnectButton = getChild<LLUICtrl>("connect_btn"); + mDisconnectButton = getChild<LLUICtrl>("disconnect_btn"); + + return LLPanel::postBuild(); +} + +void LLSocialAccountPanel::draw() +{ + LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState(); + + //Disable the 'disconnect' button and the 'use another account' button when disconnecting in progress + bool disconnecting = connection_state == LLFacebookConnect::FB_DISCONNECTING; + mDisconnectButton->setEnabled(!disconnecting); + + //Disable the 'connect' button when a connection is in progress + bool connecting = connection_state == LLFacebookConnect::FB_CONNECTION_IN_PROGRESS; + mConnectButton->setEnabled(!connecting); + + LLPanel::draw(); +} + +void LLSocialAccountPanel::onVisibilityChange(const LLSD& new_visibility) +{ + bool visible = new_visibility.asBoolean(); + + if(visible) + { + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialAccountPanel"); + LLEventPumps::instance().obtain("FacebookConnectState").listen("LLSocialAccountPanel", boost::bind(&LLSocialAccountPanel::onFacebookConnectStateChange, this, _1)); + + LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLSocialAccountPanel"); + LLEventPumps::instance().obtain("FacebookConnectInfo").listen("LLSocialAccountPanel", boost::bind(&LLSocialAccountPanel::onFacebookConnectInfoChange, this)); + + //Connected + if(LLFacebookConnect::instance().isConnected()) + { + showConnectedLayout(); + } + //Check if connected (show disconnected layout in meantime) + else + { + showDisconnectedLayout(); + } + if ((LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_NOT_CONNECTED) || + (LLFacebookConnect::instance().getConnectionState() == LLFacebookConnect::FB_CONNECTION_FAILED)) + { + LLFacebookConnect::instance().checkConnectionToFacebook(); + } + } + else + { + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLSocialAccountPanel"); + LLEventPumps::instance().obtain("FacebookConnectInfo").stopListening("LLSocialAccountPanel"); + } +} + +bool LLSocialAccountPanel::onFacebookConnectStateChange(const LLSD& data) +{ + if(LLFacebookConnect::instance().isConnected()) + { + //In process of disconnecting so leave the layout as is + if(data.get("enum").asInteger() != LLFacebookConnect::FB_DISCONNECTING) + { + showConnectedLayout(); + } + } + else + { + showDisconnectedLayout(); + } + + return false; +} + +bool LLSocialAccountPanel::onFacebookConnectInfoChange() +{ + LLSD info = LLFacebookConnect::instance().getInfo(); + std::string clickable_name; + + //Strings of format [http://www.somewebsite.com Click Me] become clickable text + if(info.has("link") && info.has("name")) + { + clickable_name = "[" + info["link"].asString() + " " + info["name"].asString() + "]"; + } + + mAccountNameLabel->setText(clickable_name); + + return false; +} + +void LLSocialAccountPanel::showConnectButton() +{ + if(!mConnectButton->getVisible()) + { + mConnectButton->setVisible(TRUE); + mDisconnectButton->setVisible(FALSE); + } +} + +void LLSocialAccountPanel::hideConnectButton() +{ + if(mConnectButton->getVisible()) + { + mConnectButton->setVisible(FALSE); + mDisconnectButton->setVisible(TRUE); + } +} + +void LLSocialAccountPanel::showDisconnectedLayout() +{ + mAccountCaptionLabel->setText(getString("facebook_disconnected")); + mAccountNameLabel->setText(std::string("")); + showConnectButton(); +} + +void LLSocialAccountPanel::showConnectedLayout() +{ + LLFacebookConnect::instance().loadFacebookInfo(); + + mAccountCaptionLabel->setText(getString("facebook_connected")); + hideConnectButton(); +} + +void LLSocialAccountPanel::onConnect() +{ + LLFacebookConnect::instance().checkConnectionToFacebook(true); + + //Clear only the facebook browser cookies so that the facebook login screen appears + LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com"); +} + +void LLSocialAccountPanel::onDisconnect() +{ + LLFacebookConnect::instance().disconnectFromFacebook(); + + LLViewerMedia::getCookieStore()->removeCookiesByDomain(".facebook.com"); +} + +//////////////////////// +//LLFloaterSocial/////// +//////////////////////// + +LLFloaterSocial::LLFloaterSocial(const LLSD& key) : LLFloater(key), + mSocialPhotoPanel(NULL), + mStatusErrorText(NULL), + mStatusLoadingText(NULL), + mStatusLoadingIndicator(NULL) +{ + mCommitCallbackRegistrar.add("SocialSharing.Cancel", boost::bind(&LLFloaterSocial::onCancel, this)); +} + +void LLFloaterSocial::onCancel() +{ + closeFloater(); +} + +BOOL LLFloaterSocial::postBuild() +{ + // Keep tab of the Photo Panel + mSocialPhotoPanel = static_cast<LLSocialPhotoPanel*>(getChild<LLUICtrl>("panel_social_photo")); + // Connection status widgets + mStatusErrorText = getChild<LLTextBox>("connection_error_text"); + mStatusLoadingText = getChild<LLTextBox>("connection_loading_text"); + mStatusLoadingIndicator = getChild<LLUICtrl>("connection_loading_indicator"); + return LLFloater::postBuild(); +} + +// static +void LLFloaterSocial::preUpdate() +{ + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + if (instance) + { + //Will set file size text to 'unknown' + instance->mSocialPhotoPanel->updateControls(); + } +} + +// static +void LLFloaterSocial::postUpdate() +{ + LLFloaterSocial* instance = LLFloaterReg::findTypedInstance<LLFloaterSocial>("social"); + if (instance) + { + //Will set the file size text + instance->mSocialPhotoPanel->updateControls(); + + // The refresh button is initially hidden. We show it after the first update, + // i.e. after snapshot is taken + LLUICtrl * refresh_button = instance->mSocialPhotoPanel->getRefreshBtn(); + + if (!refresh_button->getVisible()) + { + refresh_button->setVisible(true); + } + + } +} + +void LLFloaterSocial::draw() +{ + if (mStatusErrorText && mStatusLoadingText && mStatusLoadingIndicator) + { + mStatusErrorText->setVisible(false); + mStatusLoadingText->setVisible(false); + mStatusLoadingIndicator->setVisible(false); + LLFacebookConnect::EConnectionState connection_state = LLFacebookConnect::instance().getConnectionState(); + std::string status_text; + + switch (connection_state) + { + case LLFacebookConnect::FB_NOT_CONNECTED: + // No status displayed when first opening the panel and no connection done + case LLFacebookConnect::FB_CONNECTED: + // When successfully connected, no message is displayed + case LLFacebookConnect::FB_POSTED: + // No success message to show since we actually close the floater after successful posting completion + break; + case LLFacebookConnect::FB_CONNECTION_IN_PROGRESS: + // Connection loading indicator + mStatusLoadingText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookConnecting"); + mStatusLoadingText->setValue(status_text); + mStatusLoadingIndicator->setVisible(true); + break; + case LLFacebookConnect::FB_POSTING: + // Posting indicator + mStatusLoadingText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookPosting"); + mStatusLoadingText->setValue(status_text); + mStatusLoadingIndicator->setVisible(true); + break; + case LLFacebookConnect::FB_CONNECTION_FAILED: + // Error connecting to the service + mStatusErrorText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookErrorConnecting"); + mStatusErrorText->setValue(status_text); + break; + case LLFacebookConnect::FB_POST_FAILED: + // Error posting to the service + mStatusErrorText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookErrorPosting"); + mStatusErrorText->setValue(status_text); + break; + case LLFacebookConnect::FB_DISCONNECTING: + // Disconnecting loading indicator + mStatusLoadingText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookDisconnecting"); + mStatusLoadingText->setValue(status_text); + mStatusLoadingIndicator->setVisible(true); + break; + case LLFacebookConnect::FB_DISCONNECT_FAILED: + // Error disconnecting from the service + mStatusErrorText->setVisible(true); + status_text = LLTrans::getString("SocialFacebookErrorDisconnecting"); + mStatusErrorText->setValue(status_text); + break; + } + } + LLFloater::draw(); +} + diff --git a/indra/newview/llfloatersocial.h b/indra/newview/llfloatersocial.h new file mode 100644 index 0000000000..309f015ce9 --- /dev/null +++ b/indra/newview/llfloatersocial.h @@ -0,0 +1,164 @@ +/** +* @file llfloatersocial.h +* @brief Header file for llfloatersocial +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ +#ifndef LL_LLFLOATERSOCIAL_H +#define LL_LLFLOATERSOCIAL_H + +#include "llfloater.h" +#include "lltextbox.h" +#include "llviewertexture.h" + +class LLIconCtrl; +class LLCheckBoxCtrl; +class LLSnapshotLivePreview; + +class LLSocialStatusPanel : public LLPanel +{ +public: + LLSocialStatusPanel(); + BOOL postBuild(); + void draw(); + void onSend(); + bool onFacebookConnectStateChange(const LLSD& data); + + void sendStatus(); + void clearAndClose(); + +private: + LLUICtrl* mMessageTextEditor; + LLUICtrl* mPostButton; + LLUICtrl* mCancelButton; +}; + +class LLSocialPhotoPanel : public LLPanel +{ +public: + LLSocialPhotoPanel(); + ~LLSocialPhotoPanel(); + + BOOL postBuild(); + void draw(); + + LLSnapshotLivePreview* getPreviewView(); + void onVisibilityChange(const LLSD& new_visibility); + void onClickNewSnapshot(); + void onSend(); + bool onFacebookConnectStateChange(const LLSD& data); + + void sendPhoto(); + void clearAndClose(); + + void updateControls(); + void updateResolution(BOOL do_update); + void checkAspectRatio(S32 index); + LLUICtrl* getRefreshBtn(); + +private: + LLHandle<LLView> mPreviewHandle; + + LLUICtrl * mSnapshotPanel; + LLUICtrl * mResolutionComboBox; + LLUICtrl * mRefreshBtn; + LLUICtrl * mWorkingLabel; + LLUICtrl * mThumbnailPlaceholder; + LLUICtrl * mCaptionTextBox; + LLUICtrl * mPostButton; + LLUICtrl* mCancelButton; +}; + +class LLSocialCheckinPanel : public LLPanel +{ +public: + LLSocialCheckinPanel(); + BOOL postBuild(); + void draw(); + void onSend(); + bool onFacebookConnectStateChange(const LLSD& data); + + void sendCheckin(); + void clearAndClose(); + +private: + std::string mMapUrl; + LLPointer<LLViewerFetchedTexture> mMapTexture; + LLUICtrl* mPostButton; + LLUICtrl* mCancelButton; + LLUICtrl* mMessageTextEditor; + LLUICtrl* mMapLoadingIndicator; + LLIconCtrl* mMapPlaceholder; + LLIconCtrl* mMapDefault; + LLCheckBoxCtrl* mMapCheckBox; + bool mReloadingMapTexture; +}; + +class LLSocialAccountPanel : public LLPanel +{ +public: + LLSocialAccountPanel(); + BOOL postBuild(); + void draw(); + +private: + void onVisibilityChange(const LLSD& new_visibility); + bool onFacebookConnectStateChange(const LLSD& data); + bool onFacebookConnectInfoChange(); + void onConnect(); + void onUseAnotherAccount(); + void onDisconnect(); + + void showConnectButton(); + void hideConnectButton(); + void showDisconnectedLayout(); + void showConnectedLayout(); + + LLTextBox * mAccountCaptionLabel; + LLTextBox * mAccountNameLabel; + LLUICtrl * mPanelButtons; + LLUICtrl * mConnectButton; + LLUICtrl * mDisconnectButton; +}; + + +class LLFloaterSocial : public LLFloater +{ +public: + LLFloaterSocial(const LLSD& key); + BOOL postBuild(); + void draw(); + void onCancel(); + + static void preUpdate(); + static void postUpdate(); + +private: + LLSocialPhotoPanel* mSocialPhotoPanel; + LLTextBox* mStatusErrorText; + LLTextBox* mStatusLoadingText; + LLUICtrl* mStatusLoadingIndicator; +}; + +#endif // LL_LLFLOATERSOCIAL_H + diff --git a/indra/newview/llfloatertoybox.cpp b/indra/newview/llfloatertoybox.cpp index 324afe661f..a025a859e7 100755 --- a/indra/newview/llfloatertoybox.cpp +++ b/indra/newview/llfloatertoybox.cpp @@ -107,7 +107,7 @@ void LLFloaterToybox::draw() { const LLCommandId& id = *it; - const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarView::TOOLBAR_NONE); + const bool command_not_present = (gToolBarView->hasCommand(id) == LLToolBarEnums::TOOLBAR_NONE); mToolBar->enableCommand(id, command_not_present); } @@ -175,9 +175,9 @@ void LLFloaterToybox::onToolBarButtonEnter(LLView* button) switch(command_loc) { - case LLToolBarView::TOOLBAR_BOTTOM: suffix = LLTrans::getString("Toolbar_Bottom_Tooltip"); break; - case LLToolBarView::TOOLBAR_LEFT: suffix = LLTrans::getString("Toolbar_Left_Tooltip"); break; - case LLToolBarView::TOOLBAR_RIGHT: suffix = LLTrans::getString("Toolbar_Right_Tooltip"); break; + case LLToolBarEnums::TOOLBAR_BOTTOM: suffix = LLTrans::getString("Toolbar_Bottom_Tooltip"); break; + case LLToolBarEnums::TOOLBAR_LEFT: suffix = LLTrans::getString("Toolbar_Left_Tooltip"); break; + case LLToolBarEnums::TOOLBAR_RIGHT: suffix = LLTrans::getString("Toolbar_Right_Tooltip"); break; default: break; diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 3fe2518de6..68dbb5ae33 100755 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -29,6 +29,7 @@ #include "llcombobox.h" #include "lliconctrl.h" #include "llfloaterreg.h" +#include "llfacebookconnect.h" #include "lllayoutstack.h" #include "llpluginclassmedia.h" #include "llprogressbar.h" @@ -46,7 +47,8 @@ LLFloaterWebContent::_Params::_Params() id("id"), window_class("window_class", "web_content"), show_chrome("show_chrome", true), - allow_address_entry("allow_address_entry", true), + allow_address_entry("allow_address_entry", true), + allow_back_forward_navigation("allow_back_forward_navigation", true), preferred_media_size("preferred_media_size"), trusted_content("trusted_content", false), show_page_title("show_page_title", true) @@ -65,7 +67,11 @@ LLFloaterWebContent::LLFloaterWebContent( const Params& params ) mBtnReload(NULL), mBtnStop(NULL), mUUID(params.id()), - mShowPageTitle(params.show_page_title) + mShowPageTitle(params.show_page_title), + mAllowNavigation(true), + mCurrentURL(""), + mDisplayURL(""), + mSecureURL(false) { mCommitCallbackRegistrar.add( "WebContent.Back", boost::bind( &LLFloaterWebContent::onClickBack, this )); mCommitCallbackRegistrar.add( "WebContent.Forward", boost::bind( &LLFloaterWebContent::onClickForward, this )); @@ -97,7 +103,7 @@ BOOL LLFloaterWebContent::postBuild() // cache image for secure browsing mSecureLockIcon = getChild< LLIconCtrl >("media_secure_lock_flag"); - + // initialize the URL history using the system URL History manager initializeURLHistory(); @@ -243,6 +249,7 @@ void LLFloaterWebContent::open_media(const Params& p) getChild<LLLayoutPanel>("status_bar")->setVisible(p.show_chrome); getChild<LLLayoutPanel>("nav_controls")->setVisible(p.show_chrome); bool address_entry_enabled = p.allow_address_entry && !p.trusted_content; + mAllowNavigation = p.allow_back_forward_navigation; getChildView("address")->setEnabled(address_entry_enabled); getChildView("popexternal")->setEnabled(address_entry_enabled); @@ -287,6 +294,16 @@ void LLFloaterWebContent::onOpen(const LLSD& key) //virtual void LLFloaterWebContent::onClose(bool app_quitting) { + // If we close the web browsing window showing the facebook login, we need to signal to this object that the connection will not happen + LLFloater* fbc_web = LLFloaterReg::getInstance("fbc_web"); + if (fbc_web == this) + { + if (!LLFacebookConnect::instance().isConnected()) + { + LLFacebookConnect::instance().setConnectionState(LLFacebookConnect::FB_CONNECTION_FAILED); + } + } + LLViewerMedia::proxyWindowClosed(mUUID); destroy(); } @@ -295,8 +312,11 @@ void LLFloaterWebContent::onClose(bool app_quitting) void LLFloaterWebContent::draw() { // this is asynchronous so we need to keep checking - mBtnBack->setEnabled( mWebBrowser->canNavigateBack() ); - mBtnForward->setEnabled( mWebBrowser->canNavigateForward() ); + mBtnBack->setEnabled( mWebBrowser->canNavigateBack() && mAllowNavigation); + mBtnForward->setEnabled( mWebBrowser->canNavigateForward() && mAllowNavigation); + + // Show/hide the lock icon + mSecureLockIcon->setVisible(mSecureURL && !mAddressCombo->hasFocus()); LLFloater::draw(); } @@ -342,19 +362,8 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent // we populate the status bar with URLs as they change so clear it now we're done const std::string end_str = ""; mStatusBarText->setText( end_str ); - - // decide if secure browsing icon should be displayed - std::string prefix = std::string("https://"); - std::string test_prefix = mCurrentURL.substr(0, prefix.length()); - LLStringUtil::toLower(test_prefix); - if(test_prefix == prefix) - { - mSecureLockIcon->setVisible(true); - } - else - { - mSecureLockIcon->setVisible(false); - } + mAddressCombo->setLeftTextPadding(22); + mAddressCombo->setLeftTextPadding(2); } else if(event == MEDIA_EVENT_CLOSE_REQUEST) { @@ -363,7 +372,10 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent } else if(event == MEDIA_EVENT_GEOMETRY_CHANGE) { - geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); + if (mCurrentURL.find("facebook.com/dialog/oauth") == std::string::npos) // HACK to fix ACME-1317 - Cho + { + geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); + } } else if(event == MEDIA_EVENT_STATUS_TEXT_CHANGED ) { @@ -397,15 +409,40 @@ void LLFloaterWebContent::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent void LLFloaterWebContent::set_current_url(const std::string& url) { - mCurrentURL = url; - - // serialize url history into the system URL History manager - LLURLHistory::removeURL("browser", mCurrentURL); - LLURLHistory::addURL("browser", mCurrentURL); - - mAddressCombo->remove( mCurrentURL ); - mAddressCombo->add( mCurrentURL ); - mAddressCombo->selectByValue( mCurrentURL ); + if (!url.empty()) + { + if (!mCurrentURL.empty()) + { + // Clean up the current browsing list to show true URL + mAddressCombo->remove(mDisplayURL); + mAddressCombo->add(mCurrentURL); + } + + // Update current URL + mCurrentURL = url; + LLStringUtil::trim(mCurrentURL); + + // Serialize url history into the system URL History manager + LLURLHistory::removeURL("browser", mCurrentURL); + LLURLHistory::addURL("browser", mCurrentURL); + + // Check if this is a secure URL + static const std::string secure_prefix = std::string("https://"); + std::string prefix = mCurrentURL.substr(0, secure_prefix.length()); + LLStringUtil::toLower(prefix); + mSecureURL = (prefix == secure_prefix); + + // Hack : we move the text a bit to make space for the lock icon in the secure URL case + mDisplayURL = (mSecureURL ? " " + mCurrentURL : mCurrentURL); + + // Clean up browsing list (prevent dupes) and add/select the new URL to it + mAddressCombo->remove(mCurrentURL); + mAddressCombo->add(mDisplayURL); + mAddressCombo->selectByValue(mDisplayURL); + + // Set the focus back to the web page. When setting the url, there's no point to leave the focus anywhere else. + mWebBrowser->setFocus(TRUE); + } } void LLFloaterWebContent::onClickForward() @@ -449,6 +486,7 @@ void LLFloaterWebContent::onEnterAddress() // make sure there is at least something there. // (perhaps this test should be for minimum length of a URL) std::string url = mAddressCombo->getValue().asString(); + LLStringUtil::trim(url); if ( url.length() > 0 ) { mWebBrowser->navigateTo( url, "text/html"); @@ -460,6 +498,7 @@ void LLFloaterWebContent::onPopExternal() // make sure there is at least something there. // (perhaps this test should be for minimum length of a URL) std::string url = mAddressCombo->getValue().asString(); + LLStringUtil::trim(url); if ( url.length() > 0 ) { LLWeb::loadURLExternal( url ); diff --git a/indra/newview/llfloaterwebcontent.h b/indra/newview/llfloaterwebcontent.h index 86b5a5e00b..f22940cd07 100755 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -55,6 +55,7 @@ public: id; Optional<bool> show_chrome, allow_address_entry, + allow_back_forward_navigation, trusted_content, show_page_title; Optional<LLRect> preferred_media_size; @@ -106,9 +107,12 @@ protected: LLView* mBtnReload; LLView* mBtnStop; - std::string mCurrentURL; + std::string mCurrentURL; // Current URL + std::string mDisplayURL; // URL being displayed in the address bar (can differ by trailing / leading space) std::string mUUID; bool mShowPageTitle; + bool mAllowNavigation; + bool mSecureURL; // true when the current url is prefixed "https://" }; #endif // LL_LLFLOATERWEBCONTENT_H diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 137b5446cf..cb637c7162 100755 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -627,8 +627,8 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) if (!sim_info) { // We haven't found a region for that point yet, leave the tracking to the world map - LLWorldMap::getInstance()->setTracking(pos_global); LLTracker::stopTracking(NULL); + LLWorldMap::getInstance()->setTracking(pos_global); S32 world_x = S32(pos_global.mdV[0] / 256); S32 world_y = S32(pos_global.mdV[1] / 256); LLWorldMapMessage::getInstance()->sendMapBlockRequest(world_x, world_y, world_x, world_y, true); @@ -643,9 +643,9 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) { // Down region. Show the blue circle of death! // i.e. let the world map that this and tell it it's invalid + LLTracker::stopTracking(NULL); LLWorldMap::getInstance()->setTracking(pos_global); LLWorldMap::getInstance()->setTrackingInvalid(); - LLTracker::stopTracking(NULL); setDefaultBtn(""); // clicked on a down region - turn off coord display @@ -665,8 +665,8 @@ void LLFloaterWorldMap::trackLocation(const LLVector3d& pos_global) std::string tooltip(""); mTrackedStatus = LLTracker::TRACKING_LOCATION; - LLTracker::trackLocation(pos_global, full_name, tooltip); LLWorldMap::getInstance()->cancelTracking(); // The floater is taking over the tracking + LLTracker::trackLocation(pos_global, full_name, tooltip); LLVector3d coord_pos = LLTracker::getTrackedPositionGlobal(); updateTeleportCoordsDisplay( coord_pos ); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 60fa53f491..c4c1827266 100755 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -62,6 +62,7 @@ #include "llresmgr.h" #include "pipeline.h" #include "llspatialpartition.h" +#include "llviewershadermgr.h" // Height of the yellow selection highlight posts for land const F32 PARCEL_POST_HEIGHT = 0.666f; @@ -767,7 +768,6 @@ void draw_line_cube(F32 width, const LLVector3& center) gGL.vertex3f(center.mV[VX] + width ,center.mV[VY] - width,center.mV[VZ] - width); } - void LLViewerObjectList::renderObjectBeacons() { if (mDebugBeacons.empty()) @@ -878,3 +878,134 @@ void LLViewerObjectList::renderObjectBeacons() } +void gpu_benchmark() +{ + if (!LLGLSLShader::sNoFixedFunction) + { //don't bother benchmarking the fixed function + return; + } + + //measure memory bandwidth by: + // - allocating a batch of textures and render targets + // - rendering those textures to those render targets + // - recording time taken + // - taking the median time for a given number of samples + + //resolution of textures/render targets + const U32 res = 1024; + + //number of textures + const U32 count = 32; + + //number of samples to take + const S32 samples = 64; + + LLGLSLShader::initProfile(); + + LLRenderTarget dest[count]; + U32 source[count]; + LLImageGL::generateTextures(count, source); + std::vector<F32> results; + + //build a random texture + U8 pixels[res*res*4]; + + for (U32 i = 0; i < res*res*4; ++i) + { + pixels[i] = (U8) ll_rand(255); + } + + + gGL.setColorMask(true, true); + LLGLDepthTest depth(GL_FALSE); + + for (U32 i = 0; i < count; ++i) + { //allocate render targets and textures + dest[i].allocate(res,res,GL_RGBA,false, false, LLTexUnit::TT_TEXTURE, true); + dest[i].bindTarget(); + dest[i].clear(); + dest[i].flush(); + + gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); + LLImageGL::setManualImage(GL_TEXTURE_2D, 0, GL_RGBA, res,res,GL_RGBA, GL_UNSIGNED_BYTE, pixels); + } + + //make a dummy triangle to draw with + LLPointer<LLVertexBuffer> buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, GL_STATIC_DRAW_ARB); + buff->allocateBuffer(3, 0, true); + + LLStrider<LLVector3> v; + LLStrider<LLVector2> tc; + + buff->getVertexStrider(v); + + v[0].set(-1,1,0); + v[1].set(-1,-3,0); + v[2].set(3,1,0); + buff->flush(); + + gBenchmarkProgram.bind(); + buff->setBuffer(LLVertexBuffer::MAP_VERTEX); + + //wait for any previoius GL commands to finish + glFinish(); + + for (S32 c = -1; c < samples; ++c) + { + LLTimer timer; + timer.start(); + + for (U32 i = 0; i < count; ++i) + { + dest[i].bindTarget(); + gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, source[i]); + buff->drawArrays(LLRender::TRIANGLES, 0, 3); + dest[i].flush(); + } + + //wait for current batch of copies to finish + glFinish(); + + F32 time = timer.getElapsedTimeF32(); + + if (c >= 0) // <-- ignore the first sample as it tends to be artificially slow + { + //store result in gigabytes per second + F32 gb = (F32) ((F64) (res*res*8*count))/(1000000000); + + F32 gbps = gb/time; + + results.push_back(gbps); + } + } + + gBenchmarkProgram.unbind(); + + LLGLSLShader::finishProfile(); + + LLImageGL::deleteTextures(count, source); + + + std::sort(results.begin(), results.end()); + + F32 gbps = results[results.size()/2]; + + llinfos << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to CPU timers" << llendl; + + F32 ms = gBenchmarkProgram.mTimeElapsed/1000000.f; + F32 seconds = ms/1000.f; + + F64 samples_drawn = res*res*count*samples; + F32 samples_sec = (samples_drawn/1000000000.0)/seconds; + gbps = samples_sec*8; + + if (gGLManager.mHasTimerQuery) + { + llinfos << "Memory bandwidth is " << llformat("%.3f", gbps) << "GB/sec according to ARB_timer_query" << llendl; + } + else + { + llinfos << "ARB_timer_query unavailable." << llendl; + } +} + diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp index cbd844cdac..7ea08539f9 100755 --- a/indra/newview/llgroupmgr.cpp +++ b/indra/newview/llgroupmgr.cpp @@ -77,6 +77,7 @@ LLRoleActionSet::~LLRoleActionSet() { delete mActionSetData; std::for_each(mActions.begin(), mActions.end(), DeletePointer()); + mActions.clear(); } // diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 2e53effcac..70ffdc14ff 100755 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -130,10 +130,10 @@ void process_dnd_im(const LLSD& notification) fromID, false, false); //will need slight refactor to retrieve whether offline message or not (assume online for now) - } + } notify_of_message(data, true); -} + } @@ -155,22 +155,22 @@ static void on_avatar_name_cache_toast(const LLUUID& agent_id, void notify_of_message(const LLSD& msg, bool is_dnd_msg) { - std::string user_preferences; + std::string user_preferences; LLUUID participant_id = msg[is_dnd_msg ? "FROM_ID" : "from_id"].asUUID(); LLUUID session_id = msg[is_dnd_msg ? "SESSION_ID" : "session_id"].asUUID(); - LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(session_id); - // do not show notification which goes from agent - if (gAgent.getID() == participant_id) - { - return; - } + // do not show notification which goes from agent + if (gAgent.getID() == participant_id) + { + return; + } - // determine state of conversations floater - enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status; + // determine state of conversations floater + enum {CLOSED, NOT_ON_TOP, ON_TOP, ON_TOP_AND_ITEM_IS_SELECTED} conversations_floater_status; - LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); + LLFloaterIMContainer* im_box = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::getConversation(session_id); bool store_dnd_message = false; // flag storage of a dnd message bool is_session_focused = session_floater->isTornOff() && session_floater->hasFocus(); @@ -179,23 +179,23 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) conversations_floater_status = CLOSED; } else if (!im_box->hasFocus() && - !(session_floater && LLFloater::isVisible(session_floater) - && !session_floater->isMinimized() && session_floater->hasFocus())) + !(session_floater && LLFloater::isVisible(session_floater) + && !session_floater->isMinimized() && session_floater->hasFocus())) { conversations_floater_status = NOT_ON_TOP; } else if (im_box->getSelectedSession() != session_id) { conversations_floater_status = ON_TOP; - } + } else { conversations_floater_status = ON_TOP_AND_ITEM_IS_SELECTED; } - // determine user prefs for this session - if (session_id.isNull()) - { + // determine user prefs for this session + if (session_id.isNull()) + { if (msg["source_type"].asInteger() == CHAT_SOURCE_OBJECT) { user_preferences = gSavedSettings.getString("NotificationObjectIMOptions"); @@ -206,50 +206,50 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions"); + user_preferences = gSavedSettings.getString("NotificationNearbyChatOptions"); if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNearbyChatIM") == TRUE)) { make_ui_sound("UISndNewIncomingIMSession"); - } + } } } - else if(session->isP2PSessionType()) - { - if (LLAvatarTracker::instance().isBuddy(participant_id)) - { - user_preferences = gSavedSettings.getString("NotificationFriendIMOptions"); + else if(session->isP2PSessionType()) + { + if (LLAvatarTracker::instance().isBuddy(participant_id)) + { + user_preferences = gSavedSettings.getString("NotificationFriendIMOptions"); if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundFriendIM") == TRUE)) { make_ui_sound("UISndNewIncomingIMSession"); } - } - else - { - user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions"); + } + else + { + user_preferences = gSavedSettings.getString("NotificationNonFriendIMOptions"); if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundNonFriendIM") == TRUE)) { make_ui_sound("UISndNewIncomingIMSession"); - } - } + } + } } - else if(session->isAdHocSessionType()) - { - user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions"); + else if(session->isAdHocSessionType()) + { + user_preferences = gSavedSettings.getString("NotificationConferenceIMOptions"); if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundConferenceIM") == TRUE)) { make_ui_sound("UISndNewIncomingIMSession"); - } + } } - else if(session->isGroupSessionType()) - { - user_preferences = gSavedSettings.getString("NotificationGroupChatOptions"); + else if(session->isGroupSessionType()) + { + user_preferences = gSavedSettings.getString("NotificationGroupChatOptions"); if (!gAgent.isDoNotDisturb() && (gSavedSettings.getBOOL("PlaySoundGroupChatIM") == TRUE)) { make_ui_sound("UISndNewIncomingIMSession"); } - } + } - // actions: + // actions: // 0. nothing - exit if (("noaction" == user_preferences || @@ -287,23 +287,23 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } } } - else - { + else + { store_dnd_message = true; - } + } - } + } - // 2. Flash line item - if ("openconversations" == user_preferences - || ON_TOP == conversations_floater_status - || ("toast" == user_preferences && ON_TOP != conversations_floater_status) + // 2. Flash line item + if ("openconversations" == user_preferences + || ON_TOP == conversations_floater_status + || ("toast" == user_preferences && ON_TOP != conversations_floater_status) || ("flash" == user_preferences && (CLOSED == conversations_floater_status || NOT_ON_TOP == conversations_floater_status)) || is_dnd_msg) - { - if(!LLMuteList::getInstance()->isMuted(participant_id)) - { + { + if(!LLMuteList::getInstance()->isMuted(participant_id)) + { if(gAgent.isDoNotDisturb()) { store_dnd_message = true; @@ -318,43 +318,43 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - im_box->flashConversationItemWidget(session_id, true); - } - } + im_box->flashConversationItemWidget(session_id, true); + } + } } } - // 3. Flash FUI button - if (("toast" == user_preferences || "flash" == user_preferences) && - (CLOSED == conversations_floater_status + // 3. Flash FUI button + if (("toast" == user_preferences || "flash" == user_preferences) && + (CLOSED == conversations_floater_status || NOT_ON_TOP == conversations_floater_status) && !is_session_focused && !is_dnd_msg) //prevent flashing FUI button because the conversation floater will have already opened { if(!LLMuteList::getInstance()->isMuted(participant_id)) - { + { if(!gAgent.isDoNotDisturb()) - { + { gToolBarView->flashCommand(LLCommandId("chat"), true, im_box->isMinimized()); - } + } else { store_dnd_message = true; } - } + } } - // 4. Toast - if ((("toast" == user_preferences) && + // 4. Toast + if ((("toast" == user_preferences) && (ON_TOP_AND_ITEM_IS_SELECTED != conversations_floater_status) && (!session_floater->isTornOff() || !LLFloater::isVisible(session_floater))) - || !session_floater->isMessagePaneExpanded()) + || !session_floater->isMessagePaneExpanded()) - { - //Show IM toasts (upper right toasts) - // Skip toasting for system messages and for nearby chat - if(session_id.notNull() && participant_id.notNull()) - { + { + //Show IM toasts (upper right toasts) + // Skip toasting for system messages and for nearby chat + if(session_id.notNull() && participant_id.notNull()) + { if(!is_dnd_msg) { if(gAgent.isDoNotDisturb()) @@ -363,10 +363,10 @@ void notify_of_message(const LLSD& msg, bool is_dnd_msg) } else { - LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); - } - } - } + LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg)); + } + } +} } if (store_dnd_message) { @@ -1959,11 +1959,11 @@ LLDockControl::DocAt LLCallDialog::getDockControlPos(const std::string& toolbarB switch (toolbar_loc) { - case LLToolBarView::TOOLBAR_LEFT: + case LLToolBarEnums::TOOLBAR_LEFT: doc_at = LLDockControl::RIGHT; break; - case LLToolBarView::TOOLBAR_RIGHT: + case LLToolBarEnums::TOOLBAR_RIGHT: doc_at = LLDockControl::LEFT; break; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e4fc469bb7..44943d8722 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -74,6 +74,7 @@ #include "llvoavatarself.h" #include "llwearablelist.h" #include "lllandmarkactions.h" +#include "llpanellandmarks.h" void copy_slurl_to_clipboard_callback_inv(const std::string& slurl); @@ -1449,6 +1450,38 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action) } } } + else if ("show_on_map" == action) + { + doActionOnCurSelectedLandmark(boost::bind(&LLItemBridge::doShowOnMap, this, _1)); + } +} + +void LLItemBridge::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb) +{ + LLViewerInventoryItem* cur_item = getItem(); + if(cur_item && cur_item->getInventoryType() == LLInventoryType::IT_LANDMARK) + { + LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getUUID(), cb); + if (landmark) + { + cb(landmark); + } + } +} + +void LLItemBridge::doShowOnMap(LLLandmark* landmark) +{ + LLVector3d landmark_global_pos; + // landmark has already been tested for NULL by calling routine + if (landmark->getGlobalPos(landmark_global_pos)) + { + LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); + if (!landmark_global_pos.isExactlyZero() && worldmap_instance) + { + worldmap_instance->trackLocation(landmark_global_pos); + LLFloaterReg::showInstance("world_map", "center"); + } + } } void copy_slurl_to_clipboard_callback_inv(const std::string& slurl) @@ -4580,6 +4613,7 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Landmark Separator")); items.push_back(std::string("url_copy")); items.push_back(std::string("About Landmark")); + items.push_back(std::string("show_on_map")); } // Disable "About Landmark" menu item for @@ -4739,6 +4773,16 @@ void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string act LLAvatarActions::offerTeleport(item->getCreatorUUID()); } } + else if ("request_lure" == action) + { + LLViewerInventoryItem *item = getItem(); + if (item && (item->getCreatorUUID() != gAgent.getID()) && + (!item->getCreatorUUID().isNull())) + { + LLAvatarActions::teleportRequest(item->getCreatorUUID()); + } + } + else LLItemBridge::performAction(model, action); } @@ -4825,6 +4869,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) items.push_back(std::string("Send Instant Message Separator")); items.push_back(std::string("Send Instant Message")); items.push_back(std::string("Offer Teleport...")); + items.push_back(std::string("Request Teleport...")); items.push_back(std::string("Conference Chat")); if (!good_card) @@ -4834,6 +4879,7 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) if (!good_card || !user_online) { disabled_items.push_back(std::string("Offer Teleport...")); + disabled_items.push_back(std::string("Request Teleport...")); disabled_items.push_back(std::string("Conference Chat")); } } diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 517153e171..bc875e8f37 100755 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -36,6 +36,7 @@ #include "llviewercontrol.h" #include "llviewerwearable.h" #include "lltooldraganddrop.h" +#include "lllandmarklist.h" class LLInventoryFilter; class LLInventoryPanel; @@ -239,7 +240,10 @@ protected: BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response); virtual BOOL isItemPermissive() const; virtual void buildDisplayName() const; + void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb); +private: + void doShowOnMap(LLLandmark* landmark); }; class LLFolderBridge : public LLInvFVBridge diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 3c6974cf6d..15463e0d33 100755 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -139,7 +139,14 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const { return passed_clipboard; } - + + // show folder links + LLViewerInventoryItem* item = gInventory.getItem(folder_id); + if (item && item->getActualType() == LLAssetType::AT_LINK_FOLDER) + { + return passed_clipboard; + } + if (mFilterOps.mFilterTypes & FILTERTYPE_CATEGORY) { // Can only filter categories for items in your inventory diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp index dd402de394..a92df8250e 100755 --- a/indra/newview/lllandmarklist.cpp +++ b/indra/newview/lllandmarklist.cpp @@ -46,6 +46,7 @@ LLLandmarkList gLandmarkList; LLLandmarkList::~LLLandmarkList() { std::for_each(mList.begin(), mList.end(), DeletePairedPointer()); + mList.clear(); } LLLandmark* LLLandmarkList::getAsset(const LLUUID& asset_uuid, loaded_callback_t cb) diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 5022dba934..dbdff11f11 100755 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -407,14 +407,14 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) // - Make the "Add landmark" button updated when either current parcel gets changed // or a landmark gets created or removed from the inventory. // - Update the location string on parcel change. - mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( + mParcelMgrConnection = gAgent.addParcelChangedCallback( boost::bind(&LLLocationInputCtrl::onAgentParcelChange, this)); // LLLocationHistory instance is being created before the location input control, so we have to update initial state of button manually. mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0); mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback( boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1)); - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLLocationInputCtrl::onRegionBoundaryCrossed, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLLocationInputCtrl::onRegionBoundaryCrossed, this)); createNavMeshStatusListenerForCurrentRegion(); mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this); diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp index a567d1217a..8879cfd7fb 100755 --- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp +++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp @@ -79,7 +79,7 @@ void LLMenuOptionPathfindingRebakeNavmesh::initialize() if ( !mRegionCrossingSlot.connected() ) { - mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); + mRegionCrossingSlot = gAgent.addRegionChangedCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this)); } if (!mAgentStateSlot.connected()) diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index ebfb22a360..5afd2cb329 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2005&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010-2013, Linden Research, Inc. + * Copyright (C) 2010-2014, Linden Research, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -257,6 +257,11 @@ // mGetMeshVersion mMutex rw.main.mMutex, ro.repo.mMutex // mHttp* none rw.repo.none // +// LLMeshUploadThread: +// +// mDiscarded mMutex rw.main.mMutex, ro.uploadN.none [1] +// ... more ... +// // QA/Development Testing // // Debug variable 'MeshUploadFakeErrors' takes a mask of bits that will @@ -354,6 +359,16 @@ const U32 LARGE_MESH_FETCH_THRESHOLD = 1U << 21; // Size at which requests goes const long SMALL_MESH_XFER_TIMEOUT = 120L; // Seconds to complete xfer, small mesh downloads const long LARGE_MESH_XFER_TIMEOUT = 600L; // Seconds to complete xfer, large downloads +// Would normally like to retry on uploads as some +// retryable failures would be recoverable. Unfortunately, +// the mesh service is using 500 (retryable) rather than +// 400/bad request (permanent) for a bad payload and +// retrying that just leads to revocation of the one-shot +// cap which then produces a 404 on retry destroying some +// (occasionally) useful error information. We'll leave +// upload retries to the user as in the past. SH-4667. +const long UPLOAD_RETRY_LIMIT = 0L; + // Maximum mesh version to support. Three least significant digits are reserved for the minor version, // with major version changes indicating a format change that is not backwards compatible and should not // be parsed by viewers that don't specifically support that version. For example, if the integer "1" is @@ -1852,7 +1867,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, LLHandle<LLWholeModelUploadObserver> upload_observer) : LLThread("mesh upload"), LLCore::HttpHandler(), - mDiscarded(FALSE), + mDiscarded(false), mDoUpload(do_upload), mWholeModelUploadURL(upload_url), mFeeObserverHandle(fee_observer), @@ -1878,6 +1893,7 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mHttpOptions = new LLCore::HttpOptions; mHttpOptions->setTransferTimeout(mMeshUploadTimeOut); mHttpOptions->setUseRetryAfter(gSavedSettings.getBOOL("MeshUseHttpRetryAfter")); + mHttpOptions->setRetries(UPLOAD_RETRY_LIMIT); mHttpHeaders = new LLCore::HttpHeaders; mHttpHeaders->append("Content-Type", "application/llsd+xml"); mHttpPolicyClass = LLAppViewer::instance()->getAppCoreHttp().getPolicy(LLAppCoreHttp::AP_UPLOADS); @@ -1940,10 +1956,10 @@ void LLMeshUploadThread::preStart() void LLMeshUploadThread::discard() { LLMutexLock lock(mMutex); - mDiscarded = TRUE; + mDiscarded = true; } -BOOL LLMeshUploadThread::isDiscarded() const +bool LLMeshUploadThread::isDiscarded() const { LLMutexLock lock(mMutex); return mDiscarded; @@ -2199,7 +2215,13 @@ void LLMeshUploadThread::generateHulls() if (has_valid_requests) { - while (!mPhysicsComplete) + // *NOTE: Interesting livelock condition on shutdown. If there + // is an upload request in generateHulls() when shutdown starts, + // the main thread isn't available to manage communication between + // the decomposition thread and the upload thread and this loop + // wouldn't complete in turn stalling the main thread. The check + // on isDiscarded() prevents that. + while (! mPhysicsComplete && ! isDiscarded()) { apr_sleep(100); } @@ -2253,13 +2275,21 @@ void LLMeshUploadThread::doWholeModelUpload() LL_DEBUGS(LOG_MESH) << "POST request issued." << LL_ENDL; mHttpRequest->update(0); - while (! LLApp::isQuitting() && ! mFinished) + while (! LLApp::isQuitting() && ! finished() && ! isDiscarded()) { ms_sleep(sleep_time); sleep_time = llmin(250U, sleep_time + sleep_time); mHttpRequest->update(0); } - LL_DEBUGS(LOG_MESH) << "Mesh upload operation completed." << LL_ENDL; + + if (isDiscarded()) + { + LL_DEBUGS(LOG_MESH) << "Mesh upload operation discarded." << LL_ENDL; + } + else + { + LL_DEBUGS(LOG_MESH) << "Mesh upload operation completed." << LL_ENDL; + } } } } @@ -2299,12 +2329,16 @@ void LLMeshUploadThread::requestWholeModelFee() U32 sleep_time(10); mHttpRequest->update(0); - while (! LLApp::isQuitting() && ! mFinished) + while (! LLApp::isQuitting() && ! finished() && ! isDiscarded()) { ms_sleep(sleep_time); sleep_time = llmin(250U, sleep_time + sleep_time); mHttpRequest->update(0); } + if (isDiscarded()) + { + LL_DEBUGS(LOG_MESH) << "Mesh fee query operation discarded." << LL_ENDL; + } } } @@ -3020,7 +3054,7 @@ void LLMeshRepository::shutdown() for (U32 i = 0; i < mUploads.size(); ++i) { - LL_INFOS(LOG_MESH) << "Waiting for pending mesh upload " << i << "/" << mUploads.size() << LL_ENDL; + LL_INFOS(LOG_MESH) << "Waiting for pending mesh upload " << (i + 1) << "/" << mUploads.size() << LL_ENDL; while (!mUploads[i]->isStopped()) { apr_sleep(10); diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 9d8b102110..39280bea3a 100755 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -447,7 +447,7 @@ public: bool mUploadTextures; bool mUploadSkin; bool mUploadJoints; - BOOL mDiscarded; + volatile bool mDiscarded; LLHost mHost; std::string mWholeModelFeeCapability; @@ -463,7 +463,7 @@ public: virtual void run(); void preStart(); void discard() ; - BOOL isDiscarded() const; + bool isDiscarded() const; void generateHulls(); diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index eb6591eb39..8bddf49fb5 100755 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -140,7 +140,7 @@ BOOL LLFloaterMove::postBuild() initMovementMode(); - LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(LLFloaterMove::sUpdateFlyingStatus); + gAgent.addParcelChangedCallback(LLFloaterMove::sUpdateFlyingStatus); return TRUE; } @@ -698,14 +698,14 @@ void LLPanelStandStopFlying::updatePosition() S32 y_pos = 0; S32 bottom_tb_center = 0; - if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_BOTTOM)) + if (LLToolBar* toolbar_bottom = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_BOTTOM)) { y_pos = toolbar_bottom->getRect().getHeight(); bottom_tb_center = toolbar_bottom->getRect().getCenterX(); } S32 left_tb_width = 0; - if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarView::TOOLBAR_LEFT)) + if (LLToolBar* toolbar_left = gToolBarView->getToolbar(LLToolBarEnums::TOOLBAR_LEFT)) { left_tb_width = toolbar_left->getRect().getWidth(); } diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 54522bb7f6..0720d443f8 100755 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -251,6 +251,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags) llinfos << "Muting by name " << mute.mName << llendl; updateAdd(mute); notifyObservers(); + notifyObserversDetailed(mute); return TRUE; } else @@ -299,6 +300,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags) llinfos << "Muting " << localmute.mName << " id " << localmute.mID << " flags " << localmute.mFlags << llendl; updateAdd(localmute); notifyObservers(); + notifyObserversDetailed(localmute); if(!(localmute.mFlags & LLMute::flagParticles)) { //Kill all particle systems owned by muted task @@ -396,6 +398,7 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags) } // Must be after erase. + notifyObserversDetailed(localmute); setLoaded(); // why is this here? -MG } else @@ -409,6 +412,7 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags) updateRemove(mute); mLegacyMutes.erase(legacy_it); // Must be after erase. + notifyObserversDetailed(mute); setLoaded(); // why is this here? -MG } } @@ -762,3 +766,16 @@ void LLMuteList::notifyObservers() it = mObservers.upper_bound(observer); } } + +void LLMuteList::notifyObserversDetailed(const LLMute& mute) +{ + for (observer_set_t::iterator it = mObservers.begin(); + it != mObservers.end(); + ) + { + LLMuteListObserver* observer = *it; + observer->onChangeDetailed(mute); + // In case onChange() deleted an entry. + it = mObservers.upper_bound(observer); + } +} diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 7a70370fe3..3e998b4f0e 100755 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -123,6 +123,7 @@ private: void setLoaded(); void notifyObservers(); + void notifyObserversDetailed(const LLMute &mute); void updateAdd(const LLMute& mute); void updateRemove(const LLMute& mute); @@ -173,6 +174,7 @@ class LLMuteListObserver public: virtual ~LLMuteListObserver() { } virtual void onChange() = 0; + virtual void onChangeDetailed(const LLMute& ) { } }; diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index dea90b9042..08b5eaedbb 100755 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -343,8 +343,11 @@ void LLNetMap::draw() // Draw avatars for (U32 i = 0; i < avatar_ids.size(); i++) { - pos_map = globalPosToView(positions[i]); LLUUID uuid = avatar_ids[i]; + // Skip self, we'll draw it later + if (uuid == gAgent.getID()) continue; + + pos_map = globalPosToView(positions[i]); bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL); diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 08c98e4f28..a3b15931c6 100755 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -35,6 +35,9 @@ #include "llnotificationmanager.h" #include "llnotifications.h" #include "llscriptfloater.h" +#include "llfacebookconnect.h" +#include "llavatarname.h" +#include "llavatarnamecache.h" using namespace LLNotificationsUI; @@ -87,7 +90,7 @@ bool LLScriptHandler::processNotification(const LLNotificationPtr& notification) { LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID()); } - else + else if (notification->canShowToast()) { LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification); diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index c15b6bd0d3..ff8bfafb79 100755 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -343,7 +343,7 @@ private: ////////////////////////////////////////////////////////////////////////// -static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list"); +static LLPanelInjector<LLOutfitsList> t_outfits_list("outfits_list"); LLOutfitsList::LLOutfitsList() : LLPanelAppearanceTab() diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index 115114bb53..9665314e75 100755 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -48,7 +48,7 @@ #include "llsidetraypanelcontainer.h" #include "llviewercontrol.h" -static LLRegisterPanelClassWrapper<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray"); +static LLPanelInjector<LLPanelBlockedList> t_panel_blocked_list("panel_block_list_sidetray"); // // Constants diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index e71dba5cae..0621cc8fad 100755 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -62,7 +62,7 @@ #include "llappearancemgr.h" // register panel with appropriate XML -static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable"); +static LLPanelInjector<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable"); // subparts of the UI for focus, camera position, etc. enum ESubpart { diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index ae217958f0..180c1d6ab5 100755 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -55,7 +55,7 @@ #include "lltrans.h" -static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray"); +static LLPanelInjector<LLPanelGroup> t_panel_group("panel_group_info_sidetray"); diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 0cd93b330a..eaf33c7108 100755 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -53,7 +53,7 @@ #include "lltrans.h" #include "llviewerwindow.h" -static LLRegisterPanelClassWrapper<LLPanelGroupGeneral> t_panel_group_general("panel_group_general"); +static LLPanelInjector<LLPanelGroupGeneral> t_panel_group_general("panel_group_general"); // consts const S32 MATURE_CONTENT = 1; @@ -63,14 +63,12 @@ const S32 DECLINE_TO_STATE = 0; LLPanelGroupGeneral::LLPanelGroupGeneral() : LLPanelGroupTab(), - mPendingMemberUpdate(FALSE), mChanged(FALSE), mFirstUse(TRUE), mGroupNameEditor(NULL), mFounderName(NULL), mInsignia(NULL), mEditCharter(NULL), - mListVisibleMembers(NULL), mCtrlShowInGroupList(NULL), mComboMature(NULL), mCtrlOpenEnrollment(NULL), @@ -79,18 +77,13 @@ LLPanelGroupGeneral::LLPanelGroupGeneral() mCtrlReceiveNotices(NULL), mCtrlListGroup(NULL), mActiveTitleLabel(NULL), - mComboActiveTitle(NULL), - mAvatarNameCacheConnection() + mComboActiveTitle(NULL) { } LLPanelGroupGeneral::~LLPanelGroupGeneral() { - if (mAvatarNameCacheConnection.connected()) - { - mAvatarNameCacheConnection.disconnect(); - } } BOOL LLPanelGroupGeneral::postBuild() @@ -105,17 +98,6 @@ BOOL LLPanelGroupGeneral::postBuild() mEditCharter->setFocusChangedCallback(boost::bind(onFocusEdit, _1, this)); } - - - mListVisibleMembers = getChild<LLNameListCtrl>("visible_members", recurse); - if (mListVisibleMembers) - { - mListVisibleMembers->setDoubleClickCallback(openProfile, this); - mListVisibleMembers->setContextMenu(LLScrollListCtrl::MENU_AVATAR); - - mListVisibleMembers->setSortCallback(boost::bind(&LLPanelGroupGeneral::sortMembersList,this,_1,_2,_3)); - } - // Options mCtrlShowInGroupList = getChild<LLCheckBoxCtrl>("show_in_group_list", recurse); if (mCtrlShowInGroupList) @@ -290,21 +272,6 @@ void LLPanelGroupGeneral::onClickInfo(void *userdata) } -// static -void LLPanelGroupGeneral::openProfile(void* data) -{ - LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)data; - - if (self && self->mListVisibleMembers) - { - LLScrollListItem* selected = self->mListVisibleMembers->getFirstSelected(); - if (selected) - { - LLAvatarActions::showProfile(selected->getUUID()); - } - } -} - bool LLPanelGroupGeneral::needsApply(std::string& mesg) { updateChanged(); @@ -336,11 +303,6 @@ void LLPanelGroupGeneral::activate() void LLPanelGroupGeneral::draw() { LLPanelGroupTab::draw(); - - if (mPendingMemberUpdate) - { - updateMembers(); - } } bool LLPanelGroupGeneral::apply(std::string& mesg) @@ -522,10 +484,6 @@ bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LL return false; } -static F32 sSDTime = 0.0f; -static F32 sElementTime = 0.0f; -static F32 sAllTime = 0.0f; - // virtual void LLPanelGroupGeneral::update(LLGroupChange gc) { @@ -666,132 +624,10 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) { mEditCharter->setText(gdatap->mCharter); } - - if (mListVisibleMembers) - { - mListVisibleMembers->deleteAllItems(); - - if (gdatap->isMemberDataComplete()) - { - mMemberProgress = gdatap->mMembers.begin(); - mPendingMemberUpdate = TRUE; - - sSDTime = 0.0f; - sElementTime = 0.0f; - sAllTime = 0.0f; - } - else - { - std::stringstream pending; - pending << "Retrieving member list (" << gdatap->mMembers.size() << "\\" << gdatap->mMemberCount << ")"; - - LLSD row; - row["columns"][0]["value"] = pending.str(); - row["columns"][0]["column"] = "name"; - - mListVisibleMembers->setEnabled(FALSE); - mListVisibleMembers->addElement(row); - } - } resetDirty(); } -void LLPanelGroupGeneral::updateMembers() -{ - mPendingMemberUpdate = FALSE; - - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); - - if (!mListVisibleMembers - || !gdatap - || !gdatap->isMemberDataComplete() - || gdatap->mMembers.empty()) - { - return; - } - - LLTimer update_time; - update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME); - - LLAvatarName av_name; - - for( ; mMemberProgress != gdatap->mMembers.end() && !update_time.hasExpired(); - ++mMemberProgress) - { - LLGroupMemberData* member = mMemberProgress->second; - if (!member) - { - continue; - } - - if (LLAvatarNameCache::get(mMemberProgress->first, &av_name)) - { - addMember(mMemberProgress->second); - } - else - { - // If name is not cached, onNameCache() should be called when it is cached and add this member to list. - // *TODO : Use a callback per member, not for the panel group. - if (mAvatarNameCacheConnection.connected()) - { - mAvatarNameCacheConnection.disconnect(); - } - mAvatarNameCacheConnection = LLAvatarNameCache::get(mMemberProgress->first, boost::bind(&LLPanelGroupGeneral::onNameCache, this, gdatap->getMemberVersion(), member, _2)); - } - } - - if (mMemberProgress == gdatap->mMembers.end()) - { - lldebugs << " member list completed." << llendl; - mListVisibleMembers->setEnabled(TRUE); - } - else - { - mPendingMemberUpdate = TRUE; - mListVisibleMembers->setEnabled(FALSE); - } -} - -void LLPanelGroupGeneral::addMember(LLGroupMemberData* member) -{ - LLNameListCtrl::NameItem item_params; - item_params.value = member->getID(); - - LLScrollListCell::Params column; - item_params.columns.add().column("name").font.name("SANSSERIF_SMALL"); - - item_params.columns.add().column("title").value(member->getTitle()).font.name("SANSSERIF_SMALL"); - - item_params.columns.add().column("status").value(member->getOnlineStatus()).font.name("SANSSERIF_SMALL"); - - LLScrollListItem* member_row = mListVisibleMembers->addNameItemRow(item_params); - - if ( member->isOwner() ) - { - LLScrollListText* name_textp = dynamic_cast<LLScrollListText*>(member_row->getColumn(0)); - if (name_textp) - name_textp->setFontStyle(LLFontGL::BOLD); - } -} - -void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name) -{ - mAvatarNameCacheConnection.disconnect(); - - LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); - - if (!gdatap - || !gdatap->isMemberDataComplete() - || gdatap->getMemberVersion() != update_id) - { - // Stale data - return; - } - - addMember(member); -} - void LLPanelGroupGeneral::updateChanged() { // List all the controls we want to check for changes... @@ -867,17 +703,6 @@ void LLPanelGroupGeneral::reset() mEditCharter->setText(empty_str); mGroupNameEditor->setText(empty_str); } - - { - LLSD row; - row["columns"][0]["value"] = "no members yet"; - row["columns"][0]["column"] = "name"; - - mListVisibleMembers->deleteAllItems(); - mListVisibleMembers->setEnabled(FALSE); - mListVisibleMembers->addElement(row); - } - { mComboMature->setEnabled(true); @@ -964,18 +789,3 @@ void LLPanelGroupGeneral::setGroupID(const LLUUID& id) activate(); } -S32 LLPanelGroupGeneral::sortMembersList(S32 col_idx,const LLScrollListItem* i1,const LLScrollListItem* i2) -{ - const LLScrollListCell *cell1 = i1->getColumn(col_idx); - const LLScrollListCell *cell2 = i2->getColumn(col_idx); - - if(col_idx == 2) - { - if(LLStringUtil::compareDict(cell1->getValue().asString(),"Online") == 0 ) - return 1; - if(LLStringUtil::compareDict(cell2->getValue().asString(),"Online") == 0 ) - return -1; - } - - return LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString()); -} diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index b7f4a01139..11972bafa9 100755 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -62,8 +62,6 @@ public: virtual void setGroupID(const LLUUID& id); virtual void setupCtrls (LLPanel* parent); - - void onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name); private: void reset(); @@ -75,18 +73,12 @@ private: static void onCommitEnrollment(LLUICtrl* ctrl, void* data); static void onClickInfo(void* userdata); static void onReceiveNotices(LLUICtrl* ctrl, void* data); - static void openProfile(void* data); - - S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*); - void addMember(LLGroupMemberData* member); static bool joinDlgCB(const LLSD& notification, const LLSD& response); - void updateMembers(); void updateChanged(); bool confirmMatureApply(const LLSD& notification, const LLSD& response); - BOOL mPendingMemberUpdate; BOOL mChanged; BOOL mFirstUse; std::string mIncompleteMemberDataStr; @@ -97,8 +89,6 @@ private: LLTextureCtrl *mInsignia; LLTextEditor *mEditCharter; - LLNameListCtrl *mListVisibleMembers; - // Options (include any updates in updateChanged) LLCheckBoxCtrl *mCtrlShowInGroupList; LLCheckBoxCtrl *mCtrlOpenEnrollment; @@ -109,9 +99,6 @@ private: LLTextBox *mActiveTitleLabel; LLComboBox *mComboActiveTitle; LLComboBox *mComboMature; - - LLGroupMgrGroupData::member_list_t::iterator mMemberProgress; - boost::signals2::connection mAvatarNameCacheConnection; }; #endif diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index c927aeacb3..17707557bb 100755 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -55,7 +55,7 @@ #include "llfloaterworldmap.h" #include "llviewermessage.h" -static LLRegisterPanelClassWrapper<LLPanelGroupLandMoney> t_panel_group_money("panel_group_land_money"); +static LLPanelInjector<LLPanelGroupLandMoney> t_panel_group_money("panel_group_land_money"); diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index 522ba5afae..0dfb8fef53 100755 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -57,7 +57,7 @@ #include "llnotificationsutil.h" #include "llgiveinventory.h" -static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices"); +static LLPanelInjector<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices"); ///////////////////////// diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index fdcd1f5ebb..c30c932c41 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -55,7 +55,7 @@ #include "roles_constants.h" -static LLRegisterPanelClassWrapper<LLPanelGroupRoles> t_panel_group_roles("panel_group_roles"); +static LLPanelInjector<LLPanelGroupRoles> t_panel_group_roles("panel_group_roles"); bool agentCanRemoveFromRole(const LLUUID& group_id, const LLUUID& role_id) @@ -733,7 +733,7 @@ void LLPanelGroupSubTab::setFooterEnabled(BOOL enable) //////////////////////////// -static LLRegisterPanelClassWrapper<LLPanelGroupMembersSubTab> t_panel_group_members_subtab("panel_group_members_subtab"); +static LLPanelInjector<LLPanelGroupMembersSubTab> t_panel_group_members_subtab("panel_group_members_subtab"); LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab() : LLPanelGroupSubTab(), @@ -1636,6 +1636,9 @@ void LLPanelGroupMembersSubTab::addMemberToList(LLGroupMemberData* data) item_params.columns.add().column("online").value(data->getOnlineStatus()) .font.name("SANSSERIF_SMALL").style("NORMAL"); + + item_params.columns.add().column("title").value(data->getTitle()).font.name("SANSSERIF_SMALL").style("NORMAL");; + mMembersList->addNameItemRow(item_params); mHasMatch = TRUE; @@ -1752,7 +1755,7 @@ void LLPanelGroupMembersSubTab::updateMembers() // LLPanelGroupRolesSubTab //////////////////////////// -static LLRegisterPanelClassWrapper<LLPanelGroupRolesSubTab> t_panel_group_roles_subtab("panel_group_roles_subtab"); +static LLPanelInjector<LLPanelGroupRolesSubTab> t_panel_group_roles_subtab("panel_group_roles_subtab"); LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab() : LLPanelGroupSubTab(), @@ -2466,7 +2469,7 @@ void LLPanelGroupRolesSubTab::saveRoleChanges(bool select_saved_role) // LLPanelGroupActionsSubTab //////////////////////////// -static LLRegisterPanelClassWrapper<LLPanelGroupActionsSubTab> t_panel_group_actions_subtab("panel_group_actions_subtab"); +static LLPanelInjector<LLPanelGroupActionsSubTab> t_panel_group_actions_subtab("panel_group_actions_subtab"); LLPanelGroupActionsSubTab::LLPanelGroupActionsSubTab() @@ -2658,7 +2661,7 @@ void LLPanelGroupRoles::setGroupID(const LLUUID& id) button->setEnabled(gAgent.hasPowerInGroup(mGroupID, GP_MEMBER_INVITE)); if(mSubTabContainer) - mSubTabContainer->selectTab(0); + mSubTabContainer->selectTab(1); activate(); } diff --git a/indra/newview/llpanelhome.cpp b/indra/newview/llpanelhome.cpp index b03bab3127..ab0ccffae4 100755 --- a/indra/newview/llpanelhome.cpp +++ b/indra/newview/llpanelhome.cpp @@ -31,7 +31,7 @@ #include "llmediactrl.h" #include "llviewerhome.h" -static LLRegisterPanelClassWrapper<LLPanelHome> t_home("panel_sidetray_home"); +static LLPanelInjector<LLPanelHome> t_home("panel_sidetray_home"); LLPanelHome::LLPanelHome() : LLPanel(), diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 5c9b968ac9..934f8ed8c7 100755 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -53,7 +53,7 @@ typedef std::pair<LLUUID, std::string> folder_pair_t; static bool cmp_folders(const folder_pair_t& left, const folder_pair_t& right); static void collectLandmarkFolders(LLInventoryModel::cat_array_t& cats); -static LLRegisterPanelClassWrapper<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info"); +static LLPanelInjector<LLPanelLandmarkInfo> t_landmark_info("panel_landmark_info"); // Statics for textures filenames static std::string icon_pg; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 53deded2f2..68c22c12fd 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -58,7 +58,7 @@ const std::string FILTERS_FILENAME("filters.xml"); -static LLRegisterPanelClassWrapper<LLPanelMainInventory> t_inventory("panel_main_inventory"); +static LLPanelInjector<LLPanelMainInventory> t_inventory("panel_main_inventory"); void on_file_loaded_for_save(BOOL success, LLViewerFetchedTexture *src_vi, @@ -542,6 +542,13 @@ void LLPanelMainInventory::changed(U32) updateItemcountText(); } +void LLPanelMainInventory::setFocusFilterEditor() +{ + if(mFilterEditor) + { + mFilterEditor->setFocus(true); + } +} // virtual void LLPanelMainInventory::draw() @@ -567,13 +574,16 @@ void LLPanelMainInventory::draw() void LLPanelMainInventory::updateItemcountText() { - // *TODO: Calling setlocale() on each frame may be inefficient. - //LLLocale locale(LLStringUtil::getLocale()); - std::string item_count_string; - LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount()); + if(mItemCount != gInventory.getItemCount()) + { + mItemCount = gInventory.getItemCount(); + mItemCountString = ""; + LLLocale locale(LLLocale::USER_LOCALE); + LLResMgr::getInstance()->getIntegerString(mItemCountString, mItemCount); + } LLStringUtil::format_map_t string_args; - string_args["[ITEM_COUNT]"] = item_count_string; + string_args["[ITEM_COUNT]"] = mItemCountString; string_args["[FILTER]"] = getFilterText(); std::string text = ""; diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 394b004e20..21f0ca0cae 100755 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -82,6 +82,9 @@ public: void setSelectCallback(const LLFolderView::signal_t::slot_type& cb); void onFilterEdit(const std::string& search_string ); + + void setFocusFilterEditor(); + protected: // // Misc functions @@ -128,6 +131,8 @@ private: LLSaveFolderState* mSavedFolderState; std::string mFilterText; std::string mFilterSubString; + S32 mItemCount; + std::string mItemCountString; ////////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmarketplaceinbox.cpp b/indra/newview/llpanelmarketplaceinbox.cpp index dcecce6fe4..79e079f6bd 100755 --- a/indra/newview/llpanelmarketplaceinbox.cpp +++ b/indra/newview/llpanelmarketplaceinbox.cpp @@ -38,7 +38,7 @@ #include "llviewercontrol.h" -static LLRegisterPanelClassWrapper<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox"); +static LLPanelInjector<LLPanelMarketplaceInbox> t_panel_marketplace_inbox("panel_marketplace_inbox"); const LLPanelMarketplaceInbox::Params& LLPanelMarketplaceInbox::getDefaultParams() { diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index a9af56f750..7a408e736f 100755 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -48,7 +48,7 @@ #include "lltabcontainer.h" #include "lltexturectrl.h" -static LLRegisterPanelClassWrapper<LLPanelMe> t_panel_me_profile("panel_me"); +static LLPanelInjector<LLPanelMe> t_panel_me_profile("panel_me"); LLPanelMe::LLPanelMe(void) : LLPanelProfile() diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index c09d4393c8..f75d76da94 100755 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -74,7 +74,7 @@ #include "llwearabletype.h" #include "llweb.h" -static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit"); +static LLPanelInjector<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit"); const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE); const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT); diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index f90236f6f2..e0132d20fb 100755 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -46,7 +46,7 @@ static const std::string OUTFITS_TAB_NAME = "outfitslist_tab"; static const std::string COF_TAB_NAME = "cof_tab"; -static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); +static LLPanelInjector<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory"); LLPanelOutfitsInventory::LLPanelOutfitsInventory() : mMyOutfitsPanel(NULL), diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index d7c634d619..f5542ee7a6 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -28,6 +28,8 @@ // libs #include "llavatarname.h" +#include "llconversationview.h" +#include "llfloaterimcontainer.h" #include "llfloaterreg.h" #include "llfloatersidepanelcontainer.h" #include "llmenubutton.h" @@ -48,15 +50,19 @@ #include "llavataractions.h" #include "llavatarlist.h" #include "llavatarlistitem.h" +#include "llavatarnamecache.h" #include "llcallingcard.h" // for LLAvatarTracker +#include "llcallbacklist.h" +#include "llerror.h" +#include "llfacebookconnect.h" #include "llfloateravatarpicker.h" -//#include "llfloaterminiinspector.h" #include "llfriendcard.h" #include "llgroupactions.h" #include "llgrouplist.h" #include "llinventoryobserver.h" #include "llnetmap.h" #include "llpanelpeoplemenus.h" +#include "llparticipantlist.h" #include "llsidetraypanelcontainer.h" #include "llrecentpeople.h" #include "llviewercontrol.h" // for gSavedSettings @@ -64,6 +70,10 @@ #include "llvoiceclient.h" #include "llworld.h" #include "llspeakers.h" +#include "llfloaterwebcontent.h" + +#include "llagentui.h" +#include "llslurl.h" #define FRIEND_LIST_UPDATE_TIMEOUT 0.5 #define NEARBY_LIST_UPDATE_INTERVAL 1 @@ -73,9 +83,9 @@ static const std::string FRIENDS_TAB_NAME = "friends_panel"; static const std::string GROUP_TAB_NAME = "groups_panel"; static const std::string RECENT_TAB_NAME = "recent_panel"; static const std::string BLOCKED_TAB_NAME = "blocked_panel"; // blocked avatars - static const std::string COLLAPSED_BY_USER = "collapsed_by_user"; + extern S32 gMaxAgentGroups; /** Comparator for comparing avatar items by last interaction date */ @@ -206,7 +216,7 @@ static const LLAvatarItemStatusComparator STATUS_COMPARATOR; static LLAvatarItemDistanceComparator DISTANCE_COMPARATOR; static const LLAvatarItemRecentSpeakerComparator RECENT_SPEAKER_COMPARATOR; -static LLRegisterPanelClassWrapper<LLPanelPeople> t_people("panel_people"); +static LLPanelInjector<LLPanelPeople> t_people("panel_people"); //============================================================================= @@ -495,6 +505,7 @@ public: LLPanelPeople::LLPanelPeople() : LLPanel(), + mTryToConnectToFbc(true), mTabContainer(NULL), mOnlineFriendList(NULL), mAllFriendList(NULL), @@ -573,6 +584,7 @@ BOOL LLPanelPeople::postBuild() getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); + getChild<LLFilterEditor>("fbc_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2)); mTabContainer = getChild<LLTabContainer>("tabs"); mTabContainer->setCommitCallback(boost::bind(&LLPanelPeople::onTabSelected, this, _2)); @@ -583,8 +595,11 @@ BOOL LLPanelPeople::postBuild() // updater is active only if panel is visible to user. friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2)); friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this)); + friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::updateFacebookList, this, _2)); + mOnlineFriendList = friends_tab->getChild<LLAvatarList>("avatars_online"); mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all"); + mSuggestedFriends = friends_tab->getChild<LLAvatarList>("suggested_friends"); mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online")); mOnlineFriendList->setShowIcons("FriendsListShowIcons"); mOnlineFriendList->showPermissions("FriendsListShowPermissions"); @@ -617,6 +632,7 @@ BOOL LLPanelPeople::postBuild() mRecentList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); mAllFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); mOnlineFriendList->setContextMenu(&LLPanelPeopleMenus::gPeopleContextMenu); + mSuggestedFriends->setContextMenu(&LLPanelPeopleMenus::gSuggestedFriendsContextMenu); setSortOrder(mRecentList, (ESortOrder)gSavedSettings.getU32("RecentPeopleSortOrder"), false); setSortOrder(mAllFriendList, (ESortOrder)gSavedSettings.getU32("FriendsSortOrder"), false); @@ -695,7 +711,7 @@ void LLPanelPeople::updateFriendListHelpText() // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...) // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448. - bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches(); + bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches() || mSuggestedFriends->filterHasMatches(); no_friends_text->setVisible(!any_friend_exists); if (no_friends_text->getVisible()) { @@ -762,9 +778,40 @@ void LLPanelPeople::updateFriendList() mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches()); //update trash and other buttons according to a selected item updateButtons(); + updateSuggestedFriendList(); showFriendsAccordionsIfNeeded(); } +bool LLPanelPeople::updateSuggestedFriendList() +{ + const LLAvatarTracker& av_tracker = LLAvatarTracker::instance(); + uuid_vec_t& suggested_friends = mSuggestedFriends->getIDs(); + suggested_friends.clear(); + + //Add suggested friends + LLSD friends = LLFacebookConnect::instance().getContent(); + for (LLSD::array_const_iterator i = friends.beginArray(); i != friends.endArray(); ++i) + { + LLUUID agent_id = (*i).asUUID(); + bool second_life_buddy = agent_id.notNull() ? av_tracker.isBuddy(agent_id) : false; + + if(!second_life_buddy) + { + //FB+SL but not SL friend + if (agent_id.notNull()) + { + suggested_friends.push_back(agent_id); + } + } + } + + //Force a refresh when there aren't any filter matches (prevent displaying content that shouldn't display) + mSuggestedFriends->setDirty(true, !mSuggestedFriends->filterHasMatches()); + showFriendsAccordionsIfNeeded(); + + return false; +} + void LLPanelPeople::updateNearbyList() { if (!mNearbyList) @@ -788,6 +835,51 @@ void LLPanelPeople::updateRecentList() mRecentList->setDirty(); } +bool LLPanelPeople::onConnectedToFacebook(const LLSD& data) +{ + LLSD::Integer connection_state = data.get("enum").asInteger(); + + if (connection_state == LLFacebookConnect::FB_CONNECTED) + { + LLFacebookConnect::instance().loadFacebookFriends(); + } + else if(connection_state == LLFacebookConnect::FB_NOT_CONNECTED) + { + updateSuggestedFriendList(); + }; + + return false; +} + +void LLPanelPeople::updateFacebookList(bool visible) +{ + if (visible) + { + LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople"); // just in case it is already listening + LLEventPumps::instance().obtain("FacebookConnectContent").listen("LLPanelPeople", boost::bind(&LLPanelPeople::updateSuggestedFriendList, this)); + + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople"); // just in case it is already listening + LLEventPumps::instance().obtain("FacebookConnectState").listen("LLPanelPeople", boost::bind(&LLPanelPeople::onConnectedToFacebook, this, _1)); + + if (LLFacebookConnect::instance().isConnected()) + { + LLFacebookConnect::instance().loadFacebookFriends(); + } + else if(mTryToConnectToFbc) + { + LLFacebookConnect::instance().checkConnectionToFacebook(); + mTryToConnectToFbc = false; + } + + updateSuggestedFriendList(); + } + else + { + LLEventPumps::instance().obtain("FacebookConnectState").stopListening("LLPanelPeople"); + LLEventPumps::instance().obtain("FacebookConnectContent").stopListening("LLPanelPeople"); + } +} + void LLPanelPeople::updateButtons() { std::string cur_tab = getActiveTabName(); @@ -993,23 +1085,25 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string) { // store accordion tabs opened/closed state before any manipulation with accordion tabs if (!saved_filter.empty()) - { - notifyChildren(LLSD().with("action","store_state")); - } + { + notifyChildren(LLSD().with("action","store_state")); + } mOnlineFriendList->setNameFilter(filter); mAllFriendList->setNameFilter(filter); + mSuggestedFriends->setNameFilter(filter); - setAccordionCollapsedByUser("tab_online", false); - setAccordionCollapsedByUser("tab_all", false); - showFriendsAccordionsIfNeeded(); + setAccordionCollapsedByUser("tab_online", false); + setAccordionCollapsedByUser("tab_all", false); + setAccordionCollapsedByUser("tab_suggested_friends", false); + showFriendsAccordionsIfNeeded(); // restore accordion tabs state _after_ all manipulations if(saved_filter.empty()) - { - notifyChildren(LLSD().with("action","restore_state")); - } -} + { + notifyChildren(LLSD().with("action","restore_state")); + } + } else if (cur_tab == GROUP_TAB_NAME) { mGroupList->setNameFilter(filter); @@ -1229,7 +1323,7 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata) mAllFriendList->showPermissions(show_permissions); mOnlineFriendList->showPermissions(show_permissions); } -} + } void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata) { @@ -1387,6 +1481,7 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded() // Expand and show accordions if needed, else - hide them showAccordion("tab_online", mOnlineFriendList->filterHasMatches()); showAccordion("tab_all", mAllFriendList->filterHasMatches()); + showAccordion("tab_suggested_friends", mSuggestedFriends->filterHasMatches()); // Rearrange accordions LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion"); @@ -1450,4 +1545,5 @@ bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name) return isAccordionCollapsedByUser(getChild<LLUICtrl>(name)); } + // EOF diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 4740964dee..c7141f36ee 100755 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -22,7 +22,7 @@ * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - */ + */ #ifndef LL_LLPANELPEOPLE_H #define LL_LLPANELPEOPLE_H @@ -30,6 +30,7 @@ #include <llpanel.h> #include "llcallingcard.h" // for avatar tracker +#include "llfloaterwebcontent.h" #include "llvoiceclient.h" class LLAvatarList; @@ -55,6 +56,8 @@ public: // when voice is available /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal); + bool mTryToConnectToFbc; + // internals class Updater; @@ -73,8 +76,10 @@ private: // methods indirectly called by the updaters void updateFriendListHelpText(); void updateFriendList(); + bool updateSuggestedFriendList(); void updateNearbyList(); void updateRecentList(); + void updateFacebookList(bool visible); bool isItemsFreeOfFriends(const uuid_vec_t& uuids); @@ -121,6 +126,8 @@ private: void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); + bool onConnectedToFacebook(const LLSD& data); + void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); void setAccordionCollapsedByUser(const std::string& name, bool collapsed); bool isAccordionCollapsedByUser(LLUICtrl* acc_tab); @@ -129,6 +136,7 @@ private: LLTabContainer* mTabContainer; LLAvatarList* mOnlineFriendList; LLAvatarList* mAllFriendList; + LLAvatarList* mSuggestedFriends; LLAvatarList* mNearbyList; LLAvatarList* mRecentList; LLGroupList* mGroupList; @@ -140,6 +148,7 @@ private: Updater* mFriendListUpdater; Updater* mNearbyListUpdater; Updater* mRecentListUpdater; + Updater* mFacebookListUpdater; Updater* mButtonsUpdater; LLHandle< LLFloater > mPicker; }; diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 49f7361c4a..6979ae06e0 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -47,6 +47,7 @@ namespace LLPanelPeopleMenus PeopleContextMenu gPeopleContextMenu; NearbyPeopleContextMenu gNearbyPeopleContextMenu; +SuggestedFriendsContextMenu gSuggestedFriendsContextMenu; //== PeopleContextMenu =============================================================== @@ -74,6 +75,7 @@ LLContextMenu* PeopleContextMenu::createMenu() registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id)); registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id)); registrar.add("Avatar.InviteToGroup", boost::bind(&LLAvatarActions::inviteToGroup, id)); + registrar.add("Avatar.TeleportRequest", boost::bind(&PeopleContextMenu::requestTeleport, this)); registrar.add("Avatar.Calllog", boost::bind(&LLAvatarActions::viewChatHistory, id)); enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2)); @@ -125,6 +127,7 @@ void PeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) items.push_back(std::string("view_profile")); items.push_back(std::string("im")); items.push_back(std::string("offer_teleport")); + items.push_back(std::string("request_teleport")); items.push_back(std::string("voice_call")); items.push_back(std::string("chat_history")); items.push_back(std::string("separator_chat_history")); @@ -255,6 +258,13 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata) return false; } +void PeopleContextMenu::requestTeleport() +{ + // boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(), + // so we have to use a wrapper. + LLAvatarActions::teleportRequest(mUUIDs.front()); +} + void PeopleContextMenu::offerTeleport() { // boost::bind cannot recognize overloaded method LLAvatarActions::offerTeleport(), @@ -284,6 +294,7 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) items.push_back(std::string("view_profile")); items.push_back(std::string("im")); items.push_back(std::string("offer_teleport")); + items.push_back(std::string("request_teleport")); items.push_back(std::string("voice_call")); items.push_back(std::string("chat_history")); items.push_back(std::string("separator_chat_history")); @@ -301,4 +312,36 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) hide_context_entries(menu, items, disabled_items); } +//== SuggestedFriendsContextMenu =============================================================== + +LLContextMenu* SuggestedFriendsContextMenu::createMenu() +{ + // set up the callbacks for all of the avatar menu items + LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; + LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; + LLContextMenu* menu; + + // Set up for one person selected menu + const LLUUID& id = mUUIDs.front(); + registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id)); + registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id)); + + // create the context menu from the XUI + menu = createFromFile("menu_people_nearby.xml"); + buildContextMenu(*menu, 0x0); + + return menu; +} + +void SuggestedFriendsContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) +{ + menuentry_vec_t items; + menuentry_vec_t disabled_items; + + items.push_back(std::string("view_profile")); + items.push_back(std::string("add_friend")); + + hide_context_entries(menu, items, disabled_items); +} + } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 0a1dcef303..945382ebc5 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -47,6 +47,7 @@ private: bool enableContextMenuItem(const LLSD& userdata); bool checkContextMenuItem(const LLSD& userdata); void offerTeleport(); + void requestTeleport(); }; /** @@ -58,8 +59,21 @@ protected: /*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags); }; +/** + * Menu used in the suggested friends list. + */ +class SuggestedFriendsContextMenu : public PeopleContextMenu +{ +public: + /*virtual*/ LLContextMenu * createMenu(); + +protected: + /*virtual*/ void buildContextMenu(class LLMenuGL& menu, U32 flags); +}; + extern PeopleContextMenu gPeopleContextMenu; extern NearbyPeopleContextMenu gNearbyPeopleContextMenu; +extern SuggestedFriendsContextMenu gSuggestedFriendsContextMenu; } // namespace LLPanelPeopleMenus diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index cfbc8f1a94..f0617266db 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -69,7 +69,7 @@ static const std::string CLASSIFIED_ID("classified_id"); static const std::string CLASSIFIED_NAME("classified_name"); -static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks"); +static LLPanelInjector<LLPanelPicks> t_panel_picks("panel_picks"); class LLPickHandler : public LLCommandHandler, diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 5d9971c16c..14b5d9af47 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -53,7 +53,7 @@ #include "llviewerparcelmgr.h" #include "llviewerregion.h" -static LLRegisterPanelClassWrapper<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); +static LLPanelInjector<LLPanelPlaceProfile> t_place_profile("panel_place_profile"); // Statics for textures filenames static std::string icon_pg; diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 6c2a01fc82..499b9ab62e 100755 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -229,7 +229,7 @@ private: }; -static LLRegisterPanelClassWrapper<LLPanelPlaces> t_places("panel_places"); +static LLPanelInjector<LLPanelPlaces> t_places("panel_places"); LLPanelPlaces::LLPanelPlaces() : LLPanel(), @@ -251,7 +251,7 @@ LLPanelPlaces::LLPanelPlaces() gInventory.addObserver(mInventoryObserver); - mAgentParcelChangedConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( + mAgentParcelChangedConnection = gAgent.addParcelChangedCallback( boost::bind(&LLPanelPlaces::updateVerbs, this)); //buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 76d38f067d..9504f22a1d 100755 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -94,7 +94,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mZoomObjectFace(0), mVolumeSliderVisible(0), mWindowShade(NULL), - mHideImmediately(false) + mHideImmediately(false), + mSecureURL(false) { mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this)); mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); @@ -345,7 +346,7 @@ void LLPanelPrimMediaControls::updateShape() // Disable zoom if HUD mZoomCtrl->setEnabled(!is_hud); mUnzoomCtrl->setEnabled(!is_hud); - mSecureLockIcon->setVisible(false); + mSecureURL = false; mCurrentURL = media_impl->getCurrentMediaURL(); mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate); @@ -382,7 +383,7 @@ void LLPanelPrimMediaControls::updateShape() mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible()); mWhitelistIcon->setVisible(false); - mSecureLockIcon->setVisible(false); + mSecureURL = false; if (mMediaPanelScroll) { mMediaPanelScroll->setVisible(false); @@ -416,7 +417,7 @@ void LLPanelPrimMediaControls::updateShape() mMediaPlaySliderCtrl->setEnabled(true); } - // video vloume + // video volume if(volume <= 0.0) { mMuteBtn->setToggleState(true); @@ -492,10 +493,8 @@ void LLPanelPrimMediaControls::updateShape() std::string prefix = std::string("https://"); std::string test_prefix = mCurrentURL.substr(0, prefix.length()); LLStringUtil::toLower(test_prefix); - if(test_prefix == prefix) - { - mSecureLockIcon->setVisible(has_focus); - } + mSecureURL = has_focus && (test_prefix == prefix); + mCurrentURL = (mSecureURL ? " " + mCurrentURL : mCurrentURL); if(mCurrentURL!=mPreviousURL) { @@ -746,6 +745,9 @@ void LLPanelPrimMediaControls::draw() clearFaceOnFade(); } } + + // Show/hide the lock icon for secure browsing + mSecureLockIcon->setVisible(mSecureURL && !mMediaAddress->hasFocus()); // Build rect for icon area in coord system of this panel // Assumes layout_stack is a direct child of this panel diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index eeb433e306..6d2eb3430e 100755 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -191,6 +191,7 @@ private: bool mUpdateSlider; bool mClearFaceOnFade; bool mHideImmediately; + bool mSecureURL; LLMatrix4 mLastCameraMat; EZoomLevel mCurrentZoom; diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index 381c11348d..47e46a968f 100755 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -60,7 +60,7 @@ private: void onSend(); }; -static LLRegisterPanelClassWrapper<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory"); +static LLPanelInjector<LLPanelSnapshotInventory> panel_class("llpanelsnapshotinventory"); LLPanelSnapshotInventory::LLPanelSnapshotInventory() { diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp index d153ff598d..43e38b95e2 100755 --- a/indra/newview/llpanelsnapshotlocal.cpp +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -63,7 +63,7 @@ private: void onSaveFlyoutCommit(LLUICtrl* ctrl); }; -static LLRegisterPanelClassWrapper<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal"); +static LLPanelInjector<LLPanelSnapshotLocal> panel_class("llpanelsnapshotlocal"); LLPanelSnapshotLocal::LLPanelSnapshotLocal() { diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp index 554fabe5b3..455c1c9e5f 100755 --- a/indra/newview/llpanelsnapshotoptions.cpp +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -56,7 +56,7 @@ private: void onSaveToComputer(); }; -static LLRegisterPanelClassWrapper<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions"); +static LLPanelInjector<LLPanelSnapshotOptions> panel_class("llpanelsnapshotoptions"); LLPanelSnapshotOptions::LLPanelSnapshotOptions() { diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index f2bb8f530b..aa109e9a51 100755 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -79,7 +79,7 @@ private: std::string mAgentEmail; }; -static LLRegisterPanelClassWrapper<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard"); +static LLPanelInjector<LLPanelSnapshotPostcard> panel_class("llpanelsnapshotpostcard"); LLPanelSnapshotPostcard::LLPanelSnapshotPostcard() : mHasFirstMsgFocus(false) diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp index a706318369..8949eb73eb 100755 --- a/indra/newview/llpanelsnapshotprofile.cpp +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -64,7 +64,7 @@ private: void onSend(); }; -static LLRegisterPanelClassWrapper<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile"); +static LLPanelInjector<LLPanelSnapshotProfile> panel_class("llpanelsnapshotprofile"); LLPanelSnapshotProfile::LLPanelSnapshotProfile() { diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index 0756faf5c0..9c380f63bd 100755 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -359,6 +359,11 @@ void LLTeleportHistoryPanel::ContextMenu::onInfo() void LLTeleportHistoryPanel::ContextMenu::gotSLURLCallback(const std::string& slurl) { LLClipboard::instance().copyToClipboard(utf8str_to_wstring(slurl),0,slurl.size()); + + LLSD args; + args["SLURL"] = slurl; + + LLNotificationsUtil::add("CopySLURL", args); } void LLTeleportHistoryPanel::ContextMenu::onCopyToClipboard() diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 9dd665198f..0d09f0bbfc 100755 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -166,7 +166,7 @@ BOOL LLPanelTopInfoBar::postBuild() mShowCoordsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged, this)); } - mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( + mParcelMgrConnection = gAgent.addParcelChangedCallback( boost::bind(&LLPanelTopInfoBar::onAgentParcelChange, this)); setVisibleCallback(boost::bind(&LLPanelTopInfoBar::onVisibilityChange, this, _2)); diff --git a/indra/newview/llpanelvoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 6be2ea6481..6f0a1624a7 100755 --- a/indra/newview/llpanelvoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -40,7 +40,7 @@ #include "lluictrlfactory.h" -static LLRegisterPanelClassWrapper<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings"); +static LLPanelInjector<LLPanelVoiceDeviceSettings> t_panel_group_general("panel_voice_device_settings"); static const std::string DEFAULT_DEVICE("Default"); diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp index 5fec6d967d..7da553801a 100755 --- a/indra/newview/llpanelvoiceeffect.cpp +++ b/indra/newview/llpanelvoiceeffect.cpp @@ -36,7 +36,7 @@ #include "lltransientfloatermgr.h" #include "llvoiceclient.h" -static LLRegisterPanelClassWrapper<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect"); +static LLPanelInjector<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect"); LLPanelVoiceEffect::LLPanelVoiceEffect() : mVoiceEffectCombo(NULL) diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index aa3ed22bee..edb624e3aa 100755 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -151,7 +151,7 @@ protected: std::string LLPanelAppearanceTab::sFilterSubString = LLStringUtil::null; -static LLRegisterPanelClassWrapper<LLPanelWearing> t_panel_wearing("panel_wearing"); +static LLPanelInjector<LLPanelWearing> t_panel_wearing("panel_wearing"); LLPanelWearing::LLPanelWearing() : LLPanelAppearanceTab() diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index c53760bca1..ee6893907e 100755 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llavatarnamecache.h" +#include "llerror.h" #include "llimview.h" #include "llfloaterimcontainer.h" #include "llparticipantlist.h" @@ -401,6 +402,8 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id) adjustParticipant(avatar_id); } +static LLFastTimer::DeclareTimer FTM_FOLDERVIEW_TEST("add test avatar agents"); + void LLParticipantList::adjustParticipant(const LLUUID& speaker_id) { LLPointer<LLSpeaker> speakerp = mSpeakerMgr->findSpeaker(speaker_id); diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index 076c3e0235..4f7d071d66 100755 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -77,6 +77,14 @@ void LLPersistentNotificationStorage::saveNotifications() } data.append(notification->asLLSD(true)); + if (data.size() >= gSavedSettings.getS32("MaxPersistentNotifications")) + { + llwarns << "Too many persistent notifications." + << " Saved " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << history_channel->size() + << " persistent notifications." << llendl; + break; + } + } writeNotifications(output); @@ -97,7 +105,6 @@ void LLPersistentNotificationStorage::loadNotifications() } mLoaded = true; - LLSD input; if (!readNotifications(input) ||input.isUndefined()) { @@ -115,9 +122,9 @@ void LLPersistentNotificationStorage::loadNotifications() findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID")))); LLNotifications& instance = LLNotifications::instance(); - - for (LLSD::array_const_iterator notification_it = data.beginArray(); - notification_it != data.endArray(); + S32 processed_notifications = 0; + for (LLSD::reverse_array_iterator notification_it = data.rbeginArray(); + notification_it != data.rendArray(); ++notification_it) { LLSD notification_params = *notification_it; @@ -136,8 +143,16 @@ void LLPersistentNotificationStorage::loadNotifications() // hide saved toasts so they don't confuse the user notification_channel->hideToast(notification->getID()); } + ++processed_notifications; + if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications")) + { + llwarns << "Too many persistent notifications." + << " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << llendl; + break; } - + } + LLNotifications::instance().getChannel("Persistent")-> + connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1)); LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL; } diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 08829c1184..153f0930c2 100755 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -27,7 +27,7 @@ #include "llpopupview.h" -static LLRegisterPanelClassWrapper<LLPopupView> r("popup_holder"); +static LLPanelInjector<LLPopupView> r("popup_holder"); bool view_visible_and_enabled(LLView* viewp) { diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 91a98792eb..1ed48a978f 100755 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -36,6 +36,7 @@ #include "llfilepicker.h" #include "llfloaterreg.h" #include "llimagetga.h" +#include "llimagepng.h" #include "llinventory.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -261,7 +262,7 @@ void LLPreviewTexture::saveAs() LLFilePicker& file_picker = LLFilePicker::instance(); const LLInventoryItem* item = getItem() ; - if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGA, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) ) + if( !file_picker.getSaveFile( LLFilePicker::FFSAVE_TGAPNG, item ? LLDir::getScrubbedFileName(item->getName()) : LLStringUtil::null) ) { // User canceled or we failed to acquire save file. return; @@ -358,14 +359,27 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, if( self && final && success ) { - LLPointer<LLImageTGA> image_tga = new LLImageTGA; - if( !image_tga->encode( src ) ) + const U32 ext_length = 3; + std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length); + + // We only support saving in PNG or TGA format + LLPointer<LLImageFormatted> image; + if(extension == "png") + { + image = new LLImagePNG; + } + else if(extension == "tga") + { + image = new LLImageTGA; + } + + if( image && !image->encode( src, 0 ) ) { LLSD args; args["FILE"] = self->mSaveFileName; LLNotificationsUtil::add("CannotEncodeFile", args); } - else if( !image_tga->save( self->mSaveFileName ) ) + else if( image && !image->save( self->mSaveFileName ) ) { LLSD args; args["FILE"] = self->mSaveFileName; diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 989f0b0e60..1257ee7f94 100755 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -59,7 +59,7 @@ S32 gStartImageWidth = 1; S32 gStartImageHeight = 1; const F32 FADE_TO_WORLD_TIME = 1.0f; -static LLRegisterPanelClassWrapper<LLProgressView> r("progress_view"); +static LLPanelInjector<LLProgressView> r("progress_view"); // XUI: Translate LLProgressView::LLProgressView() diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index 09e799e4f7..cbd8bee9d5 100755 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -51,7 +51,7 @@ LLSceneView::LLSceneView(const LLRect& rect) setCanClose(true); } -void LLSceneView::onClickCloseBtn() +void LLSceneView::onClickCloseBtn(bool) { setVisible(false); } diff --git a/indra/newview/llsceneview.h b/indra/newview/llsceneview.h index 2a3a14bbee..1fceecb9e1 100755 --- a/indra/newview/llsceneview.h +++ b/indra/newview/llsceneview.h @@ -38,7 +38,7 @@ public: virtual void draw(); protected: - virtual void onClickCloseBtn(); + virtual void onClickCloseBtn(bool app_qutting = false); }; diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 928d26646b..c4d5450e2b 100755 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -207,6 +207,7 @@ LLSD _basic_constraints_ext(X509* cert) } } + BASIC_CONSTRAINTS_free( bs ); } return result; } @@ -268,6 +269,8 @@ LLSD _ext_key_usage_ext(X509* cert) ASN1_OBJECT_free(usage); } } + + EXTENDED_KEY_USAGE_free( eku ); } return result; } @@ -280,6 +283,8 @@ LLSD _subject_key_identifier_ext(X509 *cert) if(skeyid) { result = cert_string_from_octet_string(skeyid); + + ASN1_OCTET_STRING_free( skeyid ); } return result; } @@ -300,6 +305,9 @@ LLSD _authority_key_identifier_ext(X509* cert) { result[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL] = cert_string_from_asn1_integer(akeyid->serial); } + + + AUTHORITY_KEYID_free( akeyid ); } // we ignore the issuer name in the authority key identifier, we check the issue name via @@ -1049,6 +1057,8 @@ void LLBasicCertificateStore::validate(int validation_policy, throw LLInvalidCertificate((*current_cert)); } std::string sha1_hash((const char *)cert_x509->sha1_hash, SHA_DIGEST_LENGTH); + X509_free( cert_x509 ); + cert_x509 = NULL; t_cert_cache::iterator cache_entry = mTrustedCertCache.find(sha1_hash); if(cache_entry != mTrustedCertCache.end()) { diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7b397d46f3..c83b459279 100755 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6187,8 +6187,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; if (shader) - { //switch to "solid color" program for SH-2690 -- works around driver bug causing bad triangles when rendering silhouettes - gSolidColorProgram.bind(); + { //use UI program for selection highlights (texture color modulated by vertex color) + gUIProgram.bind(); } gGL.matrixMode(LLRender::MM_MODELVIEW); @@ -6243,10 +6243,11 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color) gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); gGL.begin(LLRender::LINES); { + gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); + for(S32 i = 0; i < mSilhouetteVertices.size(); i += 2) { u_coord += u_divisor * LLSelectMgr::sHighlightUScale; - gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); gGL.texCoord2f( u_coord, v_coord ); gGL.vertex3fv( mSilhouetteVertices[i].mV); u_coord += u_divisor * LLSelectMgr::sHighlightUScale; diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index df413ab849..ec6a1d9bdc 100755 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -49,7 +49,7 @@ #include "llvoavatarself.h" #include "llviewerwearable.h" -static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); +static LLPanelInjector<LLSidepanelAppearance> t_appearance("sidepanel_appearance"); class LLCurrentlyWornFetchObserver : public LLInventoryFetchItemsObserver { diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 8915bb2fef..2e91ceee2e 100755 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -59,7 +59,7 @@ #include "llviewernetwork.h" #include "llweb.h" -static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory"); +static LLPanelInjector<LLSidepanelInventory> t_inventory("sidepanel_inventory"); // // Constants @@ -397,7 +397,7 @@ void LLSidepanelInventory::onToggleInboxBtn() void LLSidepanelInventory::onOpen(const LLSD& key) { LLFirstUse::newInventory(false); - + mPanelMainInventory->setFocusFilterEditor(); #if AUTO_EXPAND_INBOX // Expand the inbox if we have fresh items LLPanelMarketplaceInbox * inbox = findChild<LLPanelMarketplaceInbox>(MARKETPLACE_INBOX_PANEL); diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index 92c2863ffd..e52b2f2559 100755 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -127,7 +127,7 @@ void LLObjectInventoryObserver::inventoryChanged(LLViewerObject* object, /// Class LLSidepanelItemInfo ///---------------------------------------------------------------------------- -static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_item_info"); +static LLPanelInjector<LLSidepanelItemInfo> t_item_info("sidepanel_item_info"); // Default constructor LLSidepanelItemInfo::LLSidepanelItemInfo(const LLPanel::Params& p) diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index ad7c939728..4428098929 100755 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -71,7 +71,7 @@ LLSidepanelTaskInfo* LLSidepanelTaskInfo::sActivePanel = NULL; -static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info"); +static LLPanelInjector<LLSidepanelTaskInfo> t_task_info("sidepanel_task_info"); // Default constructor LLSidepanelTaskInfo::LLSidepanelTaskInfo() @@ -1170,6 +1170,10 @@ void LLSidepanelTaskInfo::doClickAction(U8 click_action) // Warn, but do it anyway. LLNotificationsUtil::add("ClickActionNotPayable"); } + else + { + handle_give_money_dialog(); + } } LLSelectMgr::getInstance()->selectionSetClickAction(click_action); } diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp new file mode 100644 index 0000000000..7532ebfc57 --- /dev/null +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -0,0 +1,874 @@ +/** +* @file llsnapshotlivepreview.cpp +* @brief Implementation of llsnapshotlivepreview +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ + +#include "llviewerprecompiledheaders.h" + +#include "llagent.h" +#include "llagentcamera.h" +#include "llagentui.h" +#include "llcombobox.h" +#include "lleconomy.h" +#include "llfloaterperms.h" +#include "llfloaterreg.h" +#include "llfloatersocial.h" +#include "llimagebmp.h" +#include "llimagej2c.h" +#include "llimagejpeg.h" +#include "llimagepng.h" +#include "lllandmarkactions.h" +#include "lllocalcliprect.h" +#include "llnotificationsutil.h" +#include "llslurl.h" +#include "llsnapshotlivepreview.h" +#include "lltoolfocus.h" +#include "llviewercontrol.h" +#include "llviewermenufile.h" // upload_new_resource() +#include "llviewerstats.h" +#include "llvfile.h" +#include "llvfs.h" +#include "llwebsharing.h" +#include "llwindow.h" +#include "llworld.h" + +const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; + +F32 SHINE_TIME = 0.5f; +F32 SHINE_WIDTH = 0.6f; +F32 SHINE_OPACITY = 0.3f; +F32 FALL_TIME = 0.6f; +S32 BORDER_WIDTH = 6; + +const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 + +std::set<LLSnapshotLivePreview*> LLSnapshotLivePreview::sList; + +LLSnapshotLivePreview::LLSnapshotLivePreview (const LLSnapshotLivePreview::Params& p) + : LLView(p), + mColor(1.f, 0.f, 0.f, 0.5f), + mCurImageIndex(0), + mPreviewImage(NULL), + mThumbnailImage(NULL) , + mThumbnailWidth(0), + mThumbnailHeight(0), + mPreviewImageEncoded(NULL), + mFormattedImage(NULL), + mShineCountdown(0), + mFlashAlpha(0.f), + mNeedsFlash(TRUE), + mSnapshotQuality(gSavedSettings.getS32("SnapshotQuality")), + mDataSize(0), + mSnapshotType(SNAPSHOT_POSTCARD), + mSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))), + mSnapshotUpToDate(FALSE), + mCameraPos(LLViewerCamera::getInstance()->getOrigin()), + mCameraRot(LLViewerCamera::getInstance()->getQuaternion()), + mSnapshotActive(FALSE), + mSnapshotBufferType(LLViewerWindow::SNAPSHOT_TYPE_COLOR) +{ + setSnapshotQuality(gSavedSettings.getS32("SnapshotQuality")); + mSnapshotDelayTimer.setTimerExpirySec(0.0f); + mSnapshotDelayTimer.start(); + // gIdleCallbacks.addFunction( &LLSnapshotLivePreview::onIdle, (void*)this ); + sList.insert(this); + setFollowsAll(); + mWidth[0] = gViewerWindow->getWindowWidthRaw(); + mWidth[1] = gViewerWindow->getWindowWidthRaw(); + mHeight[0] = gViewerWindow->getWindowHeightRaw(); + mHeight[1] = gViewerWindow->getWindowHeightRaw(); + mImageScaled[0] = FALSE; + mImageScaled[1] = FALSE; + + mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; + mKeepAspectRatio = gSavedSettings.getBOOL("KeepAspectForSnapshot") ; + mThumbnailUpdateLock = FALSE ; + mThumbnailUpToDate = FALSE ; +} + +LLSnapshotLivePreview::~LLSnapshotLivePreview() +{ + // delete images + mPreviewImage = NULL; + mPreviewImageEncoded = NULL; + mFormattedImage = NULL; + + // gIdleCallbacks.deleteFunction( &LLSnapshotLivePreview::onIdle, (void*)this ); + sList.erase(this); +} + +void LLSnapshotLivePreview::setMaxImageSize(S32 size) +{ + if(size < MAX_SNAPSHOT_IMAGE_SIZE) + { + mMaxImageSize = size; + } + else + { + mMaxImageSize = MAX_SNAPSHOT_IMAGE_SIZE ; + } +} + +LLViewerTexture* LLSnapshotLivePreview::getCurrentImage() +{ + return mViewerImage[mCurImageIndex]; +} + +F32 LLSnapshotLivePreview::getAspect() +{ + F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight()); + F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); + + if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot")) + { + return image_aspect_ratio; + } + else + { + return window_aspect_ratio; + } +} + +F32 LLSnapshotLivePreview::getImageAspect() +{ + if (!getCurrentImage()) + { + return 0.f; + } + + return getAspect() ; +} + +void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay) +{ + // Invalidate current image. + lldebugs << "updateSnapshot: mSnapshotUpToDate = " << getSnapshotUpToDate() << llendl; + if (getSnapshotUpToDate()) + { + S32 old_image_index = mCurImageIndex; + mCurImageIndex = (mCurImageIndex + 1) % 2; + setSize(mWidth[old_image_index], mHeight[old_image_index]); + mFallAnimTimer.start(); + } + mSnapshotUpToDate = FALSE; + + // Update snapshot source rect depending on whether we keep the aspect ratio. + LLRect& rect = mImageRect[mCurImageIndex]; + rect.set(0, getRect().getHeight(), getRect().getWidth(), 0); + + F32 image_aspect_ratio = ((F32)getWidth()) / ((F32)getHeight()); + F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); + + if (mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot")) + { + if (image_aspect_ratio > window_aspect_ratio) + { + // trim off top and bottom + S32 new_height = llround((F32)getRect().getWidth() / image_aspect_ratio); + rect.mBottom += (getRect().getHeight() - new_height) / 2; + rect.mTop -= (getRect().getHeight() - new_height) / 2; + } + else if (image_aspect_ratio < window_aspect_ratio) + { + // trim off left and right + S32 new_width = llround((F32)getRect().getHeight() * image_aspect_ratio); + rect.mLeft += (getRect().getWidth() - new_width) / 2; + rect.mRight -= (getRect().getWidth() - new_width) / 2; + } + } + + // Stop shining animation. + mShineAnimTimer.stop(); + + // Update snapshot if requested. + if (new_snapshot) + { + mSnapshotDelayTimer.start(); + mSnapshotDelayTimer.setTimerExpirySec(delay); + LLFloaterSnapshot::preUpdate(); + LLFloaterSocial::preUpdate(); + } + + // Update thumbnail if requested. + if(new_thumbnail) + { + mThumbnailUpToDate = FALSE ; + } +} + +void LLSnapshotLivePreview::setSnapshotQuality(S32 quality) +{ + llclamp(quality, 0, 100); + if (quality != mSnapshotQuality) + { + mSnapshotQuality = quality; + gSavedSettings.setS32("SnapshotQuality", quality); + mSnapshotUpToDate = FALSE; + } +} + +void LLSnapshotLivePreview::drawPreviewRect(S32 offset_x, S32 offset_y) +{ + F32 line_width ; + glGetFloatv(GL_LINE_WIDTH, &line_width) ; + glLineWidth(2.0f * line_width) ; + LLColor4 color(0.0f, 0.0f, 0.0f, 1.0f) ; + gl_rect_2d( mPreviewRect.mLeft + offset_x, mPreviewRect.mTop + offset_y, + mPreviewRect.mRight + offset_x, mPreviewRect.mBottom + offset_y, color, FALSE ) ; + glLineWidth(line_width) ; + + //draw four alpha rectangles to cover areas outside of the snapshot image + if(!mKeepAspectRatio) + { + LLColor4 alpha_color(0.5f, 0.5f, 0.5f, 0.8f) ; + S32 dwl = 0, dwr = 0 ; + if(mThumbnailWidth > mPreviewRect.getWidth()) + { + dwl = (mThumbnailWidth - mPreviewRect.getWidth()) >> 1 ; + dwr = mThumbnailWidth - mPreviewRect.getWidth() - dwl ; + + gl_rect_2d(mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mTop + offset_y, + mPreviewRect.mLeft + offset_x, mPreviewRect.mBottom + offset_y, alpha_color, TRUE ) ; + gl_rect_2d( mPreviewRect.mRight + offset_x, mPreviewRect.mTop + offset_y, + mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mBottom + offset_y, alpha_color, TRUE ) ; + } + + if(mThumbnailHeight > mPreviewRect.getHeight()) + { + S32 dh = (mThumbnailHeight - mPreviewRect.getHeight()) >> 1 ; + gl_rect_2d(mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mBottom + offset_y , + mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mBottom + offset_y - dh, alpha_color, TRUE ) ; + + dh = mThumbnailHeight - mPreviewRect.getHeight() - dh ; + gl_rect_2d( mPreviewRect.mLeft + offset_x - dwl, mPreviewRect.mTop + offset_y + dh, + mPreviewRect.mRight + offset_x + dwr, mPreviewRect.mTop + offset_y, alpha_color, TRUE ) ; + } + } +} + +//called when the frame is frozen. +void LLSnapshotLivePreview::draw() +{ + if (getCurrentImage() && + mPreviewImageEncoded.notNull() && + getSnapshotUpToDate()) + { + LLColor4 bg_color(0.f, 0.f, 0.3f, 0.4f); + gl_rect_2d(getRect(), bg_color); + const LLRect& rect = getImageRect(); + LLRect shadow_rect = rect; + shadow_rect.stretch(BORDER_WIDTH); + gl_drop_shadow(shadow_rect.mLeft, shadow_rect.mTop, shadow_rect.mRight, shadow_rect.mBottom, LLColor4(0.f, 0.f, 0.f, mNeedsFlash ? 0.f :0.5f), 10); + + LLColor4 image_color(1.f, 1.f, 1.f, 1.f); + gGL.color4fv(image_color.mV); + gGL.getTexUnit(0)->bind(getCurrentImage()); + // calculate UV scale + F32 uv_width = isImageScaled() ? 1.f : llmin((F32)getWidth() / (F32)getCurrentImage()->getWidth(), 1.f); + F32 uv_height = isImageScaled() ? 1.f : llmin((F32)getHeight() / (F32)getCurrentImage()->getHeight(), 1.f); + gGL.pushMatrix(); + { + gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom, 0.f); + gGL.begin(LLRender::QUADS); + { + gGL.texCoord2f(uv_width, uv_height); + gGL.vertex2i(rect.getWidth(), rect.getHeight() ); + + gGL.texCoord2f(0.f, uv_height); + gGL.vertex2i(0, rect.getHeight() ); + + gGL.texCoord2f(0.f, 0.f); + gGL.vertex2i(0, 0); + + gGL.texCoord2f(uv_width, 0.f); + gGL.vertex2i(rect.getWidth(), 0); + } + gGL.end(); + } + gGL.popMatrix(); + + gGL.color4f(1.f, 1.f, 1.f, mFlashAlpha); + gl_rect_2d(getRect()); + if (mNeedsFlash) + { + if (mFlashAlpha < 1.f) + { + mFlashAlpha = lerp(mFlashAlpha, 1.f, LLCriticalDamp::getInterpolant(0.02f)); + } + else + { + mNeedsFlash = FALSE; + } + } + else + { + mFlashAlpha = lerp(mFlashAlpha, 0.f, LLCriticalDamp::getInterpolant(0.15f)); + } + + // Draw shining animation if appropriate. + if (mShineCountdown > 0) + { + mShineCountdown--; + if (mShineCountdown == 0) + { + mShineAnimTimer.start(); + } + } + else if (mShineAnimTimer.getStarted()) + { + lldebugs << "Drawing shining animation" << llendl; + F32 shine_interp = llmin(1.f, mShineAnimTimer.getElapsedTimeF32() / SHINE_TIME); + + // draw "shine" effect + LLLocalClipRect clip(getLocalRect()); + { + // draw diagonal stripe with gradient that passes over screen + S32 x1 = gViewerWindow->getWindowWidthScaled() * llround((clamp_rescale(shine_interp, 0.f, 1.f, -1.f - SHINE_WIDTH, 1.f))); + S32 x2 = x1 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); + S32 x3 = x2 + llround(gViewerWindow->getWindowWidthScaled() * SHINE_WIDTH); + S32 y1 = 0; + S32 y2 = gViewerWindow->getWindowHeightScaled(); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.begin(LLRender::QUADS); + { + gGL.color4f(1.f, 1.f, 1.f, 0.f); + gGL.vertex2i(x1, y1); + gGL.vertex2i(x1 + gViewerWindow->getWindowWidthScaled(), y2); + gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); + gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); + gGL.vertex2i(x2, y1); + + gGL.color4f(1.f, 1.f, 1.f, SHINE_OPACITY); + gGL.vertex2i(x2, y1); + gGL.vertex2i(x2 + gViewerWindow->getWindowWidthScaled(), y2); + gGL.color4f(1.f, 1.f, 1.f, 0.f); + gGL.vertex2i(x3 + gViewerWindow->getWindowWidthScaled(), y2); + gGL.vertex2i(x3, y1); + } + gGL.end(); + } + + // if we're at the end of the animation, stop + if (shine_interp >= 1.f) + { + mShineAnimTimer.stop(); + } + } + } + + // draw framing rectangle + { + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.color4f(1.f, 1.f, 1.f, 1.f); + const LLRect& outline_rect = getImageRect(); + gGL.begin(LLRender::QUADS); + { + gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); + gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); + gGL.vertex2i(outline_rect.mRight, outline_rect.mTop); + gGL.vertex2i(outline_rect.mLeft, outline_rect.mTop); + + gGL.vertex2i(outline_rect.mLeft, outline_rect.mBottom); + gGL.vertex2i(outline_rect.mRight, outline_rect.mBottom); + gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); + gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); + + gGL.vertex2i(outline_rect.mLeft, outline_rect.mTop); + gGL.vertex2i(outline_rect.mLeft, outline_rect.mBottom); + gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); + gGL.vertex2i(outline_rect.mLeft - BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); + + gGL.vertex2i(outline_rect.mRight, outline_rect.mBottom); + gGL.vertex2i(outline_rect.mRight, outline_rect.mTop); + gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mTop + BORDER_WIDTH); + gGL.vertex2i(outline_rect.mRight + BORDER_WIDTH, outline_rect.mBottom - BORDER_WIDTH); + } + gGL.end(); + } + + // draw old image dropping away + if (mFallAnimTimer.getStarted()) + { + S32 old_image_index = (mCurImageIndex + 1) % 2; + if (mViewerImage[old_image_index].notNull() && mFallAnimTimer.getElapsedTimeF32() < FALL_TIME) + { + lldebugs << "Drawing fall animation" << llendl; + F32 fall_interp = mFallAnimTimer.getElapsedTimeF32() / FALL_TIME; + F32 alpha = clamp_rescale(fall_interp, 0.f, 1.f, 0.8f, 0.4f); + LLColor4 image_color(1.f, 1.f, 1.f, alpha); + gGL.color4fv(image_color.mV); + gGL.getTexUnit(0)->bind(mViewerImage[old_image_index]); + // calculate UV scale + // *FIX get this to work with old image + BOOL rescale = !mImageScaled[old_image_index] && mViewerImage[mCurImageIndex].notNull(); + F32 uv_width = rescale ? llmin((F32)mWidth[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getWidth(), 1.f) : 1.f; + F32 uv_height = rescale ? llmin((F32)mHeight[old_image_index] / (F32)mViewerImage[mCurImageIndex]->getHeight(), 1.f) : 1.f; + gGL.pushMatrix(); + { + LLRect& rect = mImageRect[old_image_index]; + gGL.translatef((F32)rect.mLeft, (F32)rect.mBottom - llround(getRect().getHeight() * 2.f * (fall_interp * fall_interp)), 0.f); + gGL.rotatef(-45.f * fall_interp, 0.f, 0.f, 1.f); + gGL.begin(LLRender::QUADS); + { + gGL.texCoord2f(uv_width, uv_height); + gGL.vertex2i(rect.getWidth(), rect.getHeight() ); + + gGL.texCoord2f(0.f, uv_height); + gGL.vertex2i(0, rect.getHeight() ); + + gGL.texCoord2f(0.f, 0.f); + gGL.vertex2i(0, 0); + + gGL.texCoord2f(uv_width, 0.f); + gGL.vertex2i(rect.getWidth(), 0); + } + gGL.end(); + } + gGL.popMatrix(); + } + } +} + +/*virtual*/ +void LLSnapshotLivePreview::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + LLRect old_rect = getRect(); + LLView::reshape(width, height, called_from_parent); + if (old_rect.getWidth() != width || old_rect.getHeight() != height) + { + lldebugs << "window reshaped, updating thumbnail" << llendl; + updateSnapshot(FALSE, TRUE); + } +} + +BOOL LLSnapshotLivePreview::setThumbnailImageSize() +{ + if(getWidth() < 10 || getHeight() < 10) + { + return FALSE ; + } + S32 window_width = gViewerWindow->getWindowWidthRaw() ; + S32 window_height = gViewerWindow->getWindowHeightRaw() ; + + F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); + + // UI size for thumbnail + // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h. + const LLRect& thumbnail_rect = mThumbnailPlaceholderRect; + S32 max_width = thumbnail_rect.getWidth(); + S32 max_height = thumbnail_rect.getHeight(); + + if (window_aspect_ratio > (F32)max_width / max_height) + { + // image too wide, shrink to width + mThumbnailWidth = max_width; + mThumbnailHeight = llround((F32)max_width / window_aspect_ratio); + } + else + { + // image too tall, shrink to height + mThumbnailHeight = max_height; + mThumbnailWidth = llround((F32)max_height * window_aspect_ratio); + } + + if(mThumbnailWidth > window_width || mThumbnailHeight > window_height) + { + return FALSE ;//if the window is too small, ignore thumbnail updating. + } + + S32 left = 0 , top = mThumbnailHeight, right = mThumbnailWidth, bottom = 0 ; + if(!mKeepAspectRatio) + { + F32 ratio_x = (F32)getWidth() / window_width ; + F32 ratio_y = (F32)getHeight() / window_height ; + + //if(getWidth() > window_width || + // getHeight() > window_height ) + { + if(ratio_x > ratio_y) + { + top = (S32)(top * ratio_y / ratio_x) ; + } + else + { + right = (S32)(right * ratio_x / ratio_y) ; + } + } + //else + //{ + // right = (S32)(right * ratio_x) ; + // top = (S32)(top * ratio_y) ; + //} + left = (S32)((mThumbnailWidth - right) * 0.5f) ; + bottom = (S32)((mThumbnailHeight - top) * 0.5f) ; + top += bottom ; + right += left ; + } + mPreviewRect.set(left - 1, top + 1, right + 1, bottom - 1) ; + + return TRUE ; +} + +void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) +{ + if(mThumbnailUpdateLock) //in the process of updating + { + return ; + } + if(getThumbnailUpToDate() && !force_update)//already updated + { + return ; + } + if(getWidth() < 10 || getHeight() < 10) + { + return ; + } + + ////lock updating + mThumbnailUpdateLock = TRUE ; + + if(!setThumbnailImageSize()) + { + mThumbnailUpdateLock = FALSE ; + mThumbnailUpToDate = TRUE ; + return ; + } + + if(mThumbnailImage) + { + resetThumbnailImage() ; + } + + LLPointer<LLImageRaw> raw = new LLImageRaw; + if(!gViewerWindow->thumbnailSnapshot(raw, + mThumbnailWidth, mThumbnailHeight, + gSavedSettings.getBOOL("RenderUIInSnapshot"), + FALSE, + mSnapshotBufferType) ) + { + raw = NULL ; + } + + if(raw) + { + raw->expandToPowerOfTwo(); + mThumbnailImage = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE); + mThumbnailUpToDate = TRUE ; + } + + //unlock updating + mThumbnailUpdateLock = FALSE ; +} + + +// Called often. Checks whether it's time to grab a new snapshot and if so, does it. +// Returns TRUE if new snapshot generated, FALSE otherwise. +//static +BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) +{ + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + if (previewp->getWidth() == 0 || previewp->getHeight() == 0) + { + llwarns << "Incorrect dimensions: " << previewp->getWidth() << "x" << previewp->getHeight() << llendl; + return FALSE; + } + + // If we're in freeze-frame mode and camera has moved, update snapshot. + LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin(); + LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion(); + if (gSavedSettings.getBOOL("FreezeTime") && + (new_camera_pos != previewp->mCameraPos || dot(new_camera_rot, previewp->mCameraRot) < 0.995f)) + { + previewp->mCameraPos = new_camera_pos; + previewp->mCameraRot = new_camera_rot; + // request a new snapshot whenever the camera moves, with a time delay + BOOL autosnap = gSavedSettings.getBOOL("AutoSnapshot"); + lldebugs << "camera moved, updating thumbnail" << llendl; + previewp->updateSnapshot( + autosnap, // whether a new snapshot is needed or merely invalidate the existing one + FALSE, // or if 1st arg is false, whether to produce a new thumbnail image. + autosnap ? AUTO_SNAPSHOT_TIME_DELAY : 0.f); // shutter delay if 1st arg is true. + } + + // see if it's time yet to snap the shot and bomb out otherwise. + previewp->mSnapshotActive = + (previewp->mSnapshotDelayTimer.getStarted() && previewp->mSnapshotDelayTimer.hasExpired()) + && !LLToolCamera::getInstance()->hasMouseCapture(); // don't take snapshots while ALT-zoom active + if ( ! previewp->mSnapshotActive) + { + return FALSE; + } + + // time to produce a snapshot + previewp->setThumbnailImageSize(); + + lldebugs << "producing snapshot" << llendl; + if (!previewp->mPreviewImage) + { + previewp->mPreviewImage = new LLImageRaw; + } + + if (!previewp->mPreviewImageEncoded) + { + previewp->mPreviewImageEncoded = new LLImageRaw; + } + + previewp->setVisible(FALSE); + previewp->setEnabled(FALSE); + + previewp->getWindow()->incBusyCount(); + previewp->setImageScaled(FALSE); + + // grab the raw image and encode it into desired format + if(gViewerWindow->rawSnapshot( + previewp->mPreviewImage, + previewp->getWidth(), + previewp->getHeight(), + previewp->mKeepAspectRatio,//gSavedSettings.getBOOL("KeepAspectForSnapshot"), + previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE, + gSavedSettings.getBOOL("RenderUIInSnapshot"), + FALSE, + previewp->mSnapshotBufferType, + previewp->getMaxImageSize())) + { + previewp->mPreviewImageEncoded->resize( + previewp->mPreviewImage->getWidth(), + previewp->mPreviewImage->getHeight(), + previewp->mPreviewImage->getComponents()); + + if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE) + { + lldebugs << "Encoding new image of format J2C" << llendl; + LLPointer<LLImageJ2C> formatted = new LLImageJ2C; + LLPointer<LLImageRaw> scaled = new LLImageRaw( + previewp->mPreviewImage->getData(), + previewp->mPreviewImage->getWidth(), + previewp->mPreviewImage->getHeight(), + previewp->mPreviewImage->getComponents()); + + scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE); + previewp->setImageScaled(TRUE); + if (formatted->encode(scaled, 0.f)) + { + previewp->mDataSize = formatted->getDataSize(); + formatted->decode(previewp->mPreviewImageEncoded, 0); + } + } + else + { + // delete any existing image + previewp->mFormattedImage = NULL; + // now create the new one of the appropriate format. + LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotFormat(); + lldebugs << "Encoding new image of format " << format << llendl; + + switch(format) + { + case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: + previewp->mFormattedImage = new LLImagePNG(); + break; + case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: + previewp->mFormattedImage = new LLImageJPEG(previewp->mSnapshotQuality); + break; + case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP: + previewp->mFormattedImage = new LLImageBMP(); + break; + } + if (previewp->mFormattedImage->encode(previewp->mPreviewImage, 0)) + { + previewp->mDataSize = previewp->mFormattedImage->getDataSize(); + // special case BMP to copy instead of decode otherwise decode will crash. + if(format == LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP) + { + previewp->mPreviewImageEncoded->copy(previewp->mPreviewImage); + } + else + { + previewp->mFormattedImage->decode(previewp->mPreviewImageEncoded, 0); + } + } + } + + LLPointer<LLImageRaw> scaled = new LLImageRaw( + previewp->mPreviewImageEncoded->getData(), + previewp->mPreviewImageEncoded->getWidth(), + previewp->mPreviewImageEncoded->getHeight(), + previewp->mPreviewImageEncoded->getComponents()); + + if(!scaled->isBufferInvalid()) + { + // leave original image dimensions, just scale up texture buffer + if (previewp->mPreviewImageEncoded->getWidth() > 1024 || previewp->mPreviewImageEncoded->getHeight() > 1024) + { + // go ahead and shrink image to appropriate power of 2 for display + scaled->biasedScaleToPowerOfTwo(1024); + previewp->setImageScaled(TRUE); + } + else + { + // expand image but keep original image data intact + scaled->expandToPowerOfTwo(1024, FALSE); + } + + previewp->mViewerImage[previewp->mCurImageIndex] = LLViewerTextureManager::getLocalTexture(scaled.get(), FALSE); + LLPointer<LLViewerTexture> curr_preview_image = previewp->mViewerImage[previewp->mCurImageIndex]; + gGL.getTexUnit(0)->bind(curr_preview_image); + if (previewp->getSnapshotType() != SNAPSHOT_TEXTURE) + { + curr_preview_image->setFilteringOption(LLTexUnit::TFO_POINT); + } + else + { + curr_preview_image->setFilteringOption(LLTexUnit::TFO_ANISOTROPIC); + } + curr_preview_image->setAddressMode(LLTexUnit::TAM_CLAMP); + + previewp->mSnapshotUpToDate = TRUE; + previewp->generateThumbnailImage(TRUE) ; + + previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal(); + previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame + } + } + previewp->getWindow()->decBusyCount(); + // only show fullscreen preview when in freeze frame mode + previewp->setVisible(gSavedSettings.getBOOL("UseFreezeFrame")); + previewp->mSnapshotDelayTimer.stop(); + previewp->mSnapshotActive = FALSE; + + if(!previewp->getThumbnailUpToDate()) + { + previewp->generateThumbnailImage() ; + } + lldebugs << "done creating snapshot" << llendl; + LLFloaterSnapshot::postUpdate(); + LLFloaterSocial::postUpdate(); + + return TRUE; +} + +void LLSnapshotLivePreview::setSize(S32 w, S32 h) +{ + lldebugs << "setSize(" << w << ", " << h << ")" << llendl; + setWidth(w); + setHeight(h); +} + +void LLSnapshotLivePreview::getSize(S32& w, S32& h) const +{ + w = getWidth(); + h = getHeight(); +} + +void LLSnapshotLivePreview::saveTexture() +{ + lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl; + // gen a new uuid for this asset + LLTransactionID tid; + tid.generate(); + LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); + + LLPointer<LLImageJ2C> formatted = new LLImageJ2C; + LLPointer<LLImageRaw> scaled = new LLImageRaw(mPreviewImage->getData(), + mPreviewImage->getWidth(), + mPreviewImage->getHeight(), + mPreviewImage->getComponents()); + + scaled->biasedScaleToPowerOfTwo(MAX_TEXTURE_SIZE); + lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl; + + if (formatted->encode(scaled, 0.0f)) + { + LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE); + std::string pos_string; + LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL); + std::string who_took_it; + LLAgentUI::buildFullname(who_took_it); + LLAssetStorage::LLStoreAssetCallback callback = NULL; + S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; + upload_new_resource(tid, // tid + LLAssetType::AT_TEXTURE, + "Snapshot : " + pos_string, + "Taken by " + who_took_it + " at " + pos_string, + 0, + LLFolderType::FT_SNAPSHOT_CATEGORY, + LLInventoryType::IT_SNAPSHOT, + PERM_ALL, // Note: Snapshots to inventory is a special case of content upload + LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads + LLFloaterPerms::getEveryonePerms(), + "Snapshot : " + pos_string, + callback, expected_upload_cost, userdata); + gViewerWindow->playSnapshotAnimAndSound(); + } + else + { + LLNotificationsUtil::add("ErrorEncodingSnapshot"); + llwarns << "Error encoding snapshot" << llendl; + } + + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_SNAPSHOT_COUNT ); + + mDataSize = 0; +} + +BOOL LLSnapshotLivePreview::saveLocal() +{ + BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); + + if(success) + { + gViewerWindow->playSnapshotAnimAndSound(); + } + return success; +} + +void LLSnapshotLivePreview::saveWeb() +{ + // *FIX: Will break if the window closes because of CloseSnapshotOnKeep! + // Needs to pass on ownership of the image. + LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); + if(!jpg) + { + llwarns << "Formatted image not a JPEG" << llendl; + return; + } + + LLSD metadata; + metadata["description"] = getChild<LLLineEditor>("description")->getText(); + + LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), + boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); + + gViewerWindow->playSnapshotAnimAndSound(); +} + +void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) +{ + metadata["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); + + LLWebSharing::instance().shareSnapshot(snapshot, metadata); +} diff --git a/indra/newview/llsnapshotlivepreview.h b/indra/newview/llsnapshotlivepreview.h new file mode 100644 index 0000000000..fe3d257b02 --- /dev/null +++ b/indra/newview/llsnapshotlivepreview.h @@ -0,0 +1,164 @@ +/** +* @file llsnapshotlivepreview.h +* @brief Header file for llsnapshotlivepreview +* @author Gilbert@lindenlab.com +* +* $LicenseInfo:firstyear=2013&license=viewerlgpl$ +* Second Life Viewer Source Code +* Copyright (C) 2013, Linden Research, Inc. +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; +* version 2.1 of the License only. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +* +* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +* $/LicenseInfo$ +*/ +#ifndef LL_LLSNAPSHOTLIVEPREVIEW_H +#define LL_LLSNAPSHOTLIVEPREVIEW_H + +#include "llpanelsnapshot.h" +#include "llviewerwindow.h" + +class LLImageJPEG; + +///---------------------------------------------------------------------------- +/// Class LLSnapshotLivePreview +///---------------------------------------------------------------------------- +class LLSnapshotLivePreview : public LLView +{ + LOG_CLASS(LLSnapshotLivePreview); +public: + enum ESnapshotType + { + SNAPSHOT_POSTCARD, + SNAPSHOT_TEXTURE, + SNAPSHOT_LOCAL, + SNAPSHOT_WEB + }; + + + struct Params : public LLInitParam::Block<Params, LLView::Params> + { + Params() + { + name = "snapshot_live_preview"; + mouse_opaque = false; + } + }; + + + LLSnapshotLivePreview(const LLSnapshotLivePreview::Params& p); + ~LLSnapshotLivePreview(); + + /*virtual*/ void draw(); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent); + + void setSize(S32 w, S32 h); + void setWidth(S32 w) { mWidth[mCurImageIndex] = w; } + void setHeight(S32 h) { mHeight[mCurImageIndex] = h; } + void getSize(S32& w, S32& h) const; + S32 getWidth() const { return mWidth[mCurImageIndex]; } + S32 getHeight() const { return mHeight[mCurImageIndex]; } + S32 getDataSize() const { return mDataSize; } + void setMaxImageSize(S32 size) ; + S32 getMaxImageSize() {return mMaxImageSize ;} + + ESnapshotType getSnapshotType() const { return mSnapshotType; } + LLFloaterSnapshot::ESnapshotFormat getSnapshotFormat() const { return mSnapshotFormat; } + BOOL getSnapshotUpToDate() const { return mSnapshotUpToDate; } + BOOL isSnapshotActive() { return mSnapshotActive; } + LLViewerTexture* getThumbnailImage() const { return mThumbnailImage ; } + S32 getThumbnailWidth() const { return mThumbnailWidth ; } + S32 getThumbnailHeight() const { return mThumbnailHeight ; } + BOOL getThumbnailLock() const { return mThumbnailUpdateLock ; } + BOOL getThumbnailUpToDate() const { return mThumbnailUpToDate ;} + LLViewerTexture* getCurrentImage(); + F32 getImageAspect(); + F32 getAspect() ; + const LLRect& getImageRect() const { return mImageRect[mCurImageIndex]; } + BOOL isImageScaled() const { return mImageScaled[mCurImageIndex]; } + void setImageScaled(BOOL scaled) { mImageScaled[mCurImageIndex] = scaled; } + const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; } + + void setSnapshotType(ESnapshotType type) { mSnapshotType = type; } + void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } + void setSnapshotQuality(S32 quality); + void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; } + void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); + void saveWeb(); + void saveTexture(); + BOOL saveLocal(); + + LLPointer<LLImageFormatted> getFormattedImage() const { return mFormattedImage; } + LLPointer<LLImageRaw> getEncodedImage() const { return mPreviewImageEncoded; } + + /// Sets size of preview thumbnail image and thhe surrounding rect. + void setThumbnailPlaceholderRect(const LLRect& rect) {mThumbnailPlaceholderRect = rect; } + BOOL setThumbnailImageSize() ; + void generateThumbnailImage(BOOL force_update = FALSE) ; + void resetThumbnailImage() { mThumbnailImage = NULL ; } + void drawPreviewRect(S32 offset_x, S32 offset_y) ; + + // Returns TRUE when snapshot generated, FALSE otherwise. + static BOOL onIdle( void* snapshot_preview ); + + // callback for region name resolve + void regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z); + +private: + LLColor4 mColor; + LLPointer<LLViewerTexture> mViewerImage[2]; //used to represent the scene when the frame is frozen. + LLRect mImageRect[2]; + S32 mWidth[2]; + S32 mHeight[2]; + BOOL mImageScaled[2]; + S32 mMaxImageSize ; + + //thumbnail image + LLPointer<LLViewerTexture> mThumbnailImage ; + S32 mThumbnailWidth ; + S32 mThumbnailHeight ; + LLRect mPreviewRect ; + BOOL mThumbnailUpdateLock ; + BOOL mThumbnailUpToDate ; + LLRect mThumbnailPlaceholderRect; + + S32 mCurImageIndex; + LLPointer<LLImageRaw> mPreviewImage; + LLPointer<LLImageRaw> mPreviewImageEncoded; + LLPointer<LLImageFormatted> mFormattedImage; + LLFrameTimer mSnapshotDelayTimer; + S32 mShineCountdown; + LLFrameTimer mShineAnimTimer; + F32 mFlashAlpha; + BOOL mNeedsFlash; + LLVector3d mPosTakenGlobal; + S32 mSnapshotQuality; + S32 mDataSize; + ESnapshotType mSnapshotType; + LLFloaterSnapshot::ESnapshotFormat mSnapshotFormat; + BOOL mSnapshotUpToDate; + LLFrameTimer mFallAnimTimer; + LLVector3 mCameraPos; + LLQuaternion mCameraRot; + BOOL mSnapshotActive; + LLViewerWindow::ESnapshotType mSnapshotBufferType; + +public: + static std::set<LLSnapshotLivePreview*> sList; + BOOL mKeepAspectRatio ; +}; + +#endif // LL_LLSNAPSHOTLIVEPREVIEW_H + diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 00eb0c1ab1..2c83f6d0b7 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1568,7 +1568,7 @@ void LLSpatialGroup::checkOcclusion() { glGetQueryObjectuivARB(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available); - static LLCachedControl<bool> wait_for_query(gSavedSettings, "RenderSynchronousOcclusion"); + static LLCachedControl<bool> wait_for_query(gSavedSettings, "RenderSynchronousOcclusion", true); if (wait_for_query && mOcclusionIssued[LLViewerCamera::sCurCameraID] < gFrameCount) { //query was issued last frame, wait until it's available diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 67a76460a7..d5f8a1e46e 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -786,14 +786,18 @@ bool idle_startup() display_startup(); LLPanelLogin::giveFocus(); - if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + // MAINT-3231 Show first run dialog only for Desura viewer + if (gSavedSettings.getString("sourceid") == "1208_desura") { - LL_INFOS("AppInit") << "FirstLoginThisInstall, calling show_first_run_dialog()" << LL_ENDL; - show_first_run_dialog(); - } - else - { - LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL; + if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + { + LL_INFOS("AppInit") << "FirstLoginThisInstall, calling show_first_run_dialog()" << LL_ENDL; + show_first_run_dialog(); + } + else + { + LL_DEBUGS("AppInit") << "FirstLoginThisInstall off" << LL_ENDL; + } } LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 1a3add2bfb..626d69aca4 100755 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -118,6 +118,11 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id) } } + LLPanel * LLSysWellWindow::findItemByID(const LLUUID& id) +{ + return mMessageList->getItemByValue(id); +} + //--------------------------------------------------------------------------------- //--------------------------------------------------------------------------------- void LLSysWellWindow::initChannel() diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index cc5c057d8b..71b41476f5 100755 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -55,6 +55,7 @@ public: // Operating with items void removeItemByID(const LLUUID& id); + LLPanel * findItemByID(const LLUUID& id); // Operating with outfit virtual void setVisible(BOOL visible); diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 4300cafb6b..ea837c9127 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -820,7 +820,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem { mNoCopyTextureSelected = TRUE; } - mImageAssetID = itemp->getAssetUUID(); + setImageID(itemp->getAssetUUID()); mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? if (user_action && mCanPreview) { diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index bcb55c4bbe..e5f2ca7e5c 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -1270,7 +1270,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == LOAD_FROM_NETWORK) { - static LLCachedControl<bool> use_http(gSavedSettings,"ImagePipelineUseHTTP"); + static LLCachedControl<bool> use_http(gSavedSettings,"ImagePipelineUseHTTP", true); // if (mHost != LLHost::invalid) get_url = false; if ( use_http && mCanUseHTTP && mUrl.empty())//get http url. @@ -1697,7 +1697,7 @@ bool LLTextureFetchWorker::doWork(S32 param) if (mState == DECODE_IMAGE) { - static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled"); + static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false); setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it if (textures_decode_disabled) @@ -1873,9 +1873,9 @@ bool LLTextureFetchWorker::doWork(S32 param) // virtual void LLTextureFetchWorker::onCompleted(LLCore::HttpHandle handle, LLCore::HttpResponse * response) { - static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog"); - static LLCachedControl<bool> log_to_sim(gSavedSettings, "LogTextureDownloadsToSimulator"); - static LLCachedControl<bool> log_texture_traffic(gSavedSettings, "LogTextureNetworkTraffic") ; + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings, "LogTextureDownloadsToViewerLog", false); + static LLCachedControl<bool> log_to_sim(gSavedSettings, "LogTextureDownloadsToSimulator", false); + static LLCachedControl<bool> log_texture_traffic(gSavedSettings, "LogTextureNetworkTraffic", false) ; LLMutexLock lock(&mWorkMutex); // +Mw @@ -2885,7 +2885,7 @@ void LLTextureFetch::commonUpdate() //virtual S32 LLTextureFetch::update(F32 max_time_ms) { - static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS"); + static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS", 500.0); { mNetworkQueueMutex.lock(); // +Mfnq @@ -3108,8 +3108,8 @@ void LLTextureFetch::sendRequestListToSimulators() // llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard // << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl; - static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); - static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false); + static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false); if (log_to_viewer_log || log_to_sim) { mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime()); @@ -3368,8 +3368,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1 if (packet_num >= (worker->mTotalPackets - 1)) { - static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); - static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false); + static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false); if (log_to_viewer_log || log_to_sim) { diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index d876c9a3f4..448fae48de 100755 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -555,7 +555,7 @@ BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask) mHideBtnPressed = mHideBtn->getRect().pointInRect(x, y); } - return LLFloater::handleMouseDown(x, y, mask); + return LLModalDialog::handleMouseDown(x, y, mask); } //-------------------------------------------------------------------------- diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 3f75f8da5e..6083210080 100755 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -492,7 +492,7 @@ void LLToastAlertPanel::draw() } static LLUIColor shadow_color = LLUIColorTable::instance().getColor("ColorDropShadow"); - static LLUICachedControl<S32> shadow_lines ("DropShadowFloater"); + static LLUICachedControl<S32> shadow_lines ("DropShadowFloater", 5); gl_drop_shadow( 0, LLToastPanel::getRect().getHeight(), LLToastPanel::getRect().getWidth(), 0, shadow_color, shadow_lines); diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 09ab31df36..bdbd8f1f83 100755 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -93,7 +93,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif if(!mIsGroupMsg) { - mAvatarName->setValue(p.from); + mAvatarName->setValue(p.from); } mTime->setValue(p.time); mSessionID = p.session_id; @@ -164,7 +164,7 @@ void LLToastIMPanel::spawnNameToolTip() params.background_visible(false); if(!mIsGroupMsg) { - params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE)); + params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE)); } else { diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 94d07b37ef..9824f2dd38 100755 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -41,6 +41,7 @@ #include "llnotificationsutil.h" #include "llviewermessage.h" #include "llfloaterimsession.h" +#include "llavataractions.h" const S32 BOTTOM_PAD = VPAD * 3; const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding @@ -130,6 +131,7 @@ LLToastNotifyPanel::~LLToastNotifyPanel() mButtonClickConnection.disconnect(); std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer()); + mBtnCallbackData.clear(); if (mIsTip) { LLNotifications::getInstance()->cancel(mNotification); @@ -313,6 +315,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) mTextBox->setVisible(TRUE); mTextBox->setPlainText(!show_images); mTextBox->setValue(mNotification->getMessage()); + mTextBox->setIsFriendCallback(LLAvatarActions::isFriend); // add buttons for a script notification if (mIsTip) @@ -407,6 +410,28 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images ) } } +bool LLToastNotifyPanel::isControlPanelEnabled() const +{ + bool cp_enabled = mControlPanel->getEnabled(); + bool some_buttons_enabled = false; + if (cp_enabled) + { + LLView::child_list_const_iter_t child_it = mControlPanel->beginChild(); + LLView::child_list_const_iter_t child_it_end = mControlPanel->endChild(); + for(; child_it != child_it_end; ++child_it) + { + LLButton * buttonp = dynamic_cast<LLButton *>(*child_it); + if (buttonp && buttonp->getEnabled()) + { + some_buttons_enabled = true; + break; + } + } + } + + return cp_enabled && some_buttons_enabled; +} + ////////////////////////////////////////////////////////////////////////// LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */, diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h index d02171b512..fe7f1cf8f3 100755 --- a/indra/newview/lltoastnotifypanel.h +++ b/indra/newview/lltoastnotifypanel.h @@ -69,6 +69,8 @@ public: virtual void updateNotification() {} + bool isControlPanelEnabled() const; + protected: LLButton* createButton(const LLSD& form_element, BOOL is_option); diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp index a30f841980..e1b764a943 100755 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -53,6 +53,12 @@ std::string LLToastPanel::getTitle() } //virtual +const std::string& LLToastPanel::getNotificationName() +{ + return mNotification->getName(); +} + +//virtual const LLUUID& LLToastPanel::getID() { return mNotification->id(); diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index e4ab95007e..51630381f2 100755 --- a/indra/newview/lltoastpanel.h +++ b/indra/newview/lltoastpanel.h @@ -45,6 +45,7 @@ public: virtual ~LLToastPanel() = 0; virtual std::string getTitle(); + virtual const std::string& getNotificationName(); virtual const LLUUID& getID(); static const S32 MIN_PANEL_HEIGHT; diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h index ecc435d844..c5bad9d532 100755 --- a/indra/newview/lltool.h +++ b/indra/newview/lltool.h @@ -39,7 +39,7 @@ class LLView; class LLPanel; class LLTool -: public LLMouseHandler +: public LLMouseHandler, public LLThreadSafeRefCount { public: LLTool( const std::string& name, LLToolComposite* composite = NULL ); diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 78a555d67d..36d4654393 100755 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -77,7 +77,7 @@ LLToolBarView::LLToolBarView(const LLToolBarView::Params& p) mToolbarsLoaded(false), mBottomToolbarPanel(NULL) { - for (S32 i = 0; i < TOOLBAR_COUNT; i++) + for (S32 i = 0; i < LLToolBarEnums::TOOLBAR_COUNT; i++) { mToolbars[i] = NULL; } @@ -96,12 +96,18 @@ LLToolBarView::~LLToolBarView() BOOL LLToolBarView::postBuild() { - mToolbars[TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left"); - mToolbars[TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right"); - mToolbars[TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom"); + mToolbars[LLToolBarEnums::TOOLBAR_LEFT] = getChild<LLToolBar>("toolbar_left"); + mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_LEFT); + + mToolbars[LLToolBarEnums::TOOLBAR_RIGHT] = getChild<LLToolBar>("toolbar_right"); + mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_RIGHT); + + mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM] = getChild<LLToolBar>("toolbar_bottom"); + mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCenterLayoutPanel()->setLocationId(LLToolBarEnums::TOOLBAR_BOTTOM); + mBottomToolbarPanel = getChild<LLView>("bottom_toolbar_panel"); - for (int i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (int i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { mToolbars[i]->setStartDragCallback(boost::bind(LLToolBarView::startDragTool,_1,_2,_3)); mToolbars[i]->setHandleDragCallback(boost::bind(LLToolBarView::handleDragTool,_1,_2,_3,_4)); @@ -115,9 +121,9 @@ BOOL LLToolBarView::postBuild() S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const { - S32 command_location = TOOLBAR_NONE; + S32 command_location = LLToolBarEnums::TOOLBAR_NONE; - for (S32 loc = TOOLBAR_FIRST; loc <= TOOLBAR_LAST; loc++) + for (S32 loc = LLToolBarEnums::TOOLBAR_FIRST; loc <= LLToolBarEnums::TOOLBAR_LAST; loc++) { if (mToolbars[loc]->hasCommand(commandId)) { @@ -129,7 +135,7 @@ S32 LLToolBarView::hasCommand(const LLCommandId& commandId) const return command_location; } -S32 LLToolBarView::addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank) +S32 LLToolBarView::addCommand(const LLCommandId& commandId, LLToolBarEnums::EToolBarLocation toolbar, int rank) { int old_rank; removeCommand(commandId, old_rank); @@ -144,7 +150,7 @@ S32 LLToolBarView::removeCommand(const LLCommandId& commandId, int& rank) S32 command_location = hasCommand(commandId); rank = LLToolBar::RANK_NONE; - if (command_location != TOOLBAR_NONE) + if (command_location != LLToolBarEnums::TOOLBAR_NONE) { rank = mToolbars[command_location]->removeCommand(commandId); } @@ -156,7 +162,7 @@ S32 LLToolBarView::enableCommand(const LLCommandId& commandId, bool enabled) { S32 command_location = hasCommand(commandId); - if (command_location != TOOLBAR_NONE) + if (command_location != LLToolBarEnums::TOOLBAR_NONE) { mToolbars[command_location]->enableCommand(commandId, enabled); } @@ -168,7 +174,7 @@ S32 LLToolBarView::stopCommandInProgress(const LLCommandId& commandId) { S32 command_location = hasCommand(commandId); - if (command_location != TOOLBAR_NONE) + if (command_location != LLToolBarEnums::TOOLBAR_NONE) { mToolbars[command_location]->stopCommandInProgress(commandId); } @@ -180,7 +186,7 @@ S32 LLToolBarView::flashCommand(const LLCommandId& commandId, bool flash, bool f { S32 command_location = hasCommand(commandId); - if (command_location != TOOLBAR_NONE) + if (command_location != LLToolBarEnums::TOOLBAR_NONE) { mToolbars[command_location]->flashCommand(commandId, flash, force_flashing); } @@ -259,7 +265,7 @@ bool LLToolBarView::loadToolbars(bool force_default) } // Clear the toolbars now before adding the loaded commands and settings - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { if (mToolbars[i]) { @@ -268,46 +274,46 @@ bool LLToolBarView::loadToolbars(bool force_default) } // Add commands to each toolbar - if (toolbar_set.left_toolbar.isProvided() && mToolbars[TOOLBAR_LEFT]) + if (toolbar_set.left_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_LEFT]) { if (toolbar_set.left_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.left_toolbar.button_display_mode; - mToolbars[TOOLBAR_LEFT]->setButtonType(button_type); + mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->setButtonType(button_type); } BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.left_toolbar.commands) { - if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_LEFT])) + if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_LEFT])) { llwarns << "Error adding command '" << command_params.name() << "' to left toolbar." << llendl; } } } - if (toolbar_set.right_toolbar.isProvided() && mToolbars[TOOLBAR_RIGHT]) + if (toolbar_set.right_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]) { if (toolbar_set.right_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.right_toolbar.button_display_mode; - mToolbars[TOOLBAR_RIGHT]->setButtonType(button_type); + mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->setButtonType(button_type); } BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.right_toolbar.commands) { - if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_RIGHT])) + if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_RIGHT])) { llwarns << "Error adding command '" << command_params.name() << "' to right toolbar." << llendl; } } } - if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[TOOLBAR_BOTTOM]) + if (toolbar_set.bottom_toolbar.isProvided() && mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]) { if (toolbar_set.bottom_toolbar.button_display_mode.isProvided()) { LLToolBarEnums::ButtonType button_type = toolbar_set.bottom_toolbar.button_display_mode; - mToolbars[TOOLBAR_BOTTOM]->setButtonType(button_type); + mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->setButtonType(button_type); } BOOST_FOREACH(const LLCommandId::Params& command_params, toolbar_set.bottom_toolbar.commands) { - if (addCommandInternal(LLCommandId(command_params), mToolbars[TOOLBAR_BOTTOM])) + if (addCommandInternal(LLCommandId(command_params), mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM])) { llwarns << "Error adding command '" << command_params.name() << "' to bottom toolbar." << llendl; } @@ -319,7 +325,7 @@ bool LLToolBarView::loadToolbars(bool force_default) bool LLToolBarView::clearToolbars() { - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { if (mToolbars[i]) { @@ -371,20 +377,20 @@ void LLToolBarView::saveToolbars() const // Build the parameter tree from the toolbar data LLToolBarView::ToolbarSet toolbar_set; - if (mToolbars[TOOLBAR_LEFT]) + if (mToolbars[LLToolBarEnums::TOOLBAR_LEFT]) { - toolbar_set.left_toolbar.button_display_mode = mToolbars[TOOLBAR_LEFT]->getButtonType(); - addToToolset(mToolbars[TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar); + toolbar_set.left_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getButtonType(); + addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_LEFT]->getCommandsList(), toolbar_set.left_toolbar); } - if (mToolbars[TOOLBAR_RIGHT]) + if (mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]) { - toolbar_set.right_toolbar.button_display_mode = mToolbars[TOOLBAR_RIGHT]->getButtonType(); - addToToolset(mToolbars[TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar); + toolbar_set.right_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getButtonType(); + addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_RIGHT]->getCommandsList(), toolbar_set.right_toolbar); } - if (mToolbars[TOOLBAR_BOTTOM]) + if (mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]) { - toolbar_set.bottom_toolbar.button_display_mode = mToolbars[TOOLBAR_BOTTOM]->getButtonType(); - addToToolset(mToolbars[TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar); + toolbar_set.bottom_toolbar.button_display_mode = mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getButtonType(); + addToToolset(mToolbars[LLToolBarEnums::TOOLBAR_BOTTOM]->getCommandsList(), toolbar_set.bottom_toolbar); } // Serialize the parameter tree @@ -511,9 +517,9 @@ void LLToolBarView::onToolBarButtonRemoved(LLView* button) void LLToolBarView::draw() { - LLRect toolbar_rects[TOOLBAR_COUNT]; + LLRect toolbar_rects[LLToolBarEnums::TOOLBAR_COUNT]; - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { if (mToolbars[i]) { @@ -532,7 +538,7 @@ void LLToolBarView::draw() } } - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { mToolbars[i]->getParent()->setVisible(mShowToolbars && (mToolbars[i]->hasButtons() @@ -544,7 +550,7 @@ void LLToolBarView::draw() { LLColor4 drop_color = LLUIColorTable::instance().getColor( "ToolbarDropZoneColor" ); - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { gl_rect_2d(toolbar_rects[i], drop_color, TRUE); } @@ -620,7 +626,7 @@ BOOL LLToolBarView::handleDropTool( void* cargo_data, S32 x, S32 y, LLToolBar* t S32 old_toolbar_loc = gToolBarView->hasCommand(command_id); LLToolBar* old_toolbar = NULL; - if (old_toolbar_loc != TOOLBAR_NONE) + if (old_toolbar_loc != LLToolBarEnums::TOOLBAR_NONE) { llassert(gToolBarView->mDragToolbarButton); old_toolbar = gToolBarView->mDragToolbarButton->getParentByType<LLToolBar>(); @@ -683,7 +689,7 @@ bool LLToolBarView::isModified() const { bool modified = false; - for (S32 i = TOOLBAR_FIRST; i <= TOOLBAR_LAST; i++) + for (S32 i = LLToolBarEnums::TOOLBAR_FIRST; i <= LLToolBarEnums::TOOLBAR_LAST; i++) { modified |= mToolbars[i]->isModified(); } diff --git a/indra/newview/lltoolbarview.h b/indra/newview/lltoolbarview.h index dcc3862074..a230c2fdee 100755 --- a/indra/newview/lltoolbarview.h +++ b/indra/newview/lltoolbarview.h @@ -40,19 +40,6 @@ class LLUICtrlFactory; class LLToolBarView : public LLUICtrl { public: - typedef enum - { - TOOLBAR_NONE = 0, - TOOLBAR_LEFT, - TOOLBAR_RIGHT, - TOOLBAR_BOTTOM, - - TOOLBAR_COUNT, - - TOOLBAR_FIRST = TOOLBAR_LEFT, - TOOLBAR_LAST = TOOLBAR_BOTTOM, - } EToolBarLocation; - // Xui structure of the toolbar panel struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> {}; @@ -84,9 +71,9 @@ public: virtual void draw(); // Toolbar view interface with the rest of the world - // Checks if the commandId is being used somewhere in one of the toolbars, returns EToolBarLocation + // Checks if the commandId is being used somewhere in one of the toolbars, returns LLToolBarEnums::EToolBarLocation S32 hasCommand(const LLCommandId& commandId) const; - S32 addCommand(const LLCommandId& commandId, EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE); + S32 addCommand(const LLCommandId& commandId, LLToolBarEnums::EToolBarLocation toolbar, int rank = LLToolBar::RANK_NONE); S32 removeCommand(const LLCommandId& commandId, int& rank); // Sets the rank the removed command was at, RANK_NONE if not found S32 enableCommand(const LLCommandId& commandId, bool enabled); S32 stopCommandInProgress(const LLCommandId& commandId); @@ -109,7 +96,7 @@ public: static void resetDragTool(LLToolBarButton* toolbarButton); LLInventoryObject* getDragItem(); LLView* getBottomToolbar() { return mBottomToolbarPanel; } - LLToolBar* getToolbar(EToolBarLocation toolbar) { return mToolbars[toolbar]; } + LLToolBar* getToolbar(LLToolBarEnums::EToolBarLocation toolbar) { return mToolbars[toolbar]; } bool isModified() const; protected: @@ -127,7 +114,7 @@ private: static void onToolBarButtonRemoved(LLView* button); // Pointers to the toolbars handled by the toolbar view - LLToolBar* mToolbars[TOOLBAR_COUNT]; + LLToolBar* mToolbars[LLToolBarEnums::TOOLBAR_COUNT]; bool mToolbarsLoaded; bool mDragStarted; diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index 5270c3d33f..b75d6b3dcb 100755 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -61,7 +61,7 @@ extern LLControlGroup gSavedSettings; // we use this in various places instead of NULL -static LLTool* sNullTool = new LLTool(std::string("null"), NULL); +static LLPointer<LLTool> sNullTool(new LLTool(std::string("null"), NULL)); //----------------------------------------------------------------------- // LLToolComposite diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index ef7d0cd81b..1a137f7129 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -355,7 +355,7 @@ void LLToolDragAndDrop::setDragStart(S32 x, S32 y) BOOL LLToolDragAndDrop::isOverThreshold(S32 x,S32 y) { - static LLCachedControl<S32> drag_and_drop_threshold(gSavedSettings,"DragAndDropDistanceThreshold"); + static LLCachedControl<S32> drag_and_drop_threshold(gSavedSettings,"DragAndDropDistanceThreshold", 3); S32 mouse_delta_x = x - mDragStartX; S32 mouse_delta_y = y - mDragStartY; diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index cbd16e873d..73ceb783b5 100755 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -167,6 +167,7 @@ void LLTracker::render3D() } static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); + static LLUIColor map_track_color_under = LLUIColorTable::instance().getColor("MapTrackColorUnder", LLColor4::white); // Arbitary location beacon if( instance()->mIsTrackingLocation ) @@ -187,7 +188,7 @@ void LLTracker::render3D() } else { - renderBeacon( instance()->mTrackedPositionGlobal, map_track_color, + renderBeacon( instance()->mTrackedPositionGlobal, map_track_color, map_track_color_under, instance()->mBeaconText, instance()->mTrackedLocationName ); } } @@ -229,7 +230,7 @@ void LLTracker::render3D() // and back again instance()->mHasReachedLandmark = FALSE; } - renderBeacon( instance()->mTrackedPositionGlobal, map_track_color, + renderBeacon( instance()->mTrackedPositionGlobal, map_track_color, map_track_color_under, instance()->mBeaconText, instance()->mTrackedLandmarkName ); } } @@ -258,7 +259,7 @@ void LLTracker::render3D() } else { - renderBeacon( av_tracker.getGlobalPos(), map_track_color, + renderBeacon( av_tracker.getGlobalPos(), map_track_color, map_track_color_under, instance()->mBeaconText, av_tracker.getName() ); } } @@ -412,7 +413,7 @@ const std::string& LLTracker::getTrackedLocationName() return instance()->mTrackedLocationName; } -F32 pulse_func(F32 t, F32 z) +F32 pulse_func(F32 t, F32 z, bool tracking_avatar, std::string direction) { if (!LLTracker::sCheesyBeacon) { @@ -420,8 +421,15 @@ F32 pulse_func(F32 t, F32 z) } t *= F_PI; - z -= t*64.f - 256.f; - + if ("DOWN" == direction) + { + z += t*64.f - 256.f; + } + else + { + z -= t*64.f - 256.f; + } + F32 a = cosf(z*F_PI/512.f)*10.0f; a = llmax(a, 9.9f); a -= 9.9f; @@ -474,10 +482,78 @@ void draw_shockwave(F32 center_z, F32 t, S32 steps, LLColor4 color) gGL.end(); } +void LLTracker::drawBeacon(LLVector3 pos_agent, std::string direction, LLColor4 fogged_color, F32 dist) +{ + const U32 BEACON_VERTS = 256; + F32 step; + + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.pushMatrix(); + + if ("DOWN" == direction) + { + gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]); + draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color); + step = (5020.0f - pos_agent.mV[2]) / BEACON_VERTS; + } + else + { + gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], 0); + step = pos_agent.mV[2] / BEACON_VERTS; + } + + gGL.color4fv(fogged_color.mV); + + LLVector3 x_axis = LLViewerCamera::getInstance()->getLeftAxis(); + F32 t = gRenderStartTime.getElapsedTimeF32(); + + for (U32 i = 0; i < BEACON_VERTS; i++) + { + F32 x = x_axis.mV[0]; + F32 y = x_axis.mV[1]; + + F32 z = i * step; + F32 z_next = (i+1)*step; + + bool tracking_avatar = getTrackingStatus() == TRACKING_AVATAR; + F32 a = pulse_func(t, z, tracking_avatar, direction); + F32 an = pulse_func(t, z_next, tracking_avatar, direction); + + LLColor4 c_col = fogged_color + LLColor4(a,a,a,a); + LLColor4 col_next = fogged_color + LLColor4(an,an,an,an); + LLColor4 col_edge = fogged_color * LLColor4(a,a,a,0.0f); + LLColor4 col_edge_next = fogged_color * LLColor4(an,an,an,0.0f); + + a *= 2.f; + a += 1.0f; + + an *= 2.f; + an += 1.0f; + + gGL.begin(LLRender::TRIANGLE_STRIP); + gGL.color4fv(col_edge.mV); + gGL.vertex3f(-x*a, -y*a, z); + gGL.color4fv(col_edge_next.mV); + gGL.vertex3f(-x*an, -y*an, z_next); + + gGL.color4fv(c_col.mV); + gGL.vertex3f(0, 0, z); + gGL.color4fv(col_next.mV); + gGL.vertex3f(0, 0, z_next); + + gGL.color4fv(col_edge.mV); + gGL.vertex3f(x*a,y*a,z); + gGL.color4fv(col_edge_next.mV); + gGL.vertex3f(x*an,y*an,z_next); + gGL.end(); + } + gGL.popMatrix(); +} // static void LLTracker::renderBeacon(LLVector3d pos_global, - const LLColor4& color, + const LLColor4& color, + const LLColor4& color_under, LLHUDText* hud_textp, const std::string& label ) { @@ -497,9 +573,11 @@ void LLTracker::renderBeacon(LLVector3d pos_global, } LLColor4 fogged_color = color_frac * color + (1 - color_frac)*gSky.getFogColor(); + LLColor4 fogged_color_under = color_frac * color_under + (1 - color_frac) * gSky.getFogColor(); F32 FADE_DIST = 3.f; fogged_color.mV[3] = llmax(0.2f, llmin(0.5f,(dist-FADE_DIST)/FADE_DIST)); + fogged_color_under.mV[3] = llmax(0.2f, llmin(0.5f,(dist-FADE_DIST)/FADE_DIST)); LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(pos_global); @@ -508,64 +586,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global, LLGLDisable cull_face(GL_CULL_FACE); LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - - gGL.matrixMode(LLRender::MM_MODELVIEW); - gGL.pushMatrix(); - { - gGL.translatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]); - - draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color); - - gGL.color4fv(fogged_color.mV); - const U32 BEACON_VERTS = 256; - const F32 step = 1024.0f/BEACON_VERTS; - - LLVector3 x_axis = LLViewerCamera::getInstance()->getLeftAxis(); - F32 t = gRenderStartTime.getElapsedTimeF32(); - F32 dr = dist/LLViewerCamera::getInstance()->getFar(); - - for (U32 i = 0; i < BEACON_VERTS; i++) - { - F32 x = x_axis.mV[0]; - F32 y = x_axis.mV[1]; - - F32 z = i * step; - F32 z_next = (i+1)*step; - - F32 a = pulse_func(t, z); - F32 an = pulse_func(t, z_next); - - LLColor4 c_col = fogged_color + LLColor4(a,a,a,a); - LLColor4 col_next = fogged_color + LLColor4(an,an,an,an); - LLColor4 col_edge = fogged_color * LLColor4(a,a,a,0.0f); - LLColor4 col_edge_next = fogged_color * LLColor4(an,an,an,0.0f); - - a *= 2.f; - a += 1.0f+dr; - - an *= 2.f; - an += 1.0f+dr; - - gGL.begin(LLRender::TRIANGLE_STRIP); - gGL.color4fv(col_edge.mV); - gGL.vertex3f(-x*a, -y*a, z); - gGL.color4fv(col_edge_next.mV); - gGL.vertex3f(-x*an, -y*an, z_next); - - gGL.color4fv(c_col.mV); - gGL.vertex3f(0, 0, z); - gGL.color4fv(col_next.mV); - gGL.vertex3f(0, 0, z_next); - - gGL.color4fv(col_edge.mV); - gGL.vertex3f(x*a,y*a,z); - gGL.color4fv(col_edge_next.mV); - gGL.vertex3f(x*an,y*an,z_next); - - gGL.end(); - } - } - gGL.popMatrix(); + LLTracker::drawBeacon(pos_agent, "DOWN", fogged_color, dist); + LLTracker::drawBeacon(pos_agent, "UP", fogged_color_under, dist); std::string text; text = llformat( "%.0f m", to_vec.magVec()); diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h index 8e916af315..d8d5803787 100755 --- a/indra/newview/lltracker.h +++ b/indra/newview/lltracker.h @@ -108,8 +108,10 @@ protected: LLTracker(); ~LLTracker(); + static void drawBeacon(LLVector3 pos_agent, std::string direction, LLColor4 fogged_color, F32 dist); static void renderBeacon( LLVector3d pos_global, const LLColor4& color, + const LLColor4& color_under, LLHUDText* hud_textp, const std::string& label ); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 00b15a5f26..0c34db39b5 100755 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -307,7 +307,7 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& slurl) } // static -bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) +bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl, bool trusted_content) { // *NOTE: Text editors are considered sources of trusted URLs // in order to make avatar profile links in chat history work. @@ -315,9 +315,9 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl) // receiving resident will see it and must affirmatively // click on it. // *TODO: Make this trust model more refined. JC - const bool trusted_browser = true; + LLMediaCtrl* web = NULL; - return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_browser); + return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), "clicked", web, trusted_content); } diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h index 6309a97af5..9b05260af1 100755 --- a/indra/newview/llurldispatcher.h +++ b/indra/newview/llurldispatcher.h @@ -53,7 +53,7 @@ public: static bool dispatchRightClick(const std::string& slurl); - static bool dispatchFromTextEditor(const std::string& slurl); + static bool dispatchFromTextEditor(const std::string& slurl, bool trusted_content); }; #endif diff --git a/indra/newview/llurldispatcherlistener.cpp b/indra/newview/llurldispatcherlistener.cpp index c7b9afafef..7545f3a9b3 100755 --- a/indra/newview/llurldispatcherlistener.cpp +++ b/indra/newview/llurldispatcherlistener.cpp @@ -71,5 +71,5 @@ void LLURLDispatcherListener::dispatchRightClick(const LLSD& params) const void LLURLDispatcherListener::dispatchFromTextEditor(const LLSD& params) const { - LLURLDispatcher::dispatchFromTextEditor(params["url"]); + LLURLDispatcher::dispatchFromTextEditor(params["url"], false); } diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index dd17068be5..a80b9da13c 100755 --- a/indra/newview/llurlhistory.cpp +++ b/indra/newview/llurlhistory.cpp @@ -103,22 +103,29 @@ LLSD LLURLHistory::getURLHistory(const std::string& collection) // static void LLURLHistory::addURL(const std::string& collection, const std::string& url) { - if(! url.empty()) + if(!url.empty()) { - sHistorySD[collection].insert(0, url); + LLURI u(url); + std::string simplified_url = u.scheme() + "://" + u.authority() + u.path(); + sHistorySD[collection].insert(0, simplified_url); LLURLHistory::limitSize(collection); } } // static void LLURLHistory::removeURL(const std::string& collection, const std::string& url) { - for(int index = 0; index < sHistorySD[collection].size(); index++) + if(!url.empty()) { - if(sHistorySD[collection].get(index).asString() == url) - { - sHistorySD[collection].erase(index); - } - } + LLURI u(url); + std::string simplified_url = u.scheme() + "://" + u.authority() + u.path(); + for(int index = 0; index < sHistorySD[collection].size(); index++) + { + if(sHistorySD[collection].get(index).asString() == simplified_url) + { + sHistorySD[collection].erase(index); + } + } + } } // static diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 3da934b148..826d296117 100755 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -368,6 +368,7 @@ void init_audio() gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndTyping"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowClose"))); gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndWindowOpen"))); + gAudiop->preloadSound(LLUUID(gSavedSettings.getString("UISndRestart"))); } audio_update_volume(true); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c6b28b9e5e..a8eeddb798 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -95,6 +95,7 @@ #include "llfloaterproperties.h" #include "llfloaterregiondebugconsole.h" #include "llfloaterregioninfo.h" +#include "llfloaterregionrestarting.h" #include "llfloaterreporter.h" #include "llfloaterscriptdebug.h" #include "llfloaterscriptlimits.h" @@ -103,6 +104,7 @@ #include "llfloatersettingsdebug.h" #include "llfloatersidepanelcontainer.h" #include "llfloatersnapshot.h" +#include "llfloatersocial.h" #include "llfloatersounddevices.h" #include "llfloaterspellchecksettings.h" #include "llfloatertelehub.h" @@ -295,6 +297,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>); LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>); LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>); + LLFloaterReg::add("region_restarting", "floater_region_restarting.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionRestarting>); LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>); LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); @@ -303,6 +306,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater); LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>); LLFloaterReg::add("sound_devices", "floater_sound_devices.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundDevices>); + LLFloaterReg::add("social", "floater_social.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSocial>); LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>); LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>); @@ -311,7 +315,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("my_profile", "floater_my_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create); LLFloaterReg::add("profile", "floater_web_profile.xml", (LLFloaterBuildFunc)&LLFloaterWebProfile::create); LLFloaterReg::add("how_to", "floater_how_to.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); - + LLFloaterReg::add("fbc_web", "floater_fbc_web.xml", (LLFloaterBuildFunc)&LLFloaterWebContent::create); LLFloaterUIPreviewUtil::registerFloater(); LLFloaterReg::add("upload_anim_bvh", "floater_animation_bvh_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBvhPreview>, "upload"); diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index f6e840adcd..aeeb591d55 100755 --- a/indra/newview/llviewerjoystick.cpp +++ b/indra/newview/llviewerjoystick.cpp @@ -919,7 +919,7 @@ void LLViewerJoystick::moveFlycam(bool reset) { if (i == X_I || i == Y_I || i == Z_I) { - static LLCachedControl<F32> build_mode_scale(gSavedSettings,"FlycamBuildModeScale"); + static LLCachedControl<F32> build_mode_scale(gSavedSettings,"FlycamBuildModeScale", 1.0); cur_delta[i] *= build_mode_scale; } } diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 2fbb3bf868..aa9de076b8 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -687,7 +687,10 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL { // it is sufficient to set this value once per call to handlekey // without clearing it, as it is only used in the subsequent call to scanKey - mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask); + mKeyHandledByUI[translated_key] = gViewerWindow->handleKey(translated_key, translated_mask); + // mKeyHandledByUI is not what you think ... this indicates whether the UI has handled this keypress yet (any keypress) + // NOT whether some UI shortcut wishes to handle the keypress + } return mKeyHandledByUI[translated_key]; } diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 2df028de69..21fb8d519b 100755 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2000,7 +2000,12 @@ void LLViewerMediaImpl::loadURI() "<>#%" ";/?:@&=", false); - llinfos << "Asking media source to load URI: " << uri << llendl; + { + // Do not log the query parts + LLURI u(uri); + std::string sanitized_uri = (u.query().empty() ? uri : u.scheme() + "://" + u.authority() + u.path()); + llinfos << "Asking media source to load URI: " << sanitized_uri << llendl; + } mMediaSource->loadURI( uri ); @@ -2567,7 +2572,12 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED) { // Helpful to have media urls in log file. Shouldn't be spammy. - llinfos << "NOT LOADING media id= " << mTextureId << " url=" << url << " mime_type=" << mime_type << llendl; + { + // Do not log the query parts + LLURI u(url); + std::string sanitized_url = (u.query().empty() ? url : u.scheme() + "://" + u.authority() + u.path()); + llinfos << "NOT LOADING media id= " << mTextureId << " url=" << sanitized_url << ", mime_type=" << mime_type << llendl; + } // This impl should not be loaded at this time. LL_DEBUGS("PluginPriority") << this << "Not loading (PRIORITY_UNLOADED)" << LL_ENDL; @@ -2582,7 +2592,12 @@ void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mi void LLViewerMediaImpl::navigateInternal() { // Helpful to have media urls in log file. Shouldn't be spammy. - llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl; + { + // Do not log the query parts + LLURI u(mMediaURL); + std::string sanitized_url = (u.query().empty() ? mMediaURL : u.scheme() + "://" + u.authority() + u.path()); + llinfos << "media id= " << mTextureId << " url=" << sanitized_url << ", mime_type=" << mMimeType << llendl; + } if(mNavigateSuspended) { @@ -3758,18 +3773,18 @@ bool LLViewerMediaImpl::shouldShowBasedOnClass() const // If it is attached to an avatar and the pref is off, we shouldn't show it if (attached_to_another_avatar) { - static LLCachedControl<bool> show_media_on_others(gSavedSettings, LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING); + static LLCachedControl<bool> show_media_on_others(gSavedSettings, LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING, false); return show_media_on_others; } if (inside_parcel) { - static LLCachedControl<bool> show_media_within_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING); + static LLCachedControl<bool> show_media_within_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING, true); return show_media_within_parcel; } else { - static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING); + static LLCachedControl<bool> show_media_outside_parcel(gSavedSettings, LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING, true); return show_media_outside_parcel; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 9468a2d542..c7c8da27f3 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -40,11 +40,13 @@ #include "llinventorypanel.h" #include "llnotifications.h" #include "llnotificationsutil.h" +#include "llviewereventrecorder.h" // newview includes #include "llagent.h" #include "llagentaccess.h" #include "llagentcamera.h" +#include "llagentui.h" #include "llagentwearables.h" #include "llagentpilot.h" #include "llcompilequeue.h" @@ -52,6 +54,7 @@ #include "lldaycyclemanager.h" #include "lldebugview.h" #include "llenvmanager.h" +#include "llfacebookconnect.h" #include "llfilepicker.h" #include "llfirstuse.h" #include "llfloaterbuy.h" @@ -1022,6 +1025,10 @@ U32 info_display_from_string(std::string info_display) { return LLPipeline::RENDER_DEBUG_AVATAR_VOLUME; } + else if ("joints" == info_display) + { + return LLPipeline::RENDER_DEBUG_AVATAR_JOINTS; + } else if ("raycast" == info_display) { return LLPipeline::RENDER_DEBUG_RAYCAST; @@ -1952,6 +1959,43 @@ class LLAdvancedDropPacket : public view_listener_t }; +//////////////////// +// EVENT Recorder // +/////////////////// + + +class LLAdvancedViewerEventRecorder : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + std::string command = userdata.asString(); + if ("start playback" == command) + { + llinfos << "Event Playback starting" << llendl; + LLViewerEventRecorder::instance().playbackRecording(); + llinfos << "Event Playback completed" << llendl; + } + else if ("stop playback" == command) + { + // Future + } + else if ("start recording" == command) + { + LLViewerEventRecorder::instance().setEventLoggingOn(); + llinfos << "Event recording started" << llendl; + } + else if ("stop recording" == command) + { + LLViewerEventRecorder::instance().setEventLoggingOff(); + llinfos << "Event recording stopped" << llendl; + } + + return true; + } +}; + + + ///////////////// // AGENT PILOT // @@ -7153,6 +7197,17 @@ class LLAdvancedClickRenderProfile: public view_listener_t } }; +void gpu_benchmark(); + +class LLAdvancedClickRenderBenchmark: public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + gpu_benchmark(); + return true; + } +}; + void menu_toggle_attached_lights(void* user_data) { LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); @@ -7762,6 +7817,22 @@ void handle_show_url(const LLSD& param) } +void handle_report_bug(const LLSD& param) +{ + LLUIString url(param.asString()); + + LLStringUtil::format_map_t replace; + replace["[ENVIRONMENT]"] = LLURI::escape(LLAppViewer::instance()->getViewerInfoString()); + LLSLURL location_url; + LLAgentUI::buildSLURL(location_url); + replace["[LOCATION]"] = location_url.getSLURLString(); + + LLUIString file_bug_url = gSavedSettings.getString("ReportBugURL"); + file_bug_url.setArgs(replace); + + LLWeb::loadURLExternal(file_bug_url.getString()); +} + void handle_buy_currency_test(void*) { std::string url = @@ -8420,6 +8491,8 @@ void initialize_menus() // Don't prepend MenuName.Foo because these can be used in any menu. enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service)); + enable.add("displayViewerEventRecorderMenuItems",boost::bind(&LLViewerEventRecorder::displayViewerEventRecorderMenuItems,&LLViewerEventRecorder::instance())); + view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts"); enable.add("Conversation.IsConversationLoggingAllowed", boost::bind(&LLFloaterIMContainer::isConversationLoggingAllowed)); @@ -8591,6 +8664,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedCheckRenderShadowOption(), "Advanced.CheckRenderShadowOption"); view_listener_t::addMenu(new LLAdvancedClickRenderShadowOption(), "Advanced.ClickRenderShadowOption"); view_listener_t::addMenu(new LLAdvancedClickRenderProfile(), "Advanced.ClickRenderProfile"); + view_listener_t::addMenu(new LLAdvancedClickRenderBenchmark(), "Advanced.ClickRenderBenchmark"); #ifdef TOGGLE_HACKED_GODLIKE_VIEWER view_listener_t::addMenu(new LLAdvancedHandleToggleHackedGodmode(), "Advanced.HandleToggleHackedGodmode"); @@ -8606,6 +8680,7 @@ void initialize_menus() commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser commit.add("Advanced.WebContentTest", boost::bind(&handle_web_content_test, _2)); // this one opens the Web Content floater commit.add("Advanced.ShowURL", boost::bind(&handle_show_url, _2)); + commit.add("Advanced.ReportBug", boost::bind(&handle_report_bug, _2)); view_listener_t::addMenu(new LLAdvancedBuyCurrencyTest(), "Advanced.BuyCurrencyTest"); view_listener_t::addMenu(new LLAdvancedDumpSelectMgr(), "Advanced.DumpSelectMgr"); view_listener_t::addMenu(new LLAdvancedDumpInventory(), "Advanced.DumpInventory"); @@ -8678,6 +8753,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedAgentPilot(), "Advanced.AgentPilot"); view_listener_t::addMenu(new LLAdvancedToggleAgentPilotLoop(), "Advanced.ToggleAgentPilotLoop"); view_listener_t::addMenu(new LLAdvancedCheckAgentPilotLoop(), "Advanced.CheckAgentPilotLoop"); + view_listener_t::addMenu(new LLAdvancedViewerEventRecorder(), "Advanced.EventRecorder"); // Advanced > Debugging view_listener_t::addMenu(new LLAdvancedForceErrorBreakpoint(), "Advanced.ForceErrorBreakpoint"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index c38af1f990..df5c7d5c2e 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -45,6 +45,7 @@ #include "llsd.h" #include "llsdserialize.h" #include "llteleportflags.h" +#include "lltoastnotifypanel.h" #include "lltransactionflags.h" #include "llvfile.h" #include "llvfs.h" @@ -110,6 +111,7 @@ #include "llpanelblockedlist.h" #include "llpanelplaceprofile.h" #include "llviewerregion.h" +#include "llfloaterregionrestarting.h" #include <boost/algorithm/string/split.hpp> // #include <boost/regex.hpp> @@ -2220,7 +2222,7 @@ static std::string clean_name_from_im(const std::string& name, EInstantMessage t case IM_LURE_ACCEPTED: case IM_LURE_DECLINED: case IM_GODLIKE_LURE_USER: - case IM_YET_TO_BE_USED: + case IM_TELEPORT_REQUEST: case IM_GROUP_ELECTION_DEPRECATED: //IM_GOTO_URL //IM_FROM_TASK_AS_ALERT @@ -2407,14 +2409,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) && from_id.notNull() //not a system message && to_id.notNull()) //not global message { - // return a standard "do not disturb" message, but only do it to online IM + // return a standard "do not disturb" message, but only do it to online IM // (i.e. not other auto responses and not store-and-forward IM) - if (!gIMMgr->hasSession(session_id)) - { - // if there is not a panel for this conversation (i.e. it is a new IM conversation - // initiated by the other party) then... - send_do_not_disturb_message(msg, from_id, session_id); - } + + send_do_not_disturb_message(msg, from_id, session_id); // now store incoming IM in chat history @@ -2988,6 +2986,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) break; case IM_LURE_USER: + case IM_TELEPORT_REQUEST: { if (is_muted) { @@ -3010,7 +3009,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) bool canUserAccessDstRegion = true; bool doesUserRequireMaturityIncrease = false; - if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) + // Do not parse the (empty) lure bucket for TELEPORT_REQUEST + if (IM_TELEPORT_REQUEST != dialog && parse_lure_bucket(region_info, region_handle, pos, look_at, region_access)) { region_access_str = LLViewerRegion::accessToString(region_access); region_access_icn = LLViewerRegion::getAccessIcon(region_access); @@ -3082,12 +3082,22 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else { - LLNotification::Params params("TeleportOffered"); + LLNotification::Params params; + if (IM_LURE_USER == dialog) + { + params.name = "TeleportOffered"; + params.functor.name = "TeleportOffered"; + } + else if (IM_TELEPORT_REQUEST == dialog) + { + params.name = "TeleportRequest"; + params.functor.name = "TeleportRequest"; + } + params.substitutions = args; params.payload = payload; LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false); } - } } break; @@ -3216,7 +3226,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) payload["online"] = (offline == IM_ONLINE); payload["sender"] = msg->getSender().getIPandPort(); - if (is_muted) + bool add_notification = true; + for (LLToastNotifyPanel::instance_iter ti(LLToastNotifyPanel::beginInstances()) + , tend(LLToastNotifyPanel::endInstances()); ti != tend; ++ti) + { + LLToastNotifyPanel& panel = *ti; + const std::string& notification_name = panel.getNotificationName(); + if (notification_name == "OfferFriendship" && panel.isControlPanelEnabled()) + { + add_notification = false; + break; + } + } + + if (is_muted && add_notification) { LLNotifications::instance().forceResponse(LLNotification::Params("OfferFriendship").payload(payload), 1); } @@ -3227,6 +3250,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) send_do_not_disturb_message(msg, from_id); } args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString(); + + if (add_notification) + { if(message.empty()) { //support for frienship offers from clients before July 2008 @@ -3242,6 +3268,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } } } + } break; case IM_FRIENDSHIP_ACCEPTED: @@ -3804,19 +3831,6 @@ public: LLInventoryModel::EXCLUDE_TRASH, is_card); } - LLSD args; - if ( land_items.count() > 0 ) - { // Show notification that they can now teleport to landmarks. Use a random landmark from the inventory - S32 random_land = ll_rand( land_items.count() - 1 ); - args["NAME"] = land_items[random_land]->getName(); - LLNotificationsUtil::add("TeleportToLandmark",args); - } - if ( card_items.count() > 0 ) - { // Show notification that they can now contact people. Use a random calling card from the inventory - S32 random_card = ll_rand( card_items.count() - 1 ); - args["NAME"] = card_items[random_card]->getName(); - LLNotificationsUtil::add("TeleportToPerson",args); - } gInventory.removeObserver(this); delete this; @@ -4093,18 +4107,6 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) if (isAgentAvatarValid()) { - // Chat the "back" SLURL. (DEV-4907) - - LLSLURL slurl; - gAgent.getTeleportSourceSLURL(slurl); - LLSD substitution = LLSD().with("[T_SLURL]", slurl.getSLURLString()); - std::string completed_from = LLAgent::sTeleportProgressMessages["completed_from"]; - LLStringUtil::format(completed_from, substitution); - - LLSD args; - args["MESSAGE"] = completed_from; - LLNotificationsUtil::add("SystemMessageTip", args); - // Set the new position gAgentAvatarp->setPositionAgent(agent_pos); gAgentAvatarp->clearChat(); @@ -5736,7 +5738,6 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock) std::string regionMaturity = LLViewerRegion::accessToString(regionAccess); LLStringUtil::toLower(regionMaturity); llsdBlock["REGIONMATURITY"] = regionMaturity; - bool returnValue = false; LLNotificationPtr maturityLevelNotification; std::string notifySuffix = "_Notify"; @@ -5906,6 +5907,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) (notificationID == "RegionEntryAccessBlocked") || (notificationID == "LandClaimAccessBlocked") || (notificationID == "LandBuyAccessBlocked") + ) { /*--------------------------------------------------------------------- @@ -5947,7 +5949,41 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) snap_filename += SCREEN_HOME_FILENAME; gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE); } - + + if (notificationID == "RegionRestartMinutes" || + notificationID == "RegionRestartSeconds") + { + S32 seconds; + if (notificationID == "RegionRestartMinutes") + { + seconds = 60 * static_cast<S32>(llsdBlock["MINUTES"].asInteger()); + } + else + { + seconds = static_cast<S32>(llsdBlock["SECONDS"].asInteger()); + } + + LLFloaterRegionRestarting* floaterp = LLFloaterReg::findTypedInstance<LLFloaterRegionRestarting>("region_restarting"); + + if (floaterp) + { + LLFloaterRegionRestarting::updateTime(seconds); + } + else + { + LLSD params; + params["NAME"] = llsdBlock["NAME"]; + params["SECONDS"] = (LLSD::Integer)seconds; + LLFloaterRegionRestarting* restarting_floater = dynamic_cast<LLFloaterRegionRestarting*>(LLFloaterReg::showInstance("region_restarting", params)); + if(restarting_floater) + { + restarting_floater->center(); + } + } + + send_sound_trigger(LLUUID(gSavedSettings.getString("UISndRestart")), 1.0f); + } + LLNotificationsUtil::add(notificationID, llsdBlock); return true; } @@ -6007,7 +6043,6 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data) std::string message; msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, message); - process_special_alert_messages(message); if (!attempt_standard_notification(msgsystem)) @@ -6031,7 +6066,6 @@ bool handle_not_age_verified_alert(const std::string &pAlertName) bool handle_special_alerts(const std::string &pAlertName) { bool isHandled = false; - if (LLStringUtil::compareStrings(pAlertName, "NotAgeVerified") == 0) { @@ -6067,26 +6101,17 @@ void process_alert_core(const std::string& message, BOOL modal) // System message is important, show in upper-right box not tip std::string text(message.substr(1)); LLSD args; - if (text.substr(0,17) == "RESTART_X_MINUTES") - { - S32 mins = 0; - LLStringUtil::convertToS32(text.substr(18), mins); - args["MINUTES"] = llformat("%d",mins); - LLNotificationsUtil::add("RegionRestartMinutes", args); - } - else if (text.substr(0,17) == "RESTART_X_SECONDS") - { - S32 secs = 0; - LLStringUtil::convertToS32(text.substr(18), secs); - args["SECONDS"] = llformat("%d",secs); - LLNotificationsUtil::add("RegionRestartSeconds", args); - } - else + + // *NOTE: If the text from the server ever changes this line will need to be adjusted. + std::string restart_cancelled = "Region restart cancelled."; + if (text.substr(0, restart_cancelled.length()) == restart_cancelled) { - std::string new_msg =LLNotifications::instance().getGlobalString(text); - args["MESSAGE"] = new_msg; - LLNotificationsUtil::add("SystemMessage", args); + LLFloaterRegionRestarting::close(); } + + std::string new_msg =LLNotifications::instance().getGlobalString(text); + args["MESSAGE"] = new_msg; + LLNotificationsUtil::add("SystemMessage", args); } else if (modal) { @@ -6873,6 +6898,51 @@ void send_group_notice(const LLUUID& group_id, bin_bucket_size); } +void send_lures(const LLSD& notification, const LLSD& response) +{ + std::string text = response["message"].asString(); + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + text.append("\r\n").append(slurl.getSLURLString()); + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_StartLure); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); + msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); + msg->nextBlockFast(_PREHASH_Info); + msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. + msg->addStringFast(_PREHASH_Message, text); + for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); + it != notification["payload"]["ids"].endArray(); + ++it) + { + LLUUID target_id = it->asUUID(); + + msg->nextBlockFast(_PREHASH_TargetData); + msg->addUUIDFast(_PREHASH_TargetID, target_id); + + // Record the offer. + { + std::string target_name; + gCacheName->getFullName(target_id, target_name); // for im log filenames + LLSD args; + args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();; + + LLSD payload; + + //*TODO please rewrite all keys to the same case, lower or upper + payload["from_id"] = target_id; + payload["SUPPRESS_TOAST"] = true; + LLNotificationsUtil::add("TeleportOfferSent", args, payload); + + // Add the recepient to the recent people list. + LLRecentPeople::instance().add(target_id); + } + } + gAgent.sendReliableMessage(); +} + bool handle_lure_callback(const LLSD& notification, const LLSD& response) { static const unsigned OFFER_RECIPIENT_LIMIT = 250; @@ -6886,50 +6956,12 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response) LLNotificationsUtil::add("TooManyTeleportOffers", args); return false; } - - std::string text = response["message"].asString(); - LLSLURL slurl; - LLAgentUI::buildSLURL(slurl); - text.append("\r\n").append(slurl.getSLURLString()); + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); if(0 == option) { - LLMessageSystem* msg = gMessageSystem; - msg->newMessageFast(_PREHASH_StartLure); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_Info); - msg->addU8Fast(_PREHASH_LureType, (U8)0); // sim will fill this in. - msg->addStringFast(_PREHASH_Message, text); - for(LLSD::array_const_iterator it = notification["payload"]["ids"].beginArray(); - it != notification["payload"]["ids"].endArray(); - ++it) - { - LLUUID target_id = it->asUUID(); - - msg->nextBlockFast(_PREHASH_TargetData); - msg->addUUIDFast(_PREHASH_TargetID, target_id); - - // Record the offer. - { - std::string target_name; - gCacheName->getFullName(target_id, target_name); // for im log filenames - LLSD args; - args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();; - - LLSD payload; - - //*TODO please rewrite all keys to the same case, lower or upper - payload["from_id"] = target_id; - LLNotificationsUtil::add("TeleportOfferSent", args, payload); - - // Add the recepient to the recent people list. - LLRecentPeople::instance().add(target_id); - } - } - gAgent.sendReliableMessage(); + send_lures(notification, response); } return false; @@ -6969,6 +7001,58 @@ void handle_lure(const uuid_vec_t& ids) } } +bool teleport_request_callback(const LLSD& notification, const LLSD& response) +{ + LLUUID from_id = notification["payload"]["from_id"].asUUID(); + if(from_id.isNull()) + { + llwarns << "from_id is NULL" << llendl; + return false; + } + + std::string from_name; + gCacheName->getFullName(from_id, from_name); + + if(LLMuteList::getInstance()->isMuted(from_id) && !LLMuteList::getInstance()->isLinden(from_name)) + { + return false; + } + + S32 option = 0; + if (response.isInteger()) + { + option = response.asInteger(); + } + else + { + option = LLNotificationsUtil::getSelectedOption(notification, response); + } + + switch(option) + { + // Yes + case 0: + { + LLSD dummy_notification; + dummy_notification["payload"]["ids"][0] = from_id; + + LLSD dummy_response; + dummy_response["message"] = response["message"]; + + send_lures(dummy_notification, dummy_response); + } + break; + + // No + case 1: + default: + break; + } + + return false; +} + +static LLNotificationFunctorRegistration teleport_request_callback_reg("TeleportRequest", teleport_request_callback); void send_improved_im(const LLUUID& to_id, const std::string& name, diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 7151a0d6ed..e62998db70 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -236,7 +236,6 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mOnMap(FALSE), mStatic(FALSE), mNumFaces(0), - mTimeDilation(1.f), mRotTime(0.f), mAngularVelocityRot(), mPreviousRotation(), @@ -943,7 +942,6 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, U16 time_dilation16; mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16); F32 time_dilation = ((F32) time_dilation16) / 65535.f; - mTimeDilation = time_dilation; mRegionp->setTimeDilation(time_dilation); // this will be used to determine if we've really changed position @@ -1986,7 +1984,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); if (cdp) { - F32 ping_delay = 0.5f * mTimeDilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); + F32 ping_delay = 0.5f * time_dilation * ( ((F32)cdp->getPingDelay()) * 0.001f + gFrameDTClamped); LLVector3 diff = getVelocity() * ping_delay; new_pos_parent += diff; } @@ -2185,35 +2183,33 @@ BOOL LLViewerObject::isActive() const -void LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLViewerObject::idleUpdate(LLAgent &agent, const F64 &time) { //static LLFastTimer::DeclareTimer ftm("Viewer Object"); //LLFastTimer t(ftm); if (!mDead) { - // CRO - don't velocity interp linked objects! - // Leviathan - but DO velocity interp joints - if (!mStatic && sVelocityInterpolate && !isSelected()) - { - // calculate dt from last update - F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); - F32 dt = mTimeDilation * dt_raw; + if (!mStatic && sVelocityInterpolate && !isSelected()) + { + // calculate dt from last update + F32 time_dilation = mRegionp ? mRegionp->getTimeDilation() : 1.0f; + F32 dt = time_dilation * (F32)(time - mLastInterpUpdateSecs); applyAngularVelocity(dt); if (isAttachment()) - { - mLastInterpUpdateSecs = time; + { + mLastInterpUpdateSecs = time; return; + } + else + { // Move object based on it's velocity and rotation + interpolateLinearMotion(time, dt); + } } - else - { // Move object based on it's velocity and rotation - interpolateLinearMotion(time, dt); - } - } - updateDrawable(FALSE); + updateDrawable(FALSE); } } @@ -4063,7 +4059,7 @@ void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry) { LLPrimitive::setTE(te, texture_entry); - const LLUUID& image_id = getTE(te)->getID(); + const LLUUID& image_id = getTE(te)->getID(); mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); if (getTE(te)->getMaterialParams().notNull()) @@ -5879,6 +5875,13 @@ void LLViewerObject::resetChildrenPosition(const LLVector3& offset, BOOL simplif return ; } +// virtual +BOOL LLViewerObject::isTempAttachment() const +{ + return (mID.notNull() && (mID == mAttachmentItemID)); +} + + const LLUUID &LLViewerObject::getAttachmentItemID() const { return mAttachmentItemID; diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index b035473c74..c34d4493d5 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -143,7 +143,7 @@ public: LLNameValue* getNVPair(const std::string& name) const; // null if no name value pair by that name // Object create and update functions - virtual void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + virtual void idleUpdate(LLAgent &agent, const F64 &time); // Types of media we can associate enum { MEDIA_NONE = 0, MEDIA_SET = 1 }; @@ -171,6 +171,8 @@ public: virtual BOOL isAttachment() const { return FALSE; } virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment virtual BOOL isHUDAttachment() const { return FALSE; } + virtual BOOL isTempAttachment() const; + virtual void updateRadius() {}; virtual F32 getVObjRadius() const; // default implemenation is mDrawable->getRadius() @@ -303,7 +305,7 @@ public: /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid); /*virtual*/ S32 setTENormalMap(const U8 te, const LLUUID &uuid); /*virtual*/ S32 setTESpecularMap(const U8 te, const LLUUID &uuid); - S32 setTETextureCore(const U8 te, LLViewerTexture *image); + S32 setTETextureCore(const U8 te, LLViewerTexture *image); S32 setTENormalMapCore(const U8 te, LLViewerTexture *image); S32 setTESpecularMapCore(const U8 te, LLViewerTexture *image); /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color); @@ -741,7 +743,6 @@ protected: BOOL mStatic; // Object doesn't move. S32 mNumFaces; - F32 mTimeDilation; // Time dilation sent with the object. F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega) LLQuaternion mAngularVelocityRot; // accumulated rotation from the angular velocity computations LLQuaternion mPreviousRotation; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 66615657d8..f667c2bf33 100755 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -399,10 +399,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type != OUT_TERSE_IMPROVED) // OUT_FULL_COMPRESSED only? { - compressed_dp.unpackUUID(fullid, "ID"); - compressed_dp.unpackU32(local_id, "LocalID"); - compressed_dp.unpackU8(pcode, "PCode"); - } + compressed_dp.unpackUUID(fullid, "ID"); + compressed_dp.unpackU32(local_id, "LocalID"); + compressed_dp.unpackU8(pcode, "PCode"); + } else { compressed_dp.unpackU32(local_id, "LocalID"); @@ -561,7 +561,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated); } recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size); - objectp->setLastUpdateType(update_type); + objectp->setLastUpdateType(update_type); objectp->setLastUpdateCached(bCached); } @@ -852,7 +852,7 @@ private: LLSD mObjectIDs; }; -void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) +void LLViewerObjectList::update(LLAgent &agent) { // Update globals LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") ); @@ -942,7 +942,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) objectp = *iter; if (objectp->isAvatar()) { - objectp->idleUpdate(agent, world, frame_time); + objectp->idleUpdate(agent, frame_time); } } } @@ -953,16 +953,18 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) { objectp = *idle_iter; llassert(objectp->isActive()); - objectp->idleUpdate(agent, world, frame_time); - - } + objectp->idleUpdate(agent, frame_time); + } //update flexible objects LLVolumeImplFlexible::updateClass(); //update animated textures - LLViewerTextureAnim::updateClass(); - } + if (gAnimateTextures) + { + LLViewerTextureAnim::updateClass(); + } + } diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index 6518c25d09..98b50fa789 100755 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -83,7 +83,7 @@ public: void processCompressedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type); void processCachedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type); void updateApparentAngles(LLAgent &agent); - void update(LLAgent &agent, LLWorld &world); + void update(LLAgent &agent); void fetchObjectCosts(); void fetchPhysicsFlags(); diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 4cdb568d17..e361fad9de 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -1580,7 +1580,8 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use // Let interesting parties know about agent parcel change. LLViewerParcelMgr* instance = LLViewerParcelMgr::getInstance(); - instance->mAgentParcelChangedSignal(); + // Notify anything that wants to know when the agent changes parcels + gAgent.changeParcels(); if (instance->mTeleportInProgress) { @@ -2458,10 +2459,6 @@ LLViewerTexture* LLViewerParcelMgr::getPassImage() const return sPassImage; } -boost::signals2::connection LLViewerParcelMgr::addAgentParcelChangedCallback(parcel_changed_callback_t cb) -{ - return mAgentParcelChangedSignal.connect(cb); -} /* * Set finish teleport callback. You can use it to observe all teleport events. * NOTE: @@ -2475,7 +2472,7 @@ boost::signals2::connection LLViewerParcelMgr::setTeleportFinishedCallback(telep return mTeleportFinishedSignal.connect(cb); } -boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(parcel_changed_callback_t cb) +boost::signals2::connection LLViewerParcelMgr::setTeleportFailedCallback(teleport_failed_callback_t cb) { return mTeleportFailedSignal.connect(cb); } diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 6183b7e90e..9da49bb3f3 100755 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -80,8 +80,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr> public: typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t; typedef boost::signals2::signal<void (const LLVector3d&, const bool&)> teleport_finished_signal_t; - typedef boost::function<void()> parcel_changed_callback_t; - typedef boost::signals2::signal<void()> parcel_changed_signal_t; + typedef boost::function<void()> teleport_failed_callback_t; + typedef boost::signals2::signal<void()> teleport_failed_signal_t; LLViewerParcelMgr(); ~LLViewerParcelMgr(); @@ -283,9 +283,8 @@ public: // the agent is banned or not in the allowed group BOOL isCollisionBanned(); - boost::signals2::connection addAgentParcelChangedCallback(parcel_changed_callback_t cb); boost::signals2::connection setTeleportFinishedCallback(teleport_finished_callback_t cb); - boost::signals2::connection setTeleportFailedCallback(parcel_changed_callback_t cb); + boost::signals2::connection setTeleportFailedCallback(teleport_failed_callback_t cb); void onTeleportFinished(bool local, const LLVector3d& new_pos); void onTeleportFailed(); @@ -338,8 +337,7 @@ private: BOOL mTeleportInProgress; teleport_finished_signal_t mTeleportFinishedSignal; - parcel_changed_signal_t mTeleportFailedSignal; - parcel_changed_signal_t mAgentParcelChangedSignal; + teleport_failed_signal_t mTeleportFailedSignal; // Array of pieces of parcel edges to potentially draw // Has (parcels_per_edge + 1) * (parcels_per_edge + 1) elements so diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index e9bbcb1097..a271690349 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -232,6 +232,7 @@ public: if( mID != regionp->getHttpResponderID() ) // region is no longer referring to this responder { LL_WARNS2("AppInit", "Capabilities") << "Received results for a stale http responder!" << LL_ENDL; + regionp->failedSeedCapability(); return ; } @@ -304,8 +305,8 @@ public: llinfos << "BaseCapabilitiesCompleteTracker " << "sim " << regionp->getName() << " sent duplicate seed caps that differs in size - most likely content. " << (S32) regionp->getRegionImpl()->mCapabilities.size() << " vs " << regionp->getRegionImpl()->mSecondCapabilitiesTracker.size() - << llendl; - + << llendl; + //todo#add cap debug versus original check? /* CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin(); @@ -1595,6 +1596,8 @@ void LLViewerRegionImpl::buildCapabilityNames(LLSD& capabilityNames) capabilityNames.append("EnvironmentSettings"); capabilityNames.append("EstateChangeInfo"); capabilityNames.append("EventQueueGet"); + capabilityNames.append("FacebookConnect"); + //capabilityNames.append("FacebookRedirect"); if (gSavedSettings.getBOOL("UseHTTPInventory")) { diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 50f0a5f1af..e88b22b461 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -87,6 +87,8 @@ LLGLSLShader gClipProgram; LLGLSLShader gDownsampleDepthProgram; LLGLSLShader gDownsampleDepthRectProgram; LLGLSLShader gAlphaMaskProgram; +LLGLSLShader gBenchmarkProgram; + //object shaders LLGLSLShader gObjectSimpleProgram; @@ -461,7 +463,7 @@ void LLViewerShaderMgr::setShaders() S32 deferred_class = 0; S32 transform_class = gGLManager.mHasTransformFeedback ? 1 : 0; - static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); + static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false); if (!use_transform_feedback) { transform_class = 0; @@ -681,6 +683,7 @@ void LLViewerShaderMgr::unloadShaders() gClipProgram.unload(); gDownsampleDepthProgram.unload(); gDownsampleDepthRectProgram.unload(); + gBenchmarkProgram.unload(); gAlphaMaskProgram.unload(); gUIProgram.unload(); gPathfindingProgram.unload(); @@ -3190,6 +3193,26 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { + gBenchmarkProgram.mName = "Benchmark Shader"; + gBenchmarkProgram.mShaderFiles.clear(); + gBenchmarkProgram.mShaderFiles.push_back(make_pair("interface/benchmarkV.glsl", GL_VERTEX_SHADER_ARB)); + gBenchmarkProgram.mShaderFiles.push_back(make_pair("interface/benchmarkF.glsl", GL_FRAGMENT_SHADER_ARB)); + gBenchmarkProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; + success = gBenchmarkProgram.createShader(NULL, NULL); + } + + if (success) + { + gDownsampleDepthRectProgram.mName = "DownsampleDepthRect Shader"; + gDownsampleDepthRectProgram.mShaderFiles.clear(); + gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); + gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthRectF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDownsampleDepthRectProgram.mShaderLevel = mVertexShaderLevel[SHADER_INTERFACE]; + success = gDownsampleDepthRectProgram.createShader(NULL, NULL); + } + + if (success) + { gDownsampleDepthRectProgram.mName = "DownsampleDepthRect Shader"; gDownsampleDepthRectProgram.mShaderFiles.clear(); gDownsampleDepthRectProgram.mShaderFiles.push_back(make_pair("interface/downsampleDepthV.glsl", GL_VERTEX_SHADER_ARB)); diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 3d89f8d20a..53569ca7ab 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -183,6 +183,7 @@ extern LLGLSLShader gDebugProgram; extern LLGLSLShader gClipProgram; extern LLGLSLShader gDownsampleDepthProgram; extern LLGLSLShader gDownsampleDepthRectProgram; +extern LLGLSLShader gBenchmarkProgram; //output tex0[tc0] + tex1[tc1] extern LLGLSLShader gTwoTextureAddProgram; diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 8036a4e258..e51f7b2c71 100755 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -689,6 +689,11 @@ void LLViewerTextEditor::makePristine() LLTextEditor::makePristine(); } +void LLViewerTextEditor::handleVisibilityChange( BOOL new_visibility ) +{ + LLUICtrl::handleVisibilityChange(new_visibility); +} + BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask) { BOOL handled = FALSE; diff --git a/indra/newview/llviewertexteditor.h b/indra/newview/llviewertexteditor.h index fb428d0dc1..33b78a5964 100755 --- a/indra/newview/llviewertexteditor.h +++ b/indra/newview/llviewertexteditor.h @@ -46,6 +46,8 @@ public: virtual ~LLViewerTextEditor(); virtual void makePristine(); + + /*virtual*/ void handleVisibilityChange( BOOL new_visibility ); // mousehandler overrides virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 84f66c359f..3da6d33d72 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -422,7 +422,9 @@ void LLViewerTextureManager::cleanup() LLViewerFetchedTexture::sDefaultImagep = NULL; LLViewerFetchedTexture::sSmokeImagep = NULL; LLViewerFetchedTexture::sMissingAssetImagep = NULL; + LLTexUnit::sWhiteTexture = 0; LLViewerFetchedTexture::sWhiteImagep = NULL; + LLViewerFetchedTexture::sFlatNormalImagep = NULL; LLViewerMediaTexture::cleanUpClass() ; @@ -1422,7 +1424,7 @@ void LLViewerFetchedTexture::processTextureStats() { updateVirtualSize() ; - static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes", false); if (textures_fullres) { @@ -1747,9 +1749,9 @@ bool LLViewerFetchedTexture::setDebugFetching(S32 debug_level) bool LLViewerFetchedTexture::updateFetch() { - static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled"); - static LLCachedControl<F32> sCameraMotionThreshold(gSavedSettings,"TextureCameraMotionThreshold"); - static LLCachedControl<S32> sCameraMotionBoost(gSavedSettings,"TextureCameraMotionBoost"); + static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false); + static LLCachedControl<F32> sCameraMotionThreshold(gSavedSettings,"TextureCameraMotionThreshold", 0.2); + static LLCachedControl<S32> sCameraMotionBoost(gSavedSettings,"TextureCameraMotionBoost", 3); if(textures_decode_disabled) { return false ; @@ -2828,7 +2830,7 @@ void LLViewerLODTexture::processTextureStats() { updateVirtualSize() ; - static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes", false); if (textures_fullres) { diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 2efe4665fa..783d1f2202 100755 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -500,7 +500,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id, LLGLenum primary_format, LLHost request_from_host) { - static LLCachedControl<bool> fast_cache_fetching_enabled(gSavedSettings, "FastCacheFetchEnabled"); + static LLCachedControl<bool> fast_cache_fetching_enabled(gSavedSettings, "FastCacheFetchEnabled", true); LLPointer<LLViewerFetchedTexture> imagep ; switch(texture_type) @@ -1373,7 +1373,7 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem) // static void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_data) { - static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ; LLFastTimer t(FTM_PROCESS_IMAGES); @@ -1445,7 +1445,7 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d // static void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_data) { - static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ; LLFastTimer t(FTM_PROCESS_IMAGES); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index bf11bce3da..3193a2955b 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -198,6 +198,8 @@ #include "llagentui.h" #include "llwearablelist.h" +#include "llviewereventrecorder.h" + #include "llnotifications.h" #include "llnotificationsutil.h" #include "llnotificationmanager.h" @@ -313,7 +315,7 @@ public: void update() { - static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ; std::string wind_vel_text; std::string wind_vector_text; @@ -954,27 +956,18 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK { llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl; } - return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down); - } - // Topmost view gets a chance before the hierarchy - //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); - //if (top_ctrl) - //{ - // S32 local_x, local_y; - // top_ctrl->screenPointToLocal( x, y, &local_x, &local_y ); - // if (top_ctrl->pointInView(local_x, local_y)) - // { - // return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ; - // } - // else - // { - // if (down) - // { - // gFocusMgr.setTopCtrl(NULL); - // } - // } - //} + BOOL r = mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down); + if (r) { + + lldebugs << "LLViewerWindow::handleAnyMouseClick viewer with mousecaptor calling updatemouseeventinfo - local_x|global x "<< local_x << " " << x << "local/global y " << local_y << " " << y << llendl; + + LLViewerEventRecorder::instance().setMouseGlobalCoords(x,y); + LLViewerEventRecorder::instance().logMouseEvent(std::string(buttonstatestr),std::string(buttonname)); + + } + return r; + } // Mark the click as handled and return if we aren't within the root view to avoid spurious bugs if( !mRootView->pointInView(x, y) ) @@ -982,27 +975,44 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK return TRUE; } // Give the UI views a chance to process the click - if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ) + + BOOL r= mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) ; + if (r) { + + lldebugs << "LLViewerWindow::handleAnyMouseClick calling updatemouseeventinfo - global x "<< " " << x << "global y " << y << "buttonstate: " << buttonstatestr << " buttonname " << buttonname << llendl; + + LLViewerEventRecorder::instance().setMouseGlobalCoords(x,y); + + // Clear local coords - this was a click on root window so these are not needed + // By not including them, this allows the test skeleton generation tool to be smarter when generating code + // the code generator can be smarter because when local coords are present it can try the xui path with local coords + // and fallback to global coordinates only if needed. + // The drawback to this approach is sometimes a valid xui path will appear to work fine, but NOT interact with the UI element + // (VITA support not implemented yet or not visible to VITA due to widget further up xui path not being visible to VITA) + // For this reason it's best to provide hints where possible here by leaving out local coordinates + LLViewerEventRecorder::instance().setMouseLocalCoords(-1,-1); + LLViewerEventRecorder::instance().logMouseEvent(buttonstatestr,buttonname); + if (LLView::sDebugMouseHandling) { - llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl; - } + llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLViewerEventRecorder::instance().get_xui() << llendl; + } return TRUE; - } - else if (LLView::sDebugMouseHandling) - { - llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; - } + } else if (LLView::sDebugMouseHandling) + { + llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl; + } } // Do not allow tool manager to handle mouseclicks if we have disconnected if(!gDisconnected && LLToolMgr::getInstance()->getCurrentTool()->handleAnyMouseClick( x, y, mask, clicktype, down ) ) { + LLViewerEventRecorder::instance().clear_xui(); return TRUE; } - + // If we got this far on a down-click, it wasn't handled. // Up-clicks, though, are always handled as far as the OS is concerned. BOOL default_rtn = !down; @@ -1373,7 +1383,8 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask) void LLViewerWindow::handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) { LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); - return gViewerKeyboard.scanKey(key, key_down, key_up, key_level); + gViewerKeyboard.scanKey(key, key_down, key_up, key_level); + return; // Be clear this function returns nothing } @@ -1849,6 +1860,14 @@ void LLViewerWindow::initBase() // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); + for (S32 i = 0; i < LLToolBarEnums::TOOLBAR_COUNT; ++i) + { + LLToolBar * toolbarp = gToolBarView->getToolbar((LLToolBarEnums::EToolBarLocation)i); + if (toolbarp) + { + toolbarp->getCenterLayoutPanel()->setReshapeCallback(boost::bind(&LLFloaterView::setToolbarRect, gFloaterView, _1, _2)); + } + } gFloaterView->setFloaterSnapView(main_view->getChild<LLView>("floater_snap_region")->getHandle()); gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View"); @@ -2519,6 +2538,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) ||(gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE)) ||(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE))) { + lldebugs << "LLviewerWindow::handleKey handle nav keys for nav" << llendl; + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } @@ -2533,12 +2554,14 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) && keyboard_focus && keyboard_focus->handleKey(key,mask,FALSE)) { + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))) { + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } } @@ -2548,6 +2571,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // if nothing has focus, go to first or last UI element as appropriate if (key == KEY_TAB && (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL)) { + llwarns << "LLviewerWindow::handleKey give floaters first chance at tab key " << llendl; if (gMenuHolder) gMenuHolder->hideMenus(); // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode @@ -2562,11 +2586,13 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) { mRootView->focusNextRoot(); } + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } // hidden edit menu for cut/copy/paste if (gEditMenu && gEditMenu->handleAcceleratorKey(key, mask)) { + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } @@ -2606,18 +2632,27 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) if (keyboard_focus->handleKey(key, mask, FALSE)) { + + lldebugs << "LLviewerWindow::handleKey - in 'traverse up' - no loops seen... just called keyboard_focus->handleKey an it returned true" << llendl; + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; + } else { + lldebugs << "LLviewerWindow::handleKey - in 'traverse up' - no loops seen... just called keyboard_focus->handleKey an it returned FALSE" << llendl; } } if( LLToolMgr::getInstance()->getCurrentTool()->handleKey(key, mask) ) { + lldebugs << "LLviewerWindow::handleKey toolbar handling?" << llendl; + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } // Try for a new-format gesture if (LLGestureMgr::instance().triggerGesture(key, mask)) { + lldebugs << "LLviewerWindow::handleKey new gesture feature" << llendl; + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } @@ -2625,6 +2660,8 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) // don't pass it down to the menus. if (gGestureList.trigger(key, mask)) { + lldebugs << "LLviewerWindow::handleKey check gesture trigger" << llendl; + LLViewerEventRecorder::instance().logKeyEvent(key,mask); return TRUE; } @@ -2673,7 +2710,7 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) // HACK: Numeric keypad <enter> on Mac is Unicode 3 // HACK: Control-M on Windows is Unicode 13 if ((uni_char == 13 && mask != MASK_CONTROL) - || (uni_char == 3 && mask == MASK_NONE)) + || (uni_char == 3 && mask == MASK_NONE) ) { if (mask != MASK_ALT) { @@ -2696,14 +2733,7 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) return TRUE; } - //// Topmost view gets a chance before the hierarchy - //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl(); - //if (top_ctrl && top_ctrl->handleUnicodeChar( uni_char, FALSE ) ) - //{ - // return TRUE; - //} - - return TRUE; + return TRUE; } return FALSE; @@ -2712,8 +2742,6 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) void LLViewerWindow::handleScrollWheel(S32 clicks) { - LLView::sMouseHandlerMessage.clear(); - LLUI::resetMouseIdleTimer(); LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); @@ -3216,8 +3244,6 @@ void LLViewerWindow::updateUI() updateLayout(); - mLastMousePoint = mCurrentMousePoint; - // cleanup unused selections when no modal dialogs are open if (LLModalDialog::activeCount() == 0) { @@ -3455,6 +3481,9 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) { // Store last mouse location. // If mouse leaves window, pretend last point was on edge of window + + mLastMousePoint = mCurrentMousePoint; + if (point.mX < 0) { mCurrentMousePoint.mX = 0; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index fe035a0a7f..c47b6d2335 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -116,16 +116,16 @@ using namespace LLAvatarAppearanceDefines; //----------------------------------------------------------------------------- // Global constants //----------------------------------------------------------------------------- -const LLUUID ANIM_AGENT_BODY_NOISE = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" -const LLUUID ANIM_AGENT_BREATHE_ROT = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8"); //"breathe_rot" -const LLUUID ANIM_AGENT_EDITING = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb"); //"editing" -const LLUUID ANIM_AGENT_EYE = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea"); //"eye" -const LLUUID ANIM_AGENT_FLY_ADJUST = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e"); //"fly_adjust" -const LLUUID ANIM_AGENT_HAND_MOTION = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578"); //"hand_motion" -const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"); //"head_rot" -const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" -const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" -const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" +const LLUUID ANIM_AGENT_BODY_NOISE = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise" +const LLUUID ANIM_AGENT_BREATHE_ROT = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8"); //"breathe_rot" +const LLUUID ANIM_AGENT_EDITING = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb"); //"editing" +const LLUUID ANIM_AGENT_EYE = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea"); //"eye" +const LLUUID ANIM_AGENT_FLY_ADJUST = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e"); //"fly_adjust" +const LLUUID ANIM_AGENT_HAND_MOTION = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578"); //"hand_motion" +const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d"); //"head_rot" +const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b"); //"pelvis_fix" +const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55"); //"target" +const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d"); //"walk_adjust" const LLUUID ANIM_AGENT_PHYSICS_MOTION = LLUUID("7360e029-3cb8-ebc4-863e-212df440d987"); //"physics_motion" @@ -253,7 +253,7 @@ struct LLAppearanceMessageContents }; struct LLVOAvatarChildJoint : public LLInitParam::ChoiceBlock<LLVOAvatarChildJoint> - { +{ Alternative<Lazy<struct LLVOAvatarBoneInfo, IS_A_BLOCK> > bone; Alternative<LLVOAvatarCollisionVolumeInfo> collision_volume; @@ -707,7 +707,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mVisualComplexityStale(TRUE), mLoadedCallbacksPaused(FALSE), mHasPelvisOffset( FALSE ), - mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")), + mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)), mLastRezzedStatus(-1), mIsEditingAppearance(FALSE), mUseLocalAppearance(FALSE), @@ -813,17 +813,17 @@ void LLVOAvatar::debugAvatarRezTime(std::string notification_name, std::string c //------------------------------------------------------------------------ LLVOAvatar::~LLVOAvatar() { - if (!mFullyLoaded) - { + if (!mFullyLoaded) + { debugAvatarRezTime("AvatarRezLeftCloudNotification","left after ruth seconds as cloud"); - } - else - { + } + else + { debugAvatarRezTime("AvatarRezLeftNotification","left sometime after declouding"); - } + } logPendingPhases(); - + lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl; std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer()); @@ -1207,7 +1207,7 @@ void LLVOAvatar::initInstance(void) registerMotion( ANIM_AGENT_TARGET, LLTargetingMotion::create ); registerMotion( ANIM_AGENT_WALK_ADJUST, LLWalkAdjustMotion::create ); } - + LLAvatarAppearance::initInstance(); // preload specific motions here @@ -1392,9 +1392,11 @@ void LLVOAvatar::getSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) //----------------------------------------------------------------------------- void LLVOAvatar::renderCollisionVolumes() { + std::ostringstream ostr; for (S32 i = 0; i < mNumCollisionVolumes; i++) { mCollisionVolumes[i].renderCollision(); + ostr << mCollisionVolumes[i].getName() << ", "; } if (mNameText.notNull()) @@ -1403,6 +1405,96 @@ void LLVOAvatar::renderCollisionVolumes() mNameText->lineSegmentIntersect(unused, unused, unused, TRUE); } + + mDebugText.clear(); + addDebugText(ostr.str()); +} + +void LLVOAvatar::renderJoints() +{ + std::ostringstream ostr; + std::ostringstream nullstr; + + for (joint_map_t::iterator iter = mJointMap.begin(); iter != mJointMap.end(); ++iter) + { + LLJoint* jointp = iter->second; + if (!jointp) + { + nullstr << iter->first << " is NULL" << std::endl; + continue; + } + + ostr << jointp->getName() << ", "; + + jointp->updateWorldMatrix(); + + gGL.pushMatrix(); + gGL.multMatrix( &jointp->getXform()->getWorldMatrix().mMatrix[0][0] ); + + gGL.diffuseColor3f( 1.f, 0.f, 1.f ); + + gGL.begin(LLRender::LINES); + + LLVector3 v[] = + { + LLVector3(1,0,0), + LLVector3(-1,0,0), + LLVector3(0,1,0), + LLVector3(0,-1,0), + + LLVector3(0,0,-1), + LLVector3(0,0,1), + }; + + //sides + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[2].mV); + + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[3].mV); + + gGL.vertex3fv(v[1].mV); + gGL.vertex3fv(v[2].mV); + + gGL.vertex3fv(v[1].mV); + gGL.vertex3fv(v[3].mV); + + + //top + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[4].mV); + + gGL.vertex3fv(v[1].mV); + gGL.vertex3fv(v[4].mV); + + gGL.vertex3fv(v[2].mV); + gGL.vertex3fv(v[4].mV); + + gGL.vertex3fv(v[3].mV); + gGL.vertex3fv(v[4].mV); + + + //bottom + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[5].mV); + + gGL.vertex3fv(v[1].mV); + gGL.vertex3fv(v[5].mV); + + gGL.vertex3fv(v[2].mV); + gGL.vertex3fv(v[5].mV); + + gGL.vertex3fv(v[3].mV); + gGL.vertex3fv(v[5].mV); + + gGL.end(); + + gGL.popMatrix(); + } + + mDebugText.clear(); + addDebugText(ostr.str()); + addDebugText(nullstr.str()); } BOOL LLVOAvatar::lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, @@ -1554,7 +1646,7 @@ LLViewerObject* LLVOAvatar::lineSegmentIntersectRiggedAttachments(const LLVector return hit; } - + LLVOAvatar* LLVOAvatar::asAvatar() { return this; @@ -1889,22 +1981,22 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU } if (!result) -{ + { const std::string url = getImageURL(te,uuid); if (!url.empty()) - { + { LL_DEBUGS("Avatar") << avString() << "from URL " << url << llendl; result = LLViewerTextureManager::getFetchedTextureFromUrl( url, FTT_SERVER_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid); - } - else - { + } + else + { LL_DEBUGS("Avatar") << avString() << "from host " << uuid << llendl; LLHost host = getObjectHost(); result = LLViewerTextureManager::getFetchedTexture( uuid, FTT_HOST_BAKE, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host); + } } -} return result; } @@ -1955,7 +2047,7 @@ void LLVOAvatar::dumpAnimationState() //------------------------------------------------------------------------ // idleUpdate() //------------------------------------------------------------------------ -void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) { LLFastTimer t(FTM_AVATAR_UPDATE); @@ -2010,7 +2102,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) if (isSelf()) { - LLViewerObject::idleUpdate(agent, world, time); + LLViewerObject::idleUpdate(agent, time); // trigger fidget anims if (isAnyAnimationSignaled(AGENT_STAND_ANIMS, NUM_AGENT_STAND_ANIMS)) @@ -2022,7 +2114,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { // Should override the idleUpdate stuff and leave out the angular update part. LLQuaternion rotation = getRotation(); - LLViewerObject::idleUpdate(agent, world, time); + LLViewerObject::idleUpdate(agent, time); setRotation(rotation); } @@ -2707,8 +2799,8 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) LLFontGL::getFontSansSerifSmall()); } - static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames"); - static LLUICachedControl<bool> show_usernames("NameTagShowUsernames"); + static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames", true); + static LLUICachedControl<bool> show_usernames("NameTagShowUsernames", true); if (LLAvatarName::useDisplayNames()) { @@ -2934,7 +3026,7 @@ void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha) LLColor4 LLVOAvatar::getNameTagColor(bool is_friend) { - static LLUICachedControl<bool> show_friends("NameTagShowFriends"); + static LLUICachedControl<bool> show_friends("NameTagShowFriends", false); const char* color_name; if (show_friends && is_friend) { @@ -2989,7 +3081,7 @@ bool LLVOAvatar::isVisuallyMuted() if (!isSelf()) { - static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions"); + static LLCachedControl<U32> render_auto_mute_functions(gSavedSettings, "RenderAutoMuteFunctions", 0); if (render_auto_mute_functions) // Hacky debug switch for developing feature { // Priority order (highest priority first) @@ -3001,9 +3093,9 @@ bool LLVOAvatar::isVisuallyMuted() // - AND aren't over the thresholds // * otherwise visually mute all other avatars - static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit"); - static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit"); - static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit"); + static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit", 0); + static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit", 0.0); + static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0); if (mVisuallyMuteSetting == ALWAYS_VISUAL_MUTE) { // Always want to see this AV as an impostor @@ -3077,9 +3169,6 @@ void LLVOAvatar::forceUpdateVisualMuteSettings() //------------------------------------------------------------------------ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { - // clear debug text - mDebugText.clear(); - if (gSavedSettings.getBOOL("DebugAvatarAppearanceMessage")) { S32 central_bake_version = -1; @@ -3390,8 +3479,8 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) LLVector3 pelvisDir( mRoot->getWorldMatrix().getFwdRow4().mV ); - static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow"); - static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast"); + static LLCachedControl<F32> s_pelvis_rot_threshold_slow(gSavedSettings, "AvatarRotateThresholdSlow", 60.0); + static LLCachedControl<F32> s_pelvis_rot_threshold_fast(gSavedSettings, "AvatarRotateThresholdFast", 2.0); F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, s_pelvis_rot_threshold_slow, s_pelvis_rot_threshold_fast); @@ -3588,6 +3677,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) { setDebugText(mDebugText); } + mDebugText.clear(); //mesh vertices need to be reskinned mNeedsSkin = TRUE; @@ -4072,7 +4162,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) { LLViewerJoint* hair_mesh = getViewerJoint(MESH_ID_HAIR); if (hair_mesh) - { + { num_indices += hair_mesh->render(mAdjustedPixelArea, first_pass, mIsDummy); } first_pass = FALSE; @@ -4082,7 +4172,7 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass) gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } } - + return num_indices; } @@ -5147,7 +5237,7 @@ void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_age //----------------------------------------------------------------------------- F32 LLVOAvatar::getTimeDilation() { - return mTimeDilation; + return mRegionp ? mRegionp->getTimeDilation() : 1.f; } @@ -5199,9 +5289,9 @@ BOOL LLVOAvatar::loadSkeletonNode () { if (!LLAvatarAppearance::loadSkeletonNode()) { - return FALSE; - } - + return FALSE; + } + // ATTACHMENTS { LLAvatarXmlInfo::attachment_info_list_t::iterator iter; @@ -5521,7 +5611,15 @@ void LLVOAvatar::addChild(LLViewerObject *childp) LLViewerObject::addChild(childp); if (childp->mDrawable) { - attachObject(childp); + if (!attachObject(childp)) + { + llwarns << "addChild() failed for " + << childp->getID() + << " item " << childp->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + // mPendingAttachment.push_back(childp); + } } else { @@ -5554,8 +5652,27 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi if (!attachment) { - llwarns << "Object attachment point invalid: " << attachmentID << llendl; + llwarns << "Object attachment point invalid: " << attachmentID + << " trying to use 1 (chest)" + << llendl; + attachment = get_if_there(mAttachmentPoints, 1, (LLViewerJointAttachment*)NULL); // Arbitrary using 1 (chest) + if (attachment) + { + llwarns << "Object attachment point invalid: " << attachmentID + << " on object " << viewer_object->getID() + << " attachment item " << viewer_object->getAttachmentItemID() + << " falling back to 1 (chest)" + << llendl; + } + else + { + llwarns << "Object attachment point invalid: " << attachmentID + << " on object " << viewer_object->getID() + << " attachment item " << viewer_object->getAttachmentItemID() + << "Unable to use fallback attachment point 1 (chest)" + << llendl; + } } return attachment; @@ -5626,13 +5743,22 @@ void LLVOAvatar::lazyAttach() for (U32 i = 0; i < mPendingAttachment.size(); i++) { - if (mPendingAttachment[i]->mDrawable) + LLPointer<LLViewerObject> cur_attachment = mPendingAttachment[i]; + if (cur_attachment->mDrawable) { - attachObject(mPendingAttachment[i]); + if (!attachObject(cur_attachment)) + { // Drop it + llwarns << "attachObject() failed for " + << cur_attachment->getID() + << " item " << cur_attachment->getAttachmentItemID() + << llendl; + // MAINT-3312 backout + //still_pending.push_back(cur_attachment); + } } else { - still_pending.push_back(mPendingAttachment[i]); + still_pending.push_back(cur_attachment); } } @@ -5708,7 +5834,8 @@ void LLVOAvatar::cleanupAttachedMesh( LLViewerObject* pVO ) } } } - } +} + //----------------------------------------------------------------------------- // detachObject() //----------------------------------------------------------------------------- @@ -5921,24 +6048,46 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const { const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = tex_iter->second; if (texture_dict->mWearableType == type) - { + { // Thus, you must check to see if the corresponding baked texture is defined. // NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing // this works for detecting a skirt (most important), but is ineffective at any piece of clothing that // gets baked into a texture that always exists (upper or lower). if (texture_dict->mIsUsedByBakedTexture) - { + { const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; return isTextureDefined(LLAvatarAppearanceDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex); - } + } return FALSE; - } + } } return FALSE; } +LLViewerObject * LLVOAvatar::findAttachmentByID( const LLUUID & target_id ) const +{ + for(attachment_map_t::const_iterator attachment_points_iter = mAttachmentPoints.begin(); + attachment_points_iter != gAgentAvatarp->mAttachmentPoints.end(); + ++attachment_points_iter) + { + LLViewerJointAttachment* attachment = attachment_points_iter->second; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) + { + LLViewerObject *attached_object = (*attachment_iter); + if (attached_object && + attached_object->getID() == target_id) + { + return attached_object; + } + } + } + + return NULL; +} // virtual @@ -5975,7 +6124,7 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL { LLAvatarJointMesh* mesh = (*iter); if (mesh) - { + { mesh->setColor( color ); } } @@ -6043,9 +6192,9 @@ void LLVOAvatar::updateRezzedStatusTimers() { // load level has decreased. start phase timers for higher load levels. for (S32 i = rez_status+1; i <= mLastRezzedStatus; i++) - { + { startPhase("load_" + LLVOAvatar::rezStatusToString(i)); - } + } } else if (rez_status > mLastRezzedStatus) { @@ -6054,16 +6203,16 @@ void LLVOAvatar::updateRezzedStatusTimers() { stopPhase("load_" + LLVOAvatar::rezStatusToString(i)); stopPhase("first_load_" + LLVOAvatar::rezStatusToString(i), false); - } + } if (rez_status == 3) - { + { // "fully loaded", mark any pending appearance change complete. selfStopPhase("update_appearance_from_cof"); selfStopPhase("wear_inventory_category", false); selfStopPhase("process_initial_wearables_update", false); } } - + mLastRezzedStatus = rez_status; } } @@ -6090,7 +6239,7 @@ void LLVOAvatar::startPhase(const std::string& phase_name) } void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) - { +{ F32 elapsed; bool completed; if (getPhases().getPhaseValues(phase_name, elapsed, completed)) @@ -6122,7 +6271,7 @@ void LLVOAvatar::stopPhase(const std::string& phase_name, bool err_check) void LLVOAvatar::logPendingPhases() { if (!isAgentAvatarValid()) - { + { return; } @@ -6138,14 +6287,14 @@ void LLVOAvatar::logPendingPhases() if (!completed) { logMetricsTimerRecord(phase_name, elapsed, completed); - } + } } } - } +} //static void LLVOAvatar::logPendingPhasesAllAvatars() - { +{ for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) { @@ -6156,14 +6305,14 @@ void LLVOAvatar::logPendingPhasesAllAvatars() } inst->logPendingPhases(); } - } +} void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed) - { +{ if (!isAgentAvatarValid()) - { + { return; - } + } LLSD record; record["timer_name"] = phase_name; @@ -6172,15 +6321,15 @@ void LLVOAvatar::logMetricsTimerRecord(const std::string& phase_name, F32 elapse record["completed"] = completed; U32 grid_x(0), grid_y(0); if (getRegion()) - { + { record["central_bake_version"] = LLSD::Integer(getRegion()->getCentralBakeVersion()); grid_from_region_handle(getRegion()->getHandle(), &grid_x, &grid_y); - } + } record["grid_x"] = LLSD::Integer(grid_x); record["grid_y"] = LLSD::Integer(grid_y); record["is_using_server_bakes"] = ((bool) isUsingServerBakes()); record["is_self"] = isSelf(); - + if (isAgentAvatarValid()) { gAgentAvatarp->addMetricsTimerRecord(record); @@ -6388,28 +6537,28 @@ void LLVOAvatar::updateMeshTextures() use_lkg_baked_layer[i], last_id_string.c_str()); } - + for (U32 i=0; i < mBakedTextureDatas.size(); i++) { debugColorizeSubMeshes(i, LLColor4::white); LLViewerTexLayerSet* layerset = getTexLayerSet(i); if (use_lkg_baked_layer[i] && !isUsingLocalAppearance() ) - { + { LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[i].mLastTextureID); mBakedTextureDatas[i].mIsUsed = TRUE; debugColorizeSubMeshes(i,LLColor4::red); - + avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); for (; iter != end; ++iter) - { + { LLAvatarJointMesh* mesh = (*iter); if (mesh) - { + { mesh->setTexture( baked_img ); - } + } } } else if (!isUsingLocalAppearance() && is_layer_baked[i]) @@ -6453,7 +6602,7 @@ void LLVOAvatar::updateMeshTextures() if (mesh) { mesh->setLayerSet( layerset ); - } + } } } else @@ -6475,7 +6624,7 @@ void LLVOAvatar::updateMeshTextures() { LLAvatarJointMesh* mesh = (*iter); if (mesh) - { + { mesh->setColor( color ); mesh->setTexture( hair_img ); } @@ -6503,7 +6652,15 @@ void LLVOAvatar::updateMeshTextures() } } } - removeMissingBakedTextures(); + + // removeMissingBakedTextures() will call back into this rountine if something is removed, and can blow up the stack + static bool call_remove_missing = true; + if (call_remove_missing) + { + call_remove_missing = false; + removeMissingBakedTextures(); // May call back into this function if anything is removed + call_remove_missing = true; + } } // virtual @@ -6563,13 +6720,13 @@ void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_com for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin(); iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter) -{ + { const LLMaskedMorph* maskedMorph = (*iter); LLPolyMorphTarget* morph_target = dynamic_cast<LLPolyMorphTarget*>(maskedMorph->mMorphTarget); if (morph_target) - { + { morph_target->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert); -} + } } } @@ -6852,8 +7009,8 @@ void dump_visual_param(apr_file_t* file, LLVisualParam* viewer_param, F32 value) LLWearableType::getTypeName(LLWearableType::EType(wtype)).c_str() // param_location_name(vparam->getParamLocation()).c_str() ); - } - +} + void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, const LLAppearanceMessageContents& contents) @@ -6867,9 +7024,9 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, outfile.open(fullpath, LL_APR_WB ); apr_file_t* file = outfile.getFileHandle(); if (!file) - { - return; - } + { + return; + } else { LL_DEBUGS("Avatar") << "dumping appearance message to " << fullpath << llendl; @@ -6903,7 +7060,7 @@ void LLVOAvatar::dumpAppearanceMsgParams( const std::string& dump_prefix, apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", i, uuid_str.c_str()); } apr_file_printf(file, "</textures>\n"); - } +} void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMessageContents& contents) { @@ -6920,7 +7077,7 @@ void LLVOAvatar::parseAppearanceMessage(LLMessageSystem* mesgsys, LLAppearanceMe // For future use: //mesgsys->getU32Fast(_PREHASH_AppearanceData, _PREHASH_Flags, appearance_flags, 0); } - + // Parse visual params, if any. S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing @@ -7148,19 +7305,19 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) LLVisualParam* param = contents.mParams[i]; F32 newWeight = contents.mParamWeights[i]; - if (is_first_appearance_message || (param->getWeight() != newWeight)) + if (is_first_appearance_message || (param->getWeight() != newWeight)) + { + params_changed = TRUE; + if(is_first_appearance_message) { - params_changed = TRUE; - if(is_first_appearance_message) - { - param->setWeight(newWeight, FALSE); - } - else - { - interp_params = TRUE; - param->setAnimationTarget(newWeight, FALSE); - } + param->setWeight(newWeight, FALSE); + } + else + { + interp_params = TRUE; + param->setAnimationTarget(newWeight, FALSE); } + } } const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE); // don't worry about VISUAL_PARAM_GROUP_TWEAKABLE_NO_TRANSMIT if (num_params != expected_tweakable_count) @@ -7416,12 +7573,12 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) avatar_joint_mesh_list_t::iterator iter = mBakedTextureDatas[i].mJointMeshes.begin(); avatar_joint_mesh_list_t::iterator end = mBakedTextureDatas[i].mJointMeshes.end(); for (; iter != end; ++iter) - { + { LLAvatarJointMesh* mesh = (*iter); if (mesh) - { + { mesh->setTexture( image_baked ); - } + } } } @@ -7445,7 +7602,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id ) { LLAvatarJointMesh* mesh = (*iter); if (mesh) - { + { mesh->setColor( LLColor4::white ); } } @@ -7464,7 +7621,7 @@ std::string get_sequential_numbered_file_name(const std::string& prefix, file_num_type::iterator it = file_nums.find(prefix); S32 num = 0; if (it != file_nums.end()) -{ + { num = it->second; } file_nums[prefix] = num+1; @@ -7481,7 +7638,7 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara outprefix = getFullname() + (isSelf()?"_s":"_o"); } if (outprefix.empty()) -{ + { outprefix = getFullname() + (isSelf()?"_s":"_o"); } if (outprefix.empty()) @@ -7510,36 +7667,36 @@ void LLVOAvatar::dumpArchetypeXML(const std::string& prefix, bool group_by_weara if (group_by_wearables) { for (S32 type = LLWearableType::WT_SHAPE; type < LLWearableType::WT_COUNT; type++) - { - const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); - apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); + { + const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type); + apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() ); for (LLVisualParam* param = getFirstVisualParam(); param; param = getNextVisualParam()) - { - LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; - if( (viewer_param->getWearableType() == type) && - (viewer_param->isTweakable() ) ) { + LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param; + if( (viewer_param->getWearableType() == type) && + (viewer_param->isTweakable() ) ) + { dump_visual_param(file, viewer_param, viewer_param->getWeight()); + } } - } - for (U8 te = 0; te < TEX_NUM_INDICES; te++) - { - if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) + for (U8 te = 0; te < TEX_NUM_INDICES; te++) { - // MULTIPLE_WEARABLES: extend to multiple wearables? - LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); - if( te_image ) + if (LLAvatarAppearanceDictionary::getTEWearableType((ETextureIndex)te) == type) { - std::string uuid_str; - te_image->getID().toString( uuid_str ); - apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); + // MULTIPLE_WEARABLES: extend to multiple wearables? + LLViewerTexture* te_image = getImage((ETextureIndex)te, 0); + if( te_image ) + { + std::string uuid_str; + te_image->getID().toString( uuid_str ); + apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str.c_str()); + } } } } } - } else { // Just dump all params sequentially. @@ -7685,12 +7842,12 @@ void LLVOAvatar::startAppearanceAnimation() // virtual void LLVOAvatar::bodySizeChanged() -{ +{ if (isSelf() && !LLAppearanceMgr::instance().isInUpdateAppearanceFromCOF()) { // notify simulator of change in size // but not if we are in the middle of updating appearance gAgent.sendAgentSetAppearance(); -} + } } BOOL LLVOAvatar::isUsingServerBakes() const @@ -7702,25 +7859,25 @@ BOOL LLVOAvatar::isUsingServerBakes() const F32 wt = appearance_version_param->getWeight(); F32 expect_wt = mUseServerBakes ? 1.0 : 0.0; if (!is_approx_equal(wt,expect_wt)) -{ + { llwarns << "wt " << wt << " differs from expected " << expect_wt << llendl; } #endif return mUseServerBakes; - } - +} + void LLVOAvatar::setIsUsingServerBakes(BOOL newval) - { +{ mUseServerBakes = newval; LLVisualParam* appearance_version_param = getVisualParam(11000); llassert(appearance_version_param); appearance_version_param->setWeight(newval ? 1.0 : 0.0, false); - } +} // virtual void LLVOAvatar::removeMissingBakedTextures() - { +{ } //virtual @@ -7877,7 +8034,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d void LLVOAvatar::idleUpdateRenderCost() { - static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit"); + static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0); static const U32 ARC_LIMIT = 20000; if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES)) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 931e65b3ea..cd8a5ecdf2 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -129,28 +129,28 @@ public: /*virtual*/ void updateGL(); /*virtual*/ LLVOAvatar* asAvatar(); virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, - void **user_data, - U32 block_num, - const EObjectUpdateType update_type, - LLDataPacker *dp); - virtual void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + void **user_data, + U32 block_num, + const EObjectUpdateType update_type, + LLDataPacker *dp); + virtual void idleUpdate(LLAgent &agent, const F64 &time); /*virtual*/ BOOL updateLOD(); BOOL updateJointLODs(); void updateLODRiggedAttachments( void ); /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. S32 totalTextureMemForUUIDS(std::set<LLUUID>& ids); - bool allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; - bool allLocalTexturesCompletelyDownloaded() const; - bool allBakedTexturesCompletelyDownloaded() const; - void bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, - S32 &both_count, S32 &neither_count); - std::string bakedTextureOriginInfo(); - void collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; - void collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; - void collectTextureUUIDs(std::set<LLUUID>& ids); - void releaseOldTextures(); + bool allTexturesCompletelyDownloaded(std::set<LLUUID>& ids) const; + bool allLocalTexturesCompletelyDownloaded() const; + bool allBakedTexturesCompletelyDownloaded() const; + void bakedTextureOriginCounts(S32 &sb_count, S32 &host_count, + S32 &both_count, S32 &neither_count); + std::string bakedTextureOriginInfo(); + void collectLocalTextureUUIDs(std::set<LLUUID>& ids) const; + void collectBakedTextureUUIDs(std::set<LLUUID>& ids) const; + void collectTextureUUIDs(std::set<LLUUID>& ids); + void releaseOldTextures(); /*virtual*/ void updateTextures(); - LLViewerFetchedTexture* getBakedTextureImage(const U8 te, const LLUUID& uuid); + LLViewerFetchedTexture* getBakedTextureImage(const U8 te, const LLUUID& uuid); /*virtual*/ S32 setTETexture(const U8 te, const LLUUID& uuid); // If setting a baked texture, need to request it from a non-local sim. /*virtual*/ void onShift(const LLVector4a& shift_vector); /*virtual*/ U32 getPartitionType() const; @@ -406,6 +406,7 @@ public: F32 getLastSkinTime() { return mLastSkinTime; } U32 renderTransparent(BOOL first_pass); void renderCollisionVolumes(); + void renderJoints(); static void deleteCachedImages(bool clearAll=true); static void destroyGL(); static void restoreGL(); @@ -731,6 +732,8 @@ public: void cleanupAttachedMesh( LLViewerObject* pVO ); static LLVOAvatar* findAvatarFromAttachment(LLViewerObject* obj); /*virtual*/ BOOL isWearingWearableType(LLWearableType::EType type ) const; + LLViewerObject * findAttachmentByID( const LLUUID & target_id ) const; + protected: LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object); void lazyAttach(); diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 9ce99444d9..082a85e217 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -625,11 +625,11 @@ BOOL LLVOAvatarSelf::isValid() const } // virtual -void LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOAvatarSelf::idleUpdate(LLAgent &agent, const F64 &time) { if (isValid()) { - LLVOAvatar::idleUpdate(agent, world, time); + LLVOAvatar::idleUpdate(agent, time); idleUpdateTractorBeam(); } } @@ -847,7 +847,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures() if (!tex || tex->isMissingAsset()) { LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); - if (imagep) + if (imagep && imagep != tex) { setTEImage(te, imagep); removed = TRUE; @@ -863,13 +863,13 @@ void LLVOAvatarSelf::removeMissingBakedTextures() layerset->setUpdatesEnabled(TRUE); invalidateComposite(layerset, FALSE); } - updateMeshTextures(); + updateMeshTextures(); // may call back into this function if (getRegion() && !getRegion()->getCentralBakeVersion()) { - requestLayerSetUploads(); + requestLayerSetUploads(); + } } } -} //virtual void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) @@ -1310,7 +1310,7 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr discard_level < local_tex_obj->getDiscard()) { local_tex_obj->setDiscard(discard_level); - requestLayerSetUpdate(index); + requestLayerSetUpdate(index); if (isEditingAppearance()) { LLVisualParamHint::requestHintUpdates(); @@ -1799,11 +1799,11 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te { requestLayerSetUpdate(type); if (isEditingAppearance()) - { - LLVisualParamHint::requestHintUpdates(); + { + LLVisualParamHint::requestHintUpdates(); + } } } - } else { tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type), NULL); @@ -2580,25 +2580,25 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe //if (!covered_by_baked) { if (imagep->getID() != IMG_DEFAULT_AVATAR) - { + { imagep->setNoDelete(); if (imagep->getDiscardLevel() != 0) - { - F32 desired_pixels; - desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); - - imagep->setBoostLevel(getAvatarBoostLevel()); - imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; - imagep->resetTextureStats(); - imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); - imagep->addTextureStats( desired_pixels / texel_area_ratio ); - imagep->forceUpdateBindStats() ; - if (imagep->getDiscardLevel() < 0) { - mHasGrey = TRUE; // for statistics gathering + F32 desired_pixels; + desired_pixels = llmin(mPixelArea, (F32)getTexImageArea()); + + imagep->setBoostLevel(getAvatarBoostLevel()); + imagep->setAdditionalDecodePriority(SELF_ADDITIONAL_PRI) ; + imagep->resetTextureStats(); + imagep->setMaxVirtualSizeResetInterval(MAX_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); + imagep->addTextureStats( desired_pixels / texel_area_ratio ); + imagep->forceUpdateBindStats() ; + if (imagep->getDiscardLevel() < 0) + { + mHasGrey = TRUE; // for statistics gathering + } } } - } else { // texture asset is missing @@ -2921,17 +2921,17 @@ void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index ) LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const { - /* switch(index) - case TEX_HEAD_BAKED: - case TEX_HEAD_BODYPAINT: - return mHeadLayerSet; */ + /* switch(index) + case TEX_HEAD_BAKED: + case TEX_HEAD_BODYPAINT: + return mHeadLayerSet; */ const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = LLAvatarAppearanceDictionary::getInstance()->getTexture(index); - if (texture_dict->mIsUsedByBakedTexture) - { - const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; + if (texture_dict->mIsUsedByBakedTexture) + { + const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex; return getLayerSet(baked_index); - } - return NULL; + } + return NULL; } LLViewerTexLayerSet* LLVOAvatarSelf::getLayerSet(EBakedTextureIndex baked_index) const @@ -2959,7 +2959,7 @@ void LLVOAvatarSelf::onCustomizeStart(bool disable_camera_switch) gAgentAvatarp->mUseLocalAppearance = true; if (gSavedSettings.getBOOL("AppearanceCameraMovement") && !disable_camera_switch) -{ + { gAgentCamera.changeCameraToCustomizeAvatar(); } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 3b7b6bac64..521c86e1c3 100755 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -84,7 +84,7 @@ protected: //-------------------------------------------------------------------- public: /*virtual*/ void updateRegion(LLViewerRegion *regionp); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); //-------------------------------------------------------------------- // LLCharacter interface and related diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index 591d5cae0b..600b44d371 100755 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -241,6 +241,7 @@ void LLVOGrass::initClass() void LLVOGrass::cleanupClass() { for_each(sSpeciesTable.begin(), sSpeciesTable.end(), DeletePairedPointer()); + sSpeciesTable.clear(); } U32 LLVOGrass::processUpdateMessage(LLMessageSystem *mesgsys, @@ -277,7 +278,7 @@ BOOL LLVOGrass::isActive() const return TRUE; } -void LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGrass::idleUpdate(LLAgent &agent, const F64 &time) { if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_GRASS))) { diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index e54de85412..ff4fa6b00d 100755 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -74,7 +74,7 @@ public: void plantBlades(); /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); /*virtual*/ BOOL lineSegmentIntersect(const LLVector4a& start, const LLVector4a& end, S32 face = -1, // which face to check, -1 = ALL_SIDES diff --git a/indra/newview/llvoground.cpp b/indra/newview/llvoground.cpp index 97b7418b40..c1273e684c 100755 --- a/indra/newview/llvoground.cpp +++ b/indra/newview/llvoground.cpp @@ -49,7 +49,7 @@ LLVOGround::~LLVOGround() { } -void LLVOGround::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOGround::idleUpdate(LLAgent &agent, const F64 &time) { } diff --git a/indra/newview/llvoground.h b/indra/newview/llvoground.h index 290579b4da..a53f309e46 100755 --- a/indra/newview/llvoground.h +++ b/indra/newview/llvoground.h @@ -41,7 +41,7 @@ protected: public: LLVOGround(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); // Graphical stuff for objects - maybe broken out into render class // later? diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index af55c8f741..815965fb0a 100755 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -113,8 +113,8 @@ LLVoiceClient::LLVoiceClient() : mVoiceModule(NULL), m_servicePump(NULL), - mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")), - mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")), + mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled", true)), + mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault", "00000000-0000-0000-0000-000000000000")), mPTTDirty(true), mPTT(true), mUsePTT(true), diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index ff73aa5354..050d9dd785 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -261,6 +261,7 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() : mSessionTerminateRequested(false), mRelogRequested(false), mConnected(false), + mTerminateDaemon(false), mPump(NULL), mSpatialJoiningNum(0), @@ -695,7 +696,7 @@ void LLVivoxVoiceClient::stateMachine() setVoiceEnabled(false); } - if(mVoiceEnabled || !mIsInitialized) + if(mVoiceEnabled || (!mIsInitialized &&!mTerminateDaemon) ) { updatePosition(); } @@ -708,11 +709,12 @@ void LLVivoxVoiceClient::stateMachine() if((getState() != stateDisabled) && (getState() != stateDisableCleanup)) { // User turned off voice support. Send the cleanup messages, close the socket, and reset. - if(!mConnected) + if(!mConnected || mTerminateDaemon) { // if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill. LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL; killGateway(); + mTerminateDaemon = false; } logout(); @@ -753,7 +755,7 @@ void LLVivoxVoiceClient::stateMachine() // Voice is locked out, we must not launch the vivox daemon. setState(stateJail); } - else if(!isGatewayRunning()) + else if(!isGatewayRunning() && gSavedSettings.getBOOL("EnableVoiceChat")) { if (true) // production build, not test { @@ -786,7 +788,6 @@ void LLVivoxVoiceClient::stateMachine() { loglevel = "0"; // turn logging off completely } - loglevel = "0"; // turn logging off completely params.args.add("-ll"); params.args.add(loglevel); params.cwd = gDirUtilp->getAppRODataDir(); @@ -1137,6 +1138,7 @@ void LLVivoxVoiceClient::stateMachine() std::stringstream errs; errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; args["HOSTID"] = errs.str(); + mTerminateDaemon = true; if (LLGridManager::getInstance()->isSystemGrid()) { LLNotificationsUtil::add("NoVoiceConnect", args); @@ -2619,6 +2621,7 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st std::stringstream errs; errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000"; args["HOSTID"] = errs.str(); + mTerminateDaemon = true; if (LLGridManager::getInstance()->isSystemGrid()) { LLNotificationsUtil::add("NoVoiceConnect", args); @@ -2634,6 +2637,7 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL; mVoiceVersion.serverVersion = versionID; mConnectorHandle = connectorHandle; + mTerminateDaemon = false; if(getState() == stateConnectorStarting) { setState(stateConnectorStarted); diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index e2d1585c15..c325d72ba6 100755 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -659,6 +659,8 @@ private: LLSocket::ptr_t mSocket; bool mConnected; + // We should kill the voice daemon in case of connection alert + bool mTerminateDaemon; LLPumpIO *mPump; friend class LLVivoxProtocolParser; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 9f4f11b317..54e27ff4c6 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -200,7 +200,7 @@ void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) mDrawable->setPositionGroup(p); } -void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOPartGroup::idleUpdate(LLAgent &agent, const F64 &time) { } diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 724e915d02..a94a2291ed 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -63,7 +63,7 @@ public: LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); /*virtual*/ BOOL isActive() const; // Whether this object needs to do an idleUpdate. - void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + void idleUpdate(LLAgent &agent, const F64 &time); virtual F32 getBinRadius(); virtual void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp index 36793017ed..93f0e50336 100755 --- a/indra/newview/llvosky.cpp +++ b/indra/newview/llvosky.cpp @@ -1052,7 +1052,7 @@ void LLVOSky::calcAtmospherics(void) mFadeColor.setAlpha(0); } -void LLVOSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOSky::idleUpdate(LLAgent &agent, const F64 &time) { } diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h index 2a150eccb9..ee8e91fb71 100755 --- a/indra/newview/llvosky.h +++ b/indra/newview/llvosky.h @@ -461,7 +461,7 @@ public: void cleanupGL(); void restoreGL(); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); BOOL updateSky(); // Graphical stuff for objects - maybe broken out into render class diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp index cd12cd9552..b82c4fe769 100755 --- a/indra/newview/llvotree.cpp +++ b/indra/newview/llvotree.cpp @@ -269,6 +269,7 @@ void LLVOTree::initClass() void LLVOTree::cleanupClass() { std::for_each(sSpeciesTable.begin(), sSpeciesTable.end(), DeletePairedPointer()); + sSpeciesTable.clear(); } U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, @@ -339,7 +340,7 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys, return retval; } -void LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOTree::idleUpdate(LLAgent &agent, const F64 &time) { if (mDead || !(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_TREE))) { diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h index 2ecb0303a1..6137ae412d 100755 --- a/indra/newview/llvotree.h +++ b/indra/newview/llvotree.h @@ -59,7 +59,7 @@ public: void **user_data, U32 block_num, const EObjectUpdateType update_type, LLDataPacker *dp); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); // Graphical stuff for objects - maybe broken out into render class later? /*virtual*/ void render(LLAgent &agent); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index d9efd23b43..c233221e5f 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -343,6 +343,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } } mTexAnimMode = 0; + mTextureAnimp->unpackTAMessage(mesgsys, block_num); } else @@ -693,7 +694,7 @@ void LLVOVolume::updateTextureVirtualSize(bool forced) } } - static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable"); + static LLCachedControl<bool> dont_load_textures(gSavedSettings,"TextureDisable", false); if (dont_load_textures || LLAppViewer::getTextureFetch()->mDebugPause) // || !mDrawable->isVisible()) { @@ -1036,8 +1037,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo } } - - static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); + static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false); bool cache_in_vram = use_transform_feedback && gTransformPositionProgram.mProgramObject && (!mVolumeImpl || !mVolumeImpl->isVolumeUnique()); @@ -4460,6 +4460,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) bool emissive = false; + + { LLFastTimer t(FTM_REBUILD_VOLUME_FACE_LIST); @@ -5198,7 +5200,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFac U32 buffer_usage = group->mBufferUsage; - static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback"); + static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false); if (use_transform_feedback && gTransformPositionProgram.mProgramObject && //transform shaders are loaded diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index e8a1c3d1d6..21595ee0bc 100755 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -100,7 +100,7 @@ void LLVOWater::updateTextures() } // Never gets called -void LLVOWater::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOWater::idleUpdate(LLAgent &agent, const F64 &time) { } diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index cf9323ef2e..7a8d819215 100755 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -58,7 +58,7 @@ public: static void initClass(); static void cleanupClass(); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); /*virtual*/ void updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax); diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp index 4e26587184..e7435b6860 100755 --- a/indra/newview/llvowlsky.cpp +++ b/indra/newview/llvowlsky.cpp @@ -92,7 +92,7 @@ void LLVOWLSky::initSunDirection(LLVector3 const & sun_direction, { } -void LLVOWLSky::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) +void LLVOWLSky::idleUpdate(LLAgent &agent, const F64 &time) { } diff --git a/indra/newview/llvowlsky.h b/indra/newview/llvowlsky.h index 729dced15e..1d419b5fea 100755 --- a/indra/newview/llvowlsky.h +++ b/indra/newview/llvowlsky.h @@ -53,7 +53,7 @@ public: void initSunDirection(LLVector3 const & sun_direction, LLVector3 const & sun_angular_velocity); - /*virtual*/ void idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time); + /*virtual*/ void idleUpdate(LLAgent &agent, const F64 &time); /*virtual*/ BOOL isActive(void) const; /*virtual*/ LLDrawable * createDrawable(LLPipeline *pipeline); /*virtual*/ BOOL updateGeometry(LLDrawable *drawable); diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp index 641f338f2c..69255af179 100755 --- a/indra/newview/llwebprofile.cpp +++ b/indra/newview/llwebprofile.cpp @@ -148,9 +148,6 @@ public: LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl; LLWebProfile::reportImageUploadStatus(true); } - -private: - LLPointer<LLImageFormatted> mImagep; }; @@ -172,7 +169,7 @@ public: headers["Cookie"] = LLWebProfile::getAuthCookie(); const std::string& redir_url = content["location"]; LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl; - LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers); + LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder(), headers); } else { diff --git a/indra/newview/llwindowlistener.cpp b/indra/newview/llwindowlistener.cpp index 28f959eb71..a8e06511d7 100755 --- a/indra/newview/llwindowlistener.cpp +++ b/indra/newview/llwindowlistener.cpp @@ -265,7 +265,9 @@ void LLWindowListener::getPaths(LLSD const & request) void LLWindowListener::keyDown(LLSD const & evt) { Response response(LLSD(), evt); - + KEY key = getKEY(evt); + MASK mask = getMask(evt); + if (evt.has("path")) { std::string path(evt["path"]); @@ -280,8 +282,6 @@ void LLWindowListener::keyDown(LLSD const & evt) response.setResponse(target_view->getInfo()); gFocusMgr.setKeyboardFocus(target_view); - KEY key = getKEY(evt); - MASK mask = getMask(evt); gViewerKeyboard.handleKey(key, mask, false); if(key < 0x80) mWindow->handleUnicodeChar(key, mask); } @@ -294,7 +294,8 @@ void LLWindowListener::keyDown(LLSD const & evt) } else { - mKbGetter()->handleTranslatedKeyDown(getKEY(evt), getMask(evt)); + gViewerKeyboard.handleKey(key, mask, false); + if(key < 0x80) mWindow->handleUnicodeChar(key, mask); } } diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 7996f8a640..85614f397c 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -140,39 +140,48 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) { llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl; LLViewerRegion *regionp = getRegionFromHandle(region_handle); + std::string seedUrl; if (regionp) { - llinfos << "Region exists, removing it " << llendl; LLHost old_host = regionp->getHost(); // region already exists! if (host == old_host && regionp->isAlive()) { // This is a duplicate for the same host and it's alive, don't bother. + llinfos << "Region already exists and is alive, using existing region" << llendl; return regionp; } if (host != old_host) { llwarns << "LLWorld::addRegion exists, but old host " << old_host - << " does not match new host " << host << llendl; + << " does not match new host " << host + << ", removing old region and creating new" << llendl; } if (!regionp->isAlive()) { - llwarns << "LLWorld::addRegion exists, but isn't alive" << llendl; + llwarns << "LLWorld::addRegion exists, but isn't alive. Removing old region and creating new" << llendl; } + // Save capabilities seed URL + seedUrl = regionp->getCapability("Seed"); + // Kill the old host, and then we can continue on and add the new host. We have to kill even if the host // matches, because all the agent state for the new camera is completely different. removeRegion(old_host); } + else + { + llinfos << "Region does not exist, creating new one" << llendl; + } U32 iindex = 0; U32 jindex = 0; from_region_handle(region_handle, &iindex, &jindex); S32 x = (S32)(iindex/mWidth); S32 y = (S32)(jindex/mWidth); - llinfos << "Adding new region (" << x << ":" << y << ")" << llendl; - llinfos << "Host: " << host << llendl; + llinfos << "Adding new region (" << x << ":" << y << ")" + << " on host: " << host << llendl; LLVector3d origin_global; @@ -188,6 +197,11 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) llerrs << "Unable to create new region!" << llendl; } + if ( !seedUrl.empty() ) + { + regionp->setCapability("Seed", seedUrl); + } + mRegionList.push_back(regionp); mActiveRegionList.push_back(regionp); mCulledRegionList.push_back(regionp); diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 5fa380e0e3..bfae142812 100755 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -522,6 +522,17 @@ bool LLWorldMap::insertItem(U32 x_world, U32 y_world, std::string& name, LLUUID& tooltip_fmt.setArg("[AREA]", llformat("%d", extra)); tooltip_fmt.setArg("[PRICE]", llformat("%d", extra2)); + + // Check for division by zero + if (extra != 0) + { + tooltip_fmt.setArg("[SQMPRICE]", llformat("%.1f", (F32)extra2 / (F32)extra)); + } + else + { + tooltip_fmt.setArg("[SQMPRICE]", LLTrans::getString("Unknown")); + } + new_item.setTooltip(tooltip_fmt.getString()); if (type == MAP_ITEM_LAND_FOR_SALE) diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index ae334d4bd2..786e4f2de6 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1595,14 +1595,6 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask, } -BOOL outside_slop(S32 x, S32 y, S32 start_x, S32 start_y) -{ - S32 dx = x - start_x; - S32 dy = y - start_y; - - return (dx <= -2 || 2 <= dx || dy <= -2 || 2 <= dy); -} - BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask ) { gFocusMgr.setMouseCapture( this ); @@ -1685,7 +1677,7 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) { if (hasMouseCapture()) { - if (mPanning || outside_slop(x, y, mMouseDownX, mMouseDownY)) + if (mPanning || llabs(x - mMouseDownX) > 1 || llabs(y - mMouseDownY) > 1) { // just started panning, so hide cursor if (!mPanning) @@ -1702,8 +1694,6 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) sPanY += delta_y; sTargetPanX = sPanX; sTargetPanY = sPanY; - - gViewerWindow->moveCursorToCenter(); } // doesn't matter, cursor should be hidden diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 9aeb2d4978..1c7154d413 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -535,15 +535,16 @@ public: RENDER_DEBUG_SHADOW_FRUSTA = 0x00040000, RENDER_DEBUG_SCULPTED = 0x00080000, RENDER_DEBUG_AVATAR_VOLUME = 0x00100000, - RENDER_DEBUG_BUILD_QUEUE = 0x00200000, - RENDER_DEBUG_AGENT_TARGET = 0x00400000, - RENDER_DEBUG_UPDATE_TYPE = 0x00800000, - RENDER_DEBUG_PHYSICS_SHAPES = 0x01000000, - RENDER_DEBUG_NORMALS = 0x02000000, - RENDER_DEBUG_LOD_INFO = 0x04000000, - RENDER_DEBUG_RENDER_COMPLEXITY = 0x08000000, - RENDER_DEBUG_ATTACHMENT_BYTES = 0x10000000, - RENDER_DEBUG_TEXEL_DENSITY = 0x20000000 + RENDER_DEBUG_AVATAR_JOINTS = 0x00200000, + RENDER_DEBUG_BUILD_QUEUE = 0x00400000, + RENDER_DEBUG_AGENT_TARGET = 0x00800000, + RENDER_DEBUG_UPDATE_TYPE = 0x01000000, + RENDER_DEBUG_PHYSICS_SHAPES = 0x02000000, + RENDER_DEBUG_NORMALS = 0x04000000, + RENDER_DEBUG_LOD_INFO = 0x08000000, + RENDER_DEBUG_RENDER_COMPLEXITY = 0x10000000, + RENDER_DEBUG_ATTACHMENT_BYTES = 0x20000000, + RENDER_DEBUG_TEXEL_DENSITY = 0x40000000 }; public: diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index f53995732f..3ebb64e3fa 100755 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -122,6 +122,9 @@ <color name="Blue_80" value="0 0 1 0.8" /> + <color + name="Orange" + value="1 .82 .46 1" /> <!-- This color name makes potentially unused colors show up bright purple. Leave this here until all Unused? are removed below, otherwise @@ -511,6 +514,9 @@ name="MapTrackColor" reference="Red" /> <color + name="MapTrackColorUnder" + reference="Blue" /> + <color name="MapTrackDisabledColor" value="0.5 0 0 1" /> <color diff --git a/indra/newview/skins/default/textures/icons/Facebook.png b/indra/newview/skins/default/textures/icons/Facebook.png Binary files differnew file mode 100644 index 0000000000..8287d56f88 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Facebook.png diff --git a/indra/newview/skins/default/textures/icons/map_placeholder.png b/indra/newview/skins/default/textures/icons/map_placeholder.png Binary files differnew file mode 100644 index 0000000000..31e457aa75 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/map_placeholder.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 54f60f4441..94c187e21a 100755 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -148,6 +148,7 @@ with the same filename but different name <texture name="Command_Preferences_Icon" file_name="toolbar_icons/preferences.png" preload="true" /> <texture name="Command_Profile_Icon" file_name="toolbar_icons/profile.png" preload="true" /> <texture name="Command_Search_Icon" file_name="toolbar_icons/search.png" preload="true" /> + <texture name="Command_Social_Icon" file_name="toolbar_icons/facebook.png" preload="true" /> <texture name="Command_Snapshot_Icon" file_name="toolbar_icons/snapshot.png" preload="true" /> <texture name="Command_Speak_Icon" file_name="toolbar_icons/speak.png" preload="true" /> <texture name="Command_View_Icon" file_name="toolbar_icons/view.png" preload="true" /> @@ -199,6 +200,8 @@ with the same filename but different name <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" /> <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" /> + <texture name="Facebook_Icon" file_name="icons/Facebook.png" preload="false" /> + <texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" /> <texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" /> <texture name="Favorite_Star_Press" file_name="navbar/Favorite_Star_Press.png" preload="false" /> @@ -323,6 +326,8 @@ with the same filename but different name <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" /> + <texture name="Map_Placeholder_Icon" file_name="icons/map_placeholder.png" preload="true" /> + <texture name="MarketplaceBtn_Off" file_name="widgets/MarketplaceBtn_Off.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> <texture name="MarketplaceBtn_Selected" file_name="widgets/MarketplaceBtn_Selected.png" preload="true" scale.left="30" scale.top="19" scale.right="35" scale.bottom="4" /> @@ -565,6 +570,7 @@ with the same filename but different name <texture name="Snapshot_Email" file_name="snapshot_email.png" preload="false" /> <texture name="Snapshot_Inventory" file_name="toolbar_icons/inventory.png" preload="false" /> <texture name="Snapshot_Profile" file_name="toolbar_icons/profile.png" preload="false" /> + <texture name="Snapshot_Facebook" file_name="toolbar_icons/facebook.png" preload="false" /> <texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" /> diff --git a/indra/newview/skins/default/textures/toolbar_icons/facebook.png b/indra/newview/skins/default/textures/toolbar_icons/facebook.png Binary files differnew file mode 100644 index 0000000000..b960b834dc --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/facebook.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/highlighting.png b/indra/newview/skins/default/textures/toolbar_icons/highlighting.png Binary files differnew file mode 100644 index 0000000000..093bace257 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/highlighting.png diff --git a/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png Binary files differnew file mode 100644 index 0000000000..aa1bb26a56 --- /dev/null +++ b/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png Binary files differnew file mode 100644 index 0000000000..d492b30b40 --- /dev/null +++ b/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 815bde456e..9be129bbf6 100755 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -462,10 +462,6 @@ <combo_box.item label="Rør" name="suction"/> <combo_box.item label="Væv" name="weave"/> </combo_box> - <check_box initial_value="falsk" label="Flugt planare overflader" name="checkbox planar align" tool_tip="Flugt teksuter pÃ¥ alle valgte overflader med den sidst valgte overflade. Kræver at planar tekstur-mapning er valgt."/> - <text name="rpt"> - Gentagelser / overflade - </text> <spinner label="Vandret (U)" name="TexScaleU"/> <check_box label="Vend" name="checkbox flip s"/> <spinner label="Lodret (V)" name="TexScaleV"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml index 72200a07ad..e494b2b755 100755 --- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml @@ -26,14 +26,14 @@ <text name="ShadersText"> Overflader: </text> - <check_box initial_value="sand" label="Gennemsigtig vand" name="TransparentWater"/> + <check_box initial_value="true" label="Gennemsigtig vand" name="TransparentWater"/> <check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/> - <check_box initial_value="sand" label="Lokale lys" name="LocalLights"/> + <check_box initial_value="true" label="Lokale lys" name="LocalLights"/> <check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slÃ¥ dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/> <check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/> - <check_box initial_value="sand" label="Lys og skygger" name="UseLightShaders"/> - <check_box initial_value="sand" label=""Ambient Occlusion"" name="UseSSAO"/> - <check_box initial_value="sand" label="Skarphedsdybde" name="UseDoF"/> + <check_box initial_value="true" label="Lys og skygger" name="UseLightShaders"/> + <check_box initial_value="true" label=""Ambient Occlusion"" name="UseSSAO"/> + <check_box initial_value="true" label="Skarphedsdybde" name="UseDoF"/> <text name="shadows_label"> Skygger: </text> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml index 479e98817e..7be9a9d555 100755 --- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml @@ -26,14 +26,13 @@ Web: </text> <radio_group name="use_external_browser"> - <radio_item label="Benyt min browser(IE, Firefox, Safari)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm." value="1"/> + <radio_item label="Benyt min browser(IE, Firefox, Safari)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm." value="true"/> <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser Ã¥bner et nyt vindue i [APP_NAME]." value=""/> </radio_group> <check_box initial_value="true" label="Aktivér plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Acceptér cookies" name="cookies_enabled"/> <check_box initial_value="true" label="Aktivér Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="fra" label="Tilad media browser pop-ups" name="media_popup_enabled"/> - <check_box initial_value="false" label="Aktivér web proxy" name="web_proxy_enabled"/> + <check_box initial_value="false" label="Tilad media browser pop-ups" name="media_popup_enabled"/> <text name="Proxy location"> Proxy placering: </text> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 5f5c34a5cf..6634a4bd90 100755 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -466,16 +466,11 @@ <combo_box.item label="Saugen" name="suction"/> <combo_box.item label="gewoben" name="weave"/> </combo_box> - <check_box initial_value="falsch" label="Flache Oberflächen ausrichten" name="checkbox planar align" tool_tip="Texturen auf allen ausgewählten Oberflächen an der zuletzt ausgewählten Oberfläche ausrichten. Planar Texture Mapping erforderlich."/> - <text name="rpt"> - Wiederholungen / Oberfläche - </text> <spinner label="Horizontal (U)" name="TexScaleU"/> <check_box label="Umkehren" name="checkbox flip s"/> <spinner label="Vertikal (V)" name="TexScaleV"/> <check_box label="Umkehren" name="checkbox flip t"/> <spinner label="RotationËš" name="TexRot"/> - <spinner label="Wiederholungen / Meter" name="rptctrl"/> <button label="Ãœbernehmen" label_selected="Ãœbernehmen" name="button apply"/> <text name="tex offset"> Texture-Versatz diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index c8c20424e1..4268b95370 100755 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -1274,7 +1274,7 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml index 703015af20..9668cfa526 100755 --- a/indra/newview/skins/default/xui/en/floater_about.xml +++ b/indra/newview/skins/default/xui/en/floater_about.xml @@ -9,63 +9,7 @@ save_rect="true" title="ABOUT [CAPITALIZED_APP_NAME]" width="470"> - <floater.string - name="AboutHeader"> -[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) -[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] - -</floater.string> - <floater.string - name="AboutCompiler"> -Built with [COMPILER] version [COMPILER_VERSION] - -</floater.string> - <floater.string - name="AboutPosition"> -You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) -SLURL: <nolink>[SLURL]</nolink> -(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) -[SERVER_VERSION] -[SERVER_RELEASE_NOTES_URL] - -</floater.string> - <!-- *NOTE: Do not translate text like GPU, Graphics Card, etc - - Most PC users who know what these mean will be used to the English versions, - and this info sometimes gets sent to support. --> - <floater.string - name="AboutSystem"> -CPU: [CPU] -Memory: [MEMORY_MB] MB -OS Version: [OS_VERSION] -Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] -Graphics Card: [GRAPHICS_CARD] -</floater.string> - <floater.string - name="AboutDriver"> -Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION] -</floater.string> - <floater.string - name="AboutLibs"> -OpenGL Version: [OPENGL_VERSION] - -libcurl Version: [LIBCURL_VERSION] -J2C Decoder Version: [J2C_VERSION] -Audio Driver Version: [AUDIO_DRIVER_VERSION] -Qt Webkit Version: [QT_WEBKIT_VERSION] -Voice Server Version: [VOICE_VERSION] -</floater.string> - <floater.string - name="none"> - (none) - </floater.string> - <floater.string - name="AboutTraffic"> -Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) -</floater.string> -<floater.string - name="ErrorFetchingServerReleaseNotesURL"> -Error fetching server release notes URL. -</floater.string> + <tab_container follows="all" top="25" diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml index 793a6e6fa1..a660e812cc 100755 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -1365,7 +1365,7 @@ Only large parcels can be listed in search. <combo_box.item label="Any Category" name="item0" - value="any" /> + value="none" /> <combo_box.item label="Linden Location" name="item1" diff --git a/indra/newview/skins/default/xui/en/floater_fbc_web.xml b/indra/newview/skins/default/xui/en/floater_fbc_web.xml new file mode 100644 index 0000000000..0d35e22a19 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_fbc_web.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater name="floater_fbc_web" + help_topic="fbc_web" + width="780" + height="775" + save_rect="true" + single_instance="true" + reuse_instance="false" + filename="floater_web_content.xml"/> diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml index 1215efb7f9..28c89868bd 100755 --- a/indra/newview/skins/default/xui/en/floater_im_container.xml +++ b/indra/newview/skins/default/xui/en/floater_im_container.xml @@ -41,8 +41,8 @@ auto_resize="false" user_resize="true" name="conversations_layout_panel" - min_dim="38" - expanded_min_dim="136"> + min_dim="43" + expanded_min_dim="140"> <layout_stack animate="false" follows="left|top|right" @@ -100,7 +100,7 @@ <layout_panel auto_resize="false" name="conversations_pane_buttons_collapsed" - width="31"> + width="35"> <button follows="right|top" height="25" @@ -110,10 +110,10 @@ image_unselected="Toolbar_Middle_Off" layout="topleft" top="1" - left="0" + left="4" name="expand_collapse_btn" tool_tip="Collapse/Expand this list" - width="31" /> + width="35" /> </layout_panel> </layout_stack> <panel diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 43d0f2fb18..7076de55e3 100755 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -210,7 +210,7 @@ default_tab_group="3" tab_group="2" name="right_part_holder" - min_width="172"> + min_width="230"> <layout_stack animate="true" default_tab_group="2" diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index 5e92a12251..9fa416012c 100755 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -212,11 +212,11 @@ follows="top|left" height="20" layout="topleft" - left="215" + left="222" name="lod_mode_high" top_delta="0" visible="false" - width="135"> + width="130"> <item name="Triangle Limit" value="Triangle Limit" /> @@ -230,7 +230,7 @@ height="20" increment="10" layout="topleft" - left_pad="5" + left_pad="3" name="lod_triangle_limit_high" visible="false" width="55" /> @@ -342,10 +342,10 @@ follows="top|left" height="20" layout="topleft" - left="215" + left="222" name="lod_mode_medium" top_delta="0" - width="135"> + width="130"> <item name="Triangle Limit" value="Triangle Limit" /> @@ -359,7 +359,7 @@ height="20" increment="10" layout="topleft" - left_pad="5" + left_pad="3" name="lod_triangle_limit_medium" width="55" /> <spinner @@ -470,10 +470,10 @@ follows="top|left" height="20" layout="topleft" - left="215" + left="222" name="lod_mode_low" top_delta="0" - width="135"> + width="130"> <item name="Triangle Limit" value="Triangle Limit" /> @@ -487,7 +487,7 @@ height="20" increment="10" layout="topleft" - left_pad="5" + left_pad="3" name="lod_triangle_limit_low" width="55" /> <spinner @@ -598,10 +598,10 @@ follows="top|left" height="20" layout="topleft" - left="215" + left="222" name="lod_mode_lowest" top_delta="0" - width="135"> + width="130"> <item name="Triangle Limit" value="Triangle Limit" /> @@ -615,7 +615,7 @@ height="20" increment="10" layout="topleft" - left_pad="5" + left_pad="3" name="lod_triangle_limit_lowest" width="55" /> <spinner diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml index 7c7ee2df4c..99b812a880 100755 --- a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml +++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml @@ -10,33 +10,34 @@ width="600" default_tab_group="1"> <text_editor - left="10" - type="string" - length="1" - follows="left|right|bottom" - font="Monospace" - height="366" - width="576" - ignore_tab="false" - layout="topleft" - max_length="65536" - name="region_debug_console_output" - show_line_numbers="false" - word_wrap="true" - track_end="true" - read_only="true"> + left="10" + type="string" + length="1" + follows="all" + font="Monospace" + height="366" + width="576" + ignore_tab="false" + layout="topleft" + max_length="65536" + name="region_debug_console_output" + show_line_numbers="false" + word_wrap="true" + track_end="true" + read_only="true"> </text_editor> <line_editor - border_style="line" - border_thickness="1" - tab_group="1" - follows="left|top|right" - font="SansSerif" - height="19" - layout="topleft" - bottom_delta="20" - max_length="127" - name="region_debug_console_input" - top_delta="0" - width="576" /> + border_style="line" + border_thickness="1" + tab_group="1" + follows="left|right|bottom" + font="SansSerif" + height="19" + layout="topleft" + bottom_delta="20" + max_length="127" + name="region_debug_console_input" + top_delta="0" + width="576"> + </line_editor> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_region_restarting.xml b/indra/newview/skins/default/xui/en/floater_region_restarting.xml new file mode 100644 index 0000000000..2fe4d0190a --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_region_restarting.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + height="150" + width="290" + layout="topleft" + name="region_restarting" + help_topic="floater_region_restarting" + single_instance="true" + reuse_instance="false" + title="REGION RESTARTING"> + <string name="RegionName"> + The region you are in now ([NAME]) is about to restart. + +If you stay in this region you will be logged out. + </string> + <string name="RestartSeconds"> + Seconds until restart +[SECONDS] + </string> + <panel + name="layout_panel_1" + height="150" + width="290" + follows="right|top" + top="0" + left="0" + background_visible="true" + bg_opaque_color="Orange" + bg_alpha_color="Orange"> + + <icon color="1.0 1.0 1.0 1.0" + tab_stop="false" + mouse_opaque="false" + name="icon" + width="32" + height="32" + image_name="notify_caution_icon.tga" + follows="left|top"> + </icon> + + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + name="region_name" + text_color="Black" + font="SansSerifBold" + word_wrap="true" + height="100" + top="5" + left="40" + width="230"> + The region you are in now (-The longest region name-) is about to restart. + +If you stay in this region you will be logged out. + </text> + <text + type="string" + length="1" + follows="top|left" + layout="topleft" + name="restart_seconds" + text_color="Black" + font="SansSerifLargeBold" + height="40" + top="110" + left="0" + halign="center" + width="290"> + Seconds until restart + 32767 + </text> + </panel> + </floater> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 49d64767cc..853c209bca 100755 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -21,7 +21,11 @@ Sending Email </string> <string - name="profile_progress_str"> + name="facebook_progress_str"> + Posting to Facebook + </string> + <string + name="profile_progress_str"> Posting </string> <string @@ -33,7 +37,11 @@ Saving to Computer </string> <string - name="profile_succeeded_str"> + name="facebook_succeeded_str"> + Image uploaded + </string> + <string + name="profile_succeeded_str"> Image uploaded </string> <string @@ -49,7 +57,11 @@ Saved to Computer! </string> <string - name="profile_failed_str"> + name="facebook_failed_str"> + Failed to upload image to your Facebook timeline. + </string> + <string + name="profile_failed_str"> Failed to upload image to your Profile Feed. </string> <string diff --git a/indra/newview/skins/default/xui/en/floater_social.xml b/indra/newview/skins/default/xui/en/floater_social.xml new file mode 100644 index 0000000000..b7ff374d5f --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_social.xml @@ -0,0 +1,101 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> +<floater + positioning="cascading" + can_close="true" + can_resize="false" + help_topic="floater_social" + layout="topleft" + name="floater_social" + save_rect="true" + single_instance="true" + reuse_instance="true" + title="POST TO FACEBOOK" + height="482" + width="304"> + <panel + height="482" + width="304" + visible="true" + name="background" + follows="all" + top="0" + left="0"> + <tab_container + name="tabs" + tab_group="1" + tab_min_width="70" + tab_height="30" + tab_position="top" + top="7" + height="437" + halign="center"> + <panel + filename="panel_social_status.xml" + class="llsocialstatuspanel" + follows="all" + label="STATUS" + name="panel_social_status"/> + <panel + filename="panel_social_photo.xml" + class="llsocialphotopanel" + follows="all" + label="PHOTO" + name="panel_social_photo"/> + <panel + filename="panel_social_place.xml" + class="llsocialcheckinpanel" + follows="all" + label="CHECK IN" + name="panel_social_place"/> + <panel + filename="panel_social_account.xml" + class="llsocialaccountpanel" + follows="all" + label="ACCOUNT" + name="panel_social_account"/> + </tab_container> + <panel + name="connection_status_panel" + follows="left|bottom|right" + height="24"> + <text + name="connection_error_text" + type="string" + follows="left|bottom|right" + top="5" + left="9" + width="250" + height="20" + wrap="true" + halign="left" + valign="center" + text_color="DrYellow" + font="SansSerif"> + Error + </text> + <loading_indicator + follows="left|bottom|right" + height="24" + width="24" + name="connection_loading_indicator" + top="2" + left="9" + visible="true"/> + <text + name="connection_loading_text" + type="string" + follows="left|bottom|right" + top="5" + left_pad="5" + width="250" + height="20" + wrap="true" + halign="left" + valign="center" + text_color="EmphasisColor" + font="SansSerif"> + Loading... + </text> + </panel> + </panel> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_web_content.xml b/indra/newview/skins/default/xui/en/floater_web_content.xml index cea10adca8..a80440e844 100755 --- a/indra/newview/skins/default/xui/en/floater_web_content.xml +++ b/indra/newview/skins/default/xui/en/floater_web_content.xml @@ -125,10 +125,10 @@ <icon name="media_secure_lock_flag" height="16" - follows="top|right" + follows="top|left" image_name="Lock2" layout="topleft" - left_delta="620" + left_delta="2" top_delta="2" visible="false" tool_tip="Secured Browsing" diff --git a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml index 50910dff32..410caa7290 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_icon.xml @@ -17,7 +17,7 @@ parameter="profile" /> </menu_item_call> <menu_item_call - label="Send IM..." + label="IM" layout="topleft" name="Send IM"> <menu_item_call.on_click @@ -25,7 +25,32 @@ parameter="im" /> </menu_item_call> <menu_item_call - label="Add Friend..." + label="Offer teleport" + layout="topleft" + name="Offer Teleport"> + <on_click function="AvatarIcon.Action" parameter="teleport"/> + </menu_item_call> + <menu_item_call + label="Request Teleport" + layout="topleft" + name="Request Teleport"> + <on_click function="AvatarIcon.Action" parameter="request_teleport"/> + </menu_item_call> + <menu_item_call + label="Voice call" + layout="topleft" + name="Voice Call"> + <on_click function="AvatarIcon.Action" parameter="voice_call"/> + </menu_item_call> + <menu_item_call + label="Chat history..." + layout="topleft" + name="Chat History"> + <on_click function="AvatarIcon.Action" parameter="chat_history"/> + </menu_item_call> + <menu_item_separator layout="topleft" name="separator_chat_history"/> + <menu_item_call + label="Add friend" layout="topleft" name="Add Friend"> <menu_item_call.on_click @@ -33,11 +58,56 @@ parameter="add" /> </menu_item_call> <menu_item_call - label="Remove Friend..." + label="Remove friend" layout="topleft" name="Remove Friend"> <menu_item_call.on_click function="AvatarIcon.Action" parameter="remove" /> </menu_item_call> + <menu_item_call + label="Invite to group..." + layout="topleft" + name="Invite Group"> + <on_click function="AvatarIcon.Action" parameter="invite_to_group" /> + </menu_item_call> + <menu_item_separator layout="topleft" name="separator_invite_to_group"/> + <menu_item_call + label="Zoom In" + layout="topleft" + name="Zoom In"> + <on_click function="AvatarIcon.Action" parameter="zoom_in" /> + </menu_item_call> + <menu_item_call + label="Map" + layout="topleft" + name="Map"> + <on_click function="AvatarIcon.Action" parameter="map" /> + </menu_item_call> + <menu_item_call + label="Share" + layout="topleft" + name="Share"> + <on_click function="AvatarIcon.Action" parameter="share" /> + </menu_item_call> + <menu_item_call + label="Pay" + layout="topleft" + name="Pay"> + <on_click function="AvatarIcon.Action" parameter="pay" /> + </menu_item_call> + <menu_item_check + label="Block Voice" + layout="topleft" + name="Block Unblock"> + <on_click function="AvatarIcon.Action" parameter="block_unblock" /> + <on_check function="AvatarIcon.Check" parameter="is_blocked" /> + </menu_item_check> + <menu_item_check + label="Block Text" + layout="topleft" + name="Mute Text"> + <on_click function="AvatarIcon.Action" parameter="mute_unmute" /> + <on_check function="AvatarIcon.Check" parameter="is_muted" /> + </menu_item_check> </menu> diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index b3d28788da..31b1d091ee 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -53,6 +53,13 @@ <on_enable function="Avatar.EnableItem" parameter="can_offer_teleport"/> </menu_item_call> <menu_item_call + label="Request teleport" + layout="topleft" + name="request_teleport"> + <on_click function="Avatar.DoToSelected" parameter="request_teleport"/> + <on_enable function="Avatar.EnableItem" parameter="can_offer_teleport"/> + </menu_item_call> + <menu_item_call label="Voice call" layout="topleft" name="voice_call"> diff --git a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml index 8796b87955..a1a3afbf68 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation_log_gear.xml @@ -56,6 +56,16 @@ function="Calllog.Enable" parameter="can_offer_teleport"/> </menu_item_call> + <menu_item_call + label="Request Teleport" + name="request_teleport"> + <on_click + function="Calllog.Action" + parameter="request_teleport"/> + <on_enable + function="Calllog.Enable" + parameter="can_offer_teleport"/> + </menu_item_call> <menu_item_separator /> <menu_item_call label="Add Friend" diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml index 13dc0b941a..6fa45d7d66 100755 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -552,6 +552,14 @@ function="Inventory.DoToSelected" parameter="about" /> </menu_item_call> + <menu_item_call + label="Show on Map" + layout="topleft" + name="show_on_map"> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="show_on_map" /> + </menu_item_call> <menu_item_separator layout="topleft" name="Animation Separator" /> @@ -591,6 +599,14 @@ parameter="lure" /> </menu_item_call> <menu_item_call + label="Request Teleport..." + layout="topleft" + name="Request Teleport..."> + <menu_item_call.on_click + function="Inventory.DoToSelected" + parameter="request_lure" /> + </menu_item_call> + <menu_item_call label="Start Conference Chat" layout="topleft" name="Conference Chat"> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml index 3abb5f7bc8..f12226ebeb 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -29,6 +29,15 @@ parameter="can_offer_teleport"/> </menu_item_call> <menu_item_call + label="Request Teleport" + name="request_teleport"> + <menu_item_call.on_click + function="Avatar.TeleportRequest"/> + <menu_item_call.on_enable + function="Avatar.EnableItem" + parameter="can_offer_teleport"/> + </menu_item_call> + <menu_item_call label="Voice call" layout="topleft" name="voice_call"> @@ -134,5 +143,4 @@ function="Avatar.EnableItem" parameter="can_block" /> </menu_item_check> - <menu_item_separator /> </context_menu> diff --git a/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml index 0160d52b17..f939c3996d 100755 --- a/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/en/menu_teleport_history_item.xml @@ -17,7 +17,7 @@ function="TeleportHistory.MoreInformation" /> </menu_item_call> <menu_item_call - label="Copy to Clipboard" + label="Copy SLurl" layout="topleft" name="CopyToClipboard"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 2d65052def..7e8d2aaf9a 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -16,6 +16,14 @@ parameter="agent" /> </menu_item_call> <menu_item_call + label="Post to Facebook..." + name="PostToFacebook"> + <menu_item_call.on_click + function="Floater.Toggle" + parameter="social"/> + </menu_item_call> + <menu_item_separator/> + <menu_item_call label="Appearance..." name="ChangeOutfit"> <menu_item_call.on_click @@ -189,7 +197,7 @@ name="Preferences" shortcut="control|P"> <menu_item_call.on_click - function="Floater.Show" + function="Floater.Toggle" parameter="preferences" /> </menu_item_call> <menu_item_call @@ -1297,18 +1305,18 @@ tear_off="true"> <menu_item_call label="How to..." - name="How To"> + name="How To" + shortcut="F1"> <menu_item_call.on_click function="Help.ToggleHowTo" parameter="" /> </menu_item_call> <menu_item_call - label="[SECOND_LIFE] Help" - name="Second Life Help" - shortcut="F1"> + label="Quickstart" + name="Quickstart"> <menu_item_call.on_click - function="ShowHelp" - parameter="f1_help" /> + function="Advanced.ShowURL" + parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Quickstart/ta-p/1087919"/> </menu_item_call> <!-- <menu_item_call label="Tutorial" @@ -1318,20 +1326,12 @@ parameter="hud" /> </menu_item_call>--> <menu_item_separator/> - - <menu_item_call - label="User’s guide" - name="User’s guide"> - <menu_item_call.on_click - function="Advanced.ShowURL" - parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/> - </menu_item_call> <menu_item_call label="Knowledge Base" name="Knowledge Base"> <menu_item_call.on_click function="Advanced.ShowURL" - parameter="http://community.secondlife.com/t5/tkb/communitypage"/> + parameter="http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-User-s-Guide/ta-p/1244857"/> </menu_item_call> <menu_item_call label="Wiki" @@ -1381,8 +1381,7 @@ label="Report Bug" name="Report Bug"> <menu_item_call.on_click - function="ShowHelp" - parameter="report_bug" /> + function="Advanced.ReportBug"/> </menu_item_call> <menu_item_separator/> @@ -2397,6 +2396,12 @@ <menu_item_call.on_click function="Advanced.ClickRenderProfile" /> </menu_item_call> + <menu_item_call + label="Benchmark" + name="Benchmark"> + <menu_item_call.on_click + function="Advanced.ClickRenderBenchmark" /> + </menu_item_call> </menu> <menu create_jump_keys="true" @@ -2564,6 +2569,16 @@ parameter="collision skeleton" /> </menu_item_check> <menu_item_check + label="Joints" + name="Joints"> + <menu_item_check.on_check + function="Advanced.CheckInfoDisplay" + parameter="joints" /> + <menu_item_check.on_click + function="Advanced.ToggleInfoDisplay" + parameter="joints" /> + </menu_item_check> + <menu_item_check label="Raycast" name="Raycast"> <menu_item_check.on_check @@ -2947,6 +2962,34 @@ label="Recorder" name="Recorder" tear_off="true"> + <menu_item_call visible="false" + label="Start event recording" + name="Start event recording"> + <menu_item_call.on_visible + function="displayViewerEventRecorderMenuItems" /> + <menu_item_call.on_click + function="Advanced.EventRecorder" + parameter="start recording" /> + </menu_item_call> + <menu_item_call visible="false" + label="Stop event recording" + name="Stop event recording"> + <menu_item_call.on_visible + function="displayViewerEventRecorderMenuItems" /> + <menu_item_call.on_click + function="Advanced.EventRecorder" + parameter="stop recording" /> + </menu_item_call> + <menu_item_call visible="false" + label="Playback event recording" + name="Playback event recording"> + <menu_item_call.on_visible + function="displayViewerEventRecorderMenuItems" /> + <menu_item_call.on_click + function="Advanced.EventRecorder" + parameter="start playback" /> + </menu_item_call> + <menu_item_call label="Start Playback" name="Start Playback"> @@ -3049,6 +3092,13 @@ parameter="http://google.com"/> </menu_item_call> <menu_item_call + label="FB Connect Test" + name="FB Connect Test"> + <menu_item_call.on_click + function="Advanced.WebContentTest" + parameter="https://cryptic-ridge-1632.herokuapp.com/"/> + </menu_item_call> + <menu_item_call label="Dump SelectMgr" name="Dump SelectMgr"> <menu_item_call.on_click diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 69b7fe5a75..c97af4e9ef 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -3481,7 +3481,7 @@ or you can install it now. name="DownloadBackgroundTip" type="notify"> We have downloaded an update to your [APP_NAME] installation. -Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] +Version [VERSION] [[INFO_URL] Information about this update] <tag>confirm</tag> <usetemplate name="okcancelbuttons" @@ -3494,7 +3494,7 @@ Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] name="DownloadBackgroundDialog" type="alertmodal"> We have downloaded an update to your [APP_NAME] installation. -Version [VERSION] [[RELEASE_NOTES_FULL_URL] Information about this update] + Version [VERSION] [[INFO_URL] Information about this update] <tag>confirm</tag> <usetemplate name="okcancelbuttons" @@ -4071,6 +4071,27 @@ Join me in [REGION] <notification icon="alertmodal.tga" + name="TeleportRequestPrompt" + type="alertmodal"> +Request a teleport to [NAME] with the following message + <tag>confirm</tag> + <form name="form"> + <input name="message" type="text"> + + </input> + <button + default="true" + index="0" + name="OK" + text="OK"/> + <button + index="1" + name="Cancel" + text="Cancel"/> + </form> + </notification> + <notification + icon="alertmodal.tga" name="TooManyTeleportOffers" type="alertmodal"> You attempted to make [OFFERS] teleport offers @@ -4737,6 +4758,14 @@ Problems adding a new estate manager. One or more estates may have a full manag <notification icon="alertmodal.tga" + name="ProblemAddingEstateBanManager" + type="alertmodal"> +Unable to add estate owner or manager to ban list. + <tag>fail</tag> + </notification> + + <notification + icon="alertmodal.tga" name="ProblemAddingEstateGeneric" type="alertmodal"> Problems adding to this estate list. One or more estates may have a full list. @@ -6017,6 +6046,13 @@ Please select at least one type of content to search (General, Moderate, or Adul [MESSAGE] </notification> + <notification + icon="notify.tga" + name="FacebookConnect" + type="notifytip"> +[MESSAGE] + </notification> + <notification icon="notify.tga" name="PaymentReceived" @@ -6309,7 +6345,7 @@ You can only claim public land in the Region you're in. <notification icon="notify.tga" name="RegionTPAccessBlocked" - persist="true" + persist="false" type="notify"> <tag>fail</tag> The region you're trying to visit contains content exceeding your current preferences. You can change your preferences using Me > Preferences > General. @@ -6317,6 +6353,15 @@ You can only claim public land in the Region you're in. <notification icon="notify.tga" + name="RegionAboutToShutdown" + persist="false" + type="notify"> + <tag>fail</tag> + The region you're trying to enter is about to shut down. + </notification> + + <notification + icon="notify.tga" name="URBannedFromRegion" persist="true" type="notify"> @@ -6637,7 +6682,7 @@ Your object named <nolink>[OBJECTFROMNAME]</nolink> has given you th sound="UISndNewIncomingIMSession"> [NAME_SLURL] has offered to teleport you to their location: -“[MESSAGE]†+"[MESSAGE]†<icon>[MATURITY_ICON]</icon> - [MATURITY_STR] <tag>confirm</tag> <form name="form"> @@ -6702,6 +6747,27 @@ However, this region contains content accessible to adults only. Teleport offer sent to [TO_NAME] </notification> + <notification + icon="notify.tga" + name="TeleportRequest" + log_to_im="true" + type="offer"> +[NAME_SLURL] is requesting to be teleported to your location. +[MESSAGE] + +Offer a teleport? + <tag>confirm</tag> + <form name="form"> + <button + index="0" + name="Yes" + text="Yes"/> + <button + index="1" + name="No" + text="No"/> + </form> + </notification> <notification icon="notify.tga" @@ -6750,7 +6816,6 @@ However, this region contains content accessible to adults only. icon="notify.tga" name="FriendshipOffered" log_to_im="true" - show_toast="false" type="notify"> <tag>friendship</tag> You have offered friendship to [TO_NAME] @@ -6800,7 +6865,6 @@ However, this region contains content accessible to adults only. icon="notify.tga" name="FriendshipAcceptedByMe" log_to_im="true" - show_toast="false" type="notify"> <tag>friendship</tag> Friendship offer accepted. @@ -6810,7 +6874,6 @@ Friendship offer accepted. icon="notify.tga" name="FriendshipDeclinedByMe" log_to_im="true" - show_toast="false" type="notify"> <tag>friendship</tag> Friendship offer declined. @@ -6838,20 +6901,20 @@ This will add a bookmark in your inventory so you can quickly IM this Resident. <notification icon="notify.tga" name="RegionRestartMinutes" + show_toast="false" priority="high" - sound="UISndAlert" type="notify"> -This region will restart in [MINUTES] minutes. +The region "[NAME]" will restart in [MINUTES] minutes. If you stay in this region you will be logged out. </notification> <notification icon="notify.tga" name="RegionRestartSeconds" + show_toast="false" priority="high" - sound="UISndAlert" type="notify"> -This region will restart in [SECONDS] seconds. +The region "[NAME]" will restart in [SECONDS] seconds. If you stay in this region you will be logged out. </notification> @@ -8734,11 +8797,11 @@ You are no longer allowed here and have [EJECT_TIME] seconds to leave. <notification icon="alertmodal.tga" - name="NoEnterServerFull" + name="NoEnterRegionMaybeFull" type="notify"> <tag>fail</tag> -You can't enter this region because -the server is full. +You can't enter region "[NAME]". +It may be full or restarting soon. </notification> <notification @@ -9238,8 +9301,17 @@ Object uses too many physics resources -- its dynamics have been disabled. <notification icon="alertmodal.tga" + name="EstateManagerFailedllTeleportHome" + persist="false" + type="notify"> + <tag>fail</tag> +The object '[OBJECT_NAME]' at [SLURL] cannot teleport estate managers home. + </notification> + + <notification + icon="alertmodal.tga" name="TeleportedHomeByObjectOnParcel" - persist="true" + persist="false" type="notify"> <tag>fail</tag> You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARCEL_NAME]' @@ -9248,7 +9320,7 @@ You have been teleported home by the object '[OBJECT_NAME]' on the parcel '[PARC <notification icon="alertmodal.tga" name="TeleportedHomeByObject" - persist="true" + persist="false" type="notify"> <tag>fail</tag> You have been teleported home by the object '[OBJECT_NAME]' @@ -9504,6 +9576,14 @@ Not enough script resources available to attach object! <notification icon="alertmodal.tga" + name="CantAttachObjectBeingRemoved" + type="notify"> + <tag>fail</tag> + Cannot attach object because it is already being removed. + </notification> + + <notification + icon="alertmodal.tga" name="CantDropItemTrialUser" type="notify"> <tag>fail</tag> @@ -9684,15 +9764,7 @@ Only the first 10 selected objects have been disabled. Refresh and make addition type="notify"> <tag>fail</tag> You need to update your viewer to buy this parcel. - </notification> - - <notification - icon="alertmodal.tga" - name="LandBuyAccessBlocked" - type="notify"> - <tag>fail</tag> -You can't buy this land due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. - </notification> + </notification> <notification icon="alertmodal.tga" @@ -9755,7 +9827,9 @@ Not enough leased parcels in selection to join. name="CantDivideLandMultipleParcelsSelected" type="notify"> <tag>fail</tag> -Can't divide land.\nThere is more than one parcel selected.\nTry selecting a smaller piece of land. +Can't divide land. +There is more than one parcel selected. +Try selecting a smaller piece of land. </notification> <notification @@ -9763,7 +9837,9 @@ Can't divide land.\nThere is more than one parcel selected.\nTry selecting a sma name="CantDivideLandCantFindParcel" type="notify"> <tag>fail</tag> -Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug... +Can't divide land. +Can't find the parcel. +Please report with Help -> Report Bug... </notification> <notification @@ -9771,7 +9847,8 @@ Can't divide land.\nCan't find the parcel.\nPlease report with Help -> Reprt Bug name="CantDivideLandWholeParcelSelected" type="notify"> <tag>fail</tag> -Can't divide land. Whole parcel is selected.\nTry selecting a smaller piece of land. +Can't divide land. Whole parcel is selected. +Try selecting a smaller piece of land. </notification> <notification diff --git a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml index a054e71e34..4372cf69bf 100755 --- a/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_conversation_list_item.xml @@ -11,7 +11,7 @@ height="20" default_icon_name="Generic_Person" layout="topleft" - left="5" + left="9" top="2" visible="false" width="20" /> @@ -20,7 +20,7 @@ height="20" default_icon_name="Generic_Group" layout="topleft" - left="5" + left="9" top="2" visible="false" width="20" /> @@ -29,9 +29,9 @@ height="20" image_name="Nearby_chat_icon" layout="topleft" - left="5" + left="10" name="nearby_chat_icon" - top="2" + top="3" visible="false" width="20"/> <layout_stack diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 38b680ba86..26f54bacbc 100755 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <panel label="General" - height="604" + height="420" width="304" class="panel_group_general" name="general_tab"> @@ -101,31 +101,7 @@ Hover your mouse over the options for more help. text_readonly_color="White" word_wrap="true"> Group Charter - </text_editor> - <name_list - column_padding="0" - draw_heading="true" - follows="left|top|right" - heading_height="23" - height="160" - layout="topleft" - left="0" - name="visible_members" - short_names="false" - top_pad="2"> - <name_list.columns - label="Member" - name="name" - relative_width="0.4" /> - <name_list.columns - label="Title" - name="title" - relative_width="0.4" /> - <name_list.columns - label="Status" - name="status" - relative_width="0.2" /> - </name_list> + </text_editor> <text follows="left|top|right" type="string" diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml index 206496cc0e..b3326d8da6 100755 --- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml +++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml @@ -131,7 +131,7 @@ background_visible="true" expanded="false" layout="topleft" name="group_roles_tab" - title="Roles" + title="Roles & Members" fit_panel="false"> <panel border="false" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index df91ad8b5e..9ac5b8800e 100755 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -94,11 +94,15 @@ clicking on their names. <name_list.columns label="Donation" name="donated" - relative_width="0.25" /> + relative_width="0.2" /> <name_list.columns label="Status" name="online" - relative_width="0.14" /> + relative_width="0.18" /> + <name_list.columns + label="Title" + name="title" + relative_width="0.18" /> </name_list> <button height="23" diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 3edeb9aa36..c7edba21f8 100755 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -87,6 +87,7 @@ direction="down" height="23" image_overlay="Arrow_Left_Off" + image_hover_unselected="PushButton_Over" image_bottom_pad="1" layout="topleft" left="10" @@ -99,6 +100,7 @@ direction="down" height="23" image_overlay="Arrow_Right_Off" + image_hover_unselected="PushButton_Over" image_bottom_pad="1" layout="topleft" left_pad="0" @@ -111,6 +113,7 @@ height="23" image_bottom_pad="1" image_overlay="Home_Off" + image_hover_unselected="PushButton_Over" layout="topleft" left_pad="7" name="home_btn" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index ed274d0233..d2caf63052 100755 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -365,6 +365,23 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M top="0" width="307" /> </accordion_tab> + <accordion_tab + layout="topleft" + height="173" + name="tab_suggested_friends" + title="People you may want to friend"> + <avatar_list + ignore_online_status="true" + allow_select="true" + follows="all" + height="173" + layout="topleft" + left="0" + name="suggested_friends" + show_permissions_granted="true" + top="0" + width="307" /> + </accordion_tab> </accordion> <text follows="all" @@ -483,12 +500,13 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M <text type="string" length="1" - follows="all" + follows="left|top|right" height="14" layout="topleft" right="-10" top_pad="4" left="3" + use_ellipses="true" name="groupcount"> You belong to [COUNT] groups, and can join [REMAINING] more. </text> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml index d9067b41c7..8794e3bf95 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_move.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -129,6 +129,16 @@ name="tap_tap_hold_to_run" width="237" top_pad="0"/> + <check_box + control_name="AutomaticFly" + follows="left|top" + height="20" + label="Hold jump or crouch key to start or stop flying" + layout="topleft" + left_delta="0" + name="automatic_fly" + width="237" + top_pad="0"/> <text follows="left|top" type="string" @@ -260,4 +270,4 @@ function="Floater.Show" parameter="pref_joystick" /> </button> -</panel>
\ No newline at end of file +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 198ccd6e2f..8f90521bb2 100755 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -315,7 +315,18 @@ <line_editor.commit_callback function="MediaCtrl.CommitURL"/> </line_editor> - <layout_stack + <icon + name="media_secure_lock_flag" + height="16" + follows="top|left" + image_name="Lock2" + layout="topleft" + left_delta="2" + top_delta="2" + visible="false" + tool_tip="Secured Browsing" + width="16" /> + <layout_stack name="media_address_url_icons" animate="false" follows="top|right" @@ -340,19 +351,6 @@ tool_tip="White List enabled" width="16" /> </layout_panel> - <layout_panel - layout="topleft" - width="16" - mouse_opaque="false" - auto_resize="false"> - <icon - name="media_secure_lock_flag" - height="16" - image_name="Lock2" - layout="topleft" - tool_tip="Secured Browsing" - width="16" /> - </layout_panel> </layout_stack> </layout_panel> <layout_panel diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index d2f29ade44..61c8c971c2 100755 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -16,11 +16,11 @@ imgoverlay_label_space="10" label="Post to My Profile Feed" layout="topleft" - left="10" + left_delta="0" name="save_to_profile_btn" pad_left="10" right="-10" - top="5"> + top_pad="10"> <button.commit_callback function="Snapshot.SaveToProfile" /> </button> diff --git a/indra/newview/skins/default/xui/en/panel_social_account.xml b/indra/newview/skins/default/xui/en/panel_social_account.xml new file mode 100644 index 0000000000..d7235396fe --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_social_account.xml @@ -0,0 +1,75 @@ +<panel + height="400" + width="304" + layout="topleft" + name="panel_social_account"> + <string + name="facebook_connected" + value="You are connected to Facebook as:" /> + <string + name="facebook_disconnected" + value="Not connected to Facebook" /> + <text + layout="topleft" + length="1" + follows="top|left" + font="SansSerif" + height="16" + left="9" + name="account_caption_label" + top="21" + type="string"> + Not connected to Facebook. + </text> + <text + layout="topleft" + top_pad="2" + length="1" + follows="top|left" + font="SansSerif" + height="16" + left="9" + name="account_name_label" + parse_urls="true" + type="string"/> + <panel + layout="topleft" + name="panel_buttons" + height="345" + left="9"> + <button + layout="topleft" + follows="left|top" + top_pad="9" + visible="true" + height="23" + label="Connect..." + name="connect_btn" + width="210"> + <commit_callback function="SocialSharing.Connect"/> + </button> + + <button + layout="topleft" + follows="left|top" + top_delta="0" + height="23" + label="Disconnect" + name="disconnect_btn" + width="210" + visible="false"> + <commit_callback function="SocialSharing.Disconnect"/> + </button> + <text + layout="topleft" + length="1" + follows="top|left" + height="16" + left="0" + name="account_learn_more_label" + top_pad="20" + type="string"> + [http://community.secondlife.com/t5/English-Knowledge-Base/Second-Life-Share/ta-p/2149711 Learn about posting to Facebook] + </text> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_social_photo.xml b/indra/newview/skins/default/xui/en/panel_social_photo.xml new file mode 100644 index 0000000000..c79a246d9d --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_social_photo.xml @@ -0,0 +1,144 @@ + <panel + height="400" + width="304" + layout="topleft" + name="panel_social_photo"> + <layout_stack + layout="topleft" + border_size="0" + height="392" + follows="all" + orientation="vertical" + name="stack_photo" + top="8"> + <layout_panel + name="snapshot_panel" + height="367"> + <combo_box + control_name="SocialPhotoResolution" + follows="left|top" + top="6" + left="9" + name="resolution_combobox" + tool_tip="Image resolution" + height="21" + width="135"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + </combo_box> + <text + follows="left|top" + font="SansSerifSmall" + height="14" + left="208" + length="1" + halign="right" + name="file_size_label" + top="9" + type="string" + width="50"> + [SIZE] KB + </text> + <panel + height="150" + width="250" + visible="true" + name="thumbnail_placeholder" + top="33" + follows="left|top" + left="9"> + </panel> + <button + follows="left|top" + height="23" + label="Refresh" + left="9" + top_pad="5" + name="new_snapshot_btn" + tool_tip="Click to refresh" + visible="true" + width="100" > + <button.commit_callback + function="SocialSharing.RefreshPhoto" /> + </button> + <text + follows="left|top" + font="SansSerif" + text_color="EmphasisColor" + height="14" + top_pad="-19" + left_pad="-20" + length="1" + halign="center" + name="working_lbl" + translate="false" + type="string" + visible="true" + width="150"> + Refreshing... + </text> + <text + length="1" + follows="top|left|right" + font="SansSerif" + height="16" + left="9" + name="caption_label" + top_pad="20" + type="string"> + Comment (optional): + </text> + <text_editor + follows="left|top" + height="87" + width="250" + left="9" + length="1" + max_length="700" + name="photo_caption" + type="string" + word_wrap="true"> + </text_editor> + </layout_panel> + <layout_panel + name="photo_button_panel" + height="25"> + <button + follows="left|top" + top="0" + left="9" + height="23" + label="Post" + name="post_photo_btn" + width="100"> + <button.commit_callback + function="SocialSharing.SendPhoto" /> + </button> + <button + follows="left|top" + height="23" + label="Cancel" + name="cancel_photo_btn" + left_pad="15" + top_delta="0" + width="100"> + <button.commit_callback + function="SocialSharing.Cancel" /> + </button> + </layout_panel> + </layout_stack> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_social_place.xml b/indra/newview/skins/default/xui/en/panel_social_place.xml new file mode 100644 index 0000000000..13e94f6998 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_social_place.xml @@ -0,0 +1,132 @@ + <panel + height="400" + width="304" + layout="topleft" + name="panel_social_place"> + <layout_stack + layout="topleft" + border_size="0" + height="392" + follows="all" + orientation="vertical" + name="stack_place" + top="8"> + <layout_panel + name="place_detail_panel" + height="181"> + <text + length="1" + follows="top|left|right" + font="SansSerif" + height="16" + left="9" + name="place_caption_label" + top="13" + type="string"> + Say something about where you are: + </text> + <text_editor + follows="top|left" + height="150" + width="250" + left="9" + length="1" + max_length="700" + name="place_caption" + type="string" + word_wrap="true"> + </text_editor> + </layout_panel> + <layout_panel + name="place_map_panel" + height="186"> + <panel + follows="left|top" + height="128" + width="128" + background_visible="true" + bg_opaque_color="Black" + bg_alpha_color="Black" + top="20" + left="9" + visible="true" + name="map_border"> + </panel> + <loading_indicator + follows="left|top" + height="24" + width="24" + name="map_loading_indicator" + top="77" + left="61" + visible="true"/> + <icon + follows="left|top" + height="128" + width="128" + image_name="Map_Placeholder_Icon" + layout="topleft" + top="20" + left="9" + visible="true" + name="map_placeholder"> + </icon> + <icon + follows="left|top" + height="128" + width="128" + image_name="Map_Placeholder_Icon" + layout="topleft" + top="20" + left="9" + visible="true" + name="map_default"> + </icon> + <check_box + follows="left|top" + initial_value="false" + top_delta="8" + width="8" + label="" + name="add_place_view_cb" + left_pad="5"/> + <text + follows="left|top" + font="SansSerif" + height="32" + width="130" + word_wrap="true" + left_pad="12" + top_delta="-8" + type="string"> + Include overhead view of location + </text> + </layout_panel> + <layout_panel + name="place_button_panel" + height="25"> + <button + follows="left|top" + top="0" + left="9" + height="23" + label="Post" + name="post_place_btn" + width="100"> + <button.commit_callback + function="SocialSharing.SendCheckin" /> + </button> + <button + follows="left|top" + height="23" + label="Cancel" + name="cancel_place_btn" + left_pad="15" + top_delta="0" + width="100"> + <button.commit_callback + function="SocialSharing.Cancel" /> + </button> + </layout_panel> + </layout_stack> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_social_status.xml b/indra/newview/skins/default/xui/en/panel_social_status.xml new file mode 100644 index 0000000000..54cfa3f524 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_social_status.xml @@ -0,0 +1,67 @@ + <panel + height="400" + width="304" + layout="topleft" + name="panel_social_status"> + <layout_stack + layout="topleft" + border_size="0" + height="392" + follows="all" + orientation="vertical" + name="stack_status" + top="8"> + <layout_panel + name="status_detail_panel" + height="367"> + <text + length="1" + follows="top|left|right" + font="SansSerif" + height="16" + left="9" + name="status_caption_label" + top="13" + type="string"> + What's on your mind? + </text> + <text_editor + follows="left|top" + height="150" + width="250" + left="9" + length="1" + max_length="700" + name="status_message" + type="string" + word_wrap="true"> + </text_editor> + </layout_panel> + <layout_panel + name="status_button_panel" + height="25"> + <button + follows="left|top" + top="0" + left="9" + height="23" + label="Post" + name="post_status_btn" + width="100"> + <button.commit_callback + function="SocialSharing.SendStatus" /> + </button> + <button + follows="left|top" + height="23" + label="Cancel" + name="cancel_status_btn" + left_pad="15" + top_delta="0" + width="100"> + <button.commit_callback + function="SocialSharing.Cancel" /> + </button> + </layout_panel> + </layout_stack> + </panel> diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index dd2a0c6627..064ece6e4b 100755 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -113,7 +113,7 @@ image_pressed="Pause_Press" image_pressed_selected="Play_Press" is_toggle="true" - left_pad="15" + left_pad="5" top="1" name="media_toggle_btn" tool_tip="Start/Stop All Media (Music, Video, Web pages)" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 1c46cec479..67f75fe1d2 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -20,6 +20,42 @@ <string name="StartupInitializingVFS">Initializing VFS...</string> <string name="StartupRequireDriverUpdate">Graphics initialization failed. Please update your graphics driver!</string> + <!-- about dialog/support string--> + <string name="AboutHeader"> +[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL]) +[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]] + </string> + <string name="AboutCompiler">Built with [COMPILER] version [COMPILER_VERSION]</string> + <string name="AboutPosition"> +You are at [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(global coordinates [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) +[SERVER_VERSION] +[SERVER_RELEASE_NOTES_URL] + </string> + <!-- *NOTE: Do not translate text like GPU, Graphics Card, etc - + Most PC users who know what these mean will be used to the English versions, + and this info sometimes gets sent to support. --> + <string name="AboutSystem"> +CPU: [CPU] +Memory: [MEMORY_MB] MB +OS Version: [OS_VERSION] +Graphics Card Vendor: [GRAPHICS_CARD_VENDOR] +Graphics Card: [GRAPHICS_CARD] + </string> + <string name="AboutDriver">Windows Graphics Driver Version: [GRAPHICS_DRIVER_VERSION]</string> + <string name="AboutLibs"> +OpenGL Version: [OPENGL_VERSION] + +libcurl Version: [LIBCURL_VERSION] +J2C Decoder Version: [J2C_VERSION] +Audio Driver Version: [AUDIO_DRIVER_VERSION] +Qt Webkit Version: [QT_WEBKIT_VERSION] +Voice Server Version: [VOICE_VERSION] + </string> + <string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string> + <string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string> + <!-- progress --> <string name="ProgressRestoring">Restoring...</string> <string name="ProgressChangingResolution">Changing resolution...</string> @@ -148,6 +184,14 @@ Please try logging in again in a minute.</string> <string name="SentToInvalidRegion">You were sent to an invalid region.</string> <string name="TestingDisconnect">Testing viewer disconnect</string> + <!-- Facebook Connect and, eventually, other Social Network --> + <string name="SocialFacebookConnecting">Connecting to Facebook...</string> + <string name="SocialFacebookPosting">Posting...</string> + <string name="SocialFacebookDisconnecting">Disconnecting from Facebook...</string> + <string name="SocialFacebookErrorConnecting">Problem connecting to Facebook</string> + <string name="SocialFacebookErrorPosting">Problem posting to Facebook</string> + <string name="SocialFacebookErrorDisconnecting">Problem disconnecting from Facebook</string> + <!-- Tooltip --> <string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar --> <string name="TooltipNoName">(no name)</string> <!-- No name on an object --> @@ -379,7 +423,7 @@ Please try logging in again in a minute.</string> <!-- world map --> <string name="texture_loading">Loading...</string> <string name="worldmap_offline">Offline</string> - <string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE]</string> + <string name="worldmap_item_tooltip_format">[AREA] m² L$[PRICE] ([SQMPRICE] L$/m²)</string> <string name="worldmap_results_none_found">None found.</string> <!-- animations uploading status codes --> @@ -448,6 +492,8 @@ Please try logging in again in a minute.</string> <string name="load_file_verb">Load</string> <string name="targa_image_files">Targa Images</string> <string name="bitmap_image_files">Bitmap Images</string> + <string name="png_image_files">PNG Images</string> + <string name="save_texture_image_files">Targa or PNG Images</string> <string name="avi_movie_file">AVI Movie File</string> <string name="xaf_animation_file">XAF Anim File</string> <string name="xml_file">XML File</string> @@ -2185,7 +2231,7 @@ For AI Character: Get the closest navigable point to the point provided. <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string> <string name="InventoryInboxNoItems">Your Marketplace purchases will appear here. You may then drag them into your inventory to use them.</string> <string name="MarketplaceURL">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/</string> - <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4</string> + <string name="MarketplaceURL_CreateStore">http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3</string> <string name="MarketplaceURL_Dashboard">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard</string> <string name="MarketplaceURL_Imports">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/imports</string> <string name="MarketplaceURL_LearnMore">https://marketplace.[MARKETPLACE_DOMAIN_NAME]/learn_more</string> @@ -2293,8 +2339,7 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale <string name="InvFolder Merchant Outbox">Merchant Outbox</string> <!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694--> - <string name="InvFolder Friends">Friends</string> - <string name="InvFolder Received Items">Received Items</string> + <string name="InvFolder Friends">Friends</string> <string name="InvFolder All">All</string> <string name="no_attachments">No attachments worn</string> @@ -2464,7 +2509,11 @@ Drag folders to this area and click "Send to Marketplace" to list them for sale all estates that you manage for [OWNER] </string> <string name="RegionInfoAllowedResidents">Allowed Residents: ([ALLOWEDAGENTS], max [MAXACCESS])</string> - <string name="RegionInfoAllowedGroups">Allowed groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string> + <string name="RegionInfoAllowedGroups">Allowed Groups: ([ALLOWEDGROUPS], max [MAXACCESS])</string> + <string name="RegionInfoEstateManagers">Estate Managers: ([ESTATEMANAGERS], max [MAXMANAGERS])</string> + <string name="RegionInfoBannedResidents">Banned Residents: ([BANNEDAGENTS], max [MAXBANNED])</string> + <string name="RegionInfoListTypeAllowedAgents">Allowed Residents</string> + <string name="RegionInfoListTypeBannedAgents">Banned Residents</string> <!-- script limits floater --> <string name="ScriptLimitsParcelScriptMemory">Parcel Script Memory</string> @@ -3427,6 +3476,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Drag items from inventory here </string> + <string name="facebook_post_success"> + You posted to Facebook. + </string> <string name="no_session_message"> (IM Session Doesn't Exist) @@ -3859,6 +3911,7 @@ Try enclosing path to the editor with double quotes. <string name="Command_Profile_Label">Profile</string> <string name="Command_Search_Label">Search</string> <string name="Command_Snapshot_Label">Snapshot</string> + <string name="Command_Social_Label">Facebook</string> <string name="Command_Speak_Label">Speak</string> <string name="Command_View_Label">Camera controls</string> <string name="Command_Voice_Label">Voice settings</string> @@ -3886,6 +3939,7 @@ Try enclosing path to the editor with double quotes. <string name="Command_Profile_Tooltip">Edit or view your profile</string> <string name="Command_Search_Tooltip">Find places, events, people</string> <string name="Command_Snapshot_Tooltip">Take a picture</string> + <string name="Command_Social_Tooltip">Post to Facebook</string> <string name="Command_Speak_Tooltip">Speak with people nearby using your microphone</string> <string name="Command_View_Tooltip">Changing camera angle</string> <string name="Command_Voice_Tooltip">Volume controls for calls and people near you in world</string> diff --git a/indra/newview/skins/default/xui/en/widgets/person_tab_view.xml b/indra/newview/skins/default/xui/en/widgets/person_tab_view.xml new file mode 100644 index 0000000000..af5aec2c34 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/person_tab_view.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<person_tab_view + folder_arrow_image="Folder_Arrow" + folder_indentation="5" + item_height="24" + item_top_pad="3" + mouse_opaque="true" + follows="left|top|right" + text_pad="6" + text_pad_left="4" + text_pad_right="4" + arrow_size="10" + max_folder_item_overlap="2"/> diff --git a/indra/newview/skins/default/xui/en/widgets/person_view.xml b/indra/newview/skins/default/xui/en/widgets/person_view.xml new file mode 100644 index 0000000000..46c1b7ff75 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/person_view.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<person_view + folder_arrow_image="Folder_Arrow" + folder_indentation="5" + item_height="24" + item_top_pad="3" + mouse_opaque="true" + follows="left|top|right" + icon_pad="4" + icon_width="20" + text_pad="6" + text_pad_left="4" + text_pad_right="4" + arrow_size="10" + max_folder_item_overlap="2"> + <facebook_icon + follows="left" + height="14" + image_name="Facebook_Icon" + left="5" + bottom="6" + name="facebook_icon" + tool_tip="Facebook User" + visible="false" + width="14" /> + <avatar_icon + follows="left" + layout="topleft" + height="20" + default_icon_name="Generic_Person" + left="5" + top="2" + visible="false" + width="20" /> + <last_interaction_time_textbox + layout="topleft" + follows="right" + font="SansSerifSmall" + height="15" + left_pad="5" + right="-164" + name="last_interaction_time_textbox" + text_color="LtGray_50" + value="0s" + visible="false" + width="35" /> + <permission_edit_theirs_icon + layout="topleft" + height="16" + follows="right" + image_name="Permission_Edit_Objects_Theirs" + left_pad="3" + right="-129" + name="permission_edit_theirs_icon" + tool_tip="You can edit this friend's objects" + top="4" + visible="false" + width="16" /> + <permission_edit_mine_icon + layout="topleft" + height="16" + follows="right" + image_name="Permission_Edit_Objects_Mine" + left_pad="3" + right="-110" + name="permission_edit_mine_icon" + tool_tip="This friend can edit, delete or take your objects" + top="4" + visible="false" + width="16" /> + <permission_map_icon + height="16" + follows="right" + image_name="Permission_Visible_Map" + left_pad="3" + tool_tip="This friend can locate you on the map" + right="-91" + name="permission_map_icon" + visible="false" + width="16" /> + <permission_online_icon + height="16" + follows="right" + image_name="Permission_Visible_Online" + left_pad="3" + right="-72" + name="permission_online_icon" + tool_tip="This friend can see when you're online" + visible="false" + width="16" /> + <info_btn + follows="right" + height="16" + image_pressed="Info_Press" + image_unselected="Info_Over" + left_pad="3" + right="-53" + name="info_btn" + tool_tip="More info" + tab_stop="false" + visible="false" + width="16" /> + <profile_btn + layout="topleft" + follows="right" + height="20" + image_overlay="Web_Profile_Off" + left_pad="5" + right="-28" + name="profile_btn" + tab_stop="false" + tool_tip="View profile" + top="2" + visible="false" + width="20" /> + <output_monitor + auto_update="true" + follows="right" + draw_border="false" + height="16" + right="-3" + mouse_opaque="true" + name="speaking_indicator" + visible="false" + width="20" /> + </person_view> + diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml index c351db5eae..c2327c96c4 100755 --- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml @@ -28,7 +28,7 @@ <text name="tc label"> Activar S3TC: </text> - <check_box initial_value="verdadero" label="Activar la compresión de texturas (requiere reiniciar)" name="texture compression" tool_tip="Comprime las texturas de la memoria de vÃdeo, lo cual permite cargar texturas de una resolución más alta, pero con una cierta pérdida de calidad del color."/> + <check_box initial_value="true" label="Activar la compresión de texturas (requiere reiniciar)" name="texture compression" tool_tip="Comprime las texturas de la memoria de vÃdeo, lo cual permite cargar texturas de una resolución más alta, pero con una cierta pérdida de calidad del color."/> <slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vÃdeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/> <spinner label="Intensidad de la niebla:" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 15462c3726..32baa5bb7d 100755 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -443,16 +443,11 @@ <combo_box.item label="succión" name="suction"/> <combo_box.item label="tejido" name="weave"/> </combo_box> - <check_box initial_value="falso" label="Alinear caras del plano" name="checkbox planar align" tool_tip="Alinear texturas en todas las caras seleccionadas con la última cara seleccionada. Requiere la representación de texturas en el plano."/> - <text name="rpt"> - Repeticiones por cara - </text> <spinner label="Horizontal (U)" name="TexScaleU"/> <check_box label="Voltear" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Voltear" name="checkbox flip t"/> <spinner label="Rotación" name="TexRot"/> - <spinner label="Repeticiones / Metro" name="rptctrl"/> <button label="Aplicar" label_selected="Aplicar" name="button apply"/> <text name="tex offset"> Desplazar diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml index 9362f76708..a9eab74e2b 100755 --- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml @@ -25,14 +25,14 @@ <text name="ShadersText"> Shaders: </text> - <check_box initial_value="verdadero" label="Agua transparente" name="TransparentWater"/> + <check_box initial_value="true" label="Agua transparente" name="TransparentWater"/> <check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/> - <check_box initial_value="verdadero" label="Luces locales" name="LocalLights"/> + <check_box initial_value="true" label="Luces locales" name="LocalLights"/> <check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/> <check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/> - <check_box initial_value="verdadero" label="Modelo de iluminación avanzado" name="UseLightShaders"/> - <check_box initial_value="verdadero" label="Oclusión del ambiente" name="UseSSAO"/> - <check_box initial_value="verdadero" label="Profundidad del campo" name="UseDoF"/> + <check_box initial_value="true" label="Modelo de iluminación avanzado" name="UseLightShaders"/> + <check_box initial_value="true" label="Oclusión del ambiente" name="UseSSAO"/> + <check_box initial_value="true" label="Profundidad del campo" name="UseDoF"/> <text name="shadows_label"> Sombras: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index f7eaa03d63..508bfbcd32 100755 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -21,7 +21,7 @@ <check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Aceptar las 'cookies'" name="cookies_enabled"/> <check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="falso" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/> + <check_box initial_value="false" label="Permitir las ventanas emergentes en el navegador" name="media_popup_enabled"/> <text name="Software updates:"> Actualizaciones de software: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index 5cb1654c70..dcd6984715 100755 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -19,7 +19,7 @@ <check_box label="Activado" name="enable_voice_check"/> <check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media" value="true"/> <check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos" value="true"/> - <check_box label="Reproducir sonidos de los gestos" name="gesture_audio_play_btn" tool_tip="Selecciona esta opción para escuchar los sonidos de los gestos" value="verdadero"/> + <check_box label="Reproducir sonidos de los gestos" name="gesture_audio_play_btn" tool_tip="Selecciona esta opción para escuchar los sonidos de los gestos" value="true"/> <text name="voice_chat_settings"> Configuración del chat de voz </text> diff --git a/indra/newview/skins/default/xui/es/panel_tools_texture.xml b/indra/newview/skins/default/xui/es/panel_tools_texture.xml index 7199905a1c..b820880e60 100644 --- a/indra/newview/skins/default/xui/es/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/es/panel_tools_texture.xml @@ -112,5 +112,5 @@ <spinner label="Grados de rotación" name="shinyRot"/> <spinner label="Desplazamiento horizontal" name="shinyOffsetU"/> <spinner label="Desplazamiento vertical" name="shinyOffsetV"/> - <check_box initial_value="falso" label="Alinear caras del plano" name="checkbox planar align" tool_tip="Alinear texturas en todas las caras seleccionadas con la última cara seleccionada. Requiere la representación de texturas en el plano."/> + <check_box initial_value="false" label="Alinear caras del plano" name="checkbox planar align" tool_tip="Alinear texturas en todas las caras seleccionadas con la última cara seleccionada. Requiere la representación de texturas en el plano."/> </panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 4686d1ed3a..484511a08b 100755 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1256,7 +1256,7 @@ Intenta iniciar sesión de nuevo en unos instantes. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml index 098f8fc713..bb146556ba 100755 --- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml @@ -28,7 +28,7 @@ <text name="tc label"> Activer S3TC : </text> - <check_box initial_value="vraie" label="Activer la compression des textures (redémarrage requis)" name="texture compression" tool_tip="Comprime les textures en mémoire vidéo afin de permettre de charger des textures de résolution plus élevée au prix d'une certaine qualité de couleur."/> + <check_box initial_value="true" label="Activer la compression des textures (redémarrage requis)" name="texture compression" tool_tip="Comprime les textures en mémoire vidéo afin de permettre de charger des textures de résolution plus élevée au prix d'une certaine qualité de couleur."/> <slider label="Mémoire textures (Mo) :" name="GraphicsCardTextureMemory" tool_tip="Quantité de mémoire à affecter aux textures. Utilise la mémoire de la carte vidéo par défaut. Si vous réduisez ce paramètre, cela peut améliorer les performances, mais les textures risquent d'être floues."/> <spinner label="Indice du brouillard :" name="fog"/> <button label="OK" label_selected="OK" name="OK"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index bcc3423862..421e14d51b 100755 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -463,16 +463,11 @@ <combo_box.item label="Ventouses" name="suction"/> <combo_box.item label="Tissage" name="weave"/> </combo_box> - <check_box initial_value="false" label="Aligner les faces Plan" name="checkbox planar align" tool_tip="Aligner les textures sur toutes les faces sélectionnées avec la dernière face sélectionnée. Application de la texture Plan requise."/> - <text name="rpt"> - Répétitions / Face - </text> <spinner label="Horizontal (U)" name="TexScaleU"/> <check_box label="Inverser" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Inverser" name="checkbox flip t"/> <spinner label="RotationËš" name="TexRot"/> - <spinner label="Répétitions / Mètre" name="rptctrl"/> <button label="Appliquer" label_selected="Appliquer" name="button apply"/> <text name="tex offset"> Décalage de la texture diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 346fa62351..78d846ff4f 100755 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -1274,7 +1274,7 @@ Veuillez réessayer de vous connecter dans une minute. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index dd59035dd4..468f284ccb 100755 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -470,16 +470,11 @@ <combo_box.item label="Cerchi rialzati" name="suction"/> <combo_box.item label="Trama" name="weave"/> </combo_box> - <check_box initial_value="falso" label="Allinea facce planari" name="checkbox planar align" tool_tip="Allinea le texture su tutte le facce selezionate con l’ultima faccia selezionata. È richiesta la mappatura planare delle texture."/> - <text name="rpt"> - Ripetizioni / Faccia - </text> <spinner label="Orizzontale (U)" name="TexScaleU"/> <check_box label="Inverti" name="checkbox flip s"/> <spinner label="Verticale (V)" name="TexScaleV"/> <check_box label="Inverti" name="checkbox flip t"/> <spinner label="RotazioneËš" name="TexRot"/> - <spinner label="Ripetizioni / Metro" name="rptctrl"/> <button label="Applica" label_selected="Applica" name="button apply"/> <text name="tex offset"> Bilanciamento della texture diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml index e7483b1ba5..2978c48db6 100755 --- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml @@ -25,7 +25,7 @@ <text name="ShadersText"> Effetti grafici: </text> - <check_box initial_value="vero" label="Acqua trasparente" name="TransparentWater"/> + <check_box initial_value="true" label="Acqua trasparente" name="TransparentWater"/> <check_box initial_value="true" label="Piccoli rilievi e scintillii" name="BumpShiny"/> <check_box initial_value="true" label="Luci locali" name="LocalLights"/> <check_box initial_value="true" label="Effetti grafici base" name="BasicShaders" tool_tip="Disabilitare questa opzione può evitare che qualche scheda grafica vada in crash."/> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml index 4c190197b4..fcc9661d03 100755 --- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml @@ -21,7 +21,7 @@ <check_box initial_value="true" label="Abilita plugin" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Accetta cookie" name="cookies_enabled"/> <check_box initial_value="true" label="Abilita Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="falso" label="Consenti pop-up nel browser media" name="media_popup_enabled"/> + <check_box initial_value="false" label="Consenti pop-up nel browser media" name="media_popup_enabled"/> <text name="Software updates:"> Aggiornamenti software: </text> diff --git a/indra/newview/skins/default/xui/it/panel_tools_texture.xml b/indra/newview/skins/default/xui/it/panel_tools_texture.xml index 4e515563ac..36ad2980cb 100644 --- a/indra/newview/skins/default/xui/it/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/it/panel_tools_texture.xml @@ -112,5 +112,5 @@ <spinner label="Gradi di rotazione" name="shinyRot"/> <spinner label="Spostamento orizzontale" name="shinyOffsetU"/> <spinner label="Spostamento verticale" name="shinyOffsetV"/> - <check_box initial_value="falso" label="Allinea facce planari" name="checkbox planar align" tool_tip="Allinea le texture su tutte le facce selezionate con l’ultima faccia selezionata. È richiesta la mappatura planare delle texture."/> + <check_box initial_value="false" label="Allinea facce planari" name="checkbox planar align" tool_tip="Allinea le texture su tutte le facce selezionate con l’ultima faccia selezionata. È richiesta la mappatura planare delle texture."/> </panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 160df911d3..60ed2b0929 100755 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -1265,7 +1265,7 @@ Prova ad accedere nuovamente tra un minuto. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 4bd6439ad2..5511433ae3 100755 --- a/indra/newview/skins/default/xui/ja/floater_tools.xml +++ b/indra/newview/skins/default/xui/ja/floater_tools.xml @@ -469,16 +469,11 @@ <combo_box.item label="å¸ã„è¾¼ã¿" name="suction"/> <combo_box.item label="織目" name="weave"/> </combo_box> - <check_box initial_value="false" label="å¹³é¢ã‚’æƒãˆã‚‹" name="checkbox planar align" tool_tip="é¸æŠžé¢å…¨ã¦ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ã€æœ€å¾Œã«é¸æŠžã•ã‚ŒãŸé¢ã«æƒãˆã¾ã™ã€‚ å¹³é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒžãƒƒãƒ”ングãŒå¿…è¦ã§ã™ã€‚"/> - <text name="rpt"> - å復 / é¢ - </text> <spinner label="水平(U)" name="TexScaleU"/> <check_box label="å転" name="checkbox flip s"/> <spinner label="垂直(V)" name="TexScaleV"/> <check_box label="å転" name="checkbox flip t"/> <spinner label="回転˚" name="TexRot"/> - <spinner label="å復 / メーター" name="rptctrl"/> <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply"/> <text name="tex offset"> テクスãƒãƒ£ã®ã‚ºãƒ¬ diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index ab2fd461ab..a0f45e5a55 100755 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -1274,7 +1274,7 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 9e6fed8387..69d5c23f9c 100755 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -442,16 +442,11 @@ <combo_box.item label="Suction" name="suction"/> <combo_box.item label="Fali" name="weave"/> </combo_box> - <check_box initial_value="nieprawda" label="PoÅ‚Ä…cz powierzchnie planarne" name="checkbox planar align" tool_tip="PoÅ‚Ä…cz tekstury na wszystkich wybranych powierzchniach z powierzchniÄ… wybranÄ… jako ostatnia. Wymaga planarnego mapowania tekstury."/> - <text name="rpt"> - Powtórzenia / Powierzchnia - </text> <spinner label="Poziomo (U)" name="TexScaleU"/> <check_box label="Odwróć" name="checkbox flip s"/> <spinner label="Pionowo (V)" name="TexScaleV"/> <check_box label="Odwróć" name="checkbox flip t"/> <spinner label="PowtórzeniaËš" name="TexRot"/> - <spinner label="Powtórzenia / metr" name="rptctrl"/> <button label="Zastosuj" label_selected="Zastosuj" name="button apply"/> <text name="tex offset"> Wyrównanie tekstury diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml index f2beef091a..4cd271a141 100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml @@ -26,7 +26,7 @@ <text name="ShadersText"> Cieniowanie pixeli (shadery): </text> - <check_box initial_value="prawda" label="Przeźroczystość wody" name="TransparentWater"/> + <check_box initial_value="true" label="Przeźroczystość wody" name="TransparentWater"/> <check_box initial_value="true" label="Mapowanie wypukÅ‚oÅ›ci i poÅ‚ysk" name="BumpShiny"/> <check_box initial_value="true" label="Podstawowe shadery" name="BasicShaders" tool_tip="WyÅ‚Ä…czenie tej opcji może naprawić bÅ‚Ä™dy niektórych sterowników graficznych."/> <check_box initial_value="true" label="Shadery atmosfery" name="WindLightUseAtmosShaders"/> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml index fa0a5981a8..b663e18227 100755 --- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml @@ -26,14 +26,13 @@ Internet: </text> <radio_group name="use_external_browser"> - <radio_item label="Użyj zewnÄ™trznej przeglÄ…darki (IE, Firefox, Safari)" name="external" tool_tip="Używaj zewnÄ™trznej przeglÄ…darki. Nie jest to rekomendowane w trybie peÅ‚noekranowym." value="1"/> + <radio_item label="Użyj zewnÄ™trznej przeglÄ…darki (IE, Firefox, Safari)" name="external" tool_tip="Używaj zewnÄ™trznej przeglÄ…darki. Nie jest to rekomendowane w trybie peÅ‚noekranowym." value="true"/> <radio_item label="Używaj wbudowanej przeglÄ…darki." name="internal" tool_tip="Używaj wbudowanej przeglÄ…darki. Ta przeglÄ…darka otworzy nowe okno w [APP_NAME]." value=""/> </radio_group> <check_box initial_value="true" label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/> <check_box initial_value="true" label="Zezwalaj na Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="nieprawda" label="Zezwól na wyskakujÄ…ce okienka przeglÄ…darki mediów" name="media_popup_enabled"/> - <check_box initial_value="false" label="Używaj serwera proxy" name="web_proxy_enabled"/> + <check_box initial_value="false" label="Zezwól na wyskakujÄ…ce okienka przeglÄ…darki mediów" name="media_popup_enabled"/> <text name="Proxy location"> Lokalizacja proxy: </text> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 8c245c582e..66c14cdecf 100755 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -463,16 +463,11 @@ <combo_box.item label="Sulcos" name="suction"/> <combo_box.item label="Weave" name="weave"/> </combo_box> - <check_box initial_value="falso" label="Alinhar planares" name="checkbox planar align" tool_tip="Alinhar texturas dos planos selecionados com o plano selecionado por último. Requer mapeamento planar da textura."/> - <text name="rpt"> - Repetições / Plano - </text> <spinner label="Horizontal (U)" name="TexScaleU"/> <check_box label="Inverter" name="checkbox flip s"/> <spinner label="Vertical (V)" name="TexScaleV"/> <check_box label="Inverter" name="checkbox flip t"/> <spinner label="RotaçãoËš" name="TexRot"/> - <spinner label="Repetições/Metro" name="rptctrl"/> <button label="Aplicar" label_selected="Aplicar" name="button apply"/> <text name="tex offset"> Offset de textura diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml index 37e8838bf4..756e345cb8 100755 --- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml @@ -26,14 +26,14 @@ rápido <text name="ShadersText"> Sombreadores: </text> - <check_box initial_value="verdadeiro" label="Ãgua transparente" name="TransparentWater"/> + <check_box initial_value="true" label="Ãgua transparente" name="TransparentWater"/> <check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/> - <check_box initial_value="verdadeiro" label="Luzes locais" name="LocalLights"/> + <check_box initial_value="true" label="Luzes locais" name="LocalLights"/> <check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vÃdeo a travem."/> <check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/> - <check_box initial_value="verdadeiro" label="Modelo avançado de luzes" name="UseLightShaders"/> - <check_box initial_value="verdadeiro" label="Oclusão ambiental" name="UseSSAO"/> - <check_box initial_value="verdadeiro" label="Profundidade" name="UseDoF"/> + <check_box initial_value="true" label="Modelo avançado de luzes" name="UseLightShaders"/> + <check_box initial_value="true" label="Oclusão ambiental" name="UseSSAO"/> + <check_box initial_value="true" label="Profundidade" name="UseDoF"/> <text name="shadows_label"> Sombras: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml index 887d0cfe98..1279e74e21 100755 --- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml @@ -21,7 +21,7 @@ <check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/> <check_box initial_value="true" label="Habilitar Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="falso" label="Ativar pop-ups no navegador de mÃdia" name="media_popup_enabled"/> + <check_box initial_value="false" label="Ativar pop-ups no navegador de mÃdia" name="media_popup_enabled"/> <text name="Software updates:"> Atualizações de software: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index d910a7b812..fff5fd7005 100755 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -19,7 +19,7 @@ <check_box label="Ativado" name="enable_voice_check"/> <check_box label="Autorizar auto-play de mÃdias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mÃdias, se elas quiserem" value="true"/> <check_box label="Tocar mÃdia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mÃdias anexadas em avatares por perto" value="true"/> - <check_box label="Tocar áudio de gestos" name="gesture_audio_play_btn" tool_tip="Selecione para ouvir o áudio de gestos" value="verdadeiro"/> + <check_box label="Tocar áudio de gestos" name="gesture_audio_play_btn" tool_tip="Selecione para ouvir o áudio de gestos" value="true"/> <text name="voice_chat_settings"> Configuração de bate-papo de voz </text> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index adc3ee14e0..2eb4c0a02e 100755 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -1220,7 +1220,7 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml index d84dc2e941..105c75c919 100755 --- a/indra/newview/skins/default/xui/ru/floater_auction.xml +++ b/indra/newview/skins/default/xui/ru/floater_auction.xml @@ -3,7 +3,7 @@ <floater.string name="already for sale"> ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñтавить на аукцион учаÑтки, которые уже продаютÑÑ. </floater.string> - <check_box initial_value="иÑтина" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/> + <check_box initial_value="true" label="Ð’ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¶ÐµÐ»Ñ‚ÑƒÑŽ ограду вокруг выбранного учаÑтка" name="fence_check"/> <button label="Снимок" label_selected="Снимок" name="snapshot_btn"/> <button label="Купить может каждый" label_selected="Купить может каждый" name="sell_to_anyone_btn"/> <button label="ОчиÑтить наÑтройки" label_selected="ОчиÑтить наÑтройки" name="reset_parcel_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml index 31fc1c5ed3..304bf97dc1 100755 --- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml @@ -39,7 +39,7 @@ </text> <check_box label="ИзменÑÑ‚ÑŒ" name="next_owner_modify"/> <check_box label="Копировать" name="next_owner_copy"/> - <check_box initial_value="иÑтина" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> + <check_box initial_value="true" label="Передать" name="next_owner_transfer" tool_tip="Следующий владелец может отдать или перепродать объект"/> <button label="OK" name="ok"/> <button label="Применить" name="apply"/> <button label="Отмена" name="close"/> diff --git a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml index 43f8c36473..d7da112a27 100755 --- a/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/ru/floater_hardware_settings.xml @@ -24,7 +24,7 @@ <text name="Enable VBO:"> Включить VBO: </text> - <check_box initial_value="иÑтина" label="Включить объекты вершинных буферов OpenGL" name="vbo" tool_tip="Включение Ñтого параметра на Ñовременном оборудовании даÑÑ‚ увеличение производительноÑти. Однако на Ñтаром оборудовании Ñто может привеÑти к Ñбою приложениÑ."/> + <check_box initial_value="true" label="Включить объекты вершинных буферов OpenGL" name="vbo" tool_tip="Включение Ñтого параметра на Ñовременном оборудовании даÑÑ‚ увеличение производительноÑти. Однако на Ñтаром оборудовании Ñто может привеÑти к Ñбою приложениÑ."/> <text name="tc label"> Включить S3TC: </text> diff --git a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml index d8047fc045..fb6e747592 100755 --- a/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml +++ b/indra/newview/skins/default/xui/ru/floater_live_lsleditor.xml @@ -10,6 +10,6 @@ СКРИПТ: [NAME] </floater.string> <button label="СброÑ" label_selected="СброÑ" name="Reset"/> - <check_box initial_value="иÑтина" label="ВыполнÑетÑÑ" name="running"/> - <check_box initial_value="иÑтина" label="Моно" name="mono"/> + <check_box initial_value="true" label="ВыполнÑетÑÑ" name="running"/> + <check_box initial_value="true" label="Моно" name="mono"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml index a704b87bd1..626f3c9321 100755 --- a/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml +++ b/indra/newview/skins/default/xui/ru/floater_perm_prefs.xml @@ -8,7 +8,7 @@ </text> <check_box label="изменÑÑ‚ÑŒ" name="next_owner_modify"/> <check_box label="копировать" name="next_owner_copy"/> - <check_box initial_value="иÑтина" label="перепродавать/отдавать" name="next_owner_transfer"/> + <check_box initial_value="true" label="перепродавать/отдавать" name="next_owner_transfer"/> </panel> <button label="ОК" label_selected="ОК" name="ok"/> <button label="Отмена" label_selected="Отмена" name="cancel"/> diff --git a/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml index 4eecfedf17..13cff2bcbe 100755 --- a/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml +++ b/indra/newview/skins/default/xui/ru/floater_preferences_proxy.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="Proxy Settings Floater" title="ÐаÑтройки прокÑи-Ñервера"> - <check_box initial_value="ложь" label="ИÑпользовать HTTP-прокÑи Ð´Ð»Ñ Ð²ÐµÐ±-Ñтраниц" name="web_proxy_enabled"/> + <check_box initial_value="false" label="ИÑпользовать HTTP-прокÑи Ð´Ð»Ñ Ð²ÐµÐ±-Ñтраниц" name="web_proxy_enabled"/> <text name="http_proxy_label"> HTTP-прокÑи: </text> diff --git a/indra/newview/skins/default/xui/ru/floater_settings_debug.xml b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml index 7db014ef53..db78d11e90 100755 --- a/indra/newview/skins/default/xui/ru/floater_settings_debug.xml +++ b/indra/newview/skins/default/xui/ru/floater_settings_debug.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="settings_debug" title="ÐÐСТРОЙКИ ОТЛÐДКИ"> <radio_group name="boolean_combo"> - <radio_item label="ИСТИÐÐ" name="TRUE" value="иÑтина"/> + <radio_item label="ИСТИÐÐ" name="TRUE" value="true"/> <radio_item label="ЛОЖЬ" name="FALSE" value=""/> </radio_group> <color_swatch label="Цвет" name="val_color_swatch"/> diff --git a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml index a9a21e7d4a..c9e117362f 100755 --- a/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/ru/floater_texture_ctrl.xml @@ -19,10 +19,10 @@ <button label="По умолчанию" label_selected="По умолчанию" name="Default"/> <button label="ОчиÑтить" label_selected="ОчиÑтить" name="Blank"/> <button label="Ðет" label_selected="Ðет" name="None"/> - <check_box initial_value="иÑтина" label="Применить ÑейчаÑ" name="apply_immediate_check"/> + <check_box initial_value="true" label="Применить ÑейчаÑ" name="apply_immediate_check"/> <text name="preview_disabled" value="ПроÑмотр отключен"/> <filter_editor label="Фильтровать текÑтуры" name="inventory search editor"/> - <check_box initial_value="ложь" label="Показывать папки" name="show_folders_check"/> + <check_box initial_value="false" label="Показывать папки" name="show_folders_check"/> <button label="Добавить" label_selected="Добавить" name="l_add_btn"/> <button label="Удалить" label_selected="Удалить" name="l_rem_btn"/> <button label="Передать" label_selected="Передать" name="l_upl_btn"/> diff --git a/indra/newview/skins/default/xui/ru/floater_tools.xml b/indra/newview/skins/default/xui/ru/floater_tools.xml index c312f73428..35921d147f 100755 --- a/indra/newview/skins/default/xui/ru/floater_tools.xml +++ b/indra/newview/skins/default/xui/ru/floater_tools.xml @@ -76,8 +76,8 @@ <text label="РаÑÑ‚Ñжка обеих Ñторон" name="checkbox uniform label"> РаÑÑ‚Ñжка обеих Ñторон </text> - <check_box initial_value="иÑтина" label="РаÑÑ‚Ñгивать текÑтуры" name="checkbox stretch textures"/> - <check_box initial_value="иÑтина" label="ПривÑзка" name="checkbox snap to grid"/> + <check_box initial_value="true" label="РаÑÑ‚Ñгивать текÑтуры" name="checkbox stretch textures"/> + <check_box initial_value="true" label="ПривÑзка" name="checkbox snap to grid"/> <combo_box name="combobox grid mode" tool_tip="Выберите тип линейки Ñетки Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°"> <combo_box.item label="МироваÑ" name="World"/> <combo_box.item label="ЛокальнаÑ" name="Local"/> @@ -101,7 +101,7 @@ <button name="ToolGrass" tool_tip="Трава"/> <check_box label="Держать инÑтрумент" name="checkbox sticky"/> <check_box label="Копировать выдел." name="checkbox copy selection"/> - <check_box initial_value="иÑтина" label="Центрир. копию" name="checkbox copy centers"/> + <check_box initial_value="true" label="Центрир. копию" name="checkbox copy centers"/> <check_box label="Повернуть копию" name="checkbox copy rotates"/> <radio_group name="land_radio_group"> <radio_item label="Выбрать землю" name="radio select land"/> @@ -465,16 +465,11 @@ <combo_box.item label="приÑоÑка" name="suction"/> <combo_box.item label="переплетение" name="weave"/> </combo_box> - <check_box initial_value="ложь" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных граних по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/> - <text name="rpt"> - Повторов на грань - </text> <spinner label="По горизонтали (U)" name="TexScaleU"/> <check_box label="Разворот" name="checkbox flip s"/> <spinner label="По вертикали (V)" name="TexScaleV"/> <check_box label="Разворот" name="checkbox flip t"/> <spinner label="Вращение˚" name="TexRot"/> - <spinner label="Повторов на метр" name="rptctrl"/> <button label="Применить" label_selected="Применить" name="button apply"/> <text name="tex offset"> Сдвиг текÑтуры diff --git a/indra/newview/skins/default/xui/ru/floater_world_map.xml b/indra/newview/skins/default/xui/ru/floater_world_map.xml index ef8dfe22ae..7d2acfd9a0 100755 --- a/indra/newview/skins/default/xui/ru/floater_world_map.xml +++ b/indra/newview/skins/default/xui/ru/floater_world_map.xml @@ -35,7 +35,7 @@ <text name="pg_label"> Общие </text> - <check_box initial_value="иÑтина" name="events_mature_chk"/> + <check_box initial_value="true" name="events_mature_chk"/> <text name="events_mature_label"> Умеренные </text> diff --git a/indra/newview/skins/default/xui/ru/panel_group_general.xml b/indra/newview/skins/default/xui/ru/panel_group_general.xml index 4d7e1c9fff..ba38dbf89e 100755 --- a/indra/newview/skins/default/xui/ru/panel_group_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_group_general.xml @@ -51,6 +51,6 @@ <combo_box.item label="Умеренный контент" name="mature"/> <combo_box.item label="Общий контент" name="pg"/> </combo_box> - <check_box initial_value="иÑтина" label="Показать в поиÑке" name="show_in_group_list" tool_tip="Позволить людÑм видеть Ñту группу в результатах поиÑка"/> + <check_box initial_value="true" label="Показать в поиÑке" name="show_in_group_list" tool_tip="Позволить людÑм видеть Ñту группу в результатах поиÑка"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml index 6dc435db20..d52397832c 100755 --- a/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_media_settings_general.xml @@ -15,14 +15,14 @@ </text> <text name="current_url" tool_tip="Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница Ð´Ð»Ñ Ñтого медиа-иÑточника" value=""/> <button label="СброÑ" name="current_url_reset_btn"/> - <check_box initial_value="ложь" label="ÐвтоматичеÑкое зацикливание" name="auto_loop"/> - <check_box initial_value="ложь" label="Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð½Ð° первый щелчок" name="first_click_interact"/> - <check_box initial_value="ложь" label="Ðвтоувеличение" name="auto_zoom"/> - <check_box initial_value="ложь" label="ÐвтоматичеÑкое проигрывание" name="auto_play"/> + <check_box initial_value="false" label="ÐвтоматичеÑкое зацикливание" name="auto_loop"/> + <check_box initial_value="false" label="Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð½Ð° первый щелчок" name="first_click_interact"/> + <check_box initial_value="false" label="Ðвтоувеличение" name="auto_zoom"/> + <check_box initial_value="false" label="ÐвтоматичеÑкое проигрывание" name="auto_play"/> <text name="media_setting_note"> Примечание. Жители могут переопределÑÑ‚ÑŒ Ñту наÑтройку. </text> - <check_box initial_value="ложь" label="ÐвтомаÑштабирование на объекте" name="auto_scale"/> + <check_box initial_value="false" label="ÐвтомаÑштабирование на объекте" name="auto_scale"/> <text name="size_label"> Размер: </text> diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml index 680cba9c14..cfb006f346 100755 --- a/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml +++ b/indra/newview/skins/default/xui/ru/panel_media_settings_permissions.xml @@ -14,16 +14,16 @@ <text name="owner_label"> Владелец </text> - <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_owner_interact"/> - <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_owner_control"/> + <check_box initial_value="false" label="Разрешить навигацию и взаимодейÑтвие" name="perms_owner_interact"/> + <check_box initial_value="false" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_owner_control"/> <text name="group_label"> Группа: </text> - <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_group_interact"/> - <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_group_control"/> + <check_box initial_value="false" label="Разрешить навигацию и взаимодейÑтвие" name="perms_group_interact"/> + <check_box initial_value="false" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_group_control"/> <text name="anyone_label"> вÑем </text> - <check_box initial_value="ложь" label="Разрешить навигацию и взаимодейÑтвие" name="perms_anyone_interact"/> - <check_box initial_value="ложь" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_anyone_control"/> + <check_box initial_value="false" label="Разрешить навигацию и взаимодейÑтвие" name="perms_anyone_interact"/> + <check_box initial_value="false" label="Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð½Ð°" name="perms_anyone_control"/> </panel> diff --git a/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml index 6b30dc799c..bae491472a 100755 --- a/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml +++ b/indra/newview/skins/default/xui/ru/panel_media_settings_security.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="БезопаÑноÑÑ‚ÑŒ" name="Media Settings Security"> - <check_box initial_value="ложь" label="Разрешить доÑтуп к ÑÑылкам только по шаблону" name="whitelist_enable"/> + <check_box initial_value="false" label="Разрешить доÑтуп к ÑÑылкам только по шаблону" name="whitelist_enable"/> <text name="home_url_fails_some_items_in_whitelist"> Пункты, не подходÑщие Ð´Ð»Ñ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтраницы, отмечены знаком: </text> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml index c7a850f78a..62617caed3 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_general.xml @@ -36,7 +36,7 @@ <combo_box.item label="Мое поÑледнее меÑто" name="MyLastLocation"/> <combo_box.item label="Мой дом" name="MyHome"/> </combo_box> - <check_box initial_value="иÑтина" label="Показывать на Ñкране входа" name="show_location_checkbox"/> + <check_box initial_value="true" label="Показывать на Ñкране входа" name="show_location_checkbox"/> <text name="name_tags_textbox"> Теги имен: </text> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml index 029e72e137..c93955fcdc 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_graphics1.xml @@ -25,14 +25,14 @@ <text name="ShadersText"> Шейдеры: </text> - <check_box initial_value="иÑтина" label="ПрозрачноÑÑ‚ÑŒ воды" name="TransparentWater"/> - <check_box initial_value="иÑтина" label="РельефноÑÑ‚ÑŒ и ÑиÑние" name="BumpShiny"/> - <check_box initial_value="иÑтина" label="Локальный Ñвет" name="LocalLights"/> - <check_box initial_value="иÑтина" label="Базовые шейдеры" name="BasicShaders" tool_tip="Отключение Ñтого параметра может предотвратить завиÑание некоторых видеокарт"/> - <check_box initial_value="иÑтина" label="ÐтмоÑферные шейдеры" name="WindLightUseAtmosShaders"/> - <check_box initial_value="иÑтина" label="РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ оÑвещениÑ" name="UseLightShaders"/> - <check_box initial_value="иÑтина" label="Объемный Ñвет" name="UseSSAO"/> - <check_box initial_value="иÑтина" label="Глубина полÑ" name="UseDoF"/> + <check_box initial_value="true" label="ПрозрачноÑÑ‚ÑŒ воды" name="TransparentWater"/> + <check_box initial_value="true" label="РельефноÑÑ‚ÑŒ и ÑиÑние" name="BumpShiny"/> + <check_box initial_value="true" label="Локальный Ñвет" name="LocalLights"/> + <check_box initial_value="true" label="Базовые шейдеры" name="BasicShaders" tool_tip="Отключение Ñтого параметра может предотвратить завиÑание некоторых видеокарт"/> + <check_box initial_value="true" label="ÐтмоÑферные шейдеры" name="WindLightUseAtmosShaders"/> + <check_box initial_value="true" label="РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ оÑвещениÑ" name="UseLightShaders"/> + <check_box initial_value="true" label="Объемный Ñвет" name="UseSSAO"/> + <check_box initial_value="true" label="Глубина полÑ" name="UseDoF"/> <text name="shadows_label"> Тени: </text> @@ -95,9 +95,9 @@ <text name="AvatarRenderingText"> ОтриÑовка аватара: </text> - <check_box initial_value="иÑтина" label="ПлоÑкие аватары" name="AvatarImpostors"/> - <check_box initial_value="иÑтина" label="ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ñовка" name="AvatarVertexProgram"/> - <check_box initial_value="иÑтина" label="Одежда аватара" name="AvatarCloth"/> + <check_box initial_value="true" label="ПлоÑкие аватары" name="AvatarImpostors"/> + <check_box initial_value="true" label="ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¾Ñ‚Ñ€Ð¸Ñовка" name="AvatarVertexProgram"/> + <check_box initial_value="true" label="Одежда аватара" name="AvatarCloth"/> <text name="TerrainDetailText"> Ландшафт: </text> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml index e9c0c7de10..1741397a84 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_setup.xml @@ -18,10 +18,10 @@ <radio_item label="ИÑпользовать мой браузер (IE, Firefox, Safari)" name="external" tool_tip="Будет иÑпользоватьÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€, заданный в ÑиÑтеме по умолчанию. Ðе рекомендуетÑÑ, еÑли [APP_NAME] работает в полноÑкранном режиме." value="true"/> <radio_item label="ИÑпользовать вÑтроенный браузер" name="internal" tool_tip="Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñправки, ÑÑылок на веб-Ñтраницы и Ñ‚. д. будет иÑпользоватьÑÑ Ð²Ñтроенный браузер. Ðтот браузер открываетÑÑ ÐºÐ°Ðº новое окно в [APP_NAME]." value=""/> </radio_group> - <check_box initial_value="иÑтина" label="Разрешить плагины" name="browser_plugins_enabled"/> - <check_box initial_value="иÑтина" label="Принимать файлы cookie" name="cookies_enabled"/> - <check_box initial_value="иÑтина" label="Разрешить Javascript" name="browser_javascript_enabled"/> - <check_box initial_value="ложь" label="Разрешить вÑплывающие окна" name="media_popup_enabled"/> + <check_box initial_value="true" label="Разрешить плагины" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Принимать файлы cookie" name="cookies_enabled"/> + <check_box initial_value="true" label="Разрешить Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Разрешить вÑплывающие окна" name="media_popup_enabled"/> <text name="Software updates:"> ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐŸÐž: </text> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml index bf673750d2..44f270527c 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_sound.xml @@ -4,7 +4,7 @@ Ñреднюю кнопку мыши </panel.string> <slider label="ÐžÐ±Ñ‰Ð°Ñ Ð³Ñ€Ð¾Ð¼ÐºÐ¾ÑÑ‚ÑŒ" name="System Volume"/> - <check_box initial_value="иÑтина" name="mute_when_minimized"/> + <check_box initial_value="true" name="mute_when_minimized"/> <text name="mute_chb_label"> Заглушать, когда Ñвернуто </text> @@ -17,9 +17,9 @@ <check_box label="Включено" name="enable_media"/> <slider label="ГолоÑовой чат" name="Voice Volume"/> <check_box label="Включено" name="enable_voice_check"/> - <check_box label="Разрешить автовоÑпроизведение медиа" name="media_auto_play_btn" tool_tip="УÑтановка флажка позволит вам автоматичеÑки воÑпроизводить медиа" value="иÑтина"/> - <check_box label="ВоÑпроизводить медиа, приÑоединенные к другому аватару" name="media_show_on_others_btn" tool_tip="СнÑтие флажка Ñкроет медиа, приÑоединенные к другому аватару" value="иÑтина"/> - <check_box label="Сопровождать жеÑÑ‚Ñ‹ звуками" name="gesture_audio_play_btn" tool_tip="УÑтановите флажок, чтобы Ñлышать звуки при жеÑтах" value="иÑтина"/> + <check_box label="Разрешить автовоÑпроизведение медиа" name="media_auto_play_btn" tool_tip="УÑтановка флажка позволит вам автоматичеÑки воÑпроизводить медиа" value="true"/> + <check_box label="ВоÑпроизводить медиа, приÑоединенные к другому аватару" name="media_show_on_others_btn" tool_tip="СнÑтие флажка Ñкроет медиа, приÑоединенные к другому аватару" value="true"/> + <check_box label="Сопровождать жеÑÑ‚Ñ‹ звуками" name="gesture_audio_play_btn" tool_tip="УÑтановите флажок, чтобы Ñлышать звуки при жеÑтах" value="true"/> <text name="voice_chat_settings"> ÐаÑтройки голоÑового чата </text> diff --git a/indra/newview/skins/default/xui/ru/panel_tools_texture.xml b/indra/newview/skins/default/xui/ru/panel_tools_texture.xml index 60717a3d1d..1abf729487 100644 --- a/indra/newview/skins/default/xui/ru/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/ru/panel_tools_texture.xml @@ -112,5 +112,5 @@ <spinner label="Поворот, градуÑÑ‹" name="shinyRot"/> <spinner label="Смещение по горизонтали" name="shinyOffsetU"/> <spinner label="Смещение по вертикали" name="shinyOffsetV"/> - <check_box initial_value="ложь" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных гранÑÑ… по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/> + <check_box initial_value="false" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных гранÑÑ… по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/> </panel> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index 49ce33ec96..0f71edcee0 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -1271,7 +1271,7 @@ support@secondlife.com. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index 4bf0372a8a..39a3569efa 100755 --- a/indra/newview/skins/default/xui/tr/floater_tools.xml +++ b/indra/newview/skins/default/xui/tr/floater_tools.xml @@ -465,16 +465,11 @@ <combo_box.item label="vakum" name="suction"/> <combo_box.item label="örgü" name="weave"/> </combo_box> - <check_box initial_value="false" label="Planar yüzleri hizala" name="checkbox planar align" tool_tip="Tüm seçili yüzeylerdeki dokuları son seçili yüzdekiyle hizalar. Planar doku eÅŸleÅŸtirmesi gerektirir."/> - <text name="rpt"> - Tekrarlar / Yüz - </text> <spinner label="Yatay (U)" name="TexScaleU"/> <check_box label="Çevir" name="checkbox flip s"/> <spinner label="Dikey (V)" name="TexScaleV"/> <check_box label="Çevir" name="checkbox flip t"/> <spinner label="Döndürme*" name="TexRot"/> - <spinner label="Tekrarlar / Metre" name="rptctrl"/> <button label="Uygula" label_selected="Uygula" name="button apply"/> <text name="tex offset"> Doku Dengeleyicisi diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 5a809ea783..c4b1530b2b 100755 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -1271,7 +1271,7 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. https://marketplace.[MARKETPLACE_DOMAIN_NAME]/ </string> <string name="MarketplaceURL_CreateStore"> - http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.4 + http://community.secondlife.com/t5/English-Knowledge-Base/Selling-in-the-Marketplace/ta-p/700193#Section_.3 </string> <string name="MarketplaceURL_Dashboard"> https://marketplace.[MARKETPLACE_DOMAIN_NAME]/merchants/store/dashboard diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index 33c9ebeaf0..7e6c972f40 100755 --- a/indra/newview/skins/default/xui/zh/floater_tools.xml +++ b/indra/newview/skins/default/xui/zh/floater_tools.xml @@ -465,16 +465,11 @@ <combo_box.item label="å¸é™„" name="suction"/> <combo_box.item label="編織" name="weave"/> </combo_box> - <check_box initial_value="false" label="å°é½Šå¹³é¢" name="checkbox planar align" tool_tip="以最後所é¸æ“‡çš„é¢ç‚ºåŸºæº–,å°é½Šå…¨éƒ¨æ‰€é¸æ“‡çš„é¢ä¸Šçš„æ質。 é€™å¿…é ˆä½¿ç”¨å¹³é¢æè³ªæ˜ å°„æ–¹å¼ã€‚"/> - <text name="rpt"> - é‡è¦†æ¬¡æ•¸ / é¢ - </text> <spinner label="水平(U)" name="TexScaleU"/> <check_box label="翻轉" name="checkbox flip s"/> <spinner label="垂直(V)" name="TexScaleV"/> <check_box label="翻轉" name="checkbox flip t"/> <spinner label="旋轉˚" name="TexRot"/> - <spinner label="é‡è¦†æ¬¡æ•¸ / 公尺" name="rptctrl"/> <button label="套用" label_selected="套用" name="button apply"/> <text name="tex offset"> æ質ä½ç§» diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml index 0fcc49b203..ab4d9a881d 100755 --- a/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_setup.xml @@ -15,7 +15,7 @@ 網é : </text> <radio_group name="use_external_browser"> - <radio_item label="使用我的網é ç€è¦½å™¨ï¼ˆä¾‹å¦‚ IE, Firefox, Safari)" name="external" tool_tip="使用系統é è¨çš„ç€è¦½å™¨ç€è¦½å¹«åŠ©ï¼Œé–‹å•Ÿç¶²é 。全螢幕模å¼ä¸‹ä¸å»ºè°é€™éº¼åšã€‚" value="1"/> + <radio_item label="使用我的網é ç€è¦½å™¨ï¼ˆä¾‹å¦‚ IE, Firefox, Safari)" name="external" tool_tip="使用系統é è¨çš„ç€è¦½å™¨ç€è¦½å¹«åŠ©ï¼Œé–‹å•Ÿç¶²é 。全螢幕模å¼ä¸‹ä¸å»ºè°é€™éº¼åšã€‚" value="true"/> <radio_item label="使用內建網é ç€è¦½å™¨" name="internal" tool_tip="使用內建的ç€è¦½å™¨ç€è¦½å¹«åŠ©ï¼Œé–‹å•Ÿç¶²é 。該ç€è¦½å™¨å°‡é€éŽ [APP_NAME] 開啟新視窗。" value=""/> </radio_group> <check_box initial_value="true" label="啟用外掛" name="browser_plugins_enabled"/> diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt index 68e2e688cb..106593afd5 100755 --- a/indra/newview/tests/gpus_results.txt +++ b/indra/newview/tests/gpus_results.txt @@ -1,1726 +1,3111 @@ -GPU String Supported? Class Recognizer ------------------------------------------------------------------------------------------------------- ----------- ----- ------------------------------------ -ATI NO MATCH -ATI 3D-Analyze unsupported 0 ATI 3D-Analyze -ATI ASUS A9xxx supported 1 ATI ASUS A9xxx -ATI ASUS AH24xx supported 1 ATI ASUS AH24xx -ATI ASUS AH26xx supported 3 ATI ASUS AH26xx -ATI ASUS AH34xx supported 1 ATI ASUS AH34xx -ATI ASUS AH36xx supported 3 ATI ASUS AH36xx -ATI ASUS AH46xx supported 3 ATI ASUS AH46xx -ATI ASUS AX3xx supported 1 ATI ASUS AX3xx -ATI ASUS AX5xx supported 1 ATI ASUS AX5xx -ATI ASUS AX8xx supported 2 ATI ASUS AX8xx -ATI ASUS EAH38xx supported 3 ATI ASUS EAH38xx -ATI ASUS EAH43xx supported 1 ATI ASUS EAH43xx -ATI ASUS EAH45xx supported 1 ATI ASUS EAH45xx -ATI ASUS EAH48xx supported 3 ATI ASUS EAH48xx -ATI ASUS EAH57xx supported 3 ATI ASUS EAH57xx -ATI ASUS EAH58xx supported 3 ATI ASUS EAH58xx -ATI ASUS X1xxx supported 3 ATI ASUS Radeon X1xxx -ATI All-in-Wonder 9xxx supported 1 ATI All-in-Wonder 9xxx -ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD -ATI All-in-Wonder PCI-E supported 1 ATI All-in-Wonder PCI-E -ATI All-in-Wonder X1800 supported 3 ATI All-in-Wonder X1800 -ATI All-in-Wonder X1900 supported 3 ATI All-in-Wonder X1900 -ATI All-in-Wonder X600 supported 1 ATI All-in-Wonder X600 -ATI All-in-Wonder X800 supported 2 ATI All-in-Wonder X800 -ATI Diamond X1xxx supported 1 ATI Radeon X1xxx -ATI Display Adapter supported 0 ATI Display Adapter -ATI FireGL supported 0 ATI FireGL -ATI FireGL 5200 supported 0 ATI FireGL -ATI FireGL 5xxx supported 0 ATI FireGL -ATI FireMV supported 0 ATI FireMV -ATI Generic unsupported 0 ATI Generic -ATI Hercules 9800 supported 1 ATI Hercules 9800 -ATI IGP 340M unsupported 0 ATI IGP 340M -ATI M52 supported 1 ATI M52 -ATI M54 supported 1 ATI M54 -ATI M56 supported 1 ATI M56 -ATI M71 supported 1 ATI M71 -ATI M72 supported 1 ATI M72 -ATI M76 supported 3 ATI M76 -ATI Mobility Radeon supported 0 ATI Radeon -ATI Mobility Radeon 7xxx supported 0 ATI Mobility Radeon 7xxx -ATI Mobility Radeon 9600 supported 0 ATI Mobility Radeon 9600 -ATI Mobility Radeon 9700 supported 1 ATI Mobility Radeon 9700 -ATI Mobility Radeon 9800 supported 1 ATI Mobility Radeon 9800 -ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300 -ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400 -ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600 -ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700 -ATI Mobility Radeon HD 3400 supported 2 ATI Mobility Radeon HD 3400 -ATI Mobility Radeon HD 3600 supported 3 ATI Mobility Radeon HD 3600 -ATI Mobility Radeon HD 3800 supported 3 ATI Mobility Radeon HD 3800 -ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 -ATI Mobility Radeon HD 4300 supported 2 ATI Mobility Radeon HD 4300 -ATI Mobility Radeon HD 4500 supported 3 ATI Mobility Radeon HD 4500 -ATI Mobility Radeon HD 4600 supported 3 ATI Mobility Radeon HD 4600 -ATI Mobility Radeon HD 4800 supported 3 ATI Mobility Radeon HD 4800 -ATI Mobility Radeon HD 5400 supported 3 ATI Mobility Radeon HD 5400 -ATI Mobility Radeon HD 5600 supported 3 ATI Mobility Radeon HD 5600 -ATI Mobility Radeon X1xxx supported 1 ATI Radeon X1xxx -ATI Mobility Radeon X2xxx supported 1 ATI Radeon X2xxx -ATI Mobility Radeon X3xx supported 0 ATI Radeon X300 -ATI Mobility Radeon X6xx supported 1 ATI Radeon X600 -ATI Mobility Radeon X7xx supported 1 ATI Radeon X700 -ATI Mobility Radeon Xxxx supported 0 ATI Radeon -ATI RV380 supported 0 ATI RV380 -ATI RV530 supported 1 ATI RV530 -ATI Radeon 2100 supported 0 ATI Radeon 2100 -ATI Radeon 3000 supported 0 ATI Radeon 3000 -ATI Radeon 3100 supported 1 ATI Radeon 3100 -ATI Radeon 7000 supported 0 ATI Radeon 7xxx -ATI Radeon 7xxx supported 0 ATI Radeon 7xxx -ATI Radeon 8xxx supported 0 ATI Radeon 8xxx -ATI Radeon 9000 supported 0 ATI Radeon 9000 -ATI Radeon 9100 supported 0 ATI Radeon 9100 -ATI Radeon 9200 supported 0 ATI Radeon 9200 -ATI Radeon 9500 supported 0 ATI Radeon 9500 -ATI Radeon 9600 supported 0 ATI Radeon 9600 -ATI Radeon 9700 supported 1 ATI Radeon 9700 -ATI Radeon 9800 supported 1 ATI Radeon 9800 -ATI Radeon HD 2300 supported 0 ATI Radeon HD 2300 -ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400 -ATI Radeon HD 2600 supported 2 ATI Radeon HD 2600 -ATI Radeon HD 2900 supported 3 ATI Radeon HD 2900 -ATI Radeon HD 3000 supported 0 ATI Radeon HD 3000 -ATI Radeon HD 3100 supported 1 ATI Radeon HD 3100 -ATI Radeon HD 3200 supported 1 ATI Radeon HD 3200 -ATI Radeon HD 3300 supported 1 ATI Radeon HD 3300 -ATI Radeon HD 3400 supported 1 ATI Radeon HD 3400 -ATI Radeon HD 3600 supported 3 ATI Radeon HD 3600 -ATI Radeon HD 3800 supported 3 ATI Radeon HD 3800 -ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200 -ATI Radeon HD 4300 supported 1 ATI Radeon HD 4300 -ATI Radeon HD 4500 supported 3 ATI Radeon HD 4500 -ATI Radeon HD 4600 supported 3 ATI Radeon HD 4600 -ATI Radeon HD 4700 supported 3 ATI Radeon HD 4700 -ATI Radeon HD 4800 supported 3 ATI Radeon HD 4800 -ATI Radeon HD 5400 supported 3 ATI Radeon HD 5400 -ATI Radeon HD 5500 supported 3 ATI Radeon HD 5500 -ATI Radeon HD 5600 supported 3 ATI Radeon HD 5600 -ATI Radeon HD 5700 supported 3 ATI Radeon HD 5700 -ATI Radeon HD 5800 supported 3 ATI Radeon HD 5800 -ATI Radeon HD 5900 supported 3 ATI Radeon HD 5900 -ATI Radeon HD 6200 supported 3 ATI Radeon HD 6200 -ATI Radeon HD 6300 supported 3 ATI Radeon HD 6300 -ATI Radeon HD 6500 supported 3 ATI Radeon HD 6500 -ATI Radeon HD 6800 supported 3 ATI Radeon HD 6800 -ATI Radeon HD 6900 supported 3 ATI Radeon HD 6900 -ATI Radeon OpenGL unsupported 0 ATI Radeon OpenGL -ATI Radeon RV250 supported 0 ATI Radeon RV250 -ATI Radeon RV600 supported 1 ATI Radeon RV600 -ATI Radeon RX9550 supported 1 ATI Radeon RX9550 -ATI Radeon VE unsupported 0 ATI Radeon VE -ATI Radeon X1000 supported 1 ATI Radeon X1xxx -ATI Radeon X1200 supported 1 ATI Radeon X1xxx -ATI Radeon X1300 supported 1 ATI Radeon X13xx -ATI Radeon X13xx supported 1 ATI Radeon X13xx -ATI Radeon X1400 supported 1 ATI Radeon X1xxx -ATI Radeon X1500 supported 2 ATI Radeon X15xx -ATI Radeon X1600 supported 2 ATI Radeon X16xx -ATI Radeon X16xx supported 2 ATI Radeon X16xx -ATI Radeon X1700 supported 2 ATI Radeon X17xx -ATI Radeon X1800 supported 3 ATI Radeon X18xx -ATI Radeon X1900 supported 3 ATI Radeon X19xx -ATI Radeon X19xx supported 3 ATI Radeon X19xx -ATI Radeon X1xxx supported 1 ATI Radeon X1xxx -ATI Radeon X300 supported 0 ATI Radeon X300 -ATI Radeon X500 supported 0 ATI Radeon X500 -ATI Radeon X600 supported 1 ATI Radeon X600 -ATI Radeon X700 supported 1 ATI Radeon X700 -ATI Radeon X7xx supported 1 ATI Radeon X700 -ATI Radeon X800 supported 2 ATI Radeon X800 -ATI Radeon Xpress supported 0 ATI Radeon Xpress -ATI Rage 128 supported 0 ATI Rage 128 -ATI Technologies Inc. supported 0 ATI Technologies -ATI Technologies Inc. x86 supported 0 ATI Technologies -ATI Technologies Inc. x86/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. AMD 760G supported 1 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) supported 1 ATI 760G/Radeon 3000 -ATI Technologies Inc. AMD 780L supported 1 ATI 780L/Radeon 3000 -ATI Technologies Inc. AMD FirePro 2270 supported 1 ATI FirePro 2000 -ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. AMD RADEON HD 6350 supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD RADEON HD 6450 supported 3 ATI Radeon HD 6400 -ATI Technologies Inc. AMD RADEON HD 6670 supported 3 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 ATI Technologies -ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 3 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 3 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 3 ATI Radeon HD 6200 -ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6310M supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6330M supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6350 supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6370M supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 ATI Radeon HD 64xx -ATI Technologies Inc. AMD Radeon HD 6450 supported 3 ATI Radeon HD 6400 -ATI Technologies Inc. AMD Radeon HD 6470M supported 3 ATI Radeon HD 64xx -ATI Technologies Inc. AMD Radeon HD 6490M supported 3 ATI Radeon HD 64xx -ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6500M Series supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6530M supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6550M supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6570 supported 3 ATI Radeon HD 6500 -ATI Technologies Inc. AMD Radeon HD 6570M supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6600M Series supported 3 ATI Radeon HD 66xx -ATI Technologies Inc. AMD Radeon HD 6630M supported 3 ATI Radeon HD 66xx -ATI Technologies Inc. AMD Radeon HD 6650M supported 3 ATI Radeon HD 66xx -ATI Technologies Inc. AMD Radeon HD 6670 supported 3 ATI Radeon HD 6600 -ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6750 supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6750M supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6770 supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6770M supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. AMD Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6800M Series supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850 supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6850M supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6870 supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6870M supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. AMD Radeon HD 6900 Series supported 3 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6900M Series supported 3 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6970M supported 3 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon HD 6990 supported 3 ATI Radeon HD 6900 -ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 ATI Radeon HD 64xx -ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 ATI Radeon HD 64xx -ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 3 ATI Radeon HD 65xx -ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 3 ATI Radeon HD 66xx -ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 3 ATI Radeon HD 66xx -ATI Technologies Inc. ASUS 5870 Eyefinity 6 supported 0 ATI Technologies -ATI Technologies Inc. ASUS A9550 Series supported 1 ATI ASUS A9xxx -ATI Technologies Inc. ASUS AH2600 Series supported 3 ATI ASUS AH26xx -ATI Technologies Inc. ASUS AH3450 Series supported 1 ATI ASUS AH34xx -ATI Technologies Inc. ASUS AH3650 Series supported 3 ATI ASUS AH36xx -ATI Technologies Inc. ASUS AH4650 Series supported 3 ATI ASUS AH46xx -ATI Technologies Inc. ASUS ARES supported 3 ATI ASUS ARES -ATI Technologies Inc. ASUS EAH2900 Series supported 3 ATI ASUS EAH29xx -ATI Technologies Inc. ASUS EAH3450 Series supported 1 ATI ASUS AH34xx -ATI Technologies Inc. ASUS EAH3650 Series supported 3 ATI ASUS AH36xx -ATI Technologies Inc. ASUS EAH4350 series supported 1 ATI ASUS EAH43xx -ATI Technologies Inc. ASUS EAH4550 series supported 1 ATI ASUS EAH45xx -ATI Technologies Inc. ASUS EAH4650 series supported 3 ATI ASUS AH46xx -ATI Technologies Inc. ASUS EAH4670 series supported 3 ATI ASUS AH46xx -ATI Technologies Inc. ASUS EAH4750 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH4770 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH4770 series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH4850 series supported 3 ATI ASUS EAH48xx -ATI Technologies Inc. ASUS EAH5450 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH5550 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH5570 series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH5670 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH5750 Series supported 3 ATI ASUS EAH57xx -ATI Technologies Inc. ASUS EAH5770 Series supported 3 ATI ASUS EAH57xx -ATI Technologies Inc. ASUS EAH5830 Series supported 3 ATI ASUS EAH58xx -ATI Technologies Inc. ASUS EAH5850 Series supported 3 ATI ASUS EAH58xx -ATI Technologies Inc. ASUS EAH5870 Series supported 3 ATI ASUS EAH58xx -ATI Technologies Inc. ASUS EAH5970 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS EAH6450 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6570 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6670 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6850 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6870 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6950 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAH6970 Series supported 3 ATI ASUS EAH6xxx -ATI Technologies Inc. ASUS EAHG4670 series supported 0 ATI Technologies -ATI Technologies Inc. ASUS Extreme AX600 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS Extreme AX600XT-TD supported 0 ATI Technologies -ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx -ATI Technologies Inc. ASUS X1550 Series supported 3 ATI ASUS Radeon X1xxx -ATI Technologies Inc. ASUS X1950 Series x86/SSE2 supported 3 ATI ASUS Radeon X1xxx -ATI Technologies Inc. ASUS X800 Series supported 0 ATI Technologies -ATI Technologies Inc. ASUS X850 Series supported 0 ATI Technologies -ATI Technologies Inc. ATI All-in-Wonder HD supported 1 ATI All-in-Wonder HD -ATI Technologies Inc. ATI FirePro 2260 supported 1 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro 2450 supported 1 ATI FirePro 2000 -ATI Technologies Inc. ATI FirePro M5800 supported 3 ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 supported 3 ATI FirePro M7740 -ATI Technologies Inc. ATI FirePro M7820 supported 3 ATI FirePro M7820 -ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 0 ATI FireGL -ATI Technologies Inc. ATI FirePro V3800 supported 1 ATI FirePro 3000 -ATI Technologies Inc. ATI FirePro V4800 supported 2 ATI FirePro 4000 -ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 0 ATI FireGL -ATI Technologies Inc. ATI FirePro V5800 supported 3 ATI FirePro 5000 -ATI Technologies Inc. ATI FirePro V7800 supported 3 ATI FirePro 7000 -ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 ATI Mobility Radeon 9700 -ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 3 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 ATI Radeon X16xx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 0 ATI Radeon X300 -ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 ATI Radeon X600 -ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 1 ATI Radeon X700 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Mobility FireGL V5700 supported 1 ATI FireGL 5xxx -ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 ATI Mobility Radeon 4100 -ATI Technologies Inc. ATI Mobility Radeon Graphics supported 0 ATI Technologies -ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 1 ATI Mobility Radeon HD 2300 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 3 ATI Mobility Radeon HD 2600 -ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 ATI Mobility Radeon HD 2700 -ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 2 ATI Mobility Radeon HD 3400 -ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 3 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 3 ATI Mobility Radeon HD 3600 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 2 ATI Mobility Radeon HD 4200 -ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 2 ATI Mobility Radeon HD 4300 -ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 3 ATI Mobility Radeon HD 4500 -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 3 ATI Mobility Radeon HD 4600 -ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 ATI Mobility Radeon HD 4800 -ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 0 ATI Technologies -ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 0 ATI Technologies -ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 ATI Mobility Radeon HD 5100 -ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 2 ATI Mobility Radeon HD 540v -ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 ATI Mobility Radeon HD 545v -ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 2 ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 2 ATI Mobility Radeon HD 560v -ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 ATI Mobility Radeon HD 5600 -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 ATI Mobility Radeon HD 5700 -ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Mobility Radeon HD 6300 series supported 3 ATI Mobility Radeon HD 6300 -ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 3 ATI Mobility Radeon HD 6300 -ATI Technologies Inc. ATI Mobility Radeon HD 6470M supported 3 ATI Mobility Radeon HD 6400M -ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 ATI Mobility Radeon HD 6500M -ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 ATI Mobility Radeon HD 6500M -ATI Technologies Inc. ATI Mobility Radeon X1300 supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Mobility Radeon X1350 supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Mobility Radeon X1400 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 ATI Radeon X16xx -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 ATI Radeon X16xx -ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 ATI Radeon X17xx -ATI Technologies Inc. ATI Mobility Radeon X2300 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2500 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 ATI Mobility Radeon HD 530v -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 3 ATI Mobility Radeon HD 5400 -ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO supported 1 ATI Radeon HD 3200 -ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon 2100 supported 0 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) supported 0 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 3000 supported 0 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 Graphics supported 0 ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3100 Graphics supported 1 ATI Radeon 3100 -ATI Technologies Inc. ATI Radeon 5xxx series supported 3 ATI Radeon 5xxx -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) supported 0 ATI Radeon 9500 -ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 ATI Radeon 9600 -ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 AMD CEDAR (HD 5450) -ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine supported 3 AMD CYPRESS (HD 5800) -ATI Technologies Inc. ATI Radeon Graphics Processor supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon HD 2200 Graphics supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon HD 2350 supported 0 ATI Radeon HD 2300 -ATI Technologies Inc. ATI Radeon HD 2400 supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 ATI Radeon HD 2600 -ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 ATI Radeon HD 2900 -ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 ATI Radeon HD 3200 -ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 ATI Radeon HD 3300 -ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 supported 1 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 supported 1 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 ATI Radeon HD 3400 -ATI Technologies Inc. ATI Radeon HD 3550 supported 1 ATI Radeon HD 3500 -ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 supported 3 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 ATI Radeon HD 3600 -ATI Technologies Inc. ATI Radeon HD 3730 supported 3 ATI Radeon HD 3700 -ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 supported 3 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 supported 3 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 ATI Radeon HD 3800 -ATI Technologies Inc. ATI Radeon HD 4200 supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4270 supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4290 supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample) supported 1 ATI Radeon HD 4200 -ATI Technologies Inc. ATI Radeon HD 4300 Series supported 1 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 1 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 supported 1 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) supported 1 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD 4450 supported 1 ATI Radeon HD 4400 -ATI Technologies Inc. ATI Radeon HD 4500 Series supported 3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4550 supported 3 ATI Radeon HD 4500 -ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4650 supported 3 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 supported 3 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4720 supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4750 supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4770 supported 3 ATI Radeon HD 4700 -ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 ATI Radeon HD 4800 -ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5450 supported 3 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5470 supported 3 ATI Radeon HD 5400 -ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5570 supported 3 ATI Radeon HD 5500 -ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5630 supported 3 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 supported 3 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600 -ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 supported 3 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 supported 3 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700 -ATI Technologies Inc. ATI Radeon HD 5800 Series supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5850 supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 3 ATI Radeon HD 5800 -ATI Technologies Inc. ATI Radeon HD 5900 Series supported 3 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 5970 supported 3 ATI Radeon HD 5900 -ATI Technologies Inc. ATI Radeon HD 6230 supported 3 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6250 supported 3 ATI Radeon HD 6200 -ATI Technologies Inc. ATI Radeon HD 6350 supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6390 supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400 -ATI Technologies Inc. ATI Radeon HD 6510 supported 3 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6570M supported 3 ATI Radeon HD 6500 -ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 ATI Radeon HD 6600 -ATI Technologies Inc. ATI Radeon HD 6750 supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770 supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700 -ATI Technologies Inc. ATI Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900 -ATI Technologies Inc. ATI Radeon HD3750 supported 3 ATI Radeon HD 3700 -ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 1 ATI Radeon HD 4300 -ATI Technologies Inc. ATI Radeon HD4670 supported 3 ATI Radeon HD 4600 -ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine supported 3 AMD JUNIPER (HD 5700) -ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine supported 1 AMD RV710 (HD 4300) -ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 AMD RV730 (HD 4600) -ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine supported 3 AMD RV770 (HD 4800) -ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 AMD RV790 (HD 4800) -ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600) -ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 AMD REDWOOD (HD 5500/5600) -ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine supported 0 ATI Technologies -ATI Technologies Inc. ATI Radeon X1050 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1050 Series supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200 Series supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1250 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1270 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X1xxx -ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx -ATI Technologies Inc. ATI Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 ATI Radeon X16xx -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 3 ATI Radeon X19xx -ATI Technologies Inc. ATI Radeon X1950 GT supported 3 ATI Radeon X19xx -ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300 -ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. ATI Yamaha HD 9000 supported 0 ATI Technologies -ATI Technologies Inc. ATi RS880M supported 1 ATI RS880M -ATI Technologies Inc. Carte graphique VGA standard supported 0 ATI Technologies -ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. EG JUNIPER supported 3 AMD JUNIPER (HD 5700) -ATI Technologies Inc. EG PARK supported 3 AMD PARK -ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 0 ATI FireGL -ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 ATI FireMV -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 ATI FireMV -ATI Technologies Inc. GeCube Radeon X1550 supported 2 ATI Radeon X15xx -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 supported 2 ATI Geforce 9600 GT -ATI Technologies Inc. Geforce 9500 GT supported 2 ATI Geforce 9500 GT -ATI Technologies Inc. Geforce 9500GT supported 2 ATI Geforce 9500 GT -ATI Technologies Inc. Geforce 9800 GT supported 2 ATI Geforce 9800 GT -ATI Technologies Inc. HD3730 supported 0 ATI Technologies -ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 ATI Radeon 9500 -ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO supported 0 ATI Technologies -ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. M76M supported 3 ATI M76 -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 ATI Mobility Radeon 7xxx -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9000 -ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 0 ATI Mobility Radeon 9600 -ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 1 ATI Mobility Radeon 9700 -ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 ATI Radeon X600 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86 supported 1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 1 ATI Radeon X700 -ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. MSI RX9550SE supported 1 ATI Radeon RX9550 -ATI Technologies Inc. MSI Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. Mobility Radeon HD 6000 series supported 0 ATI Technologies -ATI Technologies Inc. Mobility Radeon X2300 HD supported 1 ATI Radeon X2xxx -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 1 ATI Radeon X2xxx -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 ATI Radeon 9100 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 ATI Radeon 9200 -ATI Technologies Inc. RADEON 9500 supported 0 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 ATI Radeon 9500 -ATI Technologies Inc. RADEON 9600 SERIES supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2 supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 ATI Radeon 9600 -ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE supported 1 ATI Radeon 9700 -ATI Technologies Inc. RADEON 9800 PRO supported 1 ATI Radeon 9800 -ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 ATI Radeon 9800 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 ATI IGP 340M -ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. RADEON X300 x86/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500 -ATI Technologies Inc. RADEON X550 x86/SSE2 supported 0 ATI Radeon X500 -ATI Technologies Inc. RADEON X600 Series supported 1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 ATI Radeon X600 -ATI Technologies Inc. RADEON X600/X550 Series supported 1 ATI Radeon X600 -ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 1 ATI Radeon X700 -ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X800 -ATI Technologies Inc. RADEON X800 XT supported 2 ATI Radeon X800 -ATI Technologies Inc. RADEON X800GT supported 2 ATI Radeon X800 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 ATI Radeon Xpress -ATI Technologies Inc. RS740 supported 0 ATI Technologies -ATI Technologies Inc. RS780C supported 0 AMD RS780 (HD 3200) -ATI Technologies Inc. RS780M supported 0 AMD RS780 (HD 3200) -ATI Technologies Inc. RS880 supported 1 AMD RS880 (HD 4200) -ATI Technologies Inc. RV410 Pro x86/SSE2 supported 1 ATI RV410 (X700) -ATI Technologies Inc. RV790 supported 3 AMD RV790 (HD 4800) -ATI Technologies Inc. Radeon (TM) HD 6470M supported 0 ATI Technologies -ATI Technologies Inc. Radeon (TM) HD 6490M supported 0 ATI Technologies -ATI Technologies Inc. Radeon (TM) HD 6750M supported 0 ATI Technologies -ATI Technologies Inc. Radeon (TM) HD 6770M supported 0 ATI Technologies -ATI Technologies Inc. Radeon (TM) HD 6850M supported 0 ATI Technologies -ATI Technologies Inc. Radeon 7000 DDR x86/SSE supported 0 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 ATI Radeon 7xxx -ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 supported 0 ATI Radeon 9000 -ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon DDR -ATI Technologies Inc. Radeon DDR x86/SSE supported 0 ATI Radeon DDR -ATI Technologies Inc. Radeon DDR x86/SSE2 supported 0 ATI Radeon DDR -ATI Technologies Inc. Radeon HD 6310 supported 3 ATI Radeon HD 6300 -ATI Technologies Inc. Radeon HD 6470M supported 3 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6490M supported 3 ATI Radeon HD 6400 -ATI Technologies Inc. Radeon HD 6800 Series supported 3 ATI Radeon HD 6800 -ATI Technologies Inc. Radeon SDR x86/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. Radeon X1300 Series supported 1 ATI Radeon X13xx -ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. Radeon X1300/X1550 Series supported 1 ATI Radeon X13xx -ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 1 ATI Radeon X13xx -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) supported 2 ATI Radeon X15xx -ATI Technologies Inc. Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx -ATI Technologies Inc. Radeon X1600 supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1600 Series supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1600/1650 Series supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1650 Series supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 ATI Radeon X16xx -ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx -ATI Technologies Inc. Radeon X1950 Pro supported 3 ATI Radeon X19xx -ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 3 ATI Radeon X19xx -ATI Technologies Inc. Radeon X1950 Series supported 3 ATI Radeon X19xx -ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) supported 3 ATI Radeon X19xx -ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 0 ATI Radeon X300 -ATI Technologies Inc. Radeon X550/X700 Series supported 0 ATI Radeon X500 -ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X500 -ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 0 ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 supported 0 ATI Radeon X300 -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 ATI Radeon X15xx -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 ATI Radeon X15xx -ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2 supported 2 ATI Radeon X15xx -ATI Technologies Inc. Sapphire Radeon HD 3730 supported 3 ATI Radeon HD 3700 -ATI Technologies Inc. Sapphire Radeon HD 3750 supported 3 ATI Radeon HD 3700 -ATI Technologies Inc. Standard VGA Graphics Adapter supported 0 ATI Technologies -ATI Technologies Inc. Tul, RADEON X600 PRO supported 0 ATI Technologies -ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. Tul, RADEON X700 PRO supported 0 ATI Technologies -ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 0 ATI Technologies -ATI Technologies Inc. VisionTek Radeon 4350 supported 0 ATI Technologies -ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 ATI Radeon X15xx -ATI Technologies Inc. WRESTLER 9802 supported 0 ATI Technologies -ATI Technologies Inc. WRESTLER 9803 supported 0 ATI Technologies -ATI Technologies Inc. XFX Radeon HD 4570 supported 3 ATI Radeon HD 4500 -ATI Technologies Inc. Yamaha ATI HD 9000da/s supported 0 ATI Technologies -ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 supported 0 ATI Technologies -Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 AMD RS780 (HD 3200) -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RS880 (HD 4200) -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL supported 1 AMD RS880 (HD 4200) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV610 (HD 2400) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV620 (HD 3400) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 supported 3 AMD RV635 (HD 3600) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV670 (HD 3800) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 AMD RV710 (HD 4300) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV730 (HD 4600) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 supported 3 AMD RV730 (HD 4600) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800) -Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 supported 3 AMD RV770 (HD 4800) -Alex Mohr GL Hijacker! NO MATCH -Apple Software Renderer unsupported 0 Apple Software Renderer -DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) -DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) -DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) -DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL unsupported 0 ATI RS600 (Xpress 3200) -DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 supported 1 ATI R300 (9700) -DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600) -DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL supported 0 ATI RV350 (9600) -DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380 -DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380 -DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 supported 0 ATI RV380 -DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 ATI RV380 -DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV515 -DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 supported 1 ATI RV530 -GPU_CLASS_UNKNOWN NO MATCH -Humper 3D-Analyze v2.3 - http://www.tommti-systems.com supported 0 Humper -Humper Chromium supported 0 Humper -Imagination Technologies PowerVR SGX545 NO MATCH -Intel NO MATCH -Intel HD Graphics Family supported 2 Intel HD Graphics -Intel 3D-Analyze v2.2 - http://www.tommti-systems.com NO MATCH -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH -Intel 4 Series Internal Chipset NO MATCH -Intel 830M unsupported 0 Intel 830M -Intel 845G unsupported 0 Intel 845G -Intel 855GM unsupported 0 Intel 855GM -Intel 865G unsupported 0 Intel 865G -Intel 915G unsupported 0 Intel 915G -Intel 915GM unsupported 0 Intel 915GM -Intel 945G supported 0 Intel 945G -Intel 945GM supported 0 Intel 945GM -Intel 950 supported 0 Intel 950 -Intel 965 supported 0 Intel 965 -Intel B43 Express Chipset NO MATCH -Intel Bear Lake unsupported 0 Intel Bear Lake -Intel Broadwater unsupported 0 Intel Broadwater -Intel Brookdale unsupported 0 Intel Brookdale -Intel Cantiga unsupported 0 Intel Cantiga -Intel EMGD on PowerVR SGX535 NO MATCH -Intel Eaglelake supported 0 Intel Eaglelake -Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) NO MATCH -Intel G33 unsupported 0 Intel G33 -Intel G41 supported 0 Intel G41 -Intel G41 Express Chipset supported 0 Intel G41 -Intel G45 supported 0 Intel G45 -Intel G45/G43 Express Chipset supported 0 Intel G45 -Intel Graphics Media Accelerator HD supported 0 Intel Graphics Media HD -Intel HD Graphics supported 2 Intel HD Graphics -Intel HD Graphics 100 supported 2 Intel HD Graphics -Intel HD Graphics 200 supported 2 Intel HD Graphics -Intel HD Graphics 200 BR-1101-00SH supported 2 Intel HD Graphics -Intel HD Graphics 200 BR-1101-00SJ supported 2 Intel HD Graphics -Intel HD Graphics 200 BR-1101-00SK supported 2 Intel HD Graphics -Intel HD Graphics 200 BR-1101-01M5 supported 2 Intel HD Graphics -Intel HD Graphics 200 BR-1101-01M6 supported 2 Intel HD Graphics -Intel HD Graphics BR-1004-01Y1 supported 2 Intel HD Graphics -Intel HD Graphics BR-1006-0364 supported 2 Intel HD Graphics -Intel HD Graphics BR-1006-0365 supported 2 Intel HD Graphics -Intel HD Graphics BR-1006-0366 supported 2 Intel HD Graphics -Intel HD Graphics BR-1007-02G4 supported 2 Intel HD Graphics -Intel HD Graphics BR-1101-04SY supported 2 Intel HD Graphics -Intel HD Graphics BR-1101-04SZ supported 2 Intel HD Graphics -Intel HD Graphics BR-1101-04T0 supported 2 Intel HD Graphics -Intel HD Graphics BR-1101-04T9 supported 2 Intel HD Graphics -Intel HD Graphics Family supported 2 Intel HD Graphics -Intel HD Graphics Family BR-1012-00Y8 supported 2 Intel HD Graphics -Intel HD Graphics Family BR-1012-00YF supported 2 Intel HD Graphics -Intel HD Graphics Family BR-1012-00ZD supported 2 Intel HD Graphics -Intel HD Graphics Family BR-1102-00ML supported 2 Intel HD Graphics -Intel Inc. Intel GMA 900 OpenGL Engine NO MATCH -Intel Inc. Intel GMA 950 OpenGL Engine supported 0 Intel 950 -Intel Inc. Intel GMA X3100 OpenGL Engine supported 0 Intel X3100 -Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics -Intel Inc. Intel HD Graphics OpenGL Engine supported 2 Intel HD Graphics -Intel Inc. Intel HD xxxx OpenGL Engine NO MATCH -Intel Intel 845G unsupported 0 Intel 845G -Intel Intel 855GM unsupported 0 Intel 855GM -Intel Intel 865G unsupported 0 Intel 865G -Intel Intel 915G unsupported 0 Intel 915G -Intel Intel 915GM unsupported 0 Intel 915GM -Intel Intel 945G supported 0 Intel 945G -Intel Intel 945GM supported 0 Intel 945GM -Intel Intel 965/963 Graphics Media Accelerator supported 0 Intel 965 -Intel Intel Bear Lake B unsupported 0 Intel Bear Lake -Intel Intel Broadwater G unsupported 0 Intel Broadwater -Intel Intel Brookdale-G unsupported 0 Intel Brookdale -Intel Intel Calistoga NO MATCH -Intel Intel Cantiga unsupported 0 Intel Cantiga -Intel Intel Eaglelake supported 0 Intel Eaglelake -Intel Intel Generic Renderer NO MATCH -Intel Intel Grantsdale-G NO MATCH -Intel Intel HD Graphics 3000 supported 2 Intel HD Graphics -Intel Intel Lakeport NO MATCH -Intel Intel Montara-GM unsupported 0 Intel Montara -Intel Intel Pineview Platform supported 0 Intel Pineview -Intel Intel Springdale-G unsupported 0 Intel Springdale -Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) NO MATCH -Intel Mobile 4 Series supported 0 Intel Mobile 4 Series -Intel Mobile 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series -Intel Mobile 45 Express Chipset Family NO MATCH -Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) NO MATCH -Intel Mobile HD Graphics supported 2 Intel HD Graphics -Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 Intel Mobile 4 Series -Intel Mobile SandyBridge HD Graphics supported 2 Intel HD Graphics -Intel Montara unsupported 0 Intel Montara -Intel Pineview supported 0 Intel Pineview -Intel Q45/Q43 Express Chipset NO MATCH -Intel Royal BNA Driver NO MATCH -Intel SandyBridge HD Graphics supported 2 Intel HD Graphics -Intel SandyBridge HD Graphics BR-1006-00V8 supported 2 Intel HD Graphics -Intel Springdale unsupported 0 Intel Springdale -Intel X3100 supported 0 Intel X3100 -Intergraph wcgdrv 06.05.06.18 NO MATCH -Intergraph wcgdrv 06.06.00.35 NO MATCH -LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgra... NO MATCH -LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://Legendgr... supported 3 NVIDIA GT 430M -Linden Lab Headless NO MATCH -Matrox unsupported 0 Matrox -Mesa unsupported 0 Mesa -Mesa Project Software Rasterizer unsupported 0 Mesa -NVIDIA /PCI/SSE2 NO MATCH -NVIDIA /PCI/SSE2/3DNOW! NO MATCH -NVIDIA 205 supported 0 NVIDIA G 205M -NVIDIA 210 supported 1 NVIDIA G 210 -NVIDIA 310 supported 2 NVIDIA G 310M -NVIDIA 310M supported 2 NVIDIA G 310M -NVIDIA 315 supported 2 NVIDIA G 315 -NVIDIA 315M supported 2 NVIDIA G 315 -NVIDIA 320M supported 2 NVIDIA G 320M -NVIDIA C51 supported 0 NVIDIA C51 -NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M -NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285 -NVIDIA D10M2-20/PCI/SSE2 NO MATCH -NVIDIA D10P1-25/PCI/SSE2 NO MATCH -NVIDIA D10P1-25/PCI/SSE2/3DNOW! NO MATCH -NVIDIA D10P1-30/PCI/SSE2 NO MATCH -NVIDIA D10P2-50/PCI/SSE2 NO MATCH -NVIDIA D11M2-30/PCI/SSE2 NO MATCH -NVIDIA D12-P1-35/PCI/SSE2 NO MATCH -NVIDIA D12U-15/PCI/SSE2 NO MATCH -NVIDIA D13M1-40/PCI/SSE2 NO MATCH -NVIDIA D13P1-40/PCI/SSE2 NO MATCH -NVIDIA D13P1-40/PCI/SSE2/3DNOW! NO MATCH -NVIDIA D13U-10/PCI/SSE2 NO MATCH -NVIDIA D13U/PCI/SSE2 NO MATCH -NVIDIA D9M supported 1 NVIDIA D9M -NVIDIA D9M-20/PCI/SSE2 supported 1 NVIDIA D9M -NVIDIA Entry Graphics/PCI/SSE2 NO MATCH -NVIDIA Entry Graphics/PCI/SSE2/3DNOW! NO MATCH -NVIDIA G 102M supported 0 NVIDIA G102M -NVIDIA G 103M supported 0 NVIDIA G103M -NVIDIA G 105M supported 0 NVIDIA G105M -NVIDIA G 110M supported 0 NVIDIA G 110M -NVIDIA G100 supported 0 NVIDIA G100 -NVIDIA G102M supported 0 NVIDIA G102M -NVIDIA G103M supported 0 NVIDIA G103M -NVIDIA G105M supported 0 NVIDIA G105M -NVIDIA G210 supported 1 NVIDIA G 210 -NVIDIA G210M supported 1 NVIDIA G 210 -NVIDIA G70/PCI/SSE2 NO MATCH -NVIDIA G72 supported 1 NVIDIA G72 -NVIDIA G73 supported 1 NVIDIA G73 -NVIDIA G84 supported 2 NVIDIA G84 -NVIDIA G86 supported 3 NVIDIA G86 -NVIDIA G92 supported 3 NVIDIA G92 -NVIDIA G92-200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA G94 supported 3 NVIDIA G94 -NVIDIA G96/PCI/SSE2 NO MATCH -NVIDIA G98/PCI/SSE2 NO MATCH -NVIDIA G98/PCI/SSE2/3DNOW! NO MATCH -NVIDIA GT 120 supported 2 NVIDIA GT 120M -NVIDIA GT 130 supported 2 NVIDIA GT 130M -NVIDIA GT 130M supported 2 NVIDIA GT 130M -NVIDIA GT 140 supported 2 NVIDIA GT 140M -NVIDIA GT 150 supported 2 NVIDIA GT 150M -NVIDIA GT 160M supported 2 NVIDIA GT 160M -NVIDIA GT 220 supported 2 NVIDIA GT 220M -NVIDIA GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M -NVIDIA GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M -NVIDIA GT 230 supported 2 NVIDIA GT 230M -NVIDIA GT 230M supported 2 NVIDIA GT 230M -NVIDIA GT 240 supported 2 NVIDIA GT 240M -NVIDIA GT 240M supported 2 NVIDIA GT 240M -NVIDIA GT 250M supported 2 NVIDIA GT 250M -NVIDIA GT 260M supported 2 NVIDIA GT 260M -NVIDIA GT 320 supported 2 NVIDIA G 320M -NVIDIA GT 320M supported 2 NVIDIA G 320M -NVIDIA GT 330 supported 3 NVIDIA GT 330M -NVIDIA GT 330M supported 3 NVIDIA GT 330M -NVIDIA GT 340 supported 2 NVIDIA GT 340M -NVIDIA GT 420 supported 2 NVIDIA GT 420M -NVIDIA GT 430 supported 3 NVIDIA GT 430M -NVIDIA GT 440 supported 3 NVIDIA GT 440M -NVIDIA GT 450 supported 3 NVIDIA GT 450M -NVIDIA GT 520 supported 3 NVIDIA GT 520M -NVIDIA GT 540 supported 3 NVIDIA GT 540M -NVIDIA GT 540M supported 3 NVIDIA GT 540M -NVIDIA GT-120 supported 2 NVIDIA GT 120 -NVIDIA GT200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GTS 150 supported 2 NVIDIA GT 150M -NVIDIA GTS 240 supported 3 NVIDIA GTS 240 -NVIDIA GTS 250 supported 3 NVIDIA GTS 250 -NVIDIA GTS 350M supported 3 NVIDIA GTS 350M -NVIDIA GTS 360 supported 3 NVIDIA GTS 360 -NVIDIA GTS 360M supported 3 NVIDIA GTS 360M -NVIDIA GTS 450 supported 3 NVIDIA GTS 450 -NVIDIA GTX 260 supported 3 NVIDIA GTX 260 -NVIDIA GTX 260M supported 3 NVIDIA GTX 260 -NVIDIA GTX 270 supported 3 NVIDIA GTX 270 -NVIDIA GTX 280 supported 3 NVIDIA GTX 280 -NVIDIA GTX 285 supported 3 NVIDIA GTX 285 -NVIDIA GTX 290 supported 3 NVIDIA GTX 290 -NVIDIA GTX 460 supported 3 NVIDIA GTX 460 -NVIDIA GTX 460M supported 3 NVIDIA GTX 460M -NVIDIA GTX 465 supported 3 NVIDIA GTX 465 -NVIDIA GTX 470 supported 3 NVIDIA GTX 470 -NVIDIA GTX 470M supported 3 NVIDIA GTX 470M -NVIDIA GTX 480 supported 3 NVIDIA GTX 480 -NVIDIA GTX 480M supported 3 NVIDIA GTX 480M -NVIDIA GTX 550 Ti supported 3 NVIDIA GTX 550 -NVIDIA GTX 560 supported 3 NVIDIA GTX 560 -NVIDIA GTX 560 Ti supported 3 NVIDIA GTX 560 -NVIDIA GTX 570 supported 3 NVIDIA GTX 570 -NVIDIA GTX 580 supported 3 NVIDIA GTX 580 -NVIDIA GTX 590 supported 3 NVIDIA GTX 590 -NVIDIA GeForce NO MATCH -NVIDIA GeForce 2 supported 0 NVIDIA GeForce 2 -NVIDIA GeForce 205/PCI/SSE2 supported 2 NVIDIA 205 -NVIDIA GeForce 210 supported 2 NVIDIA 210 -NVIDIA GeForce 210/PCI/SSE2 supported 2 NVIDIA 210 -NVIDIA GeForce 210/PCI/SSE2/3DNOW! supported 2 NVIDIA 210 -NVIDIA GeForce 3 supported 0 NVIDIA GeForce 3 -NVIDIA GeForce 305M/PCI/SSE2 supported 1 NVIDIA 305M -NVIDIA GeForce 310/PCI/SSE2 supported 3 NVIDIA 310 -NVIDIA GeForce 310/PCI/SSE2/3DNOW! supported 3 NVIDIA 310 -NVIDIA GeForce 310M/PCI/SSE2 supported 1 NVIDIA 310M -NVIDIA GeForce 315/PCI/SSE2 supported 3 NVIDIA 315 -NVIDIA GeForce 315/PCI/SSE2/3DNOW! supported 3 NVIDIA 315 -NVIDIA GeForce 315M/PCI/SSE2 supported 2 NVIDIA 315M -NVIDIA GeForce 320M/PCI/SSE2 supported 2 NVIDIA 320M -NVIDIA GeForce 4 Go supported 0 NVIDIA GeForce 4 -NVIDIA GeForce 4 MX supported 0 NVIDIA GeForce 4 -NVIDIA GeForce 4 Ti supported 0 NVIDIA GeForce 4 -NVIDIA GeForce 405/PCI/SSE2 supported 1 NVIDIA G 405 -NVIDIA GeForce 410M/PCI/SSE2 supported 1 NVIDIA G 410M -NVIDIA GeForce 6100 supported 0 NVIDIA G100 -NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 6100 nForce 405/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6150/PCI/SSE2 supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 6100 -NVIDIA GeForce 6200 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 A-LE/AGP/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 LE/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/AGP/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/PCI/SSE/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 6200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 6500 supported 0 NVIDIA GeForce 6500 -NVIDIA GeForce 6500/PCI/SSE2 supported 0 NVIDIA GeForce 6500 -NVIDIA GeForce 6600 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/AGP/SSE2 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/PCI/SSE2 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 LE/PCI/SSE2 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600/AGP/SSE2 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600/PCI/SSE2 supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6600/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 6600 -NVIDIA GeForce 6700 supported 2 NVIDIA GeForce 6700 -NVIDIA GeForce 6800 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 GS/PCI/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 GT/AGP/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 XT/AGP/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 XT/PCI/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800/PCI/SSE2 supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 6800/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 6800 -NVIDIA GeForce 7000 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7000M supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7000 -NVIDIA GeForce 7100 supported 0 NVIDIA G100 -NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 7100 GS/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 supported 0 NVIDIA GeForce 7100 -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 7100 -NVIDIA GeForce 7300 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GT/AGP/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GT/PCI/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 7300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7350 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7300 -NVIDIA GeForce 7500 supported 1 NVIDIA GeForce 7500 -NVIDIA GeForce 7500 LE/PCI/SSE2 supported 1 NVIDIA GeForce 7500 -NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 7500 -NVIDIA GeForce 7600 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GT/AGP/SSE2 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7650 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7600 -NVIDIA GeForce 7800 supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GS/AGP/SSE2 supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7800 -NVIDIA GeForce 7900 supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7950 GT/PCI/SSE2 supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 7900 -NVIDIA GeForce 8100 supported 0 NVIDIA G100 -NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 8200 supported 0 NVIDIA G 200 -NVIDIA GeForce 8200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 8200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 8200M supported 0 NVIDIA G 200 -NVIDIA GeForce 8200M G/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 8300 supported 1 NVIDIA GeForce 8300 -NVIDIA GeForce 8300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8300 -NVIDIA GeForce 8400 supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400 GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400 -NVIDIA GeForce 8400M supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8400M G/PCI/SSE2 supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8400M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8400M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8400M -NVIDIA GeForce 8500 supported 3 NVIDIA GeForce 8500 -NVIDIA GeForce 8500 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8500 -NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8500 -NVIDIA GeForce 8600 supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600GS/PCI/SSE2 supported 3 NVIDIA GeForce 8600 -NVIDIA GeForce 8600M supported 1 NVIDIA GeForce 8600M -NVIDIA GeForce 8600M GS/PCI/SSE2 supported 1 NVIDIA GeForce 8600M -NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 8600M -NVIDIA GeForce 8600M GT/PCI/SSE2 supported 1 NVIDIA GeForce 8600M -NVIDIA GeForce 8700 supported 3 NVIDIA GeForce 8700 -NVIDIA GeForce 8700M supported 3 NVIDIA GeForce 8700M -NVIDIA GeForce 8700M GT/PCI/SSE2 supported 3 NVIDIA GeForce 8700M -NVIDIA GeForce 8800 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GS/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GTS 512/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 Ultra/PCI/SSE2 supported 3 NVIDIA GeForce 8800 -NVIDIA GeForce 8800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 8800M -NVIDIA GeForce 8800M GTX/PCI/SSE2 supported 3 NVIDIA GeForce 8800M -NVIDIA GeForce 9100 supported 0 NVIDIA G100 -NVIDIA GeForce 9100/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce 9100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce 9100M supported 0 NVIDIA G100M -NVIDIA GeForce 9100M G/PCI/SSE2 supported 0 NVIDIA G100M -NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 NVIDIA G100M -NVIDIA GeForce 9200 supported 0 NVIDIA G 200 -NVIDIA GeForce 9200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 9200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce 9200M GE/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 9200M GS/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce 9300 supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 GE/PCI/SSE2 supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 SE/PCI/SSE2 supported 1 NVIDIA GeForce 9300 -NVIDIA GeForce 9300M supported 1 NVIDIA GeForce 9300M -NVIDIA GeForce 9300M G/PCI/SSE2 supported 1 NVIDIA GeForce 9300M -NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M -NVIDIA GeForce 9300M GS/PCI/SSE2 supported 1 NVIDIA GeForce 9300M -NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9300M -NVIDIA GeForce 9400 supported 1 NVIDIA GeForce 9400 -NVIDIA GeForce 9400 GT/PCI/SSE2 supported 1 NVIDIA GeForce 9400 -NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce 9400 -NVIDIA GeForce 9400/PCI/SSE2 supported 1 NVIDIA GeForce 9400 -NVIDIA GeForce 9400M supported 1 NVIDIA GeForce 9400M -NVIDIA GeForce 9400M G/PCI/SSE2 supported 1 NVIDIA GeForce 9400M -NVIDIA GeForce 9400M/PCI/SSE2 supported 1 NVIDIA GeForce 9400M -NVIDIA GeForce 9500 supported 2 NVIDIA GeForce 9500 -NVIDIA GeForce 9500 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500 -NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500 -NVIDIA GeForce 9500 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9500 -NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9500 -NVIDIA GeForce 9500M supported 2 NVIDIA GeForce 9500M -NVIDIA GeForce 9500M GS/PCI/SSE2 supported 2 NVIDIA GeForce 9500M -NVIDIA GeForce 9600 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GS/PCI/SSE2 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GSO 512/PCI/SSE2 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GSO/PCI/SSE2 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600M supported 3 NVIDIA GeForce 9600M -NVIDIA GeForce 9600M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9600M -NVIDIA GeForce 9600M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9600M -NVIDIA GeForce 9650M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9600 -NVIDIA GeForce 9700M supported 2 NVIDIA GeForce 9700M -NVIDIA GeForce 9700M GT/PCI/SSE2 supported 2 NVIDIA GeForce 9700M -NVIDIA GeForce 9700M GTS/PCI/SSE2 supported 2 NVIDIA GeForce 9700M -NVIDIA GeForce 9800 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GTX/PCI/SSE2 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GX2/PCI/SSE2 supported 3 NVIDIA GeForce 9800 -NVIDIA GeForce 9800M supported 3 NVIDIA GeForce 9800M -NVIDIA GeForce 9800M GS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M -NVIDIA GeForce 9800M GT/PCI/SSE2 supported 3 NVIDIA GeForce 9800M -NVIDIA GeForce 9800M GTS/PCI/SSE2 supported 3 NVIDIA GeForce 9800M -NVIDIA GeForce FX 5100 supported 0 NVIDIA G100 -NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce FX 5200 supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/AGP/SSE supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/AGP/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5200LE/AGP/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce FX 5500 supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/AGP/SSE2 supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/PCI/SSE2 supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5600 supported 0 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5600/AGP/SSE2 supported 0 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5700 supported 1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5700LE/AGP/SSE supported 1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! supported 1 NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5800 supported 1 NVIDIA GeForce FX 5800 -NVIDIA GeForce FX 5900 supported 1 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX 5900/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX 5900XT/AGP/SSE2 supported 1 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX Go5100 supported 0 NVIDIA G100 -NVIDIA GeForce FX Go5100/AGP/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce FX Go5200 supported 0 NVIDIA G 200 -NVIDIA GeForce FX Go5200/AGP/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce FX Go5300 supported 0 NVIDIA GeForce FX Go5300 -NVIDIA GeForce FX Go5600 supported 0 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5600/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5650/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5700 supported 1 NVIDIA GeForce FX Go5700 -NVIDIA GeForce FX Go5700/AGP/SSE2 supported 1 NVIDIA GeForce FX Go5700 -NVIDIA GeForce FX Go5xxx/AGP/SSE2 supported 0 NVIDIA GeForce FX Go5xxx -NVIDIA GeForce G 103M/PCI/SSE2 supported 0 NVIDIA G103M -NVIDIA GeForce G 103M/PCI/SSE2/3DNOW! supported 0 NVIDIA G103M -NVIDIA GeForce G 105M/PCI/SSE2 supported 0 NVIDIA G105M -NVIDIA GeForce G 110M/PCI/SSE2 supported 0 NVIDIA G 110M -NVIDIA GeForce G100/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce G100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce G102M/PCI/SSE2 supported 0 NVIDIA G102M -NVIDIA GeForce G105M/PCI/SSE2 supported 0 NVIDIA G105M -NVIDIA GeForce G200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce G205M/PCI/SSE2 supported 0 NVIDIA G 205M -NVIDIA GeForce G210/PCI/SSE2 supported 1 NVIDIA G 210 -NVIDIA GeForce G210/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210 -NVIDIA GeForce G210M/PCI/SSE2 supported 1 NVIDIA G 210 -NVIDIA GeForce G310M/PCI/SSE2 supported 2 NVIDIA G 310M -NVIDIA GeForce GT 120/PCI/SSE2 supported 2 NVIDIA GT 120M -NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 120M -NVIDIA GeForce GT 120M/PCI/SSE2 supported 1 NVIDIA G 120M -NVIDIA GeForce GT 130M/PCI/SSE2 supported 2 NVIDIA GT 130M -NVIDIA GeForce GT 140/PCI/SSE2 supported 2 NVIDIA GT 140M -NVIDIA GeForce GT 220/PCI/SSE2 supported 2 NVIDIA GT 220M -NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 220M -NVIDIA GeForce GT 220M/PCI/SSE2 supported 2 NVIDIA GT 220M -NVIDIA GeForce GT 230/PCI/SSE2 supported 2 NVIDIA GT 230M -NVIDIA GeForce GT 230M/PCI/SSE2 supported 2 NVIDIA GT 230M -NVIDIA GeForce GT 240 supported 2 NVIDIA GT 240M -NVIDIA GeForce GT 240/PCI/SSE2 supported 2 NVIDIA GT 240M -NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 240M -NVIDIA GeForce GT 240M/PCI/SSE2 supported 2 NVIDIA GT 240M -NVIDIA GeForce GT 320/PCI/SSE2 supported 2 NVIDIA G 320M -NVIDIA GeForce GT 320M/PCI/SSE2 supported 2 NVIDIA G 320M -NVIDIA GeForce GT 325M/PCI/SSE2 supported 0 NVIDIA GT 325M -NVIDIA GeForce GT 330/PCI/SSE2 supported 3 NVIDIA GT 330M -NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 330M -NVIDIA GeForce GT 330M/PCI/SSE2 supported 3 NVIDIA GT 330M -NVIDIA GeForce GT 335M/PCI/SSE2 supported 1 NVIDIA GT 335M -NVIDIA GeForce GT 340/PCI/SSE2 supported 2 NVIDIA GT 340M -NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! supported 2 NVIDIA GT 340M -NVIDIA GeForce GT 415M/PCI/SSE2 supported 2 NVIDIA GT 415M -NVIDIA GeForce GT 420/PCI/SSE2 supported 2 NVIDIA GT 420M -NVIDIA GeForce GT 420M/PCI/SSE2 supported 2 NVIDIA GT 420M -NVIDIA GeForce GT 425M/PCI/SSE2 supported 3 NVIDIA GT 425M -NVIDIA GeForce GT 430/PCI/SSE2 supported 3 NVIDIA GT 430M -NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 430M -NVIDIA GeForce GT 435M/PCI/SSE2 supported 3 NVIDIA GT 435M -NVIDIA GeForce GT 440/PCI/SSE2 supported 3 NVIDIA GT 440M -NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 440M -NVIDIA GeForce GT 445M/PCI/SSE2 supported 3 NVIDIA GT 445M -NVIDIA GeForce GT 520/PCI/SSE2 supported 3 NVIDIA GT 520M -NVIDIA GeForce GT 520/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 520M -NVIDIA GeForce GT 520M/PCI/SSE2 supported 3 NVIDIA GT 520M -NVIDIA GeForce GT 525M/PCI/SSE2 supported 3 NVIDIA GT 520M -NVIDIA GeForce GT 530/PCI/SSE2 supported 3 NVIDIA GT 530M -NVIDIA GeForce GT 530/PCI/SSE2/3DNOW! supported 3 NVIDIA GT 530M -NVIDIA GeForce GT 540M/PCI/SSE2 supported 3 NVIDIA GT 540M -NVIDIA GeForce GT 545/PCI/SSE2 supported 3 NVIDIA GT 540M -NVIDIA GeForce GT 550M/PCI/SSE2 supported 3 NVIDIA GT 550M -NVIDIA GeForce GT 555M/PCI/SSE2 supported 3 NVIDIA GT 555M -NVIDIA GeForce GTS 150/PCI/SSE2 supported 2 NVIDIA GT 150M -NVIDIA GeForce GTS 160M/PCI/SSE2 supported 2 NVIDIA GTS 160M -NVIDIA GeForce GTS 240/PCI/SSE2 supported 3 NVIDIA GTS 240 -NVIDIA GeForce GTS 250/PCI/SSE2 supported 3 NVIDIA GTS 250 -NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 250 -NVIDIA GeForce GTS 250M/PCI/SSE2 supported 3 NVIDIA GTS 250 -NVIDIA GeForce GTS 350M/PCI/SSE2 supported 3 NVIDIA GTS 350M -NVIDIA GeForce GTS 360M/PCI/SSE2 supported 3 NVIDIA GTS 360M -NVIDIA GeForce GTS 450/PCI/SSE2 supported 3 NVIDIA GTS 450 -NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! supported 3 NVIDIA GTS 450 -NVIDIA GeForce GTS 455/PCI/SSE2 supported 3 NVIDIA GTS 450 -NVIDIA GeForce GTX 260/PCI/SSE2 supported 3 NVIDIA GTX 260 -NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 260 -NVIDIA GeForce GTX 260M/PCI/SSE2 supported 3 NVIDIA GTX 260 -NVIDIA GeForce GTX 275/PCI/SSE2 supported 3 NVIDIA GTX 275 -NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 275 -NVIDIA GeForce GTX 280 supported 3 NVIDIA GTX 280 -NVIDIA GeForce GTX 280/PCI/SSE2 supported 3 NVIDIA GTX 280 -NVIDIA GeForce GTX 280M/PCI/SSE2 supported 3 NVIDIA GTX 280 -NVIDIA GeForce GTX 285 supported 3 NVIDIA GTX 285 -NVIDIA GeForce GTX 285/PCI/SSE2 supported 3 NVIDIA GTX 285 -NVIDIA GeForce GTX 295/PCI/SSE2 supported 3 NVIDIA GTX 295 -NVIDIA GeForce GTX 460 SE/PCI/SSE2 supported 3 NVIDIA GTX 460 -NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460 -NVIDIA GeForce GTX 460/PCI/SSE2 supported 3 NVIDIA GTX 460 -NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 460 -NVIDIA GeForce GTX 460M/PCI/SSE2 supported 3 NVIDIA GTX 460M -NVIDIA GeForce GTX 465/PCI/SSE2 supported 3 NVIDIA GTX 465 -NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 465 -NVIDIA GeForce GTX 470/PCI/SSE2 supported 3 NVIDIA GTX 470 -NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 470 -NVIDIA GeForce GTX 480/PCI/SSE2 supported 3 NVIDIA GTX 480 -NVIDIA GeForce GTX 550 Ti/PCI/SSE2 supported 3 NVIDIA GTX 550 -NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 550 -NVIDIA GeForce GTX 560 Ti/PCI/SSE2 supported 3 NVIDIA GTX 560 -NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560 -NVIDIA GeForce GTX 560/PCI/SSE2 supported 3 NVIDIA GTX 560 -NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 560 -NVIDIA GeForce GTX 560M/PCI/SSE2 supported 3 NVIDIA GTX 560 -NVIDIA GeForce GTX 570/PCI/SSE2 supported 3 NVIDIA GTX 570 -NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 570 -NVIDIA GeForce GTX 580/PCI/SSE2 supported 3 NVIDIA GTX 580 -NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! supported 3 NVIDIA GTX 580 -NVIDIA GeForce GTX 580M/PCI/SSE2 supported 3 NVIDIA GTX 580M -NVIDIA GeForce GTX 590/PCI/SSE2 supported 3 NVIDIA GTX 590 -NVIDIA GeForce Go 6 supported 1 NVIDIA GeForce Go 6 -NVIDIA GeForce Go 6100 supported 0 NVIDIA G100 -NVIDIA GeForce Go 6100/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA GeForce Go 6150/PCI/SSE2 supported 0 NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6200 supported 0 NVIDIA G 200 -NVIDIA GeForce Go 6200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce Go 6400 supported 1 NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6400/PCI/SSE2 supported 1 NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6600 supported 1 NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6600/PCI/SSE2 supported 1 NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6800 supported 1 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 6800/PCI/SSE2 supported 1 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 7200 supported 0 NVIDIA G 200 -NVIDIA GeForce Go 7200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce Go 7300 supported 1 NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7300/PCI/SSE2 supported 1 NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7400 supported 1 NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7400/PCI/SSE2 supported 1 NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7600 supported 2 NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7600/PCI/SSE2 supported 2 NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! supported 2 NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7700 supported 2 NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7700/PCI/SSE2 supported 2 NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7800 supported 2 NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7800 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7900 supported 2 NVIDIA GeForce Go 7900 -NVIDIA GeForce Go 7900 GS/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 -NVIDIA GeForce Go 7900 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 -NVIDIA GeForce Go 7950 GTX/PCI/SSE2 supported 2 NVIDIA GeForce Go 7900 -NVIDIA GeForce PCX supported 0 NVIDIA GeForce PCX -NVIDIA GeForce2 GTS/AGP/SSE supported 0 NVIDIA GeForce 2 -NVIDIA GeForce2 MX/AGP/3DNOW! supported 0 NVIDIA GeForce 2 -NVIDIA GeForce2 MX/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 2 -NVIDIA GeForce2 MX/AGP/SSE2 supported 0 NVIDIA GeForce 2 -NVIDIA GeForce2 MX/PCI/SSE2 supported 0 NVIDIA GeForce 2 -NVIDIA GeForce3/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 3 -NVIDIA GeForce3/AGP/SSE2 supported 0 NVIDIA GeForce 3 -NVIDIA GeForce4 420 Go 32M/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 420 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 440 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 460 Go/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 4000/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 4000/PCI/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 4000/PCI/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 420/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 440/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! supported 0 NVIDIA GeForce 4 -NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE supported 0 NVIDIA G 200 -NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! supported 0 NVIDIA G 200 -NVIDIA GeForce4 Ti 4400/AGP/SSE2 supported 0 NVIDIA GeForce 4 -NVIDIA Generic NO MATCH -NVIDIA ION LE/PCI/SSE2 supported 2 NVIDIA ION -NVIDIA ION/PCI/SSE2 supported 2 NVIDIA ION -NVIDIA ION/PCI/SSE2/3DNOW! supported 2 NVIDIA ION -NVIDIA MCP61/PCI/SSE2 supported 1 NVIDIA MCP61 -NVIDIA MCP61/PCI/SSE2/3DNOW! supported 1 NVIDIA MCP61 -NVIDIA MCP73/PCI/SSE2 supported 1 NVIDIA MCP73 -NVIDIA MCP79MH/PCI/SSE2 supported 1 NVIDIA MCP79 -NVIDIA MCP79MX/PCI/SSE2 supported 1 NVIDIA MCP79 -NVIDIA MCP7A-O/PCI/SSE2 supported 1 NVIDIA MCP7A -NVIDIA MCP7A-S/PCI/SSE2 supported 1 NVIDIA MCP7A -NVIDIA MCP89-EPT/PCI/SSE2 NO MATCH -NVIDIA N10M-GE1/PCI/SSE2 supported 1 NVIDIA N10 -NVIDIA N10P-GE1/PCI/SSE2 supported 1 NVIDIA N10 -NVIDIA N10P-GV2/PCI/SSE2 supported 1 NVIDIA N10 -NVIDIA N11M-GE1/PCI/SSE2 NO MATCH -NVIDIA N11M-GE2/PCI/SSE2 NO MATCH -NVIDIA N12E-GS-A1/PCI/SSE2 NO MATCH -NVIDIA N12P-GVR-B-A1/PCI/SSE2 NO MATCH -NVIDIA N13M-GE1-B-A1/PCI/SSE2 NO MATCH -NVIDIA N13P-GL-A1/PCI/SSE2 NO MATCH -NVIDIA NB9M-GE/PCI/SSE2 supported 1 NVIDIA NB9M -NVIDIA NB9M-GE1/PCI/SSE2 supported 1 NVIDIA NB9M -NVIDIA NB9M-GS/PCI/SSE2 supported 1 NVIDIA NB9M -NVIDIA NB9M-NS/PCI/SSE2 supported 1 NVIDIA NB9M -NVIDIA NB9P-GE1/PCI/SSE2 supported 2 NVIDIA NB9P -NVIDIA NB9P-GS/PCI/SSE2 supported 2 NVIDIA NB9P -NVIDIA NV17/AGP/3DNOW! supported 0 NVIDIA NV17 -NVIDIA NV17/AGP/SSE2 supported 0 NVIDIA NV17 -NVIDIA NV34 supported 0 NVIDIA NV34 -NVIDIA NV35 supported 0 NVIDIA NV35 -NVIDIA NV36/AGP/SSE/3DNOW! supported 1 NVIDIA NV36 -NVIDIA NV36/AGP/SSE2 supported 1 NVIDIA NV36 -NVIDIA NV41/PCI/SSE2 supported 1 NVIDIA NV41 -NVIDIA NV43 supported 1 NVIDIA NV43 -NVIDIA NV43/PCI/SSE2 supported 1 NVIDIA NV43 -NVIDIA NV44 supported 1 NVIDIA NV44 -NVIDIA NV44/AGP/SSE2 supported 1 NVIDIA NV44 -NVIDIA NVIDIA GeForce 210 OpenGL Engine supported 2 NVIDIA 210 -NVIDIA NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M -NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine supported 1 NVIDIA GeForce 7300 -NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine supported 2 NVIDIA GeForce 7600 -NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine supported 1 NVIDIA GeForce 8600M -NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine supported 3 NVIDIA GeForce 8800 -NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine supported 3 NVIDIA GeForce 8800 -NVIDIA NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400 -NVIDIA NVIDIA GeForce 9400M OpenGL Engine supported 1 NVIDIA GeForce 9400M -NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine supported 2 NVIDIA GeForce 9500 -NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine supported 3 NVIDIA GeForce 9600M -NVIDIA NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M -NVIDIA NVIDIA GeForce GT 130 OpenGL Engine supported 2 NVIDIA GT 130M -NVIDIA NVIDIA GeForce GT 220 OpenGL Engine supported 2 NVIDIA GT 220M -NVIDIA NVIDIA GeForce GT 230M OpenGL Engine supported 2 NVIDIA GT 230M -NVIDIA NVIDIA GeForce GT 240M OpenGL Engine supported 2 NVIDIA GT 240M -NVIDIA NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M -NVIDIA NVIDIA GeForce GT 420M OpenGL Engine supported 2 NVIDIA GT 420M -NVIDIA NVIDIA GeForce GT 425M OpenGL Engine supported 3 NVIDIA GT 425M -NVIDIA NVIDIA GeForce GT 430 OpenGL Engine supported 3 NVIDIA GT 430M -NVIDIA NVIDIA GeForce GT 440 OpenGL Engine supported 3 NVIDIA GT 440M -NVIDIA NVIDIA GeForce GT 540M OpenGL Engine supported 3 NVIDIA GT 540M -NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine supported 3 NVIDIA GTS 240 -NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine supported 3 NVIDIA GTS 250 -NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine supported 3 NVIDIA GTS 450 -NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine supported 3 NVIDIA GTX 285 -NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine supported 3 NVIDIA GTX 460 -NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine supported 3 NVIDIA GTX 460M -NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine supported 3 NVIDIA GTX 465 -NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine supported 3 NVIDIA GTX 470 -NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine supported 3 NVIDIA GTX 480 -NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine NO MATCH -NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 NVIDIA ION -NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine supported 1 NVIDIA MCP7A -NVIDIA NVIDIA GeForce4 OpenGL Engine supported 0 NVIDIA GeForce 4 -NVIDIA NVIDIA NV34MAP OpenGL Engine supported 0 NVIDIA NV34 -NVIDIA NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000 -NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine supported 3 NVIDIA Quadro FX 4800 -NVIDIA NVS 2100M/PCI/SSE2 supported 0 NVIDIA G100M -NVIDIA NVS 300/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA NVS 3100M/PCI/SSE2 supported 0 NVIDIA G100M -NVIDIA NVS 4100/PCI/SSE2/3DNOW! supported 0 NVIDIA G100 -NVIDIA NVS 4200M/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA NVS 5100M/PCI/SSE2 supported 0 NVIDIA G100M -NVIDIA PCI NO MATCH -NVIDIA Quadro 1000M/PCI/SSE2 supported 0 NVIDIA G100 -NVIDIA Quadro 2000/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA Quadro 2000M/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA Quadro 3000M/PCI/SSE2 supported 3 NVIDIA Quadro 3000M -NVIDIA Quadro 4000 supported 3 NVIDIA Quadro 4000 -NVIDIA Quadro 4000 OpenGL Engine supported 3 NVIDIA Quadro 4000 -NVIDIA Quadro 4000/PCI/SSE2 supported 3 NVIDIA Quadro 4000 -NVIDIA Quadro 4000M/PCI/SSE2 supported 3 NVIDIA Quadro 4000M -NVIDIA Quadro 5000/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M -NVIDIA Quadro 5000M/PCI/SSE2 supported 3 NVIDIA Quadro 50x0 M -NVIDIA Quadro 600 supported 2 NVIDIA Quadro 600 -NVIDIA Quadro 600/PCI/SSE2 supported 2 NVIDIA Quadro 600 -NVIDIA Quadro 600/PCI/SSE2/3DNOW! supported 2 NVIDIA Quadro 600 -NVIDIA Quadro 6000 supported 3 NVIDIA Quadro 6000 -NVIDIA Quadro 6000/PCI/SSE2 supported 3 NVIDIA Quadro 6000 -NVIDIA Quadro CX/PCI/SSE2 supported 3 NVIDIA Quadro CX -NVIDIA Quadro DCC supported 0 NVIDIA Quadro DCC -NVIDIA Quadro FX supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1100/AGP/SSE2 supported 0 NVIDIA G100 -NVIDIA Quadro FX 1400/PCI/SSE2 supported 2 NVIDIA Quadro 400 -NVIDIA Quadro FX 1500 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1500/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1500M/PCI/SSE2 supported 1 NVIDIA Quadro FX 1500M -NVIDIA Quadro FX 1600M/PCI/SSE2 supported 2 NVIDIA Quadro 600 -NVIDIA Quadro FX 1700 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1700M/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1800 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1800/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 1800M/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 2500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 2500M -NVIDIA Quadro FX 2700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2700M -NVIDIA Quadro FX 2800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 2800M -NVIDIA Quadro FX 3400 supported 2 NVIDIA Quadro 400 -NVIDIA Quadro FX 3450 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 supported 2 NVIDIA Quadro 400 -NVIDIA Quadro FX 3500 supported 2 NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3500M/PCI/SSE2 supported 2 NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 360M/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 370 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 370/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 3700 supported 3 NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3700M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 370M/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 3800 supported 3 NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 3800M/PCI/SSE2 supported 3 NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 4500 supported 3 NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4600 supported 2 NVIDIA Quadro 600 -NVIDIA Quadro FX 4800 supported 3 NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 4800/PCI/SSE2 supported 3 NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 540/PCI/SSE2/3DNOW! supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 560 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 560/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 5600 supported 2 NVIDIA Quadro 600 -NVIDIA Quadro FX 570 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 570/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 570M/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 580/PCI/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro FX 770M/PCI/SSE2 supported 2 NVIDIA Quadro FX 770M -NVIDIA Quadro FX 880M supported 3 NVIDIA Quadro FX 880M -NVIDIA Quadro FX 880M/PCI/SSE2 supported 3 NVIDIA Quadro FX 880M -NVIDIA Quadro FX Go700/AGP/SSE2 supported 1 NVIDIA Quadro FX -NVIDIA Quadro NVS supported 0 NVIDIA Quadro NVS -NVIDIA Quadro NVS 110M/PCI/SSE2 supported 0 NVIDIA G 110M -NVIDIA Quadro NVS 130M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 135M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 140M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 150M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 160M/PCI/SSE2 supported 0 NVIDIA Quadro NVS 1xxM -NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! supported 1 NVIDIA G 210 -NVIDIA Quadro NVS 285/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA Quadro NVS 290/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA Quadro NVS 295/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA Quadro NVS 320M/PCI/SSE2 supported 2 NVIDIA G 320M -NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA Quadro NVS/PCI/SSE2 supported 0 NVIDIA Quadro NVS -NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! NO MATCH -NVIDIA Quadro VX 200/PCI/SSE2 supported 0 NVIDIA G 200 -NVIDIA Quadro/AGP/SSE2 NO MATCH -NVIDIA Quadro2 supported 0 NVIDIA Quadro2 -NVIDIA Quadro4 supported 0 NVIDIA Quadro4 -NVIDIA Quadro4 750 XGL/AGP/SSE2 supported 0 NVIDIA Quadro4 -NVIDIA RIVA TNT unsupported 0 NVIDIA RIVA TNT -NVIDIA RIVA TNT2/AGP/SSE2 unsupported 0 NVIDIA RIVA TNT -NVIDIA RIVA TNT2/PCI/3DNOW! unsupported 0 NVIDIA RIVA TNT -NVIDIA Tesla C2050/PCI/SSE2 supported 0 NVIDIA G 205M -NVIDIA nForce unsupported 0 NVIDIA nForce -NVIDIA nForce 730a/PCI/SSE2 unsupported 0 NVIDIA nForce -NVIDIA nForce 730a/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce -NVIDIA nForce 750a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce -NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce -NVIDIA nForce 760i SLI/PCI/SSE2 unsupported 0 NVIDIA nForce -NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce -NVIDIA nForce 980a/780a SLI/PCI/SSE2 unsupported 0 NVIDIA nForce -NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW! unsupported 0 NVIDIA nForce -NVIDIA unknown board/AGP/SSE2 unsupported 0 NVIDIA Generic -NVIDIA unknown board/PCI/SSE2 unsupported 0 NVIDIA Generic -NVIDIA unknown board/PCI/SSE2/3DNOW! unsupported 0 NVIDIA Generic -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 ATI Radeon HD 5600 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 ATI Radeon HD 5700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine supported 3 ATI Radeon HD 6400 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 ATI Radeon HD 6700 -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 3 ATI Radeon HD 6900 -Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com NO MATCH -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 2 Intel HD Graphics -Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 NVIDIA 320M -Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 1 NVIDIA GeForce 9400 -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine supported 2 NVIDIA GT 120M -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 NVIDIA GT 330M -Radeon RV350 on Gallium supported 0 ATI RV350 (9600) -S3 NO MATCH -S3 Fire GL2 NO MATCH -S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D unsupported 0 S3 -S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 S3 -S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 S3 -S3 Graphics, Incorporated ProSavage/Twister unsupported 0 S3 -S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 S3 -S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 S3 -S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 S3 -SiS unsupported 0 SiS -SiS 650/M650 VGA unsupported 0 SiS -SiS 661 VGA unsupported 0 SiS -SiS 662 VGA unsupported 0 SiS -SiS 741 VGA unsupported 0 SiS -SiS 760 VGA unsupported 0 SiS -SiS 761GX VGA unsupported 0 SiS -SiS Mirage Graphics3 unsupported 0 SiS -SiS Xabre VGA unsupported 0 SiS -Trident unsupported 0 Trident -Tungsten Graphics unsupported 0 Tungsten Graphics -Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945G unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GME 20061017 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX... unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT unsupported 0 Mesa -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MM... unsupported 0 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2 unsupported 0 Mesa -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 0 Mesa -VIA unsupported 0 VIA -VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; NO MATCH -VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics NO MATCH -VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; NO MATCH -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) NO MATCH -VMware, Inc. Gallium 0.4 on llvmpipe NO MATCH -VMware, Inc. Gallium 0.4 on softpipe NO MATCH -X.Org Gallium 0.4 on AMD BARTS supported 3 AMD BARTS (HD 6800) -X.Org Gallium 0.4 on AMD CEDAR supported 2 AMD CEDAR (HD 5450) -X.Org Gallium 0.4 on AMD HEMLOCK supported 3 AMD HEMLOCK (HD 5970) -X.Org Gallium 0.4 on AMD JUNIPER supported 3 AMD JUNIPER (HD 5700) -X.Org Gallium 0.4 on AMD PALM NO MATCH -X.Org Gallium 0.4 on AMD REDWOOD supported 3 AMD REDWOOD (HD 5500/5600) -X.Org Gallium 0.4 on AMD RS780 supported 0 AMD RS780 (HD 3200) -X.Org Gallium 0.4 on AMD RS880 supported 1 AMD RS880 (HD 4200) -X.Org Gallium 0.4 on AMD RV610 supported 1 AMD RV610 (HD 2400) -X.Org Gallium 0.4 on AMD RV620 supported 1 AMD RV620 (HD 3400) -X.Org Gallium 0.4 on AMD RV630 supported 2 AMD RV630 (HD 2600) -X.Org Gallium 0.4 on AMD RV635 supported 3 AMD RV635 (HD 3600) -X.Org Gallium 0.4 on AMD RV710 supported 1 AMD RV710 (HD 4300) -X.Org Gallium 0.4 on AMD RV730 supported 3 AMD RV730 (HD 4600) -X.Org Gallium 0.4 on AMD RV740 supported 3 AMD RV740 (HD 4700) -X.Org Gallium 0.4 on AMD RV770 supported 3 AMD RV770 (HD 4800) -X.Org R300 Project Gallium 0.4 on ATI R300 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI R350 supported 1 ATI R350 (9800) -X.Org R300 Project Gallium 0.4 on ATI R420 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI R580 supported 3 ATI R580 (X1900) -X.Org R300 Project Gallium 0.4 on ATI RC410 unsupported 0 ATI RC410 (Xpress 200) -X.Org R300 Project Gallium 0.4 on ATI RS480 unsupported 0 ATI RS48x (Xpress 200x) -X.Org R300 Project Gallium 0.4 on ATI RS482 unsupported 0 ATI RS48x (Xpress 200x) -X.Org R300 Project Gallium 0.4 on ATI RS600 unsupported 0 ATI RS600 (Xpress 3200) -X.Org R300 Project Gallium 0.4 on ATI RS690 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RS740 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 ATI RV350 (9600) -X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 ATI RV370 (X300) -X.Org R300 Project Gallium 0.4 on ATI RV410 supported 1 ATI RV410 (X700) -X.Org R300 Project Gallium 0.4 on ATI RV515 supported 1 ATI RV515 -X.Org R300 Project Gallium 0.4 on ATI RV530 supported 1 ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV560 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on ATI RV570 supported 3 ATI RV570 (X1900 GT/PRO) -X.Org R300 Project Gallium 0.4 on R420 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on R580 supported 3 ATI R580 (X1900) -X.Org R300 Project Gallium 0.4 on RC410 unsupported 0 ATI RC410 (Xpress 200) -X.Org R300 Project Gallium 0.4 on RS480 unsupported 0 ATI RS48x (Xpress 200x) -X.Org R300 Project Gallium 0.4 on RS482 unsupported 0 ATI RS48x (Xpress 200x) -X.Org R300 Project Gallium 0.4 on RS600 unsupported 0 ATI RS600 (Xpress 3200) -X.Org R300 Project Gallium 0.4 on RS690 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on RS740 supported 1 ATI R300 (9700) -X.Org R300 Project Gallium 0.4 on RV350 supported 0 ATI RV350 (9600) -X.Org R300 Project Gallium 0.4 on RV370 supported 0 ATI RV370 (X300) -X.Org R300 Project Gallium 0.4 on RV410 supported 1 ATI RV410 (X700) -X.Org R300 Project Gallium 0.4 on RV515 supported 1 ATI RV515 -X.Org R300 Project Gallium 0.4 on RV530 supported 1 ATI RV530 -XGI unsupported 0 XGI -nouveau Gallium 0.4 on NV31 NO MATCH -nouveau Gallium 0.4 on NV34 NO MATCH -nouveau Gallium 0.4 on NV36 NO MATCH -nouveau Gallium 0.4 on NV43 NO MATCH -nouveau Gallium 0.4 on NV44 NO MATCH -nouveau Gallium 0.4 on NV46 NO MATCH -nouveau Gallium 0.4 on NV49 NO MATCH -nouveau Gallium 0.4 on NV4A NO MATCH -nouveau Gallium 0.4 on NV4B NO MATCH -nouveau Gallium 0.4 on NV4C NO MATCH -nouveau Gallium 0.4 on NV4E NO MATCH -nouveau Gallium 0.4 on NV50 NO MATCH -nouveau Gallium 0.4 on NV63 NO MATCH -nouveau Gallium 0.4 on NV67 NO MATCH -nouveau Gallium 0.4 on NV84 NO MATCH -nouveau Gallium 0.4 on NV86 NO MATCH -nouveau Gallium 0.4 on NV92 NO MATCH -nouveau Gallium 0.4 on NV94 NO MATCH -nouveau Gallium 0.4 on NV96 NO MATCH -nouveau Gallium 0.4 on NV98 NO MATCH -nouveau Gallium 0.4 on NVA0 NO MATCH -nouveau Gallium 0.4 on NVA3 NO MATCH -nouveau Gallium 0.4 on NVA5 NO MATCH -nouveau Gallium 0.4 on NVA8 NO MATCH -nouveau Gallium 0.4 on NVAA NO MATCH -nouveau Gallium 0.4 on NVAC NO MATCH +GPU String Supported? Class Stats OpenGL Recognizer +------------------------------------------------------------------------------------------------------ ----------- ----- ----- ------ ------------------------------------ +AMD BARTS (HD 6800) supported 3 1 2.1 AMD BARTS (HD 6800) +AMD CAICOS (HD 6400) supported 3 0 0 AMD CAICOS (HD 6400) +AMD CAYMAN (HD 6900) supported 3 0 0 AMD CAYMAN (HD 6900) +AMD CEDAR (HD 5450) supported 2 0 2.1 AMD CEDAR (HD 5450) +AMD JUNIPER (HD 5700) supported 3 0 0 AMD JUNIPER (HD 5700) +AMD PARK supported 3 0 0 AMD PARK +AMD REDWOOD (HD 5500/5600) supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) +AMD RS780 (HD 3200) supported 0 1 2.1 AMD RS780 (HD 3200) +AMD RS880 (HD 4200) supported 0 1 3.2 AMD RS880 (HD 4200) +AMD RV610 (HD 2400) supported 1 0 0 AMD RV610 (HD 2400) +AMD RV620 (HD 3400) supported 1 0 0 AMD RV620 (HD 3400) +AMD RV630 (HD 2600) supported 2 0 0 AMD RV630 (HD 2600) +AMD RV635 (HD 3600) supported 3 0 1.4 AMD RV635 (HD 3600) +AMD RV670 (HD 3800) supported 3 0 0 AMD RV670 (HD 3800) +AMD RV710 (HD 4300) supported 0 1 1.4 AMD RV710 (HD 4300) +AMD RV730 (HD 4600) supported 3 0 1.4 AMD RV730 (HD 4600) +AMD RV770 (HD 4800) supported 3 0 0 AMD RV770 (HD 4800) +AMD RV790 (HD 4800) supported 3 0 0 AMD RV790 (HD 4800) +AMD TURKS (HD 6500/6600) supported 3 0 2.1 AMD TURKS (HD 6500/6600) +ATI NO MATCH +ATI 760G/Radeon 3000 supported 1 1 4 ATI Radeon 3000 +ATI ASUS AH24xx supported 1 1 4 ATI Radeon HD 2400 +ATI ASUS AH34xx supported 1 1 4 ATI Radeon HD 3400 +ATI ASUS AH36xx supported 3 1 4 ATI Radeon HD 3600 +ATI ASUS AH46xx supported 3 1 4 ATI Radeon HD 4600 +ATI ASUS AX3xx supported 2 1 4 ATI Radeon HD 4300 +ATI ASUS AX5xx supported 1 1 4 ATI Radeon HD 5xx +ATI ASUS EAH38xx supported 3 1 4 ATI Radeon HD 3800 +ATI ASUS EAH43xx supported 2 1 4 ATI Radeon HD 4300 +ATI ASUS EAH45xx supported 2 1 3.3 ATI Radeon HD 4500 +ATI ASUS EAH48xx supported 3 1 4 ATI Radeon HD 4800 +ATI ASUS EAH54xx supported 3 1 4.2 ATI Radeon HD 5400 +ATI ASUS EAH57xx supported 3 1 4.2 ATI Radeon HD 5700 +ATI ASUS EAH58xx supported 4 1 4.2 ATI Radeon HD 5800 +ATI ASUS EAH64xx supported 3 1 4.2 ATI Radeon HD 6400 +ATI ASUS EAH65xx supported 3 1 4.2 ATI Radeon HD 6500 +ATI ASUS EAH66xx supported 3 1 4.2 ATI Radeon HD 6600 +ATI ASUS EAH67xx supported 3 1 4.2 ATI Radeon HD 6700 +ATI ASUS EAH68xx supported 4 1 4.2 ATI Radeon HD 6800 +ATI ASUS EAH69xx supported 5 1 4.2 ATI Radeon HD 6900 +ATI ASUS EAH6xxx supported 5 1 4.2 ATI Radeon HD 6x00 +ATI ASUS EAH77xx supported 4 1 4.2 ATI Radeon HD 7700 +ATI ASUS HD7700 supported 4 1 4.2 ATI Radeon HD 7700 +ATI ASUS Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx +ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD +ATI All-in-Wonder PCI-E supported 1 0 0 ATI All-in-Wonder PCI-E +ATI Display Adapter supported 1 1 4.1 ATI Display Adapter +ATI FireGL supported 4 1 4.2 ATI FireGL +ATI FireGL 5200 supported 4 1 4.2 ATI FireGL +ATI FireGL 5xxx supported 4 1 4.2 ATI FireGL +ATI FireMV supported 0 1 3.2 ATI FireMV +ATI FirePro 2000 supported 2 1 4.2 ATI FirePro 2000 +ATI FirePro 4000 supported 2 0 4.1 ATI FirePro 4000 +ATI FirePro M supported 3 1 4.2 ATI FirePro M +ATI FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 +ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 +ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 +ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 +ATI Geforce 9500 GT unsupported 0 0 0 ATI GeForce Lulz +ATI Geforce 9600 GT unsupported 0 0 0 ATI GeForce Lulz +ATI Geforce 9800 GT unsupported 0 0 0 ATI GeForce Lulz +ATI IGP 340M unsupported 0 0 1.3 ATI IGP 340M +ATI Mobility Radeon supported 3 0 0 ATI Radeon +ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 +ATI Mobility Radeon 7xxx supported 0 1 1.3 ATI Mobility Radeon 7xxx +ATI Mobility Radeon 9600 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Mobility Radeon 9700 supported 0 1 2.1 ATI Mobility Radeon 9700 +ATI Mobility Radeon 9800 supported 1 0 0 ATI Mobility Radeon 9800 +ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 +ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 +ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 +ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 +ATI Mobility Radeon HD 3400 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Mobility Radeon HD 3600 supported 1 1 4 ATI Mobility Radeon HD 3600 +ATI Mobility Radeon HD 3800 supported 3 1 3.3 ATI Mobility Radeon HD 3800 +ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Mobility Radeon HD 4300 supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Mobility Radeon HD 4500 supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Mobility Radeon HD 4600 supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Mobility Radeon HD 4800 supported 3 1 3.3 ATI Mobility Radeon HD 4800 +ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 +ATI Mobility Radeon HD 5300 supported 3 0 0 ATI Mobility Radeon HD 5300 +ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v +ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v +ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v +ATI Mobility Radeon HD 5500 supported 3 0 4.2 ATI Mobility Radeon HD 5500 +ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v +ATI Mobility Radeon HD 5600 supported 3 1 4.2 ATI Mobility Radeon HD 5600 +ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v +ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v +ATI Mobility Radeon HD 5700 supported 3 1 4.1 ATI Mobility Radeon HD 5700 +ATI Mobility Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Mobility Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Mobility Radeon HD 6500M supported 3 1 4.2 ATI Radeon HD 6500 +ATI Mobility Radeon X1xxx supported 2 0 2.1 ATI Mobility Radeon X1000 +ATI Mobility Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx +ATI Mobility Radeon X3xx supported 1 1 2.1 ATI Radeon X300 +ATI Mobility Radeon X6xx supported 1 1 2.1 ATI Radeon X600 +ATI Mobility Radeon X7xx supported 2 1 2.1 ATI Radeon X700 +ATI Mobility Radeon Xxxx supported 2 0 2.1 ATI Mobility Radeon XX000 +ATI R300 (9700) supported 0 1 2.1 ATI R300 (9700) +ATI RV410 (X700) supported 1 0 0 ATI RV410 (X700) +ATI RV530 supported 1 0 0 ATI RV530 +ATI Radeon supported 3 0 0 ATI Radeon +ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 +ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 +ATI Radeon 3100 supported 0 1 3.3 ATI Radeon 3100 +ATI Radeon 5xxx supported 3 0 0 ATI Radeon 5xxx +ATI Radeon 7000 supported 0 1 2 ATI Radeon 7xxx +ATI Radeon 7xxx supported 0 1 2 ATI Radeon 7xxx +ATI Radeon 8xxx supported 0 0 0 ATI Radeon 8xxx +ATI Radeon 9000 supported 0 1 1.3 ATI Radeon 9000 +ATI Radeon 9100 supported 0 0 0 ATI Radeon 9100 +ATI Radeon 9200 supported 0 1 1.3 ATI Radeon 9200 +ATI Radeon 9500 supported 0 1 2.1 ATI Radeon 9500 +ATI Radeon 9600 supported 0 1 2.1 ATI Radeon 9600 +ATI Radeon 9700 supported 1 0 0 ATI Radeon 9700 +ATI Radeon 9800 supported 1 1 2.1 ATI Radeon 9800 +ATI Radeon HD 2300 supported 0 1 3.3 ATI Radeon HD 2300 +ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 +ATI Radeon HD 2600 supported 2 1 4 ATI Radeon HD 2600 +ATI Radeon HD 2900 supported 3 1 3.3 ATI Radeon HD 2900 +ATI Radeon HD 3000 supported 0 0 0 ATI Radeon HD 3000 +ATI Radeon HD 3100 supported 1 0 0 ATI Radeon HD 3100 +ATI Radeon HD 3200 supported 1 1 4 ATI Radeon HD 3200 +ATI Radeon HD 3300 supported 1 1 3.3 ATI Radeon HD 3300 +ATI Radeon HD 3400 supported 1 1 4 ATI Radeon HD 3400 +ATI Radeon HD 3500 supported 2 0 0 ATI Radeon HD 3500 +ATI Radeon HD 3600 supported 3 1 4 ATI Radeon HD 3600 +ATI Radeon HD 3700 supported 3 0 3.3 ATI Radeon HD 3700 +ATI Radeon HD 3800 supported 3 1 4 ATI Radeon HD 3800 +ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 +ATI Radeon HD 4300 supported 2 1 4 ATI Radeon HD 4300 +ATI Radeon HD 4400 supported 2 0 0 ATI Radeon HD 4400 +ATI Radeon HD 4500 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Radeon HD 4600 supported 3 1 4 ATI Radeon HD 4600 +ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 +ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 +ATI Radeon HD 5400 supported 3 1 4.2 ATI Radeon HD 5400 +ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 +ATI Radeon HD 5600 supported 3 1 4.2 ATI Radeon HD 5600 +ATI Radeon HD 5700 supported 3 1 4.2 ATI Radeon HD 5700 +ATI Radeon HD 5800 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Radeon HD 5900 supported 4 1 4.2 ATI Radeon HD 5900 +ATI Radeon HD 6200 supported 0 1 4.2 ATI Radeon HD 6200 +ATI Radeon HD 6300 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Radeon HD 6300M supported 1 1 4.2 ATI Radeon HD 6300 +ATI Radeon HD 6400 supported 3 1 4.2 ATI Radeon HD 6400 +ATI Radeon HD 64xx supported 3 1 4.2 ATI Radeon HD 6400 +ATI Radeon HD 6500 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Radeon HD 65xx supported 3 1 4.2 ATI Radeon HD 6500 +ATI Radeon HD 6600 supported 3 1 4.2 ATI Radeon HD 6600 +ATI Radeon HD 66xx supported 3 1 4.2 ATI Radeon HD 6600 +ATI Radeon HD 6700 supported 3 1 4.2 ATI Radeon HD 6700 +ATI Radeon HD 6700M supported 3 1 4.2 ATI Radeon HD 6700 +ATI Radeon HD 6800 supported 4 1 4.2 ATI Radeon HD 6800 +ATI Radeon HD 6900 supported 5 1 4.2 ATI Radeon HD 6900 +ATI Radeon HD 7200 supported 2 0 4.2 ATI Radeon HD 7200 +ATI Radeon HD 7300 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Radeon HD 7400 supported 2 0 4.2 ATI Radeon HD 7400 +ATI Radeon HD 7500 supported 3 1 4.2 ATI Radeon HD 7500 +ATI Radeon HD 7600 supported 3 0 4.2 ATI Radeon HD 7600 +ATI Radeon HD 7700 supported 4 1 4.2 ATI Radeon HD 7700 +ATI Radeon HD 7800 supported 5 1 4.2 ATI Radeon HD 7800 +ATI Radeon HD 7900 supported 5 1 4.2 ATI Radeon HD 7900 +ATI Radeon X1000 supported 2 0 2.1 ATI Radeon X1000 +ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 +ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 +ATI Radeon X13xx supported 2 1 2.1 ATI Radeon X1300 +ATI Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 +ATI Radeon X1500 supported 2 1 2.1 ATI Radeon X1500 +ATI Radeon X15xx supported 2 1 2.1 ATI Radeon X1500 +ATI Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 +ATI Radeon X16xx supported 2 1 2.1 ATI Radeon X1600 +ATI Radeon X17xx supported 2 1 2.1 ATI Radeon X1700 +ATI Radeon X1800 supported 3 1 2.1 ATI Radeon X1800 +ATI Radeon X18xx supported 3 1 2.1 ATI Radeon X1800 +ATI Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 +ATI Radeon X19xx supported 2 1 2.1 ATI Radeon X1900 +ATI Radeon X1xxx supported 2 0 2.1 ATI Radeon X1xxx +ATI Radeon X2xxx supported 2 0 2.1 ATI Radeon X2xxx +ATI Radeon X300 supported 1 1 2.1 ATI Radeon X300 +ATI Radeon X500 supported 1 1 2.1 ATI Radeon X500 +ATI Radeon X600 supported 1 1 2.1 ATI Radeon X600 +ATI Radeon X700 supported 2 1 2.1 ATI Radeon X700 +ATI Radeon X800 supported 1 1 2.1 ATI Radeon X800 +ATI Radeon Xpress supported 0 1 2.1 ATI Radeon Xpress +ATI Rage 128 supported 0 0 0 ATI Rage 128 +ATI Technologies NO MATCH +ATI Technologies Inc. NO MATCH +ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH +ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. 128MB ATI RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. 128MB ATI Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 256MB ATI RADEON X600 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES supported 1 0 2.1 ATI All-in-Wonder 9xxx +ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD 760G supported 1 1 3.3 ATI 760G/Radeon 3000 +ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI 760G/Radeon 3000 +ATI Technologies Inc. AMD FirePro 2270 supported 2 1 4.2 ATI FirePro 2000 +ATI Technologies Inc. AMD FirePro 2460 supported 2 1 4.2 ATI FirePro 2000 +ATI Technologies Inc. AMD FirePro M2000 supported 3 1 4.2 ATI FirePro M +ATI Technologies Inc. AMD FirePro M3900 supported 2 0 4.1 ATI FirePro M3900 +ATI Technologies Inc. AMD FirePro M4000 supported 3 1 4.2 ATI FirePro M +ATI Technologies Inc. AMD FirePro M5950 supported 3 1 4.2 ATI FirePro M +ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics supported 3 1 4.2 ATI FirePro M +ATI Technologies Inc. AMD FirePro V3900 supported 2 0 0 ATI FirePro 3000 +ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V4900 supported 2 0 4.1 ATI FirePro 4000 +ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V4900 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V5900 supported 3 0 0 ATI FirePro 5000 +ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V5900 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V7900 supported 3 0 0 ATI FirePro 7000 +ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V7900 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro W5000 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD FirePro W9000 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD RADEON HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD RADEON HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD RADEON HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD RADEON HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD RADEON HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD RADEON HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD RADEON HD6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD RADEON HD6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD RADEON HD6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon supported 3 0 0 ATI Radeon +ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M supported 4 0 4.2 ATI Radeon HD 8500D/G/M +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series supported 0 0 0 ATI Radeon 6xxx +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) supported 0 0 0 ATI Radeon 6xxx +ATI Technologies Inc. AMD Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. AMD Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. AMD Radeon HD 6200 series Graphics supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6250 supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6250 Graphics supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6250M supported 3 0 4.2 ATI Radeon HD 6200D/G/M +ATI Technologies Inc. AMD Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6290 Graphics supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. AMD Radeon HD 6290M supported 3 0 4.2 ATI Radeon HD 6200D/G/M +ATI Technologies Inc. AMD Radeon HD 6300 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6300M Series supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6310 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6310M supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6320 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320 Graphic supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320 Graphics supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320 series Graphics supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6320M supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6330M supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. AMD Radeon HD 6370D supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6370M supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD 6400 Series supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6410D supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6410D Graphics supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6450 supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450 Graphics supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450A supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450A Graphics supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. AMD Radeon HD 6450M supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6480M supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6490M supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon HD 6500 Series supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6500 series graphics supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6500M Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6510 Series supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6530D supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6530D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6530M supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6550A supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6550D supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6550D Graphics supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6550M supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. AMD Radeon HD 6570M supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6570M/5730 supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon HD 6600 Series supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon HD 6600M Series supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6610M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6625M Graphics supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6650A Graphics supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon HD 6670 supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. AMD Radeon HD 6700 Series supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6700 series supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6700M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6730M supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6750 supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6750M supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. AMD Radeon HD 6770M supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine supported 4 0 4.2 ATI Radeon HD 6700D/G/M +ATI Technologies Inc. AMD Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6800M Series supported 4 0 4.2 ATI Radeon HD 6800D/G/M +ATI Technologies Inc. AMD Radeon HD 6850 supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6850 X2 supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6850M supported 4 0 4.2 ATI Radeon HD 6800D/G/M +ATI Technologies Inc. AMD Radeon HD 6870 supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. AMD Radeon HD 6870M supported 4 0 4.2 ATI Radeon HD 6800D/G/M +ATI Technologies Inc. AMD Radeon HD 6900 Series supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6900M Series supported 4 0 4.2 ATI Radeon HD 6900D/G/M +ATI Technologies Inc. AMD Radeon HD 6970 supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6970M supported 4 0 4.2 ATI Radeon HD 6900D/G/M +ATI Technologies Inc. AMD Radeon HD 6990 supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. AMD Radeon HD 6990M supported 4 0 4.2 ATI Radeon HD 6900D/G/M +ATI Technologies Inc. AMD Radeon HD 7000 series supported 3 1 4.2 ATI Radeon HD 7000 Series +ATI Technologies Inc. AMD Radeon HD 7290 Graphics supported 2 0 4.2 ATI Radeon HD 7200 +ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7310 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7310 Graphics supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7310G supported 3 0 4.2 ATI Radeon HD 7300D/G/M +ATI Technologies Inc. AMD Radeon HD 7310M supported 3 0 4.2 ATI Radeon HD 7300D/G/M +ATI Technologies Inc. AMD Radeon HD 7340 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7340 Graphics supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7340G supported 3 0 4.2 ATI Radeon HD 7300D/G/M +ATI Technologies Inc. AMD Radeon HD 7340M supported 3 0 4.2 ATI Radeon HD 7300D/G/M +ATI Technologies Inc. AMD Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7350 Graphics supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon HD 7370M supported 3 0 4.2 ATI Radeon HD 7300D/G/M +ATI Technologies Inc. AMD Radeon HD 7400 Series supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7400G supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7400M Series supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7410M supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7420G supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7450 Graphics supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7450M supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7470 supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7470 Series supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon HD 7470M supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7480D supported 3 0 4.2 ATI Radeon HD 7400D/G/M +ATI Technologies Inc. AMD Radeon HD 7500 Series supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7500/7600 Series supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7500G supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7510 supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7520G supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7540D supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7550M supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7570 supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7570 Graphics supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7570 Series supported 3 1 4.2 ATI Radeon HD 7500 +ATI Technologies Inc. AMD Radeon HD 7570M supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7580D supported 4 0 4.2 ATI Radeon HD 7500D/G/M +ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon HD 7600G supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7600M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7620G supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7650A supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon HD 7650M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7650M Series supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660D supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7670 supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7690M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD 7700 Series supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD 7700M Series supported 4 0 4.2 ATI Radeon HD 7700D/G/M +ATI Technologies Inc. AMD Radeon HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M +ATI Technologies Inc. AMD Radeon HD 7770 supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD 7800 Series supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. AMD Radeon HD 7800M Series supported 4 0 4.2 ATI Radeon HD 7800D/G/M +ATI Technologies Inc. AMD Radeon HD 7870 supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. AMD Radeon HD 7870M supported 4 0 4.2 ATI Radeon HD 7800D/G/M +ATI Technologies Inc. AMD Radeon HD 7900 Series supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. AMD Radeon HD 7950 supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. AMD Radeon HD 7970 supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. AMD Radeon HD 7970M supported 4 0 4.2 ATI Radeon HD 7900D/G/M +ATI Technologies Inc. AMD Radeon HD 8210 supported 2 0 4.2 ATI Radeon HD 8200 +ATI Technologies Inc. AMD Radeon HD 8240 supported 2 0 4.2 ATI Radeon HD 8200 +ATI Technologies Inc. AMD Radeon HD 8250 supported 2 0 4.2 ATI Radeon HD 8200 +ATI Technologies Inc. AMD Radeon HD 8280G supported 3 0 4.2 ATI Radeon HD 8200D/G/M +ATI Technologies Inc. AMD Radeon HD 8330 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) +ATI Technologies Inc. AMD Radeon HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) +ATI Technologies Inc. AMD Radeon HD 8350G supported 3 0 4.2 ATI Radeon HD 8300D/G/M +ATI Technologies Inc. AMD Radeon HD 8400 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) +ATI Technologies Inc. AMD Radeon HD 8450 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) +ATI Technologies Inc. AMD Radeon HD 8450G supported 4 0 4.2 ATI Radeon HD 8400D/G/M +ATI Technologies Inc. AMD Radeon HD 8470 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) +ATI Technologies Inc. AMD Radeon HD 8470D supported 4 0 4.2 ATI Radeon HD 8400D/G/M +ATI Technologies Inc. AMD Radeon HD 8550G supported 4 0 4.2 ATI Radeon HD 8500D/G/M +ATI Technologies Inc. AMD Radeon HD 8570 supported 3 1 4.2 ATI Radeon HD 8500 (OEM) +ATI Technologies Inc. AMD Radeon HD 8570D supported 4 0 4.2 ATI Radeon HD 8500D/G/M +ATI Technologies Inc. AMD Radeon HD 8610G supported 4 0 4.2 ATI Radeon HD 8600D/G/M +ATI Technologies Inc. AMD Radeon HD 8650G supported 4 0 4.2 ATI Radeon HD 8600D/G/M +ATI Technologies Inc. AMD Radeon HD 8670D supported 4 0 4.2 ATI Radeon HD 8600D/G/M +ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics supported 4 0 4.2 ATI Radeon HD 8600D/G/M +ATI Technologies Inc. AMD Radeon HD 8700M Series supported 4 0 4.2 ATI Radeon HD 8700D/G/M +ATI Technologies Inc. AMD Radeon HD 8730M supported 4 0 4.2 ATI Radeon HD 8700D/G/M +ATI Technologies Inc. AMD Radeon HD 8750M supported 4 0 4.2 ATI Radeon HD 8700D/G/M +ATI Technologies Inc. AMD Radeon HD 8760 supported 4 1 4.2 ATI Radeon HD 8700 (OEM) +ATI Technologies Inc. AMD Radeon HD 8800M Series supported 4 0 4.2 ATI Radeon HD 8800D/G/M +ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) supported 5 1 4.2 ATI Radeon HD 8900 (OEM) +ATI Technologies Inc. AMD Radeon HD 8950 supported 5 1 4.2 ATI Radeon HD 8900 (OEM) +ATI Technologies Inc. AMD Radeon HD HD7850M supported 4 0 4.2 ATI Radeon HD 7800D/G/M +ATI Technologies Inc. AMD Radeon HD6370D Graphics supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon HD7610M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon HD7700 Series supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD7770 supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD7770 GHz Edition supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. AMD Radeon HD8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) +ATI Technologies Inc. AMD Radeon(TM) HD 6380G supported 3 1 4.2 ATI Radeon HD 6300D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6470M supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6480G supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) supported 3 0 4.2 ATI Radeon HD 6400D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6520G supported 4 1 4.2 ATI Radeon HD 6500D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6620G supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6630M supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 6650M supported 4 0 4.2 ATI Radeon HD 6600D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 7450 supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. AMD Radeon(TM) HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon(TM) HD 8350 supported 2 0 4.2 ATI Radeon HD 8300 (OEM) +ATI Technologies Inc. AMD Radeon(TM) HD8490 supported 2 0 4.2 ATI Radeon HD 8400 (OEM) +ATI Technologies Inc. AMD Radeon. HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. AMD Radeon. HD 7670M supported 4 0 4.2 ATI Radeon HD 7600D/G/M +ATI Technologies Inc. AMD Radeon. HD 7730M supported 4 0 4.2 ATI Radeon HD 7700D/G/M +ATI Technologies Inc. ASUS AH3450 Series supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ASUS AH3650 Series supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ASUS AH4650 Series supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ASUS ARES unsupported 0 0 0 ATI ARES +ATI Technologies Inc. ASUS ARES2 unsupported 0 0 0 ATI ARES +ATI Technologies Inc. ASUS EAH2400 Series supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ASUS EAH2600 Series supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ASUS EAH3450 Series supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ASUS EAH3650 Series supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ASUS EAH3850 Series supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ASUS EAH3870 Series supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ASUS EAH4350 series supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ASUS EAH4550 series supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ASUS EAH4650 series supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ASUS EAH4670 series supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ASUS EAH4770 Series supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ASUS EAH4770 series supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ASUS EAH4850 series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ASUS EAH4870 series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ASUS EAH4870x2 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ASUS EAH4890 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ASUS EAH5450 Series supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. ASUS EAH5550 Series supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ASUS EAH5570 series supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ASUS EAH5670 Series supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ASUS EAH5750 Series supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ASUS EAH5770 Series supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ASUS EAH5830 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ASUS EAH5850 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ASUS EAH5870 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ASUS EAH6450 Series supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. ASUS EAH6570 Series supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. ASUS EAH6670 Series supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. ASUS EAH6750 Series supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. ASUS EAH6770 Series supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. ASUS EAH6850 Series supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. ASUS EAH6870 Series supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. ASUS EAH6950 Series supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. ASUS EAH6970 Series supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. ASUS Extreme AX300 Series supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ASUS Extreme AX300SE/T supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ASUS Extreme AX550 Series supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ASUS Extreme AX600 Series supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. ASUS HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. ASUS HD7470 Series supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. ASUS HD7670 Series supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. ASUS HD7750 Series supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. ASUS HD7770 Series supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. ASUS HD7790 Series supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. ASUS HD7850 Series supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. ASUS HD7870 Series supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. ASUS HD7950 Series supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. ASUS HD7970 Series supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. ASUS X1300 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ASUS X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ASUS X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ASUS X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ASUS X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ASUS X1600 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1600 Series x86 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1650 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Radeon HD 5000 Series supported 3 1 4.2 ATI Radeon HD 5000 +ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI All-in-Wonder HD supported 1 1 3.3 ATI All-in-Wonder HD +ATI Technologies Inc. ATI Display Adapter supported 1 1 4.1 ATI Display Adapter +ATI Technologies Inc. ATI FireGL V3100 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3300 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3350 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V3600 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI FireGL 5200 +ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 +ATI Technologies Inc. ATI FireGL V5600 supported 2 1 3.3 ATI FireGL 5xxx +ATI Technologies Inc. ATI FireGL V7200 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V7600 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireGL V7700 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FireMV 2250 supported 0 1 3.2 ATI FireMV +ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 supported 0 1 3.2 ATI FireMV +ATI Technologies Inc. ATI FirePro 2260 supported 2 1 4.2 ATI FirePro 2000 +ATI Technologies Inc. ATI FirePro 2450 supported 2 1 4.2 ATI FirePro 2000 +ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro M5800 supported 3 0 0 ATI FirePro M5800 +ATI Technologies Inc. ATI FirePro M7740 supported 3 0 0 ATI FirePro M7740 +ATI Technologies Inc. ATI FirePro M7820 supported 5 1 4.2 ATI FirePro M7820 +ATI Technologies Inc. ATI FirePro M7820 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V3700 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V3800 supported 2 0 0 ATI FirePro 3000 +ATI Technologies Inc. ATI FirePro V3800 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V3800 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V4800 supported 2 0 4.1 ATI FirePro 4000 +ATI Technologies Inc. ATI FirePro V4800 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V4800 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V5700 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V5800 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V5800 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V7800 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V7800 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V8700 (FireGL) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI FirePro V9800 (FireGL V) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI MOBILITY FireGL V3200 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) supported 2 1 3.3 ATI FireGL 5xxx +ATI Technologies Inc. ATI MOBILITY FireGL V5200 supported 1 1 2.1 ATI FireGL 5200 +ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) supported 1 1 2.1 ATI FireGL 5200 +ATI Technologies Inc. ATI MOBILITY FireGL V5250 supported 1 1 2.1 ATI FireGL 5200 +ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI MOBILITY RADEON X1300 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI MOBILITY RADEON X1350 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI MOBILITY RADEON X1400 supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI MOBILITY RADEON X1600 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ATI MOBILITY RADEON X1700 supported 2 1 2.1 ATI Radeon X1700 +ATI Technologies Inc. ATI MOBILITY RADEON X1800 supported 3 1 2.1 ATI Radeon X1800 +ATI Technologies Inc. ATI MOBILITY RADEON X1900 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI MOBILITY RADEON X300 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. ATI MOBILITY RADEON X600 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. ATI MOBILITY RADEON X600 SE supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. ATI MOBILITY RADEON X700 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility FireGL V5700 supported 2 1 3.3 ATI FireGL 5xxx +ATI Technologies Inc. ATI Mobility FireGL V5725 supported 2 1 3.3 ATI FireGL 5xxx +ATI Technologies Inc. ATI Mobility Radeon 4100 supported 1 1 3.3 ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH +ATI Technologies Inc. ATI Mobility Radeon HD 2300 supported 0 1 2.1 ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 supported 1 1 3.3 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) supported 1 1 3.3 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT supported 1 1 3.3 ATI Mobility Radeon HD 2400 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 supported 1 1 3.3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT supported 1 1 3.3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) supported 1 1 3.3 ATI Mobility Radeon HD 2600 +ATI Technologies Inc. ATI Mobility Radeon HD 2700 supported 3 0 0 ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3410 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3430 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3450 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series supported 1 1 4 ATI Mobility Radeon HD 3400 +ATI Technologies Inc. ATI Mobility Radeon HD 3650 supported 1 1 4 ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI Mobility Radeon HD 3670 supported 1 1 4 ATI Mobility Radeon HD 3600 +ATI Technologies Inc. ATI Mobility Radeon HD 3850 supported 3 1 3.3 ATI Mobility Radeon HD 3800 +ATI Technologies Inc. ATI Mobility Radeon HD 3870 supported 3 1 3.3 ATI Mobility Radeon HD 3800 +ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 supported 3 1 3.3 ATI Mobility Radeon HD 3800 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4225 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4270 supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series supported 1 1 4 ATI Mobility Radeon HD 4200 +ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4330 supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4350 supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series supported 1 1 4 ATI Mobility Radeon HD 4300 +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4530 supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4550 supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4570 supported 1 1 4 ATI Mobility Radeon HD 4500 +ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4670 supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Mobility Radeon HD 4600 +ATI Technologies Inc. ATI Mobility Radeon HD 4830 supported 3 1 3.3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series supported 3 1 3.3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 4850 supported 3 1 3.3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 4870 supported 3 1 3.3 ATI Mobility Radeon HD 4800 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 supported 1 1 4.2 ATI Mobility Radeon 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series supported 1 1 4.2 ATI Mobility Radeon 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) supported 1 1 4.2 ATI Mobility Radeon 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) supported 1 1 4.2 ATI Mobility Radeon 5000 +ATI Technologies Inc. ATI Mobility Radeon HD 5100 supported 3 1 3.2 ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 5145 supported 3 1 3.2 ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 5165 supported 3 1 3.2 ATI Mobility Radeon HD 5100 +ATI Technologies Inc. ATI Mobility Radeon HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon HD 5400 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 540v supported 1 1 3.3 ATI Mobility Radeon HD 540v +ATI Technologies Inc. ATI Mobility Radeon HD 5430 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 545v supported 2 1 4 ATI Mobility Radeon HD 545v +ATI Technologies Inc. ATI Mobility Radeon HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI Mobility Radeon HD 550v supported 3 1 4 ATI Mobility Radeon HD 550v +ATI Technologies Inc. ATI Mobility Radeon HD 5570 supported 3 0 4.2 ATI Mobility Radeon HD 5500 +ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series supported 3 1 4.2 ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 560v supported 3 1 3.2 ATI Mobility Radeon HD 560v +ATI Technologies Inc. ATI Mobility Radeon HD 5650 supported 3 1 4.2 ATI Mobility Radeon HD 5600 +ATI Technologies Inc. ATI Mobility Radeon HD 565v supported 3 1 3.3 ATI Mobility Radeon HD 565v +ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series supported 3 1 4.1 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. ATI Mobility Radeon HD 5730 supported 3 1 4.1 ATI Mobility Radeon HD 5700 +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Mobility Radeon HD 6370 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI Mobility Radeon HD 6550 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Mobility Radeon HD 6570 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Mobility Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1350 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1400 supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 x86 supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 supported 2 1 2.1 ATI Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1700 supported 2 1 2.1 ATI Radeon X1700 +ATI Technologies Inc. ATI Mobility Radeon X1700 x86 supported 2 1 2.1 ATI Radeon X1700 +ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 supported 2 1 2.1 ATI Radeon X1700 +ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 supported 3 1 2.1 ATI Radeon X1800 +ATI Technologies Inc. ATI Mobility Radeon X1900 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Mobility Radeon X2300 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. ATI Mobility Radeon X2500 supported 2 0 2.1 ATI Mobility Radeon X2500 +ATI Technologies Inc. ATI Mobility Radeon. HD 530v supported 1 1 3.3 ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon. HD 5470 supported 2 1 4.2 ATI Mobility Radeon HD 5400 +ATI Technologies Inc. ATI RADEON 9600 Series supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. ATI RADEON 9600/X1050 Series supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. ATI RADEON E4690 supported 3 1 4 ATI RADEON E4690 +ATI Technologies Inc. ATI RADEON HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 +ATI Technologies Inc. ATI RADEON XPRESS 1100 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 1100 Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 1200 Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon 2100 supported 0 1 2.1 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 2100 Graphics supported 0 1 2.1 ATI Radeon 2100 +ATI Technologies Inc. ATI Radeon 3000 supported 1 1 4 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000 Graphics supported 1 1 4 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3000 Series Graphics supported 1 1 4 ATI Radeon 3000 +ATI Technologies Inc. ATI Radeon 3100 Graphics supported 0 1 3.3 ATI Radeon 3100 +ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) supported 0 1 3.3 ATI Radeon 3100 +ATI Technologies Inc. ATI Radeon 3100 Series Graphics supported 0 1 3.3 ATI Radeon 3100 +ATI Technologies Inc. ATI Radeon 9550 / X1050 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine supported 3 1 2.1 AMD BA (HD 6800) +ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) +ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) +ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) +ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine supported 3 0 0 AMD CAICOS (HD 6400) +ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine supported 2 0 2.1 AMD CEDAR (HD 5450) +ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH +ATI Technologies Inc. ATI Radeon HD 2350 supported 0 1 3.3 ATI Radeon HD 2300 +ATI Technologies Inc. ATI Radeon HD 2400 supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 PRO supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 Pro supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 Series supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 Series AGP supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 XT supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 PRO supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Pro supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Series supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 Series AGP supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600 XT supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2600/3600 Series supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. ATI Radeon HD 2900 GT supported 3 1 3.3 ATI Radeon HD 2900 +ATI Technologies Inc. ATI Radeon HD 2900 PRO supported 3 1 3.3 ATI Radeon HD 2900 +ATI Technologies Inc. ATI Radeon HD 2900 XT supported 3 1 3.3 ATI Radeon HD 2900 +ATI Technologies Inc. ATI Radeon HD 3200 Graphics supported 1 1 4 ATI Radeon HD 3200 +ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 3200 +ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) supported 1 1 4 ATI Radeon HD 3200 +ATI Technologies Inc. ATI Radeon HD 3300 Graphics supported 1 1 3.3 ATI Radeon HD 3300 +ATI Technologies Inc. ATI Radeon HD 3400 Series supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3450 supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3450 AGP supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3470 supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex supported 1 1 4 ATI Radeon HD 3400 +ATI Technologies Inc. ATI Radeon HD 3600 Series supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3650 supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3650 AGP supported 3 1 4 ATI Radeon HD 3600 +ATI Technologies Inc. ATI Radeon HD 3800 Series supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3850 supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3850 AGP supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 3870 X2 supported 3 1 4 ATI Radeon HD 3800 +ATI Technologies Inc. ATI Radeon HD 4200 supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4250 Graphics supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4270 supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4290 supported 1 1 4 ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4300 Series supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4350 supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD 4450 supported 2 0 0 ATI Radeon HD 4400 +ATI Technologies Inc. ATI Radeon HD 4500 Series supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4520 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4550 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4580 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4590 supported 2 1 3.3 ATI Radeon HD 4500 +ATI Technologies Inc. ATI Radeon HD 4600 Series supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4650 supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4670 supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD 4700 supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4700 Series supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4720 supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4730 supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4730 Series supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4770 supported 3 1 3.3 ATI Radeon HD 4700 +ATI Technologies Inc. ATI Radeon HD 4800 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4800 Series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4810 series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4830 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 Series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4850 X2 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 Series supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 4870 X2 supported 3 1 4 ATI Radeon HD 4800 +ATI Technologies Inc. ATI Radeon HD 5400 Series supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5470 supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. ATI Radeon HD 5500 supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5500 Series supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5530 supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5570 supported 3 1 4.2 ATI Radeon HD 5500 +ATI Technologies Inc. ATI Radeon HD 5600 Series supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5600/5700 supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5630 supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5670 supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 +ATI Technologies Inc. ATI Radeon HD 5700 Series supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5750 supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5750 Series supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5770 supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 +ATI Technologies Inc. ATI Radeon HD 5800 Series supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5850 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5870 supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine supported 4 1 4.2 ATI Radeon HD 5800 +ATI Technologies Inc. ATI Radeon HD 5900 Series supported 4 1 4.2 ATI Radeon HD 5900 +ATI Technologies Inc. ATI Radeon HD 5970 supported 4 1 4.2 ATI Radeon HD 5900 +ATI Technologies Inc. ATI Radeon HD 6230 supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6290 supported 0 1 4.2 ATI Radeon HD 6200 +ATI Technologies Inc. ATI Radeon HD 6350 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6390 supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. ATI Radeon HD 6490 supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. ATI Radeon HD 6510 supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Radeon HD 6570M supported 3 1 4.2 ATI Radeon HD 6500 +ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6770 supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 +ATI Technologies Inc. ATI Radeon HD 7350 supported 2 0 4.2 ATI Radeon HD 7300 +ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine supported 5 1 4.2 ATI Radeon HD 7900 +ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine supported 3 0 2.1 AMD PITCAIRN (HD 7870) +ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine supported 3 0 2.1 AMD TAHITI (HD 7000) +ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine unsupported 0 0 0 ATI Radeon VE +ATI Technologies Inc. ATI Radeon HD3750 supported 3 0 3.3 ATI Radeon HD 3700 +ATI Technologies Inc. ATI Radeon HD4300/HD4500 series supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. ATI Radeon HD4650 supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon HD4670 supported 3 1 4 ATI Radeon HD 4600 +ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine supported 3 0 1.4 AMD RV730 (HD 4600) +ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine supported 3 0 0 AMD RV790 (HD 4800) +ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) +ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) +ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine supported 3 0 2.1 AMD TURKS (HD 6500/6600) +ATI Technologies Inc. ATI Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. ATI Radeon X1050 Series supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. ATI Radeon X1200 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 Series supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1250 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1270 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. ATI Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. ATI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Radeon X1950 GT supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. ATI Radeon Xpress 1100 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1150 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1150 Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress Series supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition supported 1 0 0 ATI All-in-Wonder PCI-E +ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 supported 1 0 0 ATI All-in-Wonder PCI-E +ATI Technologies Inc. Diamond Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Diamond Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. FireGL X1-128 supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. FireMV 2400 PCI DDR x86 supported 0 1 3.2 ATI FireMV +ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 supported 0 1 3.2 ATI FireMV +ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics supported 2 0 4.1 ATI FirePro M3900 +ATI Technologies Inc. GIGABYTE RADEON 9600 PRO supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. GIGABYTE Radeon X1300 Pro supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. GIGABYTE Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. GIGABYTE Radeon X1600 PRO supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. GeCube RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. GeCube RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. GeCube Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. GeCube Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. GeForce 9600 GT x86/SSE2 unsupported 0 0 0 ATI GeForce Lulz +ATI Technologies Inc. GigaByte Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. Gigabyte RADEON X300 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Gigabyte RADEON X300 SE supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. HD3730 supported 3 0 3.3 ATI HD3700 +ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. HIGHTECH RADEON 9600XT supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. M52 x86 supported 1 0 0 ATI M52 +ATI Technologies Inc. M72-M supported 1 0 0 ATI M72 +ATI Technologies Inc. MEDION RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) supported 4 1 4.2 ATI FireGL +ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx +ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 supported 0 1 1.3 ATI Mobility Radeon 7xxx +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. MOBILITY RADEON 9600 x86 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 supported 1 1 2.1 ATI Mobility Radeon 9600 +ATI Technologies Inc. MOBILITY RADEON 9700 x86 supported 0 1 2.1 ATI Mobility Radeon 9700 +ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 +ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 supported 0 1 2.1 ATI Mobility Radeon 9700 +ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 supported 1 0 0 ATI Mobility Radeon 9800 +ATI Technologies Inc. MOBILITY RADEON X300 x86 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. MOBILITY RADEON X600 x86 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE supported 1 0 0 ATI Radeon RX9550 +ATI Technologies Inc. MSI Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Mobility Radeon X2300 HD supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 supported 2 0 2.1 ATI Mobility Radeon X2300 +ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7000 SDR x86 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 8xxx +ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 supported 0 0 0 ATI Radeon 8xxx +ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9000 +ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 +ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 +ATI Technologies Inc. RADEON 9100 IGP DDR x86 supported 0 0 0 ATI Radeon 9100 +ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 supported 0 0 0 ATI Radeon 9100 +ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. RADEON 9500 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9500 PRO / 9700 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9550 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9550 x86/SSE2 supported 0 1 2.1 ATI Radeon 9500 +ATI Technologies Inc. RADEON 9600 SERIES supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 TX supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 TX x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 XT x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600 x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9600SE x86/SSE2 supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. RADEON 9700 PRO supported 1 0 0 ATI Radeon 9700 +ATI Technologies Inc. RADEON 9800 PRO supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 PRO - Secondary supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 SERIES supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 XT supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON 9800 x86/SSE2 supported 1 1 2.1 ATI Radeon 9800 +ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 unsupported 0 0 1.3 ATI IGP 340M +ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. RADEON X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 Series supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300 x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300/X550 Series x86 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. RADEON X550 x86/SSE2 supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. RADEON X550XT supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 PRO x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 Series supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600 x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600/X550 Series supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600/X550 Series Secondary supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X600 +ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 SE supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 Series supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700 x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X700 +ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 GTO supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 GTO x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 PRO/GTO supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 SE x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 Series supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XL x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XT supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800/X850 Series supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X800GT supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X850 Series supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON X850 XT x86/SSE2 supported 1 1 2.1 ATI Radeon X800 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. ROBSON CE supported 3 0 4 ATI ROBSON +ATI Technologies Inc. ROBSON LE supported 3 0 4 ATI ROBSON +ATI Technologies Inc. RS780M supported 0 1 2.1 AMD RS780 (HD 3200) +ATI Technologies Inc. RS880 supported 0 1 3.2 AMD RS880 (HD 4200) +ATI Technologies Inc. RV250 DDR x86/SSE2 supported 0 0 0 ATI Radeon RV250 +ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. Radeon (TM) HD 6370M supported 1 1 4.2 ATI Radeon HD 6300 +ATI Technologies Inc. Radeon (TM) HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. Radeon (TM) HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. Radeon (TM) HD 6630M supported 3 1 4.2 ATI Radeon HD 6600 +ATI Technologies Inc. Radeon (TM) HD 6750M supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. Radeon (TM) HD 6770M supported 3 1 4.2 ATI Radeon HD 6700 +ATI Technologies Inc. Radeon (TM) HD 6850M supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. Radeon (TM) HD 7450M supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. Radeon (TM) HD 7470M supported 2 0 4.2 ATI Radeon HD 7400 +ATI Technologies Inc. Radeon (TM) HD 7670M supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. Radeon (TM) HD 7690M XT supported 3 0 4.2 ATI Radeon HD 7600 +ATI Technologies Inc. Radeon (TM) HD 7750M supported 4 1 4.2 ATI Radeon HD 7700 +ATI Technologies Inc. Radeon (TM) HD 7850M supported 5 1 4.2 ATI Radeon HD 7800 +ATI Technologies Inc. Radeon (TM) HD 8750M supported 4 1 4.2 ATI Radeon HD 8700 (OEM) +ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 7500 DDR x86 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 supported 0 1 2 ATI Radeon 7xxx +ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 supported 0 0 0 ATI Radeon 9100 +ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 supported 0 1 1.3 ATI Radeon 9200 +ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. Radeon HD 6470M supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. Radeon HD 6490M supported 3 1 4.2 ATI Radeon HD 6400 +ATI Technologies Inc. Radeon HD 6800 Series supported 4 1 4.2 ATI Radeon HD 6800 +ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X1050 supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1000 +ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) supported 2 0 2.1 ATI Radeon X1200 +ATI Technologies Inc. Radeon X1300 / X1550 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 / X1600 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. Radeon X1600 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Pro / X1300XT supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600 x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600/1650 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600/X1650 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 GTO supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 SE supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 SE x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Radeon X1700 FSC supported 2 1 2.1 ATI Radeon X1700 +ATI Technologies Inc. Radeon X1800 CrossFire Edition supported 3 1 2.1 ATI Radeon X1800 +ATI Technologies Inc. Radeon X1800 Series supported 3 1 2.1 ATI Radeon X1800 +ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 supported 3 1 2.1 ATI Radeon X1800 +ATI Technologies Inc. Radeon X1900 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 GT supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 GT x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 Series supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1900 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 CrossFire Edition supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Pro supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Series supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X1950 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1900 +ATI Technologies Inc. Radeon X300/X550/X1050 Series supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. Radeon X550/X700 Series supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. Radeon X550XTX supported 1 1 2.1 ATI Radeon X500 +ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) supported 0 1 2.1 ATI Radeon Xpress +ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS supported 0 1 2.1 ATI Radeon 9600 +ATI Technologies Inc. SAPPHIRE RADEON X300SE supported 1 1 2.1 ATI Radeon X300 +ATI Technologies Inc. SAPPHIRE Radeon X1550 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. SUMO 9640 supported 3 1 4.1 AMD SUMO +ATI Technologies Inc. SUMO 964A supported 3 1 4.1 AMD SUMO +ATI Technologies Inc. Sapphire RADEON X1600 PRO supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Sapphire RADEON X1600 XT supported 2 1 2.1 ATI Radeon X1600 +ATI Technologies Inc. Tul Corporation, RADEON X1300 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. Tul Corporation, RADEON X300SE supported 1 1 2.1 ATI RADEON X300SE +ATI Technologies Inc. VisionTek Radeon 4350 supported 2 1 4 ATI Radeon HD 4300 +ATI Technologies Inc. VisionTek Radeon HD 2400 PCI supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP supported 2 1 4 ATI Radeon HD 2600 +ATI Technologies Inc. VisionTek Radeon HD 5450 supported 3 1 4.2 ATI Radeon HD 5400 +ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI supported 1 1 4 ATI Radeon HD 2400 +ATI Technologies Inc. VisionTek Radeon X1300 supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. VisionTek Radeon X1300 Series supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. VisionTek Radeon X1300 XGE supported 2 1 2.1 ATI Radeon X1300 +ATI Technologies Inc. VisionTek Radeon X1550 Series supported 2 1 2.1 ATI Radeon X1500 +ATI Technologies Inc. WRESTLER 9802 supported 3 1 4 AMD WRESTLER +ATI Technologies Inc. XFX Radeon HD 4570 supported 2 1 3.3 ATI Radeon HD 4500 +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 supported 0 1 3.2 AMD RS880 (HD 4200) +Alex Mohr GL Hijacker! unsupported 0 0 0 Hijacker +Brian Paul Mesa X11 unsupported 1 1 3 Mesa +Gallium supported 1 1 2.1 Gallium +Humper supported 0 1 2.1 Humper +Humper Chromium supported 0 1 2.1 Humper +Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze +Imagination Technologies PowerVR SGX545 supported 1 1 3 PowerVR SGX545 +Intel NO MATCH +Intel 3D-Analyze v2.3 - http://www.tommti-systems.com supported 2 0 0 Intel 3D-Analyze +Intel 4 Series Internal supported 1 1 2.1 Intel 4 Series Internal +Intel 845G unsupported 0 1 1.4 Intel 845G +Intel 855GM unsupported 0 1 1.4 Intel 855GM +Intel 865G unsupported 0 1 1.4 Intel 865G +Intel 915G unsupported 0 1 1.4 Intel 915G +Intel 915GM unsupported 0 1 1.4 Intel 915GM +Intel 945G supported 0 1 1.4 Intel 945G +Intel 945GM supported 0 1 1.4 Intel 945GM +Intel 950 supported 0 1 1.4 Intel 950 +Intel 965 supported 0 1 2.1 Intel 965 +Intel Bear Lake unsupported 1 1 1.4 Intel Bear Lake +Intel Broadwater unsupported 0 1 1.4 Intel Broadwater +Intel Brookdale unsupported 0 1 1.3 Intel Brookdale +Intel Cantiga unsupported 0 1 2 Intel Cantiga +Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series supported 0 1 3 Intel GMA 3600 +Intel Eaglelake supported 1 1 2 Intel Eaglelake +Intel G33 unsupported 1 1 1.4 Intel G33 +Intel G41 supported 1 1 2.1 Intel G41 +Intel G45 supported 1 1 2.1 Intel G45 +Intel Graphics Media HD supported 1 1 2.1 Intel Graphics Media HD +Intel HD Graphics supported 2 1 4 Intel HD Graphics +Intel HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 +Intel HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 +Intel HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 +Intel Inc. Intel GMA 950 OpenGL Engine supported 0 1 1.4 Intel 950 +Intel Inc. Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 +Intel Inc. Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 +Intel Inc. Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 +Intel Inc. Intel HD Graphics 5000 OpenGL Engine supported 4 0 4 Intel HD Graphics 5000 +Intel Inc. Intel HD Graphics OpenGL Engine supported 2 1 4 Intel HD Graphics +Intel Intel 845G unsupported 0 1 1.4 Intel 845G +Intel Intel 855GM unsupported 0 1 1.4 Intel 855GM +Intel Intel 865G unsupported 0 1 1.4 Intel 865G +Intel Intel 915G unsupported 0 1 1.4 Intel 915G +Intel Intel 915GM unsupported 0 1 1.4 Intel 915GM +Intel Intel 945G supported 0 1 1.4 Intel 945G +Intel Intel 945GM supported 0 1 1.4 Intel 945GM +Intel Intel 965/963 Graphics Media Accelerator supported 0 1 2.1 Intel 965 +Intel Intel Bear Lake B unsupported 1 1 1.4 Intel Bear Lake +Intel Intel Broadwater G unsupported 0 1 1.4 Intel Broadwater +Intel Intel Brookdale-G unsupported 0 1 1.3 Intel Brookdale +Intel Intel Cantiga unsupported 0 1 2 Intel Cantiga +Intel Intel Eaglelake supported 1 1 2 Intel Eaglelake +Intel Intel Grantsdale-G supported 1 0 0 Intel Grantsdale +Intel Intel Iris Pro Graphics 5200 supported 4 0 4 Intel Intel Iris Pro Graphics 5200 +Intel Intel Montara-GM unsupported 0 1 1.3 Intel Montara +Intel Intel Pineview Platform supported 0 1 1.4 Intel Pineview +Intel Intel Springdale-G unsupported 0 1 1.3 Intel Springdale +Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics +Intel Intel(R) 4 Series Internal Chipset supported 1 1 2.1 Intel 4 Series Internal +Intel Intel(R) B43 Express Chipset supported 1 1 2.1 Intel B45/B43 +Intel Intel(R) G41 Express Chipset supported 1 1 2.1 Intel G41 +Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) supported 1 1 2.1 Intel G41 +Intel Intel(R) G41 Express Chipset v2 supported 1 1 2.1 Intel G41 +Intel Intel(R) G45/G43 Express Chipset supported 1 1 2.1 Intel G45 +Intel Intel(R) G45/G43/G41 Express Chipset supported 1 1 2.1 Intel G41 +Intel Intel(R) Graphics Media Accelerator HD supported 1 1 2.1 Intel Graphics Media HD +Intel Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics +Intel Intel(R) HD Graphics 100 supported 2 1 4 Intel HD Graphics +Intel Intel(R) HD Graphics 2000 supported 2 0 3.1 Intel HD Graphics 2000 +Intel Intel(R) HD Graphics 2500 supported 2 0 4.2 Intel HD Graphics 2500 +Intel Intel(R) HD Graphics 3000 supported 3 1 3.1 Intel HD Graphics 3000 +Intel Intel(R) HD Graphics 4000 supported 3 1 4.2 Intel HD Graphics 4000 +Intel Intel(R) HD Graphics 4400 supported 3 0 4.2 Intel HD Graphics 4400 +Intel Intel(R) HD Graphics 4600 supported 3 0 4.2 Intel HD Graphics 4600 +Intel Intel(R) HD Graphics 5000 supported 4 0 4 Intel HD Graphics 5000 +Intel Intel(R) HD Graphics BR-1004-01Y1 supported 2 1 4 Intel HD Graphics +Intel Intel(R) HD Graphics Family supported 2 1 4 Intel HD Graphics +Intel Intel(R) HD Graphics P3000 supported 2 1 4 Intel HD Graphics +Intel Intel(R) HD Graphics P4000 supported 2 1 4 Intel HD Graphics +Intel Intel(R) Q45/Q43 Express Chipset supported 1 1 2.1 Intel Q45/Q43 +Intel Iris OpenGL Graphics Engine supported 4 0 4 Intel Intel Iris OpenGL Engine +Intel Mobile 4 Series supported 0 1 2.1 Intel Mobile 4 Series +Intel Mobile Intel(R) 4 Series Express Chipset Family supported 0 1 2.1 Intel Mobile 4 Series +Intel Mobile Intel(R) 4 Series Express Chipset Family v2 supported 0 1 2.1 Intel Mobile 4 Series +Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) supported 0 0 2.1 Intel Mobile 45 Express +Intel Mobile Intel(R) HD Graphics supported 2 1 4 Intel HD Graphics +Intel Montara unsupported 0 1 1.3 Intel Montara +Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM +Intel Open Source Technology Center Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G +Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G +Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM +Intel Open Source Technology Center Mesa DRI Intel(R) 945G supported 0 1 1.4 Intel 945G +Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G +Intel Open Source Technology Center Mesa DRI Intel(R) 945GM supported 0 1 1.4 Intel 945GM +Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 +Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 +Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 supported 1 1 2.1 Intel G45 +Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 supported 1 1 2.1 Intel G45 +Intel Open Source Technology Center Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Q35 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 +Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Mobile Intelå¨ GM45 Express Chipset unsupported 1 1 3 Mesa +Intel Open Source Technology Center Mesa DRI Mobile Intelå¨ GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa +Intel Pineview supported 0 1 1.4 Intel Pineview +Intel Q45/Q43 supported 1 1 2.1 Intel Q45/Q43 +Intel Royal BNA Driver unsupported 0 0 0 Intel Royal BNA +Intel Springdale unsupported 0 1 1.3 Intel Springdale +Intel X3100 supported 1 1 2.1 Intel X3100 +Matrox Graphics Inc. Matrox ICD for M-Series unsupported 0 0 0 Matrox +Matrox Graphics Inc. Matrox G400 unsupported 0 0 0 Matrox +Matrox Graphics Inc. Matrox ICD for Parhelia unsupported 0 0 0 Matrox +Mesa unsupported 1 1 3 Mesa +Mesa Project Software Rasterizer unsupported 1 1 3 Mesa +Mesa project: www.mesa3d.org Mesa GLX Indirect unsupported 1 1 3 Mesa +NVIDIA 205 supported 3 1 3.3 NVIDIA 205 +NVIDIA 210 supported 3 1 3.3 NVIDIA 210 +NVIDIA 310 supported 3 1 3.3 NVIDIA 310 +NVIDIA 310M supported 2 0 3.3 NVIDIA 310M +NVIDIA 315 supported 3 1 3.3 NVIDIA 315 +NVIDIA 315M supported 2 0 3.3 NVIDIA 310M +NVIDIA 320M supported 2 0 3.3 NVIDIA 320M +NVIDIA 405 supported 3 0 3.3 NVIDIA 405 +NVIDIA 410 supported 3 0 3.3 NVIDIA 410 +NVIDIA 510 supported 3 0 0 NVIDIA 510 +NVIDIA 610M supported 3 1 4.3 NVIDIA 610M +NVIDIA Corporation /PCI/SSE2 NO MATCH +NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 0 0 ATI 3D-Analyze +NVIDIA Corporation C51/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 +NVIDIA Corporation C51G/PCI/SSE2/3DNOW! supported 0 1 2 NVIDIA C51 +NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! unsupported 0 0 0 NVIDIA D1xP1 +NVIDIA Corporation D14P1-30/PCIe/SSE2 unsupported 0 0 0 NVIDIA D1xP1 +NVIDIA Corporation D9M-20/PCI/SSE2 supported 1 0 0 NVIDIA D9M +NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA D9M +NVIDIA Corporation G72/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G72 +NVIDIA Corporation G73/AGP/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 +NVIDIA Corporation G73/PCI/SSE2/3DNOW! supported 1 0 0 NVIDIA G73 +NVIDIA Corporation G84-50/PCI/SSE2 supported 2 0 0 NVIDIA G84 +NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! supported 3 0 0 NVIDIA G92 +NVIDIA Corporation GK106/PCIe/SSE2 supported 5 0 4.3 NVIDIA GK106 +NVIDIA Corporation GRID K2/PCIe/SSE2 unsupported 0 0 1.5 NVIDIA GRID +NVIDIA Corporation GeForce GTX 555/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce 205/PCI/SSE2 supported 3 1 3.3 NVIDIA 205 +NVIDIA Corporation GeForce 210/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 +NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 +NVIDIA Corporation GeForce 210/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 210 +NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 210 +NVIDIA Corporation GeForce 310/PCI/SSE2 supported 3 1 3.3 NVIDIA 310 +NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 +NVIDIA Corporation GeForce 310/PCIe/SSE2 supported 3 1 3.3 NVIDIA 310 +NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 310 +NVIDIA Corporation GeForce 310M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M +NVIDIA Corporation GeForce 310M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M +NVIDIA Corporation GeForce 315/PCI/SSE2 supported 3 1 3.3 NVIDIA 315 +NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 +NVIDIA Corporation GeForce 315/PCIe/SSE2 supported 3 1 3.3 NVIDIA 315 +NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA 315 +NVIDIA Corporation GeForce 315M/PCI/SSE2 supported 2 0 3.3 NVIDIA 310M +NVIDIA Corporation GeForce 315M/PCIe/SSE2 supported 2 0 3.3 NVIDIA 310M +NVIDIA Corporation GeForce 320M/PCI/SSE2 supported 2 0 3.3 NVIDIA 320M +NVIDIA Corporation GeForce 320M/integrated/SSE2 supported 2 0 3.3 NVIDIA 320M +NVIDIA Corporation GeForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 405/PCIe/SSE2 supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 410M/PCI/SSE2 supported 3 0 0 NVIDIA 410M +NVIDIA Corporation GeForce 410M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M +NVIDIA Corporation GeForce 505/PCIe/SSE2 supported 3 0 0 NVIDIA 505 +NVIDIA Corporation GeForce 510/PCI/SSE2 supported 3 0 0 NVIDIA 510 +NVIDIA Corporation GeForce 510/PCIe/SSE2 supported 3 0 0 NVIDIA 510 +NVIDIA Corporation GeForce 605/PCI/SSE2 supported 3 1 4.3 NVIDIA 605 +NVIDIA Corporation GeForce 605/PCIe/SSE2 supported 3 1 4.3 NVIDIA 605 +NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 605 +NVIDIA Corporation GeForce 610/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! supported 3 0 3.3 NVIDIA 405 +NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M +NVIDIA Corporation GeForce 610M/PCIe/SSE2 supported 3 1 4.3 NVIDIA 610M +NVIDIA Corporation GeForce 615/PCIe/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA Corporation GeForce 6500/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 +NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 +NVIDIA Corporation GeForce 6500/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6500 +NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6500 +NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 +NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 6700 +NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 supported 3 1 4.3 NVIDIA 610M +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA 610M +NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 710A/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 710M/PCIe/SSE2 supported 3 0 4.3 NVIDIA 710M +NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 +NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 +NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7500 +NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7500 +NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 +NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 +NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8100 +NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8100 +NVIDIA Corporation GeForce 8200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 +NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 +NVIDIA Corporation GeForce 8200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200 +NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200 +NVIDIA Corporation GeForce 8200M G/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA Corporation GeForce 8200M G/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation GeForce 8400M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M +NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8700M +NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M +NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M +NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M +NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 8800M +NVIDIA Corporation GeForce 9100/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 +NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 +NVIDIA Corporation GeForce 9100/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100 +NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100 +NVIDIA Corporation GeForce 9100M G/PCI/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M +NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M +NVIDIA Corporation GeForce 9100M G/integrated/SSE2 supported 0 0 3.3 NVIDIA GeForce 9100M +NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! supported 0 0 3.3 NVIDIA GeForce 9100M +NVIDIA Corporation GeForce 9200/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 +NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 +NVIDIA Corporation GeForce 9200/integrated/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200 +NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! supported 1 0 3.3 NVIDIA GeForce 9200 +NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300/integrated/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA Corporation GeForce 9300M G/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400/integrated/SSE2 supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation GeForce 9400M G/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA Corporation GeForce 9400M G/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA Corporation GeForce 9400M/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA Corporation GeForce 9400M/integrated/SSE2 supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M +NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! supported 1 1 3.3 NVIDIA GeForce 9500M +NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 supported 1 1 3.3 NVIDIA GeForce 9500M +NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M +NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M +NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M +NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 supported 0 1 3.3 NVIDIA GeForce 9700M +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800 S/PCI/SSE2 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA Corporation GeForce FX 5100/AGP/SSE2 supported 3 0 0 NVIDIA 510 +NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200/PCI/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA Corporation GeForce FX 5500/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 +NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 +NVIDIA Corporation GeForce FX 5500/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5500 +NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5500 +NVIDIA Corporation GeForce FX 5600/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 +NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 +NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5600 +NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5600 +NVIDIA Corporation GeForce FX 5700/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX 5900/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 +NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 +NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce FX Go5200 +NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce FX Go5200 +NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 +NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 supported 0 0 0 NVIDIA GeForce FX Go5300 +NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 +NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 supported 0 1 2.1 NVIDIA GeForce FX Go5600 +NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 supported 1 1 1.5 NVIDIA GeForce FX Go5700 +NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! supported 1 1 1.5 NVIDIA GeForce FX Go5700 +NVIDIA Corporation GeForce G 103M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G 103M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G 105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G 105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G 110M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 110M +NVIDIA Corporation GeForce G100/PCI/SSE2 supported 3 1 4.2 NVIDIA G100 +NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 +NVIDIA Corporation GeForce G100/PCIe/SSE2 supported 3 1 4.2 NVIDIA G100 +NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! supported 3 1 4.2 NVIDIA G100 +NVIDIA Corporation GeForce G102M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G102M/integrated/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G105M/PCI/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G105M/PCIe/SSE2 supported 1 1 3.3 NVIDIA G 100M +NVIDIA Corporation GeForce G200/PCI/SSE2 supported 2 1 3.3 NVIDIA G200 +NVIDIA Corporation GeForce G200/integrated/SSE2 supported 2 1 3.3 NVIDIA G200 +NVIDIA Corporation GeForce G205M/PCI/SSE2 supported 1 0 0 NVIDIA G 200M +NVIDIA Corporation GeForce G205M/integrated/SSE2 supported 1 0 0 NVIDIA G 200M +NVIDIA Corporation GeForce G210/PCI/SSE2 supported 3 1 3.3 NVIDIA G210 +NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 +NVIDIA Corporation GeForce G210/PCIe/SSE2 supported 3 1 3.3 NVIDIA G210 +NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! supported 3 1 3.3 NVIDIA G210 +NVIDIA Corporation GeForce G210M/PCI/SSE2 supported 3 0 3.3 NVIDIA G210M +NVIDIA Corporation GeForce G210M/PCIe/SSE2 supported 3 0 3.3 NVIDIA G210M +NVIDIA Corporation GeForce GT 120/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 120/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 120M/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation GeForce GT 130/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 130 +NVIDIA Corporation GeForce GT 130/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 130 +NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! supported 2 0 3.3 NVIDIA GT 130 +NVIDIA Corporation GeForce GT 130M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 130M +NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 130M +NVIDIA Corporation GeForce GT 140/PCI/SSE2 supported 2 0 3.3 NVIDIA GT 140 +NVIDIA Corporation GeForce GT 140/PCIe/SSE2 supported 2 0 3.3 NVIDIA GT 140 +NVIDIA Corporation GeForce GT 220/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 220 +NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 +NVIDIA Corporation GeForce GT 220/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 220 +NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 220 +NVIDIA Corporation GeForce GT 220M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 220M +NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 220M +NVIDIA Corporation GeForce GT 230/PCI/SSE2 supported 2 1 3.3 NVIDIA GT 230 +NVIDIA Corporation GeForce GT 230/PCIe/SSE2 supported 2 1 3.3 NVIDIA GT 230 +NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA GT 230 +NVIDIA Corporation GeForce GT 230M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 230M +NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 230M +NVIDIA Corporation GeForce GT 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GT 240 +NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 +NVIDIA Corporation GeForce GT 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GT 240 +NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GT 240 +NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M +NVIDIA Corporation GeForce GT 240M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 240M +NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! supported 3 1 3.3 NVIDIA GT 240M +NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 240M +NVIDIA Corporation GeForce GT 320/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320 +NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 +NVIDIA Corporation GeForce GT 320/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320 +NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 320 +NVIDIA Corporation GeForce GT 320M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M +NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M +NVIDIA Corporation GeForce GT 325M/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 320M +NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 320M +NVIDIA Corporation GeForce GT 330/PCI/SSE2 supported 3 0 3.3 NVIDIA GT 330 +NVIDIA Corporation GeForce GT 330/PCIe/SSE2 supported 3 0 3.3 NVIDIA GT 330 +NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! supported 3 0 3.3 NVIDIA GT 330 +NVIDIA Corporation GeForce GT 330M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M +NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M +NVIDIA Corporation GeForce GT 335M/PCI/SSE2 supported 3 1 3.3 NVIDIA GT 330M +NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 supported 3 1 3.3 NVIDIA GT 330M +NVIDIA Corporation GeForce GT 340/PCI/SSE2 supported 3 0 0 NVIDIA GT 340 +NVIDIA Corporation GeForce GT 340/PCIe/SSE2 supported 3 0 0 NVIDIA GT 340 +NVIDIA Corporation GeForce GT 415/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 415 +NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 415 +NVIDIA Corporation GeForce GT 415M/PCI/SSE2 supported 3 0 0 NVIDIA 410M +NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 supported 3 0 0 NVIDIA 410M +NVIDIA Corporation GeForce GT 420/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420 +NVIDIA Corporation GeForce GT 420/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420 +NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 420 +NVIDIA Corporation GeForce GT 420M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M +NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M +NVIDIA Corporation GeForce GT 425M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 420M +NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 420M +NVIDIA Corporation GeForce GT 430/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430 +NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 +NVIDIA Corporation GeForce GT 430/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430 +NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 430 +NVIDIA Corporation GeForce GT 435M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 430M +NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 430M +NVIDIA Corporation GeForce GT 440/PCI/SSE2 supported 4 1 4.3 NVIDIA GT 440 +NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 +NVIDIA Corporation GeForce GT 440/PCIe/SSE2 supported 4 1 4.3 NVIDIA GT 440 +NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GT 440 +NVIDIA Corporation GeForce GT 445M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 440M +NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 440M +NVIDIA Corporation GeForce GT 520/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520 +NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 +NVIDIA Corporation GeForce GT 520/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520 +NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 520 +NVIDIA Corporation GeForce GT 520M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 525M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 520M +NVIDIA Corporation GeForce GT 530/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 530 +NVIDIA Corporation GeForce GT 530/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 530 +NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 530 +NVIDIA Corporation GeForce GT 540M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540M +NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540M +NVIDIA Corporation GeForce GT 545/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 540 +NVIDIA Corporation GeForce GT 545/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 540 +NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 540 +NVIDIA Corporation GeForce GT 550M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M +NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M +NVIDIA Corporation GeForce GT 555M/PCI/SSE2 supported 3 1 4.3 NVIDIA GT 550M +NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 550M +NVIDIA Corporation GeForce GT 610/PCIe/SSE2 supported 3 1 4.3 NVIDIA GT 61x +NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GT 61x +NVIDIA Corporation GeForce GT 620/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 62x +NVIDIA Corporation GeForce GT 620/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x +NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 62x +NVIDIA Corporation GeForce GT 620M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 620M +NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M +NVIDIA Corporation GeForce GT 625/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 62x +NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M +NVIDIA Corporation GeForce GT 630/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 63x +NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 63x +NVIDIA Corporation GeForce GT 630M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M +NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M +NVIDIA Corporation GeForce GT 635M/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 630M +NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 630M +NVIDIA Corporation GeForce GT 640/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x +NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! supported 3 0 4.3 NVIDIA GT 64x +NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 supported 3 0 4.3 NVIDIA GT 640M +NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M +NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M +NVIDIA Corporation GeForce GT 645/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 64x +NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 640M +NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 650M +NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 720M +NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M +NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 730M +NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 740M +NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 750M +NVIDIA Corporation GeForce GT620M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M +NVIDIA Corporation GeForce GT625M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GT 620M +NVIDIA Corporation GeForce GTS 150/PCI/SSE2 supported 2 0 0 NVIDIA GTS 150 +NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 supported 2 0 0 NVIDIA GTS 160M +NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 supported 2 0 0 NVIDIA GTS 160M +NVIDIA Corporation GeForce GTS 240/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 240 +NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 240 +NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 240 +NVIDIA Corporation GeForce GTS 250/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTS 250M +NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTS 250M +NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 supported 4 1 3.3 NVIDIA GTS 350M +NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTS 350M +NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 supported 5 1 3.3 NVIDIA GTS 360M +NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 supported 5 1 3.3 NVIDIA GTS 360M +NVIDIA Corporation GeForce GTS 450/PCI/SSE2 supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA Corporation GeForce GTX 260/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 260M +NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 260M +NVIDIA Corporation GeForce GTX 275/PCI/SSE2 supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA Corporation GeForce GTX 280/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M +NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M +NVIDIA Corporation GeForce GTX 285/PCI/SSE2 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 supported 3 0 3.3 NVIDIA GTX 280M +NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 supported 3 0 3.3 NVIDIA GTX 280M +NVIDIA Corporation GeForce GTX 295/PCI/SSE2 supported 5 0 3.3 NVIDIA GTX 290 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 supported 5 0 3.3 NVIDIA GTX 290 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! supported 5 0 3.3 NVIDIA GTX 290 +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 supported 4 1 4.3 NVIDIA GTX 460M +NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 supported 4 1 4.3 NVIDIA GTX 460M +NVIDIA Corporation GeForce GTX 465/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation GeForce GTX 470/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 470M +NVIDIA Corporation GeForce GTX 480/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 480 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 480 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 480 +NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M +NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 supported 3 1 4.3 NVIDIA GTX 480M +NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 480M +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 supported 3 0 4.3 NVIDIA GTX 560M +NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 supported 3 0 4.3 NVIDIA GTX 560M +NVIDIA Corporation GeForce GTX 570/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 supported 5 0 4.3 NVIDIA GTX 570M +NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 570M +NVIDIA Corporation GeForce GTX 580/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 580M +NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 580M +NVIDIA Corporation GeForce GTX 590/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 590 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 590 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 590 +NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 64x +NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 660M +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 67x +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 67x +NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 68x +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! supported 5 1 4.3 NVIDIA GTX 68x +NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M +NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 680M +NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 supported 5 1 4.3 NVIDIA GTX 69x +NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 76x +NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M +NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 760M +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 77x +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX 77x +NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 770M +NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 78x +NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX 780M +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! supported 5 0 4.3 NVIDIA GTX TITAN +NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 supported 5 0 4.3 NVIDIA GTX TITAN +NVIDIA Corporation GeForce Go 6100/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA Corporation GeForce Go 6150/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA Corporation GeForce Go 6200/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce Go 6200 +NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! supported 0 0 1.5 NVIDIA GeForce Go 6200 +NVIDIA Corporation GeForce Go 6400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 +NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 6400 +NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 +NVIDIA Corporation GeForce Go 6600/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6600 +NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 +NVIDIA Corporation GeForce Go 6800/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 +NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 6800 +NVIDIA Corporation GeForce Go 7200/PCI/SSE2 supported 1 0 2.1 NVIDIA GeForce Go 7200 +NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA GeForce Go 7200 +NVIDIA Corporation GeForce Go 7300/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 +NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7300 +NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7300 +NVIDIA Corporation GeForce Go 7400/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 +NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7400 +NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7400 +NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation GeForce Go 7600/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation GeForce Go 7700/PCI/SSE2 supported 0 1 2.1 NVIDIA GeForce Go 7700 +NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 +NVIDIA Corporation GeForce Go 7800/PCI/SSE2 supported 2 0 0 NVIDIA GeForce Go 7800 +NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX +NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 supported 0 0 1.5 NVIDIA GeForce PCX +NVIDIA Corporation GeForce2 GTS/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 +NVIDIA Corporation GeForce2 MX/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 +NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 2 +NVIDIA Corporation GeForce2 MX/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 2 +NVIDIA Corporation GeForce3/AGP/SSE2 supported 2 1 2.1 NVIDIA GeForce 3 +NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! supported 2 1 2.1 NVIDIA GeForce 3 +NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA Corporation ION LE/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation ION LE/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation ION/PCI/SSE2 supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation ION/PCIe/SSE2 supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation ION/PCIe/SSE2/3DNOW! supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation ION/integrated/SSE2 supported 2 1 3.3 NVIDIA ION b +NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! supported 1 0 2.1 NVIDIA MCP61 +NVIDIA Corporation MCP7A-O/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A +NVIDIA Corporation MCP7A-P/PCI/SSE2 supported 1 0 0 NVIDIA MCP7A +NVIDIA Corporation N10P-GV2/PCI/SSE2 supported 1 0 2.1 NVIDIA N10 +NVIDIA Corporation N11M-GE2/PCI/SSE2 supported 2 0 3.1 NVIDIA Corporation N11M +NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 supported 1 1 4.1 NVIDIA Corporation N12P +NVIDIA Corporation NB9M-GE1/PCI/SSE2 supported 1 0 0 NVIDIA NB9M +NVIDIA Corporation NB9M-GS/PCI/SSE2 supported 1 0 0 NVIDIA NB9M +NVIDIA Corporation NV17/AGP/SSE2 supported 0 0 0 NVIDIA NV17 +NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 210 +NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine supported 2 0 3.3 NVIDIA 310M +NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M +NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine supported 2 0 3.3 NVIDIA GT 120 +NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 +NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine supported 2 1 3.3 NVIDIA GT 220 +NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine supported 4 1 3.3 NVIDIA GT 240 +NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine supported 3 0 3.3 NVIDIA GT 320M +NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M +NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine supported 3 1 4.3 NVIDIA GT 430 +NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine supported 4 1 4.3 NVIDIA GT 440 +NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine supported 3 1 4.3 NVIDIA GT 520 +NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine supported 3 0 4.3 NVIDIA GT 63x +NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x +NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M +NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M +NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 480 +NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 660M +NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x +NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 68x +NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M +NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 770M +NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine supported 5 0 4.3 NVIDIA GTX 780M +NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release +NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release +NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release +NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine supported 2 1 3.3 NVIDIA GeForce Pre-Release +NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine supported 0 0 0 NVIDIA NV34 +NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine supported 3 0 4.2 NVIDIA Quadro 4000 +NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine supported 3 0 2.1 NVIDIA Quadro FX 4500 +NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine supported 3 0 3.1 NVIDIA Quadro FX 4800 +NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine supported 2 0 3.3 NVIDIA Quadro FX 770M +NVIDIA Corporation NVS 2100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M +NVIDIA Corporation NVS 2100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 2100M +NVIDIA Corporation NVS 300/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 300/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 310/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 3100M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M +NVIDIA Corporation NVS 3100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro NVS 3100M +NVIDIA Corporation NVS 315/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 4200M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M +NVIDIA Corporation NVS 4200M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro NVS 4200M +NVIDIA Corporation NVS 510/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation NVS 5100M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M +NVIDIA Corporation NVS 5100M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5100M +NVIDIA Corporation NVS 5200M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M +NVIDIA Corporation NVS 5200M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5200M +NVIDIA Corporation NVS 5400M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 5400M +NVIDIA Corporation Quadro 1000M/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M +NVIDIA Corporation Quadro 1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M +NVIDIA Corporation Quadro 1100M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 1100M +NVIDIA Corporation Quadro 2000 D/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 2000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 2000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro 3000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M +NVIDIA Corporation Quadro 3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M +NVIDIA Corporation Quadro 400/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 +NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! supported 2 0 3.3 NVIDIA Quadro 400 +NVIDIA Corporation Quadro 400/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro 400 +NVIDIA Corporation Quadro 4000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 +NVIDIA Corporation Quadro 4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 +NVIDIA Corporation Quadro 4000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M +NVIDIA Corporation Quadro 4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M +NVIDIA Corporation Quadro 410/PCIe/SSE2 supported 3 0 3.3 NVIDIA 410 +NVIDIA Corporation Quadro 5000/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 5000M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 5010M/PCI/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 5010M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro 600/PCI/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 +NVIDIA Corporation Quadro 600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 +NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! supported 2 0 4.2 NVIDIA Quadro K600 +NVIDIA Corporation Quadro 6000/PCIe/SSE2 supported 3 0 0 NVIDIA Quadro 6000 +NVIDIA Corporation Quadro FX 1000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1100/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1300/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 supported 1 0 2.1 NVIDIA Quadro FX 1500M +NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M +NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 1600M +NVIDIA Corporation Quadro FX 1700/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1800/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 2000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M +NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 2500M +NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M +NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2700M +NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M +NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 2800M +NVIDIA Corporation Quadro FX 3000/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3500/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 +NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 +NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 supported 2 0 2.1 NVIDIA Quadro FX 3500 +NVIDIA Corporation Quadro FX 350M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 +NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3600 +NVIDIA Corporation Quadro FX 360M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 370/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 370/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3700/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 +NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 +NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 +NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3700 +NVIDIA Corporation Quadro FX 370M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 380/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 380/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 3800/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 +NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 +NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 +NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 3800 +NVIDIA Corporation Quadro FX 380M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 4500/PCI/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 +NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 supported 3 0 2.1 NVIDIA Quadro FX 4500 +NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 4800/PCI/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 +NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 supported 3 0 3.1 NVIDIA Quadro FX 4800 +NVIDIA Corporation Quadro FX 500/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 540/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 540/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 550/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 550/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 5500/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 560/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 560/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 570/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 570/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 570M/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 580/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 580/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX 770M/PCI/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M +NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 supported 2 0 3.3 NVIDIA Quadro FX 770M +NVIDIA Corporation Quadro FX 880M/PCI/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M +NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 supported 3 0 3.3 NVIDIA Quadro FX 880M +NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro FX Go700/AGP/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation Quadro K1000/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K1000 +NVIDIA Corporation Quadro K1000M/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro 1000M +NVIDIA Corporation Quadro K2000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro K2000D/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro K2000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Corporation Quadro K3000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 3000M +NVIDIA Corporation Quadro K4000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000 +NVIDIA Corporation Quadro K4000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 4000M +NVIDIA Corporation Quadro K5000/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro K5000M/PCIe/SSE2 supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Corporation Quadro K600/PCIe/SSE2 supported 2 0 4.2 NVIDIA Quadro K600 +NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 supported 0 1 3.3 NVIDIA Quadro NVS 1xxM +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 285/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 290/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 295/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 300M +NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M +NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 supported 2 0 0 NVIDIA Quadro NVS 320M +NVIDIA Corporation Quadro NVS 420/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro NVS/AGP/SSE2 supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH +NVIDIA Corporation Quadro2 MXR/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro2 +NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 +NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 +NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 +NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 supported 0 0 1.5 NVIDIA Quadro4 +NVIDIA Corporation RIVA TNT2/AGP/SSE2 unsupported 0 0 1.5 NVIDIA RIVA TNT +NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! unsupported 0 0 1.5 NVIDIA RIVA TNT +NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Corporation nForce 750a SLI/PCI/SSE2 unsupported 0 0 3.3 NVIDIA nForce +NVIDIA Corporation nForce 750a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce +NVIDIA Corporation nForce 760i SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce +NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 unsupported 0 0 3.3 NVIDIA nForce +NVIDIA Corporation unknown board/AGP/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown +NVIDIA Corporation unknown board/PCI/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown +NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! unsupported 0 0 2.1 NVIDIA Generic Unknown +NVIDIA Corporation unknown board/PCIe/SSE2 unsupported 0 0 2.1 NVIDIA Generic Unknown +NVIDIA D9M supported 1 0 0 NVIDIA D9M +NVIDIA G 103M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G 105M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G 110M supported 1 1 3.3 NVIDIA G 110M +NVIDIA G 120M supported 1 1 3.3 NVIDIA G 120M +NVIDIA G 200 supported 2 1 3.3 NVIDIA G200 +NVIDIA G 205M supported 1 0 0 NVIDIA G 200M +NVIDIA G 210 supported 3 1 3.3 NVIDIA G210 +NVIDIA G 310M supported 2 0 3.3 NVIDIA G 310M +NVIDIA G 320M supported 3 0 3.3 NVIDIA GT 320M +NVIDIA G 405 supported 3 0 3.3 NVIDIA 405 +NVIDIA G 410M supported 3 1 4.2 NVIDIA G 410M +NVIDIA G 610M supported 3 1 4.3 NVIDIA 610M +NVIDIA G100 supported 3 1 4.2 NVIDIA G100 +NVIDIA G100M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G102M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G103M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G105M supported 1 1 3.3 NVIDIA G 100M +NVIDIA G200 supported 2 1 3.3 NVIDIA G200 +NVIDIA G210 supported 3 1 3.3 NVIDIA G210 +NVIDIA G210M supported 3 0 3.3 NVIDIA G210M +NVIDIA G73 supported 1 0 0 NVIDIA G73 +NVIDIA G84 supported 2 0 0 NVIDIA G84 +NVIDIA G92 supported 3 0 0 NVIDIA G92 +NVIDIA G94 supported 3 0 0 NVIDIA G94 +NVIDIA GT 120 supported 2 0 3.3 NVIDIA GT 120 +NVIDIA GT 120M supported 2 0 3.3 NVIDIA GT 120 +NVIDIA GT 130 supported 2 0 3.3 NVIDIA GT 130 +NVIDIA GT 130M supported 3 1 3.3 NVIDIA GT 130M +NVIDIA GT 140 supported 2 0 3.3 NVIDIA GT 140 +NVIDIA GT 140M supported 3 1 3.3 NVIDIA GT 140M +NVIDIA GT 150 supported 2 1 3.3 NVIDIA GT 150 +NVIDIA GT 220 supported 2 1 3.3 NVIDIA GT 220 +NVIDIA GT 220M supported 3 1 3.3 NVIDIA GT 220M +NVIDIA GT 230 supported 2 1 3.3 NVIDIA GT 230 +NVIDIA GT 230M supported 3 1 3.3 NVIDIA GT 230M +NVIDIA GT 240 supported 4 1 3.3 NVIDIA GT 240 +NVIDIA GT 240M supported 3 1 3.3 NVIDIA GT 240M +NVIDIA GT 260M supported 3 1 3.3 NVIDIA GT 260M +NVIDIA GT 320 supported 3 0 3.3 NVIDIA GT 320 +NVIDIA GT 320M supported 3 0 3.3 NVIDIA GT 320M +NVIDIA GT 325M supported 3 0 3.3 NVIDIA GT 320M +NVIDIA GT 330 supported 3 0 3.3 NVIDIA GT 330 +NVIDIA GT 330M supported 3 1 3.3 NVIDIA GT 330M +NVIDIA GT 335M supported 3 1 3.3 NVIDIA GT 330M +NVIDIA GT 340 supported 3 0 0 NVIDIA GT 340 +NVIDIA GT 340M supported 4 1 3.3 NVIDIA GT 340M +NVIDIA GT 415M supported 3 0 0 NVIDIA 410M +NVIDIA GT 420 supported 3 1 4.3 NVIDIA GT 420 +NVIDIA GT 420M supported 3 1 4.3 NVIDIA GT 420M +NVIDIA GT 425M supported 3 1 4.3 NVIDIA GT 420M +NVIDIA GT 430 supported 3 1 4.3 NVIDIA GT 430 +NVIDIA GT 430M supported 3 1 4.3 NVIDIA GT 430M +NVIDIA GT 435M supported 3 1 4.3 NVIDIA GT 430M +NVIDIA GT 440 supported 4 1 4.3 NVIDIA GT 440 +NVIDIA GT 440M supported 3 1 4.3 NVIDIA GT 440M +NVIDIA GT 445M supported 3 1 4.3 NVIDIA GT 440M +NVIDIA GT 450 supported 4 1 4.3 NVIDIA GT 450 +NVIDIA GT 520 supported 3 1 4.3 NVIDIA GT 520 +NVIDIA GT 520M supported 3 1 4.3 NVIDIA GT 520M +NVIDIA GT 525M supported 3 1 4.3 NVIDIA GT 520M +NVIDIA GT 530M supported 3 1 4.3 NVIDIA GT 530M +NVIDIA GT 540 supported 3 1 4.3 NVIDIA GT 540 +NVIDIA GT 540M supported 3 1 4.3 NVIDIA GT 540M +NVIDIA GT 550 supported 3 1 4.3 NVIDIA GT 550 +NVIDIA GT 550M supported 3 1 4.3 NVIDIA GT 550M +NVIDIA GT 555M supported 3 1 4.3 NVIDIA GT 550M +NVIDIA GT 610 supported 3 1 4.3 NVIDIA GT 61x +NVIDIA GT 620 supported 3 0 4.3 NVIDIA GT 62x +NVIDIA GT 620M supported 3 0 4.3 NVIDIA GT 620M +NVIDIA GT 630 supported 3 0 4.3 NVIDIA GT 63x +NVIDIA GT 630M supported 3 0 4.3 NVIDIA GT 630M +NVIDIA GT 635M supported 3 0 4.3 NVIDIA GT 630M +NVIDIA GT 640 supported 3 0 4.3 NVIDIA GT 64x +NVIDIA GT 640M supported 3 0 4.3 NVIDIA GT 640M +NVIDIA GT 650 supported 3 1 4.3 NVIDIA GT 65x +NVIDIA GT 650M supported 3 0 4.3 NVIDIA GT 650M +NVIDIA GTS 160M supported 2 0 0 NVIDIA GTS 160M +NVIDIA GTS 240 supported 4 1 3.3 NVIDIA GTS 240 +NVIDIA GTS 250 supported 4 1 3.3 NVIDIA GTS 250 +NVIDIA GTS 350M supported 4 1 3.3 NVIDIA GTS 350M +NVIDIA GTS 360 supported 4 1 3.3 NVIDIA GTS 360 +NVIDIA GTS 360M supported 5 1 3.3 NVIDIA GTS 360M +NVIDIA GTS 450 supported 4 1 4.3 NVIDIA GTS 450 +NVIDIA GTX 260 supported 4 1 3.3 NVIDIA GTX 260 +NVIDIA GTX 270 supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA GTX 275 supported 4 0 3.3 NVIDIA GTX 270 +NVIDIA GTX 280 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA GTX 285 supported 4 1 3.3 NVIDIA GTX 280 +NVIDIA GTX 290 supported 5 0 3.3 NVIDIA GTX 290 +NVIDIA GTX 295 supported 5 0 3.3 NVIDIA GTX 290 +NVIDIA GTX 460 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA GTX 460M supported 4 1 4.3 NVIDIA GTX 460M +NVIDIA GTX 465 supported 5 1 4.3 NVIDIA GTX 460 +NVIDIA GTX 470 supported 5 1 4.3 NVIDIA GTX 470 +NVIDIA GTX 470M supported 3 0 4.3 NVIDIA GTX 470M +NVIDIA GTX 480 supported 5 1 4.3 NVIDIA GTX 480 +NVIDIA GTX 480M supported 3 1 4.3 NVIDIA GTX 480M +NVIDIA GTX 485M supported 3 1 4.3 NVIDIA GTX 480M +NVIDIA GTX 550 supported 5 1 4.3 NVIDIA GTX 550 +NVIDIA GTX 560 supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA GTX 560 Ti supported 5 1 4.3 NVIDIA GTX 560 +NVIDIA GTX 570 supported 5 1 4.3 NVIDIA GTX 570 +NVIDIA GTX 580 supported 5 1 4.3 NVIDIA GTX 580 +NVIDIA GTX 580M supported 5 1 4.3 NVIDIA GTX 580M +NVIDIA GTX 590 supported 5 1 4.3 NVIDIA GTX 590 +NVIDIA GTX 650 supported 3 1 4.3 NVIDIA GTX 65x +NVIDIA GTX 660 supported 5 0 4.3 NVIDIA GTX 66x +NVIDIA GTX 670 supported 5 1 4.3 NVIDIA GTX 67x +NVIDIA GTX 670M supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA GTX 675M supported 5 1 4.3 NVIDIA GTX 670M +NVIDIA GTX 680 supported 5 1 4.3 NVIDIA GTX 68x +NVIDIA GTX 680M supported 5 0 4.3 NVIDIA GTX 680M +NVIDIA GTX 690 supported 5 1 4.3 NVIDIA GTX 69x +NVIDIA GTX 770 supported 5 0 4.3 NVIDIA GTX 77x +NVIDIA GTX TITAN supported 5 0 4.3 NVIDIA GTX TITAN +NVIDIA GeForce 2 supported 0 1 1.5 NVIDIA GeForce 2 +NVIDIA GeForce 3 supported 2 1 2.1 NVIDIA GeForce 3 +NVIDIA GeForce 4 supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA GeForce 4 Go supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA GeForce 4 MX supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA GeForce 4 Ti supported 0 1 1.5 NVIDIA GeForce 4 +NVIDIA GeForce 6100 supported 3 1 4.2 NVIDIA GeForce 6100 +NVIDIA GeForce 6200 supported 0 1 2.1 NVIDIA GeForce 6200 +NVIDIA GeForce 6500 supported 1 1 2.1 NVIDIA GeForce 6500 +NVIDIA GeForce 6600 supported 2 1 2.1 NVIDIA GeForce 6600 +NVIDIA GeForce 6700 supported 2 1 2.1 NVIDIA GeForce 6700 +NVIDIA GeForce 6800 supported 1 1 2.1 NVIDIA GeForce 6800 +NVIDIA GeForce 7000 supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA GeForce 7000M supported 1 1 2.1 NVIDIA GeForce 7000 +NVIDIA GeForce 7100 supported 1 1 2.1 NVIDIA GeForce 7100 +NVIDIA GeForce 7300 supported 1 1 2.1 NVIDIA GeForce 7300 +NVIDIA GeForce 7500 supported 2 1 2.1 NVIDIA GeForce 7500 +NVIDIA GeForce 7600 supported 2 1 2.1 NVIDIA GeForce 7600 +NVIDIA GeForce 7800 supported 2 1 2.1 NVIDIA GeForce 7800 +NVIDIA GeForce 7900 supported 3 1 2.1 NVIDIA GeForce 7900 +NVIDIA GeForce 8100 supported 1 0 3.3 NVIDIA GeForce 8100 +NVIDIA GeForce 8200 supported 1 0 3.3 NVIDIA GeForce 8200 +NVIDIA GeForce 8200M supported 1 0 3.3 NVIDIA GeForce 8200M +NVIDIA GeForce 8300 supported 3 1 3.3 NVIDIA GeForce 8300 +NVIDIA GeForce 8400 supported 2 1 3.3 NVIDIA GeForce 8400 +NVIDIA GeForce 8400M supported 1 1 3.3 NVIDIA GeForce 8400M +NVIDIA GeForce 8500 supported 2 1 3.3 NVIDIA GeForce 8500 +NVIDIA GeForce 8600 supported 3 1 3.3 NVIDIA GeForce 8600 +NVIDIA GeForce 8600M supported 2 1 3.3 NVIDIA GeForce 8600M +NVIDIA GeForce 8700 supported 3 0 0 NVIDIA GeForce 8700 +NVIDIA GeForce 8700M supported 2 1 3.3 NVIDIA GeForce 8700M +NVIDIA GeForce 8800 supported 3 1 3.3 NVIDIA GeForce 8800 +NVIDIA GeForce 8800M supported 2 1 3.3 NVIDIA GeForce 8800M +NVIDIA GeForce 9100 supported 0 0 3.3 NVIDIA GeForce 9100 +NVIDIA GeForce 9100M supported 0 0 3.3 NVIDIA GeForce 9100M +NVIDIA GeForce 9200 supported 1 0 3.3 NVIDIA GeForce 9200 +NVIDIA GeForce 9200M supported 1 0 3.3 NVIDIA GeForce 9200M +NVIDIA GeForce 9300 supported 1 1 3.3 NVIDIA GeForce 9300 +NVIDIA GeForce 9300M supported 1 1 3.3 NVIDIA GeForce 9300M +NVIDIA GeForce 9400 supported 3 1 3.3 NVIDIA GeForce 9400 +NVIDIA GeForce 9400M supported 2 1 3.3 NVIDIA GeForce 9400M +NVIDIA GeForce 9500 supported 3 1 3.3 NVIDIA GeForce 9500 +NVIDIA GeForce 9500M supported 1 1 3.3 NVIDIA GeForce 9500M +NVIDIA GeForce 9600 supported 3 1 3.3 NVIDIA GeForce 9600 +NVIDIA GeForce 9600M supported 2 1 3.3 NVIDIA GeForce 9600M +NVIDIA GeForce 9700M supported 0 1 3.3 NVIDIA GeForce 9700M +NVIDIA GeForce 9800 supported 3 1 3.3 NVIDIA GeForce 9800 +NVIDIA GeForce 9800M supported 2 1 3.3 NVIDIA GeForce 9800M +NVIDIA GeForce FX 5200 supported 0 0 2.1 NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5500 supported 0 1 2.1 NVIDIA GeForce FX 5500 +NVIDIA GeForce FX 5600 supported 1 1 2.1 NVIDIA GeForce FX 5600 +NVIDIA GeForce FX 5700 supported 0 1 2.1 NVIDIA GeForce FX 5700 +NVIDIA GeForce FX 5900 supported 1 1 2.1 NVIDIA GeForce FX 5900 +NVIDIA GeForce FX Go5100 supported 3 0 0 NVIDIA 510 +NVIDIA GeForce FX Go5200 supported 0 0 1.5 NVIDIA GeForce FX Go5200 +NVIDIA GeForce FX Go5600 supported 0 1 2.1 NVIDIA GeForce FX Go5600 +NVIDIA GeForce FX Go5700 supported 1 1 1.5 NVIDIA GeForce FX Go5700 +NVIDIA GeForce Go 6 supported 1 0 0 NVIDIA GeForce Go 6 +NVIDIA GeForce Go 6100 supported 0 1 2.1 NVIDIA GeForce Go 6100 +NVIDIA GeForce Go 6200 supported 0 0 1.5 NVIDIA GeForce Go 6200 +NVIDIA GeForce Go 6400 supported 1 1 2.1 NVIDIA GeForce Go 6400 +NVIDIA GeForce Go 6600 supported 0 1 2.1 NVIDIA GeForce Go 6600 +NVIDIA GeForce Go 6800 supported 0 1 2.1 NVIDIA GeForce Go 6800 +NVIDIA GeForce Go 7200 supported 1 0 2.1 NVIDIA GeForce Go 7200 +NVIDIA GeForce Go 7300 supported 1 1 2.1 NVIDIA GeForce Go 7300 +NVIDIA GeForce Go 7400 supported 1 1 2.1 NVIDIA GeForce Go 7400 +NVIDIA GeForce Go 7600 supported 1 1 2.1 NVIDIA GeForce Go 7600 +NVIDIA GeForce Go 7700 supported 0 1 2.1 NVIDIA GeForce Go 7700 +NVIDIA GeForce Go 7800 supported 2 0 0 NVIDIA GeForce Go 7800 +NVIDIA GeForce Go 7900 supported 1 1 2.1 NVIDIA GeForce Go 7900 +NVIDIA GeForce PCX supported 0 0 1.5 NVIDIA GeForce PCX +NVIDIA Generic unsupported 0 0 2.1 NVIDIA Generic +NVIDIA ION supported 2 1 3.3 NVIDIA ION a +NVIDIA MCP61 supported 1 0 2.1 NVIDIA MCP61 +NVIDIA NV34 supported 0 0 0 NVIDIA NV34 +NVIDIA PCI unsupported 0 0 2.1 NVIDIA PCI +NVIDIA Quadro 2000 supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Quadro 2000 M/D supported 3 0 4.2 NVIDIA Quadro 2000 M/D +NVIDIA Quadro 3000M supported 3 0 4.2 NVIDIA Quadro 3000M +NVIDIA Quadro 400 supported 2 0 3.3 NVIDIA Quadro 400 +NVIDIA Quadro 4000 supported 3 0 4.2 NVIDIA Quadro 4000 +NVIDIA Quadro 4000M supported 3 0 4.2 NVIDIA Quadro 4000M +NVIDIA Quadro 50x0 M supported 3 0 4.2 NVIDIA Quadro 50x0 M +NVIDIA Quadro 600 supported 2 0 4.2 NVIDIA Quadro 600 +NVIDIA Quadro 6000 supported 3 0 0 NVIDIA Quadro 6000 +NVIDIA Quadro FX supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Quadro FX 1500M supported 1 0 2.1 NVIDIA Quadro FX 1500M +NVIDIA Quadro FX 1800 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Quadro FX 2500M supported 2 0 2.1 NVIDIA Quadro FX 2500M +NVIDIA Quadro FX 2700M supported 3 0 3.3 NVIDIA Quadro FX 2700M +NVIDIA Quadro FX 2800M supported 3 0 3.3 NVIDIA Quadro FX 2800M +NVIDIA Quadro FX 3500 supported 2 0 2.1 NVIDIA Quadro FX 3500 +NVIDIA Quadro FX 3700 supported 3 0 3.3 NVIDIA Quadro FX 3700 +NVIDIA Quadro FX 3800 supported 3 0 3.3 NVIDIA Quadro FX 3800 +NVIDIA Quadro FX 4500 supported 3 0 2.1 NVIDIA Quadro FX 4500 +NVIDIA Quadro FX 4800 supported 3 0 3.1 NVIDIA Quadro FX 4800 +NVIDIA Quadro FX 550 supported 1 0 3.3 NVIDIA Quadro FX +NVIDIA Quadro FX 770M supported 2 0 3.3 NVIDIA Quadro FX 770M +NVIDIA Quadro FX 880M supported 3 0 3.3 NVIDIA Quadro FX 880M +NVIDIA Quadro NVS supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Quadro NVS 1xxM supported 0 0 4.2 NVIDIA Quadro NVS +NVIDIA Quadro NVS 4200M supported 2 0 4.2 NVIDIA Quadro NVS 4200M +NVIDIA Quadro2 supported 0 0 1.5 NVIDIA Quadro2 +NVIDIA nForce unsupported 0 0 3.3 NVIDIA nForce +Oracle VirtualBox Graphics supported 0 1 2.1 Oracle +Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine supported 3 1 2.1 AMD BARTS (HD 6800) +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine supported 2 1 4 ATI Radeon HD 2600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine supported 3 1 4 ATI Radeon HD 4600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine supported 3 1 4 ATI Radeon HD 4800 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine supported 3 1 4.2 ATI Radeon HD 5700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6600 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine supported 3 1 4.2 ATI Radeon HD 6700 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine supported 5 1 4.2 ATI Radeon HD 6900 +Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine supported 2 1 2.1 ATI Radeon X1600 +Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine supported 1 1 2.1 Intel X3100 +Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine supported 3 1 3.1 Intel HD Graphics 3000 +Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine supported 3 1 4.2 Intel HD Graphics 4000 +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine supported 2 0 3.3 NVIDIA 320M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 8800 +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine supported 3 1 3.3 NVIDIA GeForce 9400 +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9400M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine supported 2 1 3.3 NVIDIA GeForce 9600M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine supported 2 0 3.3 NVIDIA GT 130 +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine supported 3 1 3.3 NVIDIA GT 330M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine supported 3 0 4.3 NVIDIA GT 64x +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine supported 3 0 4.3 NVIDIA GT 640M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine supported 3 0 4.3 NVIDIA GT 650M +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 570 +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine supported 5 0 4.3 NVIDIA GTX 66x +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine supported 5 1 4.3 NVIDIA GTX 67x +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine supported 5 0 4.3 NVIDIA GTX 680M +PowerVR SGX545 supported 1 1 3 PowerVR SGX545 +S3 unsupported 0 1 1.4 S3 +S3 Graphics K8M800/MMX/K3D unsupported 0 1 1.4 S3 +S3 Graphics KM400/KN400/MMX/SSE unsupported 0 1 1.4 S3 +S3 Graphics P8M800/MMX/SSE unsupported 0 1 1.4 S3 +S3 Graphics Unknown Device/MMX/SSE unsupported 0 1 1.4 S3 +S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE unsupported 0 1 1.4 S3 +S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated ProSavage/Twister unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated S3 Graphics Chrome9 HC unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated S3 Graphics DeltaChrome unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated VIA Chrome9 HC IGP unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated VIA Chrome9 HC3 IGP unsupported 0 1 1.4 S3 +S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP unsupported 0 1 1.4 S3 +SiS unsupported 0 1 1.5 SiS +SiS 3D-Analyze v2.3 - http://www.tommti-systems.com unsupported 0 1 1.5 SiS +SiS 650/M650 VGA unsupported 0 1 1.5 SiS +SiS 650/M650 VGA / MMX/SSE2 /AGP unsupported 0 1 1.5 SiS +SiS 661 VGA unsupported 0 1 1.5 SiS +SiS 662 VGA unsupported 0 1 1.5 SiS +SiS 760 VGA unsupported 0 1 1.5 SiS +SiS 761GX VGA unsupported 0 1 1.5 SiS +SiS Mirage Graphics3 unsupported 0 1 1.4 S3 +SiS Xabre VGA unsupported 0 1 1.5 SiS +Tungsten Graphics, Inc Mesa DRI Intel(R) 845G unsupported 0 1 1.4 Intel 845G +Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM unsupported 0 1 1.4 Intel 855GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 855GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 865G unsupported 0 1 1.4 Intel 865G +Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 865G +Tungsten Graphics, Inc Mesa DRI Intel(R) 915G unsupported 0 1 1.4 Intel 915G +Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915G +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM unsupported 0 1 1.4 Intel 915GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 unsupported 0 1 1.4 Intel 915GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945G +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 0 1 1.4 Intel 945G +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 supported 0 1 1.4 Intel 945G +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME supported 0 1 1.4 Intel 945GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 supported 0 1 1.4 Intel 945GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 supported 0 1 2.1 Intel 965 +Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 +Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 unsupported 1 1 1.4 Intel G33 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 supported 1 1 2.1 Intel G41 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 supported 1 1 2.1 Intel G41 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 supported 1 1 2.1 Intel Q45/Q43 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX unsupported 1 1 3 Mesa +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset x86/MMX/SSE2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 unsupported 1 1 3 Mesa +VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) supported 1 1 2.1 Gallium +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) supported 1 1 2.1 Gallium +X.Org Gallium 0.4 on AMD ARUBA supported 3 1 2.1 AMD ARUBA (HD 6800) +X.Org Gallium 0.4 on AMD BARTS supported 3 1 2.1 AMD BARTS (HD 6800) +X.Org Gallium 0.4 on AMD CAICOS supported 3 0 0 AMD CAICOS (HD 6400) +X.Org Gallium 0.4 on AMD CAPE VERDE supported 1 1 2.1 Gallium +X.Org Gallium 0.4 on AMD CEDAR supported 2 0 2.1 AMD CEDAR (HD 5450) +X.Org Gallium 0.4 on AMD CYPRESS supported 3 0 0 AMD CYPRESS (HD 5800) +X.Org Gallium 0.4 on AMD JUNIPER supported 3 0 0 AMD JUNIPER (HD 5700) +X.Org Gallium 0.4 on AMD PALM supported 1 1 2.1 Gallium +X.Org Gallium 0.4 on AMD REDWOOD supported 3 0 1.4 AMD REDWOOD (HD 5500/5600) +X.Org Gallium 0.4 on AMD RS780 supported 0 1 2.1 AMD RS780 (HD 3200) +X.Org Gallium 0.4 on AMD RS880 supported 0 1 3.2 AMD RS880 (HD 4200) +X.Org Gallium 0.4 on AMD RV610 supported 1 0 0 AMD RV610 (HD 2400) +X.Org Gallium 0.4 on AMD RV620 supported 1 0 0 AMD RV620 (HD 3400) +X.Org Gallium 0.4 on AMD RV630 supported 2 0 0 AMD RV630 (HD 2600) +X.Org Gallium 0.4 on AMD RV635 supported 3 0 1.4 AMD RV635 (HD 3600) +X.Org Gallium 0.4 on AMD RV670 supported 3 0 0 AMD RV670 (HD 3800) +X.Org Gallium 0.4 on AMD RV710 supported 0 1 1.4 AMD RV710 (HD 4300) +X.Org Gallium 0.4 on AMD RV730 supported 3 0 1.4 AMD RV730 (HD 4600) +X.Org Gallium 0.4 on AMD RV740 supported 3 0 0 AMD RV740 (HD 4700) +X.Org Gallium 0.4 on AMD RV770 supported 3 0 0 AMD RV770 (HD 4800) +X.Org Gallium 0.4 on AMD SUMO supported 3 1 4.1 AMD SUMO +X.Org Gallium 0.4 on AMD SUMO2 supported 3 1 4.1 AMD SUMO +X.Org Gallium 0.4 on AMD TURKS supported 3 0 2.1 AMD TURKS (HD 6500/6600) +X.Org R300 Project Gallium 0.4 on ATI R350 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI R580 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RC410 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RS480 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RS482 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RS600 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RS690 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV350 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV370 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV380 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV410 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV515 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV530 supported 0 1 2.1 ATI R300 (9700) +X.Org R300 Project Gallium 0.4 on ATI RV570 supported 0 1 2.1 ATI R300 (9700) +XGI Volari V3 unsupported 0 0 0 XGI +http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION supported 5 1 4.3 NVIDIA GTX 69x +nouveau Gallium 0.4 on NV34 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV42 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV44 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV46 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV49 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV4A supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV4B supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV4C supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV4E supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV50 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV63 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV67 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV84 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV86 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV92 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV94 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV96 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NV98 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVA0 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVA3 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVA5 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVA8 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVAA supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVAC supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVAF supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVC0 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVC1 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVC3 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVC4 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVCE supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVCF supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVD9 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVE4 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVE6 supported 1 1 2.1 Gallium +nouveau Gallium 0.4 on NVE7 supported 1 1 2.1 Gallium diff --git a/indra/newview/tests/gpus_seen.txt b/indra/newview/tests/gpus_seen.txt index 570f92a9b0..a417cb3761 100755 --- a/indra/newview/tests/gpus_seen.txt +++ b/indra/newview/tests/gpus_seen.txt @@ -1,73 +1,129 @@ +AMD BARTS (HD 6800) +AMD BARTS (HD 6800) +AMD CAICOS (HD 6400) +AMD CAICOS (HD 6400) +AMD CAYMAN (HD 6900) +AMD CEDAR (HD 5450) +AMD CEDAR (HD 5450) +AMD JUNIPER (HD 5700) +AMD PARK +AMD REDWOOD (HD 5500/5600) +AMD RS780 (HD 3200) +AMD RS880 (HD 4200) +AMD RS880 (HD 4200) +AMD RV610 (HD 2400) +AMD RV620 (HD 3400) +AMD RV630 (HD 2600) +AMD RV635 (HD 3600) +AMD RV670 (HD 3800) +AMD RV710 (HD 4300) +AMD RV730 (HD 4600) +AMD RV770 (HD 4800) +AMD RV790 (HD 4800) +AMD TURKS (HD 6500/6600) ATI -ATI 3D-Analyze -ATI ASUS A9xxx +ATI 760G/Radeon 3000 ATI ASUS AH24xx -ATI ASUS AH26xx ATI ASUS AH34xx ATI ASUS AH36xx ATI ASUS AH46xx ATI ASUS AX3xx ATI ASUS AX5xx -ATI ASUS AX8xx ATI ASUS EAH38xx ATI ASUS EAH43xx ATI ASUS EAH45xx ATI ASUS EAH48xx +ATI ASUS EAH54xx ATI ASUS EAH57xx ATI ASUS EAH58xx -ATI ASUS X1xxx -ATI All-in-Wonder 9xxx +ATI ASUS EAH64xx +ATI ASUS EAH65xx +ATI ASUS EAH66xx +ATI ASUS EAH67xx +ATI ASUS EAH68xx +ATI ASUS EAH69xx +ATI ASUS EAH6xxx +ATI ASUS EAH77xx +ATI ASUS HD7700 +ATI ASUS Radeon X1xxx ATI All-in-Wonder HD ATI All-in-Wonder PCI-E -ATI All-in-Wonder X1800 -ATI All-in-Wonder X1900 -ATI All-in-Wonder X600 -ATI All-in-Wonder X800 -ATI Diamond X1xxx ATI Display Adapter ATI FireGL ATI FireGL 5200 ATI FireGL 5xxx ATI FireMV -ATI Generic -ATI Hercules 9800 +ATI FirePro 2000 +ATI FirePro 4000 +ATI FirePro M +ATI FirePro M3900 +ATI FirePro M5800 +ATI FirePro M7740 +ATI FirePro M7820 +ATI Geforce 9500 GT +ATI Geforce 9600 GT +ATI Geforce 9800 GT ATI IGP 340M -ATI M52 -ATI M54 -ATI M56 -ATI M71 -ATI M72 -ATI M76 ATI Mobility Radeon +ATI Mobility Radeon 4100 +ATI Mobility Radeon 4100 ATI Mobility Radeon 7xxx ATI Mobility Radeon 9600 ATI Mobility Radeon 9700 ATI Mobility Radeon 9800 ATI Mobility Radeon HD 2300 +ATI Mobility Radeon HD 2300 +ATI Mobility Radeon HD 2400 ATI Mobility Radeon HD 2400 ATI Mobility Radeon HD 2600 +ATI Mobility Radeon HD 2600 ATI Mobility Radeon HD 2700 ATI Mobility Radeon HD 3400 +ATI Mobility Radeon HD 3400 +ATI Mobility Radeon HD 3600 ATI Mobility Radeon HD 3600 ATI Mobility Radeon HD 3800 ATI Mobility Radeon HD 4200 +ATI Mobility Radeon HD 4200 ATI Mobility Radeon HD 4300 ATI Mobility Radeon HD 4500 ATI Mobility Radeon HD 4600 ATI Mobility Radeon HD 4800 +ATI Mobility Radeon HD 5100 +ATI Mobility Radeon HD 5100 +ATI Mobility Radeon HD 5300 +ATI Mobility Radeon HD 530v +ATI Mobility Radeon HD 5400 ATI Mobility Radeon HD 5400 +ATI Mobility Radeon HD 540v +ATI Mobility Radeon HD 545v +ATI Mobility Radeon HD 5500 +ATI Mobility Radeon HD 550v +ATI Mobility Radeon HD 5600 ATI Mobility Radeon HD 5600 +ATI Mobility Radeon HD 560v +ATI Mobility Radeon HD 565v +ATI Mobility Radeon HD 5700 +ATI Mobility Radeon HD 6300 +ATI Mobility Radeon HD 6300 +ATI Mobility Radeon HD 6500 +ATI Mobility Radeon HD 6500M ATI Mobility Radeon X1xxx ATI Mobility Radeon X2xxx ATI Mobility Radeon X3xx ATI Mobility Radeon X6xx ATI Mobility Radeon X7xx ATI Mobility Radeon Xxxx -ATI RV380 +ATI Mobility Radeon Xxxx +ATI R300 (9700) +ATI RV410 (X700) ATI RV530 +ATI Radeon ATI Radeon 2100 ATI Radeon 3000 ATI Radeon 3100 +ATI Radeon 3100 +ATI Radeon 5xxx ATI Radeon 7000 ATI Radeon 7xxx ATI Radeon 8xxx @@ -79,189 +135,630 @@ ATI Radeon 9600 ATI Radeon 9700 ATI Radeon 9800 ATI Radeon HD 2300 +ATI Radeon HD 2300 +ATI Radeon HD 2400 ATI Radeon HD 2400 ATI Radeon HD 2600 ATI Radeon HD 2900 ATI Radeon HD 3000 ATI Radeon HD 3100 ATI Radeon HD 3200 +ATI Radeon HD 3200 ATI Radeon HD 3300 ATI Radeon HD 3400 +ATI Radeon HD 3400 +ATI Radeon HD 3400 +ATI Radeon HD 3500 ATI Radeon HD 3600 +ATI Radeon HD 3700 ATI Radeon HD 3800 ATI Radeon HD 4200 ATI Radeon HD 4300 +ATI Radeon HD 4300 +ATI Radeon HD 4400 +ATI Radeon HD 4500 ATI Radeon HD 4500 ATI Radeon HD 4600 ATI Radeon HD 4700 ATI Radeon HD 4800 +ATI Radeon HD 4800 ATI Radeon HD 5400 +ATI Radeon HD 5400 +ATI Radeon HD 5500 ATI Radeon HD 5500 ATI Radeon HD 5600 ATI Radeon HD 5700 +ATI Radeon HD 5700 ATI Radeon HD 5800 ATI Radeon HD 5900 ATI Radeon HD 6200 +ATI Radeon HD 6200 +ATI Radeon HD 6300 ATI Radeon HD 6300 +ATI Radeon HD 6300 +ATI Radeon HD 6300M +ATI Radeon HD 6400 +ATI Radeon HD 64xx +ATI Radeon HD 64xx ATI Radeon HD 6500 +ATI Radeon HD 65xx +ATI Radeon HD 65xx +ATI Radeon HD 6600 +ATI Radeon HD 66xx +ATI Radeon HD 6700 +ATI Radeon HD 6700 +ATI Radeon HD 6700M ATI Radeon HD 6800 ATI Radeon HD 6900 -ATI Radeon OpenGL -ATI Radeon RV250 -ATI Radeon RV600 -ATI Radeon RX9550 -ATI Radeon VE +ATI Radeon HD 6900 +ATI Radeon HD 7200 +ATI Radeon HD 7300 +ATI Radeon HD 7300 +ATI Radeon HD 7400 +ATI Radeon HD 7400 +ATI Radeon HD 7500 +ATI Radeon HD 7600 +ATI Radeon HD 7700 +ATI Radeon HD 7800 +ATI Radeon HD 7900 ATI Radeon X1000 ATI Radeon X1200 ATI Radeon X1300 ATI Radeon X13xx ATI Radeon X1400 ATI Radeon X1500 +ATI Radeon X15xx ATI Radeon X1600 ATI Radeon X16xx -ATI Radeon X1700 +ATI Radeon X17xx ATI Radeon X1800 +ATI Radeon X18xx +ATI Radeon X1900 ATI Radeon X1900 ATI Radeon X19xx ATI Radeon X1xxx +ATI Radeon X1xxx +ATI Radeon X1xxx +ATI Radeon X1xxx +ATI Radeon X2xxx +ATI Radeon X2xxx ATI Radeon X300 ATI Radeon X500 +ATI Radeon X500 +ATI Radeon X500 ATI Radeon X600 ATI Radeon X700 -ATI Radeon X7xx ATI Radeon X800 ATI Radeon Xpress +ATI Radeon Xpress ATI Rage 128 +ATI Technologies ATI Technologies Inc. -ATI Technologies Inc. x86 -ATI Technologies Inc. x86/SSE2 -ATI Technologies Inc. x86/SSE2 +ATI Technologies Inc. (DNA-AMD GFX) AMD Radeon HD 6290 Graphics +ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5730 +ATI Technologies Inc. (Vista) ATI Mobility Radeon HD 5870 +ATI Technologies Inc. 128MB ATI RADEON X600 SE +ATI Technologies Inc. 128MB ATI RADEON X600 SE x86/SSE2 +ATI Technologies Inc. 128MB ATI Radeon X1300 +ATI Technologies Inc. 128MB ATI Radeon X1300 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. 128MB ATI Radeon X1300 x86/SSE2 +ATI Technologies Inc. 256MB ATI RADEON X600 +ATI Technologies Inc. 256MB ATI Radeon X1300PRO +ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/MMX/3DNow!/SSE2 ATI Technologies Inc. 256MB ATI Radeon X1300PRO x86/SSE2 +ATI Technologies Inc. 3DP (ATI RADEON XPRESS 200M) +ATI Technologies Inc. 3DP Edition v10.04 (Mobility Radeon X1600) x86/SSE2 +ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7400M Series +ATI Technologies Inc. 7900 MOD - AMD Radeon HD 7640G +ATI Technologies Inc. ALL-IN-WONDER 9600 SERIES +ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics +ATI Technologies Inc. AMD (ATI) FirePro M4000 (FireGL V) Mobility Pro Graphics +ATI Technologies Inc. AMD (ATI) FirePro M5950 (FireGL) Mobility Pro Graphics +ATI Technologies Inc. AMD (ATI) FirePro M6000 (FireGL V) Mobility Pro Graphics +ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro +ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics +ATI Technologies Inc. AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics ATI Technologies Inc. AMD 760G ATI Technologies Inc. AMD 760G -ATI Technologies Inc. AMD 760G (Microsoft WDDM 1.1) -ATI Technologies Inc. AMD 780L +ATI Technologies Inc. AMD 760G (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. AMD FirePro 2270 +ATI Technologies Inc. AMD FirePro 2460 +ATI Technologies Inc. AMD FirePro M2000 +ATI Technologies Inc. AMD FirePro M3900 +ATI Technologies Inc. AMD FirePro M4000 +ATI Technologies Inc. AMD FirePro M5950 +ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics +ATI Technologies Inc. AMD FirePro M5950 Mobility Professional Graphics +ATI Technologies Inc. AMD FirePro V3900 +ATI Technologies Inc. AMD FirePro V3900 (ATI FireGL) +ATI Technologies Inc. AMD FirePro V4900 +ATI Technologies Inc. AMD FirePro V4900 (ATI FireGL) +ATI Technologies Inc. AMD FirePro V4900 (FireGL V) +ATI Technologies Inc. AMD FirePro V4900 (FireGL V) Graphics Adapter +ATI Technologies Inc. AMD FirePro V5900 +ATI Technologies Inc. AMD FirePro V5900 (ATI FireGL) +ATI Technologies Inc. AMD FirePro V5900 (FireGL V) +ATI Technologies Inc. AMD FirePro V5900 (FireGL V) Graphics Adapter +ATI Technologies Inc. AMD FirePro V7900 +ATI Technologies Inc. AMD FirePro V7900 (ATI FireGL) +ATI Technologies Inc. AMD FirePro V7900 (FireGL V) +ATI Technologies Inc. AMD FirePro V7900 (FireGL V) Graphics Adapter +ATI Technologies Inc. AMD FirePro W5000 (FireGL V) +ATI Technologies Inc. AMD FirePro W9000 (FireGL V) ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 ATI Technologies Inc. AMD M860G with ATI Mobility Radeon 4100 ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4200 +ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4225 ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 ATI Technologies Inc. AMD M880G with ATI Mobility Radeon HD 4250 ATI Technologies Inc. AMD RADEON HD 6350 +ATI Technologies Inc. AMD RADEON HD 6350 ATI Technologies Inc. AMD RADEON HD 6450 ATI Technologies Inc. AMD RADEON HD 6450 +ATI Technologies Inc. AMD RADEON HD 6450A +ATI Technologies Inc. AMD RADEON HD 6670 ATI Technologies Inc. AMD RADEON HD 6670 +ATI Technologies Inc. AMD RADEON HD 7450 +ATI Technologies Inc. AMD RADEON HD6370D Graphics +ATI Technologies Inc. AMD RADEON HD6370D Graphics +ATI Technologies Inc. AMD RADEON HD6410D Graphics +ATI Technologies Inc. AMD RADEON HD6410D Graphics +ATI Technologies Inc. AMD RADEON HD6530D Graphics +ATI Technologies Inc. AMD RADEON HD6550D Graphics +ATI Technologies Inc. AMD Radeon +ATI Technologies Inc. AMD Radeon +ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M +ATI Technologies Inc. AMD Radeon (TM) HD 8500M/8700M ATI Technologies Inc. AMD Radeon 6600M and 6700M Series +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series +ATI Technologies Inc. AMD Radeon 6600M and 6700M Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 5450 +ATI Technologies Inc. AMD Radeon HD 5500 Series +ATI Technologies Inc. AMD Radeon HD 5500 Series +ATI Technologies Inc. AMD Radeon HD 5500 Series (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. AMD Radeon HD 6200 series Graphics ATI Technologies Inc. AMD Radeon HD 6200 series Graphics +ATI Technologies Inc. AMD Radeon HD 6250 ATI Technologies Inc. AMD Radeon HD 6250 Graphics ATI Technologies Inc. AMD Radeon HD 6250 Graphics +ATI Technologies Inc. AMD Radeon HD 6250M +ATI Technologies Inc. AMD Radeon HD 6250M +ATI Technologies Inc. AMD Radeon HD 6290 +ATI Technologies Inc. AMD Radeon HD 6290 Graphics ATI Technologies Inc. AMD Radeon HD 6290 Graphics +ATI Technologies Inc. AMD Radeon HD 6290M +ATI Technologies Inc. AMD Radeon HD 6290M ATI Technologies Inc. AMD Radeon HD 6300 series Graphics ATI Technologies Inc. AMD Radeon HD 6300 series Graphics ATI Technologies Inc. AMD Radeon HD 6300M Series ATI Technologies Inc. AMD Radeon HD 6300M Series +ATI Technologies Inc. AMD Radeon HD 6310 +ATI Technologies Inc. AMD Radeon HD 6310 +ATI Technologies Inc. AMD Radeon HD 6310 Graphics +ATI Technologies Inc. AMD Radeon HD 6310 Graphics ATI Technologies Inc. AMD Radeon HD 6310 Graphics ATI Technologies Inc. AMD Radeon HD 6310 Graphics +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Engineering Sample - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation - WDDM v1.3) +ATI Technologies Inc. AMD Radeon HD 6310 Graphics (Microsoft Corporation- WDDM v1.20) ATI Technologies Inc. AMD Radeon HD 6310M ATI Technologies Inc. AMD Radeon HD 6310M +ATI Technologies Inc. AMD Radeon HD 6320 +ATI Technologies Inc. AMD Radeon HD 6320 Graphics +ATI Technologies Inc. AMD Radeon HD 6320 Graphic +ATI Technologies Inc. AMD Radeon HD 6320 Graphics +ATI Technologies Inc. AMD Radeon HD 6320 Graphics +ATI Technologies Inc. AMD Radeon HD 6320 Graphics (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 6320 series Graphics +ATI Technologies Inc. AMD Radeon HD 6320 series Graphics +ATI Technologies Inc. AMD Radeon HD 6320M ATI Technologies Inc. AMD Radeon HD 6330M -ATI Technologies Inc. AMD Radeon HD 6330M ATI Technologies Inc. AMD Radeon HD 6350 +ATI Technologies Inc. AMD Radeon HD 6350 +ATI Technologies Inc. AMD Radeon HD 6370D ATI Technologies Inc. AMD Radeon HD 6370M ATI Technologies Inc. AMD Radeon HD 6370M +ATI Technologies Inc. AMD Radeon HD 6380G +ATI Technologies Inc. AMD Radeon HD 6400 Series ATI Technologies Inc. AMD Radeon HD 6400M Series -ATI Technologies Inc. AMD Radeon HD 6400M Series +ATI Technologies Inc. AMD Radeon HD 6410D +ATI Technologies Inc. AMD Radeon HD 6410D +ATI Technologies Inc. AMD Radeon HD 6410D Graphics +ATI Technologies Inc. AMD Radeon HD 6410D Graphics ATI Technologies Inc. AMD Radeon HD 6450 ATI Technologies Inc. AMD Radeon HD 6450 +ATI Technologies Inc. AMD Radeon HD 6450 (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6450 Graphics +ATI Technologies Inc. AMD Radeon HD 6450A +ATI Technologies Inc. AMD Radeon HD 6450A Graphics +ATI Technologies Inc. AMD Radeon HD 6450M +ATI Technologies Inc. AMD Radeon HD 6450M ATI Technologies Inc. AMD Radeon HD 6470M ATI Technologies Inc. AMD Radeon HD 6470M +ATI Technologies Inc. AMD Radeon HD 6470M/7400M Series +ATI Technologies Inc. AMD Radeon HD 6480G +ATI Technologies Inc. AMD Radeon HD 6480M ATI Technologies Inc. AMD Radeon HD 6490M -ATI Technologies Inc. AMD Radeon HD 6490M ATI Technologies Inc. AMD Radeon HD 6500 Series +ATI Technologies Inc. AMD Radeon HD 6500 Series +ATI Technologies Inc. AMD Radeon HD 6500 series graphics ATI Technologies Inc. AMD Radeon HD 6500M Series ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series +ATI Technologies Inc. AMD Radeon HD 6500M/5600/5700 Series +ATI Technologies Inc. AMD Radeon HD 6510 Series +ATI Technologies Inc. AMD Radeon HD 6510 Series +ATI Technologies Inc. AMD Radeon HD 6520G +ATI Technologies Inc. AMD Radeon HD 6520G +ATI Technologies Inc. AMD Radeon HD 6530D +ATI Technologies Inc. AMD Radeon HD 6530D +ATI Technologies Inc. AMD Radeon HD 6530D Graphics +ATI Technologies Inc. AMD Radeon HD 6530D Graphics ATI Technologies Inc. AMD Radeon HD 6530M -ATI Technologies Inc. AMD Radeon HD 6530M +ATI Technologies Inc. AMD Radeon HD 6550A +ATI Technologies Inc. AMD Radeon HD 6550A +ATI Technologies Inc. AMD Radeon HD 6550D +ATI Technologies Inc. AMD Radeon HD 6550D +ATI Technologies Inc. AMD Radeon HD 6550D Graphics +ATI Technologies Inc. AMD Radeon HD 6550D Graphics ATI Technologies Inc. AMD Radeon HD 6550M ATI Technologies Inc. AMD Radeon HD 6550M ATI Technologies Inc. AMD Radeon HD 6570 ATI Technologies Inc. AMD Radeon HD 6570 -ATI Technologies Inc. AMD Radeon HD 6570M +ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6570 (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. AMD Radeon HD 6570M ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series ATI Technologies Inc. AMD Radeon HD 6570M/5700 Series +ATI Technologies Inc. AMD Radeon HD 6570M/5730 +ATI Technologies Inc. AMD Radeon HD 6600 Series ATI Technologies Inc. AMD Radeon HD 6600 Series ATI Technologies Inc. AMD Radeon HD 6600M Series +ATI Technologies Inc. AMD Radeon HD 6610M Graphics +ATI Technologies Inc. AMD Radeon HD 6620G +ATI Technologies Inc. AMD Radeon HD 6620G +ATI Technologies Inc. AMD Radeon HD 6625M Graphics +ATI Technologies Inc. AMD Radeon HD 6630M ATI Technologies Inc. AMD Radeon HD 6630M +ATI Technologies Inc. AMD Radeon HD 6650A Graphics ATI Technologies Inc. AMD Radeon HD 6650M ATI Technologies Inc. AMD Radeon HD 6650M ATI Technologies Inc. AMD Radeon HD 6670 ATI Technologies Inc. AMD Radeon HD 6670 +ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6670 (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. AMD Radeon HD 6700 Series ATI Technologies Inc. AMD Radeon HD 6700 Series -ATI Technologies Inc. AMD Radeon HD 6750 +ATI Technologies Inc. AMD Radeon HD 6700 series +ATI Technologies Inc. AMD Radeon HD 6700M Series +ATI Technologies Inc. AMD Radeon HD 6700M Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 6700M/7700M/7900M Series +ATI Technologies Inc. AMD Radeon HD 6730M ATI Technologies Inc. AMD Radeon HD 6750 ATI Technologies Inc. AMD Radeon HD 6750M ATI Technologies Inc. AMD Radeon HD 6750M ATI Technologies Inc. AMD Radeon HD 6770 -ATI Technologies Inc. AMD Radeon HD 6770 ATI Technologies Inc. AMD Radeon HD 6770M +ATI Technologies Inc. AMD Radeon HD 6770M +ATI Technologies Inc. AMD Radeon HD 6770M OpenGL Engine ATI Technologies Inc. AMD Radeon HD 6800 Series ATI Technologies Inc. AMD Radeon HD 6800 Series +ATI Technologies Inc. AMD Radeon HD 6800 Series +ATI Technologies Inc. AMD Radeon HD 6800 Series (Engineering Sample - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6800 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 6800M Series ATI Technologies Inc. AMD Radeon HD 6800M Series ATI Technologies Inc. AMD Radeon HD 6850 +ATI Technologies Inc. AMD Radeon HD 6850 +ATI Technologies Inc. AMD Radeon HD 6850 X2 ATI Technologies Inc. AMD Radeon HD 6850M ATI Technologies Inc. AMD Radeon HD 6850M ATI Technologies Inc. AMD Radeon HD 6870 -ATI Technologies Inc. AMD Radeon HD 6870 ATI Technologies Inc. AMD Radeon HD 6870M ATI Technologies Inc. AMD Radeon HD 6870M ATI Technologies Inc. AMD Radeon HD 6900 Series ATI Technologies Inc. AMD Radeon HD 6900 Series +ATI Technologies Inc. AMD Radeon HD 6900 Series +ATI Technologies Inc. AMD Radeon HD 6900 Series +ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6900 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 6900M Series ATI Technologies Inc. AMD Radeon HD 6900M Series +ATI Technologies Inc. AMD Radeon HD 6970 +ATI Technologies Inc. AMD Radeon HD 6970 ATI Technologies Inc. AMD Radeon HD 6970M ATI Technologies Inc. AMD Radeon HD 6970M ATI Technologies Inc. AMD Radeon HD 6990 ATI Technologies Inc. AMD Radeon HD 6990 +ATI Technologies Inc. AMD Radeon HD 6990M +ATI Technologies Inc. AMD Radeon HD 6990M +ATI Technologies Inc. AMD Radeon HD 6990M +ATI Technologies Inc. AMD Radeon HD 7000 series +ATI Technologies Inc. AMD Radeon HD 7000 series +ATI Technologies Inc. AMD Radeon HD 7290 Graphics +ATI Technologies Inc. AMD Radeon HD 7300 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics +ATI Technologies Inc. AMD Radeon HD 7300 Series Graphics +ATI Technologies Inc. AMD Radeon HD 7310 +ATI Technologies Inc. AMD Radeon HD 7310 +ATI Technologies Inc. AMD Radeon HD 7310 Graphics +ATI Technologies Inc. AMD Radeon HD 7310 Graphics +ATI Technologies Inc. AMD Radeon HD 7310 Graphics +ATI Technologies Inc. AMD Radeon HD 7310 Graphics (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 7310G +ATI Technologies Inc. AMD Radeon HD 7310M +ATI Technologies Inc. AMD Radeon HD 7310M +ATI Technologies Inc. AMD Radeon HD 7340 +ATI Technologies Inc. AMD Radeon HD 7340 +ATI Technologies Inc. AMD Radeon HD 7340 Graphics +ATI Technologies Inc. AMD Radeon HD 7340 Graphics +ATI Technologies Inc. AMD Radeon HD 7340G +ATI Technologies Inc. AMD Radeon HD 7340G +ATI Technologies Inc. AMD Radeon HD 7340M +ATI Technologies Inc. AMD Radeon HD 7340M +ATI Technologies Inc. AMD Radeon HD 7350 +ATI Technologies Inc. AMD Radeon HD 7350 +ATI Technologies Inc. AMD Radeon HD 7350 Graphics +ATI Technologies Inc. AMD Radeon HD 7370M +ATI Technologies Inc. AMD Radeon HD 7400 Series +ATI Technologies Inc. AMD Radeon HD 7400 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 7400G +ATI Technologies Inc. AMD Radeon HD 7400G +ATI Technologies Inc. AMD Radeon HD 7400M Series +ATI Technologies Inc. AMD Radeon HD 7400M Series +ATI Technologies Inc. AMD Radeon HD 7400M Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7410M +ATI Technologies Inc. AMD Radeon HD 7420G +ATI Technologies Inc. AMD Radeon HD 7420G +ATI Technologies Inc. AMD Radeon HD 7450 +ATI Technologies Inc. AMD Radeon HD 7450 +ATI Technologies Inc. AMD Radeon HD 7450 +ATI Technologies Inc. AMD Radeon HD 7450 Graphics +ATI Technologies Inc. AMD Radeon HD 7450A Graphics +ATI Technologies Inc. AMD Radeon HD 7450A Graphics +ATI Technologies Inc. AMD Radeon HD 7450M +ATI Technologies Inc. AMD Radeon HD 7470 +ATI Technologies Inc. AMD Radeon HD 7470 +ATI Technologies Inc. AMD Radeon HD 7470 +ATI Technologies Inc. AMD Radeon HD 7470 Series +ATI Technologies Inc. AMD Radeon HD 7470 Series +ATI Technologies Inc. AMD Radeon HD 7470M +ATI Technologies Inc. AMD Radeon HD 7470M +ATI Technologies Inc. AMD Radeon HD 7480D +ATI Technologies Inc. AMD Radeon HD 7480D +ATI Technologies Inc. AMD Radeon HD 7500 Series +ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. AMD Radeon HD 7500 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7500/7600 Series +ATI Technologies Inc. AMD Radeon HD 7500G +ATI Technologies Inc. AMD Radeon HD 7500G +ATI Technologies Inc. AMD Radeon HD 7500G + 7500M/7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7500M/7600M Series +ATI Technologies Inc. AMD Radeon HD 7510 +ATI Technologies Inc. AMD Radeon HD 7510 +ATI Technologies Inc. AMD Radeon HD 7520G +ATI Technologies Inc. AMD Radeon HD 7520G +ATI Technologies Inc. AMD Radeon HD 7520G + 6400M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7470M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7500/7600 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7610M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7520G + 7670M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7540D +ATI Technologies Inc. AMD Radeon HD 7540D +ATI Technologies Inc. AMD Radeon HD 7540D + 7450 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7550M +ATI Technologies Inc. AMD Radeon HD 7550M +ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics +ATI Technologies Inc. AMD Radeon HD 7550M/7650M Graphics +ATI Technologies Inc. AMD Radeon HD 7560D +ATI Technologies Inc. AMD Radeon HD 7560D +ATI Technologies Inc. AMD Radeon HD 7560D (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7560D + 6570 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7560D + 6670 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7560D + 7560D Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7560D + 7600 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7560D + 7670 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7570 +ATI Technologies Inc. AMD Radeon HD 7570 +ATI Technologies Inc. AMD Radeon HD 7570 Graphics +ATI Technologies Inc. AMD Radeon HD 7570 Series +ATI Technologies Inc. AMD Radeon HD 7570M +ATI Technologies Inc. AMD Radeon HD 7570M/HD 7670M Graphics +ATI Technologies Inc. AMD Radeon HD 7580D +ATI Technologies Inc. AMD Radeon HD 7600 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7600G +ATI Technologies Inc. AMD Radeon HD 7600G + 7500M/7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7600G + 7550M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7600M + 7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7600M Series +ATI Technologies Inc. AMD Radeon HD 7600M Series +ATI Technologies Inc. AMD Radeon HD 7610M +ATI Technologies Inc. AMD Radeon HD 7610M +ATI Technologies Inc. AMD Radeon HD 7620G +ATI Technologies Inc. AMD Radeon HD 7640G +ATI Technologies Inc. AMD Radeon HD 7640G +ATI Technologies Inc. AMD Radeon HD 7640G + 6400M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7450M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7470M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7500/7600 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7500M/7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7610M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7640G + 7670M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7650A +ATI Technologies Inc. AMD Radeon HD 7650A Graphics +ATI Technologies Inc. AMD Radeon HD 7650M +ATI Technologies Inc. AMD Radeon HD 7650M +ATI Technologies Inc. AMD Radeon HD 7650M Series +ATI Technologies Inc. AMD Radeon HD 7660D +ATI Technologies Inc. AMD Radeon HD 7660D +ATI Technologies Inc. AMD Radeon HD 7660D + 6570 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660D + 6670 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660D + 7670 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660D + 7700 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G +ATI Technologies Inc. AMD Radeon HD 7660G +ATI Technologies Inc. AMD Radeon HD 7660G + 6400M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7400M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7470M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7500/7600 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7600M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7610M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7670M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7660G + 7700M Dual Graphics +ATI Technologies Inc. AMD Radeon HD 7670 +ATI Technologies Inc. AMD Radeon HD 7670 +ATI Technologies Inc. AMD Radeon HD 7670M +ATI Technologies Inc. AMD Radeon HD 7670M +ATI Technologies Inc. AMD Radeon HD 7690M +ATI Technologies Inc. AMD Radeon HD 7700 Series +ATI Technologies Inc. AMD Radeon HD 7700 Series +ATI Technologies Inc. AMD Radeon HD 7700 Series +ATI Technologies Inc. AMD Radeon HD 7700 Series (Microsoft Corporation - WDDM v1.3) +ATI Technologies Inc. AMD Radeon HD 7700M Series +ATI Technologies Inc. AMD Radeon HD 7730M +ATI Technologies Inc. AMD Radeon HD 7770 +ATI Technologies Inc. AMD Radeon HD 7770 +ATI Technologies Inc. AMD Radeon HD 7770 GHz Edition +ATI Technologies Inc. AMD Radeon HD 7800 Series +ATI Technologies Inc. AMD Radeon HD 7800 Series +ATI Technologies Inc. AMD Radeon HD 7800 Series +ATI Technologies Inc. AMD Radeon HD 7800 Series +ATI Technologies Inc. AMD Radeon HD 7800 Series (Engineering Sample - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) +ATI Technologies Inc. AMD Radeon HD 7800 Series (Microsoft Corporation - WDDM v1.3) +ATI Technologies Inc. AMD Radeon HD 7800M Series +ATI Technologies Inc. AMD Radeon HD 7800M Series +ATI Technologies Inc. AMD Radeon HD 7870 +ATI Technologies Inc. AMD Radeon HD 7870 +ATI Technologies Inc. AMD Radeon HD 7870M +ATI Technologies Inc. AMD Radeon HD 7870M +ATI Technologies Inc. AMD Radeon HD 7900 Series +ATI Technologies Inc. AMD Radeon HD 7900 Series +ATI Technologies Inc. AMD Radeon HD 7900 Series +ATI Technologies Inc. AMD Radeon HD 7900 Series +ATI Technologies Inc. AMD Radeon HD 7900 Series (Microsoft Corporation - WDDM v1.3) +ATI Technologies Inc. AMD Radeon HD 7950 +ATI Technologies Inc. AMD Radeon HD 7950 +ATI Technologies Inc. AMD Radeon HD 7950 +ATI Technologies Inc. AMD Radeon HD 7970 +ATI Technologies Inc. AMD Radeon HD 7970 +ATI Technologies Inc. AMD Radeon HD 7970M +ATI Technologies Inc. AMD Radeon HD 7970M +ATI Technologies Inc. AMD Radeon HD 7970M +ATI Technologies Inc. AMD Radeon HD 8210 +ATI Technologies Inc. AMD Radeon HD 8240 +ATI Technologies Inc. AMD Radeon HD 8250 +ATI Technologies Inc. AMD Radeon HD 8280G +ATI Technologies Inc. AMD Radeon HD 8330 +ATI Technologies Inc. AMD Radeon HD 8330 +ATI Technologies Inc. AMD Radeon HD 8350 +ATI Technologies Inc. AMD Radeon HD 8350 +ATI Technologies Inc. AMD Radeon HD 8350G +ATI Technologies Inc. AMD Radeon HD 8400 +ATI Technologies Inc. AMD Radeon HD 8450 +ATI Technologies Inc. AMD Radeon HD 8450G +ATI Technologies Inc. AMD Radeon HD 8470 +ATI Technologies Inc. AMD Radeon HD 8470 +ATI Technologies Inc. AMD Radeon HD 8470D +ATI Technologies Inc. AMD Radeon HD 8550G +ATI Technologies Inc. AMD Radeon HD 8550G +ATI Technologies Inc. AMD Radeon HD 8570 +ATI Technologies Inc. AMD Radeon HD 8570 +ATI Technologies Inc. AMD Radeon HD 8570D +ATI Technologies Inc. AMD Radeon HD 8570D +ATI Technologies Inc. AMD Radeon HD 8610G +ATI Technologies Inc. AMD Radeon HD 8650G +ATI Technologies Inc. AMD Radeon HD 8650G +ATI Technologies Inc. AMD Radeon HD 8670D +ATI Technologies Inc. AMD Radeon HD 8670D +ATI Technologies Inc. AMD Radeon HD 8670D +ATI Technologies Inc. AMD Radeon HD 8670D + 6670 Dual Graphics +ATI Technologies Inc. AMD Radeon HD 8700M Series +ATI Technologies Inc. AMD Radeon HD 8700M Series +ATI Technologies Inc. AMD Radeon HD 8730M +ATI Technologies Inc. AMD Radeon HD 8730M +ATI Technologies Inc. AMD Radeon HD 8730M +ATI Technologies Inc. AMD Radeon HD 8750M +ATI Technologies Inc. AMD Radeon HD 8760 +ATI Technologies Inc. AMD Radeon HD 8760 +ATI Technologies Inc. AMD Radeon HD 8760 +ATI Technologies Inc. AMD Radeon HD 8800M Series +ATI Technologies Inc. AMD Radeon HD 8800M Series +ATI Technologies Inc. AMD Radeon HD 8900 Series (OEM) +ATI Technologies Inc. AMD Radeon HD 8950 +ATI Technologies Inc. AMD Radeon HD 8950 +ATI Technologies Inc. AMD Radeon HD HD7850M +ATI Technologies Inc. AMD Radeon HD HD7850M +ATI Technologies Inc. AMD Radeon HD6370D Graphics +ATI Technologies Inc. AMD Radeon HD6370D Graphics +ATI Technologies Inc. AMD Radeon HD7610M +ATI Technologies Inc. AMD Radeon HD7610M +ATI Technologies Inc. AMD Radeon HD7700 Series +ATI Technologies Inc. AMD Radeon HD7700 Series +ATI Technologies Inc. AMD Radeon HD7700 Series +ATI Technologies Inc. AMD Radeon HD7770 +ATI Technologies Inc. AMD Radeon HD7770 +ATI Technologies Inc. AMD Radeon HD7770 GHz Edition +ATI Technologies Inc. AMD Radeon HD7770 GHz Edition +ATI Technologies Inc. AMD Radeon HD8350 +ATI Technologies Inc. AMD Radeon(TM) HD 6380G +ATI Technologies Inc. AMD Radeon(TM) HD 6380G ATI Technologies Inc. AMD Radeon(TM) HD 6470M ATI Technologies Inc. AMD Radeon(TM) HD 6470M -ATI Technologies Inc. AMD Radeon(TM) HD 6470M ATI Technologies Inc. AMD Radeon(TM) HD 6480G +ATI Technologies Inc. AMD Radeon(TM) HD 6480G +ATI Technologies Inc. AMD Radeon(TM) HD 6480G (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. AMD Radeon(TM) HD 6520G ATI Technologies Inc. AMD Radeon(TM) HD 6520G ATI Technologies Inc. AMD Radeon(TM) HD 6620G +ATI Technologies Inc. AMD Radeon(TM) HD 6620G ATI Technologies Inc. AMD Radeon(TM) HD 6630M -ATI Technologies Inc. ASUS 5870 Eyefinity 6 -ATI Technologies Inc. ASUS A9550 Series -ATI Technologies Inc. ASUS AH2600 Series +ATI Technologies Inc. AMD Radeon(TM) HD 6650M +ATI Technologies Inc. AMD Radeon(TM) HD 7450 +ATI Technologies Inc. AMD Radeon(TM) HD 7450A Graphics +ATI Technologies Inc. AMD Radeon(TM) HD 7650A Graphics +ATI Technologies Inc. AMD Radeon(TM) HD 7670A Graphics +ATI Technologies Inc. AMD Radeon(TM) HD 7670M +ATI Technologies Inc. AMD Radeon(TM) HD 8350 +ATI Technologies Inc. AMD Radeon(TM) HD8490 +ATI Technologies Inc. AMD Radeon. HD 7350 +ATI Technologies Inc. AMD Radeon. HD 7670M +ATI Technologies Inc. AMD Radeon. HD 7730M +ATI Technologies Inc. AMD Radeon. HD 7730M +ATI Technologies Inc. ASUS AH3450 Series ATI Technologies Inc. ASUS AH3450 Series -ATI Technologies Inc. ASUS AH3650 Series ATI Technologies Inc. ASUS AH3650 Series ATI Technologies Inc. ASUS AH4650 Series ATI Technologies Inc. ASUS ARES -ATI Technologies Inc. ASUS ARES -ATI Technologies Inc. ASUS EAH2900 Series -ATI Technologies Inc. ASUS EAH3450 Series +ATI Technologies Inc. ASUS ARES2 +ATI Technologies Inc. ASUS EAH2400 Series +ATI Technologies Inc. ASUS EAH2600 Series ATI Technologies Inc. ASUS EAH3450 Series ATI Technologies Inc. ASUS EAH3650 Series -ATI Technologies Inc. ASUS EAH3650 Series +ATI Technologies Inc. ASUS EAH3850 Series +ATI Technologies Inc. ASUS EAH3870 Series ATI Technologies Inc. ASUS EAH4350 series ATI Technologies Inc. ASUS EAH4350 series ATI Technologies Inc. ASUS EAH4550 series -ATI Technologies Inc. ASUS EAH4550 series ATI Technologies Inc. ASUS EAH4650 series ATI Technologies Inc. ASUS EAH4670 series -ATI Technologies Inc. ASUS EAH4670 series -ATI Technologies Inc. ASUS EAH4750 Series -ATI Technologies Inc. ASUS EAH4770 Series ATI Technologies Inc. ASUS EAH4770 Series ATI Technologies Inc. ASUS EAH4770 series -ATI Technologies Inc. ASUS EAH4770 series ATI Technologies Inc. ASUS EAH4850 series +ATI Technologies Inc. ASUS EAH4870 series +ATI Technologies Inc. ASUS EAH4870x2 +ATI Technologies Inc. ASUS EAH4890 ATI Technologies Inc. ASUS EAH5450 Series ATI Technologies Inc. ASUS EAH5450 Series ATI Technologies Inc. ASUS EAH5550 Series @@ -269,21 +766,26 @@ ATI Technologies Inc. ASUS EAH5550 Series ATI Technologies Inc. ASUS EAH5570 series ATI Technologies Inc. ASUS EAH5570 series ATI Technologies Inc. ASUS EAH5670 Series -ATI Technologies Inc. ASUS EAH5670 Series ATI Technologies Inc. ASUS EAH5750 Series ATI Technologies Inc. ASUS EAH5750 Series ATI Technologies Inc. ASUS EAH5770 Series ATI Technologies Inc. ASUS EAH5770 Series ATI Technologies Inc. ASUS EAH5830 Series +ATI Technologies Inc. ASUS EAH5830 Series ATI Technologies Inc. ASUS EAH5850 Series ATI Technologies Inc. ASUS EAH5850 Series ATI Technologies Inc. ASUS EAH5870 Series ATI Technologies Inc. ASUS EAH5870 Series -ATI Technologies Inc. ASUS EAH5970 Series -ATI Technologies Inc. ASUS EAH5970 Series ATI Technologies Inc. ASUS EAH6450 Series +ATI Technologies Inc. ASUS EAH6450 Series +ATI Technologies Inc. ASUS EAH6570 Series ATI Technologies Inc. ASUS EAH6570 Series ATI Technologies Inc. ASUS EAH6670 Series +ATI Technologies Inc. ASUS EAH6670 Series +ATI Technologies Inc. ASUS EAH6750 Series +ATI Technologies Inc. ASUS EAH6750 Series +ATI Technologies Inc. ASUS EAH6770 Series +ATI Technologies Inc. ASUS EAH6770 Series ATI Technologies Inc. ASUS EAH6850 Series ATI Technologies Inc. ASUS EAH6850 Series ATI Technologies Inc. ASUS EAH6870 Series @@ -292,359 +794,476 @@ ATI Technologies Inc. ASUS EAH6950 Series ATI Technologies Inc. ASUS EAH6950 Series ATI Technologies Inc. ASUS EAH6970 Series ATI Technologies Inc. ASUS EAH6970 Series -ATI Technologies Inc. ASUS EAHG4670 series -ATI Technologies Inc. ASUS Extreme AX600 Series +ATI Technologies Inc. ASUS Extreme AX300 Series +ATI Technologies Inc. ASUS Extreme AX300SE/T +ATI Technologies Inc. ASUS Extreme AX550 Series +ATI Technologies Inc. ASUS Extreme AX550 Series x86/SSE2 ATI Technologies Inc. ASUS Extreme AX600 Series -ATI Technologies Inc. ASUS Extreme AX600XT-TD -ATI Technologies Inc. ASUS Extreme AX600XT-TD +ATI Technologies Inc. ASUS HD 7350 +ATI Technologies Inc. ASUS HD7470 Series +ATI Technologies Inc. ASUS HD7670 Series +ATI Technologies Inc. ASUS HD7670 Series +ATI Technologies Inc. ASUS HD7750 Series +ATI Technologies Inc. ASUS HD7750 Series +ATI Technologies Inc. ASUS HD7770 Series +ATI Technologies Inc. ASUS HD7770 Series +ATI Technologies Inc. ASUS HD7790 Series +ATI Technologies Inc. ASUS HD7850 Series +ATI Technologies Inc. ASUS HD7850 Series +ATI Technologies Inc. ASUS HD7850 Series +ATI Technologies Inc. ASUS HD7870 Series +ATI Technologies Inc. ASUS HD7870 Series +ATI Technologies Inc. ASUS HD7870 Series +ATI Technologies Inc. ASUS HD7870 Series +ATI Technologies Inc. ASUS HD7950 Series +ATI Technologies Inc. ASUS HD7950 Series +ATI Technologies Inc. ASUS HD7950 Series +ATI Technologies Inc. ASUS HD7970 Series +ATI Technologies Inc. ASUS HD7970 Series +ATI Technologies Inc. ASUS HD7970 Series +ATI Technologies Inc. ASUS X1300 Series +ATI Technologies Inc. ASUS X1300 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ASUS X1300 Series x86/SSE2 +ATI Technologies Inc. ASUS X1300 x86/SSE2 ATI Technologies Inc. ASUS X1550 Series -ATI Technologies Inc. ASUS X1950 Series x86/SSE2 -ATI Technologies Inc. ASUS X800 Series -ATI Technologies Inc. ASUS X800 Series -ATI Technologies Inc. ASUS X850 Series +ATI Technologies Inc. ASUS X1550 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ASUS X1550 Series x86/SSE2 +ATI Technologies Inc. ASUS X1600 Series +ATI Technologies Inc. ASUS X1600 Series x86 +ATI Technologies Inc. ASUS X1600 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ASUS X1600 Series x86/SSE2 +ATI Technologies Inc. ASUS X1650 Series +ATI Technologies Inc. ASUS X1650 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ASUS X1650 Series x86/SSE2 +ATI Technologies Inc. ASUS X1950 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon HD 5000 Series +ATI Technologies Inc. ATI Radeon HD 6350 ATI Technologies Inc. ATI All-in-Wonder HD +ATI Technologies Inc. ATI Display Adapter +ATI Technologies Inc. ATI FireGL V3100 +ATI Technologies Inc. ATI FireGL V3200 Pentium 4 (SSE2) +ATI Technologies Inc. ATI FireGL V3300 +ATI Technologies Inc. ATI FireGL V3350 +ATI Technologies Inc. ATI FireGL V3350 Pentium 4 (SSE2) +ATI Technologies Inc. ATI FireGL V3400 (Microsoft Corporation - WDDM) +ATI Technologies Inc. ATI FireGL V3400 Pentium 4 (SSE2) +ATI Technologies Inc. ATI FireGL V3600 +ATI Technologies Inc. ATI FireGL V5200 (Microsoft Corporation - WDDM) +ATI Technologies Inc. ATI FireGL V5200 Pentium 4 (SSE2) +ATI Technologies Inc. ATI FireGL V5600 +ATI Technologies Inc. ATI FireGL V7200 +ATI Technologies Inc. ATI FireGL V7200 Pentium 4 (SSE2) +ATI Technologies Inc. ATI FireGL V7600 +ATI Technologies Inc. ATI FireGL V7700 +ATI Technologies Inc. ATI FireMV 2250 +ATI Technologies Inc. ATI FireMV 2250 x86/SSE2 ATI Technologies Inc. ATI FirePro 2260 ATI Technologies Inc. ATI FirePro 2260 ATI Technologies Inc. ATI FirePro 2450 +ATI Technologies Inc. ATI FirePro 3800 (FireGL) Graphics Adapter ATI Technologies Inc. ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M5800 -ATI Technologies Inc. ATI FirePro M7740 ATI Technologies Inc. ATI FirePro M7740 ATI Technologies Inc. ATI FirePro M7820 ATI Technologies Inc. ATI FirePro M7820 +ATI Technologies Inc. ATI FirePro M7820 (FireGL) ATI Technologies Inc. ATI FirePro V3700 (FireGL) ATI Technologies Inc. ATI FirePro V3800 +ATI Technologies Inc. ATI FirePro V3800 (FireGL V) +ATI Technologies Inc. ATI FirePro V3800 (FireGL V) Graphics Adapter +ATI Technologies Inc. ATI FirePro V3800 (FireGL) ATI Technologies Inc. ATI FirePro V4800 +ATI Technologies Inc. ATI FirePro V4800 (FireGL V) ATI Technologies Inc. ATI FirePro V4800 (FireGL) -ATI Technologies Inc. ATI FirePro V5800 -ATI Technologies Inc. ATI FirePro V7800 +ATI Technologies Inc. ATI FirePro V5700 (FireGL) +ATI Technologies Inc. ATI FirePro V5800 (FireGL V) +ATI Technologies Inc. ATI FirePro V5800 (FireGL) +ATI Technologies Inc. ATI FirePro V7800 (FireGL V) +ATI Technologies Inc. ATI FirePro V7800 (FireGL) +ATI Technologies Inc. ATI FirePro V8700 (FireGL) +ATI Technologies Inc. ATI FirePro V9800 (FireGL V) +ATI Technologies Inc. ATI MOBILITY FIRE GL T2/T2e +ATI Technologies Inc. ATI MOBILITY FireGL V3200 +ATI Technologies Inc. ATI MOBILITY FireGL V5000 Pentium 4 (SSE2) +ATI Technologies Inc. ATI MOBILITY FireGL V5200 +ATI Technologies Inc. ATI MOBILITY FireGL V5200 Pentium 4 (SSE2) +ATI Technologies Inc. ATI MOBILITY FireGL V5250 +ATI Technologies Inc. ATI MOBILITY RADEON 9600 Series +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series -ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON 9XXX x86/SSE2 +ATI Technologies Inc. ATI MOBILITY RADEON 9600/9700 Series (Omega 3 ATI Technologies Inc. ATI MOBILITY RADEON HD 2300 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2400 +ATI Technologies Inc. ATI MOBILITY RADEON HD 2600 +ATI Technologies Inc. ATI MOBILITY RADEON HD 3430 ATI Technologies Inc. ATI MOBILITY RADEON HD 3450 ATI Technologies Inc. ATI MOBILITY RADEON HD 3650 +ATI Technologies Inc. ATI MOBILITY RADEON HD 4530 / 4570 +ATI Technologies Inc. ATI MOBILITY RADEON X1300 +ATI Technologies Inc. ATI MOBILITY RADEON X1350 +ATI Technologies Inc. ATI MOBILITY RADEON X1400 ATI Technologies Inc. ATI MOBILITY RADEON X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X1600 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 +ATI Technologies Inc. ATI MOBILITY RADEON X1700 +ATI Technologies Inc. ATI MOBILITY RADEON X1800 +ATI Technologies Inc. ATI MOBILITY RADEON X1900 ATI Technologies Inc. ATI MOBILITY RADEON X2300 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 HD x86/SSE2 ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X2300 x86/SSE2 -ATI Technologies Inc. ATI MOBILITY RADEON X300 ATI Technologies Inc. ATI MOBILITY RADEON X300 +ATI Technologies Inc. ATI MOBILITY RADEON X300 x86/SSE2 ATI Technologies Inc. ATI MOBILITY RADEON X600 +ATI Technologies Inc. ATI MOBILITY RADEON X600 SE ATI Technologies Inc. ATI MOBILITY RADEON X700 ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 -ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 +ATI Technologies Inc. ATI MOBILITY RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI MOBILITY Radeon HD 4650 ATI Technologies Inc. ATI Mobility FireGL V5700 -ATI Technologies Inc. ATI Mobility FireGL V5700 -ATI Technologies Inc. ATI Mobility Radeon 4100 +ATI Technologies Inc. ATI Mobility FireGL V5725 +ATI Technologies Inc. ATI Mobility FireGL V5725 ATI Technologies Inc. ATI Mobility Radeon 4100 ATI Technologies Inc. ATI Mobility Radeon Graphics -ATI Technologies Inc. ATI Mobility Radeon Graphics -ATI Technologies Inc. ATI Mobility Radeon HD 2300 ATI Technologies Inc. ATI Mobility Radeon HD 2300 +ATI Technologies Inc. ATI Mobility Radeon HD 2300 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon HD 2400 ATI Technologies Inc. ATI Mobility Radeon HD 2400 -ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT +ATI Technologies Inc. ATI Mobility Radeon HD 2400 (Omega 3.8.442) ATI Technologies Inc. ATI Mobility Radeon HD 2400 XT ATI Technologies Inc. ATI Mobility Radeon HD 2600 ATI Technologies Inc. ATI Mobility Radeon HD 2600 ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT -ATI Technologies Inc. ATI Mobility Radeon HD 2700 +ATI Technologies Inc. ATI Mobility Radeon HD 2600 XT (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Mobility Radeon HD 2700 ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation WDDM 1.1) +ATI Technologies Inc. ATI Mobility Radeon HD 3400 Series (Microsoft Corporation- WDDM v1.1) ATI Technologies Inc. ATI Mobility Radeon HD 3410 ATI Technologies Inc. ATI Mobility Radeon HD 3430 ATI Technologies Inc. ATI Mobility Radeon HD 3430 -ATI Technologies Inc. ATI Mobility Radeon HD 3450 +ATI Technologies Inc. ATI Mobility Radeon HD 3430 (Microsoft Corporation- WDDM v1.1) ATI Technologies Inc. ATI Mobility Radeon HD 3450 ATI Technologies Inc. ATI Mobility Radeon HD 3470 ATI Technologies Inc. ATI Mobility Radeon HD 3470 ATI Technologies Inc. ATI Mobility Radeon HD 3470 Hybrid X2 +ATI Technologies Inc. ATI Mobility Radeon HD 3470 Series ATI Technologies Inc. ATI Mobility Radeon HD 3650 ATI Technologies Inc. ATI Mobility Radeon HD 3650 ATI Technologies Inc. ATI Mobility Radeon HD 3670 +ATI Technologies Inc. ATI Mobility Radeon HD 3850 +ATI Technologies Inc. ATI Mobility Radeon HD 3870 +ATI Technologies Inc. ATI Mobility Radeon HD 3870 X2 +ATI Technologies Inc. ATI Mobility Radeon HD 4200 ATI Technologies Inc. ATI Mobility Radeon HD 4200 ATI Technologies Inc. ATI Mobility Radeon HD 4200 ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4200 Series (Microsoft Corporation - WDDM v1.1) ATI Technologies Inc. ATI Mobility Radeon HD 4225 ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4225 Series ATI Technologies Inc. ATI Mobility Radeon HD 4250 ATI Technologies Inc. ATI Mobility Radeon HD 4250 ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics ATI Technologies Inc. ATI Mobility Radeon HD 4250 Graphics ATI Technologies Inc. ATI Mobility Radeon HD 4250 Series ATI Technologies Inc. ATI Mobility Radeon HD 4270 +ATI Technologies Inc. ATI Mobility Radeon HD 4270 Series ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series ATI Technologies Inc. ATI Mobility Radeon HD 4300 Series ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4300/4500 Series ATI Technologies Inc. ATI Mobility Radeon HD 4330 ATI Technologies Inc. ATI Mobility Radeon HD 4330 ATI Technologies Inc. ATI Mobility Radeon HD 4330 Series ATI Technologies Inc. ATI Mobility Radeon HD 4350 ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4350 Series ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Mobility Radeon HD 4500 Series (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series ATI Technologies Inc. ATI Mobility Radeon HD 4500/5100 Series ATI Technologies Inc. ATI Mobility Radeon HD 4530 -ATI Technologies Inc. ATI Mobility Radeon HD 4530 ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series ATI Technologies Inc. ATI Mobility Radeon HD 4530 Series ATI Technologies Inc. ATI Mobility Radeon HD 4550 -ATI Technologies Inc. ATI Mobility Radeon HD 4550 ATI Technologies Inc. ATI Mobility Radeon HD 4570 ATI Technologies Inc. ATI Mobility Radeon HD 4570 ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series -ATI Technologies Inc. ATI Mobility Radeon HD 4600 Series ATI Technologies Inc. ATI Mobility Radeon HD 4650 ATI Technologies Inc. ATI Mobility Radeon HD 4650 -ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series +ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Mobility Radeon HD 4650 (Microsoft Corporation- WDDM v1.1) ATI Technologies Inc. ATI Mobility Radeon HD 4650 Series ATI Technologies Inc. ATI Mobility Radeon HD 4670 -ATI Technologies Inc. ATI Mobility Radeon HD 4670 +ATI Technologies Inc. ATI Mobility Radeon HD 4670 (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Mobility Radeon HD 4830 ATI Technologies Inc. ATI Mobility Radeon HD 4830 Series ATI Technologies Inc. ATI Mobility Radeon HD 4850 ATI Technologies Inc. ATI Mobility Radeon HD 4870 -ATI Technologies Inc. ATI Mobility Radeon HD 4870 ATI Technologies Inc. ATI Mobility Radeon HD 5000 ATI Technologies Inc. ATI Mobility Radeon HD 5000 ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Engineering Sample - WDDM v1.20) +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) +ATI Technologies Inc. ATI Mobility Radeon HD 5100 ATI Technologies Inc. ATI Mobility Radeon HD 5145 ATI Technologies Inc. ATI Mobility Radeon HD 5145 ATI Technologies Inc. ATI Mobility Radeon HD 5165 ATI Technologies Inc. ATI Mobility Radeon HD 5165 ATI Technologies Inc. ATI Mobility Radeon HD 530v ATI Technologies Inc. ATI Mobility Radeon HD 530v +ATI Technologies Inc. ATI Mobility Radeon HD 5400 ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series ATI Technologies Inc. ATI Mobility Radeon HD 5400 Series ATI Technologies Inc. ATI Mobility Radeon HD 540v ATI Technologies Inc. ATI Mobility Radeon HD 5430 -ATI Technologies Inc. ATI Mobility Radeon HD 5430 ATI Technologies Inc. ATI Mobility Radeon HD 5450 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 -ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series ATI Technologies Inc. ATI Mobility Radeon HD 5450 Series ATI Technologies Inc. ATI Mobility Radeon HD 545v ATI Technologies Inc. ATI Mobility Radeon HD 545v ATI Technologies Inc. ATI Mobility Radeon HD 5470 ATI Technologies Inc. ATI Mobility Radeon HD 5470 ATI Technologies Inc. ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 550v -ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5570 ATI Technologies Inc. ATI Mobility Radeon HD 5600/5700 Series ATI Technologies Inc. ATI Mobility Radeon HD 560v ATI Technologies Inc. ATI Mobility Radeon HD 5650 ATI Technologies Inc. ATI Mobility Radeon HD 5650 -ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series +ATI Technologies Inc. ATI Mobility Radeon HD 565v ATI Technologies Inc. ATI Mobility Radeon HD 5700 Series ATI Technologies Inc. ATI Mobility Radeon HD 5730 -ATI Technologies Inc. ATI Mobility Radeon HD 5730 ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series +ATI Technologies Inc. ATI Mobility Radeon HD 5800 Series (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. ATI Mobility Radeon HD 5830 Series ATI Technologies Inc. ATI Mobility Radeon HD 5850 ATI Technologies Inc. ATI Mobility Radeon HD 5850 ATI Technologies Inc. ATI Mobility Radeon HD 5870 -ATI Technologies Inc. ATI Mobility Radeon HD 5870 -ATI Technologies Inc. ATI Mobility Radeon HD 6300 series -ATI Technologies Inc. ATI Mobility Radeon HD 6300 series ATI Technologies Inc. ATI Mobility Radeon HD 6370 ATI Technologies Inc. ATI Mobility Radeon HD 6370 -ATI Technologies Inc. ATI Mobility Radeon HD 6470M +ATI Technologies Inc. ATI Mobility Radeon HD 6550 ATI Technologies Inc. ATI Mobility Radeon HD 6550 ATI Technologies Inc. ATI Mobility Radeon HD 6550 ATI Technologies Inc. ATI Mobility Radeon HD 6570 ATI Technologies Inc. ATI Mobility Radeon HD 6570 ATI Technologies Inc. ATI Mobility Radeon X1300 -ATI Technologies Inc. ATI Mobility Radeon X1300 +ATI Technologies Inc. ATI Mobility Radeon X1300 (Omega 3.8.252) x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1300 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1300 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1350 ATI Technologies Inc. ATI Mobility Radeon X1350 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1400 -ATI Technologies Inc. ATI Mobility Radeon X1400 +ATI Technologies Inc. ATI Mobility Radeon X1400 (Omega 3.8.442) +ATI Technologies Inc. ATI Mobility Radeon X1400 x86 ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1400 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1450 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1600 +ATI Technologies Inc. ATI Mobility Radeon X1600 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X1600 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1700 +ATI Technologies Inc. ATI Mobility Radeon X1700 x86 ATI Technologies Inc. ATI Mobility Radeon X1700 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1800 x86/SSE2 +ATI Technologies Inc. ATI Mobility Radeon X1900 ATI Technologies Inc. ATI Mobility Radeon X2300 ATI Technologies Inc. ATI Mobility Radeon X2300 -ATI Technologies Inc. ATI Mobility Radeon X2300 (Omega 3.8.442) -ATI Technologies Inc. ATI Mobility Radeon X2300 x86 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86 +ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow! ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X2300 x86/SSE2 ATI Technologies Inc. ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon X2500 -ATI Technologies Inc. ATI Mobility Radeon X2500 x86/SSE2 -ATI Technologies Inc. ATI Mobility Radeon. HD 530v ATI Technologies Inc. ATI Mobility Radeon. HD 530v ATI Technologies Inc. ATI Mobility Radeon. HD 5470 -ATI Technologies Inc. ATI Mobility Radeon. HD 5470 -ATI Technologies Inc. ATI RADEON HD 3200 T25XX by CAMILO +ATI Technologies Inc. ATI RADEON 9600 Series +ATI Technologies Inc. ATI RADEON 9600/X1050 Series +ATI Technologies Inc. ATI RADEON E4690 +ATI Technologies Inc. ATI RADEON HD 3200 Graphics ATI Technologies Inc. ATI RADEON XPRESS 1100 +ATI Technologies Inc. ATI RADEON XPRESS 1100 Series +ATI Technologies Inc. ATI RADEON XPRESS 1100 Series ATI Technologies Inc. ATI RADEON XPRESS 1100 x86/SSE2 +ATI Technologies Inc. ATI RADEON XPRESS 1200 Series +ATI Technologies Inc. ATI RADEON XPRESS 200 ATI Technologies Inc. ATI RADEON XPRESS 200 Series ATI Technologies Inc. ATI RADEON XPRESS 200 Series ATI Technologies Inc. ATI RADEON XPRESS 200 Series x86/SSE2 +ATI Technologies Inc. ATI RADEON XPRESS 200 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI RADEON XPRESS 200M SERIES -ATI Technologies Inc. ATI Radeon +ATI Technologies Inc. ATI RADEON XPRESS 200M Series +ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Microsoft Corporation) +ATI Technologies Inc. ATI RADEON XPRESS 200M Series (Omega 3.8.421) x86/SSE2 +ATI Technologies Inc. ATI RADEON XPRESS 200M Series x86/SSE2 ATI Technologies Inc. ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 -ATI Technologies Inc. ATI Radeon 2100 (Microsoft - WDDM) +ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) +ATI Technologies Inc. ATI Radeon 2100 (Microsoft Corporation - WDDM) ATI Technologies Inc. ATI Radeon 2100 Graphics ATI Technologies Inc. ATI Radeon 3000 -ATI Technologies Inc. ATI Radeon 3000 ATI Technologies Inc. ATI Radeon 3000 Graphics ATI Technologies Inc. ATI Radeon 3000 Graphics +ATI Technologies Inc. ATI Radeon 3000 Graphics +ATI Technologies Inc. ATI Radeon 3000 Graphics (Engineering Sample - WDDM v1.1) +ATI Technologies Inc. ATI Radeon 3000 Series Graphics ATI Technologies Inc. ATI Radeon 3100 Graphics ATI Technologies Inc. ATI Radeon 3100 Graphics -ATI Technologies Inc. ATI Radeon 5xxx series +ATI Technologies Inc. ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) +ATI Technologies Inc. ATI Radeon 3100 Series Graphics +ATI Technologies Inc. ATI Radeon 9550 / X1050 ATI Technologies Inc. ATI Radeon 9550 / X1050 Series -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/MMX/3DNow!/SSE ATI Technologies Inc. ATI Radeon 9550 / X1050 Series x86/SSE2 -ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft - WDDM) +ATI Technologies Inc. ATI Radeon 9550 / X1050 Series(Microsoft Corporation - WDDM) ATI Technologies Inc. ATI Radeon 9600 / X1050 Series +ATI Technologies Inc. ATI Radeon 9600 / X1050 Series x86/SSE2 ATI Technologies Inc. ATI Radeon 9600/9550/X1050 Series ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon BB Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Broadway XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon BA Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Barts PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Barts XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Caicos PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Caicos Unknown Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon Cedar PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Cypress PRO Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Graphics Processor ATI Technologies Inc. ATI Radeon Graphics Processor -ATI Technologies Inc. ATI Radeon HD 2200 Graphics ATI Technologies Inc. ATI Radeon HD 2350 ATI Technologies Inc. ATI Radeon HD 2400 -ATI Technologies Inc. ATI Radeon HD 2400 ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2400 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2400 PCI ATI Technologies Inc. ATI Radeon HD 2400 PRO ATI Technologies Inc. ATI Radeon HD 2400 PRO AGP ATI Technologies Inc. ATI Radeon HD 2400 Pro -ATI Technologies Inc. ATI Radeon HD 2400 Pro ATI Technologies Inc. ATI Radeon HD 2400 Series -ATI Technologies Inc. ATI Radeon HD 2400 Series -ATI Technologies Inc. ATI Radeon HD 2400 XT +ATI Technologies Inc. ATI Radeon HD 2400 Series AGP ATI Technologies Inc. ATI Radeon HD 2400 XT ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 2400 XT OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2600 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2600 PRO ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2600 PRO OpenGL Engine ATI Technologies Inc. ATI Radeon HD 2600 Pro -ATI Technologies Inc. ATI Radeon HD 2600 Pro +ATI Technologies Inc. ATI Radeon HD 2600 Pro AGP ATI Technologies Inc. ATI Radeon HD 2600 Series +ATI Technologies Inc. ATI Radeon HD 2600 Series AGP ATI Technologies Inc. ATI Radeon HD 2600 XT -ATI Technologies Inc. ATI Radeon HD 2600 XT +ATI Technologies Inc. ATI Radeon HD 2600/3600 Series ATI Technologies Inc. ATI Radeon HD 2900 GT +ATI Technologies Inc. ATI Radeon HD 2900 PRO ATI Technologies Inc. ATI Radeon HD 2900 XT ATI Technologies Inc. ATI Radeon HD 3200 Graphics ATI Technologies Inc. ATI Radeon HD 3200 Graphics +ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Radeon HD 3300 Graphics ATI Technologies Inc. ATI Radeon HD 3400 Series ATI Technologies Inc. ATI Radeon HD 3400 Series ATI Technologies Inc. ATI Radeon HD 3450 ATI Technologies Inc. ATI Radeon HD 3450 ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3450 - Dell Optiplex +ATI Technologies Inc. ATI Radeon HD 3450 AGP ATI Technologies Inc. ATI Radeon HD 3470 ATI Technologies Inc. ATI Radeon HD 3470 - Dell Optiplex -ATI Technologies Inc. ATI Radeon HD 3550 -ATI Technologies Inc. ATI Radeon HD 3550 ATI Technologies Inc. ATI Radeon HD 3600 Series ATI Technologies Inc. ATI Radeon HD 3600 Series -ATI Technologies Inc. ATI Radeon HD 3650 +ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 3600 Series (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Radeon HD 3650 ATI Technologies Inc. ATI Radeon HD 3650 AGP -ATI Technologies Inc. ATI Radeon HD 3730 -ATI Technologies Inc. ATI Radeon HD 3800 Series ATI Technologies Inc. ATI Radeon HD 3800 Series ATI Technologies Inc. ATI Radeon HD 3850 -ATI Technologies Inc. ATI Radeon HD 3850 +ATI Technologies Inc. ATI Radeon HD 3850 (Microsoft Corporation - WDDM v1.1) ATI Technologies Inc. ATI Radeon HD 3850 AGP ATI Technologies Inc. ATI Radeon HD 3870 -ATI Technologies Inc. ATI Radeon HD 3870 +ATI Technologies Inc. ATI Radeon HD 3870 (Engineering Sample - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 3870 (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 3870 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 3870 X2 ATI Technologies Inc. ATI Radeon HD 4200 ATI Technologies Inc. ATI Radeon HD 4200 +ATI Technologies Inc. ATI Radeon HD 4200 (Microsoft Corporation - WDDM v1.1) ATI Technologies Inc. ATI Radeon HD 4250 ATI Technologies Inc. ATI Radeon HD 4250 +ATI Technologies Inc. ATI Radeon HD 4250 (Engineering Sample - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4250 (Microsoft Corporation - WDDM v1.1) ATI Technologies Inc. ATI Radeon HD 4250 Graphics ATI Technologies Inc. ATI Radeon HD 4250 Graphics ATI Technologies Inc. ATI Radeon HD 4270 ATI Technologies Inc. ATI Radeon HD 4270 ATI Technologies Inc. ATI Radeon HD 4290 -ATI Technologies Inc. ATI Radeon HD 4290 -ATI Technologies Inc. ATI Radeon HD 4290 (Engineering Sample) ATI Technologies Inc. ATI Radeon HD 4300 Series ATI Technologies Inc. ATI Radeon HD 4300 Series ATI Technologies Inc. ATI Radeon HD 4300/4500 Series ATI Technologies Inc. ATI Radeon HD 4300/4500 Series +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4300/4500 Series (Microsoft Corporation- WDDM v1.1) ATI Technologies Inc. ATI Radeon HD 4350 ATI Technologies Inc. ATI Radeon HD 4350 -ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft WDDM 1.1) -ATI Technologies Inc. ATI Radeon HD 4450 +ATI Technologies Inc. ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Radeon HD 4450 ATI Technologies Inc. ATI Radeon HD 4500 Series +ATI Technologies Inc. ATI Radeon HD 4520 ATI Technologies Inc. ATI Radeon HD 4550 ATI Technologies Inc. ATI Radeon HD 4550 +ATI Technologies Inc. ATI Radeon HD 4550 (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4570 +ATI Technologies Inc. ATI Radeon HD 4580 +ATI Technologies Inc. ATI Radeon HD 4590 ATI Technologies Inc. ATI Radeon HD 4600 Series ATI Technologies Inc. ATI Radeon HD 4600 Series +ATI Technologies Inc. ATI Radeon HD 4600 Series (Engineering Sample - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4600-serie (Microsoft Corporation - WDDM v1.1) ATI Technologies Inc. ATI Radeon HD 4650 ATI Technologies Inc. ATI Radeon HD 4650 +ATI Technologies Inc. ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) ATI Technologies Inc. ATI Radeon HD 4670 ATI Technologies Inc. ATI Radeon HD 4670 ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4700 ATI Technologies Inc. ATI Radeon HD 4700 Series ATI Technologies Inc. ATI Radeon HD 4700 Series ATI Technologies Inc. ATI Radeon HD 4720 -ATI Technologies Inc. ATI Radeon HD 4720 -ATI Technologies Inc. ATI Radeon HD 4730 ATI Technologies Inc. ATI Radeon HD 4730 ATI Technologies Inc. ATI Radeon HD 4730 Series -ATI Technologies Inc. ATI Radeon HD 4730 Series -ATI Technologies Inc. ATI Radeon HD 4750 ATI Technologies Inc. ATI Radeon HD 4770 ATI Technologies Inc. ATI Radeon HD 4770 +ATI Technologies Inc. ATI Radeon HD 4800 ATI Technologies Inc. ATI Radeon HD 4800 Series ATI Technologies Inc. ATI Radeon HD 4800 Series +ATI Technologies Inc. ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) +ATI Technologies Inc. ATI Radeon HD 4810 series +ATI Technologies Inc. ATI Radeon HD 4830 ATI Technologies Inc. ATI Radeon HD 4850 -ATI Technologies Inc. ATI Radeon HD 4850 ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4850 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4850 PRO OpenGL Engine ATI Technologies Inc. ATI Radeon HD 4850 Series -ATI Technologies Inc. ATI Radeon HD 4870 +ATI Technologies Inc. ATI Radeon HD 4850 X2 ATI Technologies Inc. ATI Radeon HD 4870 ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 4870 X2 +ATI Technologies Inc. ATI Radeon HD 4870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 4870 Series ATI Technologies Inc. ATI Radeon HD 4870 X2 ATI Technologies Inc. ATI Radeon HD 5400 Series ATI Technologies Inc. ATI Radeon HD 5400 Series ATI Technologies Inc. ATI Radeon HD 5450 ATI Technologies Inc. ATI Radeon HD 5450 +ATI Technologies Inc. ATI Radeon HD 5450 +ATI Technologies Inc. ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. ATI Radeon HD 5470 +ATI Technologies Inc. ATI Radeon HD 5500 ATI Technologies Inc. ATI Radeon HD 5500 Series ATI Technologies Inc. ATI Radeon HD 5500 Series +ATI Technologies Inc. ATI Radeon HD 5530 ATI Technologies Inc. ATI Radeon HD 5570 ATI Technologies Inc. ATI Radeon HD 5570 ATI Technologies Inc. ATI Radeon HD 5600 Series @@ -655,16 +1274,24 @@ ATI Technologies Inc. ATI Radeon HD 5670 ATI Technologies Inc. ATI Radeon HD 5670 ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5670 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5700 Series ATI Technologies Inc. ATI Radeon HD 5700 Series -ATI Technologies Inc. ATI Radeon HD 5750 +ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.2) +ATI Technologies Inc. ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) ATI Technologies Inc. ATI Radeon HD 5750 ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5750 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5750 Series ATI Technologies Inc. ATI Radeon HD 5770 ATI Technologies Inc. ATI Radeon HD 5770 ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5770 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5800 Series ATI Technologies Inc. ATI Radeon HD 5800 Series ATI Technologies Inc. ATI Radeon HD 5800 Series ATI Technologies Inc. ATI Radeon HD 5850 @@ -672,343 +1299,492 @@ ATI Technologies Inc. ATI Radeon HD 5850 ATI Technologies Inc. ATI Radeon HD 5870 ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 5870 OpenGL Engine ATI Technologies Inc. ATI Radeon HD 5900 Series ATI Technologies Inc. ATI Radeon HD 5900 Series ATI Technologies Inc. ATI Radeon HD 5970 ATI Technologies Inc. ATI Radeon HD 6230 ATI Technologies Inc. ATI Radeon HD 6230 -ATI Technologies Inc. ATI Radeon HD 6250 -ATI Technologies Inc. ATI Radeon HD 6250 +ATI Technologies Inc. ATI Radeon HD 6290 ATI Technologies Inc. ATI Radeon HD 6350 ATI Technologies Inc. ATI Radeon HD 6390 +ATI Technologies Inc. ATI Radeon HD 6490 +ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6490M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6510 ATI Technologies Inc. ATI Radeon HD 6510 ATI Technologies Inc. ATI Radeon HD 6570M -ATI Technologies Inc. ATI Radeon HD 6570M ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6750 +ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6630M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6750M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6770 ATI Technologies Inc. ATI Radeon HD 6770 ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine -ATI Technologies Inc. ATI Radeon HD 6800 Series +ATI Technologies Inc. ATI Radeon HD 6770M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine ATI Technologies Inc. ATI Radeon HD 6970M OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 7350 +ATI Technologies Inc. ATI Radeon HD 7350 +ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD 7950 OpenGL Engine +ATI Technologies Inc. ATI Radeon HD Pitcairn XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon HD Tahiti XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon HD Verde XT Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon HD3750 ATI Technologies Inc. ATI Radeon HD4300/HD4500 series ATI Technologies Inc. ATI Radeon HD4300/HD4500 series +ATI Technologies Inc. ATI Radeon HD4650 ATI Technologies Inc. ATI Radeon HD4670 ATI Technologies Inc. ATI Radeon HD4670 -ATI Technologies Inc. ATI Radeon Juniper LE Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV710 Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon RV730 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon RV770 Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Redwood PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon RV790 Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon Redwood XT Prototype OpenGL Engine -ATI Technologies Inc. ATI Radeon Whistler PRO/LP Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Turks PRO Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine +ATI Technologies Inc. ATI Radeon Turks XT Prototype OpenGL Engine ATI Technologies Inc. ATI Radeon X1050 ATI Technologies Inc. ATI Radeon X1050 Series +ATI Technologies Inc. ATI Radeon X1050 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1050 x86/SSE2 ATI Technologies Inc. ATI Radeon X1200 ATI Technologies Inc. ATI Radeon X1200 ATI Technologies Inc. ATI Radeon X1200 Series ATI Technologies Inc. ATI Radeon X1200 Series +ATI Technologies Inc. ATI Radeon X1200 Series (Microsoft Corporation - WDDM) ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon X1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1200 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1250 ATI Technologies Inc. ATI Radeon X1250 ATI Technologies Inc. ATI Radeon X1250 ATI Technologies Inc. ATI Radeon X1250 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon X1270 -ATI Technologies Inc. ATI Radeon X1270 -ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon X1270 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1300 / X1550 Series ATI Technologies Inc. ATI Radeon X1300/X1550 Series +ATI Technologies Inc. ATI Radeon X1550 ATI Technologies Inc. ATI Radeon X1550 Series -ATI Technologies Inc. ATI Radeon X1550 Series +ATI Technologies Inc. ATI Radeon X1550 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1550 Series x86/SSE2 +ATI Technologies Inc. ATI Radeon X1550 x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1550 x86/SSE2 +ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine ATI Technologies Inc. ATI Radeon X1600 OpenGL Engine -ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine ATI Technologies Inc. ATI Radeon X1900 OpenGL Engine ATI Technologies Inc. ATI Radeon X1950 GT +ATI Technologies Inc. ATI Radeon X1950 GT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon X1950 GT x86/SSE2 ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series ATI Technologies Inc. ATI Radeon X300/X550/X1050 Series +ATI Technologies Inc. ATI Radeon X600/X550/X1050 Series ATI Technologies Inc. ATI Radeon Xpress 1100 +ATI Technologies Inc. ATI Radeon Xpress 1100 x86/SSE2 ATI Technologies Inc. ATI Radeon Xpress 1150 -ATI Technologies Inc. ATI Radeon Xpress 1150 +ATI Technologies Inc. ATI Radeon Xpress 1150 Series +ATI Technologies Inc. ATI Radeon Xpress 1150 Series ATI Technologies Inc. ATI Radeon Xpress 1150 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1200 -ATI Technologies Inc. ATI Radeon Xpress 1200 -ATI Technologies Inc. ATI Radeon Xpress 1200 Series ATI Technologies Inc. ATI Radeon Xpress 1200 Series -ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ATI Radeon Xpress 1200 Series (Microsoft Corporation - WDDM) ATI Technologies Inc. ATI Radeon Xpress 1200 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Radeon Xpress 1250 +ATI Technologies Inc. ATI Radeon Xpress 1200 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon Xpress 1250 ATI Technologies Inc. ATI Radeon Xpress 1250 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon Xpress 1250 x86/SSE2 -ATI Technologies Inc. ATI Radeon Xpress Series +ATI Technologies Inc. ATI Radeon Xpress 1270 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. ATI Radeon Xpress Series ATI Technologies Inc. ATI Radeon Xpress Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. ATI Yamaha HD 9000 -ATI Technologies Inc. ATi RS880M -ATI Technologies Inc. ATi RS880M -ATI Technologies Inc. Carte graphique VGA standard +ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition +ATI Technologies Inc. All-in-Wonder 2006 PCI-E Edition x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Diamond Radeon X1550 ATI Technologies Inc. Diamond Radeon X1550 Series -ATI Technologies Inc. EG JUNIPER -ATI Technologies Inc. EG PARK +ATI Technologies Inc. Diamond Radeon X1550 Series x86/SSE2 +ATI Technologies Inc. Diamond Radeon X1550 x86/SSE2 +ATI Technologies Inc. Diamond X1600 PRO 512MB PCI-E x86/MMX/3DNow!/SSE2 ATI Technologies Inc. FireGL V3100 Pentium 4 (SSE2) +ATI Technologies Inc. FireGL V3200 Pentium 4 (SSE2) +ATI Technologies Inc. FireGL X1-128 ATI Technologies Inc. FireMV 2400 PCI DDR x86 ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 -ATI Technologies Inc. FireMV 2400 PCI DDR x86/SSE2 +ATI Technologies Inc. FirePro M3900 Mobility Professional Graphics +ATI Technologies Inc. GIGABYTE RADEON 9600 PRO +ATI Technologies Inc. GIGABYTE Radeon X1300 Pro +ATI Technologies Inc. GIGABYTE Radeon X1300 Series +ATI Technologies Inc. GIGABYTE Radeon X1600 PRO +ATI Technologies Inc. GeCube RADEON 9600XT +ATI Technologies Inc. GeCube RADEON X550 x86/SSE2 +ATI Technologies Inc. GeCube RADEON X700 Series ATI Technologies Inc. GeCube Radeon X1550 -ATI Technologies Inc. GeForce 9600 GT x86/SSE2 -ATI Technologies Inc. Geforce 9500 GT -ATI Technologies Inc. Geforce 9500GT -ATI Technologies Inc. Geforce 9800 GT +ATI Technologies Inc. GeCube Radeon X1550 Series +ATI Technologies Inc. GeCube Radeon X1550 Series +ATI Technologies Inc. GeForce 9600 GT x86/SSE2 +ATI Technologies Inc. GigaByte Radeon X1050 +ATI Technologies Inc. Gigabyte RADEON X300 +ATI Technologies Inc. Gigabyte RADEON X300 +ATI Technologies Inc. Gigabyte RADEON X300 SE +ATI Technologies Inc. Gigabyte RADEON X300 x86/SSE2 ATI Technologies Inc. HD3730 ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series -ATI Technologies Inc. HIGHTECH EXCALIBUR X700 PRO -ATI Technologies Inc. M21 x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. M76M +ATI Technologies Inc. HIGHTECH EXCALIBUR RADEON 9550SE Series x86/SSE2 +ATI Technologies Inc. HIGHTECH RADEON 9600XT +ATI Technologies Inc. HIS Radeon X1550 x86/SSE2 +ATI Technologies Inc. M52 x86 +ATI Technologies Inc. M72-M +ATI Technologies Inc. MEDION RADEON 9600 TX +ATI Technologies Inc. MEDION RADEON X740XL x86/SSE2 +ATI Technologies Inc. MOBILITY FIREGL T2 Pentium 4 (SSE2) +ATI Technologies Inc. MOBILITY RADEON 7000 IGP DDR x86/SSE2 ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 7500 DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86 ATI Technologies Inc. MOBILITY RADEON 9000 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86 ATI Technologies Inc. MOBILITY RADEON 9000 IGPRADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000/9100 IGP Series DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9000/9100 PRO IGP Series DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9200 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9600 x86 +ATI Technologies Inc. MOBILITY RADEON 9600 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. MOBILITY RADEON 9600 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9700 x86 +ATI Technologies Inc. MOBILITY RADEON 9700 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. MOBILITY RADEON 9700 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON 9800 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X300 x86 ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 ATI Technologies Inc. MOBILITY RADEON X300 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X600 SE x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X600 x86 ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X600 x86/SSE2 -ATI Technologies Inc. MOBILITY RADEON X700 SE x86 -ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X700 SE x86/SSE2 +ATI Technologies Inc. MOBILITY RADEON X700 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. MOBILITY RADEON X700 x86/SSE2 ATI Technologies Inc. MOBILITY RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. MSI RX9550SE -ATI Technologies Inc. MSI Radeon X1550 Series -ATI Technologies Inc. Mobility Radeon HD 6000 series +ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. MOBILITY/RADEON 9000 DDR x86/SSE2 +ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. MOBILITY/RADEON 9250/9200 Series DDR x86/SSE2 +ATI Technologies Inc. MSI RX9550SE x86/MMX/3DNow!/SSE +ATI Technologies Inc. MSI Radeon X1550 ATI Technologies Inc. Mobility Radeon X2300 HD -ATI Technologies Inc. Mobility Radeon X2300 HD -ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 ATI Technologies Inc. Mobility Radeon X2300 HD x86/SSE2 -ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 7000 DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 7000 DDR x86/SSE2 -ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 7500 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 7000 SDR x86 +ATI Technologies Inc. RADEON 7000 SW TCL x86/SSE2 +ATI Technologies Inc. RADEON 7200 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 7200 DDR x86/SSE2 +ATI Technologies Inc. RADEON 7200 SDR x86/SSE2 ATI Technologies Inc. RADEON 7500 DDR x86/SSE2 +ATI Technologies Inc. RADEON 8500 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 8500 DDR x86/SSE2 +ATI Technologies Inc. RADEON 9000 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9000 DDR x86/SSE2 +ATI Technologies Inc. RADEON 9000 PRO DDR x86/SSE2 +ATI Technologies Inc. RADEON 9000 XT IGPRADEON 9100 XT IGP DDR x86/SSE2 +ATI Technologies Inc. RADEON 9100 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9100 DDR x86/SSE2 +ATI Technologies Inc. RADEON 9100 IGP DDR x86 ATI Technologies Inc. RADEON 9100 IGP DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9200 DDR x86/SSE2 -ATI Technologies Inc. RADEON 9200 PRO DDR x86/MMX/3DNow!/SSE -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE -ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200 LE DDR x86/SSE2 +ATI Technologies Inc. RADEON 9200 PRO DDR x86/SSE2 +ATI Technologies Inc. RADEON 9200 Series DDR x86 +ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow! ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9200 Series DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE -ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 ATI Technologies Inc. RADEON 9200 Series DDR x86/SSE2 ATI Technologies Inc. RADEON 9200SE DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9200SE DDR x86/SSE2 +ATI Technologies Inc. RADEON 9250/9000 Series DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 -ATI Technologies Inc. RADEON 9250/9200 Series DDR x86/SSE2 ATI Technologies Inc. RADEON 9500 +ATI Technologies Inc. RADEON 9500 PRO / 9700 +ATI Technologies Inc. RADEON 9550 +ATI Technologies Inc. RADEON 9550 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9550 x86/SSE2 ATI Technologies Inc. RADEON 9600 SERIES -ATI Technologies Inc. RADEON 9600 SERIES x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON 9600 SERIES x86/SSE2 -ATI Technologies Inc. RADEON 9600 TX x86/SSE2 +ATI Technologies Inc. RADEON 9600 TX ATI Technologies Inc. RADEON 9600 TX x86/SSE2 +ATI Technologies Inc. RADEON 9600 XT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9600 XT x86/SSE2 ATI Technologies Inc. RADEON 9600 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON 9600 x86/SSE2 -ATI Technologies Inc. RADEON 9600 x86/SSE2 -ATI Technologies Inc. RADEON 9700 PRO x86/MMX/3DNow!/SSE +ATI Technologies Inc. RADEON 9600SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON 9600SE x86/SSE2 +ATI Technologies Inc. RADEON 9700 PRO ATI Technologies Inc. RADEON 9800 PRO +ATI Technologies Inc. RADEON 9800 PRO (Microsoft Corporation - WDDM) +ATI Technologies Inc. RADEON 9800 PRO - Secondary +ATI Technologies Inc. RADEON 9800 Pro x86/SSE2 +ATI Technologies Inc. RADEON 9800 SERIES +ATI Technologies Inc. RADEON 9800 XT +ATI Technologies Inc. RADEON 9800 XT x86/SSE2 ATI Technologies Inc. RADEON 9800 x86/SSE2 ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 -ATI Technologies Inc. RADEON IGP 340M DDR x86/SSE2 +ATI Technologies Inc. RADEON Radeon X300/X550/X1050 Series x86/SSE2 +ATI Technologies Inc. RADEON X1600 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X1600 Series x86/SSE2 +ATI Technologies Inc. RADEON X300 SE 128MB HyperMemory x86/SSE2 +ATI Technologies Inc. RADEON X300 SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X300 Series ATI Technologies Inc. RADEON X300 Series x86/SSE2 +ATI Technologies Inc. RADEON X300 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON X300 x86/SSE2 -ATI Technologies Inc. RADEON X300 x86/SSE2 +ATI Technologies Inc. RADEON X300/X550 Series x86 +ATI Technologies Inc. RADEON X300/X550 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 ATI Technologies Inc. RADEON X300/X550 Series x86/SSE2 +ATI Technologies Inc. RADEON X550 x86/MMX/3DNow! ATI Technologies Inc. RADEON X550 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON X550 x86/SSE2 +ATI Technologies Inc. RADEON X550XT +ATI Technologies Inc. RADEON X600 256MB HyperMemory x86/SSE2 +ATI Technologies Inc. RADEON X600 PRO x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X600 PRO x86/SSE2 +ATI Technologies Inc. RADEON X600 SE x86/SSE2 ATI Technologies Inc. RADEON X600 Series -ATI Technologies Inc. RADEON X600 x86/SSE2 +ATI Technologies Inc. RADEON X600 x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON X600 x86/SSE2 ATI Technologies Inc. RADEON X600/X550 Series +ATI Technologies Inc. RADEON X600/X550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. RADEON X600/X550 Series Secondary +ATI Technologies Inc. RADEON X600/X550 Series x86/SSE2 +ATI Technologies Inc. RADEON X700 PRO x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON X700 PRO x86/SSE2 +ATI Technologies Inc. RADEON X700 SE +ATI Technologies Inc. RADEON X700 SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X700 SE x86/SSE2 +ATI Technologies Inc. RADEON X700 Series +ATI Technologies Inc. RADEON X700 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X700 Series x86/SSE2 +ATI Technologies Inc. RADEON X700 x86/SSE2 +ATI Technologies Inc. RADEON X700/X550 Series x86/SSE2 +ATI Technologies Inc. RADEON X800 GT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800 GTO +ATI Technologies Inc. RADEON X800 GTO x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800 GTO x86/SSE2 +ATI Technologies Inc. RADEON X800 PRO/GTO ATI Technologies Inc. RADEON X800 SE x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800 SE x86/SSE2 +ATI Technologies Inc. RADEON X800 Series +ATI Technologies Inc. RADEON X800 Series +ATI Technologies Inc. RADEON X800 XL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON X800 XL x86/SSE2 ATI Technologies Inc. RADEON X800 XT +ATI Technologies Inc. RADEON X800 XT (Microsoft Corporation - WDDM) +ATI Technologies Inc. RADEON X800 XT x86/SSE2 +ATI Technologies Inc. RADEON X800/X850 Series ATI Technologies Inc. RADEON X800GT +ATI Technologies Inc. RADEON X850 Series +ATI Technologies Inc. RADEON X850 XT Platinum Edition (Microsoft Corporation - WDDM) +ATI Technologies Inc. RADEON X850 XT Platinum Edition x86/SSE2 +ATI Technologies Inc. RADEON X850 XT x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86 +ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow! ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200 Series SW TCL x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200 Series x86/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86 +ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow! ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 ATI Technologies Inc. RADEON XPRESS 200M Series SW TCL x86/SSE2 -ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow! ATI Technologies Inc. RADEON XPRESS 200M Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. RADEON XPRESS 200M Series x86/SSE2 ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 ATI Technologies Inc. RADEON XPRESS Series x86/SSE2 -ATI Technologies Inc. RS740 -ATI Technologies Inc. RS780C -ATI Technologies Inc. RS780M +ATI Technologies Inc. RADEON Xpress 200 Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. RADEON Xpress 200G Series SW TCL x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. ROBSON CE +ATI Technologies Inc. ROBSON LE ATI Technologies Inc. RS780M ATI Technologies Inc. RS880 ATI Technologies Inc. RS880 -ATI Technologies Inc. RV410 Pro x86/SSE2 -ATI Technologies Inc. RV790 -ATI Technologies Inc. RV790 +ATI Technologies Inc. RV250 DDR x86/SSE2 +ATI Technologies Inc. Radeon X1300XT/X1600 Pro Series +ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series +ATI Technologies Inc. Radeon X1300XT/X1600Pro/X1650 Series +ATI Technologies Inc. Radeon (TM) HD 7670M +ATI Technologies Inc. Radeon (TM) HD 7670M +ATI Technologies Inc. Radeon (TM) HD 6370M ATI Technologies Inc. Radeon (TM) HD 6470M ATI Technologies Inc. Radeon (TM) HD 6470M ATI Technologies Inc. Radeon (TM) HD 6490M ATI Technologies Inc. Radeon (TM) HD 6490M +ATI Technologies Inc. Radeon (TM) HD 6490M +ATI Technologies Inc. Radeon (TM) HD 6630M +ATI Technologies Inc. Radeon (TM) HD 6750M ATI Technologies Inc. Radeon (TM) HD 6750M ATI Technologies Inc. Radeon (TM) HD 6770M ATI Technologies Inc. Radeon (TM) HD 6770M +ATI Technologies Inc. Radeon (TM) HD 6770M +ATI Technologies Inc. Radeon (TM) HD 6850M ATI Technologies Inc. Radeon (TM) HD 6850M -ATI Technologies Inc. Radeon 7000 DDR x86/SSE +ATI Technologies Inc. Radeon (TM) HD 7450M +ATI Technologies Inc. Radeon (TM) HD 7470M +ATI Technologies Inc. Radeon (TM) HD 7670M +ATI Technologies Inc. Radeon (TM) HD 7670M +ATI Technologies Inc. Radeon (TM) HD 7670M +ATI Technologies Inc. Radeon (TM) HD 7690M XT +ATI Technologies Inc. Radeon (TM) HD 7690M XT +ATI Technologies Inc. Radeon (TM) HD 7690M XT +ATI Technologies Inc. Radeon (TM) HD 7750M +ATI Technologies Inc. Radeon (TM) HD 7750M +ATI Technologies Inc. Radeon (TM) HD 7850M +ATI Technologies Inc. Radeon (TM) HD 7850M +ATI Technologies Inc. Radeon (TM) HD 8750M +ATI Technologies Inc. Radeon (TM) HD 8750M ATI Technologies Inc. Radeon 7000 DDR x86/SSE2 -ATI Technologies Inc. Radeon 7000 SDR x86/SSE2 -ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 +ATI Technologies Inc. Radeon 7500 DDR x86 ATI Technologies Inc. Radeon 7500 DDR x86/SSE2 -ATI Technologies Inc. Radeon 9000 DDR x86/SSE2 -ATI Technologies Inc. Radeon DDR x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. Radeon DDR x86/SSE -ATI Technologies Inc. Radeon DDR x86/SSE2 -ATI Technologies Inc. Radeon HD 6310 -ATI Technologies Inc. Radeon HD 6310 +ATI Technologies Inc. Radeon 9100 DDR x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon 9200 DDR x86/SSE2 +ATI Technologies Inc. Radeon HD 2600 PRO (Omega 3.8.442) +ATI Technologies Inc. Radeon HD 6470M ATI Technologies Inc. Radeon HD 6470M ATI Technologies Inc. Radeon HD 6490M ATI Technologies Inc. Radeon HD 6800 Series ATI Technologies Inc. Radeon HD 6800 Series -ATI Technologies Inc. Radeon SDR x86/SSE2 -ATI Technologies Inc. Radeon SDR x86/SSE2 +ATI Technologies Inc. Radeon Radeon X300/X550/X1050 Series x86/SSE2 +ATI Technologies Inc. Radeon X1050 +ATI Technologies Inc. Radeon X1050 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X1200 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X1300 / X1550 Series +ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1300 / X1550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1300 / X1600 Series ATI Technologies Inc. Radeon X1300 Series ATI Technologies Inc. Radeon X1300 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. Radeon X1300 Series x86/SSE2 +ATI Technologies Inc. Radeon X1300 Series x86/SSE2 ATI Technologies Inc. Radeon X1300/X1550 Series -ATI Technologies Inc. Radeon X1300/X1550 Series +ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1300/X1550 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X1300/X1550 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. Radeon X1300/X1550 Series x86/SSE2 -ATI Technologies Inc. Radeon X1550 64-bit (Microsoft - WDDM) +ATI Technologies Inc. Radeon X1550 64-bit (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1550 64-bit x86/SSE2 +ATI Technologies Inc. Radeon X1550 Series ATI Technologies Inc. Radeon X1550 Series +ATI Technologies Inc. Radeon X1550 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1550 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. Radeon X1550 Series x86/SSE2 ATI Technologies Inc. Radeon X1600 -ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1600 Pro / X1300XT +ATI Technologies Inc. Radeon X1600 Pro / X1300XT x86/SSE2 ATI Technologies Inc. Radeon X1600 Series +ATI Technologies Inc. Radeon X1600 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1600 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X1600 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. Radeon X1600 Series x86/SSE2 +ATI Technologies Inc. Radeon X1600 x86/SSE2 ATI Technologies Inc. Radeon X1600/1650 Series ATI Technologies Inc. Radeon X1600/X1650 Series +ATI Technologies Inc. Radeon X1600/X1650 Series x86/SSE2 +ATI Technologies Inc. Radeon X1650 GTO +ATI Technologies Inc. Radeon X1650 SE +ATI Technologies Inc. Radeon X1650 SE x86/SSE2 ATI Technologies Inc. Radeon X1650 Series +ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) ATI Technologies Inc. Radeon X1650 Series +ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1650 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1650 Series (Omega 3.8.442) ATI Technologies Inc. Radeon X1650 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. Radeon X1650 Series x86/SSE2 ATI Technologies Inc. Radeon X1650 Series x86/SSE2 +ATI Technologies Inc. Radeon X1650/X1700 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X1700 FSC +ATI Technologies Inc. Radeon X1800 CrossFire Edition +ATI Technologies Inc. Radeon X1800 Series +ATI Technologies Inc. Radeon X1800 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1900 CrossFire Edition +ATI Technologies Inc. Radeon X1900 GT +ATI Technologies Inc. Radeon X1900 GT x86/SSE2 +ATI Technologies Inc. Radeon X1900 Series +ATI Technologies Inc. Radeon X1900 Series (Microsoft Corporation - WDDM) ATI Technologies Inc. Radeon X1900 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1900 Series x86/SSE2 +ATI Technologies Inc. Radeon X1950 CrossFire Edition ATI Technologies Inc. Radeon X1950 Pro +ATI Technologies Inc. Radeon X1950 Pro (Omega 3.8.442) ATI Technologies Inc. Radeon X1950 Pro x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1950 Pro x86/SSE2 +ATI Technologies Inc. Radeon X1950 Series ATI Technologies Inc. Radeon X1950 Series -ATI Technologies Inc. Radeon X1950 Series (Microsoft - WDDM) +ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1950 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X1950 Series x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. Radeon X1950 Series x86/SSE2 ATI Technologies Inc. Radeon X300/X550/X1050 Series +ATI Technologies Inc. Radeon X300/X550/X1050 Series +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) +ATI Technologies Inc. Radeon X300/X550/X1050 Series (Omega 3.8.442) +ATI Technologies Inc. Radeon X300/X550/X1050 Series x86/SSE2 ATI Technologies Inc. Radeon X550/X700 Series -ATI Technologies Inc. Radeon X550XTX x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. SAPPHIRE RADEON X300SE +ATI Technologies Inc. Radeon X550XTX +ATI Technologies Inc. Radeon Xpress 200 Series (Omega 3.8.442) x86/SSE2 +ATI Technologies Inc. Radeon Xpress 200M Series (Omega 3.8.442) +ATI Technologies Inc. SAPPHIRE RADEON 9600 ATLANTIS ATI Technologies Inc. SAPPHIRE RADEON X300SE -ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/MMX/3DNow!/SSE2 -ATI Technologies Inc. SAPPHIRE RADEON X300SE x86/SSE2 +ATI Technologies Inc. SAPPHIRE Radeon X1550 ATI Technologies Inc. SAPPHIRE Radeon X1550 Series -ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/MMX/3DNow!/SSE2 ATI Technologies Inc. SAPPHIRE Radeon X1550 Series x86/SSE2 -ATI Technologies Inc. SAPPHIRE Radeon X1550 x86/SSE2 -ATI Technologies Inc. Sapphire Radeon HD 3730 -ATI Technologies Inc. Sapphire Radeon HD 3730 -ATI Technologies Inc. Sapphire Radeon HD 3750 -ATI Technologies Inc. Standard VGA Graphics Adapter -ATI Technologies Inc. Standard VGA Graphics Adapter -ATI Technologies Inc. Tul, RADEON X600 PRO -ATI Technologies Inc. Tul, RADEON X600 PRO x86/SSE2 -ATI Technologies Inc. Tul, RADEON X700 PRO -ATI Technologies Inc. Tul, RADEON X700 PRO x86/MMX/3DNow!/SSE2 +ATI Technologies Inc. SUMO 9640 +ATI Technologies Inc. SUMO 964A +ATI Technologies Inc. Sapphire RADEON X1600 PRO +ATI Technologies Inc. Sapphire RADEON X1600 PRO x86/SSE2 +ATI Technologies Inc. Sapphire RADEON X1600 XT +ATI Technologies Inc. Tul Corporation, RADEON X1300 Series +ATI Technologies Inc. Tul Corporation, RADEON X300SE ATI Technologies Inc. VisionTek Radeon 4350 ATI Technologies Inc. VisionTek Radeon 4350 +ATI Technologies Inc. VisionTek Radeon HD 2400 PCI +ATI Technologies Inc. VisionTek Radeon HD 2600 XT AGP +ATI Technologies Inc. VisionTek Radeon HD 5450 +ATI Technologies Inc. VisionTek Radeon HD2400 Pro AGP +ATI Technologies Inc. VisionTek Radeon HD2400 Pro PCI +ATI Technologies Inc. VisionTek Radeon X1300 +ATI Technologies Inc. VisionTek Radeon X1300 Series +ATI Technologies Inc. VisionTek Radeon X1300 XGE ATI Technologies Inc. VisionTek Radeon X1550 Series ATI Technologies Inc. WRESTLER 9802 -ATI Technologies Inc. WRESTLER 9803 ATI Technologies Inc. XFX Radeon HD 4570 -ATI Technologies Inc. Yamaha ATI HD 9000da/s -ATI Technologies Inc. Yamaha ATI HD 9000da/s 2048 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS780 9612) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9710) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 TCL -Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C1) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV610 94C9) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C4) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV620 95C5) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV635 9596) 20090101 x86/MMX+/3DNow!+/SSE TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV670 9505) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV710 9552) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9490) 20090101 x86/MMX/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV730 9498) 20090101 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9440) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -Advanced Micro Devices, Inc. Mesa DRI R600 (RV770 9442) 20090101 x86/MMX/SSE2 TCL DRI2 +Advanced Micro Devices, Inc. Mesa DRI R600 (RS880 9712) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 Alex Mohr GL Hijacker! -Apple Software Renderer -DRI R300 Project Mesa DRI R300 (RS400 5954) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 -DRI R300 Project Mesa DRI R300 (RS400 5975) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 -DRI R300 Project Mesa DRI R300 (RS400 5A62) 20090101 x86/MMX/SSE2 NO-TCL DRI2 -DRI R300 Project Mesa DRI R300 (RS600 7941) 20090101 x86/MMX/SSE2 NO-TCL -DRI R300 Project Mesa DRI R300 (RS690 791F) 20090101 x86/MMX+/3DNow!+/SSE2 NO-TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV350 4151) 20090101 AGP 4x x86/MMX+/3DNow!+/SSE TCL -DRI R300 Project Mesa DRI R300 (RV350 4153) 20090101 AGP 8x x86/MMX+/3DNow!+/SSE TCL -DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV380 3150) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV380 5B60) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV380 5B62) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV515 7145) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV515 7146) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV515 7149) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL -DRI R300 Project Mesa DRI R300 (RV515 714A) 20090101 x86/MMX/SSE2 TCL DRI2 -DRI R300 Project Mesa DRI R300 (RV530 71C4) 20090101 x86/MMX/SSE2 TCL DRI2 -GPU_CLASS_UNKNOWN -Humper 3D-Analyze v2.3 - http://www.tommti-systems.com +Brian Paul Mesa X11 +Gallium +Humper Humper Chromium Humper Chromium +Imagination Technologies 3D-Analyze v2.3 - http://www.tommti-systems.com +Imagination Technologies PowerVR SGX545 Imagination Technologies PowerVR SGX545 Intel -Intel HD Graphics Family -Intel HD Graphics Family -Intel 3D-Analyze v2.2 - http://www.tommti-systems.com -Intel 3D-Analyze v2.3 - http://www.tommti-systems.com Intel 3D-Analyze v2.3 - http://www.tommti-systems.com -Intel 4 Series Internal Chipset -Intel 4 Series Internal Chipset -Intel 830M +Intel 4 Series Internal Intel 845G Intel 855GM Intel 865G @@ -1018,61 +1794,46 @@ Intel 945G Intel 945GM Intel 950 Intel 965 -Intel B43 Express Chipset -Intel B43 Express Chipset +Intel 965 +Intel 965 Intel Bear Lake Intel Broadwater Intel Brookdale Intel Cantiga -Intel EMGD on PowerVR SGX535 +Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series +Intel Corporation Intel(R) Graphics Media Accelerator 3600 Series Intel Eaglelake -Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) -Intel Familia Mobile 45 Express Chipset (Microsoft Corporation - WDDM 1.1) Intel G33 Intel G41 -Intel G41 Express Chipset -Intel G41 Express Chipset Intel G45 -Intel G45/G43 Express Chipset -Intel G45/G43 Express Chipset -Intel Graphics Media Accelerator HD -Intel Graphics Media Accelerator HD +Intel Graphics Media HD +Intel Graphics Media HD +Intel HD Graphics Intel HD Graphics Intel HD Graphics -Intel HD Graphics 100 -Intel HD Graphics 200 -Intel HD Graphics 200 BR-1101-00SH -Intel HD Graphics 200 BR-1101-00SJ -Intel HD Graphics 200 BR-1101-00SK -Intel HD Graphics 200 BR-1101-01M5 -Intel HD Graphics 200 BR-1101-01M6 -Intel HD Graphics BR-1004-01Y1 -Intel HD Graphics BR-1004-01Y1 -Intel HD Graphics BR-1006-0364 -Intel HD Graphics BR-1006-0365 -Intel HD Graphics BR-1006-0366 -Intel HD Graphics BR-1007-02G4 -Intel HD Graphics BR-1101-04SY -Intel HD Graphics BR-1101-04SZ -Intel HD Graphics BR-1101-04T0 -Intel HD Graphics BR-1101-04T9 -Intel HD Graphics Family -Intel HD Graphics Family -Intel HD Graphics Family BR-1012-00Y8 -Intel HD Graphics Family BR-1012-00YF -Intel HD Graphics Family BR-1012-00ZD -Intel HD Graphics Family BR-1102-00ML -Intel Inc. Intel GMA 900 OpenGL Engine -Intel Inc. Intel GMA 900 OpenGL Engine +Intel HD Graphics +Intel HD Graphics 2000 +Intel HD Graphics 2000 +Intel HD Graphics 3000 +Intel HD Graphics 3000 +Intel HD Graphics 4000 +Intel HD Graphics 4000 Intel Inc. Intel GMA 950 OpenGL Engine Intel Inc. Intel GMA 950 OpenGL Engine Intel Inc. Intel GMA X3100 OpenGL Engine Intel Inc. Intel GMA X3100 OpenGL Engine +Intel Inc. Intel GMA X3100 OpenGL Engine Intel Inc. Intel HD Graphics 3000 OpenGL Engine Intel Inc. Intel HD Graphics 3000 OpenGL Engine +Intel Inc. Intel HD Graphics 3000 OpenGL Engine +Intel Inc. Intel HD Graphics 4000 OpenGL Engine +Intel Inc. Intel HD Graphics 4000 OpenGL Engine +Intel Inc. Intel HD Graphics 4000 OpenGL Engine +Intel Inc. Intel HD Graphics 4000 OpenGL Engine +Intel Inc. Intel HD Graphics 5000 OpenGL Engine +Intel Inc. Intel HD Graphics 5000 OpenGL Engine +Intel Inc. Intel HD Graphics 5000 OpenGL Engine Intel Inc. Intel HD Graphics OpenGL Engine -Intel Inc. Intel HD Graphics OpenGL Engine -Intel Inc. Intel HD xxxx OpenGL Engine Intel Intel 845G Intel Intel 845G Intel Intel 855GM @@ -1093,144 +1854,1931 @@ Intel Intel Bear Lake B Intel Intel Bear Lake B Intel Intel Broadwater G Intel Intel Brookdale-G -Intel Intel Brookdale-G -Intel Intel Calistoga Intel Intel Cantiga Intel Intel Cantiga Intel Intel Eaglelake Intel Intel Eaglelake -Intel Intel Generic Renderer Intel Intel Grantsdale-G Intel Intel Grantsdale-G -Intel Intel HD Graphics 3000 -Intel Intel Lakeport +Intel Intel Iris Pro Graphics 5200 Intel Intel Montara-GM Intel Intel Pineview Platform Intel Intel Pineview Platform Intel Intel Springdale-G -Intel Mobile - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) +Intel Intel(R) HD Graphics Family +Intel Intel(R) 4 Series Internal Chipset +Intel Intel(R) 4 Series Internal Chipset +Intel Intel(R) B43 Express Chipset +Intel Intel(R) B43 Express Chipset +Intel Intel(R) G41 Express Chipset +Intel Intel(R) G41 Express Chipset +Intel Intel(R) G41 Express Chipset +Intel Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) +Intel Intel(R) G41 Express Chipset v2 +Intel Intel(R) G45/G43 Express Chipset +Intel Intel(R) G45/G43 Express Chipset +Intel Intel(R) G45/G43 Express Chipset +Intel Intel(R) G45/G43/G41 Express Chipset +Intel Intel(R) Graphics Media Accelerator HD +Intel Intel(R) Graphics Media Accelerator HD +Intel Intel(R) Graphics Media Accelerator HD +Intel Intel(R) HD Graphics +Intel Intel(R) HD Graphics +Intel Intel(R) HD Graphics +Intel Intel(R) HD Graphics 100 +Intel Intel(R) HD Graphics 2000 +Intel Intel(R) HD Graphics 2000 +Intel Intel(R) HD Graphics 2500 +Intel Intel(R) HD Graphics 2500 +Intel Intel(R) HD Graphics 3000 +Intel Intel(R) HD Graphics 3000 +Intel Intel(R) HD Graphics 3000 +Intel Intel(R) HD Graphics 4000 +Intel Intel(R) HD Graphics 4000 +Intel Intel(R) HD Graphics 4000 +Intel Intel(R) HD Graphics 4000 +Intel Intel(R) HD Graphics 4400 +Intel Intel(R) HD Graphics 4600 +Intel Intel(R) HD Graphics 4600 +Intel Intel(R) HD Graphics 5000 +Intel Intel(R) HD Graphics BR-1004-01Y1 +Intel Intel(R) HD Graphics Family +Intel Intel(R) HD Graphics Family +Intel Intel(R) HD Graphics P3000 +Intel Intel(R) HD Graphics P4000 +Intel Intel(R) Q45/Q43 Express Chipset +Intel Intel(R) Q45/Q43 Express Chipset +Intel Iris OpenGL Graphics Engine Intel Mobile 4 Series -Intel Mobile 4 Series Express Chipset Family -Intel Mobile 4 Series Express Chipset Family -Intel Mobile 45 Express Chipset Family -Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) -Intel Mobile 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) -Intel Mobile HD Graphics -Intel Mobile HD Graphics Intel Mobile Intel(R) 4 Series Express Chipset Family -Intel Mobile SandyBridge HD Graphics +Intel Mobile Intel(R) 4 Series Express Chipset Family +Intel Mobile Intel(R) 4 Series Express Chipset Family v2 +Intel Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) +Intel Mobile Intel(R) HD Graphics +Intel Mobile Intel(R) HD Graphics Intel Montara +Intel Open Source Technology Center Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 915G +Intel Open Source Technology Center Mesa DRI Intel(R) 915G x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 915GM x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 945G +Intel Open Source Technology Center Mesa DRI Intel(R) 945G x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 945GM +Intel Open Source Technology Center Mesa DRI Intel(R) 945GM x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 945GME x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 965G x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 965GM +Intel Open Source Technology Center Mesa DRI Intel(R) 965GM x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) 965GME/GLE +Intel Open Source Technology Center Mesa DRI Intel(R) 965Q +Intel Open Source Technology Center Mesa DRI Intel(R) 965Q x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) G33 x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) G41 x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 +Intel Open Source Technology Center Mesa DRI Intel(R) G45/G43 x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) IGD +Intel Open Source Technology Center Mesa DRI Intel(R) IGD x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile +Intel Open Source Technology Center Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile +Intel Open Source Technology Center Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Q35 +Intel Open Source Technology Center Mesa DRI Intel(R) Q35 x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 +Intel Open Source Technology Center Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 +Intel Open Source Technology Center Mesa DRI Mobile Intelå¨ GM45 Express Chipset +Intel Open Source Technology Center Mesa DRI Mobile Intelå¨ GM45 Express Chipset x86/MMX/SSE2 Intel Pineview -Intel Q45/Q43 Express Chipset -Intel Q45/Q43 Express Chipset -Intel Royal BNA Driver +Intel Q45/Q43 Intel Royal BNA Driver -Intel SandyBridge HD Graphics -Intel SandyBridge HD Graphics BR-1006-00V8 Intel Springdale Intel X3100 -Intergraph wcgdrv 06.05.06.18 -Intergraph wcgdrv 06.06.00.35 -Intergraph wcgdrv 06.06.00.35 -LegendgrafiX Mobile 945 Express C/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk -LegendgrafiX NVIDIA GeForce GT 430/TitaniumGL/GAC/D3D ACCELERATION/6x86/1 THREADs | http://LegendgrafiX.tk -Linden Lab Headless -Matrox +Intel X3100 +Matrox Graphics Inc. Matrox ICD for M-Series +Matrox Graphics Inc. Matrox G400 +Matrox Graphics Inc. Matrox ICD for Parhelia +Mesa Mesa Mesa Project Software Rasterizer -Mesa Project Software Rasterizer -NVIDIA /PCI/SSE2 -NVIDIA /PCI/SSE2 -NVIDIA /PCI/SSE2/3DNOW! -NVIDIA /PCI/SSE2/3DNOW! +Mesa project: www.mesa3d.org Mesa GLX Indirect NVIDIA 205 NVIDIA 210 +NVIDIA 210 +NVIDIA 310 NVIDIA 310 +NVIDIA 310 +NVIDIA 310M NVIDIA 310M NVIDIA 315 NVIDIA 315M +NVIDIA 315M +NVIDIA 320M NVIDIA 320M -NVIDIA C51 +NVIDIA 405 +NVIDIA 410 +NVIDIA 510 +NVIDIA 610M +NVIDIA Corporation /PCI/SSE2 +NVIDIA Corporation 3D-Analyze v2.3 - http://www.tommti-systems.com +NVIDIA Corporation C51/PCI/SSE2/3DNOW! +NVIDIA Corporation C51G/PCI/SSE2/3DNOW! +NVIDIA Corporation D10P1-25/PCI/SSE2/3DNOW! +NVIDIA Corporation D14P1-30/PCIe/SSE2 +NVIDIA Corporation D9M-20/PCI/SSE2 +NVIDIA Corporation D9M-20/PCI/SSE2/3DNOW! +NVIDIA Corporation G72/PCI/SSE2/3DNOW! +NVIDIA Corporation G73/AGP/SSE2/3DNOW! +NVIDIA Corporation G73/PCI/SSE2/3DNOW! +NVIDIA Corporation G84-50/PCI/SSE2 +NVIDIA Corporation G92-100/PCI/SSE2/3DNOW! +NVIDIA Corporation GK106/PCIe/SSE2 +NVIDIA Corporation GRID K2/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 555/PCI/SSE2 +NVIDIA Corporation GeForce GTX 555/PCI/SSE2 +NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 555/PCIe/SSE2 +NVIDIA Corporation GeForce 205/PCI/SSE2 +NVIDIA Corporation GeForce 210/PCI/SSE2 +NVIDIA Corporation GeForce 210/PCI/SSE2 +NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 210/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 210/PCIe/SSE2 +NVIDIA Corporation GeForce 210/PCIe/SSE2 +NVIDIA Corporation GeForce 210/PCIe/SSE2 +NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 210/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 310/PCI/SSE2 +NVIDIA Corporation GeForce 310/PCI/SSE2 +NVIDIA Corporation GeForce 310/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 310/PCIe/SSE2 +NVIDIA Corporation GeForce 310/PCIe/SSE2 +NVIDIA Corporation GeForce 310/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 310M/PCI/SSE2 +NVIDIA Corporation GeForce 310M/PCI/SSE2 +NVIDIA Corporation GeForce 310M/PCIe/SSE2 +NVIDIA Corporation GeForce 310M/PCIe/SSE2 +NVIDIA Corporation GeForce 310M/PCIe/SSE2 +NVIDIA Corporation GeForce 315/PCI/SSE2 +NVIDIA Corporation GeForce 315/PCI/SSE2 +NVIDIA Corporation GeForce 315/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 315/PCIe/SSE2 +NVIDIA Corporation GeForce 315/PCIe/SSE2 +NVIDIA Corporation GeForce 315/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 315M/PCI/SSE2 +NVIDIA Corporation GeForce 315M/PCI/SSE2 +NVIDIA Corporation GeForce 315M/PCI/SSE2 +NVIDIA Corporation GeForce 315M/PCIe/SSE2 +NVIDIA Corporation GeForce 315M/PCIe/SSE2 +NVIDIA Corporation GeForce 320M/PCI/SSE2 +NVIDIA Corporation GeForce 320M/PCI/SSE2 +NVIDIA Corporation GeForce 320M/integrated/SSE2 +NVIDIA Corporation GeForce 405/PCI/SSE2 +NVIDIA Corporation GeForce 405/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 405/PCIe/SSE2 +NVIDIA Corporation GeForce 405/PCIe/SSE2 +NVIDIA Corporation GeForce 405/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 410M/PCI/SSE2 +NVIDIA Corporation GeForce 410M/PCI/SSE2 +NVIDIA Corporation GeForce 410M/PCIe/SSE2 +NVIDIA Corporation GeForce 410M/PCIe/SSE2 +NVIDIA Corporation GeForce 505/PCIe/SSE2 +NVIDIA Corporation GeForce 510/PCI/SSE2 +NVIDIA Corporation GeForce 510/PCI/SSE2 +NVIDIA Corporation GeForce 510/PCIe/SSE2 +NVIDIA Corporation GeForce 510/PCIe/SSE2 +NVIDIA Corporation GeForce 510/PCIe/SSE2 +NVIDIA Corporation GeForce 605/PCI/SSE2 +NVIDIA Corporation GeForce 605/PCIe/SSE2 +NVIDIA Corporation GeForce 605/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 610/PCIe/SSE2 +NVIDIA Corporation GeForce 6100 nForce 400/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2 +NVIDIA Corporation GeForce 6100 nForce 400/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2 +NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 405/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2 +NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 405/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 420/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100 nForce 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100/PCI/SSE2 +NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6100/integrated/SSE2 +NVIDIA Corporation GeForce 6100/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 610M/PCI/SSE2 +NVIDIA Corporation GeForce 610M/PCIe/SSE2 +NVIDIA Corporation GeForce 610M/PCIe/SSE2 +NVIDIA Corporation GeForce 610M/PCIe/SSE2 +NVIDIA Corporation GeForce 615/PCIe/SSE2 +NVIDIA Corporation GeForce 6150 LE/PCI/SSE2 +NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150 LE/integrated/SSE2 +NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150 LE/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150 SE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150/integrated/SSE2 +NVIDIA Corporation GeForce 6150/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2 +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2 +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE nForce 430/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 6150SE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2 +NVIDIA Corporation GeForce 6200 A-LE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2 +NVIDIA Corporation GeForce 6200 A-LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 LE/PCI/SSE2 +NVIDIA Corporation GeForce 6200 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 6200 LE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2 +NVIDIA Corporation GeForce 6200 TurboCache(TM)/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200/AGP/SSE2 +NVIDIA Corporation GeForce 6200/AGP/SSE2 +NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200/PCI/SSE2 +NVIDIA Corporation GeForce 6200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200/PCIe/SSE2 +NVIDIA Corporation GeForce 6200/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2 +NVIDIA Corporation GeForce 6200SE TurboCache(TM)/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6500/PCI/SSE2 +NVIDIA Corporation GeForce 6500/PCI/SSE2 +NVIDIA Corporation GeForce 6500/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6500/PCIe/SSE2 +NVIDIA Corporation GeForce 6500/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 GT/AGP/SSE2 +NVIDIA Corporation GeForce 6600 GT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 GT/PCI/SSE2 +NVIDIA Corporation GeForce 6600 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 LE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 LE/PCI/SSE2 +NVIDIA Corporation GeForce 6600 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 6600 LE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600/AGP/SSE2 +NVIDIA Corporation GeForce 6600/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600/PCI/SSE2 +NVIDIA Corporation GeForce 6600/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6600/PCIe/SSE2 +NVIDIA Corporation GeForce 6600/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6610 XL/PCI/SSE2 +NVIDIA Corporation GeForce 6610 XL/PCIe/SSE2 +NVIDIA Corporation GeForce 6700 XL/PCI/SSE2 +NVIDIA Corporation GeForce 6700 XL/PCIe/SSE2 +NVIDIA Corporation GeForce 6800 GS/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 GS/PCI/SSE2 +NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 6800 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 GT/AGP/SSE2 +NVIDIA Corporation GeForce 6800 GT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 6800 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 LE/AGP/SSE2 +NVIDIA Corporation GeForce 6800 LE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2 +NVIDIA Corporation GeForce 6800 Ultra/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 Ultra/PCI/SSE2 +NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2 +NVIDIA Corporation GeForce 6800 Ultra/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 XT/AGP/SSE2 +NVIDIA Corporation GeForce 6800 XT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 XT/PCI/SSE2 +NVIDIA Corporation GeForce 6800 XT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2 +NVIDIA Corporation GeForce 6800 XT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800/AGP/SSE2 +NVIDIA Corporation GeForce 6800/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 6800/PCI/SSE2 +NVIDIA Corporation GeForce 6800/PCIe/SSE2 +NVIDIA Corporation GeForce 6800/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2 +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2 +NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2 +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2 +NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 7025 / nForce 630a/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / NVIDIA nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 610i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 610i/integrated/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 620i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 620i/integrated/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7050 / nForce 630i/integrated/SSE2 +NVIDIA Corporation GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2 +NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 7050 PV / nForce 630a/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 +NVIDIA Corporation GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7100 / nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 +NVIDIA Corporation GeForce 7100 / nForce 630i/integrated/SSE2 +NVIDIA Corporation GeForce 7100 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7100 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7100 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 710A/PCIe/SSE2 +NVIDIA Corporation GeForce 710M/PCIe/SSE2 +NVIDIA Corporation GeForce 710M/PCIe/SSE2 +NVIDIA Corporation GeForce 710M/PCIe/SSE2 +NVIDIA Corporation GeForce 7150 / nForce 630i/PCI/SSE2 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2 +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7150M / nForce 630M/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7300 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 GT/AGP/SSE2 +NVIDIA Corporation GeForce 7300 GT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 GT/PCI/SSE2 +NVIDIA Corporation GeForce 7300 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 LE/PCI/SSE2 +NVIDIA Corporation GeForce 7300 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 LE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 SE/7200 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 SE/PCI/SSE2 +NVIDIA Corporation GeForce 7300 SE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7300 SE/PCIe/SSE2 +NVIDIA Corporation GeForce 7350 LE/PCI/SSE2 +NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 7350 LE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7500 LE/PCI/SSE2 +NVIDIA Corporation GeForce 7500 LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 7500 LE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GS/AGP/SSE2 +NVIDIA Corporation GeForce 7600 GS/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7600 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GT/AGP/SSE2 +NVIDIA Corporation GeForce 7600 GT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GT/PCI/SSE2 +NVIDIA Corporation GeForce 7600 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7600 LE/PCIe/SSE2 +NVIDIA Corporation GeForce 7650 GS/AGP/SSE2 +NVIDIA Corporation GeForce 7650 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7650 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7650 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7800 GS/AGP/SSE2 +NVIDIA Corporation GeForce 7800 GS/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7800 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7800 GT/PCI/SSE2 +NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7800 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2 +NVIDIA Corporation GeForce 7800 GTX/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GS/AGP/SSE2 +NVIDIA Corporation GeForce 7900 GS/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GS/PCI/SSE2 +NVIDIA Corporation GeForce 7900 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 7900 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2 +NVIDIA Corporation GeForce 7900 GT/GTO/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GT/PCI/SSE2 +NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 7900 GTX/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2 +NVIDIA Corporation GeForce 7900 GTX/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7950 GT/AGP/SSE2 +NVIDIA Corporation GeForce 7950 GT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce 7950 GT/PCI/SSE2 +NVIDIA Corporation GeForce 7950 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 7950 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 7950 GX2/PCI/SSE2 +NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2 +NVIDIA Corporation GeForce 7950 GX2/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2 +NVIDIA Corporation GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2 +NVIDIA Corporation GeForce 8100 / nForce 720a/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200/PCI/SSE2 +NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200/integrated/SSE2 +NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200M G/PCI/SSE2 +NVIDIA Corporation GeForce 8200M G/PCI/SSE2 +NVIDIA Corporation GeForce 8200M G/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200M G/integrated/SSE2 +NVIDIA Corporation GeForce 8200M G/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 8200M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8300 GS/PCI/SSE2 +NVIDIA Corporation GeForce 8300 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8300 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8300/PCI/SSE2 +NVIDIA Corporation GeForce 8300/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8300/integrated/SSE2 +NVIDIA Corporation GeForce 8300/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2 +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400 SE/PCI/SSE2 +NVIDIA Corporation GeForce 8400 SE/PCIe/SSE2 +NVIDIA Corporation GeForce 8400/PCI/SSE2 +NVIDIA Corporation GeForce 8400/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400/PCIe/SSE2 +NVIDIA Corporation GeForce 8400/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400GS/PCI/SSE2 +NVIDIA Corporation GeForce 8400GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M G/PCI/SSE2 +NVIDIA Corporation GeForce 8400M G/PCI/SSE2 +NVIDIA Corporation GeForce 8400M G/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 +NVIDIA Corporation GeForce 8400M G/PCIe/SSE2 +NVIDIA Corporation GeForce 8400M G/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 +NVIDIA Corporation GeForce 8400M GS/PCI/SSE2 +NVIDIA Corporation GeForce 8400M GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8400M GT/PCI/SSE2 +NVIDIA Corporation GeForce 8400M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8500 GT/PCI/SSE2 +NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8500 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8500 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GS/PCI/SSE2 +NVIDIA Corporation GeForce 8600 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8600 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GT/PCI/SSE2 +NVIDIA Corporation GeForce 8600 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 +NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2 +NVIDIA Corporation GeForce 8600 GTS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 8600 GTS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600GS/PCI/SSE2 +NVIDIA Corporation GeForce 8600GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 +NVIDIA Corporation GeForce 8600M GS/PCI/SSE2 +NVIDIA Corporation GeForce 8600M GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8600M GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 +NVIDIA Corporation GeForce 8600M GT/PCI/SSE2 +NVIDIA Corporation GeForce 8600M GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8600M GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8700M GT/PCI/SSE2 +NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8700M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GS/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GT/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GTS 512/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GTS 512/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GTS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GTS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 8800 GTX/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 GTX/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800 Ultra/PCI/SSE2 +NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2 +NVIDIA Corporation GeForce 8800 Ultra/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 8800M GTS/PCI/SSE2 +NVIDIA Corporation GeForce 8800M GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 8800M GTX/PCI/SSE2 +NVIDIA Corporation GeForce 8800M GTX/PCIe/SSE2 +NVIDIA Corporation GeForce 9100/PCI/SSE2 +NVIDIA Corporation GeForce 9100/PCI/SSE2 +NVIDIA Corporation GeForce 9100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9100/integrated/SSE2 +NVIDIA Corporation GeForce 9100/integrated/SSE2 +NVIDIA Corporation GeForce 9100/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 9100M G/PCI/SSE2 +NVIDIA Corporation GeForce 9100M G/PCI/SSE2 +NVIDIA Corporation GeForce 9100M G/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9100M G/integrated/SSE2 +NVIDIA Corporation GeForce 9100M G/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 9200/PCI/SSE2 +NVIDIA Corporation GeForce 9200/PCI/SSE2 +NVIDIA Corporation GeForce 9200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9200/integrated/SSE2 +NVIDIA Corporation GeForce 9200/integrated/SSE2 +NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 9200/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 +NVIDIA Corporation GeForce 9200M GE/PCI/SSE2 +NVIDIA Corporation GeForce 9200M GE/PCIe/SSE2 +NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9200M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9200M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9300 / nForce 730i/integrated/SSE2 +NVIDIA Corporation GeForce 9300 GE/PCI/SSE2 +NVIDIA Corporation GeForce 9300 GE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 +NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2 +NVIDIA Corporation GeForce 9300 GE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300 GS/PCI/SSE2 +NVIDIA Corporation GeForce 9300 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9300 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300 SE/PCIe/SSE2 +NVIDIA Corporation GeForce 9300/PCI/SSE2 +NVIDIA Corporation GeForce 9300/integrated/SSE2 +NVIDIA Corporation GeForce 9300M G/PCI/SSE2 +NVIDIA Corporation GeForce 9300M G/PCI/SSE2 +NVIDIA Corporation GeForce 9300M G/PCI/SSE2 +NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 +NVIDIA Corporation GeForce 9300M G/PCIe/SSE2 +NVIDIA Corporation GeForce 9300M G/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9300M GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9300M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9400 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9400 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9400 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9400/PCI/SSE2 +NVIDIA Corporation GeForce 9400/integrated/SSE2 +NVIDIA Corporation GeForce 9400/integrated/SSE2 +NVIDIA Corporation GeForce 9400M G/PCI/SSE2 +NVIDIA Corporation GeForce 9400M G/PCI/SSE2 +NVIDIA Corporation GeForce 9400M G/integrated/SSE2 +NVIDIA Corporation GeForce 9400M/PCI/SSE2 +NVIDIA Corporation GeForce 9400M/integrated/SSE2 +NVIDIA Corporation GeForce 9500 GS/PCI/SSE2 +NVIDIA Corporation GeForce 9500 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9500 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9500M GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9500M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GS/PCI/SSE2 +NVIDIA Corporation GeForce 9600 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GS/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2 +NVIDIA Corporation GeForce 9600 GSO 512/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GSO 512/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2 +NVIDIA Corporation GeForce 9600 GSO/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GSO/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9600 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9600M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9600M GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9600M GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9650M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9650M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9650M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9700M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9700M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 +NVIDIA Corporation GeForce 9700M GTS/PCI/SSE2 +NVIDIA Corporation GeForce 9700M GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GT/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GT/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GTX+/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GTX+/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 GTX/9800 GTX+/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce 9800 GX2/PCIe/SSE2 +NVIDIA Corporation GeForce 9800 S/PCI/SSE2 +NVIDIA Corporation GeForce 9800M GS/PCI/SSE2 +NVIDIA Corporation GeForce 9800M GS/PCIe/SSE2 +NVIDIA Corporation GeForce 9800M GT/PCI/SSE2 +NVIDIA Corporation GeForce 9800M GT/PCIe/SSE2 +NVIDIA Corporation GeForce 9800M GTS/PCI/SSE2 +NVIDIA Corporation GeForce 9800M GTS/PCIe/SSE2 +NVIDIA Corporation GeForce 9800M GTX/PCI/SSE2 +NVIDIA Corporation GeForce 9800M GTX/PCIe/SSE2 +NVIDIA Corporation GeForce FX 5100/AGP/SSE2 +NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2 +NVIDIA Corporation GeForce FX 5200 Ultra/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5200/AGP/SSE/3DNOW! +NVIDIA Corporation GeForce FX 5200/AGP/SSE2 +NVIDIA Corporation GeForce FX 5200/AGP/SSE2 +NVIDIA Corporation GeForce FX 5200/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5200/PCI/SSE2 +NVIDIA Corporation GeForce FX 5200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2 +NVIDIA Corporation GeForce FX 5200LE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5200SE/AGP/SSE2 +NVIDIA Corporation GeForce FX 5500/AGP/SSE2 +NVIDIA Corporation GeForce FX 5500/AGP/SSE2 +NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5500/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5500/PCI/SSE2 +NVIDIA Corporation GeForce FX 5500/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5600/AGP/SSE2 +NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2 +NVIDIA Corporation GeForce FX 5600XT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5600XT/PCI/SSE2 +NVIDIA Corporation GeForce FX 5700/AGP/SSE2 +NVIDIA Corporation GeForce FX 5700/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2 +NVIDIA Corporation GeForce FX 5700LE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5700LE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2 +NVIDIA Corporation GeForce FX 5700VE/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5900 Ultra/AGP/SSE2 +NVIDIA Corporation GeForce FX 5900/AGP/SSE2 +NVIDIA Corporation GeForce FX 5900XT/AGP/SSE2 +NVIDIA Corporation GeForce FX 5900ZT/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2 +NVIDIA Corporation GeForce FX 5950 Ultra/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX Go5200 32M/64M/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5200/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce FX Go5200/PCI/SSE2 +NVIDIA Corporation GeForce FX Go5300/AGP/SSE2 +NVIDIA Corporation GeForce FX Go53xx Series/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5600/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5650/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5700/AGP/SSE2 +NVIDIA Corporation GeForce FX Go5700/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce G 103M/PCI/SSE2 +NVIDIA Corporation GeForce G 103M/PCI/SSE2 +NVIDIA Corporation GeForce G 103M/PCIe/SSE2 +NVIDIA Corporation GeForce G 103M/PCIe/SSE2 +NVIDIA Corporation GeForce G 105M/PCI/SSE2 +NVIDIA Corporation GeForce G 105M/PCIe/SSE2 +NVIDIA Corporation GeForce G 105M/PCIe/SSE2 +NVIDIA Corporation GeForce G 110M/PCI/SSE2 +NVIDIA Corporation GeForce G100/PCI/SSE2 +NVIDIA Corporation GeForce G100/PCI/SSE2 +NVIDIA Corporation GeForce G100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce G100/PCIe/SSE2 +NVIDIA Corporation GeForce G100/PCIe/SSE2 +NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce G100/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce G102M/PCI/SSE2 +NVIDIA Corporation GeForce G102M/PCI/SSE2 +NVIDIA Corporation GeForce G102M/integrated/SSE2 +NVIDIA Corporation GeForce G102M/integrated/SSE2 +NVIDIA Corporation GeForce G105M/PCI/SSE2 +NVIDIA Corporation GeForce G105M/PCI/SSE2 +NVIDIA Corporation GeForce G105M/PCIe/SSE2 +NVIDIA Corporation GeForce G105M/PCIe/SSE2 +NVIDIA Corporation GeForce G200/PCI/SSE2 +NVIDIA Corporation GeForce G200/PCI/SSE2 +NVIDIA Corporation GeForce G200/integrated/SSE2 +NVIDIA Corporation GeForce G205M/PCI/SSE2 +NVIDIA Corporation GeForce G205M/integrated/SSE2 +NVIDIA Corporation GeForce G205M/integrated/SSE2 +NVIDIA Corporation GeForce G210/PCI/SSE2 +NVIDIA Corporation GeForce G210/PCI/SSE2 +NVIDIA Corporation GeForce G210/PCI/SSE2 +NVIDIA Corporation GeForce G210/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce G210/PCIe/SSE2 +NVIDIA Corporation GeForce G210/PCIe/SSE2 +NVIDIA Corporation GeForce G210/PCIe/SSE2 +NVIDIA Corporation GeForce G210/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce G210M/PCI/SSE2 +NVIDIA Corporation GeForce G210M/PCI/SSE2 +NVIDIA Corporation GeForce G210M/PCIe/SSE2 +NVIDIA Corporation GeForce G210M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 120/PCI/SSE2 +NVIDIA Corporation GeForce GT 120/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 120/PCIe/SSE2 +NVIDIA Corporation GeForce GT 120/PCIe/SSE2 +NVIDIA Corporation GeForce GT 120/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 120M/PCI/SSE2 +NVIDIA Corporation GeForce GT 120M/PCI/SSE2 +NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 120M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 130/PCI/SSE2 +NVIDIA Corporation GeForce GT 130/PCIe/SSE2 +NVIDIA Corporation GeForce GT 130/PCIe/SSE2 +NVIDIA Corporation GeForce GT 130/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 130M/PCI/SSE2 +NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 130M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 140/PCI/SSE2 +NVIDIA Corporation GeForce GT 140/PCIe/SSE2 +NVIDIA Corporation GeForce GT 220/PCI/SSE2 +NVIDIA Corporation GeForce GT 220/PCI/SSE2 +NVIDIA Corporation GeForce GT 220/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 220/PCIe/SSE2 +NVIDIA Corporation GeForce GT 220/PCIe/SSE2 +NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 220/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 220M/PCI/SSE2 +NVIDIA Corporation GeForce GT 220M/PCI/SSE2 +NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 220M/PCIe/SSE2 NVIDIA Corporation GeForce GT 230/PCI/SSE2 +NVIDIA Corporation GeForce GT 230/PCIe/SSE2 +NVIDIA Corporation GeForce GT 230/PCIe/SSE2 +NVIDIA Corporation GeForce GT 230/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 230M/PCI/SSE2 +NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 230M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240/PCI/SSE2 +NVIDIA Corporation GeForce GT 240/PCI/SSE2 +NVIDIA Corporation GeForce GT 240/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 240/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 240/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 240M LE/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240M/PCI/SSE2 +NVIDIA Corporation GeForce GT 240M/PCI/SSE2 +NVIDIA Corporation GeForce GT 240M/PCI/SSE2 +NVIDIA Corporation GeForce GT 240M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 240M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 320/PCI/SSE2 +NVIDIA Corporation GeForce GT 320/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 320/PCIe/SSE2 +NVIDIA Corporation GeForce GT 320/PCIe/SSE2 +NVIDIA Corporation GeForce GT 320/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 320M/PCI/SSE2 +NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 320M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 325M/PCI/SSE2 +NVIDIA Corporation GeForce GT 325M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 330/PCI/SSE2 +NVIDIA Corporation GeForce GT 330/PCIe/SSE2 +NVIDIA Corporation GeForce GT 330/PCIe/SSE2 +NVIDIA Corporation GeForce GT 330/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 330M/PCI/SSE2 +NVIDIA Corporation GeForce GT 330M/PCI/SSE2 +NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 330M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 335M/PCI/SSE2 +NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 335M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 340/PCI/SSE2 +NVIDIA Corporation GeForce GT 340/PCIe/SSE2 +NVIDIA Corporation GeForce GT 415/PCIe/SSE2 +NVIDIA Corporation GeForce GT 415/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 415M/PCI/SSE2 +NVIDIA Corporation GeForce GT 415M/PCI/SSE2 +NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 415M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 420/PCI/SSE2 +NVIDIA Corporation GeForce GT 420/PCI/SSE2 +NVIDIA Corporation GeForce GT 420/PCIe/SSE2 +NVIDIA Corporation GeForce GT 420/PCIe/SSE2 +NVIDIA Corporation GeForce GT 420/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 420M/PCI/SSE2 +NVIDIA Corporation GeForce GT 420M/PCI/SSE2 +NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 420M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 425M/PCI/SSE2 +NVIDIA Corporation GeForce GT 425M/PCI/SSE2 +NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 425M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 430/PCI/SSE2 +NVIDIA Corporation GeForce GT 430/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 430/PCIe/SSE2 +NVIDIA Corporation GeForce GT 430/PCIe/SSE2 +NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 430/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 435M/PCI/SSE2 +NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 435M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 440/PCI/SSE2 +NVIDIA Corporation GeForce GT 440/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 440/PCIe/SSE2 +NVIDIA Corporation GeForce GT 440/PCIe/SSE2 +NVIDIA Corporation GeForce GT 440/PCIe/SSE2 +NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 440/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 445M/PCI/SSE2 +NVIDIA Corporation GeForce GT 445M/PCI/SSE2 +NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 445M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520/PCI/SSE2 +NVIDIA Corporation GeForce GT 520/PCI/SSE2 +NVIDIA Corporation GeForce GT 520/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 520/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 520/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 520M/PCI/SSE2 +NVIDIA Corporation GeForce GT 520M/PCI/SSE2 +NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 +NVIDIA Corporation GeForce GT 520MX/PCI/SSE2 +NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 +NVIDIA Corporation GeForce GT 520MX/PCIe/SSE2 +NVIDIA Corporation GeForce GT 525M/PCI/SSE2 +NVIDIA Corporation GeForce GT 525M/PCI/SSE2 +NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 525M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 530/PCI/SSE2 +NVIDIA Corporation GeForce GT 530/PCI/SSE2 +NVIDIA Corporation GeForce GT 530/PCIe/SSE2 +NVIDIA Corporation GeForce GT 530/PCIe/SSE2 +NVIDIA Corporation GeForce GT 530/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 540M/PCI/SSE2 +NVIDIA Corporation GeForce GT 540M/PCI/SSE2 +NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 540M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 545/PCI/SSE2 +NVIDIA Corporation GeForce GT 545/PCIe/SSE2 +NVIDIA Corporation GeForce GT 545/PCIe/SSE2 +NVIDIA Corporation GeForce GT 545/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 550M/PCI/SSE2 +NVIDIA Corporation GeForce GT 550M/PCI/SSE2 +NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 550M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 555M/PCI/SSE2 +NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 555M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 610/PCIe/SSE2 +NVIDIA Corporation GeForce GT 610/PCIe/SSE2 +NVIDIA Corporation GeForce GT 610/PCIe/SSE2 +NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 610/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 620/PCI/SSE2 +NVIDIA Corporation GeForce GT 620/PCIe/SSE2 +NVIDIA Corporation GeForce GT 620/PCIe/SSE2 +NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 620/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 620M/PCI/SSE2 +NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 620M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 625/PCIe/SSE2 +NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 625M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 630/PCIe/SSE2 +NVIDIA Corporation GeForce GT 630/PCIe/SSE2 +NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 630/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 630M/PCI/SSE2 +NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 630M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 635M/PCI/SSE2 +NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 635M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 640/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GT 640M LE/PCI/SSE2 +NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 640M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 645/PCIe/SSE2 +NVIDIA Corporation GeForce GT 645/PCIe/SSE2 +NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 645M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 650M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 720M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 730M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 735M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 740M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 +NVIDIA Corporation GeForce GT 750M/PCIe/SSE2 +NVIDIA Corporation GeForce GT620M/PCIe/SSE2 +NVIDIA Corporation GeForce GT625M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 150/PCI/SSE2 +NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 160M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 160M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 240/PCI/SSE2 +NVIDIA Corporation GeForce GTS 240/PCI/SSE2 +NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 240/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 240/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 250/PCI/SSE2 +NVIDIA Corporation GeForce GTS 250/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 250/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 250M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 250M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 350M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 350M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCI/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 360M/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 450/PCI/SSE2 +NVIDIA Corporation GeForce GTS 450/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2 +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTS 450/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 260/PCI/SSE2 +NVIDIA Corporation GeForce GTX 260/PCI/SSE2 +NVIDIA Corporation GeForce GTX 260/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 260/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 260M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 260M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 275/PCI/SSE2 +NVIDIA Corporation GeForce GTX 275/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 275/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 280/PCI/SSE2 +NVIDIA Corporation GeForce GTX 280/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 280/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 280M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 280M/PCIe/SSE2 NVIDIA Corporation GeForce GTX 285/PCI/SSE2 -NVIDIA D10M2-20/PCI/SSE2 -NVIDIA D10M2-20/PCI/SSE2 -NVIDIA D10P1-25/PCI/SSE2 -NVIDIA D10P1-25/PCI/SSE2 -NVIDIA D10P1-25/PCI/SSE2/3DNOW! -NVIDIA D10P1-30/PCI/SSE2 -NVIDIA D10P2-50/PCI/SSE2 -NVIDIA D11M2-30/PCI/SSE2 -NVIDIA D12-P1-35/PCI/SSE2 -NVIDIA D12U-15/PCI/SSE2 -NVIDIA D13M1-40/PCI/SSE2 -NVIDIA D13P1-40/PCI/SSE2 -NVIDIA D13P1-40/PCI/SSE2 -NVIDIA D13P1-40/PCI/SSE2/3DNOW! -NVIDIA D13U-10/PCI/SSE2 -NVIDIA D13U/PCI/SSE2 -NVIDIA D13U/PCI/SSE2 +NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 285/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 285/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 285M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 285M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 295/PCI/SSE2 +NVIDIA Corporation GeForce GTX 295/PCI/SSE2 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 295/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460 SE/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460 SE/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460 v2/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460 v2/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 460M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 465/PCI/SSE2 +NVIDIA Corporation GeForce GTX 465/PCI/SSE2 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 465/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 470/PCI/SSE2 +NVIDIA Corporation GeForce GTX 470/PCI/SSE2 +NVIDIA Corporation GeForce GTX 470/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 470/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 470M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 480/PCI/SSE2 +NVIDIA Corporation GeForce GTX 480/PCI/SSE2 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 480/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 480M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 485M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 485M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 550 Ti/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 550 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 SE/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560 Ti/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 560M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570/PCI/SSE2 +NVIDIA Corporation GeForce GTX 570/PCI/SSE2 +NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 570/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 570/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 570M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 570M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580/PCI/SSE2 +NVIDIA Corporation GeForce GTX 580/PCI/SSE2 +NVIDIA Corporation GeForce GTX 580/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 580/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 580M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 580M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 590/PCI/SSE2 +NVIDIA Corporation GeForce GTX 590/PCI/SSE2 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 590/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 645/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti BOOST/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti Boost/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 650 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 650/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660 Ti/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 660M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 670/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 670M/PCI/SSE2 +NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 670MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 675MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 680/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 680MX/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 690/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 760/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 760M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 765M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 770/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 770M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 780/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX 780M/PCIe/SSE2 +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2 +NVIDIA Corporation GeForce GTX TITAN/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 +NVIDIA Corporation GeForce GTX Titan/PCIe/SSE2 +NVIDIA Corporation GeForce Go 6100/PCI/SSE2 +NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6100/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6150/PCI/SSE2 +NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6150/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6150/integrated/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6200/PCI/SSE2 +NVIDIA Corporation GeForce Go 6200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 6400/PCI/SSE2 +NVIDIA Corporation GeForce Go 6400/PCIe/SSE2 +NVIDIA Corporation GeForce Go 6600 TE/6200 TE/PCI/SSE2 +NVIDIA Corporation GeForce Go 6600/PCI/SSE2 +NVIDIA Corporation GeForce Go 6800 Ultra/PCI/SSE2 +NVIDIA Corporation GeForce Go 6800/PCI/SSE2 +NVIDIA Corporation GeForce Go 6800/PCIe/SSE2 +NVIDIA Corporation GeForce Go 7200/PCI/SSE2 +NVIDIA Corporation GeForce Go 7200/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7300/PCI/SSE2 +NVIDIA Corporation GeForce Go 7300/PCI/SSE2 +NVIDIA Corporation GeForce Go 7300/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7300/PCIe/SSE2 +NVIDIA Corporation GeForce Go 7400/PCI/SSE2 +NVIDIA Corporation GeForce Go 7400/PCI/SSE2 +NVIDIA Corporation GeForce Go 7400/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7400/PCIe/SSE2 +NVIDIA Corporation GeForce Go 7600 GT/PCI/SSE2 +NVIDIA Corporation GeForce Go 7600/PCI/SSE2 +NVIDIA Corporation GeForce Go 7600/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7600/PCIe/SSE2 +NVIDIA Corporation GeForce Go 7600/PCIe/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7700/PCI/SSE2 +NVIDIA Corporation GeForce Go 7800 GTX/PCI/SSE2 +NVIDIA Corporation GeForce Go 7800/PCI/SSE2 +NVIDIA Corporation GeForce Go 7800/PCI/SSE2 +NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2 +NVIDIA Corporation GeForce Go 7900 GS/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce Go 7900 GS/PCIe/SSE2 +NVIDIA Corporation GeForce Go 7900 GTX/PCI/SSE2 +NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2 +NVIDIA Corporation GeForce Go 7950 GTX/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce PCX 5300/PCI/SSE2 +NVIDIA Corporation GeForce PCX 5750/PCI/SSE2 +NVIDIA Corporation GeForce2 GTS/AGP/SSE2 +NVIDIA Corporation GeForce2 MX/AGP/SSE2 +NVIDIA Corporation GeForce2 MX/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce2 MX/PCI/SSE2 +NVIDIA Corporation GeForce3/AGP/SSE2 +NVIDIA Corporation GeForce3/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2 +NVIDIA Corporation GeForce4 420 Go 32M/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 420 Go 32M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce4 420 Go/AGP/SSE2 +NVIDIA Corporation GeForce4 4200 Go/AGP/SSE2 +NVIDIA Corporation GeForce4 440 Go 64M/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 440 Go 64M/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce4 440 Go/AGP/SSE2 +NVIDIA Corporation GeForce4 448 Go/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 4000/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2 +NVIDIA Corporation GeForce4 MX 4000/PCI/SSE2/3DNOW! +NVIDIA Corporation GeForce4 MX 420/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 420/PCI/SSE2 +NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 440 with AGP8X/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 MX 440 with AGP8X/PCI/SSE2 +NVIDIA Corporation GeForce4 MX 440/440SE/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 440/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 440/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 MX 440/PCI/SSE2 +NVIDIA Corporation GeForce4 MX 440SE with AGP8X/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 440SE with AGP8X/PCI/SSE2 +NVIDIA Corporation GeForce4 MX 460/AGP/SSE2 +NVIDIA Corporation GeForce4 MX 460/AGP/SSE2/3DNOW! +NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/AGP/SSE2 +NVIDIA Corporation GeForce4 Ti 4200 with AGP8X/PCI/SSE2 +NVIDIA Corporation GeForce4 Ti 4200/AGP/SSE2 +NVIDIA Corporation GeForce4 Ti 4400/AGP/SSE2 +NVIDIA Corporation GeForce4 Ti 4600/AGP/SSE2 +NVIDIA Corporation GeForce4 Ti 4600/PCI/SSE2 +NVIDIA Corporation ION LE/PCI/SSE2 +NVIDIA Corporation ION LE/integrated/SSE2 +NVIDIA Corporation ION LE/integrated/SSE2 +NVIDIA Corporation ION/PCI/SSE2 +NVIDIA Corporation ION/PCIe/SSE2 +NVIDIA Corporation ION/PCIe/SSE2 +NVIDIA Corporation ION/PCIe/SSE2/3DNOW! +NVIDIA Corporation ION/integrated/SSE2 +NVIDIA Corporation ION/integrated/SSE2 +NVIDIA Corporation MCP61/PCI/SSE2/3DNOW! +NVIDIA Corporation MCP7A-O/PCI/SSE2 +NVIDIA Corporation MCP7A-P/PCI/SSE2 +NVIDIA Corporation N10P-GV2/PCI/SSE2 +NVIDIA Corporation N11M-GE2/PCI/SSE2 +NVIDIA Corporation N11M-GE2/PCI/SSE2 +NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 +NVIDIA Corporation N12P-GVR-B-A1/PCI/SSE2 +NVIDIA Corporation NB9M-GE1/PCI/SSE2 +NVIDIA Corporation NB9M-GS/PCI/SSE2 +NVIDIA Corporation NV17/AGP/SSE2 +NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 210 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 310M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 320M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 6600 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 7300 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 7600 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 7950 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8400 GS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8500 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8600 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8600 GTS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8600M GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GTS 512 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GTS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 GTX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 8800 Ultra OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9200M GS OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9400M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9500 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9600 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9600M GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9800 GT OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine +NVIDIA Corporation NVIDIA GeForce 9800 GTX+ OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 120 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 130 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 220 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 240 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 320M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 330M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 430 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 440 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 520 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 630 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 640 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 640M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GT 650M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTS 250 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTS 450 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 260 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 280 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 285 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 460 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 470 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 480 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 550 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 560 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 560 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 570 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 580 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 650 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 650 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660 Ti OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 660M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 670 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 675MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 680MX OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 775M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce GTX 780M OpenGL Engine +NVIDIA Corporation NVIDIA GeForce Go 7600 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce Pre-Release D14P2-30 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce Pre-Release GK104 OpenGL Engine +NVIDIA Corporation NVIDIA GeForce Pre-Release ION OpenGL Engine +NVIDIA Corporation NVIDIA GeForce Pre-Release Unknown OpenGL Engine +NVIDIA Corporation NVIDIA NV34MAP OpenGL Engine +NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro 4000 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 4500 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 4800 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 5600 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 580 OpenGL Engine +NVIDIA Corporation NVIDIA Quadro FX 770M OpenGL Engine +NVIDIA Corporation NVS 2100M/PCI/SSE2 +NVIDIA Corporation NVS 2100M/PCIe/SSE2 +NVIDIA Corporation NVS 2100M/PCIe/SSE2 +NVIDIA Corporation NVS 300/PCI/SSE2 +NVIDIA Corporation NVS 300/PCI/SSE2/3DNOW! +NVIDIA Corporation NVS 300/PCIe/SSE2 +NVIDIA Corporation NVS 310/PCIe/SSE2 +NVIDIA Corporation NVS 310/PCIe/SSE2 +NVIDIA Corporation NVS 3100M/PCI/SSE2 +NVIDIA Corporation NVS 3100M/PCI/SSE2 +NVIDIA Corporation NVS 3100M/PCIe/SSE2 +NVIDIA Corporation NVS 3100M/PCIe/SSE2 +NVIDIA Corporation NVS 315/PCIe/SSE2 +NVIDIA Corporation NVS 4200M/PCI/SSE2 +NVIDIA Corporation NVS 4200M/PCI/SSE2 +NVIDIA Corporation NVS 4200M/PCIe/SSE2 +NVIDIA Corporation NVS 4200M/PCIe/SSE2 +NVIDIA Corporation NVS 510/PCIe/SSE2 +NVIDIA Corporation NVS 510/PCIe/SSE2 +NVIDIA Corporation NVS 5100M/PCI/SSE2 +NVIDIA Corporation NVS 5100M/PCIe/SSE2 +NVIDIA Corporation NVS 5100M/PCIe/SSE2 +NVIDIA Corporation NVS 5200M/PCI/SSE2 +NVIDIA Corporation NVS 5200M/PCIe/SSE2 +NVIDIA Corporation NVS 5200M/PCIe/SSE2 +NVIDIA Corporation NVS 5400M/PCIe/SSE2 +NVIDIA Corporation NVS 5400M/PCIe/SSE2 +NVIDIA Corporation Quadro 1000M/PCI/SSE2 +NVIDIA Corporation Quadro 1000M/PCIe/SSE2 +NVIDIA Corporation Quadro 1000M/PCIe/SSE2 +NVIDIA Corporation Quadro 1100M/PCIe/SSE2 +NVIDIA Corporation Quadro 2000 D/PCI/SSE2 +NVIDIA Corporation Quadro 2000/PCI/SSE2 +NVIDIA Corporation Quadro 2000/PCIe/SSE2 +NVIDIA Corporation Quadro 2000/PCIe/SSE2 +NVIDIA Corporation Quadro 2000D/PCIe/SSE2 +NVIDIA Corporation Quadro 2000M/PCI/SSE2 +NVIDIA Corporation Quadro 2000M/PCIe/SSE2 +NVIDIA Corporation Quadro 3000M/PCI/SSE2 +NVIDIA Corporation Quadro 3000M/PCIe/SSE2 +NVIDIA Corporation Quadro 3000M/PCIe/SSE2 +NVIDIA Corporation Quadro 400/PCI/SSE2 +NVIDIA Corporation Quadro 400/PCI/SSE2 +NVIDIA Corporation Quadro 400/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro 400/PCIe/SSE2 +NVIDIA Corporation Quadro 4000/PCI/SSE2 +NVIDIA Corporation Quadro 4000/PCIe/SSE2 +NVIDIA Corporation Quadro 4000/PCIe/SSE2 +NVIDIA Corporation Quadro 4000M/PCI/SSE2 +NVIDIA Corporation Quadro 4000M/PCI/SSE2 +NVIDIA Corporation Quadro 4000M/PCIe/SSE2 +NVIDIA Corporation Quadro 410/PCIe/SSE2 +NVIDIA Corporation Quadro 5000/PCI/SSE2 +NVIDIA Corporation Quadro 5000/PCIe/SSE2 +NVIDIA Corporation Quadro 5000M/PCI/SSE2 +NVIDIA Corporation Quadro 5000M/PCIe/SSE2 +NVIDIA Corporation Quadro 5010M/PCI/SSE2 +NVIDIA Corporation Quadro 5010M/PCIe/SSE2 +NVIDIA Corporation Quadro 5010M/PCIe/SSE2 +NVIDIA Corporation Quadro 600/PCI/SSE2 +NVIDIA Corporation Quadro 600/PCI/SSE2 +NVIDIA Corporation Quadro 600/PCIe/SSE2 +NVIDIA Corporation Quadro 600/PCIe/SSE2 +NVIDIA Corporation Quadro 600/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro 6000/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1000/AGP/SSE2 +NVIDIA Corporation Quadro FX 1100/AGP/SSE2 +NVIDIA Corporation Quadro FX 1300/PCI/SSE2 +NVIDIA Corporation Quadro FX 1400/PCI/SSE2 +NVIDIA Corporation Quadro FX 1400/PCI/SSE2 +NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1400/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1400/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 1500/PCI/SSE2 +NVIDIA Corporation Quadro FX 1500/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1500/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 1500M/PCI/SSE2 +NVIDIA Corporation Quadro FX 1600M/PCI/SSE2 +NVIDIA Corporation Quadro FX 1600M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1700/PCI/SSE2 +NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1700/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1700/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 1700M/PCI/SSE2 +NVIDIA Corporation Quadro FX 1700M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1800/PCI/SSE2 +NVIDIA Corporation Quadro FX 1800/PCIe/SSE2 +NVIDIA Corporation Quadro FX 1800M/PCI/SSE2 +NVIDIA Corporation Quadro FX 1800M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 2000/AGP/SSE2 +NVIDIA Corporation Quadro FX 2500M/PCI/SSE2 +NVIDIA Corporation Quadro FX 2500M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 2700M/PCI/SSE2 +NVIDIA Corporation Quadro FX 2700M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 2800M/PCI/SSE2 +NVIDIA Corporation Quadro FX 2800M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3000/AGP/SSE2 +NVIDIA Corporation Quadro FX 3400/PCI/SSE2 +NVIDIA Corporation Quadro FX 3400/PCI/SSE2 +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2 +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3450/4000 SDI/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3500/PCI/SSE2 +NVIDIA Corporation Quadro FX 3500/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3500M/PCI/SSE2 +NVIDIA Corporation Quadro FX 350M/PCI/SSE2 +NVIDIA Corporation Quadro FX 3600M/PCI/SSE2 +NVIDIA Corporation Quadro FX 3600M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 360M/PCI/SSE2 +NVIDIA Corporation Quadro FX 360M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 370 Low Profile/PCIe/SSE2 +NVIDIA Corporation Quadro FX 370/PCI/SSE2 +NVIDIA Corporation Quadro FX 370/PCIe/SSE2 +NVIDIA Corporation Quadro FX 370/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 3700/PCI/SSE2 +NVIDIA Corporation Quadro FX 3700/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3700M/PCI/SSE2 +NVIDIA Corporation Quadro FX 3700M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 370M/PCI/SSE2 +NVIDIA Corporation Quadro FX 370M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2 +NVIDIA Corporation Quadro FX 380 LP/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 380/PCI/SSE2 +NVIDIA Corporation Quadro FX 380/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3800/PCI/SSE2 +NVIDIA Corporation Quadro FX 3800/PCIe/SSE2 +NVIDIA Corporation Quadro FX 3800M/PCI/SSE2 +NVIDIA Corporation Quadro FX 3800M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 380M/PCI/SSE2 +NVIDIA Corporation Quadro FX 380M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 4500/PCI/SSE2 +NVIDIA Corporation Quadro FX 4500/PCIe/SSE2 +NVIDIA Corporation Quadro FX 4600/PCIe/SSE2 +NVIDIA Corporation Quadro FX 4800/PCI/SSE2 +NVIDIA Corporation Quadro FX 4800/PCIe/SSE2 +NVIDIA Corporation Quadro FX 500/AGP/SSE2 +NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2 +NVIDIA Corporation Quadro FX 500/FX 600/AGP/SSE2/3DNOW! +NVIDIA Corporation Quadro FX 500/FX 600/PCI/SSE2 +NVIDIA Corporation Quadro FX 540/PCI/SSE2 +NVIDIA Corporation Quadro FX 540/PCIe/SSE2 +NVIDIA Corporation Quadro FX 550/PCI/SSE2 +NVIDIA Corporation Quadro FX 550/PCIe/SSE2 +NVIDIA Corporation Quadro FX 5500/PCI/SSE2 +NVIDIA Corporation Quadro FX 560/PCI/SSE2 +NVIDIA Corporation Quadro FX 560/PCIe/SSE2 +NVIDIA Corporation Quadro FX 5600/PCIe/SSE2 +NVIDIA Corporation Quadro FX 570/PCI/SSE2 +NVIDIA Corporation Quadro FX 570/PCIe/SSE2 +NVIDIA Corporation Quadro FX 570M/PCI/SSE2 +NVIDIA Corporation Quadro FX 570M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 580/PCI/SSE2 +NVIDIA Corporation Quadro FX 580/PCIe/SSE2 +NVIDIA Corporation Quadro FX 5800/PCIe/SSE2 +NVIDIA Corporation Quadro FX 770M/PCI/SSE2 +NVIDIA Corporation Quadro FX 770M/PCIe/SSE2 +NVIDIA Corporation Quadro FX 880M/PCI/SSE2 +NVIDIA Corporation Quadro FX 880M/PCIe/SSE2 +NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 +NVIDIA Corporation Quadro FX Go1400/PCI/SSE2 +NVIDIA Corporation Quadro FX Go1400/PCIe/SSE2 +NVIDIA Corporation Quadro FX Go700/AGP/SSE2 +NVIDIA Corporation Quadro K1000/PCIe/SSE2 +NVIDIA Corporation Quadro K1000M/PCIe/SSE2 +NVIDIA Corporation Quadro K2000/PCIe/SSE2 +NVIDIA Corporation Quadro K2000/PCIe/SSE2 +NVIDIA Corporation Quadro K2000D/PCIe/SSE2 +NVIDIA Corporation Quadro K2000M/PCIe/SSE2 +NVIDIA Corporation Quadro K2000M/PCIe/SSE2 +NVIDIA Corporation Quadro K3000M/PCIe/SSE2 +NVIDIA Corporation Quadro K4000/PCIe/SSE2 +NVIDIA Corporation Quadro K4000/PCIe/SSE2 +NVIDIA Corporation Quadro K4000/PCIe/SSE2 +NVIDIA Corporation Quadro K4000M/PCIe/SSE2 +NVIDIA Corporation Quadro K5000/PCIe/SSE2 +NVIDIA Corporation Quadro K5000M/PCIe/SSE2 +NVIDIA Corporation Quadro K600/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 110M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 130M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 130M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 135M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 135M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 140M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 140M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 150M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 150M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 160M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 160M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2 +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 210S / GeForce 6150LE/integrated/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 210S / NVIDIA GeForce 6150LE/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 210S/PCI/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 280 PCI-E/PCI/SSE2 +NVIDIA Corporation Quadro NVS 280 SD/AGP/SSE2 +NVIDIA Corporation Quadro NVS 285/PCI/SSE2 +NVIDIA Corporation Quadro NVS 285/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 290/PCI/SSE2 +NVIDIA Corporation Quadro NVS 290/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 290/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 295/PCI/SSE2 +NVIDIA Corporation Quadro NVS 295/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 300M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 320M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 320M/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 420/PCI/SSE2 +NVIDIA Corporation Quadro NVS 420/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 420/PCIe/SSE2/3DNOW! +NVIDIA Corporation Quadro NVS 450/PCIe/SSE2 +NVIDIA Corporation Quadro NVS 510M/PCI/SSE2 +NVIDIA Corporation Quadro NVS 55/280 PCI/PCI/SSE2 +NVIDIA Corporation Quadro NVS with AGP8X/AGP/SSE2 +NVIDIA Corporation Quadro NVS/AGP/SSE2 +NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 +NVIDIA Corporation Quadro2 MXR/AGP/SSE2 +NVIDIA Corporation Quadro4 380 XGL/AGP/SSE2 +NVIDIA Corporation Quadro4 550 XGL/AGP/SSE2 +NVIDIA Corporation Quadro4 700 XGL/AGP/SSE2 +NVIDIA Corporation Quadro4 980 XGL/AGP/SSE2 +NVIDIA Corporation RIVA TNT2/AGP/SSE2 +NVIDIA Corporation RIVA TNT2/AGP/SSE2/3DNOW! +NVIDIA Corporation Stinger/emulated by Quadro FX 500/FX 600/PCI/SSE2 +NVIDIA Corporation nForce 750a SLI/PCI/SSE2 +NVIDIA Corporation nForce 750a SLI/integrated/SSE2 +NVIDIA Corporation nForce 760i SLI/integrated/SSE2 +NVIDIA Corporation nForce 980a/780a SLI/integrated/SSE2 +NVIDIA Corporation unknown board/AGP/SSE2 +NVIDIA Corporation unknown board/PCI/SSE2 +NVIDIA Corporation unknown board/PCI/SSE2/3DNOW! +NVIDIA Corporation unknown board/PCIe/SSE2 NVIDIA D9M -NVIDIA D9M-20/PCI/SSE2 -NVIDIA Entry Graphics/PCI/SSE2 -NVIDIA Entry Graphics/PCI/SSE2 -NVIDIA Entry Graphics/PCI/SSE2/3DNOW! -NVIDIA Entry Graphics/PCI/SSE2/3DNOW! -NVIDIA G 102M NVIDIA G 103M NVIDIA G 105M NVIDIA G 110M +NVIDIA G 120M +NVIDIA G 200 +NVIDIA G 205M +NVIDIA G 210 +NVIDIA G 310M +NVIDIA G 320M +NVIDIA G 405 +NVIDIA G 410M +NVIDIA G 610M NVIDIA G100 +NVIDIA G100M NVIDIA G102M NVIDIA G103M NVIDIA G105M +NVIDIA G200 NVIDIA G210 NVIDIA G210M -NVIDIA G70/PCI/SSE2 -NVIDIA G72 NVIDIA G73 NVIDIA G84 -NVIDIA G86 +NVIDIA G84 NVIDIA G92 -NVIDIA G92-200/PCI/SSE2 NVIDIA G94 -NVIDIA G96/PCI/SSE2 -NVIDIA G96/PCI/SSE2 -NVIDIA G98/PCI/SSE2 -NVIDIA G98/PCI/SSE2 -NVIDIA G98/PCI/SSE2/3DNOW! NVIDIA GT 120 +NVIDIA GT 120 +NVIDIA GT 120M +NVIDIA GT 130 +NVIDIA GT 130 NVIDIA GT 130 NVIDIA GT 130M NVIDIA GT 140 +NVIDIA GT 140M NVIDIA GT 150 -NVIDIA GT 160M NVIDIA GT 220 -NVIDIA GT 220/PCI/SSE2 -NVIDIA GT 220/PCI/SSE2 -NVIDIA GT 220/PCI/SSE2/3DNOW! -NVIDIA GT 220/PCI/SSE2/3DNOW! +NVIDIA GT 220 +NVIDIA GT 220 +NVIDIA GT 220 +NVIDIA GT 220M +NVIDIA GT 230 NVIDIA GT 230 NVIDIA GT 230M NVIDIA GT 240 +NVIDIA GT 240 +NVIDIA GT 240 NVIDIA GT 240M -NVIDIA GT 250M NVIDIA GT 260M NVIDIA GT 320 NVIDIA GT 320M +NVIDIA GT 320M +NVIDIA GT 325M +NVIDIA GT 330 +NVIDIA GT 330 NVIDIA GT 330 NVIDIA GT 330M +NVIDIA GT 330M +NVIDIA GT 335M NVIDIA GT 340 +NVIDIA GT 340M +NVIDIA GT 415M NVIDIA GT 420 +NVIDIA GT 420M +NVIDIA GT 425M NVIDIA GT 430 +NVIDIA GT 430M +NVIDIA GT 435M NVIDIA GT 440 +NVIDIA GT 440M +NVIDIA GT 445M NVIDIA GT 450 NVIDIA GT 520 +NVIDIA GT 520 +NVIDIA GT 520M +NVIDIA GT 525M +NVIDIA GT 530M NVIDIA GT 540 NVIDIA GT 540M -NVIDIA GT-120 -NVIDIA GT200/PCI/SSE2 -NVIDIA GTS 150 +NVIDIA GT 550 +NVIDIA GT 550M +NVIDIA GT 555M +NVIDIA GT 610 +NVIDIA GT 620 +NVIDIA GT 620M +NVIDIA GT 630 +NVIDIA GT 630M +NVIDIA GT 635M +NVIDIA GT 640 +NVIDIA GT 640M +NVIDIA GT 650 +NVIDIA GT 650M +NVIDIA GT 650M +NVIDIA GTS 160M +NVIDIA GTS 240 NVIDIA GTS 240 NVIDIA GTS 250 NVIDIA GTS 350M @@ -1238,11 +3786,12 @@ NVIDIA GTS 360 NVIDIA GTS 360M NVIDIA GTS 450 NVIDIA GTX 260 -NVIDIA GTX 260M NVIDIA GTX 270 +NVIDIA GTX 275 NVIDIA GTX 280 NVIDIA GTX 285 NVIDIA GTX 290 +NVIDIA GTX 295 NVIDIA GTX 460 NVIDIA GTX 460M NVIDIA GTX 465 @@ -1250,1142 +3799,376 @@ NVIDIA GTX 470 NVIDIA GTX 470M NVIDIA GTX 480 NVIDIA GTX 480M -NVIDIA GTX 550 Ti +NVIDIA GTX 485M +NVIDIA GTX 550 +NVIDIA GTX 560 +NVIDIA GTX 560 NVIDIA GTX 560 NVIDIA GTX 560 Ti NVIDIA GTX 570 NVIDIA GTX 580 +NVIDIA GTX 580M NVIDIA GTX 590 -NVIDIA GeForce +NVIDIA GTX 650 +NVIDIA GTX 660 +NVIDIA GTX 660 +NVIDIA GTX 670 +NVIDIA GTX 670 +NVIDIA GTX 670M +NVIDIA GTX 675M +NVIDIA GTX 675M +NVIDIA GTX 680 +NVIDIA GTX 680 +NVIDIA GTX 680M +NVIDIA GTX 690 +NVIDIA GTX 770 +NVIDIA GTX 770 +NVIDIA GTX TITAN NVIDIA GeForce 2 -NVIDIA GeForce 205/PCI/SSE2 -NVIDIA GeForce 205/PCI/SSE2 -NVIDIA GeForce 210 -NVIDIA GeForce 210/PCI/SSE2 -NVIDIA GeForce 210/PCI/SSE2 -NVIDIA GeForce 210/PCI/SSE2/3DNOW! -NVIDIA GeForce 210/PCI/SSE2/3DNOW! NVIDIA GeForce 3 -NVIDIA GeForce 305M/PCI/SSE2 -NVIDIA GeForce 305M/PCI/SSE2 -NVIDIA GeForce 310/PCI/SSE2 -NVIDIA GeForce 310/PCI/SSE2 -NVIDIA GeForce 310/PCI/SSE2/3DNOW! -NVIDIA GeForce 310/PCI/SSE2/3DNOW! -NVIDIA GeForce 310M/PCI/SSE2 -NVIDIA GeForce 310M/PCI/SSE2 -NVIDIA GeForce 315/PCI/SSE2 -NVIDIA GeForce 315/PCI/SSE2 -NVIDIA GeForce 315/PCI/SSE2/3DNOW! -NVIDIA GeForce 315/PCI/SSE2/3DNOW! -NVIDIA GeForce 315M/PCI/SSE2 -NVIDIA GeForce 315M/PCI/SSE2 -NVIDIA GeForce 320M/PCI/SSE2 +NVIDIA GeForce 4 NVIDIA GeForce 4 Go NVIDIA GeForce 4 MX NVIDIA GeForce 4 Ti -NVIDIA GeForce 405/PCI/SSE2 -NVIDIA GeForce 405/PCI/SSE2 -NVIDIA GeForce 410M/PCI/SSE2 NVIDIA GeForce 6100 -NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 400/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 405/PCI/SSE2 -NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 405/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 420/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100 nForce 430/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA GeForce 6100/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150 LE/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150/PCI/SSE2 -NVIDIA GeForce 6150/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2 -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150SE nForce 430/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! -NVIDIA GeForce 6150SE/PCI/SSE2/3DNOW! +NVIDIA GeForce 6100 +NVIDIA GeForce 6200 NVIDIA GeForce 6200 -NVIDIA GeForce 6200 A-LE/AGP/SSE/3DNOW! -NVIDIA GeForce 6200 A-LE/AGP/SSE2 -NVIDIA GeForce 6200 A-LE/AGP/SSE2/3DNOW! -NVIDIA GeForce 6200 LE/PCI/SSE2 -NVIDIA GeForce 6200 LE/PCI/SSE2 -NVIDIA GeForce 6200 LE/PCI/SSE2/3DNOW! -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2 -NVIDIA GeForce 6200 TurboCache(TM)/PCI/SSE2/3DNOW! -NVIDIA GeForce 6200/AGP/SSE/3DNOW! -NVIDIA GeForce 6200/AGP/SSE/3DNOW! -NVIDIA GeForce 6200/AGP/SSE2 -NVIDIA GeForce 6200/AGP/SSE2 -NVIDIA GeForce 6200/AGP/SSE2/3DNOW! -NVIDIA GeForce 6200/PCI/SSE/3DNOW! -NVIDIA GeForce 6200/PCI/SSE2 -NVIDIA GeForce 6200/PCI/SSE2 -NVIDIA GeForce 6200/PCI/SSE2/3DNOW! -NVIDIA GeForce 6200/PCI/SSE2/3DNOW! -NVIDIA GeForce 6200SE TurboCache(TM)/PCI/SSE2/3DNOW! NVIDIA GeForce 6500 -NVIDIA GeForce 6500/PCI/SSE2 -NVIDIA GeForce 6500/PCI/SSE2 NVIDIA GeForce 6600 -NVIDIA GeForce 6600 GT/AGP/SSE/3DNOW! -NVIDIA GeForce 6600 GT/AGP/SSE2 -NVIDIA GeForce 6600 GT/AGP/SSE2 -NVIDIA GeForce 6600 GT/PCI/SSE/3DNOW! -NVIDIA GeForce 6600 GT/PCI/SSE2 -NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 6600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 6600 LE/PCI/SSE2 -NVIDIA GeForce 6600/AGP/SSE/3DNOW! -NVIDIA GeForce 6600/AGP/SSE2 -NVIDIA GeForce 6600/AGP/SSE2/3DNOW! -NVIDIA GeForce 6600/PCI/SSE2 -NVIDIA GeForce 6600/PCI/SSE2/3DNOW! NVIDIA GeForce 6700 NVIDIA GeForce 6800 -NVIDIA GeForce 6800 GS/PCI/SSE2 -NVIDIA GeForce 6800 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 6800 GT/AGP/SSE2 -NVIDIA GeForce 6800 GT/PCI/SSE2 -NVIDIA GeForce 6800 XT/AGP/SSE2 -NVIDIA GeForce 6800 XT/PCI/SSE2 -NVIDIA GeForce 6800 XT/PCI/SSE2/3DNOW! -NVIDIA GeForce 6800/PCI/SSE2 -NVIDIA GeForce 6800/PCI/SSE2/3DNOW! NVIDIA GeForce 7000 NVIDIA GeForce 7000M -NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2 -NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA GeForce 7000M / nForce 610M/PCI/SSE2/3DNOW! -NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7025 / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2 -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7025 / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 -NVIDIA GeForce 7050 / NVIDIA nForce 610i/PCI/SSE2 -NVIDIA GeForce 7050 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 -NVIDIA GeForce 7050 / nForce 610i/PCI/SSE2 -NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA GeForce 7050 / nForce 620i/PCI/SSE2 -NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7050 PV / NVIDIA nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2 -NVIDIA GeForce 7050 PV / nForce 630a/PCI/SSE2/3DNOW! -NVIDIA GeForce 7050 SE / NVIDIA nForce 630a/PCI/SSE2/3DNOW! NVIDIA GeForce 7100 -NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA GeForce 7100 / NVIDIA nForce 620i/PCI/SSE2 -NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA GeForce 7100 / NVIDIA nForce 630i/PCI/SSE2 -NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA GeForce 7100 / nForce 630i/PCI/SSE2 -NVIDIA GeForce 7100 GS/PCI/SSE2 -NVIDIA GeForce 7100 GS/PCI/SSE2 -NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7100 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2 -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! -NVIDIA GeForce 7150M / nForce 630M/PCI/SSE2/3DNOW! NVIDIA GeForce 7300 -NVIDIA GeForce 7300 GS/PCI/SSE2 -NVIDIA GeForce 7300 GS/PCI/SSE2 -NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 GT/AGP/SSE2 -NVIDIA GeForce 7300 GT/AGP/SSE2/3DNOW! -NVIDIA GeForce 7300 GT/PCI/SSE2 -NVIDIA GeForce 7300 GT/PCI/SSE2 -NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 LE/PCI/SSE2 -NVIDIA GeForce 7300 LE/PCI/SSE2 -NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 LE/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2 -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 SE/7200 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 SE/PCI/SSE2 -NVIDIA GeForce 7300 SE/PCI/SSE2 -NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! -NVIDIA GeForce 7300 SE/PCI/SSE2/3DNOW! -NVIDIA GeForce 7350 LE/PCI/SSE2 -NVIDIA GeForce 7350 LE/PCI/SSE2 +NVIDIA GeForce 7300 NVIDIA GeForce 7500 -NVIDIA GeForce 7500 LE/PCI/SSE2 -NVIDIA GeForce 7500 LE/PCI/SSE2/3DNOW! NVIDIA GeForce 7600 -NVIDIA GeForce 7600 GS/AGP/SSE2 -NVIDIA GeForce 7600 GS/AGP/SSE2/3DNOW! -NVIDIA GeForce 7600 GS/PCI/SSE2 -NVIDIA GeForce 7600 GS/PCI/SSE2 -NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7600 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7600 GT/AGP/SSE/3DNOW! -NVIDIA GeForce 7600 GT/AGP/SSE2 -NVIDIA GeForce 7600 GT/PCI/SSE2 -NVIDIA GeForce 7600 GT/PCI/SSE2 -NVIDIA GeForce 7600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7650 GS/PCI/SSE2 +NVIDIA GeForce 7600 +NVIDIA GeForce 7800 NVIDIA GeForce 7800 -NVIDIA GeForce 7800 GS/AGP/SSE2 -NVIDIA GeForce 7800 GS/AGP/SSE2/3DNOW! -NVIDIA GeForce 7800 GT/PCI/SSE2 -NVIDIA GeForce 7800 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7800 GTX/PCI/SSE2 -NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! -NVIDIA GeForce 7800 GTX/PCI/SSE2/3DNOW! NVIDIA GeForce 7900 -NVIDIA GeForce 7900 GS/PCI/SSE2 -NVIDIA GeForce 7900 GS/PCI/SSE2 -NVIDIA GeForce 7900 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 7900 GT/GTO/PCI/SSE2 -NVIDIA GeForce 7900 GT/GTO/PCI/SSE2/3DNOW! -NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7900 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 7900 GTX/PCI/SSE2 -NVIDIA GeForce 7950 GT/PCI/SSE2 -NVIDIA GeForce 7950 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 7900 NVIDIA GeForce 8100 -NVIDIA GeForce 8100 / nForce 720a/PCI/SSE2/3DNOW! NVIDIA GeForce 8200 -NVIDIA GeForce 8200/PCI/SSE2 -NVIDIA GeForce 8200/PCI/SSE2 -NVIDIA GeForce 8200/PCI/SSE2/3DNOW! -NVIDIA GeForce 8200/PCI/SSE2/3DNOW! NVIDIA GeForce 8200M -NVIDIA GeForce 8200M G/PCI/SSE2 -NVIDIA GeForce 8200M G/PCI/SSE2 -NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! -NVIDIA GeForce 8200M G/PCI/SSE2/3DNOW! NVIDIA GeForce 8300 -NVIDIA GeForce 8300 GS/PCI/SSE2 -NVIDIA GeForce 8300 GS/PCI/SSE2 +NVIDIA GeForce 8300 +NVIDIA GeForce 8400 NVIDIA GeForce 8400 -NVIDIA GeForce 8400 GS/PCI/SSE/3DNOW! -NVIDIA GeForce 8400 GS/PCI/SSE2 -NVIDIA GeForce 8400 GS/PCI/SSE2 -NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400GS/PCI/SSE2 -NVIDIA GeForce 8400GS/PCI/SSE2 -NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400GS/PCI/SSE2/3DNOW! NVIDIA GeForce 8400M -NVIDIA GeForce 8400M G/PCI/SSE2 -NVIDIA GeForce 8400M G/PCI/SSE2 -NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400M G/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400M GS/PCI/SSE2 -NVIDIA GeForce 8400M GS/PCI/SSE2 -NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400M GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8400M GT/PCI/SSE2 -NVIDIA GeForce 8400M GT/PCI/SSE2 +NVIDIA GeForce 8400M +NVIDIA GeForce 8500 NVIDIA GeForce 8500 -NVIDIA GeForce 8500 GT/PCI/SSE2 -NVIDIA GeForce 8500 GT/PCI/SSE2 -NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 8500 GT/PCI/SSE2/3DNOW! NVIDIA GeForce 8600 -NVIDIA GeForce 8600 GS/PCI/SSE2 -NVIDIA GeForce 8600 GS/PCI/SSE2 -NVIDIA GeForce 8600 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8600 GT/PCI/SSE2 -NVIDIA GeForce 8600 GT/PCI/SSE2 -NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 8600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 8600 GTS/PCI/SSE2 -NVIDIA GeForce 8600 GTS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8600GS/PCI/SSE2 -NVIDIA GeForce 8600GS/PCI/SSE2 NVIDIA GeForce 8600M -NVIDIA GeForce 8600M GS/PCI/SSE2 -NVIDIA GeForce 8600M GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8600M GT/PCI/SSE2 -NVIDIA GeForce 8600M GT/PCI/SSE2 +NVIDIA GeForce 8600M NVIDIA GeForce 8700 NVIDIA GeForce 8700M -NVIDIA GeForce 8700M GT/PCI/SSE2 -NVIDIA GeForce 8700M GT/PCI/SSE2 NVIDIA GeForce 8800 -NVIDIA GeForce 8800 GS/PCI/SSE2 -NVIDIA GeForce 8800 GT/PCI/SSE2 -NVIDIA GeForce 8800 GT/PCI/SSE2 -NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 8800 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 8800 GTS 512/PCI/SSE2 -NVIDIA GeForce 8800 GTS 512/PCI/SSE2/3DNOW! -NVIDIA GeForce 8800 GTS/PCI/SSE2 -NVIDIA GeForce 8800 GTS/PCI/SSE2 -NVIDIA GeForce 8800 GTS/PCI/SSE2/3DNOW! -NVIDIA GeForce 8800 GTX/PCI/SSE2 -NVIDIA GeForce 8800 Ultra/PCI/SSE2 -NVIDIA GeForce 8800M GTS/PCI/SSE2 -NVIDIA GeForce 8800M GTS/PCI/SSE2 -NVIDIA GeForce 8800M GTX/PCI/SSE2 -NVIDIA GeForce 8800M GTX/PCI/SSE2 +NVIDIA GeForce 8800M NVIDIA GeForce 9100 -NVIDIA GeForce 9100/PCI/SSE2 -NVIDIA GeForce 9100/PCI/SSE2 -NVIDIA GeForce 9100/PCI/SSE2/3DNOW! NVIDIA GeForce 9100M -NVIDIA GeForce 9100M G/PCI/SSE2 -NVIDIA GeForce 9100M G/PCI/SSE2 -NVIDIA GeForce 9100M G/PCI/SSE2/3DNOW! NVIDIA GeForce 9200 -NVIDIA GeForce 9200/PCI/SSE2 -NVIDIA GeForce 9200/PCI/SSE2 -NVIDIA GeForce 9200/PCI/SSE2/3DNOW! -NVIDIA GeForce 9200/PCI/SSE2/3DNOW! -NVIDIA GeForce 9200M GE/PCI/SSE2 -NVIDIA GeForce 9200M GE/PCI/SSE2 -NVIDIA GeForce 9200M GS/PCI/SSE2 -NVIDIA GeForce 9200M GS/PCI/SSE2 +NVIDIA GeForce 9200 +NVIDIA GeForce 9200M +NVIDIA GeForce 9300 NVIDIA GeForce 9300 -NVIDIA GeForce 9300 / nForce 730i/PCI/SSE2 -NVIDIA GeForce 9300 GE/PCI/SSE2 -NVIDIA GeForce 9300 GE/PCI/SSE2 -NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! -NVIDIA GeForce 9300 GE/PCI/SSE2/3DNOW! -NVIDIA GeForce 9300 GS/PCI/SSE2 -NVIDIA GeForce 9300 GS/PCI/SSE2 -NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 9300 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 9300 SE/PCI/SSE2 NVIDIA GeForce 9300M -NVIDIA GeForce 9300M G/PCI/SSE2 -NVIDIA GeForce 9300M G/PCI/SSE2 -NVIDIA GeForce 9300M G/PCI/SSE2/3DNOW! -NVIDIA GeForce 9300M GS/PCI/SSE2 -NVIDIA GeForce 9300M GS/PCI/SSE2 -NVIDIA GeForce 9300M GS/PCI/SSE2/3DNOW! +NVIDIA GeForce 9300M +NVIDIA GeForce 9400 NVIDIA GeForce 9400 -NVIDIA GeForce 9400 GT/PCI/SSE2 -NVIDIA GeForce 9400 GT/PCI/SSE2 -NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9400 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9400/PCI/SSE2 NVIDIA GeForce 9400M -NVIDIA GeForce 9400M G/PCI/SSE2 -NVIDIA GeForce 9400M G/PCI/SSE2 -NVIDIA GeForce 9400M/PCI/SSE2 -NVIDIA GeForce 9400M/PCI/SSE2 +NVIDIA GeForce 9400M NVIDIA GeForce 9500 -NVIDIA GeForce 9500 GS/PCI/SSE2 -NVIDIA GeForce 9500 GS/PCI/SSE2 -NVIDIA GeForce 9500 GS/PCI/SSE2/3DNOW! -NVIDIA GeForce 9500 GT/PCI/SSE2 -NVIDIA GeForce 9500 GT/PCI/SSE2 -NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9500 GT/PCI/SSE2/3DNOW! NVIDIA GeForce 9500M -NVIDIA GeForce 9500M GS/PCI/SSE2 -NVIDIA GeForce 9500M GS/PCI/SSE2 NVIDIA GeForce 9600 -NVIDIA GeForce 9600 GS/PCI/SSE2 -NVIDIA GeForce 9600 GSO 512/PCI/SSE2 -NVIDIA GeForce 9600 GSO/PCI/SSE2 -NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! -NVIDIA GeForce 9600 GSO/PCI/SSE2/3DNOW! -NVIDIA GeForce 9600 GT/PCI/SSE2 -NVIDIA GeForce 9600 GT/PCI/SSE2 -NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9600 GT/PCI/SSE2/3DNOW! +NVIDIA GeForce 9600 +NVIDIA GeForce 9600M NVIDIA GeForce 9600M -NVIDIA GeForce 9600M GS/PCI/SSE2 -NVIDIA GeForce 9600M GS/PCI/SSE2 -NVIDIA GeForce 9600M GT/PCI/SSE2 -NVIDIA GeForce 9600M GT/PCI/SSE2 -NVIDIA GeForce 9650M GT/PCI/SSE2 -NVIDIA GeForce 9650M GT/PCI/SSE2 NVIDIA GeForce 9700M -NVIDIA GeForce 9700M GT/PCI/SSE2 -NVIDIA GeForce 9700M GTS/PCI/SSE2 -NVIDIA GeForce 9700M GTS/PCI/SSE2 NVIDIA GeForce 9800 -NVIDIA GeForce 9800 GT/PCI/SSE2 -NVIDIA GeForce 9800 GT/PCI/SSE2 -NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9800 GT/PCI/SSE2/3DNOW! -NVIDIA GeForce 9800 GTX+/PCI/SSE2 -NVIDIA GeForce 9800 GTX+/PCI/SSE2 -NVIDIA GeForce 9800 GTX+/PCI/SSE2/3DNOW! -NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 -NVIDIA GeForce 9800 GTX/9800 GTX+/PCI/SSE2 -NVIDIA GeForce 9800 GTX/PCI/SSE2 -NVIDIA GeForce 9800 GX2/PCI/SSE2 NVIDIA GeForce 9800M -NVIDIA GeForce 9800M GS/PCI/SSE2 -NVIDIA GeForce 9800M GS/PCI/SSE2 -NVIDIA GeForce 9800M GT/PCI/SSE2 -NVIDIA GeForce 9800M GT/PCI/SSE2 -NVIDIA GeForce 9800M GTS/PCI/SSE2 -NVIDIA GeForce 9800M GTS/PCI/SSE2 -NVIDIA GeForce FX 5100 -NVIDIA GeForce FX 5100/AGP/SSE/3DNOW! NVIDIA GeForce FX 5200 -NVIDIA GeForce FX 5200/AGP/SSE -NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! -NVIDIA GeForce FX 5200/AGP/SSE/3DNOW! -NVIDIA GeForce FX 5200/AGP/SSE2 -NVIDIA GeForce FX 5200/AGP/SSE2 -NVIDIA GeForce FX 5200/AGP/SSE2/3DNOW! -NVIDIA GeForce FX 5200/PCI/SSE2 -NVIDIA GeForce FX 5200/PCI/SSE2/3DNOW! -NVIDIA GeForce FX 5200LE/AGP/SSE2 +NVIDIA GeForce FX 5200 +NVIDIA GeForce FX 5500 NVIDIA GeForce FX 5500 -NVIDIA GeForce FX 5500/AGP/SSE/3DNOW! -NVIDIA GeForce FX 5500/AGP/SSE2 -NVIDIA GeForce FX 5500/AGP/SSE2 -NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA GeForce FX 5500/AGP/SSE2/3DNOW! -NVIDIA GeForce FX 5500/PCI/SSE2 -NVIDIA GeForce FX 5500/PCI/SSE2 -NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! -NVIDIA GeForce FX 5500/PCI/SSE2/3DNOW! NVIDIA GeForce FX 5600 -NVIDIA GeForce FX 5600/AGP/SSE2 -NVIDIA GeForce FX 5600/AGP/SSE2 -NVIDIA GeForce FX 5600/AGP/SSE2/3DNOW! -NVIDIA GeForce FX 5600XT/AGP/SSE2/3DNOW! NVIDIA GeForce FX 5700 -NVIDIA GeForce FX 5700/AGP/SSE/3DNOW! -NVIDIA GeForce FX 5700LE/AGP/SSE -NVIDIA GeForce FX 5700LE/AGP/SSE/3DNOW! -NVIDIA GeForce FX 5800 NVIDIA GeForce FX 5900 -NVIDIA GeForce FX 5900/AGP/SSE2 -NVIDIA GeForce FX 5900XT/AGP/SSE2 NVIDIA GeForce FX Go5100 -NVIDIA GeForce FX Go5100/AGP/SSE2 NVIDIA GeForce FX Go5200 -NVIDIA GeForce FX Go5200/AGP/SSE2 -NVIDIA GeForce FX Go5200/AGP/SSE2 -NVIDIA GeForce FX Go5300 NVIDIA GeForce FX Go5600 -NVIDIA GeForce FX Go5600/AGP/SSE2 -NVIDIA GeForce FX Go5600/AGP/SSE2 -NVIDIA GeForce FX Go5650/AGP/SSE2 NVIDIA GeForce FX Go5700 -NVIDIA GeForce FX Go5700/AGP/SSE2 -NVIDIA GeForce FX Go5xxx/AGP/SSE2 -NVIDIA GeForce FX Go5xxx/AGP/SSE2 -NVIDIA GeForce G 103M/PCI/SSE2 -NVIDIA GeForce G 103M/PCI/SSE2 -NVIDIA GeForce G 103M/PCI/SSE2/3DNOW! -NVIDIA GeForce G 105M/PCI/SSE2 -NVIDIA GeForce G 105M/PCI/SSE2 -NVIDIA GeForce G 110M/PCI/SSE2 -NVIDIA GeForce G 110M/PCI/SSE2 -NVIDIA GeForce G100/PCI/SSE2 -NVIDIA GeForce G100/PCI/SSE2 -NVIDIA GeForce G100/PCI/SSE2/3DNOW! -NVIDIA GeForce G100/PCI/SSE2/3DNOW! -NVIDIA GeForce G102M/PCI/SSE2 -NVIDIA GeForce G102M/PCI/SSE2 -NVIDIA GeForce G105M/PCI/SSE2 -NVIDIA GeForce G105M/PCI/SSE2 -NVIDIA GeForce G200/PCI/SSE2 -NVIDIA GeForce G200/PCI/SSE2 -NVIDIA GeForce G205M/PCI/SSE2 -NVIDIA GeForce G205M/PCI/SSE2 -NVIDIA GeForce G210/PCI/SSE2 -NVIDIA GeForce G210/PCI/SSE2 -NVIDIA GeForce G210/PCI/SSE2/3DNOW! -NVIDIA GeForce G210/PCI/SSE2/3DNOW! -NVIDIA GeForce G210M/PCI/SSE2 -NVIDIA GeForce G210M/PCI/SSE2 -NVIDIA GeForce G310M/PCI/SSE2 -NVIDIA GeForce GT 120/PCI/SSE2 -NVIDIA GeForce GT 120/PCI/SSE2 -NVIDIA GeForce GT 120/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 120M/PCI/SSE2 -NVIDIA GeForce GT 130M/PCI/SSE2 -NVIDIA GeForce GT 130M/PCI/SSE2 -NVIDIA GeForce GT 140/PCI/SSE2 -NVIDIA GeForce GT 140/PCI/SSE2 -NVIDIA GeForce GT 220/PCI/SSE2 -NVIDIA GeForce GT 220/PCI/SSE2 -NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 220/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 220M/PCI/SSE2 -NVIDIA GeForce GT 220M/PCI/SSE2 -NVIDIA GeForce GT 230/PCI/SSE2 -NVIDIA GeForce GT 230/PCI/SSE2 -NVIDIA GeForce GT 230M/PCI/SSE2 -NVIDIA GeForce GT 230M/PCI/SSE2 -NVIDIA GeForce GT 240 -NVIDIA GeForce GT 240/PCI/SSE2 -NVIDIA GeForce GT 240/PCI/SSE2 -NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 240/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 240M/PCI/SSE2 -NVIDIA GeForce GT 240M/PCI/SSE2 -NVIDIA GeForce GT 320/PCI/SSE2 -NVIDIA GeForce GT 320M/PCI/SSE2 -NVIDIA GeForce GT 320M/PCI/SSE2 -NVIDIA GeForce GT 325M/PCI/SSE2 -NVIDIA GeForce GT 330/PCI/SSE2 -NVIDIA GeForce GT 330/PCI/SSE2 -NVIDIA GeForce GT 330/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 330M/PCI/SSE2 -NVIDIA GeForce GT 330M/PCI/SSE2 -NVIDIA GeForce GT 335M/PCI/SSE2 -NVIDIA GeForce GT 335M/PCI/SSE2 -NVIDIA GeForce GT 340/PCI/SSE2 -NVIDIA GeForce GT 340/PCI/SSE2 -NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 340/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 415M/PCI/SSE2 -NVIDIA GeForce GT 415M/PCI/SSE2 -NVIDIA GeForce GT 420/PCI/SSE2 -NVIDIA GeForce GT 420/PCI/SSE2 -NVIDIA GeForce GT 420M/PCI/SSE2 -NVIDIA GeForce GT 420M/PCI/SSE2 -NVIDIA GeForce GT 425M/PCI/SSE2 -NVIDIA GeForce GT 425M/PCI/SSE2 -NVIDIA GeForce GT 430/PCI/SSE2 -NVIDIA GeForce GT 430/PCI/SSE2 -NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 430/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 435M/PCI/SSE2 -NVIDIA GeForce GT 435M/PCI/SSE2 -NVIDIA GeForce GT 440/PCI/SSE2 -NVIDIA GeForce GT 440/PCI/SSE2 -NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 440/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 445M/PCI/SSE2 -NVIDIA GeForce GT 445M/PCI/SSE2 -NVIDIA GeForce GT 520/PCI/SSE2 -NVIDIA GeForce GT 520/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 520M/PCI/SSE2 -NVIDIA GeForce GT 520M/PCI/SSE2 -NVIDIA GeForce GT 525M/PCI/SSE2 -NVIDIA GeForce GT 525M/PCI/SSE2 -NVIDIA GeForce GT 530/PCI/SSE2 -NVIDIA GeForce GT 530/PCI/SSE2/3DNOW! -NVIDIA GeForce GT 540M/PCI/SSE2 -NVIDIA GeForce GT 540M/PCI/SSE2 -NVIDIA GeForce GT 545/PCI/SSE2 -NVIDIA GeForce GT 550M/PCI/SSE2 -NVIDIA GeForce GT 550M/PCI/SSE2 -NVIDIA GeForce GT 555M/PCI/SSE2 -NVIDIA GeForce GT 555M/PCI/SSE2 -NVIDIA GeForce GTS 150/PCI/SSE2 -NVIDIA GeForce GTS 150/PCI/SSE2 -NVIDIA GeForce GTS 160M/PCI/SSE2 -NVIDIA GeForce GTS 160M/PCI/SSE2 -NVIDIA GeForce GTS 240/PCI/SSE2 -NVIDIA GeForce GTS 240/PCI/SSE2 -NVIDIA GeForce GTS 250/PCI/SSE2 -NVIDIA GeForce GTS 250/PCI/SSE2 -NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! -NVIDIA GeForce GTS 250/PCI/SSE2/3DNOW! -NVIDIA GeForce GTS 250M/PCI/SSE2 -NVIDIA GeForce GTS 350M/PCI/SSE2 -NVIDIA GeForce GTS 350M/PCI/SSE2 -NVIDIA GeForce GTS 360M/PCI/SSE2 -NVIDIA GeForce GTS 360M/PCI/SSE2 -NVIDIA GeForce GTS 450/PCI/SSE2 -NVIDIA GeForce GTS 450/PCI/SSE2 -NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! -NVIDIA GeForce GTS 450/PCI/SSE2/3DNOW! -NVIDIA GeForce GTS 455/PCI/SSE2 -NVIDIA GeForce GTX 260/PCI/SSE2 -NVIDIA GeForce GTX 260/PCI/SSE2 -NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 260/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 260M/PCI/SSE2 -NVIDIA GeForce GTX 260M/PCI/SSE2 -NVIDIA GeForce GTX 275/PCI/SSE2 -NVIDIA GeForce GTX 275/PCI/SSE2 -NVIDIA GeForce GTX 275/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 280 -NVIDIA GeForce GTX 280/PCI/SSE2 -NVIDIA GeForce GTX 280M/PCI/SSE2 -NVIDIA GeForce GTX 285 -NVIDIA GeForce GTX 285/PCI/SSE2 -NVIDIA GeForce GTX 285/PCI/SSE2 -NVIDIA GeForce GTX 285/PCI/SSE2 -NVIDIA GeForce GTX 295/PCI/SSE2 -NVIDIA GeForce GTX 295/PCI/SSE2 -NVIDIA GeForce GTX 460 SE/PCI/SSE2 -NVIDIA GeForce GTX 460 SE/PCI/SSE2 -NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 460 SE/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 460/PCI/SSE2 -NVIDIA GeForce GTX 460/PCI/SSE2 -NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 460/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 460M/PCI/SSE2 -NVIDIA GeForce GTX 460M/PCI/SSE2 -NVIDIA GeForce GTX 465/PCI/SSE2 -NVIDIA GeForce GTX 465/PCI/SSE2 -NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 465/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 470/PCI/SSE2 -NVIDIA GeForce GTX 470/PCI/SSE2 -NVIDIA GeForce GTX 470/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 480/PCI/SSE2 -NVIDIA GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA GeForce GTX 550 Ti/PCI/SSE2 -NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 550 Ti/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA GeForce GTX 560 Ti/PCI/SSE2 -NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 560 Ti/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 560/PCI/SSE2 -NVIDIA GeForce GTX 560/PCI/SSE2 -NVIDIA GeForce GTX 560/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 560M/PCI/SSE2 -NVIDIA GeForce GTX 570/PCI/SSE2 -NVIDIA GeForce GTX 570/PCI/SSE2 -NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 570/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 580/PCI/SSE2 -NVIDIA GeForce GTX 580/PCI/SSE2 -NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 580/PCI/SSE2/3DNOW! -NVIDIA GeForce GTX 580M/PCI/SSE2 -NVIDIA GeForce GTX 590/PCI/SSE2 -NVIDIA GeForce GTX 590/PCI/SSE2 NVIDIA GeForce Go 6 NVIDIA GeForce Go 6100 -NVIDIA GeForce Go 6100/PCI/SSE2 -NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA GeForce Go 6100/PCI/SSE2/3DNOW! -NVIDIA GeForce Go 6150/PCI/SSE2 -NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! -NVIDIA GeForce Go 6150/PCI/SSE2/3DNOW! NVIDIA GeForce Go 6200 -NVIDIA GeForce Go 6200/PCI/SSE2 NVIDIA GeForce Go 6400 -NVIDIA GeForce Go 6400/PCI/SSE2 -NVIDIA GeForce Go 6400/PCI/SSE2 NVIDIA GeForce Go 6600 -NVIDIA GeForce Go 6600/PCI/SSE2 -NVIDIA GeForce Go 6600/PCI/SSE2 NVIDIA GeForce Go 6800 -NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 -NVIDIA GeForce Go 6800 Ultra/PCI/SSE2 -NVIDIA GeForce Go 6800/PCI/SSE2 NVIDIA GeForce Go 7200 -NVIDIA GeForce Go 7200/PCI/SSE2 -NVIDIA GeForce Go 7200/PCI/SSE2/3DNOW! NVIDIA GeForce Go 7300 -NVIDIA GeForce Go 7300/PCI/SSE2 -NVIDIA GeForce Go 7300/PCI/SSE2 -NVIDIA GeForce Go 7300/PCI/SSE2/3DNOW! NVIDIA GeForce Go 7400 -NVIDIA GeForce Go 7400/PCI/SSE2 -NVIDIA GeForce Go 7400/PCI/SSE2 -NVIDIA GeForce Go 7400/PCI/SSE2/3DNOW! NVIDIA GeForce Go 7600 -NVIDIA GeForce Go 7600/PCI/SSE2 -NVIDIA GeForce Go 7600/PCI/SSE2 -NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! -NVIDIA GeForce Go 7600/PCI/SSE2/3DNOW! NVIDIA GeForce Go 7700 -NVIDIA GeForce Go 7700/PCI/SSE2 NVIDIA GeForce Go 7800 -NVIDIA GeForce Go 7800 GTX/PCI/SSE2 NVIDIA GeForce Go 7900 -NVIDIA GeForce Go 7900 GS/PCI/SSE2 -NVIDIA GeForce Go 7900 GS/PCI/SSE2 -NVIDIA GeForce Go 7900 GTX/PCI/SSE2 -NVIDIA GeForce Go 7950 GTX/PCI/SSE2 NVIDIA GeForce PCX -NVIDIA GeForce2 GTS/AGP/SSE -NVIDIA GeForce2 MX/AGP/3DNOW! -NVIDIA GeForce2 MX/AGP/SSE/3DNOW! -NVIDIA GeForce2 MX/AGP/SSE2 -NVIDIA GeForce2 MX/AGP/SSE2 -NVIDIA GeForce2 MX/PCI/SSE2 -NVIDIA GeForce3/AGP/SSE/3DNOW! -NVIDIA GeForce3/AGP/SSE2 -NVIDIA GeForce4 420 Go 32M/AGP/SSE2 -NVIDIA GeForce4 420 Go 32M/AGP/SSE2/3DNOW! -NVIDIA GeForce4 420 Go 32M/PCI/SSE2/3DNOW! -NVIDIA GeForce4 420 Go/AGP/SSE2 -NVIDIA GeForce4 440 Go 64M/AGP/SSE2/3DNOW! -NVIDIA GeForce4 440 Go/AGP/SSE2 -NVIDIA GeForce4 460 Go/AGP/SSE2 -NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! -NVIDIA GeForce4 MX 4000/AGP/SSE/3DNOW! -NVIDIA GeForce4 MX 4000/AGP/SSE2 -NVIDIA GeForce4 MX 4000/AGP/SSE2 -NVIDIA GeForce4 MX 4000/PCI/3DNOW! -NVIDIA GeForce4 MX 4000/PCI/SSE/3DNOW! -NVIDIA GeForce4 MX 4000/PCI/SSE2 -NVIDIA GeForce4 MX 420/AGP/SSE/3DNOW! -NVIDIA GeForce4 MX 420/AGP/SSE2 -NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 -NVIDIA GeForce4 MX 440 with AGP8X/AGP/SSE2 -NVIDIA GeForce4 MX 440/AGP/SSE2 -NVIDIA GeForce4 MX 440/AGP/SSE2 -NVIDIA GeForce4 MX 440/AGP/SSE2/3DNOW! -NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 -NVIDIA GeForce4 MX 440SE with AGP8X/AGP/SSE2 -NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! -NVIDIA GeForce4 MX Integrated GPU/AGP/SSE/3DNOW! -NVIDIA GeForce4 Ti 4200 with AGP8X/AGP/SSE -NVIDIA GeForce4 Ti 4200/AGP/SSE/3DNOW! -NVIDIA GeForce4 Ti 4400/AGP/SSE2 NVIDIA Generic -NVIDIA ION LE/PCI/SSE2 -NVIDIA ION LE/PCI/SSE2 -NVIDIA ION/PCI/SSE2 -NVIDIA ION/PCI/SSE2 -NVIDIA ION/PCI/SSE2/3DNOW! -NVIDIA ION/PCI/SSE2/3DNOW! -NVIDIA MCP61/PCI/SSE2 -NVIDIA MCP61/PCI/SSE2 -NVIDIA MCP61/PCI/SSE2/3DNOW! -NVIDIA MCP61/PCI/SSE2/3DNOW! -NVIDIA MCP73/PCI/SSE2 -NVIDIA MCP73/PCI/SSE2 -NVIDIA MCP79MH/PCI/SSE2 -NVIDIA MCP79MH/PCI/SSE2 -NVIDIA MCP79MX/PCI/SSE2 -NVIDIA MCP79MX/PCI/SSE2 -NVIDIA MCP7A-O/PCI/SSE2 -NVIDIA MCP7A-O/PCI/SSE2 -NVIDIA MCP7A-S/PCI/SSE2 -NVIDIA MCP89-EPT/PCI/SSE2 -NVIDIA MCP89-EPT/PCI/SSE2 -NVIDIA N10M-GE1/PCI/SSE2 -NVIDIA N10M-GE1/PCI/SSE2 -NVIDIA N10P-GE1/PCI/SSE2 -NVIDIA N10P-GE1/PCI/SSE2 -NVIDIA N10P-GV2/PCI/SSE2 -NVIDIA N10P-GV2/PCI/SSE2 -NVIDIA N11M-GE1/PCI/SSE2 -NVIDIA N11M-GE1/PCI/SSE2 -NVIDIA N11M-GE2/PCI/SSE2 -NVIDIA N11M-GE2/PCI/SSE2 -NVIDIA N12E-GS-A1/PCI/SSE2 -NVIDIA N12P-GVR-B-A1/PCI/SSE2 -NVIDIA N13M-GE1-B-A1/PCI/SSE2 -NVIDIA N13P-GL-A1/PCI/SSE2 -NVIDIA NB9M-GE/PCI/SSE2 -NVIDIA NB9M-GE/PCI/SSE2 -NVIDIA NB9M-GE1/PCI/SSE2 -NVIDIA NB9M-GE1/PCI/SSE2 -NVIDIA NB9M-GS/PCI/SSE2 -NVIDIA NB9M-GS/PCI/SSE2 -NVIDIA NB9M-NS/PCI/SSE2 -NVIDIA NB9M-NS/PCI/SSE2 -NVIDIA NB9P-GE1/PCI/SSE2 -NVIDIA NB9P-GE1/PCI/SSE2 -NVIDIA NB9P-GS/PCI/SSE2 -NVIDIA NV17/AGP/3DNOW! -NVIDIA NV17/AGP/SSE2 -NVIDIA NV17/AGP/SSE2 +NVIDIA ION +NVIDIA MCP61 NVIDIA NV34 -NVIDIA NV35 -NVIDIA NV36/AGP/SSE/3DNOW! -NVIDIA NV36/AGP/SSE2 -NVIDIA NV41/PCI/SSE2 -NVIDIA NV43 -NVIDIA NV43/PCI/SSE2 -NVIDIA NV44 -NVIDIA NV44/AGP/SSE2 -NVIDIA NVIDIA GeForce 210 OpenGL Engine -NVIDIA NVIDIA GeForce 210 OpenGL Engine -NVIDIA NVIDIA GeForce 320M OpenGL Engine -NVIDIA NVIDIA GeForce 320M OpenGL Engine -NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine -NVIDIA NVIDIA GeForce 7300 GT OpenGL Engine -NVIDIA NVIDIA GeForce 7600 GT OpenGL Engine -NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA NVIDIA GeForce 8600M GT OpenGL Engine -NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA NVIDIA GeForce 8800 GS OpenGL Engine -NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA NVIDIA GeForce 8800 GT OpenGL Engine -NVIDIA NVIDIA GeForce 9400 OpenGL Engine -NVIDIA NVIDIA GeForce 9400 OpenGL Engine -NVIDIA NVIDIA GeForce 9400M OpenGL Engine -NVIDIA NVIDIA GeForce 9400M OpenGL Engine -NVIDIA NVIDIA GeForce 9500 GT OpenGL Engine -NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA NVIDIA GeForce 9600M GT OpenGL Engine -NVIDIA NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA NVIDIA GeForce GT 120 OpenGL Engine -NVIDIA NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA NVIDIA GeForce GT 130 OpenGL Engine -NVIDIA NVIDIA GeForce GT 220 OpenGL Engine -NVIDIA NVIDIA GeForce GT 230M OpenGL Engine -NVIDIA NVIDIA GeForce GT 240M OpenGL Engine -NVIDIA NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA NVIDIA GeForce GT 330M OpenGL Engine -NVIDIA NVIDIA GeForce GT 420M OpenGL Engine -NVIDIA NVIDIA GeForce GT 425M OpenGL Engine -NVIDIA NVIDIA GeForce GT 430 OpenGL Engine -NVIDIA NVIDIA GeForce GT 430 OpenGL Engine -NVIDIA NVIDIA GeForce GT 440 OpenGL Engine -NVIDIA NVIDIA GeForce GT 540M OpenGL Engine -NVIDIA NVIDIA GeForce GTS 240 OpenGL Engine -NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA NVIDIA GeForce GTS 250 OpenGL Engine -NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine -NVIDIA NVIDIA GeForce GTS 450 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 285 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 460 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 460M OpenGL Engine -NVIDIA NVIDIA GeForce GTX 465 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 470 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA NVIDIA GeForce GTX 480 OpenGL Engine -NVIDIA NVIDIA GeForce Pre-Release GF108 ES OpenGL Engine -NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine -NVIDIA NVIDIA GeForce Pre-Release ION OpenGL Engine -NVIDIA NVIDIA GeForce Pre-Release MCP7A-J-DC OpenGL Engine -NVIDIA NVIDIA GeForce4 OpenGL Engine -NVIDIA NVIDIA NV34MAP OpenGL Engine -NVIDIA NVIDIA Quadro 4000 OpenGL Engine -NVIDIA NVIDIA Quadro 4000 OpenGL Engine -NVIDIA NVIDIA Quadro FX 4800 OpenGL Engine -NVIDIA NVS 2100M/PCI/SSE2 -NVIDIA NVS 2100M/PCI/SSE2 -NVIDIA NVS 300/PCI/SSE2 -NVIDIA NVS 300/PCI/SSE2 -NVIDIA NVS 3100M/PCI/SSE2 -NVIDIA NVS 3100M/PCI/SSE2 -NVIDIA NVS 4100/PCI/SSE2/3DNOW! -NVIDIA NVS 4200M/PCI/SSE2 -NVIDIA NVS 4200M/PCI/SSE2 -NVIDIA NVS 5100M/PCI/SSE2 -NVIDIA NVS 5100M/PCI/SSE2 NVIDIA PCI -NVIDIA Quadro 1000M/PCI/SSE2 -NVIDIA Quadro 2000/PCI/SSE2 -NVIDIA Quadro 2000/PCI/SSE2 -NVIDIA Quadro 2000M/PCI/SSE2 -NVIDIA Quadro 3000M/PCI/SSE2 +NVIDIA Quadro 2000 +NVIDIA Quadro 2000 M/D +NVIDIA Quadro 2000 M/D +NVIDIA Quadro 3000M +NVIDIA Quadro 400 +NVIDIA Quadro 4000 NVIDIA Quadro 4000 -NVIDIA Quadro 4000 OpenGL Engine -NVIDIA Quadro 4000/PCI/SSE2 -NVIDIA Quadro 4000/PCI/SSE2 -NVIDIA Quadro 4000M/PCI/SSE2 -NVIDIA Quadro 5000/PCI/SSE2 -NVIDIA Quadro 5000/PCI/SSE2 -NVIDIA Quadro 5000M/PCI/SSE2 +NVIDIA Quadro 4000M +NVIDIA Quadro 50x0 M NVIDIA Quadro 600 -NVIDIA Quadro 600/PCI/SSE2 -NVIDIA Quadro 600/PCI/SSE2 -NVIDIA Quadro 600/PCI/SSE2/3DNOW! NVIDIA Quadro 6000 -NVIDIA Quadro 6000/PCI/SSE2 -NVIDIA Quadro CX/PCI/SSE2 -NVIDIA Quadro DCC NVIDIA Quadro FX -NVIDIA Quadro FX 1100/AGP/SSE2 -NVIDIA Quadro FX 1400/PCI/SSE2 -NVIDIA Quadro FX 1400/PCI/SSE2 -NVIDIA Quadro FX 1500 -NVIDIA Quadro FX 1500/PCI/SSE2 -NVIDIA Quadro FX 1500M/PCI/SSE2 -NVIDIA Quadro FX 1600M/PCI/SSE2 -NVIDIA Quadro FX 1600M/PCI/SSE2 -NVIDIA Quadro FX 1700 -NVIDIA Quadro FX 1700M/PCI/SSE2 +NVIDIA Quadro FX 1500M NVIDIA Quadro FX 1800 -NVIDIA Quadro FX 1800/PCI/SSE2 -NVIDIA Quadro FX 1800M/PCI/SSE2 -NVIDIA Quadro FX 2500M/PCI/SSE2 -NVIDIA Quadro FX 2500M/PCI/SSE2 -NVIDIA Quadro FX 2700M/PCI/SSE2 -NVIDIA Quadro FX 2700M/PCI/SSE2 -NVIDIA Quadro FX 2800M/PCI/SSE2 -NVIDIA Quadro FX 2800M/PCI/SSE2 -NVIDIA Quadro FX 3400 -NVIDIA Quadro FX 3450 -NVIDIA Quadro FX 3450/4000 SDI/PCI/SSE2 +NVIDIA Quadro FX 2500M +NVIDIA Quadro FX 2700M +NVIDIA Quadro FX 2800M NVIDIA Quadro FX 3500 -NVIDIA Quadro FX 3500M/PCI/SSE2 -NVIDIA Quadro FX 360M/PCI/SSE2 -NVIDIA Quadro FX 370 -NVIDIA Quadro FX 370/PCI/SSE2 NVIDIA Quadro FX 3700 -NVIDIA Quadro FX 3700M/PCI/SSE2 -NVIDIA Quadro FX 3700M/PCI/SSE2 -NVIDIA Quadro FX 370M/PCI/SSE2 NVIDIA Quadro FX 3800 -NVIDIA Quadro FX 3800M/PCI/SSE2 -NVIDIA Quadro FX 3800M/PCI/SSE2 NVIDIA Quadro FX 4500 -NVIDIA Quadro FX 4600 NVIDIA Quadro FX 4800 -NVIDIA Quadro FX 4800/PCI/SSE2 -NVIDIA Quadro FX 540/PCI/SSE2/3DNOW! -NVIDIA Quadro FX 560 -NVIDIA Quadro FX 560/PCI/SSE2 -NVIDIA Quadro FX 5600 -NVIDIA Quadro FX 570 -NVIDIA Quadro FX 570/PCI/SSE2 -NVIDIA Quadro FX 570M/PCI/SSE2 -NVIDIA Quadro FX 580/PCI/SSE2 -NVIDIA Quadro FX 580/PCI/SSE2 -NVIDIA Quadro FX 770M/PCI/SSE2 -NVIDIA Quadro FX 770M/PCI/SSE2 +NVIDIA Quadro FX 550 +NVIDIA Quadro FX 770M NVIDIA Quadro FX 880M -NVIDIA Quadro FX 880M/PCI/SSE2 -NVIDIA Quadro FX 880M/PCI/SSE2 -NVIDIA Quadro FX Go700/AGP/SSE2 NVIDIA Quadro NVS -NVIDIA Quadro NVS 110M/PCI/SSE2 -NVIDIA Quadro NVS 110M/PCI/SSE2 -NVIDIA Quadro NVS 130M/PCI/SSE2 -NVIDIA Quadro NVS 135M/PCI/SSE2 -NVIDIA Quadro NVS 135M/PCI/SSE2 -NVIDIA Quadro NVS 140M/PCI/SSE2 -NVIDIA Quadro NVS 140M/PCI/SSE2 -NVIDIA Quadro NVS 150M/PCI/SSE2 -NVIDIA Quadro NVS 150M/PCI/SSE2 -NVIDIA Quadro NVS 160M/PCI/SSE2 -NVIDIA Quadro NVS 160M/PCI/SSE2 -NVIDIA Quadro NVS 210S/PCI/SSE2/3DNOW! -NVIDIA Quadro NVS 285/PCI/SSE2 -NVIDIA Quadro NVS 285/PCI/SSE2 -NVIDIA Quadro NVS 290/PCI/SSE2 -NVIDIA Quadro NVS 290/PCI/SSE2 -NVIDIA Quadro NVS 295/PCI/SSE2 -NVIDIA Quadro NVS 320M/PCI/SSE2 -NVIDIA Quadro NVS 320M/PCI/SSE2 -NVIDIA Quadro NVS 55/280 PCI/PCI/SSE2 -NVIDIA Quadro NVS/PCI/SSE2 -NVIDIA Quadro PCI-E Series/PCI/SSE2/3DNOW! -NVIDIA Quadro VX 200/PCI/SSE2 -NVIDIA Quadro VX 200/PCI/SSE2 -NVIDIA Quadro/AGP/SSE2 -NVIDIA Quadro/AGP/SSE2 +NVIDIA Quadro NVS 1xxM +NVIDIA Quadro NVS 4200M NVIDIA Quadro2 -NVIDIA Quadro4 -NVIDIA Quadro4 750 XGL/AGP/SSE2 -NVIDIA RIVA TNT -NVIDIA RIVA TNT2/AGP/SSE2 -NVIDIA RIVA TNT2/PCI/3DNOW! -NVIDIA Tesla C2050/PCI/SSE2 NVIDIA nForce -NVIDIA nForce 730a/PCI/SSE2 -NVIDIA nForce 730a/PCI/SSE2/3DNOW! -NVIDIA nForce 750a SLI/PCI/SSE2 -NVIDIA nForce 750a SLI/PCI/SSE2/3DNOW! -NVIDIA nForce 760i SLI/PCI/SSE2 -NVIDIA nForce 780a SLI/PCI/SSE2/3DNOW! -NVIDIA nForce 980a/780a SLI/PCI/SSE2 -NVIDIA nForce 980a/780a SLI/PCI/SSE2/3DNOW! -NVIDIA unknown board/AGP/SSE2 -NVIDIA unknown board/PCI/SSE2 -NVIDIA unknown board/PCI/SSE2/3DNOW! -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine +Oracle VirtualBox Graphics +Parallels and ATI Technologies Inc. Parallels using ATI Radeon Barts XT Prototype OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 2600 PRO OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4670 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 4850 OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5670 OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5750 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 5770 OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6490M OpenGL Engine -Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6630M OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6750M OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6770M OpenGL Engine Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine -Parallels and Intel Inc. 3D-Analyze v2.3 - http://www.tommti-systems.com -Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon HD 6970M OpenGL Engine +Parallels and ATI Technologies Inc. Parallels using ATI Radeon X1600 OpenGL Engine +Parallels and Intel Inc. Parallels using Intel GMA X3100 OpenGL Engine Parallels and Intel Inc. Parallels using Intel HD Graphics 3000 OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce 320M OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce 9400 OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 120 OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine -Parallels and NVIDIA Parallels using NVIDIA GeForce GT 330M OpenGL Engine -Radeon RV350 on Gallium +Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine +Parallels and Intel Inc. Parallels using Intel HD Graphics 4000 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 320M OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 8800 GS OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9400M OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce 9600M GT OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 130 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 330M OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 640M OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GT 650M OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 570 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 660 Ti OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 670 OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine +Parallels and NVIDIA Corporation Parallels using NVIDIA GeForce GTX 680MX OpenGL Engine +PowerVR SGX545 S3 -S3 Fire GL2 -S3 Graphics VIA/S3G UniChrome IGP/MMX/K3D +S3 Graphics K8M800/MMX/K3D +S3 Graphics KM400/KN400/MMX/SSE +S3 Graphics P8M800/MMX/SSE +S3 Graphics Unknown Device/MMX/SSE S3 Graphics VIA/S3G UniChrome IGP/MMX/SSE S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE S3 Graphics VIA/S3G UniChrome Pro IGP/MMX/SSE S3 Graphics, Incorporated ProSavage/Twister S3 Graphics, Incorporated S3 Graphics Chrome9 HC -S3 Graphics, Incorporated S3 Graphics Chrome9 HC -S3 Graphics, Incorporated S3 Graphics DeltaChrome S3 Graphics, Incorporated S3 Graphics DeltaChrome S3 Graphics, Incorporated VIA Chrome9 HC IGP S3 Graphics, Incorporated VIA Chrome9 HC IGP +S3 Graphics, Incorporated VIA Chrome9 HC3 IGP +S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP +S3 Graphics, Incorporated VIA Chrome9 HD Pro IGP SiS +SiS 3D-Analyze v2.3 - http://www.tommti-systems.com SiS 650/M650 VGA -SiS 661 VGA +SiS 650/M650 VGA / MMX/SSE2 /AGP SiS 661 VGA SiS 662 VGA -SiS 741 VGA -SiS 760 VGA SiS 760 VGA SiS 761GX VGA -SiS 761GX VGA SiS Mirage Graphics3 SiS Mirage Graphics3 SiS Xabre VGA -Trident -Tungsten Graphics -Tungsten Graphics, Inc Mesa DRI 865G GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 865G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915G GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 915GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945G -Tungsten Graphics, Inc Mesa DRI 945G GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT -Tungsten Graphics, Inc Mesa DRI 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100328 2010Q1 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GME x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GME 20061017 -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 945GME GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090326 2009Q1 RC2 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI 965GM GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G33 20061017 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G33 GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G33 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G41 GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI GMA500 20081116 - 5.0.1.0046 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI IGD GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT -Tungsten Graphics, Inc Mesa DRI IGD GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI IGDNG_D GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Ironlake Desktop GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 845G +Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 865G +Tungsten Graphics, Inc Mesa DRI Intel(R) 865G x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 915G +Tungsten Graphics, Inc Mesa DRI Intel(R) 915G x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM 20061017 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 915GM x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945G x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GM x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 945GME x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GM x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965GME/GLE x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) 965Q x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G33 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G33 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) G41 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGD x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 +Tungsten Graphics, Inc Mesa DRI Intel(R) IGDNG_M GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Desktop x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ironlake Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Desktop x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Q35 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Q45/Q43 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile GEM 20100330 DEVELOPMENT x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Intel(R) Sandybridge Server Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset 20080716 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20090712 2009Q2 RC3 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20091221 2009Q4 x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100328 2010Q1 -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset GEM 20100330 DEVELOPMENT x86/MMX/SSE2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) 20090101 x86/MMX/SSE2 TCL DRI2 -Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5964) 20090101 x86/MMX+/3DNow!+/SSE2 TCL DRI2 -VIA +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset x86/MMX/SSE2 +Tungsten Graphics, Inc Mesa DRI Mobile Intelå¨ GM45 Express Chipset x86/MMX/SSE2 +Tungsten Graphics, Inc. Mesa DRI R100 (RS200 4437) x86/MMX/SSE2 NO-TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R100 (RV200 4C57) x86/MMX/SSE2 TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV250 4C66) x86/MMX/SSE2 TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX+/3DNow!+/SSE2 TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5960) x86/MMX/SSE2 TCL DRI2 +Tungsten Graphics, Inc. Mesa DRI R200 (RV280 5961) x86/MMX/SSE2 TCL DRI2 VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; VMware, Inc. Gallium 0.3 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on SVGA3D; build: DEBUG; mutex: MSVC Intrinsics VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) -VMware, Inc. Gallium 0.4 on i915 (chipset: 945GM) -VMware, Inc. Gallium 0.4 on llvmpipe +VMware, Inc. Gallium 0.4 on SVGA3D; build: RELEASE; +VMware, Inc. Gallium 0.4 on i915 (chipset: 945GME) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x209) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x300) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x301) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 0x302) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.2, 256 bits) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) +VMware, Inc. Gallium 0.4 on llvmpipe (LLVM 3.3, 128 bits) VMware, Inc. Gallium 0.4 on llvmpipe -VMware, Inc. Gallium 0.4 on softpipe -VMware, Inc. Gallium 0.4 on softpipe +X.Org Gallium 0.4 on AMD ARUBA +X.Org Gallium 0.4 on AMD ARUBA X.Org Gallium 0.4 on AMD BARTS X.Org Gallium 0.4 on AMD BARTS +X.Org Gallium 0.4 on AMD CAICOS +X.Org Gallium 0.4 on AMD CAPE VERDE X.Org Gallium 0.4 on AMD CEDAR -X.Org Gallium 0.4 on AMD CEDAR -X.Org Gallium 0.4 on AMD HEMLOCK -X.Org Gallium 0.4 on AMD JUNIPER +X.Org Gallium 0.4 on AMD CYPRESS X.Org Gallium 0.4 on AMD JUNIPER X.Org Gallium 0.4 on AMD PALM +X.Org Gallium 0.4 on AMD PALM X.Org Gallium 0.4 on AMD REDWOOD X.Org Gallium 0.4 on AMD REDWOOD X.Org Gallium 0.4 on AMD RS780 X.Org Gallium 0.4 on AMD RS780 X.Org Gallium 0.4 on AMD RS880 -X.Org Gallium 0.4 on AMD RS880 X.Org Gallium 0.4 on AMD RV610 X.Org Gallium 0.4 on AMD RV610 X.Org Gallium 0.4 on AMD RV620 -X.Org Gallium 0.4 on AMD RV620 X.Org Gallium 0.4 on AMD RV630 -X.Org Gallium 0.4 on AMD RV630 -X.Org Gallium 0.4 on AMD RV635 X.Org Gallium 0.4 on AMD RV635 +X.Org Gallium 0.4 on AMD RV670 X.Org Gallium 0.4 on AMD RV710 X.Org Gallium 0.4 on AMD RV710 X.Org Gallium 0.4 on AMD RV730 X.Org Gallium 0.4 on AMD RV730 X.Org Gallium 0.4 on AMD RV740 -X.Org Gallium 0.4 on AMD RV740 X.Org Gallium 0.4 on AMD RV770 -X.Org R300 Project Gallium 0.4 on ATI R300 +X.Org Gallium 0.4 on AMD SUMO +X.Org Gallium 0.4 on AMD SUMO +X.Org Gallium 0.4 on AMD SUMO2 +X.Org Gallium 0.4 on AMD TURKS X.Org R300 Project Gallium 0.4 on ATI R350 -X.Org R300 Project Gallium 0.4 on ATI R420 -X.Org R300 Project Gallium 0.4 on ATI R580 X.Org R300 Project Gallium 0.4 on ATI R580 X.Org R300 Project Gallium 0.4 on ATI RC410 -X.Org R300 Project Gallium 0.4 on ATI RC410 X.Org R300 Project Gallium 0.4 on ATI RS480 -X.Org R300 Project Gallium 0.4 on ATI RS482 +X.Org R300 Project Gallium 0.4 on ATI RS480 X.Org R300 Project Gallium 0.4 on ATI RS482 X.Org R300 Project Gallium 0.4 on ATI RS600 X.Org R300 Project Gallium 0.4 on ATI RS690 -X.Org R300 Project Gallium 0.4 on ATI RS690 -X.Org R300 Project Gallium 0.4 on ATI RS740 X.Org R300 Project Gallium 0.4 on ATI RV350 X.Org R300 Project Gallium 0.4 on ATI RV350 X.Org R300 Project Gallium 0.4 on ATI RV370 -X.Org R300 Project Gallium 0.4 on ATI RV370 -X.Org R300 Project Gallium 0.4 on ATI RV410 +X.Org R300 Project Gallium 0.4 on ATI RV380 X.Org R300 Project Gallium 0.4 on ATI RV410 X.Org R300 Project Gallium 0.4 on ATI RV515 -X.Org R300 Project Gallium 0.4 on ATI RV515 X.Org R300 Project Gallium 0.4 on ATI RV530 X.Org R300 Project Gallium 0.4 on ATI RV530 -X.Org R300 Project Gallium 0.4 on ATI RV560 -X.Org R300 Project Gallium 0.4 on ATI RV570 X.Org R300 Project Gallium 0.4 on ATI RV570 -X.Org R300 Project Gallium 0.4 on R420 -X.Org R300 Project Gallium 0.4 on R580 -X.Org R300 Project Gallium 0.4 on RC410 -X.Org R300 Project Gallium 0.4 on RS480 -X.Org R300 Project Gallium 0.4 on RS482 -X.Org R300 Project Gallium 0.4 on RS600 -X.Org R300 Project Gallium 0.4 on RS690 -X.Org R300 Project Gallium 0.4 on RS740 -X.Org R300 Project Gallium 0.4 on RV350 -X.Org R300 Project Gallium 0.4 on RV370 -X.Org R300 Project Gallium 0.4 on RV410 -X.Org R300 Project Gallium 0.4 on RV515 -X.Org R300 Project Gallium 0.4 on RV530 -XGI -nouveau Gallium 0.4 on NV31 +XGI Volari V3 +http://TitaniumGL.tk NVIDIA GeForce GTX 690/3999M VRAM/TitaniumGL/4 THREADs/3D GRAPHICS ACCELERATION/4 TMUs nouveau Gallium 0.4 on NV34 nouveau Gallium 0.4 on NV34 -nouveau Gallium 0.4 on NV36 -nouveau Gallium 0.4 on NV43 +nouveau Gallium 0.4 on NV42 +nouveau Gallium 0.4 on NV42 +nouveau Gallium 0.4 on NV44 nouveau Gallium 0.4 on NV44 -nouveau Gallium 0.4 on NV46 nouveau Gallium 0.4 on NV46 nouveau Gallium 0.4 on NV49 nouveau Gallium 0.4 on NV4A @@ -2393,6 +4176,7 @@ nouveau Gallium 0.4 on NV4A nouveau Gallium 0.4 on NV4B nouveau Gallium 0.4 on NV4B nouveau Gallium 0.4 on NV4C +nouveau Gallium 0.4 on NV4C nouveau Gallium 0.4 on NV4E nouveau Gallium 0.4 on NV50 nouveau Gallium 0.4 on NV63 @@ -2412,6 +4196,7 @@ nouveau Gallium 0.4 on NV98 nouveau Gallium 0.4 on NVA0 nouveau Gallium 0.4 on NVA0 nouveau Gallium 0.4 on NVA3 +nouveau Gallium 0.4 on NVA3 nouveau Gallium 0.4 on NVA5 nouveau Gallium 0.4 on NVA5 nouveau Gallium 0.4 on NVA8 @@ -2420,3 +4205,21 @@ nouveau Gallium 0.4 on NVAA nouveau Gallium 0.4 on NVAA nouveau Gallium 0.4 on NVAC nouveau Gallium 0.4 on NVAC +nouveau Gallium 0.4 on NVAF +nouveau Gallium 0.4 on NVC0 +nouveau Gallium 0.4 on NVC0 +nouveau Gallium 0.4 on NVC1 +nouveau Gallium 0.4 on NVC1 +nouveau Gallium 0.4 on NVC3 +nouveau Gallium 0.4 on NVC4 +nouveau Gallium 0.4 on NVC4 +nouveau Gallium 0.4 on NVCE +nouveau Gallium 0.4 on NVCE +nouveau Gallium 0.4 on NVCF +nouveau Gallium 0.4 on NVCF +nouveau Gallium 0.4 on NVD9 +nouveau Gallium 0.4 on NVD9 +nouveau Gallium 0.4 on NVE4 +nouveau Gallium 0.4 on NVE6 +nouveau Gallium 0.4 on NVE7 +nouveau Gallium 0.4 on NVE7 diff --git a/indra/newview/tests/gpus_unmatched.txt b/indra/newview/tests/gpus_unmatched.txt new file mode 100644 index 0000000000..083f29aaa0 --- /dev/null +++ b/indra/newview/tests/gpus_unmatched.txt @@ -0,0 +1,9 @@ +ATI NO MATCH +ATI Technologies NO MATCH +ATI Technologies Inc. NO MATCH +ATI Technologies Inc. (DNA-ATi 5.1.7.5x32) ATI Mobility Radeon HD 2 NO MATCH +ATI Technologies Inc. ATI Mobility Radeon Graphics NO MATCH +ATI Technologies Inc. ATI Radeon Graphics Processor NO MATCH +Intel NO MATCH +NVIDIA Corporation /PCI/SSE2 NO MATCH +NVIDIA Corporation Quadro PCI-E Series/PCI/SSE2 NO MATCH diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp index fd9527d631..8ce56326d8 100755 --- a/indra/newview/tests/lltranslate_test.cpp +++ b/indra/newview/tests/lltranslate_test.cpp @@ -308,8 +308,8 @@ void LLCurl::Responder::errorWithContent(U32, std::string const&, LLSD const&) { void LLCurl::Responder::result(LLSD const&) {} LLCurl::Responder::~Responder() {} -void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32) {} -void LLHTTPClient::get(const std::string&, LLPointer<LLCurl::Responder>, const LLSD&, const F32) {} +void LLHTTPClient::get(const std::string&, const LLSD&, ResponderPtr, const LLSD&, const F32, bool) {} +void LLHTTPClient::get(const std::string&, LLPointer<LLCurl::Responder>, const LLSD&, const F32, bool) {} LLBufferStream::LLBufferStream(const LLChannelDescriptors& channels, LLBufferArray* buffer) : std::iostream(&mStreamBuf), mStreamBuf(channels, buffer) {} diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 19863dd845..f7b3a45e8d 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -7,7 +7,7 @@ $LicenseInfo:firstyear=2006&license=viewerlgpl$ Second Life Viewer Source Code -Copyright (C) 2006-2011, Linden Research, Inc. +Copyright (C) 2006-2014, Linden Research, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -38,7 +38,7 @@ viewer_dir = os.path.dirname(__file__) # Put it FIRST because some of our build hosts have an ancient install of # indra.util.llmanifest under their system Python! sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python")) -from indra.util.llmanifest import LLManifest, main, proper_windows_path, path_ancestors +from indra.util.llmanifest import LLManifest, main, proper_windows_path, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError try: from llbase import llsd except ImportError: @@ -104,26 +104,43 @@ class ViewerManifest(LLManifest): self.path("dictionaries") self.end_prefix(pkgdir) - # CHOP-955: If we have "sourceid" in the build process - # environment, generate it into settings_install.xml. - try: - sourceid = os.environ["sourceid"] - except KeyError: - # no sourceid, no settings_install.xml file - pass - else: - if sourceid: - # Single-entry subset of the LLSD content of settings.xml - content = dict(sourceid=dict(Comment='Identify referring agency to Linden web servers', - Persist=1, - Type='String', - Value=sourceid)) - # put_in_file(src=) need not be an actual pathname; it - # only needs to be non-empty - settings_install = self.put_in_file(llsd.format_pretty_xml(content), - "settings_install.xml", - src="environment") - print "Put sourceid '%s' in %s" % (sourceid, settings_install) + # CHOP-955: If we have "sourceid" or "viewer_channel" in the + # build process environment, generate it into + # settings_install.xml. + settings_template = dict( + sourceid=dict(Comment='Identify referring agency to Linden web servers', + Persist=1, + Type='String', + Value=''), + CmdLineGridChoice=dict(Comment='Default grid', + Persist=0, + Type='String', + Value=''), + CmdLineChannel=dict(Comment='Command line specified channel name', + Persist=0, + Type='String', + Value='')) + settings_install = {} + if 'sourceid' in self.args and self.args['sourceid']: + settings_install['sourceid'] = settings_template['sourceid'].copy() + settings_install['sourceid']['Value'] = self.args['sourceid'] + print "Set sourceid in settings_install.xml to '%s'" % self.args['sourceid'] + + if 'channel_suffix' in self.args and self.args['channel_suffix']: + settings_install['CmdLineChannel'] = settings_template['CmdLineChannel'].copy() + settings_install['CmdLineChannel']['Value'] = self.channel_with_pkg_suffix() + print "Set CmdLineChannel in settings_install.xml to '%s'" % self.channel_with_pkg_suffix() + + if 'grid' in self.args and self.args['grid']: + settings_install['CmdLineGridChoice'] = settings_template['CmdLineGridChoice'].copy() + settings_install['CmdLineGridChoice']['Value'] = self.grid() + print "Set CmdLineGridChoice in settings_install.xml to '%s'" % self.grid() + + # put_in_file(src=) need not be an actual pathname; it + # only needs to be non-empty + self.put_in_file(llsd.format_pretty_xml(settings_install), + "settings_install.xml", + src="environment") self.end_prefix("app_settings") @@ -186,62 +203,72 @@ class ViewerManifest(LLManifest): def grid(self): return self.args['grid'] + def channel(self): return self.args['channel'] - def channel_unique(self): - return self.channel().replace("Second Life", "").strip() - def channel_oneword(self): - return "".join(self.channel_unique().split()) - def channel_lowerword(self): - return self.channel_oneword().lower() + + def channel_with_pkg_suffix(self): + fullchannel=self.channel() + if 'channel_suffix' in self.args and self.args['channel_suffix']: + fullchannel+=' '+self.args['channel_suffix'] + return fullchannel + + def channel_variant(self): + global CHANNEL_VENDOR_BASE + return self.channel().replace(CHANNEL_VENDOR_BASE, "").strip() + + def channel_type(self): # returns 'release', 'beta', 'project', or 'test' + global CHANNEL_VENDOR_BASE + channel_qualifier=self.channel().replace(CHANNEL_VENDOR_BASE, "").lower().strip() + if channel_qualifier.startswith('release'): + channel_type='release' + elif channel_qualifier.startswith('beta'): + channel_type='beta' + elif channel_qualifier.startswith('project'): + channel_type='project' + else: + channel_type='test' + return channel_type + + def channel_variant_app_suffix(self): + # get any part of the compiled channel name after the CHANNEL_VENDOR_BASE + suffix=self.channel_variant() + # by ancient convention, we don't use Release in the app name + if self.channel_type() == 'release': + suffix=suffix.replace('Release', '').strip() + # for the base release viewer, suffix will now be null - for any other, append what remains + if len(suffix) > 0: + suffix = "_"+ ("_".join(suffix.split())) + # the additional_packages mechanism adds more to the installer name (but not to the app name itself) + if 'channel_suffix' in self.args and self.args['channel_suffix']: + suffix+='_'+("_".join(self.args['channel_suffix'].split())) + return suffix + + def installer_base_name(self): + global CHANNEL_VENDOR_BASE + # a standard map of strings for replacing in the templates + substitution_strings = { + 'channel_vendor_base' : '_'.join(CHANNEL_VENDOR_BASE.split()), + 'channel_variant_underscores':self.channel_variant_app_suffix(), + 'version_underscores' : '_'.join(self.args['version']), + 'arch':self.args['arch'] + } + return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_%(arch)s" % substitution_strings def app_name(self): - app_suffix='Test' - channel_type=self.channel_lowerword() - if channel_type.startswith('release') : + global CHANNEL_VENDOR_BASE + channel_type=self.channel_type() + if channel_type == 'release': app_suffix='Viewer' - elif re.match('^(beta|project).*',channel_type) : - app_suffix=self.channel_unique() - return "Second Life "+app_suffix - + else: + app_suffix=self.channel_variant() + return CHANNEL_VENDOR_BASE + ' ' + app_suffix + + def app_name_oneword(self): + return ''.join(self.app_name().split()) + def icon_path(self): - icon_path="icons/" - channel_type=self.channel_lowerword() - print "Icon channel type '%s'" % channel_type - if channel_type.startswith('release') : - icon_path += 'release' - elif re.match('^beta.*',channel_type) : - icon_path += 'beta' - elif re.match('^project.*',channel_type) : - icon_path += 'project' - else : - icon_path += 'test' - return icon_path - - def flags_list(self): - """ Convenience function that returns the command-line flags - for the grid""" - - # The original role of this method seems to have been to build a - # grid-specific viewer: one that would, on launch, preselect a - # particular grid. (Apparently that dates back to when the protocol - # between viewer and simulator required them to be updated in - # lockstep, so that "the beta grid" required "a beta viewer.") But - # those viewer command-line switches no longer work without tweaking - # user_settings/grids.xml. In fact, going forward, it's unclear what - # use case that would address. - - # This method also set a channel-specific (or grid-and-channel- - # specific) user_settings/settings_something.xml file. It has become - # clear that saving user settings in a channel-specific file causes - # more problems (confusion) than it solves, so we've discontinued that. - - # In fact we now avoid forcing viewer command-line switches at all, - # instead introducing a settings_install.xml file. Command-line - # switches don't aggregate well; for instance the generated --channel - # switch actually prevented the user specifying --channel on the - # command line. Settings files have well-defined override semantics. - return None + return "icons/" + self.channel_type() def extract_names(self,src): try: @@ -266,15 +293,9 @@ class ViewerManifest(LLManifest): random.shuffle(names) return ', '.join(names) -class WindowsManifest(ViewerManifest): +class Windows_i686_Manifest(ViewerManifest): def final_exe(self): - app_suffix="Test" - channel_type=self.channel_lowerword() - if channel_type.startswith('release') : - app_suffix='' - elif re.match('^(beta|project).*',channel_type) : - app_suffix=''.join(self.channel_unique().split()) - return "SecondLife"+app_suffix+".exe" + return self.app_name_oneword()+".exe" def test_msvcrt_and_copy_action(self, src, dst): # This is used to test a dll manifest. @@ -323,7 +344,7 @@ class WindowsManifest(ViewerManifest): print "Doesn't exist:", src def construct(self): - super(WindowsManifest, self).construct() + super(Windows_i686_Manifest, self).construct() if self.is_packaging_viewer(): # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. @@ -556,62 +577,33 @@ class WindowsManifest(ViewerManifest): 'version_short' : '.'.join(self.args['version'][:-1]), 'version_dashes' : '-'.join(self.args['version']), 'final_exe' : self.final_exe(), - 'grid':self.args['grid'], - 'grid_caps':self.args['grid'].upper(), 'flags':'', - 'channel':self.channel(), - 'channel_oneword':self.channel_oneword(), - 'channel_unique':self.channel_unique(), - 'subchannel_underscores':'_'.join(self.channel_unique().split()) + 'app_name':self.app_name(), + 'app_name_oneword':self.app_name_oneword() } + installer_file = self.installer_base_name() + '_Setup.exe' + substitution_strings['installer_file'] = installer_file + version_vars = """ !define INSTEXE "%(final_exe)s" !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" """ % substitution_strings - if self.default_channel(): - if self.default_grid(): - # release viewer - installer_file = "Second_Life_%(version_dashes)s_Setup.exe" - grid_vars_template = """ - OutFile "%(installer_file)s" - !define INSTFLAGS "%(flags)s" - !define INSTNAME "SecondLifeViewer" - !define SHORTCUT "Second Life Viewer" - !define URLNAME "secondlife" - Caption "Second Life" - """ - else: - # alternate grid viewer - installer_file = "Second_Life_%(version_dashes)s_(%(grid_caps)s)_Setup.exe" - grid_vars_template = """ - OutFile "%(installer_file)s" - !define INSTFLAGS "%(flags)s" - !define INSTNAME "SecondLife%(grid_caps)s" - !define SHORTCUT "Second Life (%(grid_caps)s)" - !define URLNAME "secondlife%(grid)s" - !define UNINSTALL_SETTINGS 1 - Caption "Second Life %(grid)s ${VERSION}" - """ + + if self.channel_type() == 'release': + substitution_strings['caption'] = CHANNEL_VENDOR_BASE else: - # some other channel (grid name not used) - installer_file = "Second_Life_%(version_dashes)s_%(subchannel_underscores)s_Setup.exe" - grid_vars_template = """ + substitution_strings['caption'] = self.app_name() + ' ${VERSION}' + + inst_vars_template = """ OutFile "%(installer_file)s" - !define INSTFLAGS "%(flags)s" - !define INSTNAME "SecondLife%(channel_oneword)s" - !define SHORTCUT "%(channel)s" + !define INSTNAME "%(app_name_oneword)s" + !define SHORTCUT "%(app_name)s" !define URLNAME "secondlife" - !define UNINSTALL_SETTINGS 1 - Caption "%(channel)s ${VERSION}" + Caption "%(caption)s" """ - if 'installer_name' in self.args: - installer_file = self.args['installer_name'] - else: - installer_file = installer_file % substitution_strings - substitution_strings['installer_file'] = installer_file tempfile = "secondlife_setup_tmp.nsi" # the following replaces strings in the nsi template @@ -619,7 +611,7 @@ class WindowsManifest(ViewerManifest): self.replace_in("installers/windows/installer_template.nsi", tempfile, { "%%VERSION%%":version_vars, "%%SOURCE%%":self.get_src_prefix(), - "%%GRID_VARS%%":grid_vars_template % substitution_strings, + "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), "%%DELETE_FILES%%":self.nsi_file_commands(False)}) @@ -630,7 +622,22 @@ class WindowsManifest(ViewerManifest): NSIS_path = os.path.expandvars('${ProgramFiles}\\NSIS\\Unicode\\makensis.exe') if not os.path.exists(NSIS_path): NSIS_path = os.path.expandvars('${ProgramFiles(x86)}\\NSIS\\Unicode\\makensis.exe') - self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) + installer_created=False + nsis_attempts=3 + nsis_retry_wait=15 + while (not installer_created) and (nsis_attempts > 0): + try: + nsis_attempts-=1; + self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile)) + installer_created=True # if no exception was raised, the codesign worked + except ManifestError, err: + if nsis_attempts: + print >> sys.stderr, "nsis failed, waiting %d seconds before retrying" % nsis_retry_wait + time.sleep(nsis_retry_wait) + nsis_retry_wait*=2 + else: + print >> sys.stderr, "Maximum nsis attempts exceeded; giving up" + raise # self.remove(self.dst_path_of(tempfile)) # If we're on a build machine, sign the code using our Authenticode certificate. JC sign_py = os.path.expandvars("${SIGN}") @@ -649,7 +656,7 @@ class WindowsManifest(ViewerManifest): self.package_file = installer_file -class DarwinManifest(ViewerManifest): +class Darwin_i386_Manifest(ViewerManifest): def is_packaging_viewer(self): # darwin requires full app bundle packaging even for debugging. return True @@ -671,7 +678,7 @@ class DarwinManifest(ViewerManifest): # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): - super(DarwinManifest, self).construct() + super(Darwin_i386_Manifest, self).construct() if self.prefix("cursors_mac"): self.path("*.tif") @@ -742,7 +749,6 @@ class DarwinManifest(ViewerManifest): "libcollada14dom.dylib", "libexpat.1.5.2.dylib", "libexception_handler.dylib", - "libfmodex.dylib", "libGLOD.dylib", ): dylibs += path_optional(os.path.join(libdir, libfile), libfile) @@ -758,6 +764,20 @@ class DarwinManifest(ViewerManifest): 'SLVoice', ): self.path2basename(libdir, libfile) + + # dylibs that vary based on configuration + if self.args['configuration'].lower() == 'debug': + for libfile in ( + "libfmodexL.dylib", + ): + dylibs += path_optional(os.path.join("../packages/lib/debug", + libfile), libfile) + else: + for libfile in ( + "libfmodex.dylib", + ): + dylibs += path_optional(os.path.join("../packages/lib/release", + libfile), libfile) # our apps for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"), @@ -807,6 +827,7 @@ class DarwinManifest(ViewerManifest): self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) def package_finish(self): + global CHANNEL_VENDOR_BASE # Sign the app if requested. if 'signature' in self.args: identity = self.args['signature'] @@ -825,33 +846,43 @@ class DarwinManifest(ViewerManifest): keychain_pwd = open(keychain_pwd_path).read().rstrip() self.run_command('security unlock-keychain -p "%s" "%s/Library/Keychains/viewer.keychain"' % ( keychain_pwd, home_path ) ) - self.run_command('codesign --verbose --force --keychain "%(home_path)s/Library/Keychains/viewer.keychain" --sign %(identity)r %(bundle)r' % { - 'home_path' : home_path, - 'identity': identity, - 'bundle': self.get_dst_prefix() - }) + signed=False + sign_attempts=3 + sign_retry_wait=15 + while (not signed) and (sign_attempts > 0): + try: + sign_attempts-=1; + self.run_command( + 'codesign --verbose --force --keychain "%(home_path)s/Library/Keychains/viewer.keychain" --sign %(identity)r %(bundle)r' % { + 'home_path' : home_path, + 'identity': identity, + 'bundle': self.get_dst_prefix() + }) + signed=True # if no exception was raised, the codesign worked + except ManifestError, err: + if sign_attempts: + print >> sys.stderr, "codesign failed, waiting %d seconds before retrying" % sign_retry_wait + time.sleep(sign_retry_wait) + sign_retry_wait*=2 + else: + print >> sys.stderr, "Maximum codesign attempts exceeded; giving up" + raise imagename="SecondLife_" + '_'.join(self.args['version']) # MBW -- If the mounted volume name changes, it breaks the .DS_Store's background image and icon positioning. # If we really need differently named volumes, we'll need to create multiple DS_Store file images, or use some other trick. - volname="Second Life Installer" # DO NOT CHANGE without understanding comment above + volname=CHANNEL_VENDOR_BASE+" Installer" # DO NOT CHANGE without understanding comment above - if self.default_channel(): - if not self.default_grid(): - # beta case - imagename = imagename + '_' + self.args['grid'].upper() - else: - # first look, etc - imagename = imagename + '_' + self.channel_oneword().upper() + imagename = self.installer_base_name() sparsename = imagename + ".sparseimage" finalname = imagename + ".dmg" # make sure we don't have stale files laying about self.remove(sparsename, finalname) - self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 700 -layout SPUD' % { + self.run_command('hdiutil create %(sparse)r -volname %(vol)r -fs HFS+ -type SPARSE -megabytes 1000 -layout SPUD' % { 'sparse':sparsename, 'vol':volname}) @@ -878,7 +909,7 @@ class DarwinManifest(ViewerManifest): # will use the release .DS_Store, and will look broken. # - Ambroff 2008-08-20 dmg_template = os.path.join( - 'installers', 'darwin', '%s-dmg' % self.channel_lowerword()) + 'installers', 'darwin', '%s-dmg' % self.channel_type()) if not os.path.exists (self.src_path_of(dmg_template)): dmg_template = os.path.join ('installers', 'darwin', 'release-dmg') @@ -926,6 +957,7 @@ class DarwinManifest(ViewerManifest): print "Converting temp disk image to final disk image" self.run_command('hdiutil convert %(sparse)r -format UDZO -imagekey zlib-level=9 -o %(final)r' % {'sparse':sparsename, 'final':finalname}) + self.run_command('hdiutil internet-enable -yes %(final)r' % {'final':finalname}) # get rid of the temp file self.package_file = finalname self.remove(sparsename) @@ -960,8 +992,9 @@ class LinuxManifest(ViewerManifest): # recurse self.end_prefix("res-sdl") - # Get the icons based on the channel + # Get the icons based on the channel type icon_path = self.icon_path() + print "DEBUG: icon_path '%s'" % icon_path if self.prefix(src=icon_path, dst="") : self.path("secondlife_256.png","secondlife_icon.png") if self.prefix(src="",dst="res-sdl") : @@ -987,17 +1020,7 @@ class LinuxManifest(ViewerManifest): self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) def package_finish(self): - if 'installer_name' in self.args: - installer_name = self.args['installer_name'] - else: - installer_name_components = ['SecondLife_', self.args.get('arch')] - installer_name_components.extend(self.args['version']) - installer_name = "_".join(installer_name_components) - if self.default_channel(): - if not self.default_grid(): - installer_name += '_' + self.args['grid'].upper() - else: - installer_name += '_' + self.channel_oneword().upper() + installer_name = self.installer_base_name() self.strip_binaries() @@ -1039,9 +1062,9 @@ class LinuxManifest(ViewerManifest): print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" self.run_command(r"find %(d)r/bin %(d)r/lib -type f \! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure -class Linux_i686Manifest(LinuxManifest): +class Linux_i686_Manifest(LinuxManifest): def construct(self): - super(Linux_i686Manifest, self).construct() + super(Linux_i686_Manifest, self).construct() if self.prefix("../packages/lib/release", dst="lib"): self.path("libapr-1.so") @@ -1127,9 +1150,9 @@ class Linux_i686Manifest(LinuxManifest): self.strip_binaries() -class Linux_x86_64Manifest(LinuxManifest): +class Linux_x86_64_Manifest(LinuxManifest): def construct(self): - super(Linux_x86_64Manifest, self).construct() + super(Linux_x86_64_Manifest, self).construct() # support file for valgrind debug tool self.path("secondlife-i686.supp") diff --git a/indra/test_apps/llfbconnecttest/CMakeLists.txt b/indra/test_apps/llfbconnecttest/CMakeLists.txt new file mode 100644 index 0000000000..f56329a010 --- /dev/null +++ b/indra/test_apps/llfbconnecttest/CMakeLists.txt @@ -0,0 +1,304 @@ +# -*- cmake -*- +project(llfbconnecttest) + +include(00-Common) +include(FindOpenGL) +include(LLCommon) +include(LLPlugin) +include(Linking) +include(LLSharedLibs) +include(PluginAPI) +include(LLImage) +include(LLMath) +include(LLMessage) +include(LLRender) +include(LLWindow) +include(Glut) +include(Glui) + +include_directories( + ${LLPLUGIN_INCLUDE_DIRS} + ${LLCOMMON_INCLUDE_DIRS} + ${LLIMAGE_INCLUDE_DIRS} + ${LLMATH_INCLUDE_DIRS} + ${LLMESSAGE_INCLUDE_DIRS} + ${LLRENDER_INCLUDE_DIRS} + ${LLWINDOW_INCLUDE_DIRS} +) + +if (DARWIN) + include(CMakeFindFrameworks) + find_library(COREFOUNDATION_LIBRARY CoreFoundation) +endif (DARWIN) + +### llfbconnecttest + +set(llfbconnecttest_SOURCE_FILES + llfbconnecttest.cpp + llfbconnecttest.h + bookmarks.txt + ) + +add_executable(llfbconnecttest + WIN32 + MACOSX_BUNDLE + ${llfbconnecttest_SOURCE_FILES} +) + +set_target_properties(llfbconnecttest + PROPERTIES + WIN32_EXECUTABLE + FALSE +) + +target_link_libraries(llfbconnecttest + ${GLUT_LIBRARY} + ${GLUI_LIBRARY} + ${OPENGL_LIBRARIES} + ${LLPLUGIN_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLCOMMON_LIBRARIES} + ${PLUGIN_API_WINDOWS_LIBRARIES} +) + +if (DARWIN) + # The testbed needs to use a couple of CoreFoundation calls now, to deal with being a bundled app. + target_link_libraries(llfbconnecttest + ${COREFOUNDATION_LIBRARY} + ) +endif (DARWIN) + +add_dependencies(llfbconnecttest + stage_third_party_libs + SLPlugin + media_plugin_webkit + ${LLPLUGIN_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLCOMMON_LIBRARIES} +) + +# turn off weird GLUI pragma +add_definitions(-DGLUI_NO_LIB_PRAGMA) + +if (DARWIN OR LINUX) + # glui.h contains code that triggers the "overloaded-virtual" warning in gcc. + set_source_files_properties(llfbconnecttest.cpp PROPERTIES COMPILE_FLAGS "-Wno-overloaded-virtual") +endif (DARWIN OR LINUX) + +# Gather build products of the various dependencies into the build directory for the testbed. + +if (DARWIN) + # path inside the app bundle where we'll need to copy plugins and other related files + set(PLUGINS_DESTINATION_DIR + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llfbconnecttest.app/Contents/Resources + ) + + # create the Contents/Resources directory + add_custom_command( + TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS + -E + make_directory + ${PLUGINS_DESTINATION_DIR} + COMMENT "Creating Resources directory in app bundle." + ) +else (DARWIN) + set(PLUGINS_DESTINATION_DIR + ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/ + ) +endif (DARWIN) + +get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION) +add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_SLPLUGIN} ${PLUGINS_DESTINATION_DIR} + DEPENDS ${BUILT_SLPLUGIN} +) + +get_target_property(BUILT_LLCOMMON llcommon LOCATION) +add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_LLCOMMON} ${PLUGINS_DESTINATION_DIR} + DEPENDS ${BUILT_LLCOMMON} +) + + +if (DARWIN OR WINDOWS) + get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION) + add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_WEBKIT_PLUGIN} ${PLUGINS_DESTINATION_DIR} + DEPENDS ${BUILT_WEBKIT_PLUGIN} + ) + + # copy over bookmarks file if llfbconnecttest gets built + get_target_property(BUILT_LLFBCONNECTTEST llfbconnecttest LOCATION) + add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${CMAKE_CURRENT_BINARY_DIR}/ + DEPENDS ${BUILT_LLFBCONNECTTEST} + ) + # also copy it to the same place as SLPlugin, which is what the mac wants... + add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/bookmarks.txt ${PLUGINS_DESTINATION_DIR} + DEPENDS ${BUILT_LLFBCONNECTTEST} + ) +endif (DARWIN OR WINDOWS) + +if (DARWIN) + add_custom_command(TARGET llfbconnecttest POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib ${PLUGINS_DESTINATION_DIR} + DEPENDS ${ARCH_PREBUILT_DIRS_RELEASE}/libllqtwebkit.dylib + ) +endif (DARWIN) + +if(WINDOWS) + #******************** + # Plugin test library deploy + # + # Debug config runtime files required for the FB connect test + set(fbconnecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") + set(fbconnecttest_debug_files + libeay32.dll + libglib-2.0-0.dll + libgmodule-2.0-0.dll + libgobject-2.0-0.dll + libgthread-2.0-0.dll + qtcored4.dll + qtguid4.dll + qtnetworkd4.dll + qtopengld4.dll + qtwebkitd4.dll + ssleay32.dll + ) + copy_if_different( + ${fbconnecttest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug" + out_targets + ${fbconnecttest_debug_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + # Debug config runtime files required for the FB connect test (Qt image format plugins) + set(fbconecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/imageformats") + set(fbconecttest_debug_files + qgifd4.dll + qicod4.dll + qjpegd4.dll + qmngd4.dll + qsvgd4.dll + qtiffd4.dll + ) + copy_if_different( + ${fbconecttest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug/imageformats" + out_targets + ${fbconecttest_debug_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + # Debug config runtime files required for the FB connect test (Qt codec plugins) + set(fbconnecttest_debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}/codecs") + set(fbconnecttest_debug_files + qcncodecsd4.dll + qjpcodecsd4.dll + qkrcodecsd4.dll + qtwcodecsd4.dll + ) + copy_if_different( + ${fbconnecttest_debug_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Debug/codecs" + out_targets + ${fbconnecttest_debug_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + # Release & ReleaseDebInfo config runtime files required for the FB connect test + set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(fbconnecttest_release_files + libeay32.dll + libglib-2.0-0.dll + libgmodule-2.0-0.dll + libgobject-2.0-0.dll + libgthread-2.0-0.dll + qtcore4.dll + qtgui4.dll + qtnetwork4.dll + qtopengl4.dll + qtwebkit4.dll + qtxmlpatterns4.dll + ssleay32.dll + ) + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt image format plugins) + set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/imageformats") + set(fbconnecttest_release_files + qgif4.dll + qico4.dll + qjpeg4.dll + qmng4.dll + qsvg4.dll + qtiff4.dll + ) + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release/imageformats" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/imageformats" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + # Release & ReleaseDebInfo config runtime files required for the FB connect test (Qt codec plugins) + set(fbconnecttest_release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}/codecs") + set(fbconnecttest_release_files + qcncodecs4.dll + qjpcodecs4.dll + qkrcodecs4.dll + qtwcodecs4.dll + ) + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/Release/codecs" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + copy_if_different( + ${fbconnecttest_release_src_dir} + "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/codecs" + out_targets + ${fbconnecttest_release_files} + ) + set(fbconnect_test_targets ${fbconnect_test_targets} ${out_targets}) + + add_custom_target(copy_fbconnecttest_libs ALL + DEPENDS + ${fbconnect_test_targets} + ) + + add_dependencies(llfbconnecttest copy_fbconnecttest_libs) + +endif(WINDOWS) + +ll_deploy_sharedlibs_command(llfbconnecttest) diff --git a/indra/test_apps/llfbconnecttest/bookmarks.txt b/indra/test_apps/llfbconnecttest/bookmarks.txt new file mode 100644 index 0000000000..3995627ea9 --- /dev/null +++ b/indra/test_apps/llfbconnecttest/bookmarks.txt @@ -0,0 +1,4 @@ +# format is description, url (don't put ',' chars in description :) +# if no ',' found, whole line is used for both description and url +Google Home Page,http://www.google.com +Facebook Home Page,http://www.facebook.com diff --git a/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp b/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp new file mode 100644 index 0000000000..483a15c468 --- /dev/null +++ b/indra/test_apps/llfbconnecttest/llfbconnecttest.cpp @@ -0,0 +1,2394 @@ +/** + * @file LLFBConnectTest.cpp + * @brief Facebook Connect Test App + * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "linden_common.h" +#include "indra_constants.h" + +#include "llapr.h" +#include "llerrorcontrol.h" + +#include <math.h> +#include <iomanip> +#include <sstream> +#include <ctime> + +#include "llfbconnecttest.h" + +#if __APPLE__ + #include <GLUT/glut.h> + #include <CoreFoundation/CoreFoundation.h> +#else + #define FREEGLUT_STATIC + #include "GL/freeglut.h" + #define GLUI_FREEGLUT +#endif + +#if LL_WINDOWS +#pragma warning(disable: 4263) +#pragma warning(disable: 4264) +#endif +#include "glui.h" + + +LLFBConnectTest* gApplication = 0; +static void gluiCallbackWrapper( int control_id ); + +//////////////////////////////////////////////////////////////////////////////// +// +static bool isTexture( GLuint texture ) +{ + bool result = false; + + // glIsTexture will sometimes return false for real textures... do this instead. + if(texture != 0) + result = true; + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel::mediaPanel() +{ + mMediaTextureHandle = 0; + mPickTextureHandle = 0; + mMediaSource = NULL; + mPickTexturePixels = NULL; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel::~mediaPanel() +{ + // delete OpenGL texture handles + if ( isTexture( mPickTextureHandle ) ) + { + std::cerr << "remMediaPanel: deleting pick texture " << mPickTextureHandle << std::endl; + glDeleteTextures( 1, &mPickTextureHandle ); + mPickTextureHandle = 0; + } + + if ( isTexture( mMediaTextureHandle ) ) + { + std::cerr << "remMediaPanel: deleting media texture " << mMediaTextureHandle << std::endl; + glDeleteTextures( 1, &mMediaTextureHandle ); + mMediaTextureHandle = 0; + } + + if(mPickTexturePixels) + { + delete mPickTexturePixels; + } + + if(mMediaSource) + { + delete mMediaSource; + } + +} + +//////////////////////////////////////////////////////////////////////////////// +// +LLFBConnectTest::LLFBConnectTest( int app_window, int window_width, int window_height ) : + mVersionMajor( 2 ), + mVersionMinor( 0 ), + mVersionPatch( 0 ), + mMaxPanels( 25 ), + mViewportAspect( 0 ), + mAppWindow( app_window ), + mCurMouseX( 0 ), + mCurMouseY( 0 ), + mFuzzyMedia( true ), + mSelectedPanel( 0 ), + mDistanceCameraToSelectedGeometry( 0.0f ), + //mMediaBrowserControlEnableCookies( 0 ), + mMediaBrowserControlBackButton( 0 ), + mMediaBrowserControlForwardButton( 0 ), + //mMediaTimeControlVolume( 100 ), + //mMediaTimeControlSeekSeconds( 0 ), + //mGluiMediaTimeControlWindowFlag( true ), + mGluiMediaBrowserControlWindowFlag( true ), + mMediaBrowserControlBackButtonFlag( true ), + mMediaBrowserControlForwardButtonFlag( true ), + mHomeWebUrl( "https://cryptic-ridge-1632.herokuapp.com/" ) +{ + // debugging spam + std::cout << std::endl << " GLUT version: " << "3.7.6" << std::endl; // no way to get real version from GLUT + std::cout << std::endl << " GLUI version: " << GLUI_Master.get_version() << std::endl; + std::cout << std::endl << "Media Plugin Test version: " << mVersionMajor << "." << mVersionMinor << "." << mVersionPatch << std::endl; + + // bookmark title + mBookmarks.push_back( std::pair< std::string, std::string >( "--- Bookmarks ---", "" ) ); + + // insert hardcoded URLs here as required for testing + //mBookmarks.push_back( std::pair< std::string, std::string >( "description", "url" ) ); + + // read bookmarks from file. + // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory + // to app directory (WITHOUT build configuration dir) (this is cwd in Windows within MSVC) + // For example, test_apps\llplugintest and not test_apps\llplugintest\Release + // This may need to be changed for Mac/Linux builds. + // See https://jira.lindenlab.com/browse/DEV-31350 for large list of media URLs from AGNI + const std::string bookmarks_filename( "bookmarks.txt" ); + std::ifstream file_handle( bookmarks_filename.c_str() ); + if ( file_handle.is_open() ) + { + std::cout << "Reading bookmarks for test" << std::endl; + while( ! file_handle.eof() ) + { + std::string line; + std::getline( file_handle, line ); + if ( file_handle.eof() ) + break; + + if ( line.substr( 0, 1 ) != "#" ) + { + size_t comma_pos = line.find_first_of( ',' ); + if ( comma_pos != std::string::npos ) + { + std::string description = line.substr( 0, comma_pos ); + std::string url = line.substr( comma_pos + 1 ); + mBookmarks.push_back( std::pair< std::string, std::string >( description, url ) ); + } + else + { + mBookmarks.push_back( std::pair< std::string, std::string >( line, line ) ); + }; + }; + }; + std::cout << "Read " << mBookmarks.size() << " bookmarks" << std::endl; + } + else + { + std::cout << "Unable to read bookmarks from file: " << bookmarks_filename << std::endl; + }; + + // initialize linden lab APR module + ll_init_apr(); + + // Set up llerror logging + { + LLError::initForApplication("."); + LLError::setDefaultLevel(LLError::LEVEL_INFO); + //LLError::setTagLevel("Plugin", LLError::LEVEL_DEBUG); + } + + // lots of randomness in this app + srand( ( unsigned int )time( 0 ) ); + + // build GUI + makeChrome(); + + // OpenGL initialilzation + glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + glClearDepth( 1.0f ); + glEnable( GL_DEPTH_TEST ); + glEnable( GL_COLOR_MATERIAL ); + glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); + glDepthFunc( GL_LEQUAL ); + glEnable( GL_TEXTURE_2D ); + glDisable( GL_BLEND ); + glColor3f( 1.0f, 1.0f, 1.0f ); + glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, 0 ); + + // start with a sane view + resetView(); + + // initial media panel + const int num_initial_panels = 1; + for( int i = 0; i < num_initial_panels; ++i ) + { + //addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); + addMediaPanel( mHomeWebUrl ); + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +LLFBConnectTest::~LLFBConnectTest() +{ + // delete all media panels + for( int i = 0; i < (int)mMediaPanels.size(); ++i ) + { + remMediaPanel( mMediaPanels[ i ] ); + }; + + // Stop the plugin read thread if it's running. + LLPluginProcessParent::setUseReadThread(false); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::reshape( int width, int height ) +{ + // update viewport (the active window inside the chrome) + int viewport_x, viewport_y; + int viewport_height, viewport_width; + GLUI_Master.get_viewport_area( &viewport_x, &viewport_y, &viewport_width, &viewport_height ); + mViewportAspect = (float)( viewport_width ) / (float)( viewport_height ); + glViewport( viewport_x, viewport_y, viewport_width, viewport_height ); + + // save these as we'll need them later + mWindowWidth = width; + mWindowHeight = height; + + // adjust size of URL bar so it doesn't get clipped + mUrlEdit->set_w( mWindowWidth - 360 ); + + // GLUI requires this + if ( glutGetWindow() != mAppWindow ) + glutSetWindow( mAppWindow ); + + // trigger re-display + glutPostRedisplay(); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::bindTexture(GLuint texture, GLint row_length, GLint alignment) +{ + glEnable( GL_TEXTURE_2D ); + + glBindTexture( GL_TEXTURE_2D, texture ); + glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length ); + glPixelStorei( GL_UNPACK_ALIGNMENT, alignment ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +bool LLFBConnectTest::checkGLError(const char *name) +{ + bool result = false; + GLenum error = glGetError(); + + if(error != GL_NO_ERROR) + { + // For some reason, glGenTextures is returning GL_INVALID_VALUE... + std::cout << name << " ERROR 0x" << std::hex << error << std::dec << std::endl; + result = true; + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// +GLfloat LLFBConnectTest::distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z ) +{ + GLdouble camera_pos_x = 0.0f; + GLdouble camera_pos_y = 0.0f; + GLdouble camera_pos_z = 0.0f; + + GLdouble modelMatrix[16]; + GLdouble projMatrix[16]; + GLint viewport[4]; + + glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); + glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); + glGetIntegerv(GL_VIEWPORT, viewport); + + gluUnProject( + (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2, + 0.0, + modelMatrix, projMatrix, viewport, + &camera_pos_x, &camera_pos_y, &camera_pos_z ); + + GLfloat distance = + sqrt( ( camera_pos_x - point_x ) * ( camera_pos_x - point_x ) + + ( camera_pos_y - point_y ) * ( camera_pos_y - point_y ) + + ( camera_pos_z - point_z ) * ( camera_pos_z - point_z ) ); + + return distance; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::drawGeometry( int panel, bool selected ) +{ + // texture coordinates for each panel + GLfloat non_opengl_texture_coords[ 8 ] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }; + GLfloat opengl_texture_coords[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; + + GLfloat *texture_coords = mMediaPanels[ panel ]->mAppTextureCoordsOpenGL?opengl_texture_coords:non_opengl_texture_coords; + + // base coordinates for each panel + GLfloat base_vertex_pos[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f }; + + // calculate posiitons + const int num_panels = (int)mMediaPanels.size(); + const int num_rows = (int)sqrt( (float)num_panels ); + const int num_cols = num_panels / num_rows; + const int panel_x = ( panel / num_rows ); + const int panel_y = ( panel % num_rows ); + + // default spacing is small - make it larger if checkbox set - for testing positional audio + float spacing = 0.1f; + //if ( mLargePanelSpacing ) + // spacing = 2.0f; + + const GLfloat offset_x = num_cols * ( 1.0 + spacing ) / 2; + const GLfloat offset_y = num_rows * ( 1.0 + spacing ) / 2; + + // Adjust for media aspect ratios + { + float aspect = 1.0f; + + if(mMediaPanels[ panel ]->mMediaHeight != 0) + { + aspect = (float)mMediaPanels[ panel ]->mMediaWidth / (float)mMediaPanels[ panel ]->mMediaHeight; + } + + if(aspect > 1.0f) + { + // media is wider than it is high -- adjust the top and bottom in + for( int corner = 0; corner < 4; ++corner ) + { + float temp = base_vertex_pos[corner * 2 + 1]; + + if(temp < 0.5f) + temp += 0.5 - (0.5f / aspect); + else + temp -= 0.5 - (0.5f / aspect); + + base_vertex_pos[corner * 2 + 1] = temp; + } + } + else if(aspect < 1.0f) + { + // media is higher than it is wide -- adjust the left and right sides in + for( int corner = 0; corner < 4; ++corner ) + { + float temp = base_vertex_pos[corner * 2]; + + if(temp < 0.5f) + temp += 0.5f - (0.5f * aspect); + else + temp -= 0.5f - (0.5f * aspect); + + base_vertex_pos[corner * 2] = temp; + } + } + } + + glBegin( GL_QUADS ); + for( int corner = 0; corner < 4; ++corner ) + { + glTexCoord2f( texture_coords[ corner * 2 ], texture_coords[ corner * 2 + 1 ] ); + GLfloat x = base_vertex_pos[ corner * 2 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f; + GLfloat y = base_vertex_pos[ corner * 2 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f; + + glVertex3f( x, y, 0.0f ); + }; + glEnd(); + + // calculate distance to this panel if it's selected + if ( selected ) + { + GLfloat point_x = base_vertex_pos[ 0 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f; + GLfloat point_y = base_vertex_pos[ 0 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f; + GLfloat point_z = 0.0f; + mDistanceCameraToSelectedGeometry = distanceToCamera( point_x, point_y, point_z ); + }; +} + +////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::startPanelHighlight( float red, float green, float blue, float line_width ) +{ + glPushAttrib( GL_ALL_ATTRIB_BITS ); + glEnable( GL_POLYGON_OFFSET_FILL ); + glPolygonOffset( -2.5f, -2.5f ); + glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + glLineWidth( line_width ); + glColor3f( red, green, blue ); + glDisable( GL_TEXTURE_2D ); +} + +////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::endPanelHighlight() +{ + glPopAttrib(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::draw( int draw_type ) +{ + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + // drawing pick texture + if ( draw_type == DrawTypePickTexture ) + { + // only bother with pick if we have something to render + // Actually, we need to pick even if we're not ready to render. + // Otherwise you can't select and remove a panel which has gone bad. + //if ( mMediaPanels[ panel ]->mReadyToRender ) + { + glMatrixMode( GL_TEXTURE ); + glPushMatrix(); + + // pick texture is a power of 2 so no need to scale + glLoadIdentity(); + + // bind to media texture + glLoadIdentity(); + bindTexture( mMediaPanels[ panel ]->mPickTextureHandle ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + + // draw geometry using pick texture + drawGeometry( panel, false ); + + glMatrixMode( GL_TEXTURE ); + glPopMatrix(); + }; + } + else + if ( draw_type == DrawTypeMediaTexture ) + { + bool texture_valid = false; + bool plugin_exited = false; + + if(mMediaPanels[ panel ]->mMediaSource) + { + texture_valid = mMediaPanels[ panel ]->mMediaSource->textureValid(); + plugin_exited = mMediaPanels[ panel ]->mMediaSource->isPluginExited(); + } + + // save texture matrix (changes for each panel) + glMatrixMode( GL_TEXTURE ); + glPushMatrix(); + + // only process texture if the media is ready to draw + // (we still want to draw the geometry) + if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid ) + { + // bind to media texture + bindTexture( mMediaPanels[ panel ]->mMediaTextureHandle ); + + if ( mFuzzyMedia ) + { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + } + else + { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + } + + // scale to fit panel + glScalef( mMediaPanels[ panel ]->mTextureScaleX, + mMediaPanels[ panel ]->mTextureScaleY, + 1.0f ); + }; + + float intensity = plugin_exited?0.25f:1.0f; + + // highlight the selected panel + if ( mSelectedPanel && ( mMediaPanels[ panel ]->mId == mSelectedPanel->mId ) ) + { + startPanelHighlight( intensity, intensity, 0.0f, 5.0f ); + drawGeometry( panel, true ); + endPanelHighlight(); + } + else + // this panel not able to render yet since it + // doesn't have enough information + if ( !mMediaPanels[ panel ]->mReadyToRender ) + { + startPanelHighlight( intensity, 0.0f, 0.0f, 2.0f ); + drawGeometry( panel, false ); + endPanelHighlight(); + } + else + // just display a border around the media + { + startPanelHighlight( 0.0f, intensity, 0.0f, 2.0f ); + drawGeometry( panel, false ); + endPanelHighlight(); + }; + + if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid ) + { + // draw visual geometry + drawGeometry( panel, false ); + } + + // restore texture matrix (changes for each panel) + glMatrixMode( GL_TEXTURE ); + glPopMatrix(); + }; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::display() +{ + // GLUI requires this + if ( glutGetWindow() != mAppWindow ) + glutSetWindow( mAppWindow ); + + // start with a clean slate + glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + // set up OpenGL view + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glFrustum( -mViewportAspect * 0.04f, mViewportAspect * 0.04f, -0.04f, 0.04f, 0.1f, 50.0f ); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, 0.0f ); + glTranslatef( mViewPos[ 0 ], mViewPos[ 1 ], -mViewPos[ 2 ] ); + glMultMatrixf( mViewRotation ); + + // draw pick texture + draw( DrawTypePickTexture ); + + // read colors and get coordinate values + glReadPixels( mCurMouseX, mCurMouseY, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, mPixelReadColor ); + + // clear the pick render (otherwise it may depth-fight with the textures rendered later) + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + // draw visible geometry + draw( DrawTypeMediaTexture ); + + glutSwapBuffers(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::idle() +{ +// checkGLError("LLFBConnectTest::idle"); + + // GLUI requires this + if ( glutGetWindow() != mAppWindow ) + glutSetWindow( mAppWindow ); + + // random creation/destruction of panels enabled? +/* + const time_t panel_timeout_time = 5; + if ( mRandomPanelCount ) + { + // time for a change + static time_t last_panel_time = 0; + if ( time( NULL ) - last_panel_time > panel_timeout_time ) + { + if ( rand() % 2 == 0 ) + { + if ( mMediaPanels.size() < 16 ) + { + std::cout << "Randomly adding new panel" << std::endl; + addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); + }; + } + else + { + if ( mMediaPanels.size() > 0 ) + { + std::cout << "Deleting selected panel" << std::endl; + remMediaPanel( mSelectedPanel ); + }; + }; + time( &last_panel_time ); + }; + }; + + // random selection of bookmarks enabled? + const time_t bookmark_timeout_time = 5; + if ( mRandomBookmarks ) + { + // time for a change + static time_t last_bookmark_time = 0; + if ( time( NULL ) - last_bookmark_time > bookmark_timeout_time ) + { + // go to a different random bookmark on each panel + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + std::string uri = mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second; + + std::cout << "Random: navigating to : " << uri << std::endl; + + std::string mime_type = mimeTypeFromUrl( uri ); + + if ( mime_type != mMediaPanels[ panel ]->mMimeType ) + { + replaceMediaPanel( mMediaPanels[ panel ], uri ); + } + else + { + mMediaPanels[ panel ]->mMediaSource->loadURI( uri ); + mMediaPanels[ panel ]->mMediaSource->start(); + }; + }; + + time( &last_bookmark_time ); + }; + }; +*/ + // update UI + if ( mSelectedPanel ) + { + // set volume based on slider if we have time media + //if ( mGluiMediaTimeControlWindowFlag ) + //{ + // mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f ); + //}; + + // NOTE: it is absurd that we need cache the state of GLUI controls + // but enabling/disabling controls drags framerate from 500+ + // down to 15. Not a problem for plugin system - only this test + // enable/disable time based UI controls based on type of plugin + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() ) + { + /* + if ( ! mGluiMediaTimeControlWindowFlag ) + { + mGluiMediaTimeControlWindow->enable(); + mGluiMediaTimeControlWindowFlag = true; + }; + */ + } + else + { + /* + if ( mGluiMediaTimeControlWindowFlag ) + { + mGluiMediaTimeControlWindow->disable(); + mGluiMediaTimeControlWindowFlag = false; + }; + */ + }; + + // enable/disable browser based UI controls based on type of plugin + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() ) + { + if ( ! mGluiMediaBrowserControlWindowFlag ) + { + mGluiMediaBrowserControlWindow->enable(); + mGluiMediaBrowserControlWindowFlag = true; + }; + } + else + { + if ( mGluiMediaBrowserControlWindowFlag ) + { + mGluiMediaBrowserControlWindow->disable(); + mGluiMediaBrowserControlWindowFlag = false; + }; + }; + + // enable/disable browser back button depending on browser history + if ( mSelectedPanel->mMediaSource->getHistoryBackAvailable() ) + { + if ( ! mMediaBrowserControlBackButtonFlag ) + { + mMediaBrowserControlBackButton->enable(); + mMediaBrowserControlBackButtonFlag = true; + }; + } + else + { + if ( mMediaBrowserControlBackButtonFlag ) + { + mMediaBrowserControlBackButton->disable(); + mMediaBrowserControlBackButtonFlag = false; + }; + }; + + // enable/disable browser forward button depending on browser history + if ( mSelectedPanel->mMediaSource->getHistoryForwardAvailable() ) + { + if ( ! mMediaBrowserControlForwardButtonFlag ) + { + mMediaBrowserControlForwardButton->enable(); + mMediaBrowserControlForwardButtonFlag = true; + }; + } + else + { + if ( mMediaBrowserControlForwardButtonFlag ) + { + mMediaBrowserControlForwardButton->disable(); + mMediaBrowserControlForwardButtonFlag = false; + }; + }; + + // NOTE: This is *very* slow and not worth optimising + updateStatusBar(); + }; + + // update all the panels + for( int panel_index = 0; panel_index < (int)mMediaPanels.size(); ++panel_index ) + { + mediaPanel *panel = mMediaPanels[ panel_index ]; + + // call plugins idle function so it can potentially update itself + panel->mMediaSource->idle(); + + // update each media panel + updateMediaPanel( panel ); + + LLRect dirty_rect; + if ( ! panel->mMediaSource->textureValid() ) + { + //std::cout << "texture invalid, skipping update..." << std::endl; + } + else + if ( panel && + ( panel->mMediaWidth != panel->mMediaSource->getWidth() || + panel->mMediaHeight != panel->mMediaSource->getHeight() ) ) + { + //std::cout << "Resize in progress, skipping update..." << std::endl; + } + else + if ( panel->mMediaSource->getDirty( &dirty_rect ) ) + { + const unsigned char* pixels = panel->mMediaSource->getBitsData(); + if ( pixels && isTexture(panel->mMediaTextureHandle)) + { + int x_offset = dirty_rect.mLeft; + int y_offset = dirty_rect.mBottom; + int width = dirty_rect.mRight - dirty_rect.mLeft; + int height = dirty_rect.mTop - dirty_rect.mBottom; + + if((dirty_rect.mRight <= panel->mTextureWidth) && (dirty_rect.mTop <= panel->mTextureHeight)) + { + // Offset the pixels pointer properly + pixels += ( y_offset * panel->mMediaSource->getTextureDepth() * panel->mMediaSource->getBitsWidth() ); + pixels += ( x_offset * panel->mMediaSource->getTextureDepth() ); + + // set up texture + bindTexture( panel->mMediaTextureHandle, panel->mMediaSource->getBitsWidth() ); + if ( mFuzzyMedia ) + { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); + } + else + { + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); + glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); + }; + + checkGLError("glTexParameteri"); + + if(panel->mMediaSource->getTextureFormatSwapBytes()) + { + glPixelStorei(GL_UNPACK_SWAP_BYTES, 1); + checkGLError("glPixelStorei"); + } + + // draw portion that changes into texture + glTexSubImage2D( GL_TEXTURE_2D, 0, + x_offset, + y_offset, + width, + height, + panel->mMediaSource->getTextureFormatPrimary(), + panel->mMediaSource->getTextureFormatType(), + pixels ); + + if(checkGLError("glTexSubImage2D")) + { + std::cerr << " panel ID=" << panel->mId << std::endl; + std::cerr << " texture size = " << panel->mTextureWidth << " x " << panel->mTextureHeight << std::endl; + std::cerr << " media size = " << panel->mMediaWidth << " x " << panel->mMediaHeight << std::endl; + std::cerr << " dirty rect = " << dirty_rect.mLeft << ", " << dirty_rect.mBottom << ", " << dirty_rect.mRight << ", " << dirty_rect.mTop << std::endl; + std::cerr << " texture width = " << panel->mMediaSource->getBitsWidth() << std::endl; + std::cerr << " format primary = 0x" << std::hex << panel->mMediaSource->getTextureFormatPrimary() << std::dec << std::endl; + std::cerr << " format type = 0x" << std::hex << panel->mMediaSource->getTextureFormatType() << std::dec << std::endl; + std::cerr << " pixels = " << (void*)pixels << std::endl; + } + + if(panel->mMediaSource->getTextureFormatSwapBytes()) + { + glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); + checkGLError("glPixelStorei"); + } + + panel->mMediaSource->resetDirty(); + + panel->mReadyToRender = true; + } + else + { + std::cerr << "dirty rect is outside current media size, skipping update" << std::endl; + } + }; + }; + }; + + // GLUI requires this + if ( glutGetWindow() != mAppWindow ) + glutSetWindow( mAppWindow ); + + // trigger re-display + glutPostRedisplay(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::windowPosToTexturePos( int window_x, int window_y, + int& media_x, int& media_y, + int& id ) +{ + if ( ! mSelectedPanel ) + { + media_x = 0; + media_y = 0; + id = 0; + return; + }; + + // record cursor poisiton for a readback next frame + mCurMouseX = window_x; + // OpenGL app == coordinate system this way + // NOTE: unrelated to settings in plugin - this + // is just for this app + mCurMouseY = mWindowHeight - window_y; + + // extract x (0..1023, y (0..1023) and id (0..15) from RGB components + unsigned long pixel_read_color_bits = ( mPixelReadColor[ 0 ] << 16 ) | ( mPixelReadColor[ 1 ] << 8 ) | mPixelReadColor[ 2 ]; + int texture_x = pixel_read_color_bits & 0x3ff; + int texture_y = ( pixel_read_color_bits >> 10 ) & 0x3ff; + id = ( pixel_read_color_bits >> 20 ) & 0x0f; + + // scale to size of media (1024 because we use 10 bits for X and Y from 24) + media_x = (int)( ( (float)mSelectedPanel->mMediaWidth * (float)texture_x ) / 1024.0f ); + media_y = (int)( ( (float)mSelectedPanel->mMediaHeight * (float)texture_y ) / 1024.0f ); + + // we assume the plugin uses an inverted coordinate scheme like OpenGL + // if not, the plugin code inverts the Y coordinate for us - we don't need to + media_y = mSelectedPanel->mMediaHeight - media_y; + + if ( media_x > 0 && media_y > 0 ) + { + //std::cout << " mouse coords: " << mCurMouseX << " x " << mCurMouseY << " and id = " << id << std::endl; + //std::cout << "raw texture coords: " << texture_x << " x " << texture_y << " and id = " << id << std::endl; + //std::cout << " media coords: " << media_x << " x " << media_y << " and id = " << id << std::endl; + //std::cout << std::endl; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::selectPanelById( int id ) +{ + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + if ( mMediaPanels[ panel ]->mId == id ) + { + selectPanel(mMediaPanels[ panel ]); + return; + }; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::selectPanel( mediaPanel* panel ) +{ + if( mSelectedPanel == panel ) + return; + + // turn off volume before we delete it + if( mSelectedPanel && mSelectedPanel->mMediaSource ) + { + mSelectedPanel->mMediaSource->setVolume( 0.0f ); + mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_LOW ); + }; + + mSelectedPanel = panel; + + if( mSelectedPanel && mSelectedPanel->mMediaSource ) + { + //mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f ); + mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_NORMAL ); + + if(!mSelectedPanel->mStartUrl.empty()) + { + mUrlEdit->set_text(const_cast<char*>(mSelectedPanel->mStartUrl.c_str()) ); + } + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel* LLFBConnectTest::findMediaPanel( LLPluginClassMedia* source ) +{ + mediaPanel *result = NULL; + + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + if ( mMediaPanels[ panel ]->mMediaSource == source ) + { + result = mMediaPanels[ panel ]; + } + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel* LLFBConnectTest::findMediaPanel( const std::string &target_name ) +{ + mediaPanel *result = NULL; + + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + if ( mMediaPanels[ panel ]->mTarget == target_name ) + { + result = mMediaPanels[ panel ]; + } + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::navigateToNewURI( std::string uri ) +{ + if ( uri.length() ) + { + std::string mime_type = mimeTypeFromUrl( uri ); + + if ( !mSelectedPanel->mMediaSource->isPluginExited() && (mime_type == mSelectedPanel->mMimeType) ) + { + std::cout << "MIME type is the same" << std::endl; + mSelectedPanel->mMediaSource->loadURI( uri ); + mSelectedPanel->mMediaSource->start(); + mBookmarkList->do_selection( 0 ); + } + else + { + std::cout << "MIME type changed or plugin had exited" << std::endl; + replaceMediaPanel( mSelectedPanel, uri ); + mBookmarkList->do_selection( 0 ); + } + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::initUrlHistory( std::string uris ) +{ + if ( uris.length() > 0 ) + { + std::cout << "init URL : " << uris << std::endl; + LLSD historySD; + + char *cstr, *p; + cstr = new char[uris.size()+1]; + strcpy(cstr, uris.c_str()); + const char *DELIMS = " ,;"; + p = strtok(cstr, DELIMS); + while (p != NULL) { + historySD.insert(0, p); + p = strtok(NULL, DELIMS); + } + mSelectedPanel->mMediaSource->initializeUrlHistory(historySD); + delete[] cstr; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::gluiCallback( int control_id ) +{ + if ( control_id == mIdBookmarks ) + { + std::string uri = mBookmarks[ mSelBookmark ].second; + + navigateToNewURI( uri ); + } + else + if ( control_id == mIdUrlEdit) + { + std::string uri = mUrlEdit->get_text(); + + navigateToNewURI( uri ); + } +/* + else + if ( control_id == mIdUrlInitHistoryEdit ) + { + std::string uri = mUrlInitHistoryEdit->get_text(); + + initUrlHistory( uri ); + } + else + if ( control_id == mIdControlAddPanel ) + { + addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); + } + else + if ( control_id == mIdControlRemPanel ) + { + remMediaPanel( mSelectedPanel ); + } + else + if ( control_id == mIdDisableTimeout ) + { + // Set the "disable timeout" flag for all active plugins. + for( int i = 0; i < (int)mMediaPanels.size(); ++i ) + { + mMediaPanels[ i ]->mMediaSource->setDisableTimeout(mDisableTimeout); + } + } + else + if ( control_id == mIdUsePluginReadThread ) + { + LLPluginProcessParent::setUseReadThread(mUsePluginReadThread); + } + else + if ( control_id == mIdControlCrashPlugin ) + { + // send message to plugin and ask it to crash + // (switch out for ReleaseCandidate version :) ) + if(mSelectedPanel && mSelectedPanel->mMediaSource) + { + mSelectedPanel->mMediaSource->crashPlugin(); + } + } + else + if ( control_id == mIdControlHangPlugin ) + { + // send message to plugin and ask it to hang + // (switch out for ReleaseCandidate version :) ) + if(mSelectedPanel && mSelectedPanel->mMediaSource) + { + mSelectedPanel->mMediaSource->hangPlugin(); + } + } + else +*/ + if ( control_id == mIdControlExitApp ) + { + // text for exiting plugin system cleanly + delete this; // clean up + exit( 0 ); + } +/* + else + if ( control_id == mIdMediaTimeControlPlay ) + { + if ( mSelectedPanel ) + { + mSelectedPanel->mMediaSource->setLoop( false ); + mSelectedPanel->mMediaSource->start(); + }; + } + else + if ( control_id == mIdMediaTimeControlLoop ) + { + if ( mSelectedPanel ) + { + mSelectedPanel->mMediaSource->setLoop( true ); + mSelectedPanel->mMediaSource->start(); + }; + } + else + if ( control_id == mIdMediaTimeControlPause ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->pause(); + } + else + if ( control_id == mIdMediaTimeControlStop ) + { + if ( mSelectedPanel ) + { + mSelectedPanel->mMediaSource->stop(); + }; + } + else + if ( control_id == mIdMediaTimeControlSeek ) + { + if ( mSelectedPanel ) + { + // get value from spinner + float seconds_to_seek = mMediaTimeControlSeekSeconds; + mSelectedPanel->mMediaSource->seek( seconds_to_seek ); + mSelectedPanel->mMediaSource->start(); + }; + } + else + if ( control_id == mIdMediaTimeControlRewind ) + { + if ( mSelectedPanel ) + { + mSelectedPanel->mMediaSource->setLoop( false ); + mSelectedPanel->mMediaSource->start(-2.0f); + }; + } + else + if ( control_id == mIdMediaTimeControlFastForward ) + { + if ( mSelectedPanel ) + { + mSelectedPanel->mMediaSource->setLoop( false ); + mSelectedPanel->mMediaSource->start(2.0f); + }; + } + else +*/ + if ( control_id == mIdMediaBrowserControlBack ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->browse_back(); + } + else + if ( control_id == mIdMediaBrowserControlStop ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->browse_stop(); + } + else + if ( control_id == mIdMediaBrowserControlForward ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->browse_forward(); + } + else + if ( control_id == mIdMediaBrowserControlHome ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->loadURI( mHomeWebUrl ); + } + else + if ( control_id == mIdMediaBrowserControlReload ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->browse_reload( true ); + } +/* + else + if ( control_id == mIdMediaBrowserControlClearCache ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->clear_cache(); + } + else + if ( control_id == mIdMediaBrowserControlClearCookies ) + { + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->clear_cookies(); + } + else + if ( control_id == mIdMediaBrowserControlEnableCookies ) + { + if ( mSelectedPanel ) + { + if ( mMediaBrowserControlEnableCookies ) + { + mSelectedPanel->mMediaSource->enable_cookies( true ); + } + else + { + mSelectedPanel->mMediaSource->enable_cookies( false ); + } + }; + }; +*/ +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::keyboard( int key ) +{ + //if ( key == 'a' || key == 'A' ) + // addMediaPanel( mBookmarks[ rand() % ( mBookmarks.size() - 1 ) + 1 ].second ); + //else + //if ( key == 'r' || key == 'R' ) + // remMediaPanel( mSelectedPanel ); + //else + //if ( key == 'd' || key == 'D' ) + // dumpPanelInfo(); + //else + if ( key == 27 ) + { + std::cout << "Application finished - exiting..." << std::endl; + delete this; + exit( 0 ); + }; + + mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD()); + mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD()); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::mouseButton( int button, int state, int x, int y ) +{ + if ( button == GLUT_LEFT_BUTTON ) + { + if ( state == GLUT_DOWN ) + { + int media_x, media_y, id; + windowPosToTexturePos( x, y, media_x, media_y, id ); + + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_DOWN, 0, media_x, media_y, 0 ); + } + else + if ( state == GLUT_UP ) + { + int media_x, media_y, id; + windowPosToTexturePos( x, y, media_x, media_y, id ); + + // only select a panel if we're on a panel + // (HACK: strictly speaking this rules out clicking on + // the origin of a panel but that's very unlikely) + if ( media_x > 0 && media_y > 0 ) + { + selectPanelById( id ); + + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_UP, 0, media_x, media_y, 0 ); + }; + }; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::mousePassive( int x, int y ) +{ + int media_x, media_y, id; + windowPosToTexturePos( x, y, media_x, media_y, id ); + + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::mouseMove( int x, int y ) +{ + int media_x, media_y, id; + windowPosToTexturePos( x, y, media_x, media_y, id ); + + if ( mSelectedPanel ) + mSelectedPanel->mMediaSource->mouseEvent( LLPluginClassMedia::MOUSE_EVENT_MOVE, 0, media_x, media_y, 0 ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::makeChrome() +{ + // IDs used by GLUI + int start_id = 0x1000; + + // right side window - geometry manipulators +#if __APPLE__ + // the Apple GLUT implementation doesn't seem to set the graphic offset of subwindows correctly when they overlap in certain ways. + // Use a separate controls window in this case. + // GLUI window at right containing manipulation controls and other buttons + int x = glutGet(GLUT_WINDOW_X) + glutGet(GLUT_WINDOW_WIDTH) + 4; + int y = glutGet(GLUT_WINDOW_Y); + GLUI* right_glui_window = GLUI_Master.create_glui( "", 0, x, y ); +#else + GLUI* right_glui_window = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_RIGHT ); +#endif + mViewRotationCtrl = right_glui_window->add_rotation( "Rotation", mViewRotation ); + mViewTranslationCtrl = right_glui_window->add_translation( "Translate", GLUI_TRANSLATION_XY, mViewPos ); + mViewTranslationCtrl->set_speed( 0.01f ); + mViewScaleCtrl = right_glui_window->add_translation( "Scale", GLUI_TRANSLATION_Z, &mViewPos[ 2 ] ); + mViewScaleCtrl->set_speed( 0.05f ); + right_glui_window->set_main_gfx_window( mAppWindow ); + + // right side window - app controls + /* + mIdControlAddPanel = start_id++; + right_glui_window->add_statictext( "" ); + right_glui_window->add_separator(); + right_glui_window->add_statictext( "" ); + right_glui_window->add_button( "Add panel", mIdControlAddPanel, gluiCallbackWrapper ); + right_glui_window->add_statictext( "" ); + mIdControlRemPanel = start_id++; + right_glui_window->add_button( "Rem panel", mIdControlRemPanel, gluiCallbackWrapper ); + right_glui_window->add_statictext( "" ); + right_glui_window->add_separator(); + right_glui_window->add_statictext( "" ); + mIdControlCrashPlugin = start_id++; + right_glui_window->add_button( "Crash plugin", mIdControlCrashPlugin, gluiCallbackWrapper ); + mIdControlHangPlugin = start_id++; + right_glui_window->add_button( "Hang plugin", mIdControlHangPlugin, gluiCallbackWrapper ); + */ + right_glui_window->add_statictext( "" ); + right_glui_window->add_separator(); + right_glui_window->add_statictext( "" ); + mIdControlExitApp = start_id++; + right_glui_window->add_button( "Exit app", mIdControlExitApp, gluiCallbackWrapper ); + + //// top window - holds bookmark UI + mIdBookmarks = start_id++; + mSelBookmark = 0; + GLUI* glui_window_top = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); + mBookmarkList = glui_window_top->add_listbox( "", &mSelBookmark, mIdBookmarks, gluiCallbackWrapper ); + // only add the first 50 bookmarks - list can be very long sometimes (30,000+) + // when testing list of media URLs from AGNI for example + for( unsigned int each = 0; each < mBookmarks.size() && each < 50; ++each ) + mBookmarkList->add_item( each, const_cast< char* >( mBookmarks[ each ].first.c_str() ) ); + glui_window_top->set_main_gfx_window( mAppWindow ); + + glui_window_top->add_column( false ); + mIdUrlEdit = start_id++; + mUrlEdit = glui_window_top->add_edittext( "Url:", GLUI_EDITTEXT_TEXT, 0, mIdUrlEdit, gluiCallbackWrapper ); + mUrlEdit->set_w( 600 ); + //GLUI* glui_window_top2 = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); + //mIdUrlInitHistoryEdit = start_id++; + //mUrlInitHistoryEdit = glui_window_top2->add_edittext( "Init History (separate by commas or semicolons):", + // GLUI_EDITTEXT_TEXT, 0, mIdUrlInitHistoryEdit, gluiCallbackWrapper ); + //mUrlInitHistoryEdit->set_w( 800 ); + + // top window - media controls for "time" media types (e.g. movies) +/* + mGluiMediaTimeControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); + mGluiMediaTimeControlWindow->set_main_gfx_window( mAppWindow ); + mIdMediaTimeControlPlay = start_id++; + mGluiMediaTimeControlWindow->add_button( "PLAY", mIdMediaTimeControlPlay, gluiCallbackWrapper ); + mGluiMediaTimeControlWindow->add_column( false ); + mIdMediaTimeControlLoop = start_id++; + mGluiMediaTimeControlWindow->add_button( "LOOP", mIdMediaTimeControlLoop, gluiCallbackWrapper ); + mGluiMediaTimeControlWindow->add_column( false ); + mIdMediaTimeControlPause = start_id++; + mGluiMediaTimeControlWindow->add_button( "PAUSE", mIdMediaTimeControlPause, gluiCallbackWrapper ); + mGluiMediaTimeControlWindow->add_column( false ); + + GLUI_Button *button; + mIdMediaTimeControlRewind = start_id++; + button = mGluiMediaTimeControlWindow->add_button( "<<", mIdMediaTimeControlRewind, gluiCallbackWrapper ); + button->set_w(30); + mGluiMediaTimeControlWindow->add_column( false ); + mIdMediaTimeControlFastForward = start_id++; + button = mGluiMediaTimeControlWindow->add_button( ">>", mIdMediaTimeControlFastForward, gluiCallbackWrapper ); + button->set_w(30); + + mGluiMediaTimeControlWindow->add_column( true ); + + mIdMediaTimeControlStop = start_id++; + mGluiMediaTimeControlWindow->add_button( "STOP", mIdMediaTimeControlStop, gluiCallbackWrapper ); + mGluiMediaTimeControlWindow->add_column( false ); + mIdMediaTimeControlVolume = start_id++; + GLUI_Spinner* spinner = mGluiMediaTimeControlWindow->add_spinner( "Volume", 2, &mMediaTimeControlVolume, mIdMediaTimeControlVolume, gluiCallbackWrapper); + spinner->set_float_limits( 0, 100 ); + mGluiMediaTimeControlWindow->add_column( true ); + mIdMediaTimeControlSeekSeconds = start_id++; + spinner = mGluiMediaTimeControlWindow->add_spinner( "", 2, &mMediaTimeControlSeekSeconds, mIdMediaTimeControlSeekSeconds, gluiCallbackWrapper); + spinner->set_float_limits( 0, 200 ); + spinner->set_w( 32 ); + spinner->set_speed( 0.025f ); + mGluiMediaTimeControlWindow->add_column( false ); + mIdMediaTimeControlSeek = start_id++; + mGluiMediaTimeControlWindow->add_button( "SEEK", mIdMediaTimeControlSeek, gluiCallbackWrapper ); + mGluiMediaTimeControlWindow->add_column( false ); +*/ + + // top window - media controls for "browser" media types (e.g. web browser) + mGluiMediaBrowserControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); + mGluiMediaBrowserControlWindow->set_main_gfx_window( mAppWindow ); + mIdMediaBrowserControlBack = start_id++; + mMediaBrowserControlBackButton = mGluiMediaBrowserControlWindow->add_button( "BACK", mIdMediaBrowserControlBack, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlStop = start_id++; + mGluiMediaBrowserControlWindow->add_button( "STOP", mIdMediaBrowserControlStop, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlForward = start_id++; + mMediaBrowserControlForwardButton = mGluiMediaBrowserControlWindow->add_button( "FORWARD", mIdMediaBrowserControlForward, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlHome = start_id++; + mGluiMediaBrowserControlWindow->add_button( "HOME", mIdMediaBrowserControlHome, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlReload = start_id++; + mGluiMediaBrowserControlWindow->add_button( "RELOAD", mIdMediaBrowserControlReload, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + /* + mIdMediaBrowserControlClearCache = start_id++; + mGluiMediaBrowserControlWindow->add_button( "CLEAR CACHE", mIdMediaBrowserControlClearCache, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlClearCookies = start_id++; + mGluiMediaBrowserControlWindow->add_button( "CLEAR COOKIES", mIdMediaBrowserControlClearCookies, gluiCallbackWrapper ); + mGluiMediaBrowserControlWindow->add_column( false ); + mIdMediaBrowserControlEnableCookies = start_id++; + mMediaBrowserControlEnableCookies = 0; + mGluiMediaBrowserControlWindow->add_checkbox( "Enable Cookies", &mMediaBrowserControlEnableCookies, mIdMediaBrowserControlEnableCookies, gluiCallbackWrapper ); + + // top window - misc controls + GLUI* glui_window_misc_control = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP ); + mIdRandomPanelCount = start_id++; + mRandomPanelCount = 0; + glui_window_misc_control->add_checkbox( "Randomize panel count", &mRandomPanelCount, mIdRandomPanelCount, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + mIdRandomBookmarks = start_id++; + mRandomBookmarks = 0; + glui_window_misc_control->add_checkbox( "Randomize bookmarks", &mRandomBookmarks, mIdRandomBookmarks, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + + mIdDisableTimeout = start_id++; + mDisableTimeout = 0; + glui_window_misc_control->add_checkbox( "Disable plugin timeout", &mDisableTimeout, mIdDisableTimeout, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + + mIdUsePluginReadThread = start_id++; + mUsePluginReadThread = 0; + glui_window_misc_control->add_checkbox( "Use plugin read thread", &mUsePluginReadThread, mIdUsePluginReadThread, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); + + mIdLargePanelSpacing = start_id++; + mLargePanelSpacing = 0; + glui_window_misc_control->add_checkbox( "Large Panel Spacing", &mLargePanelSpacing, mIdLargePanelSpacing, gluiCallbackWrapper ); + glui_window_misc_control->set_main_gfx_window( mAppWindow ); + glui_window_misc_control->add_column( true ); +*/ + // bottom window - status + mBottomGLUIWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_BOTTOM ); + mStatusText = mBottomGLUIWindow->add_statictext( "" ); + mBottomGLUIWindow->set_main_gfx_window( mAppWindow ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::resetView() +{ + mViewRotationCtrl->reset(); + + mViewScaleCtrl->set_x( 0.0f ); + mViewScaleCtrl->set_y( 0.0f ); + mViewScaleCtrl->set_z( 1.3f ); + + mViewTranslationCtrl->set_x( 0.0f ); + mViewTranslationCtrl->set_y( 0.0f ); + mViewTranslationCtrl->set_z( 0.0f ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels ) +{ + int pick_texture_width = 1024; + int pick_texture_height = 1024; + int pick_texture_depth = 3; + unsigned char* ptr = new unsigned char[ pick_texture_width * pick_texture_height * pick_texture_depth ]; + for( int y = 0; y < pick_texture_height; ++y ) + { + for( int x = 0; x < pick_texture_width * pick_texture_depth ; x += pick_texture_depth ) + { + unsigned long bits = 0L; + bits |= ( id << 20 ) | ( y << 10 ) | ( x / 3 ); + unsigned char r_component = ( bits >> 16 ) & 0xff; + unsigned char g_component = ( bits >> 8 ) & 0xff; + unsigned char b_component = bits & 0xff; + + ptr[ y * pick_texture_width * pick_texture_depth + x + 0 ] = r_component; + ptr[ y * pick_texture_width * pick_texture_depth + x + 1 ] = g_component; + ptr[ y * pick_texture_width * pick_texture_depth + x + 2 ] = b_component; + }; + }; + + glGenTextures( 1, texture_handle ); + + checkGLError("glGenTextures"); + std::cout << "glGenTextures returned " << *texture_handle << std::endl; + + bindTexture( *texture_handle ); + glTexImage2D( GL_TEXTURE_2D, 0, + GL_RGB, + pick_texture_width, pick_texture_height, + 0, GL_RGB, GL_UNSIGNED_BYTE, ptr ); + + *texture_pixels = ptr; +} + +//////////////////////////////////////////////////////////////////////////////// +// +std::string LLFBConnectTest::mimeTypeFromUrl( std::string& url ) +{ + // default to web + std::string mime_type = "text/html"; + + // we may need a more advanced MIME type accessor later :-) + if ( url.find( ".mov" ) != std::string::npos ) // Movies + mime_type = "video/quicktime"; + else + if ( url.find( ".txt" ) != std::string::npos ) // Apple Text descriptors + mime_type = "video/quicktime"; + else + if ( url.find( ".mp3" ) != std::string::npos ) // Apple Text descriptors + mime_type = "video/quicktime"; + else + if ( url.find( "example://" ) != std::string::npos ) // Example plugin + mime_type = "example/example"; + + return mime_type; +} + +//////////////////////////////////////////////////////////////////////////////// +// +std::string LLFBConnectTest::pluginNameFromMimeType( std::string& mime_type ) +{ +#if LL_DARWIN + std::string plugin_name( "media_plugin_null.dylib" ); + if ( mime_type == "video/quicktime" ) + plugin_name = "media_plugin_quicktime.dylib"; + else + if ( mime_type == "text/html" ) + plugin_name = "media_plugin_webkit.dylib"; + +#elif LL_WINDOWS + std::string plugin_name( "media_plugin_null.dll" ); + + if ( mime_type == "video/quicktime" ) + plugin_name = "media_plugin_quicktime.dll"; + else + if ( mime_type == "text/html" ) + plugin_name = "media_plugin_webkit.dll"; + else + if ( mime_type == "example/example" ) + plugin_name = "media_plugin_example.dll"; + +#elif LL_LINUX + std::string plugin_name( "libmedia_plugin_null.so" ); + + if ( mime_type == "video/quicktime" ) + plugin_name = "libmedia_plugin_quicktime.so"; + else + if ( mime_type == "text/html" ) + plugin_name = "libmedia_plugin_webkit.so"; +#endif + return plugin_name; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel* LLFBConnectTest::addMediaPanel( std::string url ) +{ + // Get the plugin filename using the URL + std::string mime_type = mimeTypeFromUrl( url ); + std::string plugin_name = pluginNameFromMimeType( mime_type ); + + // create a random size for the new media + int media_width; + int media_height; + getRandomMediaSize( media_width, media_height, mime_type ); + media_width = 1024; + media_height = 1536; + + // make a new plugin + LLPluginClassMedia* media_source = new LLPluginClassMedia(this); + + // enable cookies so the FB login works + media_source->enable_cookies(true); + + // tell the plugin what size we asked for + media_source->setSize( media_width, media_height ); + + // Use the launcher start and initialize the plugin +#if LL_DARWIN || LL_LINUX + std::string launcher_name( "SLPlugin" ); +#elif LL_WINDOWS + std::string launcher_name( "SLPlugin.exe" ); +#endif + + // for this test app, use the cwd as the user data path (ugh). +#if LL_WINDOWS + std::string user_data_path = ".\\"; +#else + char cwd[ FILENAME_MAX ]; + if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) + { + std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; + return NULL; + } + std::string user_data_path = std::string( cwd ) + "/"; +#endif + media_source->setUserDataPath(user_data_path); + media_source->init( launcher_name, user_data_path, plugin_name, false ); + //media_source->setDisableTimeout(mDisableTimeout); + + // make a new panel and save parameters + mediaPanel* panel = new mediaPanel; + panel->mMediaSource = media_source; + panel->mStartUrl = url; + panel->mMimeType = mime_type; + panel->mMediaWidth = media_width; + panel->mMediaHeight = media_height; + panel->mTextureWidth = 0; + panel->mTextureHeight = 0; + panel->mTextureScaleX = 0; + panel->mTextureScaleY = 0; + panel->mMediaTextureHandle = 0; + panel->mPickTextureHandle = 0; + panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too + panel->mReadyToRender = false; + + // look through current media panels to find an unused index number + bool id_exists = true; + for( int nid = 0; nid < mMaxPanels; ++nid ) + { + // does this id exist already? + id_exists = false; + for( int pid = 0; pid < (int)mMediaPanels.size(); ++pid ) + { + if ( nid == mMediaPanels[ pid ]->mId ) + { + id_exists = true; + break; + }; + }; + + // id wasn't found so we can use it + if ( ! id_exists ) + { + panel->mId = nid; + break; + }; + }; + + // if we get here and this flag is set, there is no room for any more panels + if ( id_exists ) + { + std::cout << "No room for any more panels" << std::endl; + } + else + { + // now we have the ID we can use it to make the + // pick texture (id is baked into texture pixels) + makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels ); + + // save this in the list of panels + mMediaPanels.push_back( panel ); + + // select the panel that was just created + selectPanel( panel ); + + // load and start the URL + panel->mMediaSource->loadURI( url ); + panel->mMediaSource->start(); + + std::cout << "Adding new media panel for " << url << "(" << media_width << "x" << media_height << ") with index " << panel->mId << " - total panels = " << mMediaPanels.size() << std::endl; + } + + return panel; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::updateMediaPanel( mediaPanel* panel ) +{ +// checkGLError("LLFBConnectTest::updateMediaPanel"); + + if ( ! panel ) + return; + + if(!panel->mMediaSource || !panel->mMediaSource->textureValid()) + { + panel->mReadyToRender = false; + return; + } + + // take a reference copy of the plugin values since they + // might change during this lifetime of this function + int plugin_media_width = panel->mMediaSource->getWidth(); + int plugin_media_height = panel->mMediaSource->getHeight(); + int plugin_texture_width = panel->mMediaSource->getBitsWidth(); + int plugin_texture_height = panel->mMediaSource->getBitsHeight(); + + // If the texture isn't created or the media or texture dimensions changed AND + // the sizes are valid then we need to delete the old media texture (if necessary) + // then make a new one. + if ((panel->mMediaTextureHandle == 0 || + panel->mMediaWidth != plugin_media_width || + panel->mMediaHeight != plugin_media_height || + panel->mTextureWidth != plugin_texture_width || + panel->mTextureHeight != plugin_texture_height) && + ( plugin_media_width > 0 && plugin_media_height > 0 && + plugin_texture_width > 0 && plugin_texture_height > 0 ) ) + { + std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height + << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height + << ") for panel with ID=" << panel->mId << " - making texture" << std::endl; + + // delete old GL texture + if ( isTexture( panel->mMediaTextureHandle ) ) + { + std::cerr << "updateMediaPanel: deleting texture " << panel->mMediaTextureHandle << std::endl; + glDeleteTextures( 1, &panel->mMediaTextureHandle ); + panel->mMediaTextureHandle = 0; + } + + std::cerr << "before: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl; + + // make a GL texture based on the dimensions the plugin told us + GLuint new_texture = 0; + glGenTextures( 1, &new_texture ); + + checkGLError("glGenTextures"); + + std::cout << "glGenTextures returned " << new_texture << std::endl; + + panel->mMediaTextureHandle = new_texture; + + bindTexture( panel->mMediaTextureHandle ); + + std::cout << "Setting texture size to " << plugin_texture_width << " x " << plugin_texture_height << std::endl; + glTexImage2D( GL_TEXTURE_2D, 0, + GL_RGB, + plugin_texture_width, plugin_texture_height, + 0, GL_RGB, GL_UNSIGNED_BYTE, + 0 ); + + + std::cerr << "after: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl; + }; + + // update our record of the media and texture dimensions + // NOTE: do this after we we check for sizes changes + panel->mMediaWidth = plugin_media_width; + panel->mMediaHeight = plugin_media_height; + panel->mTextureWidth = plugin_texture_width; + panel->mTextureHeight = plugin_texture_height; + if ( plugin_texture_width > 0 ) + { + panel->mTextureScaleX = (double)panel->mMediaWidth / (double)panel->mTextureWidth; + }; + if ( plugin_texture_height > 0 ) + { + panel->mTextureScaleY = (double)panel->mMediaHeight / (double)panel->mTextureHeight; + }; + + // update the flag which tells us if the media source uses OprnGL coords or not. + panel->mAppTextureCoordsOpenGL = panel->mMediaSource->getTextureCoordsOpenGL(); + + // Check to see if we have enough to render this panel. + // If we do, set a flag that the display functions use so + // they only render a panel with media if it's ready. + if ( panel->mMediaWidth < 0 || + panel->mMediaHeight < 0 || + panel->mTextureWidth < 1 || + panel->mTextureHeight < 1 || + panel->mMediaTextureHandle == 0 ) + { + panel->mReadyToRender = false; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +mediaPanel* LLFBConnectTest::replaceMediaPanel( mediaPanel* panel, std::string url ) +{ + // no media panels so we can't change anything - have to add + if ( mMediaPanels.size() == 0 ) + return NULL; + + // sanity check + if ( ! panel ) + return NULL; + + int index; + for(index = 0; index < (int)mMediaPanels.size(); index++) + { + if(mMediaPanels[index] == panel) + break; + } + + if(index >= (int)mMediaPanels.size()) + { + // panel isn't in mMediaPanels + return NULL; + } + + std::cout << "Replacing media panel with index " << panel->mId << std::endl; + + int panel_id = panel->mId; + + if(mSelectedPanel == panel) + mSelectedPanel = NULL; + + delete panel; + + // Get the plugin filename using the URL + std::string mime_type = mimeTypeFromUrl( url ); + std::string plugin_name = pluginNameFromMimeType( mime_type ); + + // create a random size for the new media + int media_width; + int media_height; + getRandomMediaSize( media_width, media_height, mime_type ); + + // make a new plugin + LLPluginClassMedia* media_source = new LLPluginClassMedia(this); + + // tell the plugin what size we asked for + media_source->setSize( media_width, media_height ); + + // Use the launcher start and initialize the plugin +#if LL_DARWIN || LL_LINUX + std::string launcher_name( "SLPlugin" ); +#elif LL_WINDOWS + std::string launcher_name( "SLPlugin.exe" ); +#endif + + // for this test app, use the cwd as the user data path (ugh). +#if LL_WINDOWS + std::string user_data_path = ".\\"; +#else + char cwd[ FILENAME_MAX ]; + if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) + { + std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; + return NULL; + } + std::string user_data_path = std::string( cwd ) + "/"; +#endif + + media_source->setUserDataPath(user_data_path); + media_source->init( launcher_name, user_data_path, plugin_name, false ); + //media_source->setDisableTimeout(mDisableTimeout); + + // make a new panel and save parameters + panel = new mediaPanel; + panel->mMediaSource = media_source; + panel->mStartUrl = url; + panel->mMimeType = mime_type; + panel->mMediaWidth = media_width; + panel->mMediaHeight = media_height; + panel->mTextureWidth = 0; + panel->mTextureHeight = 0; + panel->mTextureScaleX = 0; + panel->mTextureScaleY = 0; + panel->mMediaTextureHandle = 0; + panel->mPickTextureHandle = 0; + panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too + panel->mReadyToRender = false; + + panel->mId = panel_id; + + // Replace the entry in the panels array + mMediaPanels[index] = panel; + + // now we have the ID we can use it to make the + // pick texture (id is baked into texture pixels) + makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels ); + + // select the panel that was just created + selectPanel( panel ); + + // load and start the URL + panel->mMediaSource->loadURI( url ); + panel->mMediaSource->start(); + + return panel; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::getRandomMediaSize( int& width, int& height, std::string mime_type ) +{ + // Make a new media source with a random size which we'll either + // directly or the media plugin will tell us what it wants later. + // Use a random size so we can test support for weird media sizes. + // (Almost everything else will get filled in later once the + // plugin responds) + // NB. Do we need to enforce that width is on 4 pixel boundary? + width = ( ( rand() % 170 ) + 30 ) * 4; + height = ( ( rand() % 170 ) + 30 ) * 4; + + // adjust this random size if it's a browser so we get + // a more useful size for testing.. + if ( mime_type == "text/html" || mime_type == "example/example" ) + { + width = ( ( rand() % 100 ) + 100 ) * 4; + height = ( width * ( ( rand() % 400 ) + 1000 ) ) / 1000; + }; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::remMediaPanel( mediaPanel* panel ) +{ + // always leave one panel + if ( mMediaPanels.size() == 1 ) + return; + + // sanity check - don't think this can happen but see above for a case where it might... + if ( ! panel ) + return; + + std::cout << "Removing media panel with index " << panel->mId << " - total panels = " << mMediaPanels.size() - 1 << std::endl; + + if(mSelectedPanel == panel) + mSelectedPanel = NULL; + + delete panel; + + // remove from storage list + for( int i = 0; i < (int)mMediaPanels.size(); ++i ) + { + if ( mMediaPanels[ i ] == panel ) + { + mMediaPanels.erase( mMediaPanels.begin() + i ); + break; + }; + }; + + // select the first panel + selectPanel( mMediaPanels[ 0 ] ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::updateStatusBar() +{ + if ( ! mSelectedPanel ) + return; + + // cache results - this is a very slow function + static int cached_id = -1; + static int cached_media_width = -1; + static int cached_media_height = -1; + static int cached_texture_width = -1; + static int cached_texture_height = -1; + static bool cached_supports_browser_media = true; + static bool cached_supports_time_media = false; + static int cached_movie_time = -1; + static GLfloat cached_distance = -1.0f; + + static std::string cached_plugin_version = ""; + if ( + cached_id == mSelectedPanel->mId && + cached_media_width == mSelectedPanel->mMediaWidth && + cached_media_height == mSelectedPanel->mMediaHeight && + cached_texture_width == mSelectedPanel->mTextureWidth && + cached_texture_height == mSelectedPanel->mTextureHeight && + cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() && + cached_supports_time_media == mSelectedPanel->mMediaSource->pluginSupportsMediaTime() && + cached_plugin_version == mSelectedPanel->mMediaSource->getPluginVersion() && + cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() && + cached_distance == mDistanceCameraToSelectedGeometry + ) + { + // nothing changed so don't spend time here + return; + }; + + std::ostringstream stream( "" ); + + stream.str( "" ); + stream.clear(); + + stream << "Id: "; + stream << std::setw( 2 ) << std::setfill( '0' ); + stream << mSelectedPanel->mId; + stream << " | "; + stream << "Media: "; + stream << std::setw( 3 ) << std::setfill( '0' ); + stream << mSelectedPanel->mMediaWidth; + stream << " x "; + stream << std::setw( 3 ) << std::setfill( '0' ); + stream << mSelectedPanel->mMediaHeight; + stream << " | "; + stream << "Texture: "; + stream << std::setw( 4 ) << std::setfill( '0' ); + stream << mSelectedPanel->mTextureWidth; + stream << " x "; + stream << std::setw( 4 ) << std::setfill( '0' ); + stream << mSelectedPanel->mTextureHeight; + + stream << " | "; + stream << "Distance: "; + stream << std::setw( 6 ); + stream << std::setprecision( 3 ); + stream << std::setprecision( 3 ); + stream << mDistanceCameraToSelectedGeometry; + stream << " | "; + + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() ) + stream << "BROWSER"; + else + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() ) + stream << "TIME "; + stream << " | "; + stream << mSelectedPanel->mMediaSource->getPluginVersion(); + stream << " | "; + if ( mSelectedPanel->mMediaSource->pluginSupportsMediaTime() ) + { + stream << std::setw( 3 ) << std::setfill( '0' ); + stream << (int)mSelectedPanel->mMediaSource->getCurrentTime(); + stream << " / "; + stream << std::setw( 3 ) << std::setfill( '0' ); + stream << (int)mSelectedPanel->mMediaSource->getDuration(); + stream << " @ "; + stream << (int)mSelectedPanel->mMediaSource->getCurrentPlayRate(); + stream << " | "; + }; + + glutSetWindow( mBottomGLUIWindow->get_glut_window_id() ); + mStatusText->set_text( const_cast< char*>( stream.str().c_str() ) ); + glutSetWindow( mAppWindow ); + + // caching + cached_id = mSelectedPanel->mId; + cached_media_width = mSelectedPanel->mMediaWidth; + cached_media_height = mSelectedPanel->mMediaHeight; + cached_texture_width = mSelectedPanel->mTextureWidth; + cached_texture_height = mSelectedPanel->mTextureHeight; + cached_supports_browser_media = mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser(); + cached_supports_time_media = mSelectedPanel->mMediaSource->pluginSupportsMediaTime(); + cached_plugin_version = mSelectedPanel->mMediaSource->getPluginVersion(); + cached_movie_time = (int)mSelectedPanel->mMediaSource->getCurrentTime(); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::dumpPanelInfo() +{ + std::cout << std::endl << "===== Media Panels =====" << std::endl; + for( int i = 0; i < (int)mMediaPanels.size(); ++i ) + { + std::cout << std::setw( 2 ) << std::setfill( '0' ); + std::cout << i + 1 << "> "; + std::cout << "Id: "; + std::cout << std::setw( 2 ) << std::setfill( '0' ); + std::cout << mMediaPanels[ i ]->mId; + std::cout << " | "; + std::cout << "Media: "; + std::cout << std::setw( 3 ) << std::setfill( '0' ); + std::cout << mMediaPanels[ i ]->mMediaWidth; + std::cout << " x "; + std::cout << std::setw( 3 ) << std::setfill( '0' ); + std::cout << mMediaPanels[ i ]->mMediaHeight; + std::cout << " | "; + std::cout << "Texture: "; + std::cout << std::setw( 4 ) << std::setfill( '0' ); + std::cout << mMediaPanels[ i ]->mTextureWidth; + std::cout << " x "; + std::cout << std::setw( 4 ) << std::setfill( '0' ); + std::cout << mMediaPanels[ i ]->mTextureHeight; + std::cout << " | "; + if ( mMediaPanels[ i ] == mSelectedPanel ) + std::cout << "(selected)"; + + std::cout << std::endl; + }; + std::cout << "========================" << std::endl; +} + +//////////////////////////////////////////////////////////////////////////////// +// +void LLFBConnectTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) +{ + // Uncomment this to make things much, much quieter. +// return; + + switch(event) + { + case MEDIA_EVENT_CONTENT_UPDATED: + // too spammy -- don't log these +// std::cerr << "Media event: MEDIA_EVENT_CONTENT_UPDATED " << std::endl; + break; + + case MEDIA_EVENT_TIME_DURATION_UPDATED: + // too spammy -- don't log these +// std::cerr << "Media event: MEDIA_EVENT_TIME_DURATION_UPDATED, time is " << self->getCurrentTime() << " of " << self->getDuration() << std::endl; + break; + + case MEDIA_EVENT_SIZE_CHANGED: + std::cerr << "Media event: MEDIA_EVENT_SIZE_CHANGED " << std::endl; + break; + + case MEDIA_EVENT_CURSOR_CHANGED: + std::cerr << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << self->getCursorName() << std::endl; + break; + + case MEDIA_EVENT_NAVIGATE_BEGIN: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN " << std::endl; + break; + + case MEDIA_EVENT_NAVIGATE_COMPLETE: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_COMPLETE, result string is: " << self->getNavigateResultString() << std::endl; + break; + + case MEDIA_EVENT_PROGRESS_UPDATED: + std::cerr << "Media event: MEDIA_EVENT_PROGRESS_UPDATED, loading at " << self->getProgressPercent() << "%" << std::endl; + break; + + case MEDIA_EVENT_STATUS_TEXT_CHANGED: + std::cerr << "Media event: MEDIA_EVENT_STATUS_TEXT_CHANGED, new status text is: " << self->getStatusText() << std::endl; + break; + + case MEDIA_EVENT_NAME_CHANGED: + std::cerr << "Media event: MEDIA_EVENT_NAME_CHANGED, new name is: " << self->getMediaName() << std::endl; + glutSetWindowTitle( self->getMediaName().c_str() ); + break; + + case MEDIA_EVENT_LOCATION_CHANGED: + { + std::cerr << "Media event: MEDIA_EVENT_LOCATION_CHANGED, new uri is: " << self->getLocation() << std::endl; + mediaPanel* panel = findMediaPanel(self); + if(panel != NULL) + { + panel->mStartUrl = self->getLocation(); + if(panel == mSelectedPanel) + { + mUrlEdit->set_text(const_cast<char*>(panel->mStartUrl.c_str()) ); + } + } + } + break; + + case MEDIA_EVENT_NAVIGATE_ERROR_PAGE: + std::cerr << "Media event: MEDIA_EVENT_NAVIGATE_ERROR_PAGE, uri is: " << self->getClickURL() << std::endl; + break; + + case MEDIA_EVENT_CLICK_LINK_HREF: + { + std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; + // retrieve the event parameters + std::string url = self->getClickURL(); + std::string target = self->getClickTarget(); + + if(target == "_external") + { + // this should open in an external browser, but since this is a test app we don't care. + } + else if(target == "_blank") + { + // Create a new panel with the specified URL. + addMediaPanel(url); + } + else // other named target + { + mediaPanel *target_panel = findMediaPanel(target); + if(target_panel) + { + target_panel = replaceMediaPanel(target_panel, url); + } + else + { + target_panel = addMediaPanel(url); + } + + if(target_panel) + { + target_panel->mTarget = target; + } + } + } + break; + + case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: + std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << std::endl; + break; + + case MEDIA_EVENT_PLUGIN_FAILED: + std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << std::endl; + break; + + case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH: + std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << std::endl; + break; + + case MEDIA_EVENT_CLOSE_REQUEST: + std::cerr << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << std::endl; + break; + + case MEDIA_EVENT_PICK_FILE_REQUEST: + std::cerr << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << std::endl; + // TODO: display an actual file picker + self->sendPickFileResponse("cake"); + break; + + case MEDIA_EVENT_GEOMETRY_CHANGE: + std::cerr << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() + << ", x = " << self->getGeometryX() + << ", y = " << self->getGeometryY() + << ", width = " << self->getGeometryWidth() + << ", height = " << self->getGeometryHeight() + << std::endl; + break; + + case MEDIA_EVENT_AUTH_REQUEST: + { + //std::cerr << "Media event: MEDIA_EVENT_AUTH_REQUEST, url " << self->getAuthURL() ", realm " << self->getAuthRealm() << std::endl; + + // TODO: display an auth dialog + self->sendAuthResponse(false, "", ""); + } + break; + + case MEDIA_EVENT_LINK_HOVERED: + { + std::cerr << "Media event: MEDIA_EVENT_LINK_HOVERED, hover text is: " << self->getHoverText() << std::endl; + } + break; + + default: + { + std::cerr << "Media event: <unknown>, code is: " << int(event) << std::endl; + } + break; + } +} + +//////////////////////////////////////////////////////////////////////////////// +// +static void gluiCallbackWrapper( int control_id ) +{ + if ( gApplication ) + gApplication->gluiCallback( control_id ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void glutReshape( int width, int height ) +{ + if ( gApplication ) + gApplication->reshape( width, height ); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void glutDisplay() +{ + if ( gApplication ) + gApplication->display(); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void glutIdle(int update_ms) +{ + GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms); + + if ( gApplication ) + gApplication->idle(); + +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void glutKeyboard( unsigned char key, int x, int y ) +{ + if ( gApplication ) + gApplication->keyboard( key ); +}; + +//////////////////////////////////////////////////////////////////////////////// +// +void glutMousePassive( int x, int y ) +{ + if ( gApplication ) + gApplication->mousePassive( x, y ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void glutMouseMove( int x , int y ) +{ + if ( gApplication ) + gApplication->mouseMove( x, y ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +void glutMouseButton( int button, int state, int x, int y ) +{ + if ( gApplication ) + gApplication->mouseButton( button, state, x, y ); +} + +//////////////////////////////////////////////////////////////////////////////// +// +int main( int argc, char* argv[] ) +{ +#if LL_DARWIN + // Set the current working directory to <application bundle>/Contents/Resources/ + CFURLRef resources_url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle()); + if(resources_url != NULL) + { + CFStringRef resources_string = CFURLCopyFileSystemPath(resources_url, kCFURLPOSIXPathStyle); + CFRelease(resources_url); + if(resources_string != NULL) + { + char buffer[PATH_MAX] = ""; + if(CFStringGetCString(resources_string, buffer, sizeof(buffer), kCFStringEncodingUTF8)) + { + chdir(buffer); + } + CFRelease(resources_string); + } + } +#endif + + glutInit( &argc, argv ); + glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB ); + + const int app_window_x = 80; + const int app_window_y = 0; + const int app_window_width = 960; + const int app_window_height = 960; + + glutInitWindowPosition( app_window_x, app_window_y ); + glutInitWindowSize( app_window_width, app_window_height ); + + int app_window_handle = glutCreateWindow( "LLFBConnectTest" ); + + glutDisplayFunc( glutDisplay ); + + GLUI_Master.set_glutReshapeFunc( glutReshape ); + GLUI_Master.set_glutKeyboardFunc( glutKeyboard ); + GLUI_Master.set_glutMouseFunc( glutMouseButton ); + + glutPassiveMotionFunc( glutMousePassive ); + glutMotionFunc( glutMouseMove ); + + glutSetWindow( app_window_handle ); + + gApplication = new LLFBConnectTest( app_window_handle, app_window_width, app_window_height ); + + // update at approximately 60hz + int update_ms = 1000 / 60; + + GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms); + + glutMainLoop(); + + delete gApplication; +} diff --git a/indra/test_apps/llfbconnecttest/llfbconnecttest.h b/indra/test_apps/llfbconnecttest/llfbconnecttest.h new file mode 100644 index 0000000000..6f442a55b3 --- /dev/null +++ b/indra/test_apps/llfbconnecttest/llfbconnecttest.h @@ -0,0 +1,207 @@ +/** + * @file LLFBConnectTest.cpp + * @brief Facebook Connect Test App + * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_FB_CONNECT_H +#define LL_FB_CONNECT_H + +#include <vector> +#include <string> +#include "llpluginclassmedia.h" +#include "llgl.h" + +// Forward declarations +class GLUI_Rotation; +class GLUI_Translation; +class GLUI_Listbox; +class GLUI_EditText; +class GLUI_StaticText; +class GLUI; +class GLUI_Button; + +//////////////////////////////////////////////////////////////////////////////// +// +struct mediaPanel +{ + public: + mediaPanel(); + ~mediaPanel(); + int mId; + std::string mStartUrl; + std::string mMimeType; + std::string mTarget; + LLPluginClassMedia *mMediaSource; + int mMediaWidth; + int mMediaHeight; + int mTextureWidth; + int mTextureHeight; + double mTextureScaleX; + double mTextureScaleY; + GLuint mMediaTextureHandle; + GLuint mPickTextureHandle; + unsigned char* mPickTexturePixels; + bool mAppTextureCoordsOpenGL; + bool mReadyToRender; +}; + +//////////////////////////////////////////////////////////////////////////////// +// +class LLFBConnectTest : public LLPluginClassMediaOwner +{ + public: + LLFBConnectTest( int app_window, int window_width, int window_height ); + ~LLFBConnectTest(); + + void reshape( int width, int height ); + void display(); + void idle(); + void gluiCallback( int control_id ); + void keyboard( int key ); + void mousePassive( int x, int y ); + void mouseButton( int button, int state, int x, int y ); + void mouseMove( int x, int y ); + + void bindTexture(GLuint texture, GLint row_length = 0, GLint alignment = 1); + bool checkGLError(const char *name = "OpenGL"); + void drawGeometry( int panel, bool selected ); + void startPanelHighlight( float red, float green, float blue, float line_width ); + void endPanelHighlight(); + enum { DrawTypePickTexture, DrawTypeMediaTexture }; + void draw( int draw_type ); + void windowPosToTexturePos( int window_x, int window_y, int& media_x, int& media_y, int& id ); + + mediaPanel* addMediaPanel( std::string url ); + void updateMediaPanel( mediaPanel* panel ); + void remMediaPanel( mediaPanel* panel ); + mediaPanel* replaceMediaPanel( mediaPanel* panel, std::string url ); + void getRandomMediaSize( int& width, int& height, std::string mime_type ); + void navigateToNewURI( std::string uri ); + void initUrlHistory( std::string uri ); + void selectPanelById( int id ); + void selectPanel( mediaPanel* panel ); + mediaPanel* findMediaPanel( LLPluginClassMedia* panel ); + mediaPanel* findMediaPanel( const std::string &target_name ); + void makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels ); + void makeChrome(); + void resetView(); + + void dumpPanelInfo(); + void updateStatusBar(); + + GLfloat distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z ); + + + // Inherited from LLPluginClassMediaOwner + /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, LLPluginClassMediaOwner::EMediaEvent); + + private: + const int mVersionMajor; + const int mVersionMinor; + const int mVersionPatch; + const int mMaxPanels; + int mAppWindow; + int mWindowWidth; + int mWindowHeight; + int mCurMouseX; + int mCurMouseY; + unsigned char mPixelReadColor[ 3 ]; + bool mFuzzyMedia; + const std::string mHomeWebUrl; + + std::vector< mediaPanel* > mMediaPanels; + mediaPanel* mSelectedPanel; + std::string mimeTypeFromUrl( std::string& url ); + std::string pluginNameFromMimeType( std::string& mime_type ); + + GLUI_Rotation* mViewRotationCtrl; + GLUI_Translation* mViewScaleCtrl; + GLUI_Translation* mViewTranslationCtrl; + float mViewportAspect; + float mViewPos[ 3 ]; + float mViewRotation[ 16 ]; + + float mDistanceCameraToSelectedGeometry; + + int mIdControlAddPanel; + int mIdControlRemPanel; + + std::vector< std::pair< std::string, std::string > > mBookmarks; + GLUI_Listbox* mBookmarkList; + int mIdBookmarks; + int mIdUrlEdit; + GLUI_EditText* mUrlEdit; + //int mIdUrlInitHistoryEdit; + //GLUI_EditText* mUrlInitHistoryEdit; + int mSelBookmark; + //int mIdRandomPanelCount; + //int mRandomPanelCount; + //int mIdRandomBookmarks; + //int mRandomBookmarks; + //int mIdDisableTimeout; + //int mDisableTimeout; + //int mIdUsePluginReadThread; + //int mUsePluginReadThread; + //int mIdLargePanelSpacing; + //int mLargePanelSpacing; + //int mIdControlCrashPlugin; + //int mIdControlHangPlugin; + int mIdControlExitApp; + + //GLUI* mGluiMediaTimeControlWindow; + //int mIdMediaTimeControlPlay; + //int mIdMediaTimeControlLoop; + //int mIdMediaTimeControlPause; + //int mIdMediaTimeControlStop; + //int mIdMediaTimeControlSeek; + //int mIdMediaTimeControlVolume; + //int mMediaTimeControlVolume; + //int mIdMediaTimeControlSeekSeconds; + //int mMediaTimeControlSeekSeconds; + //int mIdMediaTimeControlRewind; + //int mIdMediaTimeControlFastForward; + + GLUI* mGluiMediaBrowserControlWindow; + int mIdMediaBrowserControlBack; + GLUI_Button* mMediaBrowserControlBackButton; + int mIdMediaBrowserControlStop; + int mIdMediaBrowserControlForward; + GLUI_Button* mMediaBrowserControlForwardButton; + bool mGluiMediaTimeControlWindowFlag; + bool mGluiMediaBrowserControlWindowFlag; + bool mMediaBrowserControlBackButtonFlag; + bool mMediaBrowserControlForwardButtonFlag; + int mIdMediaBrowserControlHome; + int mIdMediaBrowserControlReload; + int mIdMediaBrowserControlClearCache; + int mIdMediaBrowserControlClearCookies; + int mIdMediaBrowserControlEnableCookies; + int mMediaBrowserControlEnableCookies; + + GLUI* mBottomGLUIWindow; + GLUI_StaticText* mStatusText; +}; + +#endif // LL_FB_CONNECT_H + diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp index d6e06e5316..dc8ff2f644 100755 --- a/indra/viewer_components/updater/llupdatechecker.cpp +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -79,7 +79,6 @@ void LLUpdateChecker::checkVersion(std::string const & urlBase, //----------------------------------------------------------------------------- -const char * LLUpdateChecker::Implementation::sLegacyProtocolVersion = "v1.0"; const char * LLUpdateChecker::Implementation::sProtocolVersion = "v1.1"; @@ -150,40 +149,11 @@ void LLUpdateChecker::Implementation::completed(U32 status, server_error += content["error_text"].asString(); } - if (status == 404) - { - if (mProtocol == sProtocolVersion) - { - mProtocol = sLegacyProtocolVersion; - std::string retryUrl = buildUrl(mUrlBase, mChannel, mVersion, mPlatform, mPlatformVersion, mUniqueId, mWillingToTest); - - LL_WARNS("UpdaterService") - << "update response using " << sProtocolVersion - << " was HTTP 404 (" << server_error - << "); retry with legacy protocol " << mProtocol - << "\n at " << retryUrl - << LL_ENDL; - - mHttpClient.get(retryUrl, this); - } - else - { - LL_WARNS("UpdaterService") - << "update response using " << sLegacyProtocolVersion - << " was 404 (" << server_error - << "); request failed" - << LL_ENDL; - mClient.error(reason); - } - } - else - { - LL_WARNS("UpdaterService") << "response error " << status - << " " << reason - << " (" << server_error << ")" - << LL_ENDL; - mClient.error(reason); - } + LL_WARNS("UpdaterService") << "response error " << status + << " " << reason + << " (" << server_error << ")" + << LL_ENDL; + mClient.error(reason); } else { @@ -213,11 +183,8 @@ std::string LLUpdateChecker::Implementation::buildUrl(std::string const & urlBas path.append(channel); path.append(version); path.append(platform); - if (mProtocol != sLegacyProtocolVersion) - { - path.append(platform_version); - path.append(willing_to_test ? "testok" : "testno"); - path.append((char*)uniqueid); - } + path.append(platform_version); + path.append(willing_to_test ? "testok" : "testno"); + path.append((char*)uniqueid); return LLURI::buildHTTP(urlBase, path).asString(); } diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp index c28ad76c77..c42112af80 100755 --- a/indra/viewer_components/updater/llupdatedownloader.cpp +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -77,7 +77,8 @@ private: void run(void); void startDownloading(LLURI const & uri, std::string const & hash); void throwOnCurlError(CURLcode code); - bool validateDownload(void); + bool validateDownload(const std::string& filePath); + bool validateOrRemove(const std::string& filePath); LOG_CLASS(LLUpdateDownloader::Implementation); }; @@ -295,9 +296,8 @@ void LLUpdateDownloader::Implementation::resume(void) { resumeDownloading(fileStatus.st_size); } - else if(!validateDownload()) + else if(!validateOrRemove(filePath)) { - LLFile::remove(filePath); download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString(), mDownloadData["update_channel"].asString(), @@ -421,19 +421,13 @@ void LLUpdateDownloader::Implementation::run(void) if(code == CURLE_OK) { LLFile::remove(mDownloadRecordPath); - if(validateDownload()) + if(validateOrRemove(mDownloadData["path"])) { LL_INFOS("UpdaterService") << "download successful" << LL_ENDL; mClient.downloadComplete(mDownloadData); } else { - LL_INFOS("UpdaterService") << "download failed hash check" << LL_ENDL; - std::string filePath = mDownloadData["path"].asString(); - if(filePath.size() != 0) - { - LLFile::remove(filePath); - } mClient.downloadError("failed hash check"); } } @@ -449,7 +443,9 @@ void LLUpdateDownloader::Implementation::run(void) LLFile::remove(mDownloadRecordPath); if(mDownloadData.has("path")) { - LLFile::remove(mDownloadData["path"].asString()); + std::string filePath = mDownloadData["path"].asString(); + LL_INFOS("UpdaterService") << "removing " << filePath << LL_ENDL; + LLFile::remove(filePath); } mClient.downloadError("curl error"); } @@ -561,31 +557,49 @@ void LLUpdateDownloader::Implementation::throwOnCurlError(CURLcode code) } } +bool LLUpdateDownloader::Implementation::validateOrRemove(const std::string& filePath) +{ + bool valid = validateDownload(filePath); + if (! valid) + { + LL_INFOS("UpdaterService") << "removing " << filePath << LL_ENDL; + LLFile::remove(filePath); + } + return valid; +} -bool LLUpdateDownloader::Implementation::validateDownload(void) +bool LLUpdateDownloader::Implementation::validateDownload(const std::string& filePath) { - std::string filePath = mDownloadData["path"].asString(); llifstream fileStream(filePath, std::ios_base::in | std::ios_base::binary); if(!fileStream) { + LL_INFOS("UpdaterService") << "can't open " << filePath << ", invalid" << LL_ENDL; return false; } std::string hash = mDownloadData["hash"].asString(); - if(hash.size() != 0) + if (! hash.empty()) { - LL_INFOS("UpdaterService") << "checking hash..." << LL_ENDL; char digest[33]; LLMD5(fileStream).hex_digest(digest); - if(hash != digest) + if (hash == digest) + { + LL_INFOS("UpdaterService") << "verified hash " << hash + << " for downloaded " << filePath << LL_ENDL; + return true; + } + else { - LL_WARNS("UpdaterService") << "download hash mismatch; expected " << hash << - " but download is " << digest << LL_ENDL; + LL_WARNS("UpdaterService") << "download hash mismatch for " + << filePath << ": expected " << hash + << " but computed " << digest << LL_ENDL; + return false; } - return hash == digest; } else { + LL_INFOS("UpdaterService") << "no hash specified for " << filePath + << ", unverified" << LL_ENDL; return true; // No hash check provided. } } diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp index 16950e1d62..cb3be5bbdc 100755 --- a/indra/viewer_components/updater/llupdaterservice.cpp +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -296,37 +296,49 @@ bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller) update_marker.close(); // Get the path to the installer file. - LLSD path = update_info.get("path"); - if(update_info["current_version"].asString() != ll_get_version()) + std::string path(update_info.get("path")); + std::string downloader_version(update_info["current_version"]); + if (downloader_version != ll_get_version()) { // This viewer is not the same version as the one that downloaded - // the update. Do not install this update. - if(!path.asString().empty()) + // the update. Do not install this update. + LL_INFOS("UpdaterService") << "ignoring update downloaded by " + << "different viewer version " + << downloader_version << LL_ENDL; + if (! path.empty()) { - LL_INFOS("UpdaterService") << "ignoring update dowloaded by different client version" << LL_ENDL;; - LLFile::remove(path.asString()); + LL_INFOS("UpdaterService") << "removing " << path << LL_ENDL; + LLFile::remove(path); LLFile::remove(update_marker_path()); } - else - { - ; // Nothing to clean up. - } - + foundInstall = false; } - else if(path.isDefined() && !path.asString().empty()) + else if (path.empty()) + { + LL_WARNS("UpdaterService") << "Marker file " << update_marker_path() + << " 'path' entry empty, ignoring" << LL_ENDL; + foundInstall = false; + } + else if (! LLFile::isfile(path)) + { + LL_WARNS("UpdaterService") << "Nonexistent installer " << path + << ", ignoring" << LL_ENDL; + foundInstall = false; + } + else { if(launchInstaller) { setState(LLUpdaterService::INSTALLING); - + LLFile::remove(update_marker_path()); int result = ll_install_update(install_script_path(), - update_info["path"].asString(), + path, update_info["required"].asBoolean(), install_script_mode()); - + if((result == 0) && mAppExitCallback) { mAppExitCallback(); @@ -360,7 +372,8 @@ bool LLUpdaterServiceImpl::checkForResume() LLSD download_info; LLSDSerialize::fromXMLDocument(download_info, download_marker_stream); download_marker_stream.close(); - if(download_info["current_version"].asString() == ll_get_version()) + std::string downloader_version(download_info["current_version"]); + if (downloader_version == ll_get_version()) { mIsDownloading = true; mNewVersion = download_info["update_version"].asString(); @@ -371,10 +384,13 @@ bool LLUpdaterServiceImpl::checkForResume() else { // The viewer that started this download is not the same as this viewer; ignore. - LL_INFOS("UpdaterService") << "ignoring partial download from different viewer version" << LL_ENDL;; + LL_INFOS("UpdaterService") << "ignoring partial download " + << "from different viewer version " + << downloader_version << LL_ENDL; std::string path = download_info["path"].asString(); if(!path.empty()) { + LL_INFOS("UpdaterService") << "removing " << path << LL_ENDL; LLFile::remove(path); } LLFile::remove(download_marker_path); @@ -539,7 +555,7 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) // Check for failed install. if(LLFile::isfile(ll_install_failed_marker_path())) { - LL_DEBUGS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL;; + LL_DEBUGS("UpdaterService") << "found marker " << ll_install_failed_marker_path() << LL_ENDL; int requiredValue = 0; { llifstream stream(ll_install_failed_marker_path()); @@ -552,12 +568,12 @@ bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) // TODO: notify the user. LL_WARNS("UpdaterService") << "last install attempt failed" << LL_ENDL;; LLFile::remove(ll_install_failed_marker_path()); - + LLSD event; event["type"] = LLSD(LLUpdaterService::INSTALL_ERROR); event["required"] = LLSD(requiredValue); LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).post(event); - + setState(LLUpdaterService::TERMINAL); } else diff --git a/indra/viewer_components/updater/scripts/darwin/update_install.py b/indra/viewer_components/updater/scripts/darwin/update_install.py index 2fc6fcdb29..08f4f0ebb9 100755 --- a/indra/viewer_components/updater/scripts/darwin/update_install.py +++ b/indra/viewer_components/updater/scripts/darwin/update_install.py @@ -17,6 +17,7 @@ $/LicenseInfo$ import os import sys import cgitb +from contextlib import contextmanager import errno import glob import plistlib @@ -32,6 +33,11 @@ import Tkinter, tkMessageBox TITLE = "Second Life Viewer Updater" # Magic bundle identifier used by all Second Life viewer bundles BUNDLE_IDENTIFIER = "com.secondlife.indra.viewer" +# Magic OS directory name that causes Cocoa viewer to crash on OS X 10.7.5 +# (see MAINT-3331) +STATE_DIR = os.path.join( + os.environ["HOME"], "Library", "Saved Application State", + BUNDLE_IDENTIFIER + ".savedState") # Global handle to the MessageFrame so we can update message FRAME = None @@ -137,6 +143,23 @@ def write_marker(markerfile, markertext): log("%s exception: %s" % (err.__class__.__name__, err)) # **************************************************************************** +# Utility +# **************************************************************************** +@contextmanager +def allow_errno(errn): + """ + Execute body of 'with' statement, accepting OSError with specific errno + 'errn'. Propagate any other exception, or an OSError with any other errno. + """ + try: + # run the body of the 'with' statement + yield + except OSError, err: + # unless errno == passed errn, re-raise the exception + if err.errno != errn: + raise + +# **************************************************************************** # Main script logic # **************************************************************************** def main(dmgfile, markerfile, markertext): @@ -158,12 +181,9 @@ def main(dmgfile, markerfile, markertext): # Move the old updater.log file out of the way logname = os.path.join(logsdir, "updater.log") - try: + # Nonexistence is okay. Anything else, not so much. + with allow_errno(errno.ENOENT): os.rename(logname, logname + ".old") - except OSError, err: - # Nonexistence is okay. Anything else, not so much. - if err.errno != errno.ENOENT: - raise # Open new updater.log. global LOGF @@ -179,6 +199,11 @@ def main(dmgfile, markerfile, markertext): # prepare for other cleanup with Janitor(LOGF) as janitor: + # Under some circumstances, this script seems to be invoked with a + # nonexistent pathname. Check for that. + if not os.path.isfile(dmgfile): + fail(dmgfile + " has been deleted") + # Try to derive the name of the running viewer app bundle from our # own pathname. (Hopefully the old viewer won't copy this script # to a temp dir before running!) @@ -345,10 +370,24 @@ def main(dmgfile, markerfile, markertext): log("touch " + appdir) os.utime(appdir, None) # set to current time + # MAINT-3331: remove STATE_DIR. Empirically, this resolves a + # persistent, mysterious crash after updating our viewer on an OS + # X 10.7.5 system. + log("rm -rf '%s'" % STATE_DIR) + with allow_errno(errno.ENOENT): + shutil.rmtree(STATE_DIR) + command = ["open", appdir] log(' '.join(command)) subprocess.check_call(command, stdout=LOGF, stderr=subprocess.STDOUT) + # If all the above succeeded, delete the .dmg file. We don't do this + # as a janitor.later() operation because we only want to do it if we + # get this far successfully. Note that this is out of the scope of the + # Janitor: we must detach the .dmg before removing it! + log("rm " + dmgfile) + os.remove(dmgfile) + except Exception, err: # Because we carefully set sys.excepthook -- and even modify it to log # the problem once we have our log file open -- you might think we |