diff --git a/.hgignore b/.hgignore index c845758e7ce33da2c381bae3eb96459cffaa4cc7..a8a244596d44cdb3d3be789af06cd4dda54ce7e7 100755 --- a/.hgignore +++ b/.hgignore @@ -33,6 +33,7 @@ indra/newview/app_settings/static_*.db2 indra/newview/browser_profile indra/newview/character indra/newview/fmod.dll +indra/newview/fmod.log indra/newview/mozilla-theme indra/newview/mozilla-universal-darwin.tgz indra/newview/res/ll_icon.* diff --git a/.hgtags b/.hgtags index 5cdeede2eaa81915adea929a3f99f8e7c93ac805..07ddf93c11858f1c5952b42e0e18501b5d6de1f0 100755 --- a/.hgtags +++ b/.hgtags @@ -465,4 +465,9 @@ fe4f7c5e9fd27e09d03deb1cc9ab3e5093f6309e 3.6.3-release 83357f31d8dbf048a8bfdc323f363bf4d588aca1 CHOP-951-a 91ed595b716f14f07409595b734fda891a59379e 3.6.4-release bf6d453046011a11de2643fac610cc5258650f82 3.6.5-release -b62e417982d9d4f3ec49d0de3b3c2e37c6d394c1 3.6.6-release +ae457ece77001767ae9613148c495e7b98cc0f4a 3.6.7-release +d40c66e410741de7e90b1ed6dac28dd8a2d7e1f6 3.6.8-release +70eda3721d36df3e00730629c42a1304e5bc65b8 3.6.9-release +5b54b36862ff8bc3b6935673c9d1c1f22ee8d521 3.6.10-release +2feb70a4cfde43f2898d95ff8fcae3e67805c7c2 3.6.11-release +88bbfd7a6971033f3aa103f3a3500ceb4c73521b 3.6.12-release diff --git a/BuildParams b/BuildParams index 327530934d288942111ea437cda3ef7acb3c05d5..6b63448c52743cc83987552425d1addb5d8981f5 100755 --- a/BuildParams +++ b/BuildParams @@ -23,12 +23,10 @@ codeticket_since = 3.3.0-release # Override build system default toolchain # Note that this will only affect automated builds. +Linux.distcc_version = Linux.gcc_version = /usr/bin/gcc-4.6 Linux.cxx_version = /usr/bin/g++-4.6 -# Setup default sourceid so Windows can pick up the TeamCity override -sourceid = "" - ################################################################ #### Examples of how to set the viewer_channel #### # @@ -49,6 +47,18 @@ sourceid = "" ################################################################ viewer_channel = "Second Life Test" +# Setup default packaging parameters. +sourceid = "" +additional_packages = "Amazon Desura B C" +Amazon_sourceid = "1207v_Amazon" +Amazon_viewer_channel_suffix = "Amazon" +Desura_sourceid = "1208_desura" +Desura_viewer_channel_suffix = "Desura" +B_sourceid = "1301_B" +B_viewer_channel_suffix = "B" +C_sourceid = "1302_C" +C_viewer_channel_suffix = "C" + # Report changes since... viewer-development.show_changes_since = last_sprint diff --git a/autobuild.xml b/autobuild.xml index b1478a46b24017b18aee5e26009cca3a3b24d54e..8194b3d4ebb6735ba61f6c863edf154a56f49155 100755 --- a/autobuild.xml +++ b/autobuild.xml @@ -1965,11 +1965,11 @@ <key>package_description</key> <map> <key>description</key> - <string>Spell checking dictionaries</string> + <string>Second Life Viewer</string> <key>license</key> - <string>various open</string> + <string>LGPL</string> <key>name</key> - <string>dictionaries</string> + <string>Second Life Viewer</string> <key>platforms</key> <map> <key>common</key> diff --git a/build.sh b/build.sh index a78f368e475aa9a52c1aa42ade842ff093fa29c4..ccc8476ceafb0e4c3edc5ea12692a1712211b647 100755 --- a/build.sh +++ b/build.sh @@ -38,22 +38,22 @@ build_dir_CYGWIN() installer_Darwin() { - ls -1td "$(build_dir_Darwin ${last_built_variant:-Release})/newview/"*.dmg 2>/dev/null | sed 1q + ls -1tr "$(build_dir_Darwin ${last_built_variant:-Release})/newview/"*"$additional_package_name"*.dmg 2>/dev/null | sed 1q } installer_Linux() { - ls -1td "$(build_dir_Linux ${last_built_variant:-Release})/newview/"*.tar.bz2 2>/dev/null | sed 1q + ls -1tr "$(build_dir_Linux ${last_built_variant:-Release})/newview/"*"$additional_package_name"*.tar.bz2 2>/dev/null | grep -v symbols | sed 1q } installer_CYGWIN() { v=${last_built_variant:-Release} d=$(build_dir_CYGWIN $v) - if [ -r "$d/newview/$v/touched.bat" ] + if [ -r "$d/newview/$additional_package_name$v/touched.bat" ] then - p=$(sed 's:.*=::' "$d/newview/$v/touched.bat") - echo "$d/newview/$v/$p" + p=$(sed 's:.*=::' "$d/newview/$additional_package_name$v/touched.bat") + echo "$d/newview/$additional_package_name$v/$p" fi } @@ -347,18 +347,35 @@ then if $build_viewer then begin_section Upload Installer - # Upload installer - note that ONLY THE FIRST ITEM uploaded as "installer" - # will appear in the version manager. + # Upload installer package=$(installer_$arch) if [ x"$package" = x ] || test -d "$package" then # Coverity doesn't package, so it's ok, anything else is fail succeeded=$build_coverity else + # Upload base package. upload_item installer "$package" binary/octet-stream upload_item quicklink "$package" binary/octet-stream [ -f $build_dir/summary.json ] && upload_item installer $build_dir/summary.json text/plain + # Upload additional packages. + for package_id in $additional_packages + do + case $arch in + CYGWIN) export additional_package_name="$package_id/" ;; + *) export additional_package_name=$package_id ;; + esac + package=$(installer_$arch) + if [ x"$package" != x ] + then + upload_item installer "$package" binary/octet-stream + else + record_failure "Failed to upload $package_id package ($package::$additional_package_name)." + fi + done + export additional_package_name="" + case "$last_built_variant" in Release) # Upload crash reporter files diff --git a/doc/contributions.txt b/doc/contributions.txt index 0035d4f597ef2dcb955086e18ae3d8aa34ef1a08..2f9d0c2c86ecc359ead1240cebf737c61a66805a 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -175,8 +175,11 @@ Ansariel Hiller STORM-1685 STORM-1713 STORM-1899 + STORM-1932 + STORM-1933 MAINT-2368 STORM-1931 + MAINT-2773 Aralara Rajal Arare Chantilly CHUIBUG-191 @@ -304,9 +307,13 @@ Christopher Organiser Ciaran Laval Cinder Roxley BUG-2326 + OPEN-185 STORM-1703 STORM-1948 + STORM-1888 + STORM-1958 STORM-1952 + STORM-1951 Clara Young Coaldust Numbers VWR-1095 @@ -652,7 +659,7 @@ Jonathan Yap STORM-1809 STORM-1793 STORM-1810 - STORM-1877 + STORM-1838 STORM-1892 STORM-1894 STORM-1860 @@ -662,8 +669,11 @@ Jonathan Yap STORM-1858 STORM-1862 STORM-1918 + STORM-1929 STORM-1953 OPEN-161 + STORM-1953 + STORM-1957 Kadah Coba STORM-1060 STORM-1843 @@ -679,7 +689,9 @@ Kagehi Kohn Kaimen Takahe Katharine Berry STORM-1900 + OPEN-149 STORM-1940 + OPEN-149 STORM-1941 Keklily Longfall Ken Lavender @@ -924,8 +936,13 @@ Nicky Dasmijn MAINT-873 SUN-72 BUG-2432 + STORM-1935 + STORM-1936 BUG-3605 CHUIBUG-197 + OPEN-187 + STORM-1937 + OPEN-187 Nicky Perian OPEN-1 STORM-1087 @@ -1122,6 +1139,7 @@ Slee Mayo snowy Sidran Sovereign Engineer MAINT-2334 + OPEN-189 SpacedOut Frye VWR-34 VWR-45 @@ -1166,6 +1184,7 @@ TankMaster Finesmith STORM-1258 STORM-1602 STORM-1868 + STORM-1950 VWR-26622 VWR-29224 Talamasca @@ -1290,6 +1309,7 @@ Westley Streeter Whimsy Winx Whirly Fizzle STORM-1895 + VWR-29543 MAINT-873 STORM-1930 Whoops Babii @@ -1353,6 +1373,7 @@ YongYong Francois Zak Westminster Zai Lynch VWR-19505 + STORM-1902 Zana Kohime Zaren Alexander Zarkonnen Decosta diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index bdbfc55fa28af0b77992704e6b73471bb7910b0c..410d25ad972a7b90ff98b044eff8ff55fc83baed 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/00-Common.cmake b/indra/cmake/00-Common.cmake index 472f271fa8dc5e5d6c03c98594932d8c8ed2f892..87484f4ae3628c2957555b9da678944af0284592 100755 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -131,6 +131,17 @@ if (LINUX) # Let's actually get a numerical version of gxx's version STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION}) + # Hacks to work around gcc 4.1 TC build pool machines which can't process pragma warning disables + # This is pure rubbish; I wish there was another way. + # + if(${CXX_VERSION_NUMBER} LESS 420) + set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-uninitialized -Wno-unused-variable -Wno-unused-function ${CMAKE_CXX_FLAGS}") + endif (${CXX_VERSION_NUMBER} LESS 420) + + if(${CXX_VERSION_NUMBER} GREATER 459) + set(CMAKE_CXX_FLAGS "-Wno-deprecated -Wno-unused-but-set-variable -Wno-unused-variable ${CMAKE_CXX_FLAGS}") + endif (${CXX_VERSION_NUMBER} GREATER 459) + # gcc 4.3 and above don't like the LL boost and also # cause warnings due to our use of deprecated headers if(${CXX_VERSION_NUMBER} GREATER 429) diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index af2063ce6d7ad8d2f9d241baec448ec41734df0e..e4b63dc7cb8d8c4bdc954c954299106565a02fdb 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 1b211ca7b9d5f360f1e89d3effd64315fea76767..44c2d3ac27b8bf460b15b8623de7f7314f268813 100755 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -270,6 +270,7 @@ elseif(LINUX) libdb-5.1.so libexpat.so libexpat.so.1 + libfreetype.so.6 libGLOD.so libgmock_main.so libgmock.so.0 diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake index baa61d73c8f43c6c01e1a3dbbb46851ebf761b97..c9a90a9a8da518f9f66df03439607edc203a81c2 100755 --- a/indra/cmake/FreeType.cmake +++ b/indra/cmake/FreeType.cmake @@ -7,7 +7,7 @@ if (STANDALONE) pkg_check_modules(FREETYPE REQUIRED freetype2) else (STANDALONE) use_prebuilt_binary(freetype) - set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) + set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) set(FREETYPE_LIBRARIES freetype) endif (STANDALONE) diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 54049b5545bf8ef9dae8321b5ded922b7240228a..1d85aa297802ea473d49bca683dd805b5e6552ca 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/lltexlayer.cpp b/indra/llappearance/lltexlayer.cpp index f951a982e5b5c5ec190e3f0651eb4ab74eb37249..a3a86168642666fbe973e8d6fb4e0c83fc9ce132 100644 --- a/indra/llappearance/lltexlayer.cpp +++ b/indra/llappearance/lltexlayer.cpp @@ -1123,7 +1123,10 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height) // *TODO: Is this correct? //gPipeline.disableLights(); stop_glerror(); - glDisable(GL_LIGHTING); + if (!LLGLSLShader::sNoFixedFunction) + { + glDisable(GL_LIGHTING); + } stop_glerror(); bool use_shaders = LLGLSLShader::sNoFixedFunction; diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp index 0d0b85ba60480ff4a1c61c7f3c4a416bfd3790b4..4e8c3268c5de0124294c103e61999ca9dfd78385 100755 --- a/indra/llcharacter/lleditingmotion.cpp +++ b/indra/llcharacter/lleditingmotion.cpp @@ -258,3 +258,4 @@ void LLEditingMotion::onDeactivate() // End + diff --git a/indra/llcharacter/llheadrotmotion.cpp b/indra/llcharacter/llheadrotmotion.cpp index 15a58a8389730ea388ac9c552556265be90bc2a1..2b1aa194a9a52b19ddb9680e852201b54bb54ca4 100755 --- a/indra/llcharacter/llheadrotmotion.cpp +++ b/indra/llcharacter/llheadrotmotion.cpp @@ -530,3 +530,4 @@ void LLEyeMotion::onDeactivate() } // End + diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index c6f45bffa2e941760730056b9c8b5a1af8ef7ae9..07ef52228e64a0451c54e7938a1c562f13e5e82a 100755 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -672,7 +672,8 @@ BOOL LLKeyframeMotion::onActivate() //----------------------------------------------------------------------------- BOOL LLKeyframeMotion::onUpdate(F32 time, U8* joint_mask) { - llassert(time >= 0.f); + // llassert(time >= 0.f); // This will fire + time = llmax(0.f, time); if (mJointMotionList->mLoop) { @@ -2304,3 +2305,4 @@ LLKeyframeMotion::JointConstraint::~JointConstraint() } // End + diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp index d52eb89a5c2e6f2114d9c74c6c62103163acafb4..69f064b615528c5db5d9345accbb9e91efcdfcd4 100755 --- a/indra/llcharacter/llkeyframewalkmotion.cpp +++ b/indra/llcharacter/llkeyframewalkmotion.cpp @@ -390,3 +390,4 @@ BOOL LLFlyAdjustMotion::onUpdate(F32 time, U8* joint_mask) return TRUE; } + diff --git a/indra/llcharacter/llmotion.cpp b/indra/llcharacter/llmotion.cpp index 2551f125d05cddc73c2440b9a381b721aee43026..a07f9f4d2e2f4339b83a7f8c5025f31f6c91d2a9 100755 --- a/indra/llcharacter/llmotion.cpp +++ b/indra/llcharacter/llmotion.cpp @@ -169,3 +169,4 @@ BOOL LLMotion::canDeprecate() } // End + diff --git a/indra/llcharacter/lltargetingmotion.cpp b/indra/llcharacter/lltargetingmotion.cpp index 489aef923ce4972b02781d6ea784ac7478acc8f6..fa5f06328e68b01e15cf9298d206defbb9e8b359 100755 --- a/indra/llcharacter/lltargetingmotion.cpp +++ b/indra/llcharacter/lltargetingmotion.cpp @@ -169,3 +169,4 @@ void LLTargetingMotion::onDeactivate() // End + diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 3a4a8facc217ef7b041d83a614618009bd0901bb..8eb0c6249dbbe6fc2f84679364129ec004337eb4 100755 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -122,6 +122,7 @@ set(llcommon_HEADER_FILES linden_common.h linked_lists.h llaccountingcost.h + llalignedarray.h llallocator.h llallocator_heap_profile.h llagentconstants.h @@ -237,6 +238,7 @@ set(llcommon_HEADER_FILES llstrider.h llstring.h llstringtable.h + llstaticstringtable.h llsys.h llthread.h llthreadsafequeue.h diff --git a/indra/llcommon/llalignedarray.h b/indra/llcommon/llalignedarray.h new file mode 100644 index 0000000000000000000000000000000000000000..ed8fd3120593d829bb62391d38bc2c940fde7ca5 --- /dev/null +++ b/indra/llcommon/llalignedarray.h @@ -0,0 +1,139 @@ +/** + * @file llalignedarray.h + * @brief A static array which obeys alignment restrictions and mimics std::vector accessors. + * + * $LicenseInfo:firstyear=2002&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_LLALIGNEDARRAY_H +#define LL_LLALIGNEDARRAY_H + +#include "llmemory.h" + +template <class T, U32 alignment> +class LLAlignedArray +{ +public: + T* mArray; + U32 mElementCount; + U32 mCapacity; + + LLAlignedArray(); + ~LLAlignedArray(); + + void push_back(const T& elem); + U32 size() const { return mElementCount; } + void resize(U32 size); + T* append(S32 N); + T& operator[](int idx); + const T& operator[](int idx) const; +}; + +template <class T, U32 alignment> +LLAlignedArray<T, alignment>::LLAlignedArray() +{ + llassert(alignment >= 16); + mArray = NULL; + mElementCount = 0; + mCapacity = 0; +} + +template <class T, U32 alignment> +LLAlignedArray<T, alignment>::~LLAlignedArray() +{ + ll_aligned_free(mArray); + mArray = NULL; + mElementCount = 0; + mCapacity = 0; +} + +template <class T, U32 alignment> +void LLAlignedArray<T, alignment>::push_back(const T& elem) +{ + T* old_buf = NULL; + if (mCapacity <= mElementCount) + { + mCapacity++; + mCapacity *= 2; + T* new_buf = (T*) ll_aligned_malloc(mCapacity*sizeof(T), alignment); + if (mArray) + { + ll_memcpy_nonaliased_aligned_16((char*)new_buf, (char*)mArray, sizeof(T)*mElementCount); + } + old_buf = mArray; + mArray = new_buf; + } + + mArray[mElementCount++] = elem; + + //delete old array here to prevent error on a.push_back(a[0]) + ll_aligned_free(old_buf); +} + +template <class T, U32 alignment> +void LLAlignedArray<T, alignment>::resize(U32 size) +{ + if (mCapacity < size) + { + mCapacity = size+mCapacity*2; + T* new_buf = mCapacity > 0 ? (T*) ll_aligned_malloc(mCapacity*sizeof(T), alignment) : NULL; + if (mArray) + { + ll_memcpy_nonaliased_aligned_16((char*) new_buf, (char*) mArray, sizeof(T)*mElementCount); + ll_aligned_free(mArray); + } + + /*for (U32 i = mElementCount; i < mCapacity; ++i) + { + new(new_buf+i) T(); + }*/ + mArray = new_buf; + } + + mElementCount = size; +} + + +template <class T, U32 alignment> +T& LLAlignedArray<T, alignment>::operator[](int idx) +{ + llassert(idx < mElementCount); + return mArray[idx]; +} + +template <class T, U32 alignment> +const T& LLAlignedArray<T, alignment>::operator[](int idx) const +{ + llassert(idx < mElementCount); + return mArray[idx]; +} + +template <class T, U32 alignment> +T* LLAlignedArray<T, alignment>::append(S32 N) +{ + U32 sz = size(); + resize(sz+N); + return &((*this)[sz]); +} + +#endif + diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h index 752574c65ddd9d677214429b876cd9cf6cb56088..1fe7d9847289e987d1be1641dfed097f43c96c3b 100755 --- a/indra/llcommon/llapr.h +++ b/indra/llcommon/llapr.h @@ -164,14 +164,20 @@ public: ~LLAtomic32<Type>() {}; operator const Type() { apr_uint32_t data = apr_atomic_read32(&mData); return Type(data); } + + Type CurrentValue() const { apr_uint32_t data = apr_atomic_read32(const_cast< volatile apr_uint32_t* >(&mData)); return Type(data); } + Type operator =(const Type& x) { apr_atomic_set32(&mData, apr_uint32_t(x)); return Type(mData); } void operator -=(Type x) { apr_atomic_sub32(&mData, apr_uint32_t(x)); } void operator +=(Type x) { apr_atomic_add32(&mData, apr_uint32_t(x)); } Type operator ++(int) { return apr_atomic_inc32(&mData); } // Type++ Type operator --(int) { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise) + + Type operator ++() { return apr_atomic_inc32(&mData); } // Type++ + Type operator --() { return apr_atomic_dec32(&mData); } // approximately --Type (0 if final is 0, non-zero otherwise) private: - apr_uint32_t mData; + volatile apr_uint32_t mData; }; typedef LLAtomic32<U32> LLAtomicU32; diff --git a/indra/llcommon/llcommon.cpp b/indra/llcommon/llcommon.cpp index 8be9e4f4de28ef135295efef826e5eb4608e1373..b938b0e65a73e456d79fce7ae1d43428e2bf8095 100755 --- a/indra/llcommon/llcommon.cpp +++ b/indra/llcommon/llcommon.cpp @@ -44,6 +44,7 @@ void LLCommon::initClass() } LLTimer::initClass(); LLThreadSafeRefCount::initThreadSafeRefCount(); + assert_main_thread(); // Make sure we record the main thread // LLWorkerThread::initClass(); // LLFrameCallbackManager::initClass(); } diff --git a/indra/llcommon/llcriticaldamp.cpp b/indra/llcommon/llcriticaldamp.cpp index 87d79b1ee0e669c281efad976e7039a9feb06577..49aac9ce7529d054196554e532839811af9fc601 100755 --- a/indra/llcommon/llcriticaldamp.cpp +++ b/indra/llcommon/llcriticaldamp.cpp @@ -87,3 +87,4 @@ F32 LLCriticalDamp::getInterpolant(const F32 time_constant, BOOL use_cache) return interpolant; } + diff --git a/indra/llcommon/lleventapi.h b/indra/llcommon/lleventapi.h index 1a37d780b63cc8ec95ec3642776dd2a16b295ec4..5991fe8fd59a6cf4d7ad3b913e3ca7a248ec28ce 100755 --- a/indra/llcommon/lleventapi.h +++ b/indra/llcommon/lleventapi.h @@ -47,6 +47,7 @@ class LL_COMMON_API LLEventAPI: public LLDispatchListener, typedef LLInstanceTracker<LLEventAPI, std::string> ibase; public: + /** * @param name LLEventPump name on which this LLEventAPI will listen. This * also serves as the LLInstanceTracker instance key. diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h index 7f42623d017eff2dfc54487f3457f0c38b5d8566..dc918121e129312d6248442f94c7e7282e1744da 100755 --- a/indra/llcommon/lleventtimer.h +++ b/indra/llcommon/lleventtimer.h @@ -36,6 +36,7 @@ class LL_COMMON_API LLEventTimer : public LLInstanceTracker<LLEventTimer> { public: + LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds LLEventTimer(const LLDate& time); virtual ~LLEventTimer(); diff --git a/indra/llcommon/llfasttimer.cpp b/indra/llcommon/llfasttimer.cpp index 024fdd1b4d76ee50d73331ae15ecc94130d069d3..01b6e60d2b0ace54c3ed94248baa8c608ec7f9af 100755 --- a/indra/llcommon/llfasttimer.cpp +++ b/indra/llcommon/llfasttimer.cpp @@ -107,17 +107,13 @@ class NamedTimerFactory : public LLSingleton<NamedTimerFactory> { public: NamedTimerFactory() - : mTimerRoot(NULL) - {} - - /*virtual */ void initSingleton() + : mTimerRoot(new LLFastTimer::NamedTimer("root")) { - mTimerRoot = new LLFastTimer::NamedTimer("root"); mRootFrameState.setNamedTimer(mTimerRoot); mTimerRoot->setFrameState(&mRootFrameState); mTimerRoot->mParent = mTimerRoot; mTimerRoot->setCollapsed(false); - mRootFrameState.mParent = &mRootFrameState; + mRootFrameState.mParent = &mRootFrameState; } ~NamedTimerFactory() diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 81c4b78775574c931f8f7cb28bfef12b8725926b..a99a1d88af0859ebbe9d90b5c14ff747cfc4021a 100755 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -139,10 +139,11 @@ public: // used to statically declare a new named timer class LL_COMMON_API DeclareTimer - : public LLInstanceTracker<DeclareTimer> + : public LLInstanceTracker< DeclareTimer > { friend class LLFastTimer; public: + DeclareTimer(const std::string& name, bool open); DeclareTimer(const std::string& name); diff --git a/indra/llcommon/llfoldertype.h b/indra/llcommon/llfoldertype.h old mode 100755 new mode 100644 diff --git a/indra/llcommon/llinitparam.h b/indra/llcommon/llinitparam.h index ae836645b90b9f9097f2482b84ebd662ef2859ca..03ab0fb67f70c5e4a79d6aa759742cc2285aab6b 100755 --- a/indra/llcommon/llinitparam.h +++ b/indra/llcommon/llinitparam.h @@ -1952,7 +1952,7 @@ namespace LLInitParam class Mandatory : public TypedParam<T, NAME_VALUE_LOOKUP, false> { typedef TypedParam<T, NAME_VALUE_LOOKUP, false> super_t; - typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t; + typedef Mandatory<T, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::value_t value_t; typedef typename super_t::default_value_t default_value_t; diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp index 5dc3ea5d7bc751bfe0cefbfa25419eb50470e937..64a313b5ff29bdf6be44b20d56ad518d363f9683 100755 --- a/indra/llcommon/llinstancetracker.cpp +++ b/indra/llcommon/llinstancetracker.cpp @@ -32,18 +32,3 @@ // external library headers // other Linden headers -//static -void * & LLInstanceTrackerBase::getInstances(std::type_info const & info) -{ - typedef std::map<std::string, void *> InstancesMap; - static InstancesMap instances; - - // std::map::insert() is just what we want here. You attempt to insert a - // (key, value) pair. If the specified key doesn't yet exist, it inserts - // the pair and returns a std::pair of (iterator, true). If the specified - // key DOES exist, insert() simply returns (iterator, false). One lookup - // handles both cases. - return instances.insert(InstancesMap::value_type(info.name(), - InstancesMap::mapped_type())) - .first->second; -} diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h index 1eab270e3c75da0d53406dee4c52c4c46fc433c4..55187d8325cf554d8c89e80ecaec61efdff47199 100755 --- a/indra/llcommon/llinstancetracker.h +++ b/indra/llcommon/llinstancetracker.h @@ -46,21 +46,7 @@ class LL_COMMON_API LLInstanceTrackerBase { protected: - /// Get a process-unique void* pointer slot for the specified type_info - static void * & getInstances(std::type_info const & info); - /// Find or create a STATICDATA instance for the specified TRACKED class. - /// STATICDATA must be default-constructible. - template<typename STATICDATA, class TRACKED> - static STATICDATA& getStatic() - { - void *& instances = getInstances(typeid(TRACKED)); - if (! instances) - { - instances = new STATICDATA; - } - return *static_cast<STATICDATA*>(instances); - } /// It's not essential to derive your STATICDATA (for use with /// getStatic()) from StaticBase; it's just that both known @@ -74,6 +60,8 @@ protected: }; }; +LL_COMMON_API void assert_main_thread(); + /// This mix-in class adds support for tracking all instances of the specified class parameter T /// The (optional) key associates a value of type KEY with a given instance of T, for quick lookup /// If KEY is not provided, then instances are stored in a simple set @@ -81,14 +69,18 @@ protected: template<typename T, typename KEY = T*> class LLInstanceTracker : public LLInstanceTrackerBase { - typedef LLInstanceTracker<T, KEY> MyT; + typedef LLInstanceTracker<T, KEY> self_t; typedef typename std::map<KEY, T*> InstanceMap; struct StaticData: public StaticBase { InstanceMap sMap; }; - static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); } - static InstanceMap& getMap_() { return getStatic().sMap; } + static StaticData& getStatic() { static StaticData sData; return sData;} + static InstanceMap& getMap_() + { + // assert_main_thread(); fwiw this class is not thread safe, and it used by multiple threads. Bad things happen. + return getStatic().sMap; + } public: class instance_iter : public boost::iterator_facade<instance_iter, T, boost::forward_traversal_tag> @@ -220,7 +212,11 @@ private: } void remove_() { - getMap_().erase(mInstanceKey); + typename InstanceMap::iterator iter = getMap_().find(mInstanceKey); + if (iter != getMap_().end()) + { + getMap_().erase(iter); + } } private: @@ -232,13 +228,13 @@ private: template<typename T> class LLInstanceTracker<T, T*> : public LLInstanceTrackerBase { - typedef LLInstanceTracker<T, T*> MyT; + typedef LLInstanceTracker<T, T*> self_t; typedef typename std::set<T*> InstanceSet; struct StaticData: public StaticBase { InstanceSet sSet; }; - static StaticData& getStatic() { return LLInstanceTrackerBase::getStatic<StaticData, MyT>(); } + static StaticData& getStatic() { static StaticData sData; return sData; } static InstanceSet& getSet_() { return getStatic().sSet; } public: diff --git a/indra/llcommon/llleap.h b/indra/llcommon/llleap.h index 1a1ad23d3925a333aeed1cb57c42c00484df5e80..e33f25e530957fb52943c91ed429b8912b043520 100755 --- a/indra/llcommon/llleap.h +++ b/indra/llcommon/llleap.h @@ -32,6 +32,7 @@ class LL_COMMON_API LLLeap: public LLInstanceTracker<LLLeap> { public: + /** * Pass a brief string description, mostly for logging purposes. The desc * need not be unique, but obviously the clearer we can make it, the diff --git a/indra/llcommon/lllslconstants.h b/indra/llcommon/lllslconstants.h index 9f32598e6142c59dc6d26008c233a0c25886513e..926ce32d75a8c51b9146e90ac49d1ea00d6f8599 100755 --- a/indra/llcommon/lllslconstants.h +++ b/indra/llcommon/lllslconstants.h @@ -67,6 +67,19 @@ const S32 LSL_PRIM_TEXGEN = 22; const S32 LSL_PRIM_POINT_LIGHT = 23; const S32 LSL_PRIM_CAST_SHADOWS = 24; const S32 LSL_PRIM_GLOW = 25; +const S32 LSL_PRIM_TEXT = 26; +const S32 LSL_PRIM_NAME = 27; +const S32 LSL_PRIM_DESC = 28; +const S32 LSL_PRIM_ROT_LOCAL = 29; +const S32 LSL_PRIM_PHYSICS_SHAPE_TYPE = 30; +const S32 LSL_PRIM_OMEGA = 32; +const S32 LSL_PRIM_POS_LOCAL = 33; +const S32 LSL_PRIM_LINK_TARGET = 34; +const S32 LSL_PRIM_SLICE = 35; + +const S32 LSL_PRIM_PHYSICS_SHAPE_PRIM = 0; +const S32 LSL_PRIM_PHYSICS_SHAPE_NONE = 1; +const S32 LSL_PRIM_PHYSICS_SHAPE_CONVEX = 2; const S32 LSL_PRIM_TYPE_BOX = 0; const S32 LSL_PRIM_TYPE_CYLINDER= 1; @@ -179,6 +192,22 @@ const S32 OBJECT_VELOCITY = 5; const S32 OBJECT_OWNER = 6; const S32 OBJECT_GROUP = 7; const S32 OBJECT_CREATOR = 8; +const S32 OBJECT_RUNNING_SCRIPT_COUNT = 9; +const S32 OBJECT_TOTAL_SCRIPT_COUNT = 10; +const S32 OBJECT_SCRIPT_MEMORY = 11; +const S32 OBJECT_SCRIPT_TIME = 12; +const S32 OBJECT_PRIM_EQUIVALENCE = 13; +const S32 OBJECT_SERVER_COST = 14; +const S32 OBJECT_STREAMING_COST = 15; +const S32 OBJECT_PHYSICS_COST = 16; +const S32 OBJECT_CHARACTER_TIME = 17; +const S32 OBJECT_ROOT = 18; +const S32 OBJECT_ATTACHED_POINT = 19; +const S32 OBJECT_PATHFINDING_TYPE = 20; +const S32 OBJECT_PHYSICS = 21; +const S32 OBJECT_PHANTOM = 22; +const S32 OBJECT_TEMP_ON_REZ = 23; +const S32 OBJECT_RENDER_WEIGHT = 24; // llTextBox() magic token string - yes this is a hack. sue me. char const* const TEXTBOX_MAGIC_TOKEN = "!!llTextBox!!"; diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index e725bdd9fae7d2fa4b6ffbfcbaf38edcffd6b937..61e30f11cc12d54b7643a8a1bbb2ed014ef61ab6 100755 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -36,19 +36,68 @@ class LLMutex ; #define LL_CHECK_MEMORY #endif +LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment); + +#ifdef SHOW_ASSERT +#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment)) +#else +#define ll_assert_aligned(ptr,alignment) +#endif + +#include <xmmintrin.h> + +template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address) +{ + return reinterpret_cast<T*>( + (reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF); +} + +template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address) +{ + return reinterpret_cast<T*>( + (reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F); +} + +#if LL_LINUX || LL_DARWIN + +#define LL_ALIGN_PREFIX(x) +#define LL_ALIGN_POSTFIX(x) __attribute__((aligned(x))) + +#elif LL_WINDOWS + +#define LL_ALIGN_PREFIX(x) __declspec(align(x)) +#define LL_ALIGN_POSTFIX(x) + +#else +#error "LL_ALIGN_PREFIX and LL_ALIGN_POSTFIX undefined" +#endif + +#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16) + inline void* ll_aligned_malloc( size_t size, int align ) { +#if defined(LL_WINDOWS) + return _aligned_malloc(size, align); +#else void* mem = malloc( size + (align - 1) + sizeof(void*) ); char* aligned = ((char*)mem) + sizeof(void*); aligned += align - ((uintptr_t)aligned & (align - 1)); ((void**)aligned)[-1] = mem; return aligned; +#endif } inline void ll_aligned_free( void* ptr ) { - free( ((void**)ptr)[-1] ); +#if defined(LL_WINDOWS) + _aligned_free(ptr); +#else + if (ptr) + { + free( ((void**)ptr)[-1] ); + } +#endif } #if !LL_USE_TCMALLOC @@ -133,6 +182,78 @@ inline void ll_aligned_free_32(void *p) #endif } + +// Copy words 16-byte blocks from src to dst. Source and destination MUST NOT OVERLAP. +// Source and dest must be 16-byte aligned and size must be multiple of 16. +// +inline void ll_memcpy_nonaliased_aligned_16(char* __restrict dst, const char* __restrict src, size_t bytes) +{ + assert(src != NULL); + assert(dst != NULL); + assert(bytes > 0); + assert((bytes % sizeof(F32))== 0); + ll_assert_aligned(src,16); + ll_assert_aligned(dst,16); + assert((src < dst) ? ((src + bytes) < dst) : ((dst + bytes) < src)); + assert(bytes%16==0); + + char* end = dst + bytes; + + if (bytes > 64) + { + + // Find start of 64b aligned area within block + // + void* begin_64 = LL_NEXT_ALIGNED_ADDRESS_64(dst); + + //at least 64 bytes before the end of the destination, switch to 16 byte copies + void* end_64 = end-64; + + // Prefetch the head of the 64b area now + // + _mm_prefetch((char*)begin_64, _MM_HINT_NTA); + _mm_prefetch((char*)begin_64 + 64, _MM_HINT_NTA); + _mm_prefetch((char*)begin_64 + 128, _MM_HINT_NTA); + _mm_prefetch((char*)begin_64 + 192, _MM_HINT_NTA); + + // Copy 16b chunks until we're 64b aligned + // + while (dst < begin_64) + { + + _mm_store_ps((F32*)dst, _mm_load_ps((F32*)src)); + dst += 16; + src += 16; + } + + // Copy 64b chunks up to your tail + // + // might be good to shmoo the 512b prefetch offset + // (characterize performance for various values) + // + while (dst < end_64) + { + _mm_prefetch((char*)src + 512, _MM_HINT_NTA); + _mm_prefetch((char*)dst + 512, _MM_HINT_NTA); + _mm_store_ps((F32*)dst, _mm_load_ps((F32*)src)); + _mm_store_ps((F32*)(dst + 16), _mm_load_ps((F32*)(src + 16))); + _mm_store_ps((F32*)(dst + 32), _mm_load_ps((F32*)(src + 32))); + _mm_store_ps((F32*)(dst + 48), _mm_load_ps((F32*)(src + 48))); + dst += 64; + src += 64; + } + } + + // Copy remainder 16b tail chunks (or ALL 16b chunks for sub-64b copies) + // + while (dst < end) + { + _mm_store_ps((F32*)dst, _mm_load_ps((F32*)src)); + dst += 16; + src += 16; + } +} + #ifndef __DEBUG_PRIVATE_MEM__ #define __DEBUG_PRIVATE_MEM__ 0 #endif @@ -541,13 +662,7 @@ void LLPrivateMemoryPoolTester::operator delete[](void* addr) // LLSingleton moved to llsingleton.h -LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment); -#ifdef SHOW_ASSERT -#define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(reinterpret_cast<uintptr_t>(ptr),((U32)alignment)) -#else -#define ll_assert_aligned(ptr,alignment) -#endif #endif diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp index 8276ec836a77399ed164ff02d4ec65a3286aafb5..f9624852843c6a41cd6b35ede7cd4d03a69ff88b 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 5eb69059ac6e5f41e4f76504f6d081419652766f..deb87d74976fac998503de8c3365e2d5dd3f1cae 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/llsingleton.cpp b/indra/llcommon/llsingleton.cpp index eb8e2c9456e968de5c8c4bd529e9313a421dfdc9..9b49e5237717234ae6ba2179ff053e3a39cf8934 100755 --- a/indra/llcommon/llsingleton.cpp +++ b/indra/llcommon/llsingleton.cpp @@ -28,5 +28,4 @@ #include "llsingleton.h" -std::map<std::string, void *> * LLSingletonRegistry::sSingletonMap = NULL; diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 49d99f2cd0fe7f0cf1665115dc83d0d883b98c24..40002313f186720e3c5f6ca85888f190d5e9a2f7 100755 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -30,38 +30,6 @@ #include <typeinfo> #include <boost/noncopyable.hpp> -/// @brief A global registry of all singletons to prevent duplicate allocations -/// across shared library boundaries -class LL_COMMON_API LLSingletonRegistry { - private: - typedef std::map<std::string, void *> TypeMap; - static TypeMap * sSingletonMap; - - static void checkInit() - { - if(sSingletonMap == NULL) - { - sSingletonMap = new TypeMap(); - } - } - - public: - template<typename T> static void * & get() - { - std::string name(typeid(T).name()); - - checkInit(); - - // the first entry of the pair returned by insert will be either the existing - // iterator matching our key, or the newly inserted NULL initialized entry - // see "Insert element" in http://www.sgi.com/tech/stl/UniqueAssociativeContainer.html - TypeMap::iterator result = - sSingletonMap->insert(std::make_pair(name, (void*)NULL)).first; - - return result->second; - } -}; - // LLSingleton implements the getInstance() method part of the Singleton // pattern. It can't make the derived class constructors protected, though, so // you have to do that yourself. @@ -101,20 +69,23 @@ private: } EInitState; // stores pointer to singleton instance - // and tracks initialization state of singleton - struct SingletonInstanceData + struct SingletonLifetimeManager { - EInitState mInitState; - DERIVED_TYPE* mSingletonInstance; - - SingletonInstanceData() - : mSingletonInstance(NULL), - mInitState(UNINITIALIZED) - {} - - ~SingletonInstanceData() + SingletonLifetimeManager() + { + construct(); + } + + static void construct() { - if (mInitState != DELETED) + sData.mInitState = CONSTRUCTING; + sData.mInstance = new DERIVED_TYPE(); + sData.mInitState = INITIALIZING; + } + + ~SingletonLifetimeManager() + { + if (sData.mInitState != DELETED) { deleteSingleton(); } @@ -124,9 +95,8 @@ private: public: virtual ~LLSingleton() { - SingletonInstanceData& data = getData(); - data.mSingletonInstance = NULL; - data.mInitState = DELETED; + sData.mInstance = NULL; + sData.mInitState = DELETED; } /** @@ -151,50 +121,46 @@ public: */ static void deleteSingleton() { - delete getData().mSingletonInstance; - getData().mSingletonInstance = NULL; - getData().mInitState = DELETED; + delete sData.mInstance; + sData.mInstance = NULL; + sData.mInitState = DELETED; } - static SingletonInstanceData& getData() - { - // this is static to cache the lookup results - static void * & registry = LLSingletonRegistry::get<DERIVED_TYPE>(); - - // *TODO - look into making this threadsafe - if(NULL == registry) - { - static SingletonInstanceData data; - registry = &data; - } - - return *static_cast<SingletonInstanceData *>(registry); - } static DERIVED_TYPE* getInstance() { - SingletonInstanceData& data = getData(); + static SingletonLifetimeManager sLifeTimeMgr; - if (data.mInitState == CONSTRUCTING) + switch (sData.mInitState) { + case UNINITIALIZED: + // should never be uninitialized at this point + llassert(false); + return NULL; + case CONSTRUCTING: llerrs << "Tried to access singleton " << typeid(DERIVED_TYPE).name() << " from singleton constructor!" << llendl; - } - - if (data.mInitState == DELETED) - { + return NULL; + case INITIALIZING: + // go ahead and flag ourselves as initialized so we can be reentrant during initialization + sData.mInitState = INITIALIZED; + sData.mInstance->initSingleton(); + return sData.mInstance; + case INITIALIZED: + return sData.mInstance; + case DELETED: llwarns << "Trying to access deleted singleton " << typeid(DERIVED_TYPE).name() << " creating new instance" << llendl; + SingletonLifetimeManager::construct(); + sData.mInitState = INITIALIZED; + sData.mInstance->initSingleton(); + return sData.mInstance; } - - if (!data.mSingletonInstance) - { - data.mInitState = CONSTRUCTING; - data.mSingletonInstance = new DERIVED_TYPE(); - data.mInitState = INITIALIZING; - data.mSingletonInstance->initSingleton(); - data.mInitState = INITIALIZED; - } - - return data.mSingletonInstance; + + return NULL; + } + + static DERIVED_TYPE* getIfExists() + { + return sData.mInstance; } // Reference version of getInstance() @@ -208,18 +174,29 @@ public: // Use this to avoid accessing singletons before the can safely be constructed static bool instanceExists() { - return getData().mInitState == INITIALIZED; + return sData.mInitState == INITIALIZED; } // Has this singleton already been deleted? // Use this to avoid accessing singletons from a static object's destructor static bool destroyed() { - return getData().mInitState == DELETED; + return sData.mInitState == DELETED; } private: + virtual void initSingleton() {} + + struct SingletonData + { + EInitState mInitState; + DERIVED_TYPE* mInstance; + }; + static SingletonData sData; }; +template<typename T> +typename LLSingleton<T>::SingletonData LLSingleton<T>::sData; + #endif diff --git a/indra/llcommon/llstaticstringtable.h b/indra/llcommon/llstaticstringtable.h new file mode 100644 index 0000000000000000000000000000000000000000..d7e0e8a08df1c4d607b650eed6ffe7d3d7be15cc --- /dev/null +++ b/indra/llcommon/llstaticstringtable.h @@ -0,0 +1,82 @@ +/** + * @file llstringtable.h + * @brief The LLStringTable class provides a _fast_ method for finding + * unique copies of strings. + * + * $LicenseInfo:firstyear=2001&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_STATIC_STRING_TABLE_H +#define LL_STATIC_STRING_TABLE_H + +#include "lldefs.h" +#include <boost/unordered_map.hpp> +#include "llstl.h" + +class LLStaticHashedString +{ +public: + + LLStaticHashedString(const std::string& s) + { + string_hash = makehash(s); + string = s; + } + + const std::string& String() const { return string; } + size_t Hash() const { return string_hash; } + + bool operator==(const LLStaticHashedString& b) const { return Hash() == b.Hash(); } + +protected: + + size_t makehash(const std::string& s) + { + size_t len = s.size(); + const char* c = s.c_str(); + size_t hashval = 0; + for (size_t i=0; i<len; i++) + { + hashval = ((hashval<<5) + hashval) + *c++; + } + return hashval; + } + + std::string string; + size_t string_hash; +}; + +struct LLStaticStringHasher +{ + enum { bucket_size = 8 }; + size_t operator()(const LLStaticHashedString& key_value) const { return key_value.Hash(); } + bool operator()(const LLStaticHashedString& left, const LLStaticHashedString& right) const { return left.Hash() < right.Hash(); } +}; + +template< typename MappedObject > +class LL_COMMON_API LLStaticStringTable + : public boost::unordered_map< LLStaticHashedString, MappedObject, LLStaticStringHasher > +{ +}; + +#endif + diff --git a/indra/llcommon/llstringtable.h b/indra/llcommon/llstringtable.h index 59d7372ed499de3aafbfc49571fb1066805240f8..ff09e7167719e5882ec6321465376b174cecce9b 100755 --- a/indra/llcommon/llstringtable.h +++ b/indra/llcommon/llstringtable.h @@ -42,14 +42,6 @@ //# define STRING_TABLE_HASH_MAP 1 #endif -#if STRING_TABLE_HASH_MAP -# if LL_WINDOWS -# include <hash_map> -# else -# include <ext/hash_map> -# endif -#endif - const U32 MAX_STRINGS_LENGTH = 256; class LL_COMMON_API LLStringTableEntry diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 0730b2ed8b8cb30d26f7a3eb857eee6e932f3df2..e63045659e22c803656405743660c8609fbb701b 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/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp index 1d56a52c32ee4c1dbaccc8fbcd603e9ef43ae2a7..60adeeaeb750cde20cf143ec802d3a9578e223b8 100755 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -67,7 +67,8 @@ LL_COMMON_API void assert_main_thread() static U32 s_thread_id = LLThread::currentID(); if (LLThread::currentID() != s_thread_id) { - llerrs << "Illegal execution outside main thread." << llendl; + llwarns << "Illegal execution from thread id " << (S32) LLThread::currentID() + << " outside main thread " << (S32) s_thread_id << llendl; } } @@ -495,15 +496,7 @@ LLThreadSafeRefCount::LLThreadSafeRefCount() : LLThreadSafeRefCount::LLThreadSafeRefCount(const LLThreadSafeRefCount& src) { - if (sMutex) - { - sMutex->lock(); - } mRef = 0; - if (sMutex) - { - sMutex->unlock(); - } } LLThreadSafeRefCount::~LLThreadSafeRefCount() diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h index 0fb89c56131f29ac8f71e68d18b69a98f1996b99..f51d985b5f65df21c4cd1effb283ca77d57338be 100755 --- a/indra/llcommon/llthread.h +++ b/indra/llcommon/llthread.h @@ -242,49 +242,39 @@ public: LLThreadSafeRefCount(const LLThreadSafeRefCount&); LLThreadSafeRefCount& operator=(const LLThreadSafeRefCount& ref) { - if (sMutex) - { - sMutex->lock(); - } mRef = 0; - if (sMutex) - { - sMutex->unlock(); - } return *this; } - - void ref() { - if (sMutex) sMutex->lock(); mRef++; - if (sMutex) sMutex->unlock(); } - S32 unref() + void unref() { llassert(mRef >= 1); - if (sMutex) sMutex->lock(); - S32 res = --mRef; - if (sMutex) sMutex->unlock(); - if (0 == res) - { - delete this; - return 0; + if ((--mRef) == 0) // See note in llapr.h on atomic decrement operator return value. + { + // If we hit zero, the caller should be the only smart pointer owning the object and we can delete it. + // It is technically possible for a vanilla pointer to mess this up, or another thread to + // jump in, find this object, create another smart pointer and end up dangling, but if + // the code is that bad and not thread-safe, it's trouble already. + delete this; } - return res; - } + } + S32 getNumRefs() const { - return mRef; + const S32 currentVal = mRef.CurrentValue(); + return currentVal; } private: - S32 mRef; + LLAtomic32< S32 > mRef; }; + /** * intrusive pointer support for LLThreadSafeRefCount * this allows you to use boost::intrusive_ptr with any LLThreadSafeRefCount-derived type @@ -315,4 +305,6 @@ public: //============================================================================ +extern LL_COMMON_API void assert_main_thread(); + #endif // LL_LLTHREAD_H diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h deleted file mode 100644 index 6a5ff314e4cbc31cf09073150a699a94d8cf2b06..0000000000000000000000000000000000000000 --- a/indra/llcommon/llversionviewer.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - * @file llversionviewer.h - * @brief - * - * $LicenseInfo:firstyear=2002&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_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; - -const char * const LL_CHANNEL = "Second Life Developer"; - -#if LL_DARWIN -const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer"; -#endif - -#endif diff --git a/indra/llcorehttp/_httpinternal.h b/indra/llcorehttp/_httpinternal.h index 14f744a9f1e078b6fd8fb4567fe09affe22490b2..008e4fd95cc9af8c0e6087829f740f5931ff012f 100755 --- a/indra/llcorehttp/_httpinternal.h +++ b/indra/llcorehttp/_httpinternal.h @@ -146,9 +146,6 @@ const int HTTP_SERVICE_LOOP_SLEEP_NORMAL_MS = 2; // Block allocation size (a tuning parameter) is found // in bufferarray.h. -// Compatibility controls -const bool HTTP_ENABLE_LINKSYS_WRT54G_V5_DNS_FIX = true; - } // end namespace LLCore #endif // _LLCORE_HTTP_INTERNAL_H_ diff --git a/indra/llcorehttp/_httpoprequest.cpp b/indra/llcorehttp/_httpoprequest.cpp index 51a8eaf9989373575c35d6d8f09b882ffc052a19..207ed8e1e4ca690ccc9d020aac341216cc397216 100755 --- a/indra/llcorehttp/_httpoprequest.cpp +++ b/indra/llcorehttp/_httpoprequest.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -186,9 +186,11 @@ void HttpOpRequest::stageFromActive(HttpService * service) if (mReplyLength) { // If non-zero, we received and processed a Content-Range - // header with the response. Verify that what it says - // is consistent with the received data. - if (mReplyLength != mReplyBody->size()) + // header with the response. If there is received data + // (and there may not be due to protocol violations, + // HEAD requests, etc., see BUG-2295) Verify that what it + // says is consistent with the received data. + if (mReplyBody && mReplyBody->size() && mReplyLength != mReplyBody->size()) { // Not as expected, fail the request mStatus = HttpStatus(HttpStatus::LLCORE, HE_INV_CONTENT_RANGE_HDR); @@ -339,7 +341,6 @@ void HttpOpRequest::setupCommon(HttpRequest::policy_t policy_id, } } - // Sets all libcurl options and data for a request. // // Used both for initial requests and to 'reload' for @@ -381,41 +382,15 @@ HttpStatus HttpOpRequest::prepareRequest(HttpService * service) // Get policy options HttpPolicyGlobal & policy(service->getPolicy().getGlobalOptions()); - mCurlHandle = curl_easy_init(); - curl_easy_setopt(mCurlHandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); - curl_easy_setopt(mCurlHandle, CURLOPT_NOSIGNAL, 1); - curl_easy_setopt(mCurlHandle, CURLOPT_NOPROGRESS, 1); - curl_easy_setopt(mCurlHandle, CURLOPT_URL, mReqURL.c_str()); - curl_easy_setopt(mCurlHandle, CURLOPT_PRIVATE, this); - curl_easy_setopt(mCurlHandle, CURLOPT_ENCODING, ""); + mCurlHandle = LLCurl::createStandardCurlHandle(); - if (HTTP_ENABLE_LINKSYS_WRT54G_V5_DNS_FIX) - { - // The Linksys WRT54G V5 router has an issue with frequent - // DNS lookups from LAN machines. If they happen too often, - // like for every HTTP request, the router gets annoyed after - // about 700 or so requests and starts issuing TCP RSTs to - // new connections. Reuse the DNS lookups for even a few - // seconds and no RSTs. - curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, 15); - } - else - { - // *TODO: Revisit this old DNS timeout setting - may no longer be valid - // I don't think this is valid anymore, the Multi shared DNS - // cache is working well. For the case of naked easy handles, - // consider using a shared DNS object. - curl_easy_setopt(mCurlHandle, CURLOPT_DNS_CACHE_TIMEOUT, 0); - } - curl_easy_setopt(mCurlHandle, CURLOPT_AUTOREFERER, 1); - curl_easy_setopt(mCurlHandle, CURLOPT_FOLLOWLOCATION, 1); - curl_easy_setopt(mCurlHandle, CURLOPT_MAXREDIRS, HTTP_REDIRECTS_DEFAULT); curl_easy_setopt(mCurlHandle, CURLOPT_WRITEFUNCTION, writeCallback); - curl_easy_setopt(mCurlHandle, CURLOPT_WRITEDATA, this); - curl_easy_setopt(mCurlHandle, CURLOPT_READFUNCTION, readCallback); + curl_easy_setopt(mCurlHandle, CURLOPT_READFUNCTION, readCallback); curl_easy_setopt(mCurlHandle, CURLOPT_READDATA, this); - curl_easy_setopt(mCurlHandle, CURLOPT_SSL_VERIFYPEER, 1); - curl_easy_setopt(mCurlHandle, CURLOPT_SSL_VERIFYHOST, 0); + curl_easy_setopt(mCurlHandle, CURLOPT_WRITEDATA, this); + curl_easy_setopt(mCurlHandle, CURLOPT_URL, mReqURL.c_str()); + curl_easy_setopt(mCurlHandle, CURLOPT_PRIVATE, this); + curl_easy_setopt(mCurlHandle, CURLOPT_MAXREDIRS, HTTP_REDIRECTS_DEFAULT); const std::string * opt_value(NULL); long opt_long(0L); @@ -694,7 +669,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe std::string safe_line; std::string tag; bool logit(false); - len = (std::min)(len, size_t(256)); // Keep things reasonable in all cases + const size_t log_len((std::min)(len, size_t(256))); // Keep things reasonable in all cases switch (info) { @@ -702,7 +677,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe if (op->mTracing >= HTTP_TRACE_CURL_HEADERS) { tag = "TEXT"; - escape_libcurl_debug_data(buffer, len, true, safe_line); + escape_libcurl_debug_data(buffer, log_len, true, safe_line); logit = true; } break; @@ -711,7 +686,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe if (op->mTracing >= HTTP_TRACE_CURL_HEADERS) { tag = "HEADERIN"; - escape_libcurl_debug_data(buffer, len, true, safe_line); + escape_libcurl_debug_data(buffer, log_len, true, safe_line); logit = true; } break; @@ -720,7 +695,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe if (op->mTracing >= HTTP_TRACE_CURL_HEADERS) { tag = "HEADEROUT"; - escape_libcurl_debug_data(buffer, 2 * len, true, safe_line); // Goes out as one line + escape_libcurl_debug_data(buffer, log_len, true, safe_line); // Goes out as one line unlike header_in logit = true; } break; @@ -732,7 +707,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe logit = true; if (op->mTracing >= HTTP_TRACE_CURL_BODIES) { - escape_libcurl_debug_data(buffer, len, false, safe_line); + escape_libcurl_debug_data(buffer, log_len, false, safe_line); } else { @@ -750,7 +725,7 @@ int HttpOpRequest::debugCallback(CURL * handle, curl_infotype info, char * buffe logit = true; if (op->mTracing >= HTTP_TRACE_CURL_BODIES) { - escape_libcurl_debug_data(buffer, len, false, safe_line); + escape_libcurl_debug_data(buffer, log_len, false, safe_line); } else { diff --git a/indra/llcorehttp/_httpoprequest.h b/indra/llcorehttp/_httpoprequest.h index 7b65d177833b2f635b5e4aca9d9701e1b28710ae..74a349b0bff6a9943cab4ae7355976abdabb54a0 100755 --- a/indra/llcorehttp/_httpoprequest.h +++ b/indra/llcorehttp/_httpoprequest.h @@ -60,7 +60,6 @@ class HttpOptions; /// the information needed to make a working request which can /// then be enqueued to a request queue. /// - class HttpOpRequest : public HttpOperation { public: diff --git a/indra/llcorehttp/_httppolicy.cpp b/indra/llcorehttp/_httppolicy.cpp index 76c1e2243166b98ed0a50e7d4db0ee4ffa251c32..014bd37e2e56d37cd6064fd1c2e36720b2f9c6d0 100755 --- a/indra/llcorehttp/_httppolicy.cpp +++ b/indra/llcorehttp/_httppolicy.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -319,33 +319,13 @@ bool HttpPolicy::cancel(HttpHandle handle) bool HttpPolicy::stageAfterCompletion(HttpOpRequest * op) { - static const HttpStatus cant_connect(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_CONNECT); - static const HttpStatus cant_res_proxy(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_RESOLVE_PROXY); - static const HttpStatus cant_res_host(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_RESOLVE_HOST); - static const HttpStatus send_error(HttpStatus::EXT_CURL_EASY, CURLE_SEND_ERROR); - static const HttpStatus recv_error(HttpStatus::EXT_CURL_EASY, CURLE_RECV_ERROR); - static const HttpStatus upload_failed(HttpStatus::EXT_CURL_EASY, CURLE_UPLOAD_FAILED); - static const HttpStatus op_timedout(HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT); - static const HttpStatus post_error(HttpStatus::EXT_CURL_EASY, CURLE_HTTP_POST_ERROR); - // Retry or finalize if (! op->mStatus) { - // If this failed, we might want to retry. Have to inspect - // the status a little more deeply for those reasons worth retrying... - if (op->mPolicyRetries < op->mPolicyRetryLimit && - ((op->mStatus.isHttpStatus() && op->mStatus.mType >= 499 && op->mStatus.mType <= 599) || - cant_connect == op->mStatus || - cant_res_proxy == op->mStatus || - cant_res_host == op->mStatus || - send_error == op->mStatus || - recv_error == op->mStatus || - upload_failed == op->mStatus || - op_timedout == op->mStatus || - post_error == op->mStatus)) + // If this failed, we might want to retry. + if (op->mPolicyRetries < op->mPolicyRetryLimit && op->mStatus.isRetryable()) { - // Okay, worth a retry. We include 499 in this test as - // it's the old 'who knows?' error from many grid services... + // Okay, worth a retry. retryOp(op); return true; // still active/ready } diff --git a/indra/llcorehttp/httpcommon.cpp b/indra/llcorehttp/httpcommon.cpp index f2fcbf77a3b66f76c4dd472efead2184a18b2edd..0738760763827751ae9678d22d0cf31f39b53ced 100755 --- a/indra/llcorehttp/httpcommon.cpp +++ b/indra/llcorehttp/httpcommon.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -116,6 +116,7 @@ std::string HttpStatus::toString() const { 415, "Unsupported Media Type" }, { 416, "Requested range not satisfiable" }, { 417, "Expectation Failed" }, + { 499, "Linden Catch-All" }, { 500, "Internal Server Error" }, { 501, "Not Implemented" }, { 502, "Bad Gateway" }, @@ -174,6 +175,37 @@ std::string HttpStatus::toString() const } return std::string("Unknown error"); } + + +// Pass true on statuses that might actually be cleared by a +// retry. Library failures, calling problems, etc. aren't +// going to be fixed by squirting bits all over the Net. +bool HttpStatus::isRetryable() const +{ + static const HttpStatus cant_connect(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_CONNECT); + static const HttpStatus cant_res_proxy(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_RESOLVE_PROXY); + static const HttpStatus cant_res_host(HttpStatus::EXT_CURL_EASY, CURLE_COULDNT_RESOLVE_HOST); + static const HttpStatus send_error(HttpStatus::EXT_CURL_EASY, CURLE_SEND_ERROR); + static const HttpStatus recv_error(HttpStatus::EXT_CURL_EASY, CURLE_RECV_ERROR); + static const HttpStatus upload_failed(HttpStatus::EXT_CURL_EASY, CURLE_UPLOAD_FAILED); + static const HttpStatus op_timedout(HttpStatus::EXT_CURL_EASY, CURLE_OPERATION_TIMEDOUT); + static const HttpStatus post_error(HttpStatus::EXT_CURL_EASY, CURLE_HTTP_POST_ERROR); + static const HttpStatus partial_file(HttpStatus::EXT_CURL_EASY, CURLE_PARTIAL_FILE); + static const HttpStatus inv_cont_range(HttpStatus::LLCORE, HE_INV_CONTENT_RANGE_HDR); + + return ((isHttpStatus() && mType >= 499 && mType <= 599) || // Include special 499 in retryables + *this == cant_connect || // Connection reset/endpoint problems + *this == cant_res_proxy || // DNS problems + *this == cant_res_host || // DNS problems + *this == send_error || // General socket problems + *this == recv_error || // General socket problems + *this == upload_failed || // Transport problem + *this == op_timedout || // Timer expired + *this == post_error || // Transport problem + *this == partial_file || // Data inconsistency in response + *this == inv_cont_range); // Short data read disagrees with content-range +} + } // end namespace LLCore diff --git a/indra/llcorehttp/httpcommon.h b/indra/llcorehttp/httpcommon.h index c0d4ec5aada659b00a0af8e5f0f743cb0be695b4..41fb5164cfdf3b279728ada93b9ca3aaf82388a0 100755 --- a/indra/llcorehttp/httpcommon.h +++ b/indra/llcorehttp/httpcommon.h @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -303,6 +303,12 @@ struct HttpStatus { return mType >= type_enum_t(100) && mType <= type_enum_t(999); } + + /// Returns true if the status is one that will be retried + /// internally. Provided for external consumption for cases + /// where that logic needs to be replicated. Only applies + /// to failed statuses, successful statuses will return false. + bool isRetryable() const; }; // end struct HttpStatus diff --git a/indra/llcorehttp/httpresponse.h b/indra/llcorehttp/httpresponse.h index 4a481db6ac5efe0c028ad868f509ed2c4a778c4f..f19b521fbfc4d11fb2788bc7f5fe6569d8037369 100755 --- a/indra/llcorehttp/httpresponse.h +++ b/indra/llcorehttp/httpresponse.h @@ -48,8 +48,9 @@ class HttpHeaders; /// individual pieces of the response. /// /// Typical usage will have the caller interrogate the object -/// and return from the handler callback. Instances are refcounted -/// and callers can bump the count and retain the object as needed. +/// during the handler callback and then simply returning. +/// But instances are refcounted and and callers can add a +/// reference and hold onto the object after the callback. /// /// Threading: Not intrinsically thread-safe. /// @@ -119,6 +120,10 @@ public: /// caller is going to have to make assumptions on receipt of /// a 206 status. The @full value may also be zero in cases of /// parsing problems or a wild-carded length response. + /// + /// These values will not necessarily agree with the data in + /// the body itself (if present). The BufferArray object + /// is authoritative for actual data length. void getRange(unsigned int * offset, unsigned int * length, unsigned int * full) const { *offset = mReplyOffset; diff --git a/indra/llcorehttp/tests/test_httprequest.hpp b/indra/llcorehttp/tests/test_httprequest.hpp index e5488cf941e7a8b7c0892965aa6664d596a44edf..900a69988796c3e37753d5455ea533699f47e39b 100755 --- a/indra/llcorehttp/tests/test_httprequest.hpp +++ b/indra/llcorehttp/tests/test_httprequest.hpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -45,6 +45,15 @@ using namespace LLCoreInt; +// spin/sleep waiting times for client/server exchange tests +// +// These are now fairly generous to try to get around timeout +// ('reasonable time') failures during execution on a heavily- +// loaded system where the unit test is in competition with +// other programs. +static const int LOOP_SLEEP_INTERVAL(10000); +static const int LOOP_COUNT_SHORT(500); // 5-second dwell time +static const int LOOP_COUNT_LONG(3000); // 30-second dwell time namespace { @@ -294,11 +303,11 @@ void HttpRequestTestObjectType::test<3>() // Run the notification pump. int count(0); - int limit(20); + int limit(LOOP_COUNT_SHORT); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -309,21 +318,21 @@ void HttpRequestTestObjectType::test<3>() // Run the notification pump again count = 0; - limit = 100; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -392,12 +401,12 @@ void HttpRequestTestObjectType::test<4>() // Run the notification pump. int count(0); - int limit(20); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 2) { req1->update(1000000); req2->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 2); @@ -409,22 +418,22 @@ void HttpRequestTestObjectType::test<4>() // Run the notification pump again count = 0; - limit = 100; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 3) { req1->update(1000000); req2->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 3); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -493,11 +502,11 @@ void HttpRequestTestObjectType::test<5>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_SHORT); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("NoOp notification received", mHandlerCalls == 1); @@ -569,11 +578,11 @@ void HttpRequestTestObjectType::test<6>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_SHORT); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("No notifications received", mHandlerCalls == 0); @@ -650,11 +659,11 @@ void HttpRequestTestObjectType::test<7>() // Run the notification pump. int count(0); - int limit(50); // With one retry, should fail quickish + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -666,21 +675,21 @@ void HttpRequestTestObjectType::test<7>() // Run the notification pump again count = 0; - limit = 100; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -766,11 +775,11 @@ void HttpRequestTestObjectType::test<8>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -782,21 +791,21 @@ void HttpRequestTestObjectType::test<8>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -876,11 +885,11 @@ void HttpRequestTestObjectType::test<9>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -892,21 +901,21 @@ void HttpRequestTestObjectType::test<9>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -988,11 +997,11 @@ void HttpRequestTestObjectType::test<10>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1004,21 +1013,21 @@ void HttpRequestTestObjectType::test<10>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1106,11 +1115,11 @@ void HttpRequestTestObjectType::test<11>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1122,21 +1131,21 @@ void HttpRequestTestObjectType::test<11>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1226,11 +1235,11 @@ void HttpRequestTestObjectType::test<12>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1242,21 +1251,21 @@ void HttpRequestTestObjectType::test<12>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1339,8 +1348,8 @@ void HttpRequestTestObjectType::test<13>() HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID, 0U, url_base, - 0, - 0, + 0, + 0, opts, NULL, &handler); @@ -1352,11 +1361,11 @@ void HttpRequestTestObjectType::test<13>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1369,21 +1378,21 @@ void HttpRequestTestObjectType::test<13>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1471,11 +1480,11 @@ void HttpRequestTestObjectType::test<14>() // Run the notification pump. int count(0); - int limit(50); // With one retry, should fail quickish + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1487,21 +1496,21 @@ void HttpRequestTestObjectType::test<14>() // Run the notification pump again count = 0; - limit = 100; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1594,11 +1603,11 @@ void HttpRequestTestObjectType::test<15>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1611,21 +1620,21 @@ void HttpRequestTestObjectType::test<15>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1724,11 +1733,11 @@ void HttpRequestTestObjectType::test<16>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1764,11 +1773,11 @@ void HttpRequestTestObjectType::test<16>() // Run the notification pump. count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 2); @@ -1783,21 +1792,21 @@ void HttpRequestTestObjectType::test<16>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 3) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 3); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -1919,11 +1928,11 @@ void HttpRequestTestObjectType::test<17>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -1938,21 +1947,21 @@ void HttpRequestTestObjectType::test<17>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -2079,11 +2088,11 @@ void HttpRequestTestObjectType::test<18>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -2098,21 +2107,21 @@ void HttpRequestTestObjectType::test<18>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -2237,11 +2246,11 @@ void HttpRequestTestObjectType::test<19>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -2255,21 +2264,21 @@ void HttpRequestTestObjectType::test<19>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -2401,11 +2410,11 @@ void HttpRequestTestObjectType::test<20>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -2420,21 +2429,21 @@ void HttpRequestTestObjectType::test<20>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -2569,11 +2578,11 @@ void HttpRequestTestObjectType::test<21>() // Run the notification pump. int count(0); - int limit(10); + int limit(LOOP_COUNT_LONG); while (count++ < limit && mHandlerCalls < 1) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Request executed in reasonable time", count < limit); ensure("One handler invocation for request", mHandlerCalls == 1); @@ -2588,21 +2597,21 @@ void HttpRequestTestObjectType::test<21>() // Run the notification pump again count = 0; - limit = 10; + limit = LOOP_COUNT_LONG; while (count++ < limit && mHandlerCalls < 2) { req->update(1000000); - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Second request executed in reasonable time", count < limit); ensure("Second handler invocation", mHandlerCalls == 2); // See that we actually shutdown the thread count = 0; - limit = 10; + limit = LOOP_COUNT_SHORT; while (count++ < limit && ! HttpService::isStopped()) { - usleep(100000); + usleep(LOOP_SLEEP_INTERVAL); } ensure("Thread actually stopped running", HttpService::isStopped()); @@ -2650,6 +2659,200 @@ void HttpRequestTestObjectType::test<21>() } } +// BUG-2295 Tests - Content-Range header received but no body +template <> template <> +void HttpRequestTestObjectType::test<22>() +{ + ScopedCurlInit ready; + + std::string url_base(get_base_url()); + // std::cerr << "Base: " << url_base << std::endl; + + set_test_name("BUG-2295"); + + // Handler can be stack-allocated *if* there are no dangling + // references to it after completion of this method. + // Create before memory record as the string copy will bump numbers. + TestHandler2 handler(this, "handler"); + + // record the total amount of dynamically allocated memory + mMemTotal = GetMemTotal(); + mHandlerCalls = 0; + + HttpOptions * options = NULL; + HttpRequest * req = NULL; + + try + { + // options set + options = new HttpOptions(); + options->setRetries(1); // Partial_File is retryable and can timeout in here + + // Get singletons created + HttpRequest::createService(); + + // Start threading early so that thread memory is invariant + // over the test. + HttpRequest::startThread(); + + // create a new ref counted object with an implicit reference + req = new HttpRequest(); + ensure("Memory allocated on construction", mMemTotal < GetMemTotal()); + + // ====================================== + // Issue bug2295 GETs that will get a 206 + // ====================================== + mStatus = HttpStatus(206); + static const int test_count(3); + for (int i(0); i < test_count; ++i) + { + char buffer[128]; + sprintf(buffer, "/bug2295/%d/", i); + HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID, + 0U, + url_base + buffer, + 0, + 25, + options, + NULL, + &handler); + ensure("Valid handle returned for ranged request", handle != LLCORE_HTTP_HANDLE_INVALID); + } + + // Run the notification pump. + int count(0); + int limit(LOOP_COUNT_LONG); + while (count++ < limit && mHandlerCalls < test_count) + { + req->update(1000000); + usleep(LOOP_SLEEP_INTERVAL); + } + ensure("Request executed in reasonable time - ms1", count < limit); + ensure("One handler invocation for each request - ms1", mHandlerCalls == test_count); + + // ====================================== + // Issue bug2295 GETs that will get a libcurl 18 (PARTIAL_FILE) + // ====================================== + mHandlerCalls = 0; + mStatus = HttpStatus(HttpStatus::EXT_CURL_EASY, CURLE_PARTIAL_FILE); + static const int test2_count(1); + for (int i(0); i < test2_count; ++i) + { + char buffer[128]; + sprintf(buffer, "/bug2295/00000012/%d/", i); + HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID, + 0U, + url_base + buffer, + 0, + 25, + options, + NULL, + &handler); + ensure("Valid handle returned for ranged request", handle != LLCORE_HTTP_HANDLE_INVALID); + } + + // Run the notification pump. + count = 0; + limit = LOOP_COUNT_LONG; + while (count++ < limit && mHandlerCalls < test2_count) + { + req->update(1000000); + usleep(LOOP_SLEEP_INTERVAL); + } + ensure("Request executed in reasonable time - ms2", count < limit); + ensure("One handler invocation for each request - ms2", mHandlerCalls == test2_count); + + // ====================================== + // Issue bug2295 GETs that will get an llcorehttp HE_INV_CONTENT_RANGE_HDR status + // ====================================== + mHandlerCalls = 0; + mStatus = HttpStatus(HttpStatus::LLCORE, HE_INV_CONTENT_RANGE_HDR); + static const int test3_count(1); + for (int i(0); i < test3_count; ++i) + { + char buffer[128]; + sprintf(buffer, "/bug2295/inv_cont_range/%d/", i); + HttpHandle handle = req->requestGetByteRange(HttpRequest::DEFAULT_POLICY_ID, + 0U, + url_base + buffer, + 0, + 25, + options, + NULL, + &handler); + ensure("Valid handle returned for ranged request", handle != LLCORE_HTTP_HANDLE_INVALID); + } + + // Run the notification pump. + count = 0; + limit = LOOP_COUNT_LONG; + while (count++ < limit && mHandlerCalls < test3_count) + { + req->update(1000000); + usleep(LOOP_SLEEP_INTERVAL); + } + ensure("Request executed in reasonable time - ms3", count < limit); + ensure("One handler invocation for each request - ms3", mHandlerCalls == test3_count); + + // ====================================== + // Okay, request a shutdown of the servicing thread + // ====================================== + mStatus = HttpStatus(); + mHandlerCalls = 0; + HttpHandle handle = req->requestStopThread(&handler); + ensure("Valid handle returned for second request", handle != LLCORE_HTTP_HANDLE_INVALID); + + // Run the notification pump again + count = 0; + limit = LOOP_COUNT_LONG; + while (count++ < limit && mHandlerCalls < 1) + { + req->update(1000000); + usleep(LOOP_SLEEP_INTERVAL); + } + ensure("Shutdown request executed in reasonable time", count < limit); + ensure("Shutdown handler invocation", mHandlerCalls == 1); + + // See that we actually shutdown the thread + count = 0; + limit = LOOP_COUNT_SHORT; + while (count++ < limit && ! HttpService::isStopped()) + { + usleep(LOOP_SLEEP_INTERVAL); + } + ensure("Thread actually stopped running", HttpService::isStopped()); + + // release options + if (options) + { + options->release(); + options = NULL; + } + + // release the request object + delete req; + req = NULL; + + // Shut down service + HttpRequest::destroyService(); + +#if defined(WIN32) + // Can only do this memory test on Windows. On other platforms, + // the LL logging system holds on to memory and produces what looks + // like memory leaks... + + // printf("Old mem: %d, New mem: %d\n", mMemTotal, GetMemTotal()); + ensure("Memory usage back to that at entry", mMemTotal == GetMemTotal()); +#endif + } + catch (...) + { + stop_thread(req); + delete req; + HttpRequest::destroyService(); + throw; + } +} } // end namespace tut diff --git a/indra/llcorehttp/tests/test_httpstatus.hpp b/indra/llcorehttp/tests/test_httpstatus.hpp index 887315befc3e3543e74a9d48cb14fe66df0149d3..b5538528c5b9e7e2ad3804792d57f632d856bb1a 100755 --- a/indra/llcorehttp/tests/test_httpstatus.hpp +++ b/indra/llcorehttp/tests/test_httpstatus.hpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2012&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2012, Linden Research, Inc. + * Copyright (C) 2012-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 @@ -91,9 +91,6 @@ template <> template <> void HttpStatusTestObjectType::test<2>() { set_test_name("HttpStatus memory structure"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif // Require that an HttpStatus object can be trivially // returned as a function return value in registers. @@ -106,10 +103,7 @@ void HttpStatusTestObjectType::test<2>() template <> template <> void HttpStatusTestObjectType::test<3>() { - set_test_name("HttpStatus valid error string conversion"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif + set_test_name("HttpStatus valid status string conversion"); HttpStatus status; status.mType = HttpStatus::EXT_CURL_EASY; @@ -141,10 +135,7 @@ void HttpStatusTestObjectType::test<3>() template <> template <> void HttpStatusTestObjectType::test<4>() { - set_test_name("HttpStatus invalid error string conversion"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif + set_test_name("HttpStatus invalid status string conversion"); HttpStatus status; status.mType = HttpStatus::EXT_CURL_EASY; @@ -170,9 +161,6 @@ template <> template <> void HttpStatusTestObjectType::test<5>() { set_test_name("HttpStatus equality/inequality testing"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif // Make certain equality/inequality tests do not pass // through the bool conversion. Distinct successful @@ -193,9 +181,6 @@ template <> template <> void HttpStatusTestObjectType::test<6>() { set_test_name("HttpStatus basic HTTP status encoding"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif HttpStatus status; status.mType = 200; @@ -242,10 +227,7 @@ void HttpStatusTestObjectType::test<6>() template <> template <> void HttpStatusTestObjectType::test<7>() { - set_test_name("HttpStatus HTTP error text strings"); -#if LL_WINDOWS - skip("MAINT-2302: This frequently (though not always) fails on Windows."); -#endif + set_test_name("HttpStatus HTTP status text strings"); HttpStatus status(100, HE_REPLY_ERROR); std::string msg(status.toString()); diff --git a/indra/llcorehttp/tests/test_llcorehttp_peer.py b/indra/llcorehttp/tests/test_llcorehttp_peer.py index 75a3c39ef2f047f3880159ee288806d523336fd9..3c3af8dc75b84f88fae15fd3555813f9d2d342ba 100755 --- a/indra/llcorehttp/tests/test_llcorehttp_peer.py +++ b/indra/llcorehttp/tests/test_llcorehttp_peer.py @@ -9,7 +9,7 @@ $LicenseInfo:firstyear=2008&license=viewerlgpl$ Second Life Viewer Source Code -Copyright (C) 2012, Linden Research, Inc. +Copyright (C) 2012-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 @@ -35,6 +35,10 @@ import time import select import getopt from threading import Thread +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler from SocketServer import ThreadingMixIn @@ -47,7 +51,30 @@ from testrunner import freeport, run, debug, VERBOSE class TestHTTPRequestHandler(BaseHTTPRequestHandler): """This subclass of BaseHTTPRequestHandler is to receive and echo LLSD-flavored messages sent by the C++ LLHTTPClient. + + Target URLs are fairly free-form and are assembled by + concatinating fragments. Currently defined fragments + are: + - '/reflect/' Request headers are bounced back to caller + after prefixing with 'X-Reflect-' + - '/fail/' Body of request can contain LLSD with + 'reason' string and 'status' integer + which will become response header. + - '/bug2295/' 206 response, no data in body: + -- '/bug2295/0/' "Content-Range: bytes 0-75/2983" + -- '/bug2295/1/' "Content-Range: bytes 0-75/*" + -- '/bug2295/2/' "Content-Range: bytes 0-75/2983", + "Content-Length: 0" + -- '/bug2295/00000018/0/' Generates PARTIAL_FILE (18) error in libcurl. + "Content-Range: bytes 0-75/2983", + "Content-Length: 76" + -- '/bug2295/inv_cont_range/0/' Generates HE_INVALID_CONTENT_RANGE error in llcorehttp. + + Some combinations make no sense, there's no effort to protect + you from that. """ + ignore_exceptions = (Exception,) + def read(self): # The following logic is adapted from the library module # SimpleXMLRPCServer.py. @@ -87,42 +114,36 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self, withdata=True): # Of course, don't attempt to read data. - self.answer(dict(reply="success", status=200, - reason="Your GET operation worked")) + try: + self.answer(dict(reply="success", status=200, + reason="Your GET operation worked")) + except self.ignore_exceptions, e: + print >> sys.stderr, "Exception during GET (ignoring): %s" % str(e) def do_POST(self): # Read the provided POST data. # self.answer(self.read()) - self.answer(dict(reply="success", status=200, - reason=self.read())) + try: + self.answer(dict(reply="success", status=200, + reason=self.read())) + except self.ignore_exceptions, e: + print >> sys.stderr, "Exception during POST (ignoring): %s" % str(e) def do_PUT(self): # Read the provided PUT data. # self.answer(self.read()) - self.answer(dict(reply="success", status=200, - reason=self.read())) + try: + self.answer(dict(reply="success", status=200, + reason=self.read())) + except self.ignore_exceptions, e: + print >> sys.stderr, "Exception during PUT (ignoring): %s" % str(e) def answer(self, data, withdata=True): debug("%s.answer(%s): self.path = %r", self.__class__.__name__, data, self.path) if "/sleep/" in self.path: time.sleep(30) - if "fail" not in self.path: - data = data.copy() # we're going to modify - # Ensure there's a "reply" key in data, even if there wasn't before - data["reply"] = data.get("reply", llsd.LLSD("success")) - response = llsd.format_xml(data) - debug("success: %s", response) - self.send_response(200) - if "/reflect/" in self.path: - self.reflect_headers() - self.send_header("Content-type", "application/llsd+xml") - self.send_header("Content-Length", str(len(response))) - self.send_header("X-LL-Special", "Mememememe"); - self.end_headers() - if withdata: - self.wfile.write(response) - else: # fail requested + if "fail" in self.path: status = data.get("status", 500) # self.responses maps an int status to a (short, long) pair of # strings. We want the longer string. That's why we pass a string @@ -138,6 +159,57 @@ class TestHTTPRequestHandler(BaseHTTPRequestHandler): if "/reflect/" in self.path: self.reflect_headers() self.end_headers() + elif "/bug2295/" in self.path: + # Test for https://jira.secondlife.com/browse/BUG-2295 + # + # Client can receive a header indicating data should + # appear in the body without actually getting the body. + # Library needs to defend against this case. + # + body = None + if "/bug2295/0/" in self.path: + self.send_response(206) + self.send_header("Content-Range", "bytes 0-75/2983") + elif "/bug2295/1/" in self.path: + self.send_response(206) + self.send_header("Content-Range", "bytes 0-75/*") + elif "/bug2295/2/" in self.path: + self.send_response(206) + self.send_header("Content-Range", "bytes 0-75/2983") + self.send_header("Content-Length", "0") + elif "/bug2295/00000012/0/" in self.path: + self.send_response(206) + self.send_header("Content-Range", "bytes 0-75/2983") + self.send_header("Content-Length", "76") + elif "/bug2295/inv_cont_range/0/" in self.path: + self.send_response(206) + self.send_header("Content-Range", "bytes 0-75/2983") + body = "Some text, but not enough." + else: + # Unknown request + self.send_response(400) + if "/reflect/" in self.path: + self.reflect_headers() + self.send_header("Content-type", "text/plain") + self.end_headers() + if body: + self.wfile.write(body) + else: + # Normal response path + data = data.copy() # we're going to modify + # Ensure there's a "reply" key in data, even if there wasn't before + data["reply"] = data.get("reply", llsd.LLSD("success")) + response = llsd.format_xml(data) + debug("success: %s", response) + self.send_response(200) + if "/reflect/" in self.path: + self.reflect_headers() + self.send_header("Content-type", "application/llsd+xml") + self.send_header("Content-Length", str(len(response))) + self.send_header("X-LL-Special", "Mememememe"); + self.end_headers() + if withdata: + self.wfile.write(response) def reflect_headers(self): for name in self.headers.keys(): @@ -162,6 +234,17 @@ class Server(ThreadingMixIn, HTTPServer): # operation of freeport() absolutely depends on it being off. allow_reuse_address = False + # Override of BaseServer.handle_error(). Not too interested + # in errors and the default handler emits a scary traceback + # to stderr which annoys some. Disable this override to get + # default behavior which *shouldn't* cause the program to return + # a failure status. + def handle_error(self, request, client_address): + print '-'*40 + print 'Ignoring exception during processing of request from', + print client_address + print '-'*40 + if __name__ == "__main__": do_valgrind = False path_search = False @@ -188,3 +271,4 @@ if __name__ == "__main__": args = ["valgrind", "--log-file=./valgrind.log"] + args path_search = True sys.exit(run(server=Thread(name="httpd", target=httpd.serve_forever), use_path=path_search, *args)) + diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index 37c603348e3342a1ed9191e72cffcf47d125cc04..5eb5fb442d0f958860de8691e7e54541c46c66bd 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 0279e8bef970371595250a794c2bfc79bee03ded..c4363a48df5151bc3b73e9b9bfdec97a9f9b25c1 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/llmatrix4a.h b/indra/llmath/llmatrix4a.h index c4cefdb4fa74ad58203b7b6cb903aafb50d9c1e4..d141298f69b65260bdfba1de551083b9afd3b062 100755 --- a/indra/llmath/llmatrix4a.h +++ b/indra/llmath/llmatrix4a.h @@ -107,15 +107,14 @@ public: inline void rotate(const LLVector4a& v, LLVector4a& res) { + LLVector4a y,z; + res = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0)); - res.mul(mMatrix[0]); - - LLVector4a y; y = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); - y.mul(mMatrix[1]); - - LLVector4a z; z = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2)); + + res.mul(mMatrix[0]); + y.mul(mMatrix[1]); z.mul(mMatrix[2]); res.add(y); diff --git a/indra/llmath/llsimdmath.h b/indra/llmath/llsimdmath.h index 01458521ec357cf6ef2cebbef0a13ab3a3d65774..cebd2ace7d8cee33699da11846de43f1930bc21a 100755 --- a/indra/llmath/llsimdmath.h +++ b/indra/llmath/llsimdmath.h @@ -39,34 +39,6 @@ #include <stdint.h> #endif -template <typename T> T* LL_NEXT_ALIGNED_ADDRESS(T* address) -{ - return reinterpret_cast<T*>( - (reinterpret_cast<uintptr_t>(address) + 0xF) & ~0xF); -} - -template <typename T> T* LL_NEXT_ALIGNED_ADDRESS_64(T* address) -{ - return reinterpret_cast<T*>( - (reinterpret_cast<uintptr_t>(address) + 0x3F) & ~0x3F); -} - -#if LL_LINUX || LL_DARWIN - -#define LL_ALIGN_PREFIX(x) -#define LL_ALIGN_POSTFIX(x) __attribute__((aligned(x))) - -#elif LL_WINDOWS - -#define LL_ALIGN_PREFIX(x) __declspec(align(x)) -#define LL_ALIGN_POSTFIX(x) - -#else -#error "LL_ALIGN_PREFIX and LL_ALIGN_POSTFIX undefined" -#endif - -#define LL_ALIGN_16(var) LL_ALIGN_PREFIX(16) var LL_ALIGN_POSTFIX(16) - #include <xmmintrin.h> #include <emmintrin.h> diff --git a/indra/llmath/llvector4a.cpp b/indra/llmath/llvector4a.cpp index 6edeb0fefe5e37998514e1c83cc9eb00115256d2..570fa41a4397d806b66fdc5f8ffbb175b7873ce3 100755 --- a/indra/llmath/llvector4a.cpp +++ b/indra/llmath/llvector4a.cpp @@ -41,55 +41,7 @@ extern const LLVector4a LL_V4A_EPSILON = reinterpret_cast<const LLVector4a&> ( F /*static */void LLVector4a::memcpyNonAliased16(F32* __restrict dst, const F32* __restrict src, size_t bytes) { - assert(src != NULL); - assert(dst != NULL); - assert(bytes > 0); - assert((bytes % sizeof(F32))== 0); - ll_assert_aligned(src,16); - ll_assert_aligned(dst,16); - assert(bytes%16==0); - - F32* end = dst + (bytes / sizeof(F32) ); - - if (bytes > 64) - { - F32* begin_64 = LL_NEXT_ALIGNED_ADDRESS_64(dst); - - //at least 64 (16*4) bytes before the end of the destination, switch to 16 byte copies - F32* end_64 = end-16; - - _mm_prefetch((char*)begin_64, _MM_HINT_NTA); - _mm_prefetch((char*)begin_64 + 64, _MM_HINT_NTA); - _mm_prefetch((char*)begin_64 + 128, _MM_HINT_NTA); - _mm_prefetch((char*)begin_64 + 192, _MM_HINT_NTA); - - while (dst < begin_64) - { - copy4a(dst, src); - dst += 4; - src += 4; - } - - while (dst < end_64) - { - _mm_prefetch((char*)src + 512, _MM_HINT_NTA); - _mm_prefetch((char*)dst + 512, _MM_HINT_NTA); - copy4a(dst, src); - copy4a(dst+4, src+4); - copy4a(dst+8, src+8); - copy4a(dst+12, src+12); - - dst += 16; - src += 16; - } - } - - while (dst < end) - { - copy4a(dst, src); - dst += 4; - src += 4; - } + ll_memcpy_nonaliased_aligned_16((char*)dst, (char*)src, bytes); } void LLVector4a::setRotated( const LLRotation& rot, const LLVector4a& vec ) diff --git a/indra/llmath/llvector4a.inl b/indra/llmath/llvector4a.inl index 558fe0932315f0cbbf133d0356e949fb62df7810..69d3d01efe485d3a4c677d1c6e730f0ea573b1e8 100755 --- a/indra/llmath/llvector4a.inl +++ b/indra/llmath/llvector4a.inl @@ -480,16 +480,13 @@ inline void LLVector4a::setMax(const LLVector4a& lhs, const LLVector4a& rhs) mQ = _mm_max_ps(lhs.mQ, rhs.mQ); } -// Set this to (c * lhs) + rhs * ( 1 - c) +// Set this to lhs + (rhs-lhs)*c inline void LLVector4a::setLerp(const LLVector4a& lhs, const LLVector4a& rhs, F32 c) { - LLVector4a a = lhs; - a.mul(c); - - LLVector4a b = rhs; - b.mul(1.f-c); - - setAdd(a, b); + LLVector4a t; + t.setSub(rhs,lhs); + t.mul(c); + setAdd(lhs, t); } inline LLBool32 LLVector4a::isFinite3() const diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index a030d889afc04abeb92b0d7cbf93333264cf4386..f74c934b21fdaf0a0dd03d816fb6e0d0301eb03f 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)); @@ -550,7 +551,7 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 const F32 tableScale[] = { 1, 1, 1, 0.5f, 0.707107f, 0.53f, 0.525f, 0.5f }; F32 scale = 0.5f; F32 t, t_step, t_first, t_fraction, ang, ang_step; - LLVector3 pt1,pt2; + LLVector4a pt1,pt2; F32 begin = params.getBegin(); F32 end = params.getEnd(); @@ -573,20 +574,21 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 // Starting t and ang values for the first face t = t_first; ang = 2.0f*F_PI*(t*ang_scale + offset); - pt1.setVec(cos(ang)*scale,sin(ang)*scale, t); + pt1.set(cos(ang)*scale,sin(ang)*scale, t); // Increment to the next point. // pt2 is the end point on the fractional face t += t_step; ang += ang_step; - pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); + pt2.set(cos(ang)*scale,sin(ang)*scale,t); t_fraction = (begin - t_first)*sides; // Only use if it's not almost exactly on an edge. if (t_fraction < 0.9999f) { - LLVector3 new_pt = lerp(pt1, pt2, t_fraction); + LLVector4a new_pt; + new_pt.setLerp(pt1, pt2, t_fraction); mProfile.push_back(new_pt); } @@ -594,12 +596,17 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 while (t < end) { // Iterate through all the integer steps of t. - pt1.setVec(cos(ang)*scale,sin(ang)*scale,t); + pt1.set(cos(ang)*scale,sin(ang)*scale,t); if (mProfile.size() > 0) { - LLVector3 p = mProfile[mProfile.size()-1]; + LLVector4a p = mProfile[mProfile.size()-1]; for (S32 i = 0; i < split && mProfile.size() > 0; i++) { - mProfile.push_back(p+(pt1-p) * 1.0f/(float)(split+1) * (float)(i+1)); + //mProfile.push_back(p+(pt1-p) * 1.0f/(float)(split+1) * (float)(i+1)); + LLVector4a new_pt; + new_pt.setSub(pt1, p); + new_pt.mul(1.0f/(float)(split+1) * (float)(i+1)); + new_pt.add(p); + mProfile.push_back(new_pt); } } mProfile.push_back(pt1); @@ -612,18 +619,25 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 // pt1 is the first point on the fractional face // pt2 is the end point on the fractional face - pt2.setVec(cos(ang)*scale,sin(ang)*scale,t); + pt2.set(cos(ang)*scale,sin(ang)*scale,t); // Find the fraction that we need to add to the end point. t_fraction = (end - (t - t_step))*sides; if (t_fraction > 0.0001f) { - LLVector3 new_pt = lerp(pt1, pt2, t_fraction); + LLVector4a new_pt; + new_pt.setLerp(pt1, pt2, t_fraction); if (mProfile.size() > 0) { - LLVector3 p = mProfile[mProfile.size()-1]; + LLVector4a p = mProfile[mProfile.size()-1]; for (S32 i = 0; i < split && mProfile.size() > 0; i++) { - mProfile.push_back(p+(new_pt-p) * 1.0f/(float)(split+1) * (float)(i+1)); + //mProfile.push_back(p+(new_pt-p) * 1.0f/(float)(split+1) * (float)(i+1)); + + LLVector4a pt1; + pt1.setSub(new_pt, p); + pt1.mul(1.0f/(float)(split+1) * (float)(i+1)); + pt1.add(p); + mProfile.push_back(pt1); } } mProfile.push_back(new_pt); @@ -644,7 +658,7 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 if (params.getHollow() <= 0) { // put center point if not hollow. - mProfile.push_back(LLVector3(0,0,0)); + mProfile.push_back(LLVector4a(0,0,0)); } } else @@ -657,103 +671,6 @@ void LLProfile::genNGon(const LLProfileParams& params, S32 sides, F32 offset, F3 mTotal = mProfile.size(); } -void LLProfile::genNormals(const LLProfileParams& params) -{ - S32 count = mProfile.size(); - - S32 outer_count; - if (mTotalOut) - { - outer_count = mTotalOut; - } - else - { - outer_count = mTotal / 2; - } - - mEdgeNormals.resize(count * 2); - mEdgeCenters.resize(count * 2); - mNormals.resize(count); - - LLVector2 pt0,pt1; - - BOOL hollow = (params.getHollow() > 0); - - S32 i0, i1, i2, i3, i4; - - // Parametrically generate normal - for (i2 = 0; i2 < count; i2++) - { - mNormals[i2].mV[0] = mProfile[i2].mV[0]; - mNormals[i2].mV[1] = mProfile[i2].mV[1]; - if (hollow && (i2 >= outer_count)) - { - mNormals[i2] *= -1.f; - } - if (mNormals[i2].magVec() < 0.001) - { - // Special case for point at center, get adjacent points. - i1 = (i2 - 1) >= 0 ? i2 - 1 : count - 1; - i0 = (i1 - 1) >= 0 ? i1 - 1 : count - 1; - i3 = (i2 + 1) < count ? i2 + 1 : 0; - i4 = (i3 + 1) < count ? i3 + 1 : 0; - - pt0.setVec(mProfile[i1].mV[VX] + mProfile[i1].mV[VX] - mProfile[i0].mV[VX], - mProfile[i1].mV[VY] + mProfile[i1].mV[VY] - mProfile[i0].mV[VY]); - pt1.setVec(mProfile[i3].mV[VX] + mProfile[i3].mV[VX] - mProfile[i4].mV[VX], - mProfile[i3].mV[VY] + mProfile[i3].mV[VY] - mProfile[i4].mV[VY]); - - mNormals[i2] = pt0 + pt1; - mNormals[i2] *= 0.5f; - } - mNormals[i2].normVec(); - } - - S32 num_normal_sets = isConcave() ? 2 : 1; - for (S32 normal_set = 0; normal_set < num_normal_sets; normal_set++) - { - S32 point_num; - for (point_num = 0; point_num < mTotal; point_num++) - { - LLVector3 point_1 = mProfile[point_num]; - point_1.mV[VZ] = 0.f; - - LLVector3 point_2; - - if (isConcave() && normal_set == 0 && point_num == (mTotal - 1) / 2) - { - point_2 = mProfile[mTotal - 1]; - } - else if (isConcave() && normal_set == 1 && point_num == mTotal - 1) - { - point_2 = mProfile[(mTotal - 1) / 2]; - } - else - { - LLVector3 delta_pos; - S32 neighbor_point = (point_num + 1) % mTotal; - while(delta_pos.magVecSquared() < 0.01f * 0.01f) - { - point_2 = mProfile[neighbor_point]; - delta_pos = point_2 - point_1; - neighbor_point = (neighbor_point + 1) % mTotal; - if (neighbor_point == point_num) - { - break; - } - } - } - - point_2.mV[VZ] = 0.f; - LLVector3 face_normal = (point_2 - point_1) % LLVector3::z_axis; - face_normal.normVec(); - mEdgeNormals[normal_set * count + point_num] = face_normal; - mEdgeCenters[normal_set * count + point_num] = lerp(point_1, point_2, 0.5f); - } - } -} - - // Hollow is percent of the original bounding box, not of this particular // profile's geometry. Thus, a swept triangle needs lower hollow values than // a swept square. @@ -769,12 +686,13 @@ LLProfile::Face* LLProfile::addHole(const LLProfileParams& params, BOOL flat, F3 Face *face = addFace(mTotalOut, mTotal-mTotalOut,0,LL_FACE_INNER_SIDE, flat); - std::vector<LLVector3> pt; + static LLAlignedArray<LLVector4a,64> pt; pt.resize(mTotal) ; for (S32 i=mTotalOut;i<mTotal;i++) { - pt[i] = mProfile[i] * box_hollow; + pt[i] = mProfile[i]; + pt[i].mul(box_hollow); } S32 j=mTotal-1; @@ -920,8 +838,8 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai detail = MIN_LOD; } - mProfile.clear(); - mFaces.clear(); + mProfile.resize(0); + mFaces.resize(0); // Generate the face data S32 i; @@ -953,10 +871,13 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai addFace((face_num++) * (split +1), split+2, 1, LL_FACE_OUTER_SIDE_0 << i, TRUE); } + LLVector4a scale(1,1,4,1); + for (i = 0; i <(S32) mProfile.size(); i++) { // Scale by 4 to generate proper tex coords. - mProfile[i].mV[2] *= 4.f; + mProfile[i].mul(scale); + llassert(mProfile[i].isFinite3()); } if (hollow) @@ -989,10 +910,12 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai case LL_PCODE_PROFILE_EQUALTRI: { genNGon(params, 3,0, 0, 1, split); + LLVector4a scale(1,1,3,1); for (i = 0; i <(S32) mProfile.size(); i++) { // Scale by 3 to generate proper tex coords. - mProfile[i].mV[2] *= 3.f; + mProfile[i].mul(scale); + llassert(mProfile[i].isFinite3()); } if (path_open) @@ -1171,8 +1094,6 @@ BOOL LLProfile::generate(const LLProfileParams& params, BOOL path_open,F32 detai } } - //genNormals(params); - return TRUE; } @@ -1455,25 +1376,29 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en // the path begins at the correct cut. F32 step= 1.0f / sides; F32 t = params.getBegin(); - pt = vector_append(mPath, 1); + pt = mPath.append(1); ang = 2.0f*F_PI*revolutions * t; s = sin(ang)*lerp(radius_start, radius_end, t); c = cos(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, c + lerp(0,params.getShear().mV[1],s), s); - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t), + hole_y * lerp(taper_y_begin, taper_y_end, t), + 0,1); pt->mTexT = t; // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); // Rotate the point around the circle's center. qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; + + LLMatrix3 rot(twist * qang); + + pt->mRot.loadu(rot); t+=step; @@ -1484,50 +1409,54 @@ void LLPath::genNGon(const LLPathParams& params, S32 sides, F32 startOff, F32 en // Run through the non-cut dependent points. while (t < params.getEnd()) { - pt = vector_append(mPath, 1); + pt = mPath.append(1); ang = 2.0f*F_PI*revolutions * t; c = cos(ang)*lerp(radius_start, radius_end, t); s = sin(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, c + lerp(0,params.getShear().mV[1],s), s); - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t), + hole_y * lerp(taper_y_begin, taper_y_end, t), + 0,1); pt->mTexT = t; // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); // Rotate the point around the circle's center. qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; + LLMatrix3 tmp(twist*qang); + pt->mRot.loadu(tmp); t+=step; } // Make one final pass for the end cut. t = params.getEnd(); - pt = vector_append(mPath, 1); + pt = mPath.append(1); ang = 2.0f*F_PI*revolutions * t; c = cos(ang)*lerp(radius_start, radius_end, t); s = sin(ang)*lerp(radius_start, radius_end, t); - pt->mPos.setVec(0 + lerp(0,params.getShear().mV[0],s) + pt->mPos.set(0 + lerp(0,params.getShear().mV[0],s) + lerp(-skew ,skew, t) * 0.5f, c + lerp(0,params.getShear().mV[1],s), s); - pt->mScale.mV[VX] = hole_x * lerp(taper_x_begin, taper_x_end, t); - pt->mScale.mV[VY] = hole_y * lerp(taper_y_begin, taper_y_end, t); + pt->mScale.set(hole_x * lerp(taper_x_begin, taper_x_end, t), + hole_y * lerp(taper_y_begin, taper_y_end, t), + 0,1); pt->mTexT = t; // Twist rotates the path along the x,y plane (I think) - DJS 04/05/02 twist.setQuat (lerp(twist_begin,twist_end,t) * 2.f * F_PI - F_PI,0,0,1); // Rotate the point around the circle's center. qang.setQuat (ang,path_axis); - pt->mRot = twist * qang; + LLMatrix3 tmp(twist*qang); + pt->mRot.loadu(tmp); mTotal = mPath.size(); } @@ -1625,7 +1554,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, mDirty = FALSE; S32 np = 2; // hardcode for line - mPath.clear(); + mPath.resize(0); mOpen = TRUE; // Is this 0xf0 mask really necessary? DK 03/02/05 @@ -1651,12 +1580,16 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, for (S32 i=0;i<np;i++) { F32 t = lerp(params.getBegin(),params.getEnd(),(F32)i * mStep); - mPath[i].mPos.setVec(lerp(0,params.getShear().mV[0],t), + mPath[i].mPos.set(lerp(0,params.getShear().mV[0],t), lerp(0,params.getShear().mV[1],t), t - 0.5f); - mPath[i].mRot.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); - mPath[i].mScale.mV[0] = lerp(start_scale.mV[0],end_scale.mV[0],t); - mPath[i].mScale.mV[1] = lerp(start_scale.mV[1],end_scale.mV[1],t); + LLQuaternion quat; + quat.setQuat(lerp(F_PI * params.getTwistBegin(),F_PI * params.getTwist(),t),0,0,1); + LLMatrix3 tmp(quat); + mPath[i].mRot.loadu(tmp); + mPath[i].mScale.set(lerp(start_scale.mV[0],end_scale.mV[0],t), + lerp(start_scale.mV[1],end_scale.mV[1],t), + 0,1); mPath[i].mTexT = t; } } @@ -1693,7 +1626,7 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, F32 toggle = 0.5f; for (S32 i=0;i<(S32)mPath.size();i++) { - mPath[i].mPos.mV[0] = toggle; + mPath[i].mPos.getF32ptr()[0] = toggle; if (toggle == 0.5f) toggle = -0.5f; else @@ -1714,14 +1647,16 @@ BOOL LLPath::generate(const LLPathParams& params, F32 detail, S32 split, for (S32 i=0;i<np;i++) { F32 t = (F32)i * mStep; - mPath[i].mPos.setVec(0, + mPath[i].mPos.set(0, lerp(0, -sin(F_PI*params.getTwist()*t)*0.5f,t), lerp(-0.5, cos(F_PI*params.getTwist()*t)*0.5f,t)); - mPath[i].mScale.mV[0] = lerp(1,params.getScale().mV[0],t); - mPath[i].mScale.mV[1] = lerp(1,params.getScale().mV[1],t); + mPath[i].mScale.set(lerp(1,params.getScale().mV[0],t), + lerp(1,params.getScale().mV[1],t), 0,1); mPath[i].mTexT = t; - - mPath[i].mRot.setQuat(F_PI * params.getTwist() * t,1,0,0); + LLQuaternion quat; + quat.setQuat(F_PI * params.getTwist() * t,1,0,0); + LLMatrix3 tmp(quat); + mPath[i].mRot.loadu(tmp); } break; @@ -1745,11 +1680,15 @@ BOOL LLDynamicPath::generate(const LLPathParams& params, F32 detail, S32 split, // Path hasn't been generated yet. // Some algorithms later assume at least TWO path points. resizePath(2); + LLQuaternion quat; + quat.setQuat(0,0,0); + LLMatrix3 tmp(quat); + for (U32 i = 0; i < 2; i++) { - mPath[i].mPos.setVec(0, 0, 0); - mPath[i].mRot.setQuat(0, 0, 0); - mPath[i].mScale.setVec(1, 1); + mPath[i].mPos.set(0, 0, 0); + mPath[i].mRot.loadu(tmp); + mPath[i].mScale.set(1, 1, 0, 1); mPath[i].mTexT = 0; } } @@ -2182,6 +2121,7 @@ LLVolume::~LLVolume() BOOL LLVolume::generate() { + LL_CHECK_MEMORY llassert_always(mProfilep); //Added 10.03.05 Dave Parks @@ -2218,20 +2158,6 @@ BOOL LLVolume::generate() mLODScaleBias.setVec(0.6f, 0.6f, 0.6f); } - //******************************************************************** - //debug info, to be removed - if((U32)(mPathp->mPath.size() * mProfilep->mProfile.size()) > (1u << 20)) - { - llinfos << "sizeS: " << mPathp->mPath.size() << " sizeT: " << mProfilep->mProfile.size() << llendl ; - llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; - llinfos << mParams << llendl ; - llinfos << "more info to check if mProfilep is deleted or not." << llendl ; - llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; - - llerrs << "LLVolume corrupted!" << llendl ; - } - //******************************************************************** - BOOL regenPath = mPathp->generate(mParams.getPathParams(), path_detail, split); BOOL regenProf = mProfilep->generate(mParams.getProfileParams(), mPathp->isOpen(),profile_detail, split); @@ -2240,21 +2166,6 @@ BOOL LLVolume::generate() S32 sizeS = mPathp->mPath.size(); S32 sizeT = mProfilep->mProfile.size(); - //******************************************************************** - //debug info, to be removed - if((U32)(sizeS * sizeT) > (1u << 20)) - { - llinfos << "regenPath: " << (S32)regenPath << " regenProf: " << (S32)regenProf << llendl ; - llinfos << "sizeS: " << sizeS << " sizeT: " << sizeT << llendl ; - llinfos << "path_detail : " << path_detail << " split: " << split << " profile_detail: " << profile_detail << llendl ; - llinfos << mParams << llendl ; - llinfos << "more info to check if mProfilep is deleted or not." << llendl ; - llinfos << mProfilep->mNormals.size() << " : " << mProfilep->mFaces.size() << " : " << mProfilep->mEdgeNormals.size() << " : " << mProfilep->mEdgeCenters.size() << llendl ; - - llerrs << "LLVolume corrupted!" << llendl ; - } - //******************************************************************** - sNumMeshPoints -= mMesh.size(); mMesh.resize(sizeT * sizeS); sNumMeshPoints += mMesh.size(); @@ -2262,22 +2173,39 @@ BOOL LLVolume::generate() //generate vertex positions // Run along the path. + LLVector4a* dst = mMesh.mArray; + for (S32 s = 0; s < sizeS; ++s) { - LLVector2 scale = mPathp->mPath[s].mScale; - LLQuaternion rot = mPathp->mPath[s].mRot; + F32* scale = mPathp->mPath[s].mScale.getF32ptr(); + + F32 sc [] = + { scale[0], 0, 0, 0, + 0, scale[1], 0, 0, + 0, 0, scale[2], 0, + 0, 0, 0, 1 }; + + LLMatrix4 rot((F32*) mPathp->mPath[s].mRot.mMatrix); + LLMatrix4 scale_mat(sc); + + scale_mat *= rot; + + LLMatrix4a rot_mat; + rot_mat.loadu(scale_mat); + + LLVector4a* profile = mProfilep->mProfile.mArray; + LLVector4a* end_profile = profile+sizeT; + LLVector4a offset = mPathp->mPath[s].mPos; + + LLVector4a tmp; // Run along the profile. - for (S32 t = 0; t < sizeT; ++t) + while (profile < end_profile) { - S32 m = s*sizeT + t; - Point& pt = mMesh[m]; - - pt.mPos.mV[0] = mProfilep->mProfile[t].mV[0] * scale.mV[0]; - pt.mPos.mV[1] = mProfilep->mProfile[t].mV[1] * scale.mV[1]; - pt.mPos.mV[2] = 0.0f; - pt.mPos = pt.mPos * rot; - pt.mPos += mPathp->mPath[s].mPos; + rot_mat.rotate(*profile++, tmp); + dst->setAdd(tmp,offset); + llassert(dst->isFinite3()); + ++dst; } } @@ -2287,9 +2215,11 @@ BOOL LLVolume::generate() LLFaceID id = iter->mFaceID; mFaceMask |= id; } - + LL_CHECK_MEMORY return TRUE; } + + LL_CHECK_MEMORY return FALSE; } @@ -2868,13 +2798,15 @@ void LLVolume::createVolumeFaces() } -inline LLVector3 sculpt_rgb_to_vector(U8 r, U8 g, U8 b) +inline LLVector4a sculpt_rgb_to_vector(U8 r, U8 g, U8 b) { // maps RGB values to vector values [0..255] -> [-0.5..0.5] - LLVector3 value; - value.mV[VX] = r / 255.f - 0.5f; - value.mV[VY] = g / 255.f - 0.5f; - value.mV[VZ] = b / 255.f - 0.5f; + LLVector4a value; + LLVector4a sub(0.5f, 0.5f, 0.5f); + + value.set(r,g,b); + value.mul(1.f/255.f); + value.sub(sub); return value; } @@ -2895,21 +2827,21 @@ inline U32 sculpt_st_to_index(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_w } -inline LLVector3 sculpt_index_to_vector(U32 index, const U8* sculpt_data) +inline LLVector4a sculpt_index_to_vector(U32 index, const U8* sculpt_data) { - LLVector3 v = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]); + LLVector4a v = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]); return v; } -inline LLVector3 sculpt_st_to_vector(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +inline LLVector4a sculpt_st_to_vector(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) { U32 index = sculpt_st_to_index(s, t, size_s, size_t, sculpt_width, sculpt_height, sculpt_components); return sculpt_index_to_vector(index, sculpt_data); } -inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) +inline LLVector4a sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data) { U32 index = sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components); @@ -2931,15 +2863,26 @@ F32 LLVolume::sculptGetSurfaceArea() for (S32 t = 0; t < sizeT-1; t++) { // get four corners of quad - LLVector3 p1 = mMesh[(s )*sizeT + (t )].mPos; - LLVector3 p2 = mMesh[(s+1)*sizeT + (t )].mPos; - LLVector3 p3 = mMesh[(s )*sizeT + (t+1)].mPos; - LLVector3 p4 = mMesh[(s+1)*sizeT + (t+1)].mPos; + LLVector4a& p1 = mMesh[(s )*sizeT + (t )]; + LLVector4a& p2 = mMesh[(s+1)*sizeT + (t )]; + LLVector4a& p3 = mMesh[(s )*sizeT + (t+1)]; + LLVector4a& p4 = mMesh[(s+1)*sizeT + (t+1)]; // compute the area of the quad by taking the length of the cross product of the two triangles - LLVector3 cross1 = (p1 - p2) % (p1 - p3); - LLVector3 cross2 = (p4 - p2) % (p4 - p3); - area += (cross1.magVec() + cross2.magVec()) / 2.f; + LLVector4a v0,v1,v2,v3; + v0.setSub(p1,p2); + v1.setSub(p1,p3); + v2.setSub(p4,p2); + v3.setSub(p4,p3); + + LLVector4a cross1, cross2; + cross1.setCross3(v0,v1); + cross2.setCross3(v2,v3); + + //LLVector3 cross1 = (p1 - p2) % (p1 - p3); + //LLVector3 cross2 = (p4 - p2) % (p4 - p3); + + area += (cross1.getLength3() + cross2.getLength3()).getF32() / 2.f; } } @@ -2960,7 +2903,7 @@ void LLVolume::sculptGeneratePlaceholder() for (S32 t = 0; t < sizeT; t++) { S32 i = t + line; - Point& pt = mMesh[i]; + LLVector4a& pt = mMesh[i]; F32 u = (F32)s/(sizeS-1); @@ -2968,9 +2911,13 @@ void LLVolume::sculptGeneratePlaceholder() const F32 RADIUS = (F32) 0.3; - pt.mPos.mV[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS); - pt.mPos.mV[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS); - pt.mPos.mV[2] = (F32)(cos(F_PI * v) * RADIUS); + F32* p = pt.getF32ptr(); + + p[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS); + p[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS); + p[2] = (F32)(cos(F_PI * v) * RADIUS); + + llassert(pt.isFinite3()); } line += sizeT; @@ -2995,7 +2942,7 @@ void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 for (S32 t = 0; t < sizeT; t++) { S32 i = t + line; - Point& pt = mMesh[i]; + LLVector4a& pt = mMesh[i]; S32 reversed_t = t; @@ -3052,12 +2999,15 @@ void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 } } - pt.mPos = sculpt_xy_to_vector(x, y, sculpt_width, sculpt_height, sculpt_components, sculpt_data); + pt = sculpt_xy_to_vector(x, y, sculpt_width, sculpt_height, sculpt_components, sculpt_data); if (sculpt_mirror) { - pt.mPos.mV[VX] *= -1.f; + LLVector4a scale(-1.f,1,1,1); + pt.mul(scale); } + + llassert(pt.isFinite3()); } line += sizeT; @@ -3638,819 +3588,141 @@ bool LLVolumeParams::validate(U8 prof_curve, F32 prof_begin, F32 prof_end, F32 h return true; } -S32 *LLVolume::getTriangleIndices(U32 &num_indices) const -{ - S32 expected_num_triangle_indices = getNumTriangleIndices(); - if (expected_num_triangle_indices > MAX_VOLUME_TRIANGLE_INDICES) +void LLVolume::getLoDTriangleCounts(const LLVolumeParams& params, S32* counts) +{ //attempt to approximate the number of triangles that will result from generating a volume LoD set for the + //supplied LLVolumeParams -- inaccurate, but a close enough approximation for determining streaming cost + F32 detail[] = {1.f, 1.5f, 2.5f, 4.f}; + for (S32 i = 0; i < 4; i++) { - // we don't allow LLVolumes with this many vertices - llwarns << "Couldn't allocate triangle indices" << llendl; - num_indices = 0; - return NULL; - } + S32 count = 0; + S32 path_points = LLPath::getNumPoints(params.getPathParams(), detail[i]); + S32 profile_points = LLProfile::getNumPoints(params.getProfileParams(), false, detail[i]); - S32* index = new S32[expected_num_triangle_indices]; - S32 count = 0; + count = (profile_points-1)*2*(path_points-1); + count += profile_points*2; - // Let's do this totally diffently, as we don't care about faces... - // Counter-clockwise triangles are forward facing... + counts[i] = count; + } +} - BOOL open = getProfile().isOpen(); - BOOL hollow = (mParams.getProfileParams().getHollow() > 0); - BOOL path_open = getPath().isOpen(); - S32 size_s, size_s_out, size_t; - S32 s, t, i; - size_s = getProfile().getTotal(); - size_s_out = getProfile().getTotalOut(); - size_t = getPath().mPath.size(); - // NOTE -- if the construction of the triangles below ever changes - // then getNumTriangleIndices() method may also have to be updated. +S32 LLVolume::getNumTriangles(S32* vcount) const +{ + U32 triangle_count = 0; + U32 vertex_count = 0; - if (open) /* Flawfinder: ignore */ + for (S32 i = 0; i < getNumVolumeFaces(); ++i) { - if (hollow) - { - // Open hollow -- much like the closed solid, except we - // we need to stitch up the gap between s=0 and s=size_s-1 + const LLVolumeFace& face = getVolumeFace(i); + triangle_count += face.mNumIndices/3; - for (t = 0; t < size_t - 1; t++) - { - // The outer face, first cut, and inner face - for (s = 0; s < size_s - 1; s++) - { - i = s + t*size_s; - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 + vertex_count += face.mNumVertices; + } + + + if (vcount) + { + *vcount = vertex_count; + } - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } + return triangle_count; +} + + +//----------------------------------------------------------------------------- +// generateSilhouetteVertices() +//----------------------------------------------------------------------------- +void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices, + std::vector<LLVector3> &normals, + const LLVector3& obj_cam_vec_in, + const LLMatrix4& mat_in, + const LLMatrix3& norm_mat_in, + S32 face_mask) +{ + LLMatrix4a mat; + mat.loadu(mat_in); + + LLMatrix4a norm_mat; + norm_mat.loadu(norm_mat_in); + + LLVector4a obj_cam_vec; + obj_cam_vec.load3(obj_cam_vec_in.mV); + + vertices.clear(); + normals.clear(); - // The other cut face - index[count++] = s + t*size_s; // x,y - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = s + (t+1)*size_s; // x,y+1 + if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) + { + return; + } - index[count++] = s + (t+1)*size_s; // x,y+1 - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = 0 + (t+1)*size_s; // x+1,y+1 - } + S32 cur_index = 0; + //for each face + for (face_list_t::iterator iter = mVolumeFaces.begin(); + iter != mVolumeFaces.end(); ++iter) + { + LLVolumeFace& face = *iter; + + if (!(face_mask & (0x1 << cur_index++)) || + face.mNumIndices == 0 || face.mEdge.empty()) + { + continue; + } - // Do the top and bottom caps, if necessary - if (path_open) - { - // Top cap - S32 pt1 = 0; - S32 pt2 = size_s-1; - S32 i = (size_t - 1)*size_s; + if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { + + } + else { - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } + //============================================== + //DEBUG draw edge map instead of silhouette edge + //============================================== - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; +#if DEBUG_SILHOUETTE_EDGE_MAP - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } + //for each triangle + U32 count = face.mNumIndices; + for (U32 j = 0; j < count/3; j++) { + //get vertices + S32 v1 = face.mIndices[j*3+0]; + S32 v2 = face.mIndices[j*3+1]; + S32 v3 = face.mIndices[j*3+2]; - if (use_tri1a2) - { - index[count++] = pt1 + i; - index[count++] = pt1 + 1 + i; - index[count++] = pt2 + i; - pt1++; - } - else - { - index[count++] = pt1 + i; - index[count++] = pt2 - 1 + i; - index[count++] = pt2 + i; - pt2--; - } - } + //get current face center + LLVector3 cCenter = (face.mVertices[v1].getPosition() + + face.mVertices[v2].getPosition() + + face.mVertices[v3].getPosition()) / 3.0f; - // Bottom cap - pt1 = 0; - pt2 = size_s-1; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; + //for each edge + for (S32 k = 0; k < 3; k++) { + S32 nIndex = face.mEdge[j*3+k]; + if (nIndex <= -1) { + continue; } - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; + if (nIndex >= (S32) count/3) { + continue; } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; + //get neighbor vertices + v1 = face.mIndices[nIndex*3+0]; + v2 = face.mIndices[nIndex*3+1]; + v3 = face.mIndices[nIndex*3+2]; - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } + //get neighbor face center + LLVector3 nCenter = (face.mVertices[v1].getPosition() + + face.mVertices[v2].getPosition() + + face.mVertices[v3].getPosition()) / 3.0f; - if (use_tri1a2) - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt1 + 1; - pt1++; - } - else - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt2 - 1; - pt2--; - } + //draw line + vertices.push_back(cCenter); + vertices.push_back(nCenter); + normals.push_back(LLVector3(1,1,1)); + normals.push_back(LLVector3(1,1,1)); + segments.push_back(vertices.size()); } } - } - else - { - // Open solid - - for (t = 0; t < size_t - 1; t++) - { - // Outer face + 1 cut face - for (s = 0; s < size_s - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } - - // The other cut face - index[count++] = (size_s - 1) + (t*size_s); // x,y - index[count++] = 0 + t*size_s; // x+1,y - index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 - - index[count++] = (size_s - 1) + (t+1)*size_s; // x,y+1 - index[count++] = 0 + (t*size_s); // x+1,y - index[count++] = 0 + (t+1)*size_s; // x+1,y+1 - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - for (s = 0; s < size_s - 2; s++) - { - index[count++] = s+1; - index[count++] = s; - index[count++] = size_s - 1; - } - - // We've got a top cap - S32 offset = (size_t - 1)*size_s; - for (s = 0; s < size_s - 2; s++) - { - // Inverted ordering from bottom cap. - index[count++] = offset + size_s - 1; - index[count++] = offset + s; - index[count++] = offset + s + 1; - } - } - } - } - else if (hollow) - { - // Closed hollow - // Outer face - - for (t = 0; t < size_t - 1; t++) - { - for (s = 0; s < size_s_out - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + 1 + size_s; // x+1,y+1 - } - } - - // Inner face - // Invert facing from outer face - for (t = 0; t < size_t - 1; t++) - { - for (s = size_s_out; s < size_s - 1; s++) - { - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + 1 + size_s; // x+1,y+1 - } - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - // Top cap - S32 pt1 = 0; - S32 pt2 = size_s-1; - S32 i = (size_t - 1)*size_s; - - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1 + i; - index[count++] = pt1 + 1 + i; - index[count++] = pt2 + i; - pt1++; - } - else - { - index[count++] = pt1 + i; - index[count++] = pt2 - 1 + i; - index[count++] = pt2 + i; - pt2--; - } - } - - // Bottom cap - pt1 = 0; - pt2 = size_s-1; - while (pt2 - pt1 > 1) - { - // Use the profile points instead of the mesh, since you want - // the un-transformed profile distances. - LLVector3 p1 = getProfile().mProfile[pt1]; - LLVector3 p2 = getProfile().mProfile[pt2]; - LLVector3 pa = getProfile().mProfile[pt1+1]; - LLVector3 pb = getProfile().mProfile[pt2-1]; - - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; - - // Use area of triangle to determine backfacing - F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); - - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); - - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); - - BOOL use_tri1a2 = TRUE; - BOOL tri_1a2 = TRUE; - BOOL tri_21b = TRUE; - - if (area_1a2 < 0) - { - tri_1a2 = FALSE; - } - if (area_2ab < 0) - { - // Can't use, because it contains point b - tri_1a2 = FALSE; - } - if (area_21b < 0) - { - tri_21b = FALSE; - } - if (area_1ba < 0) - { - // Can't use, because it contains point b - tri_21b = FALSE; - } - - if (!tri_1a2) - { - use_tri1a2 = FALSE; - } - else if (!tri_21b) - { - use_tri1a2 = TRUE; - } - else - { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; - - if (d1.magVecSquared() < d2.magVecSquared()) - { - use_tri1a2 = TRUE; - } - else - { - use_tri1a2 = FALSE; - } - } - - if (use_tri1a2) - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt1 + 1; - pt1++; - } - else - { - index[count++] = pt1; - index[count++] = pt2; - index[count++] = pt2 - 1; - pt2--; - } - } - } - } - else - { - // Closed solid. Easy case. - for (t = 0; t < size_t - 1; t++) - { - for (s = 0; s < size_s - 1; s++) - { - // Should wrap properly, but for now... - i = s + t*size_s; - - index[count++] = i; // x,y - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s; // x,y+1 - - index[count++] = i + size_s; // x,y+1 - index[count++] = i + 1; // x+1,y - index[count++] = i + size_s + 1; // x+1,y+1 - } - } - - // Do the top and bottom caps, if necessary - if (path_open) - { - // bottom cap - for (s = 1; s < size_s - 2; s++) - { - index[count++] = s+1; - index[count++] = s; - index[count++] = 0; - } - - // top cap - S32 offset = (size_t - 1)*size_s; - for (s = 1; s < size_s - 2; s++) - { - // Inverted ordering from bottom cap. - index[count++] = offset; - index[count++] = offset + s; - index[count++] = offset + s + 1; - } - } - } - -#ifdef LL_DEBUG - // assert that we computed the correct number of indices - if (count != expected_num_triangle_indices ) - { - llerrs << "bad index count prediciton:" - << " expected=" << expected_num_triangle_indices - << " actual=" << count << llendl; - } -#endif - -#if 0 - // verify that each index does not point beyond the size of the mesh - S32 num_vertices = mMesh.size(); - for (i = 0; i < count; i+=3) - { - llinfos << index[i] << ":" << index[i+1] << ":" << index[i+2] << llendl; - llassert(index[i] < num_vertices); - llassert(index[i+1] < num_vertices); - llassert(index[i+2] < num_vertices); - } -#endif - - num_indices = count; - return index; -} - -void LLVolume::getLoDTriangleCounts(const LLVolumeParams& params, S32* counts) -{ //attempt to approximate the number of triangles that will result from generating a volume LoD set for the - //supplied LLVolumeParams -- inaccurate, but a close enough approximation for determining streaming cost - F32 detail[] = {1.f, 1.5f, 2.5f, 4.f}; - for (S32 i = 0; i < 4; i++) - { - S32 count = 0; - S32 path_points = LLPath::getNumPoints(params.getPathParams(), detail[i]); - S32 profile_points = LLProfile::getNumPoints(params.getProfileParams(), false, detail[i]); - - count = (profile_points-1)*2*(path_points-1); - count += profile_points*2; - - counts[i] = count; - } -} - -S32 LLVolume::getNumTriangleIndices() const -{ - BOOL profile_open = getProfile().isOpen(); - BOOL hollow = (mParams.getProfileParams().getHollow() > 0); - BOOL path_open = getPath().isOpen(); - - S32 size_s, size_s_out, size_t; - size_s = getProfile().getTotal(); - size_s_out = getProfile().getTotalOut(); - size_t = getPath().mPath.size(); - - S32 count = 0; - if (profile_open) /* Flawfinder: ignore */ - { - if (hollow) - { - // Open hollow -- much like the closed solid, except we - // we need to stitch up the gap between s=0 and s=size_s-1 - count = (size_t - 1) * (((size_s -1) * 6) + 6); - } - else - { - count = (size_t - 1) * (((size_s -1) * 6) + 6); - } - } - else if (hollow) - { - // Closed hollow - // Outer face - count = (size_t - 1) * (size_s_out - 1) * 6; - - // Inner face - count += (size_t - 1) * ((size_s - 1) - size_s_out) * 6; - } - else - { - // Closed solid. Easy case. - count = (size_t - 1) * (size_s - 1) * 6; - } - - if (path_open) - { - S32 cap_triangle_count = size_s - 3; - if ( profile_open - || hollow ) - { - cap_triangle_count = size_s - 2; - } - if ( cap_triangle_count > 0 ) - { - // top and bottom caps - count += cap_triangle_count * 2 * 3; - } - } - return count; -} - - -S32 LLVolume::getNumTriangles(S32* vcount) const -{ - U32 triangle_count = 0; - U32 vertex_count = 0; - - for (S32 i = 0; i < getNumVolumeFaces(); ++i) - { - const LLVolumeFace& face = getVolumeFace(i); - triangle_count += face.mNumIndices/3; - - vertex_count += face.mNumVertices; - } - - - if (vcount) - { - *vcount = vertex_count; - } - - return triangle_count; -} - - -//----------------------------------------------------------------------------- -// generateSilhouetteVertices() -//----------------------------------------------------------------------------- -void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices, - std::vector<LLVector3> &normals, - const LLVector3& obj_cam_vec_in, - const LLMatrix4& mat_in, - const LLMatrix3& norm_mat_in, - S32 face_mask) -{ - LLMatrix4a mat; - mat.loadu(mat_in); - - LLMatrix4a norm_mat; - norm_mat.loadu(norm_mat_in); - - LLVector4a obj_cam_vec; - obj_cam_vec.load3(obj_cam_vec_in.mV); - - vertices.clear(); - normals.clear(); - - if ((mParams.getSculptType() & LL_SCULPT_TYPE_MASK) == LL_SCULPT_TYPE_MESH) - { - return; - } - - S32 cur_index = 0; - //for each face - for (face_list_t::iterator iter = mVolumeFaces.begin(); - iter != mVolumeFaces.end(); ++iter) - { - LLVolumeFace& face = *iter; - - if (!(face_mask & (0x1 << cur_index++)) || - face.mNumIndices == 0 || face.mEdge.empty()) - { - continue; - } - - if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) { - - } - else { - - //============================================== - //DEBUG draw edge map instead of silhouette edge - //============================================== - -#if DEBUG_SILHOUETTE_EDGE_MAP - - //for each triangle - U32 count = face.mNumIndices; - for (U32 j = 0; j < count/3; j++) { - //get vertices - S32 v1 = face.mIndices[j*3+0]; - S32 v2 = face.mIndices[j*3+1]; - S32 v3 = face.mIndices[j*3+2]; - - //get current face center - LLVector3 cCenter = (face.mVertices[v1].getPosition() + - face.mVertices[v2].getPosition() + - face.mVertices[v3].getPosition()) / 3.0f; - - //for each edge - for (S32 k = 0; k < 3; k++) { - S32 nIndex = face.mEdge[j*3+k]; - if (nIndex <= -1) { - continue; - } - - if (nIndex >= (S32) count/3) { - continue; - } - //get neighbor vertices - v1 = face.mIndices[nIndex*3+0]; - v2 = face.mIndices[nIndex*3+1]; - v3 = face.mIndices[nIndex*3+2]; - - //get neighbor face center - LLVector3 nCenter = (face.mVertices[v1].getPosition() + - face.mVertices[v2].getPosition() + - face.mVertices[v3].getPosition()) / 3.0f; - - //draw line - vertices.push_back(cCenter); - vertices.push_back(nCenter); - normals.push_back(LLVector3(1,1,1)); - normals.push_back(LLVector3(1,1,1)); - segments.push_back(vertices.size()); - } - } - - continue; + + continue; //============================================== //DEBUG @@ -5268,6 +4540,7 @@ LLVolumeFace::LLVolumeFace() : mNumS(0), mNumT(0), mNumVertices(0), + mNumAllocatedVertices(0), mNumIndices(0), mPositions(NULL), mNormals(NULL), @@ -5275,7 +4548,8 @@ LLVolumeFace::LLVolumeFace() : mTexCoords(NULL), mIndices(NULL), mWeights(NULL), - mOctree(NULL) + mOctree(NULL), + mOptimized(FALSE) { mExtents = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*3); mExtents[0].splat(-0.5f); @@ -5291,6 +4565,7 @@ LLVolumeFace::LLVolumeFace(const LLVolumeFace& src) mNumS(0), mNumT(0), mNumVertices(0), + mNumAllocatedVertices(0), mNumIndices(0), mPositions(NULL), mNormals(NULL), @@ -5328,8 +4603,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) freeData(); - LLVector4a::memcpyNonAliased16((F32*) mExtents, (F32*) src.mExtents, 3*sizeof(LLVector4a)); - resizeVertices(src.mNumVertices); resizeIndices(src.mNumIndices); @@ -5339,18 +4612,16 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) S32 tc_size = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF; LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) src.mPositions, vert_size); + + if (src.mNormals) + { LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) src.mNormals, vert_size); + } if(src.mTexCoords) { LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) src.mTexCoords, tc_size); } - else - { - ll_aligned_free_16(mTexCoords) ; - mTexCoords = NULL ; - } - if (src.mTangents) { @@ -5382,6 +4653,8 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src) LLVector4a::memcpyNonAliased16((F32*) mIndices, (F32*) src.mIndices, idx_size); } + mOptimized = src.mOptimized; + //delete return *this; } @@ -5396,12 +4669,13 @@ LLVolumeFace::~LLVolumeFace() void LLVolumeFace::freeData() { - ll_aligned_free_16(mPositions); + ll_aligned_free(mPositions); mPositions = NULL; - ll_aligned_free_16( mNormals); + + //normals and texture coordinates are part of the same buffer as mPositions, do not free them separately mNormals = NULL; - ll_aligned_free_16(mTexCoords); mTexCoords = NULL; + ll_aligned_free_16(mIndices); mIndices = NULL; ll_aligned_free_16(mTangents); @@ -5419,52 +4693,23 @@ BOOL LLVolumeFace::create(LLVolume* volume, BOOL partial_build) delete mOctree; mOctree = NULL; + LL_CHECK_MEMORY BOOL ret = FALSE ; if (mTypeMask & CAP_MASK) { ret = createCap(volume, partial_build); + LL_CHECK_MEMORY } else if ((mTypeMask & END_MASK) || (mTypeMask & SIDE_MASK)) { ret = createSide(volume, partial_build); + LL_CHECK_MEMORY } else { llerrs << "Unknown/uninitialized face type!" << llendl; } - //update the range of the texture coordinates - if(ret) - { - mTexCoordExtents[0].setVec(1.f, 1.f) ; - mTexCoordExtents[1].setVec(0.f, 0.f) ; - - for(U32 i = 0 ; i < mNumVertices ; i++) - { - if(mTexCoordExtents[0].mV[0] > mTexCoords[i].mV[0]) - { - mTexCoordExtents[0].mV[0] = mTexCoords[i].mV[0] ; - } - if(mTexCoordExtents[1].mV[0] < mTexCoords[i].mV[0]) - { - mTexCoordExtents[1].mV[0] = mTexCoords[i].mV[0] ; - } - - if(mTexCoordExtents[0].mV[1] > mTexCoords[i].mV[1]) - { - mTexCoordExtents[0].mV[1] = mTexCoords[i].mV[1] ; - } - if(mTexCoordExtents[1].mV[1] < mTexCoords[i].mV[1]) - { - mTexCoordExtents[1].mV[1] = mTexCoords[i].mV[1] ; - } - } - mTexCoordExtents[0].mV[0] = llmax(0.f, mTexCoordExtents[0].mV[0]) ; - mTexCoordExtents[0].mV[1] = llmax(0.f, mTexCoordExtents[0].mV[1]) ; - mTexCoordExtents[1].mV[0] = llmin(1.f, mTexCoordExtents[1].mV[0]) ; - mTexCoordExtents[1].mV[1] = llmin(1.f, mTexCoordExtents[1].mV[1]) ; - } - return ret ; } @@ -5580,22 +4825,29 @@ void LLVolumeFace::optimize(F32 angle_cutoff) } } - llassert(new_face.mNumIndices == mNumIndices); - llassert(new_face.mNumVertices <= mNumVertices); if (angle_cutoff > 1.f && !mNormals) { - ll_aligned_free_16(new_face.mNormals); + // Now alloc'd with positions + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!mTexCoords) { - ll_aligned_free_16(new_face.mTexCoords); + // Now alloc'd with positions + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } - swapData(new_face); + // Only swap data if we've actually optimized the mesh + // + if (new_face.mNumVertices <= mNumVertices) + { + llassert(new_face.mNumIndices == mNumIndices); + swapData(new_face); + } + } class LLVCacheTriangleData; @@ -5605,14 +4857,14 @@ class LLVCacheVertexData public: S32 mIdx; S32 mCacheTag; - F32 mScore; + F64 mScore; U32 mActiveTriangles; std::vector<LLVCacheTriangleData*> mTriangles; LLVCacheVertexData() { mCacheTag = -1; - mScore = 0.f; + mScore = 0.0; mActiveTriangles = 0; mIdx = -1; } @@ -5622,13 +4874,13 @@ class LLVCacheTriangleData { public: bool mActive; - F32 mScore; + F64 mScore; LLVCacheVertexData* mVertex[3]; LLVCacheTriangleData() { mActive = true; - mScore = 0.f; + mScore = 0.0; mVertex[0] = mVertex[1] = mVertex[2] = NULL; } @@ -5639,7 +4891,7 @@ public: { if (mVertex[i]) { - llassert_always(mVertex[i]->mActiveTriangles > 0); + llassert(mVertex[i]->mActiveTriangles > 0); mVertex[i]->mActiveTriangles--; } } @@ -5651,20 +4903,20 @@ public: } }; -const F32 FindVertexScore_CacheDecayPower = 1.5f; -const F32 FindVertexScore_LastTriScore = 0.75f; -const F32 FindVertexScore_ValenceBoostScale = 2.0f; -const F32 FindVertexScore_ValenceBoostPower = 0.5f; +const F64 FindVertexScore_CacheDecayPower = 1.5; +const F64 FindVertexScore_LastTriScore = 0.75; +const F64 FindVertexScore_ValenceBoostScale = 2.0; +const F64 FindVertexScore_ValenceBoostPower = 0.5; const U32 MaxSizeVertexCache = 32; +const F64 FindVertexScore_Scaler = 1.0/(MaxSizeVertexCache-3); -F32 find_vertex_score(LLVCacheVertexData& data) +F64 find_vertex_score(LLVCacheVertexData& data) { - if (data.mActiveTriangles == 0) - { //no triangle references this vertex - return -1.f; - } + F64 score = -1.0; - F32 score = 0.f; + if (data.mActiveTriangles >= 0) + { + score = 0.0; S32 cache_idx = data.mCacheTag; @@ -5680,15 +4932,15 @@ F32 find_vertex_score(LLVCacheVertexData& data) } else { //more points for being higher in the cache - F32 scaler = 1.f/(MaxSizeVertexCache-3); - score = 1.f-((cache_idx-3)*scaler); - score = powf(score, FindVertexScore_CacheDecayPower); + score = 1.0-((cache_idx-3)*FindVertexScore_Scaler); + score = pow(score, FindVertexScore_CacheDecayPower); } } //bonus points for having low valence - F32 valence_boost = powf((F32)data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); + F64 valence_boost = pow((F64)data.mActiveTriangles, -FindVertexScore_ValenceBoostPower); score += FindVertexScore_ValenceBoostScale * valence_boost; + } return score; } @@ -5795,32 +5047,44 @@ public: void updateScores() { - for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) - { //trailing 3 vertices aren't actually in the cache for scoring purposes - if (mCache[i]) + LLVCacheVertexData** data_iter = mCache+MaxSizeVertexCache; + LLVCacheVertexData** end_data = mCache+MaxSizeVertexCache+3; + + while(data_iter != end_data) + { + LLVCacheVertexData* data = *data_iter++; + //trailing 3 vertices aren't actually in the cache for scoring purposes + if (data) { - mCache[i]->mCacheTag = -1; + data->mCacheTag = -1; } } - for (U32 i = 0; i < MaxSizeVertexCache; ++i) + data_iter = mCache; + end_data = mCache+MaxSizeVertexCache; + + while (data_iter != end_data) { //update scores of vertices in cache - if (mCache[i]) + LLVCacheVertexData* data = *data_iter++; + if (data) { - mCache[i]->mScore = find_vertex_score(*(mCache[i])); - llassert_always(mCache[i]->mCacheTag == i); + data->mScore = find_vertex_score(*data); } } mBestTriangle = NULL; //update triangle scores - for (U32 i = 0; i < MaxSizeVertexCache+3; ++i) + data_iter = mCache; + end_data = mCache+MaxSizeVertexCache+3; + + while (data_iter != end_data) { - if (mCache[i]) + LLVCacheVertexData* data = *data_iter++; + if (data) { - for (U32 j = 0; j < mCache[i]->mTriangles.size(); ++j) + for (std::vector<LLVCacheTriangleData*>::iterator iter = data->mTriangles.begin(), end_iter = data->mTriangles.end(); iter != end_iter; ++iter) { - LLVCacheTriangleData* tri = mCache[i]->mTriangles[j]; + LLVCacheTriangleData* tri = *iter; if (tri->mActive) { tri->mScore = tri->mVertex[0]->mScore; @@ -5837,13 +5101,17 @@ public: } //knock trailing 3 vertices off the cache - for (U32 i = MaxSizeVertexCache; i < MaxSizeVertexCache+3; ++i) + data_iter = mCache+MaxSizeVertexCache; + end_data = mCache+MaxSizeVertexCache+3; + while (data_iter != end_data) { - if (mCache[i]) + LLVCacheVertexData* data = *data_iter; + if (data) { - llassert_always(mCache[i]->mCacheTag == -1); - mCache[i] = NULL; + llassert(data->mCacheTag == -1); + *data_iter = NULL; } + ++data_iter; } } }; @@ -5853,6 +5121,9 @@ void LLVolumeFace::cacheOptimize() { //optimize for vertex cache according to Forsyth method: // http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html + llassert(!mOptimized); + mOptimized = TRUE; + LLVCacheLRU cache; if (mNumVertices < 3) @@ -5898,12 +5169,14 @@ void LLVolumeFace::cacheOptimize() for (U32 i = 0; i < mNumVertices; i++) { //initialize score values (no cache -- might try a fifo cache here) - vertex_data[i].mScore = find_vertex_score(vertex_data[i]); - vertex_data[i].mActiveTriangles = vertex_data[i].mTriangles.size(); + LLVCacheVertexData& data = vertex_data[i]; - for (U32 j = 0; j < vertex_data[i].mTriangles.size(); ++j) + data.mScore = find_vertex_score(data); + data.mActiveTriangles = data.mTriangles.size(); + + for (U32 j = 0; j < data.mActiveTriangles; ++j) { - vertex_data[i].mTriangles[j]->mScore += vertex_data[i].mScore; + data.mTriangles[j]->mScore += data.mScore; } } @@ -5973,10 +5246,10 @@ void LLVolumeFace::cacheOptimize() //allocate space for new buffer S32 num_verts = mNumVertices; - LLVector4a* pos = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); - LLVector4a* norm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - LLVector2* tc = (LLVector2*) ll_aligned_malloc_16(size); + LLVector4a* pos = (LLVector4a*) ll_aligned_malloc(sizeof(LLVector4a)*2*num_verts+size, 64); + LLVector4a* norm = pos + num_verts; + LLVector2* tc = (LLVector2*) (norm + num_verts); LLVector4a* wght = NULL; if (mWeights) @@ -5984,10 +5257,10 @@ void LLVolumeFace::cacheOptimize() wght = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } - LLVector4a* tangent = NULL; + LLVector4a* binorm = NULL; if (mTangents) { - tangent = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); + binorm = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); } //allocate mapping of old indices to new indices @@ -6012,7 +5285,7 @@ void LLVolumeFace::cacheOptimize() } if (mTangents) { - tangent[cur_idx] = mTangents[idx]; + binorm[cur_idx] = mTangents[idx]; } cur_idx++; @@ -6024,9 +5297,8 @@ void LLVolumeFace::cacheOptimize() mIndices[i] = new_idx[mIndices[i]]; } - ll_aligned_free_16(mPositions); - ll_aligned_free_16(mNormals); - ll_aligned_free_16(mTexCoords); + ll_aligned_free(mPositions); + // DO NOT free mNormals and mTexCoords as they are part of mPositions buffer ll_aligned_free_16(mWeights); ll_aligned_free_16(mTangents); @@ -6034,7 +5306,7 @@ void LLVolumeFace::cacheOptimize() mNormals = norm; mTexCoords = tc; mWeights = wght; - mTangents = tangent; + mTangents = binorm; //std::string result = llformat("ACMR pre/post: %.3f/%.3f -- %d triangles %d breaks", pre_acmr, post_acmr, mNumIndices/3, breaks); //llinfos << result << llendl; @@ -6148,8 +5420,10 @@ void LerpPlanarVertex(LLVolumeFace::VertexData& v0, BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) { - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + LL_CHECK_MEMORY + + const LLAlignedArray<LLVector4a,64>& mesh = volume->getMesh(); + const LLAlignedArray<LLVector4a,64>& profile = volume->getProfile().mProfile; S32 max_s = volume->getProfile().getTotal(); S32 max_t = volume->getPath().mPath.size(); @@ -6174,9 +5448,9 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) VertexData baseVert; for(S32 t = 0; t < 4; t++) { - corners[t].getPosition().load3( mesh[offset + (grid_size*t)].mPos.mV); - corners[t].mTexCoord.mV[0] = profile[grid_size*t].mV[0]+0.5f; - corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t].mV[1]; + corners[t].getPosition().load4a(mesh[offset + (grid_size*t)].getF32ptr()); + corners[t].mTexCoord.mV[0] = profile[grid_size*t][0]+0.5f; + corners[t].mTexCoord.mV[1] = 0.5f - profile[grid_size*t][1]; } { @@ -6275,6 +5549,7 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build) } } + LL_CHECK_MEMORY return TRUE; } @@ -6293,8 +5568,8 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) S32 num_vertices = 0, num_indices = 0; - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; + const LLAlignedArray<LLVector4a,64>& mesh = volume->getMesh(); + const LLAlignedArray<LLVector4a,64>& profile = volume->getProfile().mProfile; // All types of caps have the same number of vertices and indices num_vertices = profile.size(); @@ -6312,13 +5587,14 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) else { resizeVertices(num_vertices); - if (!partial_build) { resizeIndices(num_indices); } } + LL_CHECK_MEMORY; + S32 max_s = volume->getProfile().getTotal(); S32 max_t = volume->getPath().mPath.size(); @@ -6348,97 +5624,91 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) LLVector4a* norm = (LLVector4a*) mNormals; // Copy the vertices into the array - for (S32 i = 0; i < num_vertices; i++) + + const LLVector4a* src = mesh.mArray+offset; + const LLVector4a* end = src+num_vertices; + + min = *src; + max = min; + + + const LLVector4a* p = profile.mArray; + + if (mTypeMask & TOP_MASK) { - if (mTypeMask & TOP_MASK) + min_uv.set((*p)[0]+0.5f, + (*p)[1]+0.5f); + + max_uv = min_uv; + + while(src < end) { - tc[i].mV[0] = profile[i].mV[0]+0.5f; - tc[i].mV[1] = profile[i].mV[1]+0.5f; + tc->mV[0] = (*p)[0]+0.5f; + tc->mV[1] = (*p)[1]+0.5f; + + llassert(src->isFinite3()); + update_min_max(min,max,*src); + update_min_max(min_uv, max_uv, *tc); + + *pos = *src; + + llassert(pos->isFinite3()); + + ++p; + ++tc; + ++src; + ++pos; + } } else + { + + min_uv.set((*p)[0]+0.5f, + 0.5f - (*p)[1]); + max_uv = min_uv; + + while(src < end) { // Mirror for underside. - tc[i].mV[0] = profile[i].mV[0]+0.5f; - tc[i].mV[1] = 0.5f - profile[i].mV[1]; - } + tc->mV[0] = (*p)[0]+0.5f; + tc->mV[1] = 0.5f - (*p)[1]; + + llassert(src->isFinite3()); + update_min_max(min,max,*src); + update_min_max(min_uv, max_uv, *tc); - pos[i].load3(mesh[i + offset].mPos.mV); + *pos = *src; - if (i == 0) - { - max = pos[i]; - min = max; - min_uv = max_uv = tc[i]; - } - else - { - update_min_max(min,max,pos[i]); - update_min_max(min_uv, max_uv, tc[i]); + llassert(pos->isFinite3()); + + ++p; + ++tc; + ++src; + ++pos; } } + LL_CHECK_MEMORY + mCenter->setAdd(min, max); mCenter->mul(0.5f); cuv = (min_uv + max_uv)*0.5f; - LLVector4a tangent; - calc_tangent_from_triangle( - *norm, - tangent, - *mCenter, cuv, - pos[0], tc[0], - pos[1], tc[1]); - - if (tangent.getLength3() < 0.01) - { - tangent.set(1,0,0,1); - } - else - { - LLVector4a default_tangent; - default_tangent.set(1,0,0,1); - tangent.normalize3fast_checked(&default_tangent); - } - - LLVector4a normal; - LLVector4a d0, d1; - - d0.setSub(*mCenter, pos[0]); - d1.setSub(*mCenter, pos[1]); - - if (mTypeMask & TOP_MASK) - { - normal.setCross3(d0, d1); - } - else - { - normal.setCross3(d1, d0); - } - - normal.normalize3fast_checked(); - VertexData vd; vd.setPosition(*mCenter); vd.mTexCoord = cuv; if (!(mTypeMask & HOLLOW_MASK) && !(mTypeMask & OPEN_MASK)) { - pos[num_vertices] = *mCenter; - tc[num_vertices] = cuv; - + *pos++ = *mCenter; + *tc++ = cuv; num_vertices++; } - allocateTangents(num_vertices); - - for (S32 i = 0; i < num_vertices; i++) - { - mTangents[i].load4a(tangent.getF32ptr()); - norm[i].load4a(normal.getF32ptr()); - } - + LL_CHECK_MEMORY + if (partial_build) { return TRUE; @@ -6457,33 +5727,38 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) { // Use the profile points instead of the mesh, since you want // the un-transformed profile distances. - LLVector3 p1 = profile[pt1]; - LLVector3 p2 = profile[pt2]; - LLVector3 pa = profile[pt1+1]; - LLVector3 pb = profile[pt2-1]; + const LLVector4a& p1 = profile[pt1]; + const LLVector4a& p2 = profile[pt2]; + const LLVector4a& pa = profile[pt1+1]; + const LLVector4a& pb = profile[pt2-1]; - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; + const F32* p1V = p1.getF32ptr(); + const F32* p2V = p2.getF32ptr(); + const F32* paV = pa.getF32ptr(); + const F32* pbV = pb.getF32ptr(); + + //p1.mV[VZ] = 0.f; + //p2.mV[VZ] = 0.f; + //pa.mV[VZ] = 0.f; + //pb.mV[VZ] = 0.f; // Use area of triangle to determine backfacing F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + area_1a2 = (p1V[0]*paV[1] - paV[0]*p1V[1]) + + (paV[0]*p2V[1] - p2V[0]*paV[1]) + + (p2V[0]*p1V[1] - p1V[0]*p2V[1]); - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + area_1ba = (p1V[0]*pbV[1] - pbV[0]*p1V[1]) + + (pbV[0]*paV[1] - paV[0]*pbV[1]) + + (paV[0]*p1V[1] - p1V[0]*paV[1]); - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + area_21b = (p2V[0]*p1V[1] - p1V[0]*p2V[1]) + + (p1V[0]*pbV[1] - pbV[0]*p1V[1]) + + (pbV[0]*p2V[1] - p2V[0]*pbV[1]); - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + area_2ab = (p2V[0]*paV[1] - paV[0]*p2V[1]) + + (paV[0]*pbV[1] - pbV[0]*paV[1]) + + (pbV[0]*p2V[1] - p2V[0]*pbV[1]); BOOL use_tri1a2 = TRUE; BOOL tri_1a2 = TRUE; @@ -6518,10 +5793,13 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) } else { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; + LLVector4a d1; + d1.setSub(p1, pa); + + LLVector4a d2; + d2.setSub(p2, pb); - if (d1.magVecSquared() < d2.magVecSquared()) + if (d1.dot3(d1) < d2.dot3(d2)) { use_tri1a2 = TRUE; } @@ -6560,33 +5838,33 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) { // Use the profile points instead of the mesh, since you want // the un-transformed profile distances. - LLVector3 p1 = profile[pt1]; - LLVector3 p2 = profile[pt2]; - LLVector3 pa = profile[pt1+1]; - LLVector3 pb = profile[pt2-1]; + const LLVector4a& p1 = profile[pt1]; + const LLVector4a& p2 = profile[pt2]; + const LLVector4a& pa = profile[pt1+1]; + const LLVector4a& pb = profile[pt2-1]; - p1.mV[VZ] = 0.f; - p2.mV[VZ] = 0.f; - pa.mV[VZ] = 0.f; - pb.mV[VZ] = 0.f; + const F32* p1V = p1.getF32ptr(); + const F32* p2V = p2.getF32ptr(); + const F32* paV = pa.getF32ptr(); + const F32* pbV = pb.getF32ptr(); // Use area of triangle to determine backfacing F32 area_1a2, area_1ba, area_21b, area_2ab; - area_1a2 = (p1.mV[0]*pa.mV[1] - pa.mV[0]*p1.mV[1]) + - (pa.mV[0]*p2.mV[1] - p2.mV[0]*pa.mV[1]) + - (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]); + area_1a2 = (p1V[0]*paV[1] - paV[0]*p1V[1]) + + (paV[0]*p2V[1] - p2V[0]*paV[1]) + + (p2V[0]*p1V[1] - p1V[0]*p2V[1]); - area_1ba = (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*pa.mV[1] - pa.mV[0]*pb.mV[1]) + - (pa.mV[0]*p1.mV[1] - p1.mV[0]*pa.mV[1]); + area_1ba = (p1V[0]*pbV[1] - pbV[0]*p1V[1]) + + (pbV[0]*paV[1] - paV[0]*pbV[1]) + + (paV[0]*p1V[1] - p1V[0]*paV[1]); - area_21b = (p2.mV[0]*p1.mV[1] - p1.mV[0]*p2.mV[1]) + - (p1.mV[0]*pb.mV[1] - pb.mV[0]*p1.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + area_21b = (p2V[0]*p1V[1] - p1V[0]*p2V[1]) + + (p1V[0]*pbV[1] - pbV[0]*p1V[1]) + + (pbV[0]*p2V[1] - p2V[0]*pbV[1]); - area_2ab = (p2.mV[0]*pa.mV[1] - pa.mV[0]*p2.mV[1]) + - (pa.mV[0]*pb.mV[1] - pb.mV[0]*pa.mV[1]) + - (pb.mV[0]*p2.mV[1] - p2.mV[0]*pb.mV[1]); + area_2ab = (p2V[0]*paV[1] - paV[0]*p2V[1]) + + (paV[0]*pbV[1] - pbV[0]*paV[1]) + + (pbV[0]*p2V[1] - p2V[0]*pbV[1]); BOOL use_tri1a2 = TRUE; BOOL tri_1a2 = TRUE; @@ -6621,10 +5899,12 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) } else { - LLVector3 d1 = p1 - pa; - LLVector3 d2 = p2 - pb; + LLVector4a d1; + d1.setSub(p1,pa); + LLVector4a d2; + d2.setSub(p2,pb); - if (d1.magVecSquared() < d2.magVecSquared()) + if (d1.dot3(d1) < d2.dot3(d2)) { use_tri1a2 = TRUE; } @@ -6674,6 +5954,38 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build) } + LLVector4a d0,d1; + LL_CHECK_MEMORY + + + d0.setSub(mPositions[mIndices[1]], mPositions[mIndices[0]]); + d1.setSub(mPositions[mIndices[2]], mPositions[mIndices[0]]); + + LLVector4a normal; + normal.setCross3(d0,d1); + + if (normal.dot3(normal).getF32() > F_APPROXIMATELY_ZERO) + { + normal.normalize3fast(); + } + else + { //degenerate, make up a value + normal.set(0,0,1); + } + + llassert(llfinite(normal.getF32ptr()[0])); + llassert(llfinite(normal.getF32ptr()[1])); + llassert(llfinite(normal.getF32ptr()[2])); + + llassert(!llisnan(normal.getF32ptr()[0])); + llassert(!llisnan(normal.getF32ptr()[1])); + llassert(!llisnan(normal.getF32ptr()[2])); + + for (S32 i = 0; i < num_vertices; i++) + { + norm[i].load4a(normal.getF32ptr()); + } + return TRUE; } @@ -6702,37 +6014,33 @@ void LLVolumeFace::createTangents() CalculateTangentArray(mNumVertices, mPositions, mNormals, mTexCoords, mNumIndices/3, mIndices, mTangents); //normalize tangents - LLVector4a default_norm; - default_norm.set(0,1,0,1); for (U32 i = 0; i < mNumVertices; i++) { - //tangent[i].normalize3fast(); + //binorm[i].normalize3fast(); //bump map/planar projection code requires normals to be normalized - mNormals[i].normalize3fast_checked(); + mNormals[i].normalize3fast(); } } } void LLVolumeFace::resizeVertices(S32 num_verts) { - ll_aligned_free_16(mPositions); - ll_aligned_free_16(mNormals); + ll_aligned_free(mPositions); + //DO NOT free mNormals and mTexCoords as they are part of mPositions buffer ll_aligned_free_16(mTangents); - ll_aligned_free_16(mTexCoords); mTangents = NULL; if (num_verts) { - mPositions = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); - ll_assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) ll_aligned_malloc_16(sizeof(LLVector4a)*num_verts); - ll_assert_aligned(mNormals, 16); - //pad texture coordinate block end to allow for QWORD reads S32 size = ((num_verts*sizeof(LLVector2)) + 0xF) & ~0xF; - mTexCoords = (LLVector2*) ll_aligned_malloc_16(size); - ll_assert_aligned(mTexCoords, 16); + + mPositions = (LLVector4a*) ll_aligned_malloc(sizeof(LLVector4a)*2*num_verts+size, 64); + mNormals = mPositions+num_verts; + mTexCoords = (LLVector2*) (mNormals+num_verts); + + ll_assert_aligned(mPositions, 64); } else { @@ -6742,6 +6050,7 @@ void LLVolumeFace::resizeVertices(S32 num_verts) } mNumVertices = num_verts; + mNumAllocatedVertices = num_verts; } void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv) @@ -6752,27 +6061,42 @@ void LLVolumeFace::pushVertex(const LLVolumeFace::VertexData& cv) void LLVolumeFace::pushVertex(const LLVector4a& pos, const LLVector4a& norm, const LLVector2& tc) { S32 new_verts = mNumVertices+1; - S32 new_size = new_verts*16; - S32 old_size = mNumVertices*16; + + if (new_verts > mNumAllocatedVertices) + { + //double buffer size on expansion + new_verts *= 2; + + S32 new_tc_size = ((new_verts*8)+0xF) & ~0xF; + S32 old_tc_size = ((mNumVertices*8)+0xF) & ~0xF; + + S32 old_vsize = mNumVertices*16; + + S32 new_size = new_verts*16*2+new_tc_size; + + LLVector4a* old_buf = mPositions; + + mPositions = (LLVector4a*) ll_aligned_malloc(new_size, 64); + mNormals = mPositions+new_verts; + mTexCoords = (LLVector2*) (mNormals+new_verts); //positions - mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_size, old_size); - ll_assert_aligned(mPositions,16); + LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) old_buf, old_vsize); //normals - mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_size, old_size); - ll_assert_aligned(mNormals,16); + LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) (old_buf+mNumVertices), old_vsize); //tex coords - new_size = ((new_verts*8)+0xF) & ~0xF; - old_size = ((mNumVertices*8)+0xF) & ~0xF; - mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, new_size, old_size); - ll_assert_aligned(mTexCoords,16); - + LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) (old_buf+mNumVertices*2), old_tc_size); //just clear tangents ll_aligned_free_16(mTangents); mTangents = NULL; + ll_aligned_free(old_buf); + + mNumAllocatedVertices = new_verts; + + } mPositions[mNumVertices] = pos; mNormals[mNumVertices] = norm; @@ -6861,13 +6185,23 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat llerrs << "Cannot append empty face." << llendl; } + U32 old_vsize = mNumVertices*16; + U32 new_vsize = new_count * 16; + U32 old_tcsize = (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF; + U32 new_tcsize = (new_count*sizeof(LLVector2)+0xF) & ~0xF; + U32 new_size = new_vsize * 2 + new_tcsize; + //allocate new buffer space - mPositions = (LLVector4a*) ll_aligned_realloc_16(mPositions, new_count*sizeof(LLVector4a), mNumVertices*sizeof(LLVector4a)); - ll_assert_aligned(mPositions, 16); - mNormals = (LLVector4a*) ll_aligned_realloc_16(mNormals, new_count*sizeof(LLVector4a), mNumVertices*sizeof(LLVector4a)); - ll_assert_aligned(mNormals, 16); - mTexCoords = (LLVector2*) ll_aligned_realloc_16(mTexCoords, (new_count*sizeof(LLVector2)+0xF) & ~0xF, (mNumVertices*sizeof(LLVector2)+0xF) & ~0xF); - ll_assert_aligned(mTexCoords, 16); + LLVector4a* old_buf = mPositions; + mPositions = (LLVector4a*) ll_aligned_malloc(new_size, 64); + mNormals = mPositions + new_count; + mTexCoords = (LLVector2*) (mNormals+new_count); + + mNumAllocatedVertices = new_count; + + LLVector4a::memcpyNonAliased16((F32*) mPositions, (F32*) old_buf, old_vsize); + LLVector4a::memcpyNonAliased16((F32*) mNormals, (F32*) (old_buf+mNumVertices), old_vsize); + LLVector4a::memcpyNonAliased16((F32*) mTexCoords, (F32*) (old_buf+mNumVertices*2), old_tcsize); mNumVertices = new_count; @@ -6893,7 +6227,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat //transform appended face normal and store norm_mat.rotate(src_norm[i], dst_norm[i]); - dst_norm[i].normalize3fast_checked(); + dst_norm[i].normalize3fast(); //copy appended face texture coordinate dst_tc[i] = src_tc[i]; @@ -6927,6 +6261,7 @@ void LLVolumeFace::appendFace(const LLVolumeFace& face, LLMatrix4& mat_in, LLMat BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) { + LL_CHECK_MEMORY BOOL flat = mTypeMask & FLAT_MASK; U8 sculpt_type = volume->getParams().getSculptType(); @@ -6937,9 +6272,9 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) S32 num_vertices, num_indices; - const std::vector<LLVolume::Point>& mesh = volume->getMesh(); - const std::vector<LLVector3>& profile = volume->getProfile().mProfile; - const std::vector<LLPath::PathPt>& path_data = volume->getPath().mPath; + const LLAlignedArray<LLVector4a,64>& mesh = volume->getMesh(); + const LLAlignedArray<LLVector4a,64>& profile = volume->getProfile().mProfile; + const LLAlignedArray<LLPath::PathPt,64>& path_data = volume->getPath().mPath; S32 max_s = volume->getProfile().getTotal(); @@ -6960,15 +6295,19 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) } } + LL_CHECK_MEMORY + LLVector4a* pos = (LLVector4a*) mPositions; - LLVector4a* norm = (LLVector4a*) mNormals; LLVector2* tc = (LLVector2*) mTexCoords; - S32 begin_stex = llfloor( profile[mBeginS].mV[2] ); + F32 begin_stex = floorf(profile[mBeginS][2]); S32 num_s = ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2) ? mNumS/2 : mNumS; S32 cur_vertex = 0; + S32 end_t = mBeginT+mNumT; + bool test = (mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2; + // Copy the vertices into the array - for (t = mBeginT; t < mBeginT + mNumT; t++) + for (t = mBeginT; t < end_t; t++) { tt = path_data[t].mTexT; for (s = 0; s < num_s; s++) @@ -6989,11 +6328,11 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) // Get s value for tex-coord. if (!flat) { - ss = profile[mBeginS + s].mV[2]; + ss = profile[mBeginS + s][2]; } else { - ss = profile[mBeginS + s].mV[2] - begin_stex; + ss = profile[mBeginS + s][2] - begin_stex; } } @@ -7013,19 +6352,15 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) i = mBeginS + s + max_s*t; } - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); + mesh[i].store4a((F32*)(pos+cur_vertex)); + tc[cur_vertex].set(ss,tt); - norm[cur_vertex].clear(); cur_vertex++; - if ((mTypeMask & INNER_MASK) && (mTypeMask & FLAT_MASK) && mNumS > 2 && s > 0) + if (test && s > 0) { - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); - - norm[cur_vertex].clear(); - + mesh[i].store4a((F32*)(pos+cur_vertex)); + tc[cur_vertex].set(ss,tt); cur_vertex++; } } @@ -7042,27 +6377,63 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) } i = mBeginS + s + max_s*t; - ss = profile[mBeginS + s].mV[2] - begin_stex; - pos[cur_vertex].load3(mesh[i].mPos.mV); - tc[cur_vertex] = LLVector2(ss,tt); - norm[cur_vertex].clear(); + ss = profile[mBeginS + s][2] - begin_stex; + + mesh[i].store4a((F32*)(pos+cur_vertex)); + tc[cur_vertex].set(ss,tt); cur_vertex++; } - } + } + LL_CHECK_MEMORY - //get bounding box for this side - LLVector4a& face_min = mExtents[0]; - LLVector4a& face_max = mExtents[1]; mCenter->clear(); - face_min = face_max = pos[0]; + LLVector4a* cur_pos = pos; + LLVector4a* end_pos = pos + mNumVertices; + + //get bounding box for this side + LLVector4a face_min; + LLVector4a face_max; + + face_min = face_max = *cur_pos++; + + while (cur_pos < end_pos) + { + update_min_max(face_min, face_max, *cur_pos++); + } + + mExtents[0] = face_min; + mExtents[1] = face_max; + + U32 tc_count = mNumVertices; + if (tc_count%2 == 1) + { //odd number of texture coordinates, duplicate last entry to padded end of array + tc_count++; + mTexCoords[mNumVertices] = mTexCoords[mNumVertices-1]; + } + + LLVector4a* cur_tc = (LLVector4a*) mTexCoords; + LLVector4a* end_tc = (LLVector4a*) (mTexCoords+tc_count); + + LLVector4a tc_min; + LLVector4a tc_max; + + tc_min = tc_max = *cur_tc++; - for (U32 i = 1; i < mNumVertices; ++i) + while (cur_tc < end_tc) { - update_min_max(face_min, face_max, pos[i]); + update_min_max(tc_min, tc_max, *cur_tc++); } + F32* minp = tc_min.getF32ptr(); + F32* maxp = tc_max.getF32ptr(); + + mTexCoordExtents[0].mV[0] = llmin(minp[0], minp[2]); + mTexCoordExtents[0].mV[1] = llmin(minp[1], minp[3]); + mTexCoordExtents[1].mV[0] = llmax(maxp[0], maxp[2]); + mTexCoordExtents[1].mV[1] = llmax(maxp[1], maxp[3]); + mCenter->setAdd(face_min, face_max); mCenter->mul(0.5f); @@ -7127,47 +6498,119 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) } } + LL_CHECK_MEMORY + //clear normals - for (U32 i = 0; i < mNumVertices; i++) + F32* dst = (F32*) mNormals; + F32* end = (F32*) (mNormals+mNumVertices); + LLVector4a zero = LLVector4a::getZero(); + + while (dst < end) { - mNormals[i].clear(); + zero.store4a(dst); + dst += 4; } + LL_CHECK_MEMORY + //generate normals - for (U32 i = 0; i < mNumIndices/3; i++) //for each triangle + U32 count = mNumIndices/3; + + LLVector4a* norm = mNormals; + + static LLAlignedArray<LLVector4a, 64> triangle_normals; + triangle_normals.resize(count); + LLVector4a* output = triangle_normals.mArray; + LLVector4a* end_output = output+count; + + U16* idx = mIndices; + + while (output < end_output) { - const U16* idx = &(mIndices[i*3]); + LLVector4a b,v1,v2; + b.load4a((F32*) (pos+idx[0])); + v1.load4a((F32*) (pos+idx[1])); + v2.load4a((F32*) (pos+idx[2])); + + //calculate triangle normal + LLVector4a a; + a.setSub(b, v1); + b.sub(v2); - LLVector4a* v[] = - { pos+idx[0], pos+idx[1], pos+idx[2] }; + + LLQuad& vector1 = *((LLQuad*) &v1); + LLQuad& vector2 = *((LLQuad*) &v2); - LLVector4a* n[] = - { norm+idx[0], norm+idx[1], norm+idx[2] }; + LLQuad& amQ = *((LLQuad*) &a); + LLQuad& bmQ = *((LLQuad*) &b); + + //v1.setCross3(t,v0); + //setCross3(const LLVector4a& a, const LLVector4a& b) + // Vectors are stored in memory in w, z, y, x order from high to low + // Set vector1 = { a[W], a[X], a[Z], a[Y] } + vector1 = _mm_shuffle_ps( amQ, amQ, _MM_SHUFFLE( 3, 0, 2, 1 )); + // Set vector2 = { b[W], b[Y], b[X], b[Z] } + vector2 = _mm_shuffle_ps( bmQ, bmQ, _MM_SHUFFLE( 3, 1, 0, 2 )); + // mQ = { a[W]*b[W], a[X]*b[Y], a[Z]*b[X], a[Y]*b[Z] } + vector2 = _mm_mul_ps( vector1, vector2 ); + // vector3 = { a[W], a[Y], a[X], a[Z] } + amQ = _mm_shuffle_ps( amQ, amQ, _MM_SHUFFLE( 3, 1, 0, 2 )); + // vector4 = { b[W], b[X], b[Z], b[Y] } + bmQ = _mm_shuffle_ps( bmQ, bmQ, _MM_SHUFFLE( 3, 0, 2, 1 )); + // mQ = { 0, a[X]*b[Y] - a[Y]*b[X], a[Z]*b[X] - a[X]*b[Z], a[Y]*b[Z] - a[Z]*b[Y] } + vector1 = _mm_sub_ps( vector2, _mm_mul_ps( amQ, bmQ )); + + llassert(v1.isFinite3()); + + v1.store4a((F32*) output); - //calculate triangle normal - LLVector4a a, b, c; - a.setSub(*v[0], *v[1]); - b.setSub(*v[0], *v[2]); - c.setCross3(a,b); + output++; + idx += 3; + } + + idx = mIndices; + + LLVector4a* src = triangle_normals.mArray; + + for (U32 i = 0; i < count; i++) //for each triangle + { + LLVector4a c; + c.load4a((F32*) (src++)); + + LLVector4a* n0p = norm+idx[0]; + LLVector4a* n1p = norm+idx[1]; + LLVector4a* n2p = norm+idx[2]; + + idx += 3; - n[0]->add(c); - n[1]->add(c); - n[2]->add(c); + LLVector4a n0,n1,n2; + n0.load4a((F32*) n0p); + n1.load4a((F32*) n1p); + n2.load4a((F32*) n2p); - llassert(llfinite(c.getF32ptr()[0])); - llassert(llfinite(c.getF32ptr()[1])); - llassert(llfinite(c.getF32ptr()[2])); + n0.add(c); + n1.add(c); + n2.add(c); - llassert(!llisnan(c.getF32ptr()[0])); - llassert(!llisnan(c.getF32ptr()[1])); - llassert(!llisnan(c.getF32ptr()[2])); + llassert(c.isFinite3()); //even out quad contributions - n[i%2+1]->add(c); + switch (i%2+1) + { + case 0: n0.add(c); break; + case 1: n1.add(c); break; + case 2: n2.add(c); break; + }; + + n0.store4a((F32*) n0p); + n1.store4a((F32*) n1p); + n2.store4a((F32*) n2p); } + LL_CHECK_MEMORY + // adjust normals based on wrapping and stitching LLVector4a top; @@ -7299,64 +6742,16 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build) } - return TRUE; -} - -// Finds binormal based on three vertices with texture coordinates. -// Fills in dummy values if the triangle has degenerate texture coordinates. -void calc_binormal_from_triangle(LLVector4a& binormal, - - const LLVector4a& pos0, - const LLVector2& tex0, - const LLVector4a& pos1, - const LLVector2& tex1, - const LLVector4a& pos2, - const LLVector2& tex2) -{ - LLVector4a rx0( pos0[VX], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a rx1( pos1[VX], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a rx2( pos2[VX], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a ry0( pos0[VY], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a ry1( pos1[VY], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a ry2( pos2[VY], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a rz0( pos0[VZ], tex0.mV[VX], tex0.mV[VY] ); - LLVector4a rz1( pos1[VZ], tex1.mV[VX], tex1.mV[VY] ); - LLVector4a rz2( pos2[VZ], tex2.mV[VX], tex2.mV[VY] ); - - LLVector4a lhs, rhs; - - LLVector4a r0; - lhs.setSub(rx0, rx1); rhs.setSub(rx0, rx2); - r0.setCross3(lhs, rhs); - - LLVector4a r1; - lhs.setSub(ry0, ry1); rhs.setSub(ry0, ry2); - r1.setCross3(lhs, rhs); - - LLVector4a r2; - lhs.setSub(rz0, rz1); rhs.setSub(rz0, rz2); - r2.setCross3(lhs, rhs); + LL_CHECK_MEMORY - if( r0[VX] && r1[VX] && r2[VX] ) - { - binormal.set( - -r0[VZ] / r0[VX], - -r1[VZ] / r1[VX], - -r2[VZ] / r2[VX]); - // binormal.normVec(); - } - else - { - binormal.set( 0, 1 , 0 ); - } + 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 void CalculateTangentArray(U32 vertexCount, const LLVector4a *vertex, const LLVector4a *normal, const LLVector2 *texcoord, U32 triangleCount, const U16* index_array, LLVector4a *tangent) { + //LLVector4a *tan1 = new LLVector4a[vertexCount * 2]; LLVector4a* tan1 = (LLVector4a*) ll_aligned_malloc_16(vertexCount*2*sizeof(LLVector4a)); LLVector4a* tan2 = tan1 + vertexCount; @@ -7395,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/llvolume.h b/indra/llmath/llvolume.h index 164b8d6652591b356dd03f6c1c9bc1656e46b3fd..975227ea58108c35020c189a50a6acc0a95208ac 100755 --- a/indra/llmath/llvolume.h +++ b/indra/llmath/llvolume.h @@ -37,7 +37,6 @@ class LLPath; template <class T> class LLOctreeNode; -class LLVector4a; class LLVolumeFace; class LLVolume; class LLVolumeTriangle; @@ -50,12 +49,15 @@ class LLVolumeTriangle; #include "v3math.h" #include "v3dmath.h" #include "v4math.h" +#include "llvector4a.h" +#include "llmatrix4a.h" #include "llquaternion.h" #include "llstrider.h" #include "v4coloru.h" #include "llrefcount.h" #include "llpointer.h" #include "llfile.h" +#include "llalignedarray.h" //============================================================================ @@ -708,16 +710,16 @@ public: LLFaceID mFaceID; }; - std::vector<LLVector3> mProfile; - std::vector<LLVector2> mNormals; + LLAlignedArray<LLVector4a, 64> mProfile; + //LLAlignedArray<LLVector4a, 64> mNormals; std::vector<Face> mFaces; - std::vector<LLVector3> mEdgeNormals; - std::vector<LLVector3> mEdgeCenters; + + //LLAlignedArray<LLVector4a, 64> mEdgeNormals; + //LLAlignedArray<LLVector4a, 64> mEdgeCenters; friend std::ostream& operator<<(std::ostream &s, const LLProfile &profile); protected: - void genNormals(const LLProfileParams& params); static S32 getNumNGonPoints(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); void genNGon(const LLProfileParams& params, S32 sides, F32 offset=0.0f, F32 bevel = 0.0f, F32 ang_scale = 1.f, S32 split = 0); @@ -741,13 +743,29 @@ protected: class LLPath { public: - struct PathPt + class PathPt { - LLVector3 mPos; - LLVector2 mScale; - LLQuaternion mRot; + public: + LLMatrix4a mRot; + LLVector4a mPos; + + LLVector4a mScale; F32 mTexT; - PathPt() { mPos.setVec(0,0,0); mTexT = 0; mScale.setVec(0,0); mRot.loadIdentity(); } + F32 pad[3]; //for alignment + PathPt() + { + mPos.clear(); + mTexT = 0; + mScale.clear(); + mRot.setRows(LLVector4a(1,0,0,0), + LLVector4a(0,1,0,0), + LLVector4a(0,0,1,0)); + + //distinguished data in the pad for debugging + pad[0] = 3.14159f; + pad[1] = -3.14159f; + pad[2] = 0.585f; + } }; public: @@ -779,7 +797,7 @@ public: friend std::ostream& operator<<(std::ostream &s, const LLPath &path); public: - std::vector<PathPt> mPath; + LLAlignedArray<PathPt, 64> mPath; protected: BOOL mOpen; @@ -912,6 +930,7 @@ public: LLVector2 mTexCoordExtents[2]; //minimum and maximum of texture coordinates of the face. S32 mNumVertices; + S32 mNumAllocatedVertices; S32 mNumIndices; LLVector4a* mPositions; @@ -933,6 +952,9 @@ public: LLOctreeNode<LLVolumeTriangle>* mOctree; + //whether or not face has been cache optimized + BOOL mOptimized; + private: BOOL createUnCutCubeCap(LLVolume* volume, BOOL partial_build = FALSE); BOOL createCap(LLVolume* volume, BOOL partial_build = FALSE); @@ -947,11 +969,7 @@ protected: ~LLVolume(); // use unref public: - struct Point - { - LLVector3 mPos; - }; - + struct FaceParams { LLFaceID mFaceID; @@ -974,8 +992,8 @@ public: const LLProfile& getProfile() const { return *mProfilep; } LLPath& getPath() const { return *mPathp; } void resizePath(S32 length); - const std::vector<Point>& getMesh() const { return mMesh; } - const LLVector3& getMeshPt(const U32 i) const { return mMesh[i].mPos; } + const LLAlignedArray<LLVector4a,64>& getMesh() const { return mMesh; } + const LLVector4a& getMeshPt(const U32 i) const { return mMesh[i]; } void setDirty() { mPathp->setDirty(); mProfilep->setDirty(); } @@ -990,10 +1008,7 @@ public: S32 getSculptLevel() const { return mSculptLevel; } void setSculptLevel(S32 level) { mSculptLevel = level; } - S32 *getTriangleIndices(U32 &num_indices) const; - - // returns number of triangle indeces required for path/profile mesh - S32 getNumTriangleIndices() const; + static void getLoDTriangleCounts(const LLVolumeParams& params, S32* counts); S32 getNumTriangles(S32* vcount = NULL) const; @@ -1059,7 +1074,8 @@ public: LLVolumeParams mParams; LLPath *mPathp; LLProfile *mProfilep; - std::vector<Point> mMesh; + LLAlignedArray<LLVector4a,64> mMesh; + BOOL mGenerateSingleFace; typedef std::vector<LLVolumeFace> face_list_t; diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h index b047f86e6ef0c9fbcefaa3a7dfd3b4aec33ef402..8c8c3158087429239b1ad50501da01344f1122b8 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/llcurl.cpp b/indra/llmessage/llcurl.cpp index f2a3e059ef64e9d7c214b9d6cbf2674c35f9e420..081f070866c09aa8a671ce2bd819f308192f8311 100755 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -92,6 +92,7 @@ S32 LLCurl::sTotalHandles = 0 ; bool LLCurl::sNotQuitting = true; F32 LLCurl::sCurlRequestTimeOut = 120.f; //seonds S32 LLCurl::sMaxHandles = 256; //max number of handles, (multi handles and easy handles combined). +CURL* LLCurl::sCurlTemplateStandardHandle = NULL; void check_curl_code(CURLcode code) { @@ -1815,10 +1816,10 @@ CURL* LLCurl::newEasyHandle() } sTotalHandles++; - CURL* ret = curl_easy_init() ; + CURL* ret = createStandardCurlHandle(); if(!ret) { - llwarns << "curl_easy_init failed." << llendl ; + llwarns << "failed to create curl handle." << llendl ; } return ret ; @@ -1848,3 +1849,47 @@ void LLCurlFF::check_multi_code(CURLMcode code) { check_curl_multi_code(code); } + + +// Static +CURL* LLCurl::createStandardCurlHandle() +{ + if (sCurlTemplateStandardHandle == NULL) + { // Late creation of the template curl handle + sCurlTemplateStandardHandle = curl_easy_init(); + if (sCurlTemplateStandardHandle == NULL) + { + llwarns << "curl error calling curl_easy_init()" << llendl; + } + else + { + CURLcode result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_NOSIGNAL, 1); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_NOPROGRESS, 1); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_ENCODING, ""); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_AUTOREFERER, 1); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_FOLLOWLOCATION, 1); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_SSL_VERIFYPEER, 1); + check_curl_code(result); + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_SSL_VERIFYHOST, 0); + check_curl_code(result); + + // The Linksys WRT54G V5 router has an issue with frequent + // DNS lookups from LAN machines. If they happen too often, + // like for every HTTP request, the router gets annoyed after + // about 700 or so requests and starts issuing TCP RSTs to + // new connections. Reuse the DNS lookups for even a few + // seconds and no RSTs. + result = curl_easy_setopt(sCurlTemplateStandardHandle, CURLOPT_DNS_CACHE_TIMEOUT, 15); + check_curl_code(result); + } + } + + return curl_easy_duphandle(sCurlTemplateStandardHandle); +} diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index 7bcf61e233d6ff8967cc3b46c618cdf9d60a5cf6..90b3f2815d605b2b86a6fe0b1dbaa0f61a78984b 100755 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -45,7 +45,7 @@ #include "llqueuedthread.h" #include "llframetimer.h" #include "llpointer.h" - +#include "llsingleton.h" class LLMutex; class LLCurlThread; @@ -188,6 +188,8 @@ public: static CURL* newEasyHandle() ; static void deleteEasyHandle(CURL* handle) ; + static CURL* createStandardCurlHandle(); + private: static std::string sCAPath; static std::string sCAFile; @@ -197,6 +199,7 @@ private: static LLMutex* sHandleMutexp ; static S32 sTotalHandles ; static S32 sMaxHandles; + static CURL* sCurlTemplateStandardHandle; public: static bool sNotQuitting; static F32 sCurlRequestTimeOut; diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index 6110b035dce4d2286f879e63cf0879d565a340a5..11648717adbd9f77d59e9d7c0e13b62beab1799c 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 a7236ba16994200052aa4d1a5736ba12ff478be6..5de257a4f69b70b2405822ae23f3a5ce5a091a52 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/llinstantmessage.h b/indra/llmessage/llinstantmessage.h index db4a38ea9e968668632ae8f81ee188fec70388c4..f7118f8ccf33765918c69fe562ff20ea3447bbf2 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/llpartdata.cpp b/indra/llmessage/llpartdata.cpp index 26cafa025f41aa160f5dd4e890307a20f26ab895..41a0310ce05c804cae840e4aeb7adcd557929d1d 100755 --- a/indra/llmessage/llpartdata.cpp +++ b/indra/llmessage/llpartdata.cpp @@ -37,53 +37,46 @@ -const S32 PS_PART_DATA_BLOCK_SIZE = 4 + 2 + 4 + 4 + 2 + 2; // 18 -const S32 PS_DATA_BLOCK_SIZE = 68 + PS_PART_DATA_BLOCK_SIZE; // 68 + 18 = 86 +const S32 PS_PART_DATA_GLOW_SIZE = 2; +const S32 PS_PART_DATA_BLEND_SIZE = 2; +const S32 PS_LEGACY_PART_DATA_BLOCK_SIZE = 4 + 2 + 4 + 4 + 2 + 2; //18 +const S32 PS_SYS_DATA_BLOCK_SIZE = 68; +const S32 PS_MAX_DATA_BLOCK_SIZE = PS_SYS_DATA_BLOCK_SIZE+ + PS_LEGACY_PART_DATA_BLOCK_SIZE + + PS_PART_DATA_BLEND_SIZE + + PS_PART_DATA_GLOW_SIZE+ + 8; //two S32 size fields + +const S32 PS_LEGACY_DATA_BLOCK_SIZE = PS_SYS_DATA_BLOCK_SIZE + PS_LEGACY_PART_DATA_BLOCK_SIZE; + + +const U32 PART_DATA_MASK = LLPartData::LL_PART_DATA_GLOW | LLPartData::LL_PART_DATA_BLEND; + const F32 MAX_PART_SCALE = 4.f; -BOOL LLPartData::pack(LLDataPacker &dp) +bool LLPartData::hasGlow() const { - LLColor4U coloru; - dp.packU32(mFlags, "pdflags"); - dp.packFixed(mMaxAge, "pdmaxage", FALSE, 8, 8); - coloru.setVec(mStartColor); - dp.packColor4U(coloru, "pdstartcolor"); - coloru.setVec(mEndColor); - dp.packColor4U(coloru, "pdendcolor"); - dp.packFixed(mStartScale.mV[0], "pdstartscalex", FALSE, 3, 5); - dp.packFixed(mStartScale.mV[1], "pdstartscaley", FALSE, 3, 5); - dp.packFixed(mEndScale.mV[0], "pdendscalex", FALSE, 3, 5); - dp.packFixed(mEndScale.mV[1], "pdendscaley", FALSE, 3, 5); - return TRUE; + return mStartGlow > 0.f || mEndGlow > 0.f; } -LLSD LLPartData::asLLSD() const +bool LLPartData::hasBlendFunc() const { - LLSD sd = LLSD(); - sd["pdflags"] = ll_sd_from_U32(mFlags); - sd["pdmaxage"] = mMaxAge; - sd["pdstartcolor"] = ll_sd_from_color4(mStartColor); - sd["pdendcolor"] = ll_sd_from_color4(mEndColor); - sd["pdstartscale"] = ll_sd_from_vector2(mStartScale); - sd["pdendscale"] = ll_sd_from_vector2(mEndScale); - return sd; + return mBlendFuncSource != LLPartData::LL_PART_BF_SOURCE_ALPHA || mBlendFuncDest != LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_ALPHA; } -bool LLPartData::fromLLSD(LLSD& sd) +S32 LLPartData::getSize() const { - mFlags = ll_U32_from_sd(sd["pdflags"]); - mMaxAge = (F32)sd["pdmaxage"].asReal(); - mStartColor = ll_color4_from_sd(sd["pdstartcolor"]); - mEndColor = ll_color4_from_sd(sd["pdendcolor"]); - mStartScale = ll_vector2_from_sd(sd["pdstartscale"]); - mEndScale = ll_vector2_from_sd(sd["pdendscale"]); - return true; + S32 size = PS_LEGACY_PART_DATA_BLOCK_SIZE; + if (hasGlow()) size += PS_PART_DATA_GLOW_SIZE; + if (hasBlendFunc()) size += PS_PART_DATA_BLEND_SIZE; + + return size; } -BOOL LLPartData::unpack(LLDataPacker &dp) +BOOL LLPartData::unpackLegacy(LLDataPacker &dp) { LLColor4U coloru; @@ -98,9 +91,70 @@ BOOL LLPartData::unpack(LLDataPacker &dp) dp.unpackFixed(mStartScale.mV[1], "pdstartscaley", FALSE, 3, 5); dp.unpackFixed(mEndScale.mV[0], "pdendscalex", FALSE, 3, 5); dp.unpackFixed(mEndScale.mV[1], "pdendscaley", FALSE, 3, 5); + + mStartGlow = 0.f; + mEndGlow = 0.f; + mBlendFuncSource = LLPartData::LL_PART_BF_SOURCE_ALPHA; + mBlendFuncDest = LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_ALPHA; + return TRUE; } +BOOL LLPartData::unpack(LLDataPacker &dp) +{ + S32 size = 0; + dp.unpackS32(size, "partsize"); + + unpackLegacy(dp); + size -= PS_LEGACY_PART_DATA_BLOCK_SIZE; + + if (mFlags & LL_PART_DATA_GLOW) + { + if (size < PS_PART_DATA_GLOW_SIZE) return FALSE; + + U8 tmp_glow = 0; + dp.unpackU8(tmp_glow,"pdstartglow"); + mStartGlow = tmp_glow / 255.f; + dp.unpackU8(tmp_glow,"pdendglow"); + mEndGlow = tmp_glow / 255.f; + + size -= PS_PART_DATA_GLOW_SIZE; + } + else + { + mStartGlow = 0.f; + mEndGlow = 0.f; + } + + if (mFlags & LL_PART_DATA_BLEND) + { + if (size < PS_PART_DATA_BLEND_SIZE) return FALSE; + dp.unpackU8(mBlendFuncSource,"pdblendsource"); + dp.unpackU8(mBlendFuncDest,"pdblenddest"); + size -= PS_PART_DATA_BLEND_SIZE; + } + else + { + mBlendFuncSource = LLPartData::LL_PART_BF_SOURCE_ALPHA; + mBlendFuncDest = LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_ALPHA; + } + + if (size > 0) + { //leftover bytes, unrecognized parameters + U8 feh = 0; + while (size > 0) + { //read remaining bytes in block + dp.unpackU8(feh, "whippang"); + size--; + } + + //this particle system won't display properly, better to not show anything + return FALSE; + } + + + return TRUE; +} void LLPartData::setFlags(const U32 flags) { @@ -148,6 +202,18 @@ void LLPartData::setEndAlpha(const F32 alpha) mEndColor.mV[3] = alpha; } +// static +bool LLPartData::validBlendFunc(S32 func) +{ + if (func >= 0 + && func < LL_PART_BF_COUNT + && func != UNSUPPORTED_DEST_ALPHA + && func != UNSUPPORTED_ONE_MINUS_DEST_ALPHA) + { + return true; + } + return false; +} LLPartSysData::LLPartSysData() { @@ -160,6 +226,10 @@ LLPartSysData::LLPartSysData() mPartData.mStartScale = LLVector2(1.f, 1.f); mPartData.mEndScale = LLVector2(1.f, 1.f); mPartData.mMaxAge = 10.0; + mPartData.mBlendFuncSource = LLPartData::LL_PART_BF_SOURCE_ALPHA; + mPartData.mBlendFuncDest = LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_ALPHA; + mPartData.mStartGlow = 0.f; + mPartData.mEndGlow = 0.f; mMaxAge = 0.0; mStartAge = 0.0; @@ -175,38 +245,7 @@ LLPartSysData::LLPartSysData() mNumParticles = 0; } - -BOOL LLPartSysData::pack(LLDataPacker &dp) -{ - dp.packU32(mCRC, "pscrc"); - dp.packU32(mFlags, "psflags"); - dp.packU8(mPattern, "pspattern"); - dp.packFixed(mMaxAge, "psmaxage", FALSE, 8, 8); - dp.packFixed(mStartAge, "psstartage", FALSE, 8, 8); - dp.packFixed(mInnerAngle, "psinnerangle", FALSE, 3, 5); - dp.packFixed(mOuterAngle, "psouterangle", FALSE, 3, 5); - dp.packFixed(mBurstRate, "psburstrate", FALSE, 8, 8); - dp.packFixed(mBurstRadius, "psburstradius", FALSE, 8, 8); - dp.packFixed(mBurstSpeedMin, "psburstspeedmin", FALSE, 8, 8); - dp.packFixed(mBurstSpeedMax, "psburstspeedmax", FALSE, 8, 8); - dp.packU8(mBurstPartCount, "psburstpartcount"); - - dp.packFixed(mAngularVelocity.mV[0], "psangvelx", TRUE, 8, 7); - dp.packFixed(mAngularVelocity.mV[1], "psangvely", TRUE, 8, 7); - dp.packFixed(mAngularVelocity.mV[2], "psangvelz", TRUE, 8, 7); - - dp.packFixed(mPartAccel.mV[0], "psaccelx", TRUE, 8, 7); - dp.packFixed(mPartAccel.mV[1], "psaccely", TRUE, 8, 7); - dp.packFixed(mPartAccel.mV[2], "psaccelz", TRUE, 8, 7); - - dp.packUUID(mPartImageID, "psuuid"); - dp.packUUID(mTargetUUID, "pstargetuuid"); - mPartData.pack(dp); - return TRUE; -} - - -BOOL LLPartSysData::unpack(LLDataPacker &dp) +BOOL LLPartSysData::unpackSystem(LLDataPacker &dp) { dp.unpackU32(mCRC, "pscrc"); dp.unpackU32(mFlags, "psflags"); @@ -232,10 +271,48 @@ BOOL LLPartSysData::unpack(LLDataPacker &dp) dp.unpackUUID(mPartImageID, "psuuid"); dp.unpackUUID(mTargetUUID, "pstargetuuid"); - mPartData.unpack(dp); return TRUE; } +BOOL LLPartSysData::unpackLegacy(LLDataPacker &dp) +{ + unpackSystem(dp); + mPartData.unpackLegacy(dp); + + return TRUE; +} + +BOOL LLPartSysData::unpack(LLDataPacker &dp) +{ + // syssize is currently unused. Adding now when modifying the 'version to make extensible in the future + S32 size = 0; + dp.unpackS32(size, "syssize"); + + if (size != PS_SYS_DATA_BLOCK_SIZE) + { //unexpected size, this viewer doesn't know how to parse this particle system + + //skip to LLPartData block + U8 feh = 0; + + for (U32 i = 0; i < size; ++i) + { + dp.unpackU8(feh, "whippang"); + } + + dp.unpackS32(size, "partsize"); + //skip LLPartData block + for (U32 i = 0; i < size; ++i) + { + dp.unpackU8(feh, "whippang"); + } + return FALSE; + } + + unpackSystem(dp); + + return mPartData.unpack(dp); +} + std::ostream& operator<<(std::ostream& s, const LLPartSysData &data) { s << "Flags: " << std::hex << data.mFlags; @@ -253,7 +330,7 @@ std::ostream& operator<<(std::ostream& s, const LLPartSysData &data) BOOL LLPartSysData::isNullPS(const S32 block_num) { - U8 ps_data_block[PS_DATA_BLOCK_SIZE]; + U8 ps_data_block[PS_MAX_DATA_BLOCK_SIZE]; U32 crc; S32 size; @@ -264,14 +341,28 @@ BOOL LLPartSysData::isNullPS(const S32 block_num) { return TRUE; } - else if (size != PS_DATA_BLOCK_SIZE) + + if (size > PS_MAX_DATA_BLOCK_SIZE) { - llwarns << "PSBlock is wrong size for particle system data - got " << size << ", expecting " << PS_DATA_BLOCK_SIZE << llendl; + //size is too big, newer particle version unsupported return TRUE; } - gMessageSystem->getBinaryData("ObjectData", "PSBlock", ps_data_block, PS_DATA_BLOCK_SIZE, block_num, PS_DATA_BLOCK_SIZE); - LLDataPackerBinaryBuffer dp(ps_data_block, PS_DATA_BLOCK_SIZE); + gMessageSystem->getBinaryData("ObjectData", "PSBlock", ps_data_block, size, block_num, PS_MAX_DATA_BLOCK_SIZE); + + LLDataPackerBinaryBuffer dp(ps_data_block, size); + if (size > PS_LEGACY_DATA_BLOCK_SIZE) + { + // non legacy systems pack a size before the CRC + S32 tmp = 0; + dp.unpackS32(tmp, "syssize"); + + if (tmp > PS_SYS_DATA_BLOCK_SIZE) + { //unknown system data block size, don't know how to parse it, treat as NULL + return TRUE; + } + } + dp.unpackU32(crc, "crc"); if (crc == 0) @@ -281,50 +372,37 @@ BOOL LLPartSysData::isNullPS(const S32 block_num) return FALSE; } - -//static -BOOL LLPartSysData::packNull() -{ - U8 ps_data_block[PS_DATA_BLOCK_SIZE]; - gMessageSystem->addBinaryData("PSBlock", ps_data_block, 0); - return TRUE; -} - - -BOOL LLPartSysData::packBlock() -{ - U8 ps_data_block[PS_DATA_BLOCK_SIZE]; - - LLDataPackerBinaryBuffer dp(ps_data_block, PS_DATA_BLOCK_SIZE); - pack(dp); - - // Add to message - gMessageSystem->addBinaryData("PSBlock", ps_data_block, PS_DATA_BLOCK_SIZE); - - return TRUE; -} - - BOOL LLPartSysData::unpackBlock(const S32 block_num) { - U8 ps_data_block[PS_DATA_BLOCK_SIZE]; + U8 ps_data_block[PS_MAX_DATA_BLOCK_SIZE]; // Check size of block S32 size = gMessageSystem->getSize("ObjectData", block_num, "PSBlock"); - if (size != PS_DATA_BLOCK_SIZE) + if (size > PS_MAX_DATA_BLOCK_SIZE) { - llwarns << "PSBlock is wrong size for particle system data - got " << size << ", expecting " << PS_DATA_BLOCK_SIZE << llendl; + // Larger packets are newer and unsupported return FALSE; } // Get from message - gMessageSystem->getBinaryData("ObjectData", "PSBlock", ps_data_block, PS_DATA_BLOCK_SIZE, block_num, PS_DATA_BLOCK_SIZE); + gMessageSystem->getBinaryData("ObjectData", "PSBlock", ps_data_block, size, block_num, PS_MAX_DATA_BLOCK_SIZE); - LLDataPackerBinaryBuffer dp(ps_data_block, PS_DATA_BLOCK_SIZE); - unpack(dp); + LLDataPackerBinaryBuffer dp(ps_data_block, size); - return TRUE; + if (size == PS_LEGACY_DATA_BLOCK_SIZE) + { + return unpackLegacy(dp); + } + else + { + return unpack(dp); + } +} + +bool LLPartSysData::isLegacyCompatible() const +{ + return !mPartData.hasGlow() && !mPartData.hasBlendFunc(); } void LLPartSysData::clampSourceParticleRate() diff --git a/indra/llmessage/llpartdata.h b/indra/llmessage/llpartdata.h index a4ef058b3053485da7ae5c93e28450e0a00605fe..ed5c1a6ac7f9dbb7ddbe53364581278c4f4907f8 100755 --- a/indra/llmessage/llpartdata.h +++ b/indra/llmessage/llpartdata.h @@ -70,7 +70,12 @@ enum LLPSScriptFlags LLPS_SRC_TARGET_UUID, LLPS_SRC_OMEGA, LLPS_SRC_ANGLE_BEGIN, - LLPS_SRC_ANGLE_END + LLPS_SRC_ANGLE_END, + + LLPS_PART_BLEND_FUNC_SOURCE, + LLPS_PART_BLEND_FUNC_DEST, + LLPS_PART_START_GLOW, + LLPS_PART_END_GLOW }; @@ -83,11 +88,13 @@ public: mParameter(0.f) { } + BOOL unpackLegacy(LLDataPacker &dp); BOOL unpack(LLDataPacker &dp); + BOOL pack(LLDataPacker &dp); - LLSD asLLSD() const; - operator LLSD() const {return asLLSD(); } - bool fromLLSD(LLSD& sd); + + bool hasGlow() const; + bool hasBlendFunc() const; // Masks for the different particle flags enum @@ -102,17 +109,39 @@ public: LL_PART_TARGET_LINEAR_MASK = 0x80, // Particle uses a direct linear interpolation LL_PART_EMISSIVE_MASK = 0x100, // Particle is "emissive", instead of being lit LL_PART_BEAM_MASK = 0x200, // Particle is a "beam" connecting source and target + LL_PART_RIBBON_MASK = 0x400, // Particles are joined together into one continuous triangle strip // Not implemented yet! //LL_PART_RANDOM_ACCEL_MASK = 0x100, // Particles have random acceleration //LL_PART_RANDOM_VEL_MASK = 0x200, // Particles have random velocity shifts" //LL_PART_TRAIL_MASK = 0x400, // Particles have historical "trails" + //sYSTEM SET FLAGS + LL_PART_DATA_GLOW = 0x10000, + LL_PART_DATA_BLEND = 0x20000, + // Viewer side use only! LL_PART_HUD = 0x40000000, LL_PART_DEAD_MASK = 0x80000000, }; + enum + { + LL_PART_BF_ONE = 0, + LL_PART_BF_ZERO = 1, + LL_PART_BF_DEST_COLOR = 2, + LL_PART_BF_SOURCE_COLOR = 3, + LL_PART_BF_ONE_MINUS_DEST_COLOR = 4, + LL_PART_BF_ONE_MINUS_SOURCE_COLOR = 5, + UNSUPPORTED_DEST_ALPHA = 6, + LL_PART_BF_SOURCE_ALPHA = 7, + UNSUPPORTED_ONE_MINUS_DEST_ALPHA = 8, + LL_PART_BF_ONE_MINUS_SOURCE_ALPHA = 9, + LL_PART_BF_COUNT = 10 + }; + + static bool validBlendFunc(S32 func); + void setFlags(const U32 flags); void setMaxAge(const F32 max_age); void setStartScale(const F32 xs, F32 ys); @@ -126,6 +155,9 @@ public: friend class LLPartSysData; friend class LLViewerPartSourceScript; +private: + S32 getSize() const; + // These are public because I'm really lazy... public: U32 mFlags; // Particle state/interpolators in effect @@ -137,6 +169,12 @@ public: LLVector3 mPosOffset; // Offset from source if using FOLLOW_SOURCE F32 mParameter; // A single floating point parameter + + F32 mStartGlow; + F32 mEndGlow; + + U8 mBlendFuncSource; + U8 mBlendFuncDest; }; @@ -146,15 +184,13 @@ public: LLPartSysData(); BOOL unpack(LLDataPacker &dp); - BOOL pack(LLDataPacker &dp); - - + BOOL unpackLegacy(LLDataPacker &dp); BOOL unpackBlock(const S32 block_num); - BOOL packBlock(); - - static BOOL packNull(); + static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system) + bool isLegacyCompatible() const; + // Different masks for effects on the source enum { @@ -187,7 +223,12 @@ public: void clampSourceParticleRate(); friend std::ostream& operator<<(std::ostream& s, const LLPartSysData &data); // Stream a + + S32 getdataBlockSize() const; +private: + BOOL unpackSystem(LLDataPacker &dp); + public: // Public because I'm lazy.... diff --git a/indra/llmessage/lltransfermanager.cpp b/indra/llmessage/lltransfermanager.cpp index 034680caf8c042babdcb8c4f11a796c6b6fb70ac..38b743fb75ba81ef47b87dc56536b14f1848ec49 100755 --- a/indra/llmessage/lltransfermanager.cpp +++ b/indra/llmessage/lltransfermanager.cpp @@ -606,16 +606,21 @@ void LLTransferManager::processTransferAbort(LLMessageSystem *msgp, void **) void LLTransferManager::reliablePacketCallback(void **user_data, S32 result) { LLUUID *transfer_idp = (LLUUID *)user_data; - if (result) + if (result && + transfer_idp != NULL) { - llwarns << "Aborting reliable transfer " << *transfer_idp << " due to failed reliable resends!" << llendl; LLTransferSource *tsp = gTransferManager.findTransferSource(*transfer_idp); if (tsp) { + llwarns << "Aborting reliable transfer " << *transfer_idp << " due to failed reliable resends!" << llendl; LLTransferSourceChannel *tscp = tsp->mChannelp; tsp->abortTransfer(); tscp->deleteTransfer(tsp); } + else + { + llwarns << "Aborting reliable transfer " << *transfer_idp << " but can't find the LLTransferSource object" << llendl; + } } delete transfer_idp; } @@ -892,22 +897,26 @@ LLTransferSource *LLTransferSourceChannel::findTransferSource(const LLUUID &tran } -BOOL LLTransferSourceChannel::deleteTransfer(LLTransferSource *tsp) +void LLTransferSourceChannel::deleteTransfer(LLTransferSource *tsp) { - - LLPriQueueMap<LLTransferSource *>::pqm_iter iter; - for (iter = mTransferSources.mMap.begin(); iter != mTransferSources.mMap.end(); iter++) + if (tsp) { - if (iter->second == tsp) + LLPriQueueMap<LLTransferSource *>::pqm_iter iter; + for (iter = mTransferSources.mMap.begin(); iter != mTransferSources.mMap.end(); iter++) { - delete tsp; - mTransferSources.mMap.erase(iter); - return TRUE; + if (iter->second == tsp) + { + delete tsp; + mTransferSources.mMap.erase(iter); + return; + } } - } - llerrs << "Unable to find transfer source to delete!" << llendl; - return FALSE; + llwarns << "Unable to find transfer source id " + << tsp->getID() + << " to delete!" + << llendl; + } } @@ -1008,21 +1017,26 @@ LLTransferTarget *LLTransferTargetChannel::findTransferTarget(const LLUUID &tran } -BOOL LLTransferTargetChannel::deleteTransfer(LLTransferTarget *ttp) +void LLTransferTargetChannel::deleteTransfer(LLTransferTarget *ttp) { - tt_iter iter; - for (iter = mTransferTargets.begin(); iter != mTransferTargets.end(); iter++) + if (ttp) { - if (*iter == ttp) + tt_iter iter; + for (iter = mTransferTargets.begin(); iter != mTransferTargets.end(); iter++) { - delete ttp; - mTransferTargets.erase(iter); - return TRUE; + if (*iter == ttp) + { + delete ttp; + mTransferTargets.erase(iter); + return; + } } - } - llerrs << "Unable to find transfer target to delete!" << llendl; - return FALSE; + llwarns << "Unable to find transfer target id " + << ttp->getID() + << " to delete!" + << llendl; + } } diff --git a/indra/llmessage/lltransfermanager.h b/indra/llmessage/lltransfermanager.h index 252e05d1d1dd88b86be92823d5b68852340f9f18..6aad153c24c893c2578359f65749623c9a76181a 100755 --- a/indra/llmessage/lltransfermanager.h +++ b/indra/llmessage/lltransfermanager.h @@ -199,7 +199,7 @@ public: void addTransferSource(LLTransferSource *sourcep); LLTransferSource *findTransferSource(const LLUUID &transfer_id); - BOOL deleteTransfer(LLTransferSource *tsp); + void deleteTransfer(LLTransferSource *tsp); void setThrottleID(const S32 throttle_id) { mThrottleID = throttle_id; } @@ -232,7 +232,7 @@ public: const F32 priority); LLTransferTarget *findTransferTarget(const LLUUID &transfer_id); - BOOL deleteTransfer(LLTransferTarget *ttp); + void deleteTransfer(LLTransferTarget *ttp); LLTransferChannelType getChannelType() const { return mChannelType; } diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp index de9e2fe29472ee0e8d12d2114fca6e7928e27ca3..683065357d5791ffdb3e2b7d81b5103291d33143 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 44d358d906f44485af8a193cdc2b092e305c429e..20d6e30d1771fad5c36c34d415340e9a7b3dd5ae 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/tests/llpartdata_test.cpp b/indra/llmessage/tests/llpartdata_test.cpp index 9123bd06c7117f866f97fea5ad3d6e09b210094e..de81e0bbb2095a875223a5281287157d0fa8633c 100755 --- a/indra/llmessage/tests/llpartdata_test.cpp +++ b/indra/llmessage/tests/llpartdata_test.cpp @@ -38,10 +38,34 @@ namespace tut { + + //bunch of sniffed data that *should* be a valid particle system + static U8 msg[] = { + 0x44, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x80, 0x00, 0x80, + 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x5e, 0x12, 0x0b, 0xa1, 0x58, 0x05, 0xdc, 0x57, 0x66, + 0xb7, 0xf5, 0xac, 0x4b, 0xd1, 0x8f, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x05, 0x02, 0x00, 0x00, 0x0a, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x7e, 0xc6, 0x81, 0xdc, 0x7e, 0xc6, 0x81, 0xdc, 0x77, 0xcf, 0xef, 0xd4, 0xce, 0x64, 0x1a, 0x7e, + 0x26, 0x87, 0x55, 0x7f, 0xdd, 0x65, 0x22, 0x7f, 0xdd, 0x65, 0x22, 0x7f, 0x77, 0xcf, 0x98, 0xa3, 0xab, + 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xf2, + 0xf1, 0x65, 0x32, 0x1b, 0xef, 0x18, 0x70, 0x66, 0xba, 0x30, 0xa0, 0x11, 0xaa, 0x2f, 0xb0, 0xab, 0xd0, + 0x30, 0x7d, 0xbd, 0x01, 0x00, 0xf8, 0x0d, 0xb8, 0x30, 0x01, 0x00, 0x00, 0x00, 0xce, 0xc6, 0x81, 0xdc, + 0xce, 0xc6, 0x81, 0xdc, 0xc7, 0xcf, 0xef, 0xd4, 0x75, 0x65, 0x1a, 0x7f, 0x62, 0x6f, 0x55, 0x7f, 0x6d, + 0x65, 0x22, 0x7f, 0x6d, 0x65, 0x22, 0x7f, 0xc7, 0xcf, 0x98, 0xa3, 0xab, 0xab, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6, 0xf2, 0xf1, 0x62, 0x12, 0x1b, 0xef, + 0x18, 0x7e, 0xbd, 0x01, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7c, 0xac, 0x28, 0x03, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, + 0xe0, 0xb9, 0x30, 0x03, 0xe1, 0xb9, 0x30, 0xbb, 0x00, 0x00, 0x00, 0x48, 0xe0, 0xb9, 0x30, 0x36, 0xd9, + 0x81, 0xdc, 0x36, 0xd9, 0x81, 0xdc, 0x3f, 0xd0, 0xef, 0xd4, 0xa5, 0x7a, 0x72, 0x7f, 0x26, 0x30, 0x55, + 0x7f, 0x95, 0x7a, 0x22, 0x7f, 0x95, 0x7a, 0x22, 0x7f, 0x3f, 0xd0, 0x98, 0xa3, 0xab, 0xab, 0xab, 0xab, + 0xab, 0xab, 0xab, 0xab, 0x00, 0x00, 0x00, 0x00, 0x00 }; struct partdata_test { }; + typedef test_group<partdata_test> partdata_test_t; typedef partdata_test_t::object partdata_test_object_t; tut::partdata_test_t tut_partdata_test("LLPartData"); @@ -49,168 +73,82 @@ namespace tut template<> template<> void partdata_test_object_t::test<1>() { - LLPartData llpdata,llpdata1; - U8 pkbuf[128]; - - llpdata.setFlags(LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK | - LLPartData::LL_PART_BOUNCE_MASK | LLPartData::LL_PART_WIND_MASK | LLPartData::LL_PART_FOLLOW_SRC_MASK | - LLPartData::LL_PART_FOLLOW_VELOCITY_MASK | LLPartData::LL_PART_TARGET_POS_MASK | LLPartData::LL_PART_TARGET_LINEAR_MASK | - LLPartData::LL_PART_EMISSIVE_MASK | LLPartData::LL_PART_BEAM_MASK | LLPartData::LL_PART_DEAD_MASK); - - llpdata.setMaxAge(29.3f); - - LLVector3 llvec1(1.0f, .5f, .25f); - llpdata.setStartColor(llvec1); - llpdata.setStartAlpha(.7f); - - LLVector3 llvec2(.2f, .3f, 1.0f); - llpdata.setEndColor(llvec2); - llpdata.setEndAlpha(1.0f); + LLPartSysData llpsysdata; + LLDataPackerBinaryBuffer dp1(msg, sizeof(msg)); - llpdata.setStartScale(3.23f, 4.0f); - llpdata.setEndScale(2.4678f, 1.0f); + ensure("LLPartSysData::unpack failed.", llpsysdata.unpack(dp1)); - LLDataPackerBinaryBuffer dp((U8*)pkbuf, 128); - llpdata.pack(dp); - S32 cur_size = dp.getCurrentSize(); - - LLDataPackerBinaryBuffer dp1((U8*)pkbuf, cur_size); - llpdata1.unpack(dp1); - - ensure("1.mFlags values are different after unpacking", llpdata1.mFlags == llpdata.mFlags); - ensure_approximately_equals("2.mMaxAge values are different after unpacking", llpdata1.mMaxAge, llpdata.mMaxAge, 8); - - ensure_approximately_equals("3.mStartColor[0] values are different after unpacking", llpdata1.mStartColor.mV[0], llpdata.mStartColor.mV[0], 8); - ensure_approximately_equals("4.mStartColor[1] values are different after unpacking", llpdata1.mStartColor.mV[1], llpdata.mStartColor.mV[1], 8); - ensure_approximately_equals("5.mStartColor[2] values are different after unpacking", llpdata1.mStartColor.mV[2], llpdata.mStartColor.mV[2], 8); - ensure_approximately_equals("6.mStartColor[3] values are different after unpacking", llpdata1.mStartColor.mV[3], llpdata.mStartColor.mV[3], 8); - - ensure_approximately_equals("7.mEndColor[0] values are different after unpacking", llpdata1.mEndColor.mV[0], llpdata.mEndColor.mV[0], 8); - ensure_approximately_equals("8.mEndColor[1] values are different after unpacking", llpdata1.mEndColor.mV[1], llpdata.mEndColor.mV[1], 8); - ensure_approximately_equals("9.mEndColor[2] values are different after unpacking", llpdata1.mEndColor.mV[2], llpdata.mEndColor.mV[2], 8); - ensure_approximately_equals("10.mEndColor[2] values are different after unpacking", llpdata1.mEndColor.mV[3], llpdata.mEndColor.mV[3], 8); - - ensure_approximately_equals("11.mStartScale[0] values are different after unpacking", llpdata1.mStartScale.mV[0], llpdata.mStartScale.mV[0], 5); - ensure_approximately_equals("12.mStartScale[1] values are different after unpacking", llpdata1.mStartScale.mV[1], llpdata.mStartScale.mV[1], 5); - - ensure_approximately_equals("13.mEndScale[0] values are different after unpacking", llpdata1.mEndScale.mV[0], llpdata.mEndScale.mV[0], 5); - ensure_approximately_equals("14.mEndScale[1] values are different after unpacking", llpdata1.mEndScale.mV[1], llpdata.mEndScale.mV[1], 5); - } - - - template<> template<> - void partdata_test_object_t::test<2>() - { - LLPartData llpdata,llpdata1; - - llpdata.setFlags(LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK | - LLPartData::LL_PART_BOUNCE_MASK | LLPartData::LL_PART_WIND_MASK | LLPartData::LL_PART_FOLLOW_SRC_MASK | - LLPartData::LL_PART_FOLLOW_VELOCITY_MASK | LLPartData::LL_PART_TARGET_POS_MASK | LLPartData::LL_PART_TARGET_LINEAR_MASK | - LLPartData::LL_PART_EMISSIVE_MASK | LLPartData::LL_PART_BEAM_MASK | LLPartData::LL_PART_DEAD_MASK); - - llpdata.setMaxAge(29.3f); - - LLVector3 llvec1(1.0f, .5f, .25f); - llpdata.setStartColor(llvec1); - llpdata.setStartAlpha(.7f); - - LLVector3 llvec2(.2f, .3f, 1.0f); - llpdata.setEndColor(llvec2); - llpdata.setEndAlpha(1.0f); - - llpdata.setStartScale(3.23f, 4.0f); - llpdata.setEndScale(2.4678f, 1.0f); - - LLSD llsd = llpdata.asLLSD(); - - llpdata1.fromLLSD(llsd); - - ensure("1.mFlags values are different after unpacking", llpdata1.mFlags == llpdata.mFlags); - ensure_approximately_equals("2.mMaxAge values are different after unpacking", llpdata1.mMaxAge, llpdata.mMaxAge, 8); - - ensure_approximately_equals("3.mStartColor[0] values are different after unpacking", llpdata1.mStartColor.mV[0], llpdata.mStartColor.mV[0], 8); - ensure_approximately_equals("4.mStartColor[1] values are different after unpacking", llpdata1.mStartColor.mV[1], llpdata.mStartColor.mV[1], 8); - ensure_approximately_equals("5.mStartColor[2] values are different after unpacking", llpdata1.mStartColor.mV[2], llpdata.mStartColor.mV[2], 8); - ensure_approximately_equals("6.mStartColor[3] values are different after unpacking", llpdata1.mStartColor.mV[3], llpdata.mStartColor.mV[3], 8); - - ensure_approximately_equals("7.mEndColor[0] values are different after unpacking", llpdata1.mEndColor.mV[0], llpdata.mEndColor.mV[0], 8); - ensure_approximately_equals("8.mEndColor[1] values are different after unpacking", llpdata1.mEndColor.mV[1], llpdata.mEndColor.mV[1], 8); - ensure_approximately_equals("9.mEndColor[2] values are different after unpacking", llpdata1.mEndColor.mV[2], llpdata.mEndColor.mV[2], 8); - ensure_approximately_equals("10.mEndColor[2] values are different after unpacking", llpdata1.mEndColor.mV[3], llpdata.mEndColor.mV[3], 8); - - ensure_approximately_equals("11.mStartScale[0] values are different after unpacking", llpdata1.mStartScale.mV[0], llpdata.mStartScale.mV[0], 5); - ensure_approximately_equals("12.mStartScale[1] values are different after unpacking", llpdata1.mStartScale.mV[1], llpdata.mStartScale.mV[1], 5); - - ensure_approximately_equals("13.mEndScale[0] values are different after unpacking", llpdata1.mEndScale.mV[0], llpdata.mEndScale.mV[0], 5); - ensure_approximately_equals("14.mEndScale[1] values are different after unpacking", llpdata1.mEndScale.mV[1], llpdata.mEndScale.mV[1], 5); - } - - -//*********llpartsysdata*********** - - template<> template<> - void partdata_test_object_t::test<3>() - { - LLPartSysData llpsysdata, llpsysdata1; - U8 pkbuf[256]; - llpsysdata.setBurstSpeedMin(33.33f); - ensure("1.mBurstSpeedMin coudnt be set", 33.33f == llpsysdata.mBurstSpeedMin); - - llpsysdata.setBurstSpeedMax(44.44f); - ensure("2.mBurstSpeedMax coudnt be set", 44.44f == llpsysdata.mBurstSpeedMax); - - llpsysdata.setBurstRadius(45.55f); - ensure("3.mBurstRadius coudnt be set", 45.55f == llpsysdata.mBurstRadius); - - LLVector3 llvec(44.44f, 111.11f, -40.4f); - llpsysdata.setPartAccel(llvec); - - llpsysdata.mCRC = 0xFFFFFFFF; - llpsysdata.mFlags = 0x20; - - llpsysdata.mPattern = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY; - - llpsysdata.mMaxAge = 99.99f; - llpsysdata.mStartAge = 18.5f; - llpsysdata.mInnerAngle = 4.234f; - llpsysdata.mOuterAngle = 7.123f; - llpsysdata.mBurstRate = 245.53f; - llpsysdata.mBurstPartCount = 0xFF; - llpsysdata.mAngularVelocity = llvec; - - llpsysdata.mPartImageID.generate(); - llpsysdata.mTargetUUID.generate(); + //mCRC 1 unsigned int + ensure("mCRC different after unpacking", llpsysdata.mCRC == (U32) 1); + //mFlags 0 unsigned int + ensure ("mFlags different after unpacking", llpsysdata.mFlags == (U32) 0); + //mPattern 1 '' unsigned char + ensure ("mPattern different after unpacking", llpsysdata.mPattern == (U8) 1); + //mInnerAngle 0.00000000 float + ensure_approximately_equals("mInnerAngle different after unpacking", llpsysdata.mInnerAngle, 0.f, 8); + //mOuterAngle 0.00000000 float + ensure_approximately_equals("mOuterAngle different after unpacking", llpsysdata.mOuterAngle, 0.f, 8); + //mAngularVelocity 0,0,0 + ensure_approximately_equals("mAngularVelocity.mV[0] different after unpacking", llpsysdata.mAngularVelocity.mV[0], 0.f, 8); + ensure_approximately_equals("mAngularVelocity.mV[0] different after unpacking", llpsysdata.mAngularVelocity.mV[1], 0.f, 8); + ensure_approximately_equals("mAngularVelocity.mV[0] different after unpacking", llpsysdata.mAngularVelocity.mV[2], 0.f, 8); + //mBurstRate 0.097656250 float + ensure_approximately_equals("mBurstRate different after unpacking", llpsysdata.mBurstRate, 0.097656250f, 8); + //mBurstPartCount 1 '' unsigned char + ensure("mBurstPartCount different after unpacking", llpsysdata.mBurstPartCount == (U8) 1); + //mBurstRadius 0.00000000 float + ensure_approximately_equals("mBurstRadius different after unpacking", llpsysdata.mBurstRadius, 0.f, 8); + //mBurstSpeedMin 1.0000000 float + ensure_approximately_equals("mBurstSpeedMin different after unpacking", llpsysdata.mBurstSpeedMin, 1.f, 8); + //mBurstSpeedMax 1.0000000 float + ensure_approximately_equals("mBurstSpeedMax different after unpacking", llpsysdata.mBurstSpeedMax, 1.f, 8); + //mMaxAge 0.00000000 float + ensure_approximately_equals("mMaxAge different after unpacking", llpsysdata.mMaxAge, 0.f, 8); + //mStartAge 0.00000000 float + ensure_approximately_equals("mStartAge different after unpacking", llpsysdata.mStartAge, 0.f, 8); + //mPartAccel <0,0,0> + ensure_approximately_equals("mPartAccel.mV[0] different after unpacking", llpsysdata.mPartAccel.mV[0], 0.f, 7); + ensure_approximately_equals("mPartAccel.mV[1] different after unpacking", llpsysdata.mPartAccel.mV[1], 0.f, 7); + ensure_approximately_equals("mPartAccel.mV[2] different after unpacking", llpsysdata.mPartAccel.mV[2], 0.f, 7); + + //mPartData + LLPartData& data = llpsysdata.mPartData; + + //mFlags 132354 unsigned int + ensure ("mPartData.mFlags different after unpacking", data.mFlags == (U32) 132354); + //mMaxAge 10.000000 float + ensure_approximately_equals("mPartData.mMaxAge different after unpacking", data.mMaxAge, 10.f, 8); + //mStartColor <1,1,1,1> + ensure_approximately_equals("mPartData.mStartColor.mV[0] different after unpacking", data.mStartColor.mV[0], 1.f, 8); + ensure_approximately_equals("mPartData.mStartColor.mV[1] different after unpacking", data.mStartColor.mV[1], 1.f, 8); + ensure_approximately_equals("mPartData.mStartColor.mV[2] different after unpacking", data.mStartColor.mV[2], 1.f, 8); + ensure_approximately_equals("mPartData.mStartColor.mV[3] different after unpacking", data.mStartColor.mV[3], 1.f, 8); + //mEndColor <1,1,0,0> + ensure_approximately_equals("mPartData.mEndColor.mV[0] different after unpacking", data.mEndColor.mV[0], 1.f, 8); + ensure_approximately_equals("mPartData.mEndColor.mV[1] different after unpacking", data.mEndColor.mV[1], 1.f, 8); + ensure_approximately_equals("mPartData.mEndColor.mV[2] different after unpacking", data.mEndColor.mV[2], 0.f, 8); + ensure_approximately_equals("mPartData.mEndColor.mV[3] different after unpacking", data.mEndColor.mV[3], 0.f, 8); + //mStartScale <1,1> + ensure_approximately_equals("mPartData.mStartScale.mV[0] different after unpacking", data.mStartScale.mV[0], 1.f, 8); + ensure_approximately_equals("mPartData.mStartScale.mV[1] different after unpacking", data.mStartScale.mV[1], 1.f, 8); + //mEndScale <0,0> + ensure_approximately_equals("mPartData.mEndScale.mV[0] different after unpacking", data.mEndScale.mV[0], 0.f, 8); + ensure_approximately_equals("mPartData.mEndScale.mV[1] different after unpacking", data.mEndScale.mV[1], 0.f, 8); + //mPosOffset <0,0,0> + ensure_approximately_equals("mPartData.mPosOffset.mV[0] different after unpacking", data.mPosOffset.mV[0], 0.f, 8); + ensure_approximately_equals("mPartData.mPosOffset.mV[1] different after unpacking", data.mPosOffset.mV[1], 0.f, 8); + ensure_approximately_equals("mPartData.mPosOffset.mV[2] different after unpacking", data.mPosOffset.mV[2], 0.f, 8); + //mParameter 0.00000000 float + ensure_approximately_equals("mPartData.mParameter different after unpacking", data.mParameter, 0.f, 8); - LLDataPackerBinaryBuffer dp((U8*)pkbuf, 256); - llpsysdata.pack(dp); - S32 cur_size = dp.getCurrentSize(); - LLDataPackerBinaryBuffer dp1((U8*)pkbuf, cur_size); - llpsysdata1.unpack(dp1); - - ensure("1.mCRC's not equal", llpsysdata.mCRC == llpsysdata1.mCRC); - ensure("2.mFlags's not equal", llpsysdata.mFlags == llpsysdata1.mFlags); - ensure("3.mPattern's not equal", llpsysdata.mPattern == llpsysdata1.mPattern); - ensure_approximately_equals("4.mMaxAge's not equal", llpsysdata.mMaxAge , llpsysdata1.mMaxAge, 8); - ensure_approximately_equals("5.mStartAge's not equal", llpsysdata.mStartAge, llpsysdata1.mStartAge, 8); - ensure_approximately_equals("6.mOuterAngle's not equal", llpsysdata.mOuterAngle, llpsysdata1.mOuterAngle, 5); - ensure_approximately_equals("7.mInnerAngles's not equal", llpsysdata.mInnerAngle, llpsysdata1.mInnerAngle, 5); - ensure_approximately_equals("8.mBurstRate's not equal", llpsysdata.mBurstRate, llpsysdata1.mBurstRate, 8); - ensure("9.mBurstPartCount's not equal", llpsysdata.mBurstPartCount == llpsysdata1.mBurstPartCount); - - ensure_approximately_equals("10.mBurstSpeedMin's not equal", llpsysdata.mBurstSpeedMin, llpsysdata1.mBurstSpeedMin, 8); - ensure_approximately_equals("11.mBurstSpeedMax's not equal", llpsysdata.mBurstSpeedMax, llpsysdata1.mBurstSpeedMax, 8); - - ensure_approximately_equals("12.mAngularVelocity's not equal", llpsysdata.mAngularVelocity.mV[0], llpsysdata1.mAngularVelocity.mV[0], 7); - ensure_approximately_equals("13.mAngularVelocity's not equal", llpsysdata.mAngularVelocity.mV[1], llpsysdata1.mAngularVelocity.mV[1], 7); - ensure_approximately_equals("14.mAngularVelocity's not equal", llpsysdata.mAngularVelocity.mV[2], llpsysdata1.mAngularVelocity.mV[2], 7); - - ensure_approximately_equals("15.mPartAccel's not equal", llpsysdata.mPartAccel.mV[0], llpsysdata1.mPartAccel.mV[0], 7); - ensure_approximately_equals("16.mPartAccel's not equal", llpsysdata.mPartAccel.mV[1], llpsysdata1.mPartAccel.mV[1], 7); - ensure_approximately_equals("17.mPartAccel's not equal", llpsysdata.mPartAccel.mV[2], llpsysdata1.mPartAccel.mV[2], 7); - - ensure("18.mPartImageID's not equal", llpsysdata.mPartImageID == llpsysdata1.mPartImageID); - ensure("19.mTargetUUID's not equal", llpsysdata.mTargetUUID == llpsysdata1.mTargetUUID); - ensure_approximately_equals("20.mBurstRadius's not equal", llpsysdata.mBurstRadius, llpsysdata1.mBurstRadius, 8); + //mStartGlow 0.00000000 float + ensure_approximately_equals("mPartData.mStartGlow different after unpacking", data.mStartGlow, 0.f, 8); + //mEndGlow 0.00000000 float + ensure_approximately_equals("mPartData.mEndGlow different after unpacking", data.mEndGlow, 0.f, 8); + //mBlendFuncSource 2 '' unsigned char + ensure("mPartData.mBlendFuncSource different after unpacking", data.mBlendFuncSource == (U8) 2); + //mBlendFuncDest 1 '' unsigned char + ensure("mPartData.mBlendFuncDest different after unpacking", data.mBlendFuncDest == (U8) 1); } } diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp index 82017ab3fae3d09008130442253c12ff2083715b..9f4d65e7231a33f678dfcbfbdab86a3ce732cfbb 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 91289d38a539f242b47596fb64fbbe2c3edbcc30..a2fdeab64754a45a68f07570a66ebd0070cd03e2 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/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index 03412d95d528d5ef79e8ba88505c562c7c5940ae..6e7fefeb21b7cfce68391904f75c5180cfcff0ac 100755 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -50,10 +50,17 @@ add_executable(SLPlugin ${SLPlugin_SOURCE_FILES} ) +if (WINDOWS) +set_target_properties(SLPlugin + PROPERTIES + LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMTD\"" + ) +else () set_target_properties(SLPlugin PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist ) +endif () target_link_libraries(SLPlugin ${LLPLUGIN_LIBRARIES} diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 5ed05e220113a526a0a8ec9dbf56eb456489284c..34e0483a835d7f751a88edd63fceddf7d7741893 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -166,6 +166,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa if ( !get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source) || !pos_source ) { + llwarns << "Could not find dom sources for basic geo data; invalid model." << llendl; return LLModel::BAD_ELEMENT; } @@ -186,27 +187,78 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa LLVolumeFace::VertexMapData::PointMap point_map; - for (U32 i = 0; i < idx.getCount(); i += idx_stride) + U32 index_count = idx.getCount(); + U32 vertex_count = pos_source ? v.getCount() : 0; + U32 tc_count = tc_source ? tc.getCount() : 0; + U32 norm_count = norm_source ? n.getCount() : 0; + + for (U32 i = 0; i < index_count; i += idx_stride) { LLVolumeFace::VertexData cv; if (pos_source) { + // guard against model data specifiying out of range indices or verts + // + if (((i + pos_offset) > index_count) + || ((idx[i+pos_offset]*3+2) > vertex_count)) + { + llwarns << "Out of range index data; invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.setPosition(LLVector4a(v[idx[i+pos_offset]*3+0], v[idx[i+pos_offset]*3+1], v[idx[i+pos_offset]*3+2])); + + if (!cv.getPosition().isFinite3()) + { + llwarns << "Nan positional data, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } if (tc_source) { + // guard against model data specifiying out of range indices or tcs + // + + if (((i + tc_offset) > index_count) + || ((idx[i+tc_offset]*2+1) > tc_count)) + { + llwarns << "Out of range TC indices." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.mTexCoord.setVec(tc[idx[i+tc_offset]*2+0], tc[idx[i+tc_offset]*2+1]); + + if (!cv.mTexCoord.isFinite()) + { + llwarns << "Found NaN while loading tex coords from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } if (norm_source) { + // guard against model data specifiying out of range indices or norms + // + if (((i + norm_offset) > index_count) + || ((idx[i+norm_offset]*3+2) > norm_count)) + { + llwarns << "Found out of range norm indices, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.setNormal(LLVector4a(n[idx[i+norm_offset]*3+0], n[idx[i+norm_offset]*3+1], n[idx[i+norm_offset]*3+2])); + + if (!cv.getNormal().isFinite3()) + { + llwarns << "Found NaN while loading normals from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } BOOL found = FALSE; @@ -261,13 +313,13 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa LLVolumeFace& new_face = *face_list.rbegin(); if (!norm_source) { - ll_aligned_free_16(new_face.mNormals); + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!tc_source) { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } @@ -292,13 +344,13 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa LLVolumeFace& new_face = *face_list.rbegin(); if (!norm_source) { - ll_aligned_free_16(new_face.mNormals); + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!tc_source) { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } } @@ -333,6 +385,7 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac if (!get_dom_sources(inputs, pos_offset, tc_offset, norm_offset, idx_stride, pos_source, tc_source, norm_source)) { + llwarns << "Could not get DOM sources for basic geo data, invalid model." << llendl; return LLModel::BAD_ELEMENT; } @@ -364,6 +417,11 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac LLVolumeFace::VertexMapData::PointMap point_map; + U32 index_count = idx.getCount(); + U32 vertex_count = pos_source ? v.getCount() : 0; + U32 tc_count = tc_source ? tc.getCount() : 0; + U32 norm_count = norm_source ? n.getCount() : 0; + U32 cur_idx = 0; for (U32 i = 0; i < vcount.getCount(); ++i) { //for each polygon @@ -376,22 +434,68 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac if (pos_source) { + // guard against model data specifiying out of range indices or verts + // + if (((cur_idx + pos_offset) > index_count) + || ((idx[cur_idx+pos_offset]*3+2) > vertex_count)) + { + llwarns << "Out of range position indices, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.getPosition().set(v[idx[cur_idx+pos_offset]*3+0], v[idx[cur_idx+pos_offset]*3+1], v[idx[cur_idx+pos_offset]*3+2]); + + if (!cv.getPosition().isFinite3()) + { + llwarns << "Found NaN while loading positions from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + } if (tc_source) { + // guard against model data specifiying out of range indices or tcs + // + if (((cur_idx + tc_offset) > index_count) + || ((idx[cur_idx+tc_offset]*2+1) > tc_count)) + { + llwarns << "Out of range TC indices, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.mTexCoord.setVec(tc[idx[cur_idx+tc_offset]*2+0], tc[idx[cur_idx+tc_offset]*2+1]); + + if (!cv.mTexCoord.isFinite()) + { + llwarns << "Found NaN while loading tex coords from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } if (norm_source) { + // guard against model data specifiying out of range indices or norms + // + if (((cur_idx + norm_offset) > index_count) + || ((idx[cur_idx+norm_offset]*3+2) > norm_count)) + { + llwarns << "Out of range norm indices, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } + cv.getNormal().set(n[idx[cur_idx+norm_offset]*3+0], n[idx[cur_idx+norm_offset]*3+1], n[idx[cur_idx+norm_offset]*3+2]); + + if (!cv.getNormal().isFinite3()) + { + llwarns << "Found NaN while loading normals from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } cur_idx += idx_stride; @@ -480,13 +584,13 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac LLVolumeFace& new_face = *face_list.rbegin(); if (!norm_source) { - ll_aligned_free_16(new_face.mNormals); + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!tc_source) { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } @@ -514,13 +618,13 @@ LLModel::EModelStatus load_face_from_dom_polylist(std::vector<LLVolumeFace>& fac LLVolumeFace& new_face = *face_list.rbegin(); if (!norm_source) { - ll_aligned_free_16(new_face.mNormals); + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!tc_source) { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } } @@ -558,6 +662,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac domVertices* vertices = (domVertices*) elem.cast(); if (!vertices) { + llwarns << "Could not find vertex source, invalid model." << llendl; return LLModel::BAD_ELEMENT; } domInputLocal_Array& v_inp = vertices->getInput_array(); @@ -571,6 +676,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac domSource* src = (domSource*) elem.cast(); if (!src) { + llwarns << "Could not find DOM source, invalid model." << llendl; return LLModel::BAD_ELEMENT; } v = &(src->getFloat_array()->getValue()); @@ -586,6 +692,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac domSource* src = (domSource*) elem.cast(); if (!src) { + llwarns << "Could not find DOM source, invalid model." << llendl; return LLModel::BAD_ELEMENT; } n = &(src->getFloat_array()->getValue()); @@ -598,6 +705,7 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac domSource* src = (domSource*) elem.cast(); if (!src) { + llwarns << "Could not find DOM source, invalid model." << llendl; return LLModel::BAD_ELEMENT; } t = &(src->getFloat_array()->getValue()); @@ -632,6 +740,12 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac vert.getPosition().set(v->get(v_idx), v->get(v_idx+1), v->get(v_idx+2)); + + if (!vert.getPosition().isFinite3()) + { + llwarns << "Found NaN while loading position data from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } //bounds check n and t lookups because some FBX to DAE converters @@ -644,6 +758,12 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac vert.getNormal().set(n->get(n_idx), n->get(n_idx+1), n->get(n_idx+2)); + + if (!vert.getNormal().isFinite3()) + { + llwarns << "Found NaN while loading normals from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } else { @@ -657,6 +777,12 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac t_idx = llclamp(t_idx, (U32) 0, (U32) t->getCount()); vert.mTexCoord.setVec(t->get(t_idx), t->get(t_idx+1)); + + if (!vert.mTexCoord.isFinite()) + { + llwarns << "Found NaN while loading tex coords from DAE-Model, invalid model." << llendl; + return LLModel::BAD_ELEMENT; + } } else { @@ -730,13 +856,13 @@ LLModel::EModelStatus load_face_from_dom_polygons(std::vector<LLVolumeFace>& fac LLVolumeFace& new_face = *face_list.rbegin(); if (!n) { - ll_aligned_free_16(new_face.mNormals); + //ll_aligned_free_16(new_face.mNormals); new_face.mNormals = NULL; } if (!t) { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } } @@ -1010,6 +1136,43 @@ void LLModel::getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& tra translation_out = mNormalizedTranslation; } +LLVector3 LLModel::getTransformedCenter(const LLMatrix4& mat) +{ + LLVector3 ret; + + if (!mVolumeFaces.empty()) + { + LLMatrix4a m; + m.loadu(mat); + + LLVector4a minv,maxv; + + LLVector4a t; + m.affineTransform(mVolumeFaces[0].mPositions[0], t); + minv = maxv = t; + + for (S32 i = 0; i < mVolumeFaces.size(); ++i) + { + LLVolumeFace& face = mVolumeFaces[i]; + + for (U32 j = 0; j < face.mNumVertices; ++j) + { + m.affineTransform(face.mPositions[j],t); + update_min_max(minv, maxv, t); + } + } + + minv.add(maxv); + minv.mul(0.5f); + + ret.set(minv.getF32ptr()); + } + + return ret; +} + + + void LLModel::setNumVolumeFaces(S32 count) { mVolumeFaces.resize(count); @@ -1036,7 +1199,7 @@ void LLModel::setVolumeFaceData( } else { - ll_aligned_free_16(face.mNormals); + //ll_aligned_free_16(face.mNormals); face.mNormals = NULL; } @@ -1047,7 +1210,7 @@ void LLModel::setVolumeFaceData( } else { - ll_aligned_free_16(face.mTexCoords); + //ll_aligned_free_16(face.mTexCoords); face.mTexCoords = NULL; } @@ -1246,7 +1409,7 @@ void LLModel::generateNormals(F32 angle_cutoff) } else { - ll_aligned_free_16(new_face.mTexCoords); + //ll_aligned_free_16(new_face.mTexCoords); new_face.mTexCoords = NULL; } diff --git a/indra/llprimitive/llmodel.h b/indra/llprimitive/llmodel.h index 1cf528fd9f3a723b8bf5b8035a8471b5a5f25872..aaafc55258d51fac20b3016b7dea88c9d470fcb7 100755 --- a/indra/llprimitive/llmodel.h +++ b/indra/llprimitive/llmodel.h @@ -173,13 +173,15 @@ public: void optimizeVolumeFaces(); void offsetMesh( const LLVector3& pivotPoint ); void getNormalizedScaleTranslation(LLVector3& scale_out, LLVector3& translation_out); - + LLVector3 getTransformedCenter(const LLMatrix4& mat); + //reorder face list based on mMaterialList in this and reference so //order matches that of reference (material ordering touchup) bool matchMaterialOrder(LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); bool isMaterialListSubset( LLModel* ref ); bool needToAddFaces( LLModel* ref, int& refFaceCnt, int& modelFaceCnt ); + std::vector<std::string> mMaterialList; //data used for skin weights diff --git a/indra/llrender/llcubemap.cpp b/indra/llrender/llcubemap.cpp index 362452d837fac8e6815c14fe4e93752ca8f9e62d..45a3b18179a8aff6b2646aaf02e5aea96bf05add 100755 --- a/indra/llrender/llcubemap.cpp +++ b/indra/llrender/llcubemap.cpp @@ -81,7 +81,7 @@ void LLCubeMap::initGL() { U32 texname = 0; - LLImageGL::generateTextures(LLTexUnit::TT_CUBE_MAP, GL_RGB8, 1, &texname); + LLImageGL::generateTextures(1, &texname); for (int i = 0; i < 6; i++) { diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index a157cd94c4535d82407b442deff61498cb68267a..acfb3c085afce5d70c2d44558966ea0949c8ecc3 100755 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -59,6 +59,7 @@ BOOL gDebugGL = FALSE; BOOL gClothRipple = FALSE; BOOL gHeadlessClient = FALSE; BOOL gGLActive = FALSE; +BOOL gGLDebugLoggingEnabled = TRUE; static const std::string HEADLESS_VENDOR_STRING("Linden Lab"); static const std::string HEADLESS_RENDERER_STRING("Headless"); @@ -80,6 +81,8 @@ void APIENTRY gl_debug_callback(GLenum source, const GLchar* message, GLvoid* userParam) { + if (gGLDebugLoggingEnabled) + { if (severity == GL_DEBUG_SEVERITY_HIGH_ARB) { llwarns << "----- GL ERROR --------" << llendl; @@ -98,6 +101,7 @@ void APIENTRY gl_debug_callback(GLenum source, llerrs << "Halting on GL Error" << llendl; } } +} #endif void parse_glsl_version(S32& major, S32& minor); @@ -258,6 +262,7 @@ PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback = NULL; PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings = NULL; PFNGLBINDBUFFERRANGEPROC glBindBufferRange = NULL; +PFNGLBINDBUFFERBASEPROC glBindBufferBase = NULL; //GL_ARB_debug_output PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB = NULL; @@ -1156,7 +1161,7 @@ void LLGLManager::initExtensions() glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange); glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange); glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize); - + #if (LL_WINDOWS || LL_LINUX || LL_SOLARIS) && !LL_MESA_HEADLESS LL_DEBUGS("RenderInit") << "GL Probe: Getting symbols" << LL_ENDL; if (mHasVertexBufferObject) @@ -1247,6 +1252,7 @@ void LLGLManager::initExtensions() glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC) GLH_EXT_GET_PROC_ADDRESS("glEndTransformFeedback"); glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC) GLH_EXT_GET_PROC_ADDRESS("glTransformFeedbackVaryings"); glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC) GLH_EXT_GET_PROC_ADDRESS("glBindBufferRange"); + glBindBufferBase = (PFNGLBINDBUFFERBASEPROC) GLH_EXT_GET_PROC_ADDRESS("glBindBufferBase"); } if (mHasDebugOutput) { @@ -1501,7 +1507,7 @@ void do_assert_glerror() void assert_glerror() { - if (!gGLActive) +/* if (!gGLActive) { //llwarns << "GL used while not active!" << llendl; @@ -1510,8 +1516,13 @@ void assert_glerror() //ll_fail("GL used while not active"); } } +*/ - if (gDebugGL) + if (!gDebugGL) + { + //funny looking if for branch prediction -- gDebugGL is almost always false and assert_glerror is called often + } + else { do_assert_glerror(); } diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 1bec6d376bedffc771b7486bca9e230ee48169b8..5a80a8faa46ac6ccde3ff97f6c61ba25c92b62ba 100755 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -543,6 +543,7 @@ extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange; +extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; #elif LL_WINDOWS @@ -787,6 +788,7 @@ extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback; extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback; extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings; extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange; +extern PFNGLBINDBUFFERBASEPROC glBindBufferBase; //GL_ARB_debug_output extern PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB; diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 40aff36dac3b4772b7f30f5c21ab246c96769482..35620bb6568963985a8546aad582b9af2a1bfe92 100755 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -355,8 +355,8 @@ void LLGLSLShader::unload() stop_glerror(); } -BOOL LLGLSLShader::createShader(vector<string> * attributes, - vector<string> * uniforms, +BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes, + std::vector<LLStaticHashedString> * uniforms, U32 varying_count, const char** varyings) { @@ -374,7 +374,7 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, // Create program mProgramObject = glCreateProgramObjectARB(); - + #if LL_DARWIN // work-around missing mix(vec3,vec3,bvec3) mDefines["OLD_SELECT"] = "1"; @@ -443,7 +443,8 @@ BOOL LLGLSLShader::createShader(vector<string> * attributes, for (S32 i = 0; i < channel_count; i++) { - uniform1i(llformat("tex%d", i), i); + LLStaticHashedString uniName(llformat("tex%d", i)); + uniform1i(uniName, i); } S32 cur_tex = channel_count; //adjust any texture channels that might have been overwritten @@ -500,7 +501,7 @@ void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count) } } -BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes) +BOOL LLGLSLShader::mapAttributes(const std::vector<LLStaticHashedString> * attributes) { //before linking, make sure reserved attributes always have consistent locations for (U32 i = 0; i < LLShaderMgr::instance()->mReservedAttribs.size(); i++) @@ -537,7 +538,7 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes) { for (U32 i = 0; i < numAttributes; i++) { - const char* name = (*attributes)[i].c_str(); + const char* name = (*attributes)[i].String().c_str(); S32 index = glGetAttribLocationARB(mProgramObject, name); if (index != -1) { @@ -553,7 +554,7 @@ BOOL LLGLSLShader::mapAttributes(const vector<string> * attributes) return FALSE; } -void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) +void LLGLSLShader::mapUniform(GLint index, const vector<LLStaticHashedString> * uniforms) { if (index == -1) { @@ -623,8 +624,10 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) is_array[0] = 0; } - mUniformMap[name] = location; + LLStaticHashedString hashedName(name); mUniformNameMap[location] = name; + mUniformMap[hashedName] = location; + LL_DEBUGS("ShaderLoading") << "Uniform " << name << " is at location " << location << LL_ENDL; //find the index of this uniform @@ -645,7 +648,7 @@ void LLGLSLShader::mapUniform(GLint index, const vector<string> * uniforms) for (U32 i = 0; i < uniforms->size(); i++) { if ( (mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] == -1) - && ((*uniforms)[i] == name)) + && ((*uniforms)[i].String() == name)) { //found it mUniform[i+LLShaderMgr::instance()->mReservedUniforms.size()] = location; @@ -679,7 +682,7 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type) return -1; } -BOOL LLGLSLShader::mapUniforms(const vector<string> * uniforms) +BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms) { BOOL res = TRUE; @@ -1141,18 +1144,18 @@ void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, c } } -GLint LLGLSLShader::getUniformLocation(const string& uniform) +GLint LLGLSLShader::getUniformLocation(const LLStaticHashedString& uniform) { GLint ret = -1; if (mProgramObject > 0) { - std::map<string, GLint>::iterator iter = mUniformMap.find(uniform); + LLStaticStringTable<GLint>::iterator iter = mUniformMap.find(uniform); if (iter != mUniformMap.end()) { if (gDebugGL) { stop_glerror(); - if (iter->second != glGetUniformLocationARB(mProgramObject, uniform.c_str())) + if (iter->second != glGetUniformLocationARB(mProgramObject, uniform.String().c_str())) { llerrs << "Uniform does not match." << llendl; } @@ -1189,7 +1192,7 @@ GLint LLGLSLShader::getAttribLocation(U32 attrib) } } -void LLGLSLShader::uniform1i(const string& uniform, GLint v) +void LLGLSLShader::uniform1i(const LLStaticHashedString& uniform, GLint v) { GLint location = getUniformLocation(uniform); @@ -1205,7 +1208,7 @@ void LLGLSLShader::uniform1i(const string& uniform, GLint v) } } -void LLGLSLShader::uniform2i(const string& uniform, GLint i, GLint j) +void LLGLSLShader::uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j) { GLint location = getUniformLocation(uniform); @@ -1222,7 +1225,7 @@ void LLGLSLShader::uniform2i(const string& uniform, GLint i, GLint j) } -void LLGLSLShader::uniform1f(const string& uniform, GLfloat v) +void LLGLSLShader::uniform1f(const LLStaticHashedString& uniform, GLfloat v) { GLint location = getUniformLocation(uniform); @@ -1238,7 +1241,7 @@ void LLGLSLShader::uniform1f(const string& uniform, GLfloat v) } } -void LLGLSLShader::uniform2f(const string& uniform, GLfloat x, GLfloat y) +void LLGLSLShader::uniform2f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y) { GLint location = getUniformLocation(uniform); @@ -1255,7 +1258,7 @@ void LLGLSLShader::uniform2f(const string& uniform, GLfloat x, GLfloat y) } -void LLGLSLShader::uniform3f(const string& uniform, GLfloat x, GLfloat y, GLfloat z) +void LLGLSLShader::uniform3f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y, GLfloat z) { GLint location = getUniformLocation(uniform); @@ -1271,23 +1274,7 @@ void LLGLSLShader::uniform3f(const string& uniform, GLfloat x, GLfloat y, GLfloa } } -void LLGLSLShader::uniform4f(const string& uniform, GLfloat x, GLfloat y, GLfloat z, GLfloat w) -{ - GLint location = getUniformLocation(uniform); - - if (location >= 0) - { - std::map<GLint, LLVector4>::iterator iter = mValue.find(location); - LLVector4 vec(x,y,z,w); - if (iter == mValue.end() || shouldChange(iter->second,vec)) - { - glUniform4fARB(location, x,y,z,w); - mValue[location] = vec; - } - } -} - -void LLGLSLShader::uniform1fv(const string& uniform, U32 count, const GLfloat* v) +void LLGLSLShader::uniform1fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v) { GLint location = getUniformLocation(uniform); @@ -1303,7 +1290,7 @@ void LLGLSLShader::uniform1fv(const string& uniform, U32 count, const GLfloat* v } } -void LLGLSLShader::uniform2fv(const string& uniform, U32 count, const GLfloat* v) +void LLGLSLShader::uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v) { GLint location = getUniformLocation(uniform); @@ -1319,7 +1306,7 @@ void LLGLSLShader::uniform2fv(const string& uniform, U32 count, const GLfloat* v } } -void LLGLSLShader::uniform3fv(const string& uniform, U32 count, const GLfloat* v) +void LLGLSLShader::uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v) { GLint location = getUniformLocation(uniform); @@ -1335,7 +1322,7 @@ void LLGLSLShader::uniform3fv(const string& uniform, U32 count, const GLfloat* v } } -void LLGLSLShader::uniform4fv(const string& uniform, U32 count, const GLfloat* v) +void LLGLSLShader::uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v) { GLint location = getUniformLocation(uniform); @@ -1353,27 +1340,7 @@ void LLGLSLShader::uniform4fv(const string& uniform, U32 count, const GLfloat* v } } -void LLGLSLShader::uniformMatrix2fv(const string& uniform, U32 count, GLboolean transpose, const GLfloat* v) -{ - GLint location = getUniformLocation(uniform); - - if (location >= 0) - { - glUniformMatrix2fvARB(location, count, transpose, v); - } -} - -void LLGLSLShader::uniformMatrix3fv(const string& uniform, U32 count, GLboolean transpose, const GLfloat* v) -{ - GLint location = getUniformLocation(uniform); - - if (location >= 0) - { - glUniformMatrix3fvARB(location, count, transpose, v); - } -} - -void LLGLSLShader::uniformMatrix4fv(const string& uniform, U32 count, GLboolean transpose, const GLfloat* v) +void LLGLSLShader::uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat* v) { GLint location = getUniformLocation(uniform); diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h index eabdb9fc927c8a24680303b55a5b0704566480b1..7b2f5f04c2f3390108d7023ca4674d7393d83289 100755 --- a/indra/llrender/llglslshader.h +++ b/indra/llrender/llglslshader.h @@ -29,6 +29,7 @@ #include "llgl.h" #include "llrender.h" +#include "llstaticstringtable.h" class LLShaderFeatures { @@ -90,16 +91,16 @@ public: void placeProfileQuery(); void readProfileQuery(U32 count, U32 mode); - BOOL createShader(std::vector<std::string> * attributes, - std::vector<std::string> * uniforms, + BOOL createShader(std::vector<LLStaticHashedString> * attributes, + std::vector<LLStaticHashedString> * uniforms, U32 varying_count = 0, const char** varyings = NULL); BOOL attachObject(std::string object); void attachObject(GLhandleARB object); void attachObjects(GLhandleARB* objects = NULL, S32 count = 0); - BOOL mapAttributes(const std::vector<std::string> * attributes); - BOOL mapUniforms(const std::vector<std::string> * uniforms); - void mapUniform(GLint index, const std::vector<std::string> * uniforms); + BOOL mapAttributes(const std::vector<LLStaticHashedString> * attributes); + BOOL mapUniforms(const std::vector<LLStaticHashedString> *); + void mapUniform(GLint index, const std::vector<LLStaticHashedString> *); void uniform1i(U32 index, GLint i); void uniform1f(U32 index, GLfloat v); void uniform2f(U32 index, GLfloat x, GLfloat y); @@ -110,30 +111,27 @@ public: void uniform2fv(U32 index, U32 count, const GLfloat* v); void uniform3fv(U32 index, U32 count, const GLfloat* v); void uniform4fv(U32 index, U32 count, const GLfloat* v); - void uniform1i(const std::string& uniform, GLint i); - void uniform2i(const std::string& uniform, GLint i, GLint j); - void uniform1f(const std::string& uniform, GLfloat v); - void uniform2f(const std::string& uniform, GLfloat x, GLfloat y); - void uniform3f(const std::string& uniform, GLfloat x, GLfloat y, GLfloat z); - void uniform4f(const std::string& uniform, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - void uniform1iv(const std::string& uniform, U32 count, const GLint* i); - void uniform1fv(const std::string& uniform, U32 count, const GLfloat* v); - void uniform2fv(const std::string& uniform, U32 count, const GLfloat* v); - void uniform3fv(const std::string& uniform, U32 count, const GLfloat* v); - void uniform4fv(const std::string& uniform, U32 count, const GLfloat* v); + void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j); void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v); - void uniformMatrix2fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v); - void uniformMatrix3fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v); - void uniformMatrix4fv(const std::string& uniform, U32 count, GLboolean transpose, const GLfloat *v); + void uniform1i(const LLStaticHashedString& uniform, GLint i); + void uniform1f(const LLStaticHashedString& uniform, GLfloat v); + void uniform2f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y); + void uniform3f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y, GLfloat z); + void uniform1fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v); + void uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v); + void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v); + void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v); + void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat *v); void setMinimumAlpha(F32 minimum); void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); void vertexAttrib4fv(U32 index, GLfloat* v); - GLint getUniformLocation(const std::string& uniform); + //GLint getUniformLocation(const std::string& uniform); + GLint getUniformLocation(const LLStaticHashedString& uniform); GLint getUniformLocation(U32 index); GLint getAttribLocation(U32 attrib); @@ -170,7 +168,7 @@ public: std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel U32 mAttributeMask; //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask()) std::vector<GLint> mUniform; //lookup table of uniform enum to uniform location - std::map<std::string, GLint> mUniformMap; //lookup map of uniform name to uniform location + LLStaticStringTable<GLint> mUniformMap; //lookup map of uniform name to uniform location std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value std::vector<GLint> mTexture; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 38764eba239e6b04ec8f304bba6ee05980a407e5..ab875141c57dc2469744344242ab797daecc2405 100755 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -54,8 +54,6 @@ S32 LLImageGL::sGlobalTextureMemoryInBytes = 0; S32 LLImageGL::sBoundTextureMemoryInBytes = 0; S32 LLImageGL::sCurBoundTextureMemory = 0; S32 LLImageGL::sCount = 0; -LLImageGL::dead_texturelist_t LLImageGL::sDeadTextureList[LLTexUnit::TT_NONE]; -U32 LLImageGL::sCurTexName = 1; BOOL LLImageGL::sGlobalUseAnisotropic = FALSE; F32 LLImageGL::sLastFrameTime = 0.f; @@ -715,9 +713,14 @@ void LLImageGL::setImage(const U8* data_in, BOOL data_hasmips) mMipLevels = wpo2(llmax(w, h)); - //use legacy mipmap generation mode - glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE); - + //use legacy mipmap generation mode (note: making this condional can cause rendering issues) + // -- but making it not conditional triggers deprecation warnings when core profile is enabled + // (some rendering issues while core profile is enabled are acceptable at this point in time) + if (!LLRender::sGLCoreProfile) + { + glTexParameteri(mTarget, GL_GENERATE_MIPMAP, GL_TRUE); + } + LLImageGL::setManualImage(mTarget, 0, mFormatInternal, w, h, mFormatPrimary, mFormatType, @@ -1084,85 +1087,19 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_ // static static LLFastTimer::DeclareTimer FTM_GENERATE_TEXTURES("generate textures"); -void LLImageGL::generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures) +void LLImageGL::generateTextures(S32 numTextures, U32 *textures) { LLFastTimer t(FTM_GENERATE_TEXTURES); - bool empty = true; - - dead_texturelist_t::iterator iter = sDeadTextureList[type].find(format); - - if (iter != sDeadTextureList[type].end()) - { - empty = iter->second.empty(); - } - - for (S32 i = 0; i < numTextures; ++i) - { - if (!empty) - { - textures[i] = iter->second.front(); - iter->second.pop_front(); - empty = iter->second.empty(); - } - else - { - textures[i] = sCurTexName++; - } - } + glGenTextures(numTextures, textures); } // static -void LLImageGL::deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate) +void LLImageGL::deleteTextures(S32 numTextures, U32 *textures) { if (gGLManager.mInited) { - switch (format) - { - case 0: - - // We get ARB errors in debug when attempting to use glTexImage2D with these deprecated pix formats - // - case GL_LUMINANCE8: - case GL_INTENSITY8: - case GL_ALPHA8: - glDeleteTextures(numTextures, textures); - break; - - default: - { - if (type == LLTexUnit::TT_CUBE_MAP || mip_levels == -1) - { //unknown internal format or unknown number of mip levels, not safe to reuse - glDeleteTextures(numTextures, textures); - } - else - { - for (S32 i = 0; i < numTextures; ++i) - { //remove texture from VRAM by setting its size to zero - - for (S32 j = 0; j <= mip_levels; j++) - { - gGL.getTexUnit(0)->bindManual(type, textures[i]); - U32 internal_type = LLTexUnit::getInternalType(type); - glTexImage2D(internal_type, j, format, 0, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - stop_glerror(); - } - - llassert(std::find(sDeadTextureList[type][format].begin(), - sDeadTextureList[type][format].end(), textures[i]) == - sDeadTextureList[type][format].end()); - - sDeadTextureList[type][format].push_back(textures[i]); - } - } + glDeleteTextures(numTextures, textures); } - break; - } - } - - /*if (immediate) - { - LLImageGL::deleteDeadTextures(); - }*/ } // static @@ -1290,11 +1227,11 @@ BOOL LLImageGL::createGLTexture() if(mTexName) { - LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, (reinterpret_cast<GLuint*>(&mTexName))) ; + LLImageGL::deleteTextures(1, (reinterpret_cast<GLuint*>(&mTexName))) ; } - LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName); + LLImageGL::generateTextures(1, &mTexName); stop_glerror(); if (!mTexName) { @@ -1409,7 +1346,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ } else { - LLImageGL::generateTextures(mBindTarget, mFormatInternal, 1, &mTexName); + LLImageGL::generateTextures(1, &mTexName); stop_glerror(); { llverify(gGL.getTexUnit(0)->bind(this)); @@ -1454,7 +1391,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_ { sGlobalTextureMemoryInBytes -= mTextureMemory; - LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &old_name); + LLImageGL::deleteTextures(1, &old_name); stop_glerror(); } @@ -1583,30 +1520,6 @@ void LLImageGL::deleteDeadTextures() { bool reset = false; - /*while (!sDeadTextureList.empty()) - { - GLuint tex = sDeadTextureList.front(); - sDeadTextureList.pop_front(); - for (int i = 0; i < gGLManager.mNumTextureImageUnits; i++) - { - LLTexUnit* tex_unit = gGL.getTexUnit(i); - - if (tex_unit && tex_unit->getCurrTexture() == tex) - { - tex_unit->unbind(tex_unit->getCurrType()); - stop_glerror(); - - if (i > 0) - { - reset = true; - } - } - } - - glDeleteTextures(1, &tex); - stop_glerror(); - }*/ - if (reset) { gGL.getTexUnit(0)->activate(); @@ -1623,7 +1536,7 @@ void LLImageGL::destroyGLTexture() mTextureMemory = 0; } - LLImageGL::deleteTextures(mBindTarget, mFormatInternal, mMipLevels, 1, &mTexName); + LLImageGL::deleteTextures(1, &mTexName); mCurrentDiscardLevel = -1 ; //invalidate mCurrentDiscardLevel. mTexName = 0; mGLTextureCreated = FALSE ; diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 57a052b25888ae370519dd4cf638cb8e6697f273..0c62dd0d3326f677a91343fda0f5d187ca6a9081 100755 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -45,16 +45,9 @@ class LLImageGL : public LLRefCount { friend class LLTexUnit; public: - static U32 sCurTexName; - - //previously used but now available texture names - // sDeadTextureList[<usage>][<internal format>] - typedef std::map<U32, std::list<U32> > dead_texturelist_t; - static dead_texturelist_t sDeadTextureList[LLTexUnit::TT_NONE]; - // These 2 functions replace glGenTextures() and glDeleteTextures() - static void generateTextures(LLTexUnit::eTextureType type, U32 format, S32 numTextures, U32 *textures); - static void deleteTextures(LLTexUnit::eTextureType type, U32 format, S32 mip_levels, S32 numTextures, U32 *textures, bool immediate = false); + static void generateTextures(S32 numTextures, U32 *textures); + static void deleteTextures(S32 numTextures, U32 *textures); static void deleteDeadTextures(); // Size calculation diff --git a/indra/llrender/llpostprocess.cpp b/indra/llrender/llpostprocess.cpp index c0045c80447bd22dd940d9ae39a149c558f8261e..4c36185b08abe7a23670407a444c7104ed65a05f 100755 --- a/indra/llrender/llpostprocess.cpp +++ b/indra/llrender/llpostprocess.cpp @@ -31,6 +31,21 @@ #include "llsdserialize.h" #include "llrender.h" +static LLStaticHashedString sRenderTexture("RenderTexture"); +static LLStaticHashedString sBrightness("brightness"); +static LLStaticHashedString sContrast("contrast"); +static LLStaticHashedString sContrastBase("contrastBase"); +static LLStaticHashedString sSaturation("saturation"); +static LLStaticHashedString sLumWeights("lumWeights"); +static LLStaticHashedString sNoiseTexture("NoiseTexture"); +static LLStaticHashedString sBrightMult("brightMult"); +static LLStaticHashedString sNoiseStrength("noiseStrength"); +static LLStaticHashedString sExtractLow("extractLow"); +static LLStaticHashedString sExtractHigh("extractHigh"); +static LLStaticHashedString sBloomStrength("bloomStrength"); +static LLStaticHashedString sTexelSize("texelSize"); +static LLStaticHashedString sBlurDirection("blurDirection"); +static LLStaticHashedString sBlurWidth("blurWidth"); LLPostProcess * gPostProcess = NULL; @@ -258,12 +273,12 @@ void LLPostProcess::applyColorFilterShader(void) void LLPostProcess::createColorFilterShader(void) { /// Define uniform names - colorFilterUniforms["RenderTexture"] = 0; - colorFilterUniforms["brightness"] = 0; - colorFilterUniforms["contrast"] = 0; - colorFilterUniforms["contrastBase"] = 0; - colorFilterUniforms["saturation"] = 0; - colorFilterUniforms["lumWeights"] = 0; + colorFilterUniforms[sRenderTexture] = 0; + colorFilterUniforms[sBrightness] = 0; + colorFilterUniforms[sContrast] = 0; + colorFilterUniforms[sContrastBase] = 0; + colorFilterUniforms[sSaturation] = 0; + colorFilterUniforms[sLumWeights] = 0; } void LLPostProcess::applyNightVisionShader(void) @@ -307,11 +322,11 @@ void LLPostProcess::applyNightVisionShader(void) void LLPostProcess::createNightVisionShader(void) { /// Define uniform names - nightVisionUniforms["RenderTexture"] = 0; - nightVisionUniforms["NoiseTexture"] = 0; - nightVisionUniforms["brightMult"] = 0; - nightVisionUniforms["noiseStrength"] = 0; - nightVisionUniforms["lumWeights"] = 0; + nightVisionUniforms[sRenderTexture] = 0; + nightVisionUniforms[sNoiseTexture] = 0; + nightVisionUniforms[sBrightMult] = 0; + nightVisionUniforms[sNoiseStrength] = 0; + nightVisionUniforms[sLumWeights] = 0; createNoiseTexture(mNoiseTexture); } @@ -326,25 +341,25 @@ void LLPostProcess::createBloomShader(void) createTexture(mTempBloomTexture, unsigned(screenW * 0.5), unsigned(screenH * 0.5)); /// Create Bloom Extract Shader - bloomExtractUniforms["RenderTexture"] = 0; - bloomExtractUniforms["extractLow"] = 0; - bloomExtractUniforms["extractHigh"] = 0; - bloomExtractUniforms["lumWeights"] = 0; + bloomExtractUniforms[sRenderTexture] = 0; + bloomExtractUniforms[sExtractLow] = 0; + bloomExtractUniforms[sExtractHigh] = 0; + bloomExtractUniforms[sLumWeights] = 0; /// Create Bloom Blur Shader - bloomBlurUniforms["RenderTexture"] = 0; - bloomBlurUniforms["bloomStrength"] = 0; - bloomBlurUniforms["texelSize"] = 0; - bloomBlurUniforms["blurDirection"] = 0; - bloomBlurUniforms["blurWidth"] = 0; + bloomBlurUniforms[sRenderTexture] = 0; + bloomBlurUniforms[sBloomStrength] = 0; + bloomBlurUniforms[sTexelSize] = 0; + bloomBlurUniforms[sBlurDirection] = 0; + bloomBlurUniforms[sBlurWidth] = 0; } void LLPostProcess::getShaderUniforms(glslUniforms & uniforms, GLhandleARB & prog) { /// Find uniform locations and insert into map - std::map<const char *, GLuint>::iterator i; + glslUniforms::iterator i; for (i = uniforms.begin(); i != uniforms.end(); ++i){ - i->second = glGetUniformLocationARB(prog, i->first); + i->second = glGetUniformLocationARB(prog, i->first.String().c_str()); } } diff --git a/indra/llrender/llpostprocess.h b/indra/llrender/llpostprocess.h index e19de44c6082b305aaad0c79ea99485d74956de3..ce17b6693dd97f63e92aef5470214ce5c2bf3141 100755 --- a/indra/llrender/llpostprocess.h +++ b/indra/llrender/llpostprocess.h @@ -31,6 +31,7 @@ #include <fstream> #include "llgl.h" #include "llglheaders.h" +#include "llstaticstringtable.h" class LLPostProcess { @@ -44,7 +45,7 @@ public: } QuadType; /// GLSL Shader Encapsulation Struct - typedef std::map<const char *, GLuint> glslUniforms; + typedef LLStaticStringTable<GLuint> glslUniforms; struct PostProcessTweaks : public LLSD { inline PostProcessTweaks() : LLSD(LLSD::emptyMap()) diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index f2f1b62be0fc617a58600925a8efce279dbb0754..0ac30b4d63a52be2763d6fb412525c85a539ef0c 100755 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -225,26 +225,15 @@ void LLTexUnit::disable(void) bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind) { stop_glerror(); - if (mIndex < 0) return false; - + if (mIndex >= 0) + { gGL.flush(); LLImageGL* gl_tex = NULL ; - if (texture == NULL || !(gl_tex = texture->getGLTexture())) + if (texture != NULL && (gl_tex = texture->getGLTexture())) { - llwarns << "NULL LLTexUnit::bind texture" << llendl; - return false; - } - - if (!gl_tex->getTexName()) //if texture does not exist + if (gl_tex->getTexName()) //if texture exists { - //if deleted, will re-generate it immediately - texture->forceImmediateUpdate() ; - - gl_tex->forceUpdateBindStats() ; - return texture->bindDefaultImage(mIndex); - } - //in audit, replace the selected texture by the default one. if ((mCurrTexture != gl_tex->getTexName()) || forceBind) { @@ -265,6 +254,27 @@ bool LLTexUnit::bind(LLTexture* texture, bool for_rendering, bool forceBind) setTextureFilteringOption(gl_tex->mFilterOption); } } + } + else + { + //if deleted, will re-generate it immediately + texture->forceImmediateUpdate() ; + + gl_tex->forceUpdateBindStats() ; + return texture->bindDefaultImage(mIndex); + } + } + else + { + llwarns << "NULL LLTexUnit::bind texture" << llendl; + return false; + } + } + else + { // mIndex < 0 + return false; + } + return true; } @@ -1058,6 +1068,16 @@ LLRender::~LLRender() void LLRender::init() { + if (sGLCoreProfile && !LLVertexBuffer::sUseVAO) + { //bind a dummy vertex array object so we're core profile compliant +#ifdef GL_ARB_vertex_array_object + U32 ret; + glGenVertexArrays(1, &ret); + glBindVertexArray(ret); +#endif + } + + llassert_always(mBuffer.isNull()) ; stop_glerror(); mBuffer = new LLVertexBuffer(immediate_mask, 0); @@ -1852,33 +1872,33 @@ void LLRender::flush() //store mCount in a local variable to avoid re-entrance (drawArrays may call flush) U32 count = mCount; - if (mMode == LLRender::QUADS && !sGLCoreProfile) - { - if (mCount%4 != 0) + if (mMode == LLRender::QUADS && !sGLCoreProfile) { + if (mCount%4 != 0) + { count -= (mCount % 4); llwarns << "Incomplete quad requested." << llendl; + } } - } - - if (mMode == LLRender::TRIANGLES) - { - if (mCount%3 != 0) + + if (mMode == LLRender::TRIANGLES) { + if (mCount%3 != 0) + { count -= (mCount % 3); llwarns << "Incomplete triangle requested." << llendl; + } } - } - - if (mMode == LLRender::LINES) - { - if (mCount%2 != 0) + + if (mMode == LLRender::LINES) { + if (mCount%2 != 0) + { count -= (mCount % 2); llwarns << "Incomplete line requested." << llendl; } } - + mCount = 0; if (mBuffer->useVBOs() && !mBuffer->isLocked()) @@ -2281,6 +2301,22 @@ void LLRender::diffuseColor4ubv(const U8* c) } } +void LLRender::diffuseColor4ub(U8 r, U8 g, U8 b, U8 a) +{ + LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; + llassert(!LLGLSLShader::sNoFixedFunction || shader != NULL); + + if (shader) + { + shader->uniform4f(LLShaderMgr::DIFFUSE_COLOR, r/255.f, g/255.f, b/255.f, a/255.f); + } + else + { + glColor4ub(r,g,b,a); + } +} + + void LLRender::debugTexUnits(void) { LL_INFOS("TextureUnit") << "Active TexUnit: " << mCurrTextureUnitIndex << LL_ENDL; diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h index 98222939e75d5dd1b3510b4dd9401af6501208b5..42b02a8159804ebee17bef65da4d8b7a067dc92b 100755 --- a/indra/llrender/llrender.h +++ b/indra/llrender/llrender.h @@ -396,6 +396,7 @@ public: void diffuseColor4f(F32 r, F32 g, F32 b, F32 a); void diffuseColor4fv(const F32* c); void diffuseColor4ubv(const U8* c); + void diffuseColor4ub(U8 r, U8 g, U8 b, U8 a); void vertexBatchPreTransformed(LLVector3* verts, S32 vert_count); void vertexBatchPreTransformed(LLVector3* verts, LLVector2* uvs, S32 vert_count); diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index c0602d79bd0b07cc58ade76ab65b80f691e04579..fe8110904d68bf91c9544570bcc2249e257908d7 100755 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -194,7 +194,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt) } U32 tex; - LLImageGL::generateTextures(mUsage, color_fmt, 1, &tex); + LLImageGL::generateTextures(1, &tex); gGL.getTexUnit(0)->bindManual(mUsage, tex); stop_glerror(); @@ -262,7 +262,7 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt) } #endif - + return true; } @@ -280,7 +280,7 @@ bool LLRenderTarget::allocateDepth() } else { - LLImageGL::generateTextures(mUsage, GL_DEPTH_COMPONENT24, 1, &mDepth); + LLImageGL::generateTextures(1, &mDepth); gGL.getTexUnit(0)->bindManual(mUsage, mDepth); U32 internal_type = LLTexUnit::getInternalType(mUsage); @@ -357,7 +357,7 @@ void LLRenderTarget::release() } else { - LLImageGL::deleteTextures(mUsage, 0, 0, 1, &mDepth, true); + LLImageGL::deleteTextures(1, &mDepth); stop_glerror(); } mDepth = 0; @@ -394,7 +394,7 @@ void LLRenderTarget::release() sBytesAllocated -= mResX*mResY*4; glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+z, LLTexUnit::getInternalType(mUsage), 0, 0); stop_glerror(); - LLImageGL::deleteTextures(mUsage, mInternalFormat[z], 0, 1, &mTex[z], true); + LLImageGL::deleteTextures(1, &mTex[z]); } } @@ -408,12 +408,12 @@ void LLRenderTarget::release() if (mTex.size() > 0) { sBytesAllocated -= mResX*mResY*4; - LLImageGL::deleteTextures(mUsage, mInternalFormat[0], 0, 1, &mTex[0], true); + LLImageGL::deleteTextures(1, &mTex[0]); } - mTex.clear(); - mInternalFormat.clear(); - + mTex.clear(); + mInternalFormat.clear(); + mResX = mResY = 0; sBoundTarget = NULL; @@ -495,6 +495,12 @@ U32 LLRenderTarget::getTexture(U32 attachment) const return mTex[attachment]; } +U32 LLRenderTarget::getNumTextures() const +{ + return mTex.size(); +} + + void LLRenderTarget::bindTexture(U32 index, S32 channel) { gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index)); diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h index 336441661c765414b3fae2c4d0783a3eb3852e19..6dc84d978da0b9869e12b2d3987a1017c37e4dff 100755 --- a/indra/llrender/llrendertarget.h +++ b/indra/llrender/llrendertarget.h @@ -115,6 +115,7 @@ public: LLTexUnit::eTextureType getUsage(void) const { return mUsage; } U32 getTexture(U32 attachment = 0) const; + U32 getNumTextures() const; U32 getDepth(void) const { return mDepth; } bool hasStencil() const { return mStencil; } diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index 63404abeff9156b66a864765ef28913de3d32d73..d230574752d9aed6ef373aabb5c1b2f908772799 100755 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -993,7 +993,9 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("texture_matrix1"); mReservedUniforms.push_back("texture_matrix2"); mReservedUniforms.push_back("texture_matrix3"); - llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_MATRIX3+1); + mReservedUniforms.push_back("object_plane_s"); + mReservedUniforms.push_back("object_plane_t"); + llassert(mReservedUniforms.size() == LLShaderMgr::OBJECT_PLANE_T+1); mReservedUniforms.push_back("viewport"); @@ -1135,15 +1137,54 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("lightMap"); mReservedUniforms.push_back("bloomMap"); mReservedUniforms.push_back("projectionMap"); - - mReservedUniforms.push_back("global_gamma"); - mReservedUniforms.push_back("texture_gamma"); + mReservedUniforms.push_back("norm_mat"); + mReservedUniforms.push_back("global_gamma"); + mReservedUniforms.push_back("texture_gamma"); + mReservedUniforms.push_back("specular_color"); mReservedUniforms.push_back("env_intensity"); - mReservedUniforms.push_back("display_gamma"); + mReservedUniforms.push_back("matrixPalette"); + + mReservedUniforms.push_back("screenTex"); + mReservedUniforms.push_back("screenDepth"); + mReservedUniforms.push_back("refTex"); + mReservedUniforms.push_back("eyeVec"); + mReservedUniforms.push_back("time"); + mReservedUniforms.push_back("d1"); + mReservedUniforms.push_back("d2"); + mReservedUniforms.push_back("lightDir"); + mReservedUniforms.push_back("specular"); + mReservedUniforms.push_back("lightExp"); + mReservedUniforms.push_back("waterFogColor"); + mReservedUniforms.push_back("waterFogDensity"); + mReservedUniforms.push_back("waterFogKS"); + mReservedUniforms.push_back("refScale"); + mReservedUniforms.push_back("waterHeight"); + mReservedUniforms.push_back("waterPlane"); + mReservedUniforms.push_back("normScale"); + mReservedUniforms.push_back("fresnelScale"); + mReservedUniforms.push_back("fresnelOffset"); + mReservedUniforms.push_back("blurMultiplier"); + mReservedUniforms.push_back("sunAngle"); + mReservedUniforms.push_back("scaledAngle"); + mReservedUniforms.push_back("sunAngle2"); + + mReservedUniforms.push_back("camPosLocal"); + + mReservedUniforms.push_back("gWindDir"); + mReservedUniforms.push_back("gSinWaveParams"); + mReservedUniforms.push_back("gGravity"); + mReservedUniforms.push_back("detail_0"); + mReservedUniforms.push_back("detail_1"); + mReservedUniforms.push_back("detail_2"); + mReservedUniforms.push_back("detail_3"); + mReservedUniforms.push_back("alpha_ramp"); + + mReservedUniforms.push_back("origin"); + mReservedUniforms.push_back("display_gamma"); llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS); std::set<std::string> dupe_check; diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 3c282bf24f1a0bf7141340a1600f0814405e6adf..51c27fc8b66f7a5a4141a25c2a89e10f2f80d01e 100755 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -47,6 +47,8 @@ public: TEXTURE_MATRIX1, TEXTURE_MATRIX2, TEXTURE_MATRIX3, + OBJECT_PLANE_S, + OBJECT_PLANE_T, VIEWPORT, LIGHT_POSITION, LIGHT_DIRECTION, @@ -165,15 +167,54 @@ public: DEFERRED_LIGHT, DEFERRED_BLOOM, DEFERRED_PROJECTION, - - GLOBAL_GAMMA, - TEXTURE_GAMMA, + DEFERRED_NORM_MATRIX, + GLOBAL_GAMMA, + TEXTURE_GAMMA, + SPECULAR_COLOR, ENVIRONMENT_INTENSITY, - DISPLAY_GAMMA, + AVATAR_MATRIX, + WATER_SCREENTEX, + WATER_SCREENDEPTH, + WATER_REFTEX, + WATER_EYEVEC, + WATER_TIME, + WATER_WAVE_DIR1, + WATER_WAVE_DIR2, + WATER_LIGHT_DIR, + WATER_SPECULAR, + WATER_SPECULAR_EXP, + WATER_FOGCOLOR, + WATER_FOGDENSITY, + WATER_FOGKS, + WATER_REFSCALE, + WATER_WATERHEIGHT, + WATER_WATERPLANE, + WATER_NORM_SCALE, + WATER_FRESNEL_SCALE, + WATER_FRESNEL_OFFSET, + WATER_BLUR_MULTIPLIER, + WATER_SUN_ANGLE, + WATER_SCALED_ANGLE, + WATER_SUN_ANGLE2, + + WL_CAMPOSLOCAL, + + AVATAR_WIND, + AVATAR_SINWAVE, + AVATAR_GRAVITY, + + TERRAIN_DETAIL0, + TERRAIN_DETAIL1, + TERRAIN_DETAIL2, + TERRAIN_DETAIL3, + TERRAIN_ALPHARAMP, + + SHINY_ORIGIN, +DISPLAY_GAMMA, END_RESERVED_UNIFORMS } eGLSLReservedUniforms; diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 6a7cec3bada18eec7f9c2997e16583134aa5c82f..e6f20cd40ea18892247b816ee53107502dcc098f 100755 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -85,12 +85,12 @@ const U32 LL_VBO_POOL_SEED_COUNT = vbo_block_index(LL_VBO_POOL_MAX_SEED_SIZE); //static LLVBOPool LLVertexBuffer::sStreamVBOPool(GL_STREAM_DRAW_ARB, GL_ARRAY_BUFFER_ARB); LLVBOPool LLVertexBuffer::sDynamicVBOPool(GL_DYNAMIC_DRAW_ARB, GL_ARRAY_BUFFER_ARB); +LLVBOPool LLVertexBuffer::sDynamicCopyVBOPool(GL_DYNAMIC_COPY_ARB, GL_ARRAY_BUFFER_ARB); LLVBOPool LLVertexBuffer::sStreamIBOPool(GL_STREAM_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB); LLVBOPool LLVertexBuffer::sDynamicIBOPool(GL_DYNAMIC_DRAW_ARB, GL_ELEMENT_ARRAY_BUFFER_ARB); U32 LLVBOPool::sBytesPooled = 0; U32 LLVBOPool::sIndexBytesPooled = 0; -U32 LLVBOPool::sCurGLName = 1; std::list<U32> LLVertexBuffer::sAvailableVAOName; U32 LLVertexBuffer::sCurVAOName = 1; @@ -124,16 +124,8 @@ U32 LLVBOPool::genBuffer() { U32 ret = 0; - if (mGLNamePool.empty()) - { - ret = sCurGLName++; - } - else - { - ret = mGLNamePool.front(); - mGLNamePool.pop_front(); - } - + glGenBuffersARB(1, &ret); + return ret; } @@ -145,12 +137,9 @@ void LLVBOPool::deleteBuffer(U32 name) glBindBufferARB(mType, name); glBufferDataARB(mType, 0, NULL, mUsage); - - llassert(std::find(mGLNamePool.begin(), mGLNamePool.end(), name) == mGLNamePool.end()); - - mGLNamePool.push_back(name); - glBindBufferARB(mType, 0); + + glDeleteBuffersARB(1, &name); } } @@ -199,7 +188,10 @@ volatile U8* LLVBOPool::allocate(U32& name, U32 size, bool for_seed) if (LLVertexBuffer::sDisableVBOMapping || mUsage != GL_DYNAMIC_DRAW_ARB) { glBufferDataARB(mType, size, 0, mUsage); - ret = (U8*) ll_aligned_malloc_16(size); + if (mUsage != GL_DYNAMIC_COPY_ARB) + { //data will be provided by application + ret = (U8*) ll_aligned_malloc(size, 64); + } } else { //always use a true hint of static draw when allocating non-client-backed buffers @@ -252,7 +244,7 @@ void LLVBOPool::release(U32 name, volatile U8* buffer, U32 size) llassert(vbo_block_size(size) == size); deleteBuffer(name); - ll_aligned_free_16((U8*) buffer); + ll_aligned_free((U8*) buffer); if (mType == GL_ARRAY_BUFFER_ARB) { @@ -306,7 +298,7 @@ void LLVBOPool::cleanup() if (r.mClientData) { - ll_aligned_free_16((void*) r.mClientData); + ll_aligned_free((void*) r.mClientData); } l.pop_front(); @@ -412,6 +404,7 @@ void LLVertexBuffer::seedPools() { sStreamVBOPool.seedPool(); sDynamicVBOPool.seedPool(); + sDynamicCopyVBOPool.seedPool(); sStreamIBOPool.seedPool(); sDynamicIBOPool.seedPool(); } @@ -753,10 +746,10 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi U16* idx = ((U16*) getIndicesPointer())+indices_offset; stop_glerror(); - LLGLSLShader::startProfile(); - glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT, + LLGLSLShader::startProfile(); + glDrawRangeElements(sGLMode[mode], start, end, count, GL_UNSIGNED_SHORT, idx); - LLGLSLShader::stopProfile(count, mode); + LLGLSLShader::stopProfile(count, mode); stop_glerror(); @@ -910,6 +903,7 @@ void LLVertexBuffer::cleanupClass() sDynamicIBOPool.cleanup(); sStreamVBOPool.cleanup(); sDynamicVBOPool.cleanup(); + sDynamicCopyVBOPool.cleanup(); if(sPrivatePoolp) { @@ -946,6 +940,8 @@ S32 LLVertexBuffer::determineUsage(S32 usage) if (ret_usage && ret_usage != GL_STREAM_DRAW_ARB) { //only stream_draw and dynamic_draw are supported when using VBOs, dynamic draw is the default + if (ret_usage != GL_DYNAMIC_COPY_ARB) + { if (sDisableVBOMapping) { //always use stream draw if VBO mapping is disabled ret_usage = GL_STREAM_DRAW_ARB; @@ -955,6 +951,7 @@ S32 LLVertexBuffer::determineUsage(S32 usage) ret_usage = GL_DYNAMIC_DRAW_ARB; } } + } return ret_usage; } @@ -1102,10 +1099,15 @@ void LLVertexBuffer::genBuffer(U32 size) { mMappedData = sStreamVBOPool.allocate(mGLBuffer, mSize); } - else + else if (mUsage == GL_DYNAMIC_DRAW_ARB) { mMappedData = sDynamicVBOPool.allocate(mGLBuffer, mSize); } + else + { + mMappedData = sDynamicCopyVBOPool.allocate(mGLBuffer, mSize); + } + sGLCount++; } @@ -1319,7 +1321,7 @@ void LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create) //actually allocate space for the vertex buffer if using VBO mapping flush(); - if (gGLManager.mHasVertexArrayObject && useVBOs() && (LLRender::sGLCoreProfile || sUseVAO)) + if (gGLManager.mHasVertexArrayObject && useVBOs() && sUseVAO) { #if GL_ARB_vertex_array_object mGLArray = getVAOName(); @@ -2144,21 +2146,14 @@ bool LLVertexBuffer::bindGLBuffer(bool force_bind) if (useVBOs() && (force_bind || (mGLBuffer && (mGLBuffer != sGLRenderBuffer || !sVBOActive)))) { - LLFastTimer t(FTM_BIND_GL_BUFFER); - /*if (sMapped) - { - llerrs << "VBO bound while another VBO mapped!" << llendl; - }*/ + //LLFastTimer t(FTM_BIND_GL_BUFFER); <-- this timer is showing up as a hotspot (irony) + glBindBufferARB(GL_ARRAY_BUFFER_ARB, mGLBuffer); sGLRenderBuffer = mGLBuffer; sBindCount++; sVBOActive = true; - if (mGLArray) - { - llassert(sGLRenderArray == mGLArray); - //mCachedRenderBuffer = mGLBuffer; - } + llassert(!mGLArray || sGLRenderArray == mGLArray); ret = true; } @@ -2236,7 +2231,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask) required_mask |= required; } } - + if ((data_mask & required_mask) != required_mask) { @@ -2440,7 +2435,8 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) if (data_mask & MAP_COLOR) { S32 loc = TYPE_COLOR; - void* ptr = (void*)(base + mOffsets[TYPE_COLOR]); + //bind emissive instead of color pointer if emissive is present + void* ptr = (data_mask & MAP_EMISSIVE) ? (void*)(base + mOffsets[TYPE_EMISSIVE]) : (void*)(base + mOffsets[TYPE_COLOR]); glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_COLOR], ptr); } if (data_mask & MAP_EMISSIVE) @@ -2448,6 +2444,12 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) S32 loc = TYPE_EMISSIVE; void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE]); glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); + + if (!(data_mask & MAP_COLOR)) + { //map emissive to color channel when color is not also being bound to avoid unnecessary shader swaps + loc = TYPE_COLOR; + glVertexAttribPointerARB(loc, 4, GL_UNSIGNED_BYTE, GL_TRUE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE], ptr); + } } if (data_mask & MAP_WEIGHT) { @@ -2533,8 +2535,7 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) LLVertexBuffer::MappedRegion::MappedRegion(S32 type, S32 index, S32 count) : mType(type), mIndex(index), mCount(count) { - llassert(mType == LLVertexBuffer::TYPE_INDEX || - mType < LLVertexBuffer::TYPE_TEXTURE_INDEX); + mEnd = mIndex+mCount; } diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 04806c1d8c20eff04aaa6c241507ff6ec27ef26d..619a0cec467bd9e766be579c48ff776effdf0c7b 100755 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -57,8 +57,6 @@ public: static U32 sBytesPooled; static U32 sIndexBytesPooled; - static U32 sCurGLName; - LLVBOPool(U32 vboUsage, U32 vboType); const U32 mUsage; @@ -86,8 +84,6 @@ public: volatile U8* mClientData; }; - std::list<U32> mGLNamePool; - typedef std::list<Record> record_list_t; std::vector<record_list_t> mFreeList; std::vector<U32> mMissCount; @@ -107,6 +103,7 @@ public: S32 mType; S32 mIndex; S32 mCount; + S32 mEnd; MappedRegion(S32 type, S32 index, S32 count); }; @@ -125,9 +122,10 @@ public: static LLVBOPool sStreamVBOPool; static LLVBOPool sDynamicVBOPool; + static LLVBOPool sDynamicCopyVBOPool; static LLVBOPool sStreamIBOPool; static LLVBOPool sDynamicIBOPool; - + static std::list<U32> sAvailableVAOName; static U32 sCurVAOName; diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 34a08603fabdb165486892b21c9cc69b2faf6923..589ceac5016ebccd554dcd8e70e6ba99515f66cf 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 44f2c1efe92d98a586b437efea382ad802fa0406..50ac511d18f1560c1678dfb358274c0a83bcde29 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()); diff --git a/indra/llui/llchatentry.h b/indra/llui/llchatentry.h index e67f39b21b610bcbdca067558c2dae6be1b6ab19..3f13691a3051287526707b84aba491c200c4c630 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 d4e14d94190bcaa4d5d8c4867b8f8737d94cfc8c..56be52f69abf317403f28d8bd3277000b1a59313 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 64dbaea30634d1d6cb95f88a397de45b907b3187..67393504e7ff36aa90e6bfdf8274e6ff3ad9a415 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/llcommandmanager.cpp b/indra/llui/llcommandmanager.cpp index 625fb8e87024c7cfc5f2a8d646737dabe181be76..49cfb2255e73318a4c7df2447235f3e1d894918f 100755 --- a/indra/llui/llcommandmanager.cpp +++ b/indra/llui/llcommandmanager.cpp @@ -50,6 +50,8 @@ const LLCommandId LLCommandId::null = LLCommandId("null command"); LLCommand::Params::Params() : available_in_toybox("available_in_toybox", false) , icon("icon") + , hover_icon_unselected("hover_icon_unselected") + , hover_icon_selected("hover_icon_selected") , label_ref("label_ref") , name("name") , tooltip_ref("tooltip_ref") @@ -71,6 +73,8 @@ LLCommand::LLCommand(const LLCommand::Params& p) : mIdentifier(p.name) , mAvailableInToybox(p.available_in_toybox) , mIcon(p.icon) + , mHoverIconUnselected(p.hover_icon_unselected) + , mHoverIconSelected(p.hover_icon_selected) , mLabelRef(p.label_ref) , mName(p.name) , mTooltipRef(p.tooltip_ref) diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h index ff5a8a325738b1c9a511cbd3df93b96683c357ca..9f276f712df4649a02d674063ccf854052c786dd 100755 --- a/indra/llui/llcommandmanager.h +++ b/indra/llui/llcommandmanager.h @@ -96,6 +96,9 @@ public: Mandatory<std::string> name; Mandatory<std::string> tooltip_ref; + Optional<std::string> hover_icon_selected; + Optional<std::string> hover_icon_unselected; + Mandatory<std::string> execute_function; Optional<LLSD> execute_parameters; @@ -124,6 +127,8 @@ public: const std::string& labelRef() const { return mLabelRef; } const std::string& name() const { return mName; } const std::string& tooltipRef() const { return mTooltipRef; } + const std::string& hoverIconUnselected() const {return mHoverIconUnselected; } + const std::string& hoverIconSelected() const {return mHoverIconSelected; } const std::string& executeFunctionName() const { return mExecuteFunction; } const LLSD& executeParameters() const { return mExecuteParameters; } @@ -150,6 +155,8 @@ private: std::string mLabelRef; std::string mName; std::string mTooltipRef; + std::string mHoverIconUnselected; + std::string mHoverIconSelected; std::string mExecuteFunction; LLSD mExecuteParameters; diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp index c216d593a249693700ab7e2f01c3da3f77a0a5d4..fdfaf284decc1698d9ac7cd9ac132168af88b608 100755 --- a/indra/llui/llconsole.cpp +++ b/indra/llui/llconsole.cpp @@ -243,7 +243,6 @@ void LLConsole::draw() void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color) { LLSD paragraph_color_segments; - paragraph_color_segments[0]["text"] =wstring_to_utf8str(mParagraphText); LLSD color_sd = color.getValue(); paragraph_color_segments[0]["color"]=color_sd; diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h index f32f1dd74c37296bd9ae627a8b01735e2c7d3277..5ff05698b05b39cf5d95b463c56ef0071cae6e4f 100755 --- a/indra/llui/llconsole.h +++ b/indra/llui/llconsole.h @@ -37,6 +37,7 @@ class LLSD; class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole> { public: + typedef enum e_font_size { MONOSPACE = -1, diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index 273ceb40386117dcdf505bdc9161f4961d712b1c..6e6bcd6ab5ff5819f12ef3a6c58faa9d6562526c 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" @@ -509,8 +509,8 @@ LLFloater::~LLFloater() if( gFocusMgr.childHasKeyboardFocus(this)) { - // Just in case we might still have focus here, release it. - releaseFocus(); + // Just in case we might still have focus here, release it. + releaseFocus(); } // This is important so that floaters with persistent rects (i.e., those @@ -642,7 +642,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 +699,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; @@ -1335,7 +1339,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(); @@ -1542,6 +1546,17 @@ BOOL LLFloater::handleScrollWheel(S32 x, S32 y, S32 clicks) return TRUE;//always } +// 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) { @@ -1562,7 +1577,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; } } @@ -1802,7 +1821,7 @@ void LLFloater::onClickClose( LLFloater* self ) self->onClickCloseBtn(); } -void LLFloater::onClickCloseBtn() +void LLFloater::onClickCloseBtn(bool app_quitting) { closeFloater(false); } diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 3482314698ea282b65463fb7222e383e9e9d341f..75715ef296b03a26c5b482d55415dba4065f118a 100755 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -112,6 +112,8 @@ struct LLCoordFloater : LLCoord<LL_COORD_FLOATER> bool operator!=(const LLCoordFloater& other) const { return !(*this == other); } void setFloater(LLFloater& floater); + + }; class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater> @@ -121,6 +123,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater> friend class LLMultiFloater; public: + struct KeyCompare { // static bool compare(const LLSD& a, const LLSD& b); @@ -286,6 +289,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); @@ -386,7 +390,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(); diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp index 724d190307dcb841f96d6ebf7f30219d098eb9b8..f03c8d444b1d8ac66b7b06e275a1ee3ac2b9008f 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 25ae1d2579d272126fa7690a476a87742c5b5785..1c7326260c1b30cec24c8c7f7215959baf631c51 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 cf449217f5756dc33802e6a0376453d342cbc17f..f32a52e6c653daff2356e43fecfbb8b85bc13a5d 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 old mode 100755 new mode 100644 index 6c147ccc12eee6e15469be6b6b0816b377f9a07b..aa2343226cbd29c3b2132792304c53c17ab77c65 --- 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/llfolderviewitem.h b/indra/llui/llfolderviewitem.h old mode 100755 new mode 100644 diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp index 795dacdbb069702ee69888eba6cd72200847c316..26d27d1f3456034cf6b60076e46e7e8aa345f43f 100755 --- a/indra/llui/llkeywords.cpp +++ b/indra/llui/llkeywords.cpp @@ -367,7 +367,6 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW const llwchar* base = wtext.c_str(); const llwchar* cur = base; - while( *cur ) { if( *cur == '\n' || cur == base ) diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index b570974bd6593984b00d4c763c455b90a9c7bc36..add43fa741e54040edf7d9ce81d9f3061c43d6a3 100755 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -38,6 +38,7 @@ class LLLayoutPanel; class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack> { public: + typedef enum e_layout_orientation { HORIZONTAL, diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp index 8c2be449045f563a837530eba4d6abb30d366eb7..4d6e189b92bc0d2b1535faf45d8eabe8e4646122 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/llmodaldialog.h b/indra/llui/llmodaldialog.h index 4e09d11d77827f4b50eff04ed32e770b4456c632..f81273b96a56cf1b9e336b988e45b8acb8ae54c0 100755 --- a/indra/llui/llmodaldialog.h +++ b/indra/llui/llmodaldialog.h @@ -40,7 +40,7 @@ class LLModalDialog : public LLFloater { public: LLModalDialog( const LLSD& key, BOOL modal = true ); - /*virtual*/ ~LLModalDialog(); + virtual ~LLModalDialog(); /*virtual*/ BOOL postBuild(); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index a1853ca1f787de02aec6216015af041244c3d0d2..5c288c3f03e618a1597c630dd005475c522262ad 100755 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -1125,7 +1125,7 @@ LLNotificationChannel::LLNotificationChannel(const Params& p) mName(p.name.isProvided() ? p.name : LLUUID::generateNewID().asString()) { BOOST_FOREACH(const std::string& source, p.sources) -{ + { connectToChannel(source); } } @@ -1206,9 +1206,14 @@ LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything), mIgnoreAllNotifications(false) { + mListener.reset(new LLNotificationsListener(*this)); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2)); } +void LLNotifications::clear() +{ + mDefaultChannels.clear(); +} // The expiration channel gets all notifications that are cancelled bool LLNotifications::expirationFilter(LLNotificationPtr pNotification) diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 87573c2a56bdb4fe17f0e240563208504271aff3..6ac4a988060a653b668cbcd0ef7c4a121b211698 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 { @@ -138,6 +140,7 @@ typedef LLFunctorRegistration<LLNotificationResponder> LLNotificationFunctorRegi class LLNotificationContext : public LLInstanceTracker<LLNotificationContext, LLUUID> { public: + LLNotificationContext() : LLInstanceTracker<LLNotificationContext, LLUUID>(LLUUID::generateNewID()) { } @@ -873,6 +876,13 @@ class LLNotifications : friend class LLSingleton<LLNotifications>; public: + + // Needed to clear up RefCounted things prior to actual destruction + // as the singleton nature of the class makes them do "bad things" + // on at least Mac, if not all 3 platforms + // + void clear(); + // load all notification descriptions from file // calling more than once will overwrite existing templates // but never delete a template @@ -970,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 0000000000000000000000000000000000000000..9e8e943ee63de24970f91a5772f8e35c812a22e5 --- /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 0000000000000000000000000000000000000000..f9f7641de6c5fb1f8d4d7073a435d73d7348fc5b --- /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/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index cbcce0ece545fa7e7617fa5ad6f3f4a1127da877..238eae21c25f6366e63dc24f0e8a1c39015f670d 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/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index fd981557047697b291af17e4791b04de1d723234..6fd2bb1b36739e7cf3a56f3a643658a2f61d777f 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" @@ -193,12 +193,15 @@ LLTabContainer::TabParams::TabParams() : tab_top_image_unselected("tab_top_image_unselected"), tab_top_image_selected("tab_top_image_selected"), tab_top_image_flash("tab_top_image_flash"), + tab_top_image_hovered("tab_top_image_hovered"), tab_bottom_image_unselected("tab_bottom_image_unselected"), tab_bottom_image_selected("tab_bottom_image_selected"), tab_bottom_image_flash("tab_bottom_image_flash"), + tab_bottom_image_hovered("tab_bottom_image_hovered"), tab_left_image_unselected("tab_left_image_unselected"), tab_left_image_selected("tab_left_image_selected"), - tab_left_image_flash("tab_left_image_flash") + tab_left_image_flash("tab_left_image_flash"), + tab_left_image_hovered("tab_left_image_hovered") {} LLTabContainer::Params::Params() @@ -218,7 +221,8 @@ LLTabContainer::Params::Params() open_tabs_on_drag_and_drop("open_tabs_on_drag_and_drop", false), tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0), use_ellipses("use_ellipses"), - font_halign("halign") + font_halign("halign"), + use_highlighting_on_hover("use_highlighting_on_hover",false) {} LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) @@ -254,7 +258,8 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p) mCustomIconCtrlUsed(p.use_custom_icon_ctrl), mOpenTabsOnDragAndDrop(p.open_tabs_on_drag_and_drop), mTabIconCtrlPad(p.tab_icon_ctrl_pad), - mUseTabEllipses(p.use_ellipses) + mUseTabEllipses(p.use_ellipses), + mUseHighlightingOnHover(p.use_highlighting_on_hover) { static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0); @@ -578,6 +583,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 +639,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 +689,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; } @@ -891,18 +908,30 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_top_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_top_image_selected)); tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_top_image_flash)); + if(mUseHighlightingOnHover) + { + tuple->mButton->setImageHoverUnselected(static_cast<LLUIImage*>(params.tab_top_image_hovered)); + } } else if (pos == LLTabContainer::BOTTOM) { tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_bottom_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_bottom_image_selected)); tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_bottom_image_flash)); + if(mUseHighlightingOnHover) + { + tuple->mButton->setImageHoverUnselected(static_cast<LLUIImage*>(params.tab_bottom_image_hovered)); + } } else if (pos == LLTabContainer::LEFT) { tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_left_image_unselected)); tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_left_image_selected)); tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_left_image_flash)); + if(mUseHighlightingOnHover) + { + tuple->mButton->setImageHoverUnselected(static_cast<LLUIImage*>(params.tab_left_image_hovered)); + } } } } @@ -1059,21 +1088,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/lltabcontainer.h b/indra/llui/lltabcontainer.h index 57862fc626c0374c49a863a238836b0d4963553e..7e7d4ac6e6d22b942c7645eb8a10e69a933cea3a 100755 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -62,12 +62,15 @@ public: Optional<LLUIImage*> tab_top_image_unselected, tab_top_image_selected, tab_top_image_flash, + tab_top_image_hovered, tab_bottom_image_unselected, tab_bottom_image_selected, tab_bottom_image_flash, + tab_bottom_image_hovered, tab_left_image_unselected, tab_left_image_selected, - tab_left_image_flash; + tab_left_image_flash, + tab_left_image_hovered; TabParams(); }; @@ -114,6 +117,11 @@ public: */ Optional<S32> tab_icon_ctrl_pad; + /** + * This variable is used to found out should we highlight tab button on hover + */ + Optional<bool> use_highlighting_on_hover; + Params(); }; @@ -307,6 +315,7 @@ private: bool mOpenTabsOnDragAndDrop; S32 mTabIconCtrlPad; bool mUseTabEllipses; + bool mUseHighlightingOnHover; }; #endif // LL_TABCONTAINER_H diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 3c284b3f038ef4d068c0fe48a1f473cbd9bc6701..5ec4cf4fe5dd57af6b51e9d1e93365dd4d6b0083 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1029,7 +1029,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 @@ -2379,7 +2379,6 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, { // Figure out which line we're nearest to. LLRect doc_rect = mDocumentView->getRect(); - S32 doc_y = local_y - doc_rect.mBottom; // binary search for line that starts before local_y diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp index 11cfa1d2632cf5223f2308d02050b3211b62a16f..d175204e6d598673f46ec0a35bc8a94ae42487e2 100755 --- a/indra/llui/lltextbox.cpp +++ b/indra/llui/lltextbox.cpp @@ -59,11 +59,14 @@ 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 0c16e06109fbd51b21eea8484785201adcc9d978..62140dd9d67909de341221f61efaa6f092dad743 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -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; } diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 32b543ec0e3439380847c001ee18f4cefb3dece0..d3b7bc0eb7681ef04c31155ee3561496a9896b48 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 928e82cb8c21c798e2cdb1744270ababa2b7012c..6bfe113933d322c46b8dea9d2d6cddc9985302f5 100755 --- a/indra/llui/lltoolbar.cpp +++ b/indra/llui/lltoolbar.cpp @@ -928,6 +928,8 @@ LLToolBarButton* LLToolBar::createButton(const LLCommandId& id) button_p.label = LLTrans::getString(commandp->labelRef()); button_p.tool_tip = LLTrans::getString(commandp->tooltipRef()); button_p.image_overlay = LLUI::getUIImage(commandp->icon()); + button_p.image_hover_unselected = LLUI::getUIImage(commandp->hoverIconUnselected()); + button_p.image_hover_selected = LLUI::getUIImage(commandp->hoverIconSelected()); button_p.button_flash_enable = commandp->isFlashingAllowed(); button_p.overwriteFrom(mButtonParams[mButtonType]); LLToolBarButton* button = LLUICtrlFactory::create<LLToolBarButton>(button_p); diff --git a/indra/llui/llui.h b/indra/llui/llui.h index 0a0e0e164ec830191b912707ee8d37e169ec7827..0bc4424a8cab7b39a58a7fce63b8558fab524ca6 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 b9c843e931c4aa657eec7a3f3bed2d127870b230..1722bf27bddcda5937d681f7ebff1d22b1bb2383 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/llview.cpp b/indra/llui/llview.cpp index 3613a40e2c6c8021fce9c8fb8997f31eef03eaf0..20015dca1af7295982a27d0f474b94f46a7698bc 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,27 @@ void LLView::setVisible(BOOL visible) // virtual void LLView::handleVisibilityChange ( BOOL new_visibility ) { + BOOL old_visibility; 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 (old_visibility!=new_visibility) + { + LLViewerEventRecorder::instance().logVisibilityChange( viewp->getPathname(), viewp->getName(), new_visibility,"widget"); + } + + if (old_visibility) { viewp->handleVisibilityChange ( new_visibility ); } + + // 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 +713,7 @@ bool LLView::visibleEnabledAndContains(S32 local_x, S32 local_y) && getEnabled(); } +// This is NOT event recording related void LLView::logMouseEvent() { if (sDebugMouseHandling) @@ -743,7 +760,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 +790,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 +849,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 +933,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 +986,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 +1020,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 +1102,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) diff --git a/indra/llui/llviewereventrecorder.cpp b/indra/llui/llviewereventrecorder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a352f621eb5aab413752a228db731e5ae4e560c1 --- /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); + + // 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 0000000000000000000000000000000000000000..72ca643ced027e09501844a374288c3c0d828565 --- /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(); + 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/llwindow/lldragdropwin32.h b/indra/llwindow/lldragdropwin32.h index 929e7f9e377f3a0d480e3b55047bb9fb35b193d0..a6824f3e904a5800177d99ed8279590672bb97ac 100755 --- a/indra/llwindow/lldragdropwin32.h +++ b/indra/llwindow/lldragdropwin32.h @@ -57,7 +57,7 @@ class LLDragDropWin32 #include <windows.h> #include <ole2.h> -// imposter class that does nothing +// impostor class that does nothing class LLDragDropWin32 { public: diff --git a/indra/llwindow/llopenglview-objc.h b/indra/llwindow/llopenglview-objc.h index 41837b1eb489ff8427f5386bea59dc9aaee31ab8..1e0e47cd0211afe3a17ceaac859a1693d6e2047b 100644 --- a/indra/llwindow/llopenglview-objc.h +++ b/indra/llwindow/llopenglview-objc.h @@ -65,6 +65,7 @@ - (unsigned long) getVramSize; - (void) allowMarkedTextInput:(bool)allowed; +- (void) viewDidEndLiveResize; @end diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 5f34d03c350aa83b3026b678c4308764acad1a43..7415c9d8dcf3626032f9cb9c8717a2e6d9017e59 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -91,6 +91,13 @@ attributedStringInfo getSegments(NSAttributedString *str) @implementation LLOpenGLView +// Force a high quality update after live resizing +- (void) viewDidEndLiveResize +{ + NSSize size = [self frame].size; + callResize(size.width, size.height); +} + - (unsigned long)getVramSize { CGLRendererInfoObj info = 0; @@ -119,9 +126,8 @@ attributedStringInfo getSegments(NSAttributedString *str) - (void)windowResized:(NSNotification *)notification; { - NSSize size = [self frame].size; - - callResize(size.width, size.height); + //NSSize size = [self frame].size; + //callResize(size.width, size.height); } - (void)dealloc diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index e9147d552e1fba94e3563e3f2983303f79ee6889..78186004b8ea5975a588313021af7e71998d7e33 100755 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -42,6 +42,7 @@ class LLWindowCallbacks; class LLWindow : public LLInstanceTracker<LLWindow> { public: + struct LLWindowResolution { S32 mWidth; diff --git a/indra/llwindow/llwindowcallbacks.cpp b/indra/llwindow/llwindowcallbacks.cpp index 9712ae1d91a39111a0db162da0055a5214d16732..eadff8a6b4af096d3f4dd0e922b3548f8330d983 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 32b3bfb078a9e6dddb19651a9d50cfaf84a3fa6e..81b25601a94606034254d425e78366a6b6a23d95 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> @@ -49,6 +52,7 @@ void handleQuit(); bool runMainLoop(); void initMainLoop(); void cleanupViewer(); +void handleUrl(const char* url); /* Defined in llwindowmacosx-objc.mm: */ int createNSApp(int argc, const char **argv); @@ -143,3 +147,5 @@ NSWindowRef getMainAppWindow(); GLViewRef getGLView(); unsigned int getModifiers(); + +#endif // LL_LLWINDOWMACOSX_OBJC_H diff --git a/indra/llwindow/llwindowmacosx-objc.mm b/indra/llwindow/llwindowmacosx-objc.mm index 0354c2b717dd9d6e79aaef607658777abc12424d..0768d0352e868f0bba26984c853461d805f09364 100755 --- a/indra/llwindow/llwindowmacosx-objc.mm +++ b/indra/llwindow/llwindowmacosx-objc.mm @@ -57,7 +57,7 @@ void setupCocoa() [[NSUserDefaults standardUserDefaults] setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"]; [pool release]; - + inited = true; } } diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp index 56472e6b455aa9a302ff98775e5b0a08e08e79b4..11c0b5108692e787d5276529be7ba7cc1f13d4ea 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 16f22907872f01a7b3fbedc454716285145ee665..97fad7feb0031b4b912e71b426dc3cc33c77b96d 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 e1f9be80ddad26d909449b0a6300f4d50c08b553..f46d21408bfe2bcd0538679056ef1caab59342b3 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/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l index 1c9f50202d8fbf07088219cf42af4a9aefe16d5b..88dfc2e9f3479f079be08cea65031c874137471e 100755 --- a/indra/lscript/lscript_compile/indra.l +++ b/indra/lscript/lscript_compile/indra.l @@ -79,8 +79,8 @@ void parse_string(); #define yyfree indra_free -int yylex( void ); int yyparse( void ); +int yylex( void ); int yyerror(const char *fmt, ...); %} @@ -161,6 +161,7 @@ int yyerror(const char *fmt, ...); "STATUS_DIE_AT_EDGE" { count(); yylval.ival = 0x80; return(INTEGER_CONSTANT); } "STATUS_RETURN_AT_EDGE" { count(); yylval.ival = 0x100; return(INTEGER_CONSTANT); } "STATUS_CAST_SHADOWS" { count(); yylval.ival = 0x200; return(INTEGER_CONSTANT); } +"STATUS_BLOCK_GRAB_OBJECT" { count(); yylval.ival = 0x400; return(INTEGER_CONSTANT); } "AGENT_FLYING" { count(); yylval.ival = AGENT_FLYING; return(INTEGER_CONSTANT); } "AGENT_ATTACHMENTS" { count(); yylval.ival = AGENT_ATTACHMENTS; return(INTEGER_CONSTANT); } @@ -235,6 +236,8 @@ int yyerror(const char *fmt, ...); "PERMISSION_TRACK_CAMERA" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TRACK_CAMERA]; return(INTEGER_CONSTANT); } "PERMISSION_CONTROL_CAMERA" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_CONTROL_CAMERA]; return(INTEGER_CONSTANT); } "PERMISSION_TELEPORT" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TELEPORT]; return(INTEGER_CONSTANT); } +"PERMISSION_SILENT_ESTATE_MANAGEMENT" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_SILENT_ESTATE_MANAGEMENT]; return(INTEGER_CONSTANT); } +"PERMISSION_OVERRIDE_ANIMATIONS" { count(); yylval.ival = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_OVERRIDE_ANIMATIONS]; return(INTEGER_CONSTANT); } "INVENTORY_TEXTURE" { count(); yylval.ival = LLAssetType::AT_TEXTURE; return(INTEGER_CONSTANT); } "INVENTORY_SOUND" { count(); yylval.ival = LLAssetType::AT_SOUND; return(INTEGER_CONSTANT); } @@ -271,6 +274,22 @@ int yyerror(const char *fmt, ...); "OBJECT_OWNER" { count(); yylval.ival = OBJECT_OWNER; return(INTEGER_CONSTANT); } "OBJECT_GROUP" { count(); yylval.ival = OBJECT_GROUP; return(INTEGER_CONSTANT); } "OBJECT_CREATOR" { count(); yylval.ival = OBJECT_CREATOR; return(INTEGER_CONSTANT); } +"OBJECT_RUNNING_SCRIPT_COUNT" { count(); yylval.ival = OBJECT_RUNNING_SCRIPT_COUNT; return(INTEGER_CONSTANT); } +"OBJECT_TOTAL_SCRIPT_COUNT" { count(); yylval.ival = OBJECT_TOTAL_SCRIPT_COUNT; return(INTEGER_CONSTANT); } +"OBJECT_SCRIPT_MEMORY" { count(); yylval.ival = OBJECT_SCRIPT_MEMORY; return(INTEGER_CONSTANT); } +"OBJECT_SCRIPT_TIME" { count(); yylval.ival = OBJECT_SCRIPT_TIME; return(INTEGER_CONSTANT); } +"OBJECT_PRIM_EQUIVALENCE" { count(); yylval.ival = OBJECT_PRIM_EQUIVALENCE; return(INTEGER_CONSTANT); } +"OBJECT_SERVER_COST" { count(); yylval.ival = OBJECT_SERVER_COST; return(INTEGER_CONSTANT); } +"OBJECT_STREAMING_COST" { count(); yylval.ival = OBJECT_STREAMING_COST; return(INTEGER_CONSTANT); } +"OBJECT_PHYSICS_COST" { count(); yylval.ival = OBJECT_PHYSICS_COST; return(INTEGER_CONSTANT); } +"OBJECT_CHARACTER_TIME" { count(); yylval.ival = OBJECT_CHARACTER_TIME; return(INTEGER_CONSTANT); } +"OBJECT_ROOT" { count(); yylval.ival = OBJECT_ROOT; return(INTEGER_CONSTANT); } +"OBJECT_ATTACHED_POINT" { count(); yylval.ival = OBJECT_ATTACHED_POINT; return(INTEGER_CONSTANT); } +"OBJECT_PATHFINDING_TYPE" { count(); yylval.ival = OBJECT_PATHFINDING_TYPE; return(INTEGER_CONSTANT); } +"OBJECT_PHYSICS" { count(); yylval.ival = OBJECT_PHYSICS; return(INTEGER_CONSTANT); } +"OBJECT_PHANTOM" { count(); yylval.ival = OBJECT_PHANTOM; return(INTEGER_CONSTANT); } +"OBJECT_TEMP_ON_REZ" { count(); yylval.ival = OBJECT_TEMP_ON_REZ; return(INTEGER_CONSTANT); } +"OBJECT_RENDER_WEIGHT" { count(); yylval.ival = OBJECT_RENDER_WEIGHT; return(INTEGER_CONSTANT); } "TYPE_INTEGER" { count(); yylval.ival = LST_INTEGER; return(INTEGER_CONSTANT); } "TYPE_FLOAT" { count(); yylval.ival = LST_FLOATINGPOINT; return(INTEGER_CONSTANT); } @@ -376,6 +395,10 @@ int yyerror(const char *fmt, ...); "PSYS_PART_END_SCALE" { count(); yylval.ival = LLPS_PART_END_SCALE; return (INTEGER_CONSTANT); } "PSYS_PART_MAX_AGE" { count(); yylval.ival = LLPS_PART_MAX_AGE; return (INTEGER_CONSTANT); } +"PSYS_PART_BLEND_FUNC_SOURCE" { count(); yylval.ival = LLPS_PART_BLEND_FUNC_SOURCE; return (INTEGER_CONSTANT); } +"PSYS_PART_BLEND_FUNC_DEST" { count(); yylval.ival = LLPS_PART_BLEND_FUNC_DEST; return (INTEGER_CONSTANT); } +"PSYS_PART_START_GLOW" { count(); yylval.ival = LLPS_PART_START_GLOW; return (INTEGER_CONSTANT); } +"PSYS_PART_END_GLOW" { count(); yylval.ival = LLPS_PART_END_GLOW; return (INTEGER_CONSTANT); } "PSYS_PART_WIND_MASK" { count(); yylval.ival = LLPartData::LL_PART_WIND_MASK; return(INTEGER_CONSTANT); } "PSYS_PART_INTERP_COLOR_MASK" { count(); yylval.ival = LLPartData::LL_PART_INTERP_COLOR_MASK; return(INTEGER_CONSTANT); } @@ -386,6 +409,16 @@ int yyerror(const char *fmt, ...); "PSYS_PART_TARGET_POS_MASK" { count(); yylval.ival = LLPartData::LL_PART_TARGET_POS_MASK; return(INTEGER_CONSTANT); } "PSYS_PART_EMISSIVE_MASK" { count(); yylval.ival = LLPartData::LL_PART_EMISSIVE_MASK; return(INTEGER_CONSTANT); } "PSYS_PART_TARGET_LINEAR_MASK" { count(); yylval.ival = LLPartData::LL_PART_TARGET_LINEAR_MASK; return(INTEGER_CONSTANT); } +"PSYS_PART_RIBBON_MASK" { count(); yylval.ival = LLPartData::LL_PART_RIBBON_MASK; return(INTEGER_CONSTANT); } + +"PSYS_PART_BF_ONE" { count(); yylval.ival = LLPartData::LL_PART_BF_ONE; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_ZERO" { count(); yylval.ival = LLPartData::LL_PART_BF_ZERO; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_DEST_COLOR" { count(); yylval.ival = LLPartData::LL_PART_BF_DEST_COLOR; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_SOURCE_COLOR" { count(); yylval.ival = LLPartData::LL_PART_BF_SOURCE_COLOR; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_ONE_MINUS_DEST_COLOR" { count(); yylval.ival = LLPartData::LL_PART_BF_ONE_MINUS_DEST_COLOR; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR" { count(); yylval.ival = LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_COLOR; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_SOURCE_ALPHA" { count(); yylval.ival = LLPartData::LL_PART_BF_SOURCE_ALPHA; return(INTEGER_CONSTANT); } +"PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA" { count(); yylval.ival = LLPartData::LL_PART_BF_ONE_MINUS_SOURCE_ALPHA; return(INTEGER_CONSTANT); } "PSYS_SRC_MAX_AGE" { count(); yylval.ival = LLPS_SRC_MAX_AGE; return(INTEGER_CONSTANT); } @@ -481,7 +514,17 @@ int yyerror(const char *fmt, ...); "PRIM_BUMP_SHINY" { count(); yylval.ival = LSL_PRIM_BUMP_SHINY; return(INTEGER_CONSTANT); } "PRIM_FULLBRIGHT" { count(); yylval.ival = LSL_PRIM_FULLBRIGHT; return(INTEGER_CONSTANT); } "PRIM_TEXGEN" { count(); yylval.ival = LSL_PRIM_TEXGEN; return(INTEGER_CONSTANT); } -"PRIM_GLOW" { count(); yylval.ival = LSL_PRIM_GLOW; return(INTEGER_CONSTANT); } +"PRIM_GLOW" { count(); yylval.ival = LSL_PRIM_GLOW; return(INTEGER_CONSTANT); } +"PRIM_TEXT" { count(); yylval.ival = LSL_PRIM_TEXT; return(INTEGER_CONSTANT); } +"PRIM_NAME" { count(); yylval.ival = LSL_PRIM_NAME; return(INTEGER_CONSTANT); } +"PRIM_DESC" { count(); yylval.ival = LSL_PRIM_DESC; return(INTEGER_CONSTANT); } +"PRIM_OMEGA" { count(); yylval.ival = LSL_PRIM_OMEGA; return(INTEGER_CONSTANT); } +"PRIM_LINK_TARGET" { count(); yylval.ival = LSL_PRIM_LINK_TARGET; return(INTEGER_CONSTANT); } +"PRIM_SLICE" { count(); yylval.ival = LSL_PRIM_SLICE; return(INTEGER_CONSTANT); } + +"PRIM_PHYSICS_SHAPE_PRIM" { count(); yylval.ival = LSL_PRIM_PHYSICS_SHAPE_PRIM; return(INTEGER_CONSTANT); } +"PRIM_PHYSICS_SHAPE_NONE" { count(); yylval.ival = LSL_PRIM_PHYSICS_SHAPE_NONE; return(INTEGER_CONSTANT); } +"PRIM_PHYSICS_SHAPE_CONVEX" { count(); yylval.ival = LSL_PRIM_PHYSICS_SHAPE_CONVEX; return(INTEGER_CONSTANT); } "PRIM_TYPE_BOX" { count(); yylval.ival = LSL_PRIM_TYPE_BOX; return(INTEGER_CONSTANT); } "PRIM_TYPE_CYLINDER" { count(); yylval.ival = LSL_PRIM_TYPE_CYLINDER; return(INTEGER_CONSTANT); } diff --git a/indra/lscript/lscript_execute/lscript_readlso.cpp b/indra/lscript/lscript_execute/lscript_readlso.cpp index 8b41cb5a721c47eab99734e57d1363a14ce02392..6384a571008f74e6bbf2d36b6151f44280aa8a2e 100755 --- a/indra/lscript/lscript_execute/lscript_readlso.cpp +++ b/indra/lscript/lscript_execute/lscript_readlso.cpp @@ -145,7 +145,6 @@ void LLScriptLSOParse::printGlobals(LLFILE *fp) // get offset to skip past name varoffset = global_v_offset; bytestream2integer(mRawData, global_v_offset); - // get typeexport type = *(mRawData + global_v_offset++); @@ -347,6 +346,7 @@ void LLScriptLSOParse::printStates(LLFILE *fp) S32 temp_end; opcode_end = worst_case_opcode_end; + (void)opcode_end; for (k = LSTT_STATE_BEGIN; k < LSTT_STATE_END; k++) { diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 4efd2317ebe445bd89080fa86a1c4c2ada18b9c5..9c284beec8bb3a76c15a6d7bb70b909a4d78e89e 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -124,6 +124,7 @@ set(viewer_SOURCE_FILES llavatariconctrl.cpp llavatarlist.cpp llavatarlistitem.cpp + llavatarrenderinfoaccountant.cpp llavatarpropertiesprocessor.cpp llblockedlistitem.cpp llblocklist.cpp @@ -190,6 +191,7 @@ set(viewer_SOURCE_FILES llexpandabletextbox.cpp llexternaleditor.cpp llface.cpp + llfacebookconnect.cpp llfasttimerview.cpp llfavoritesbar.cpp llfeaturemanager.cpp @@ -273,6 +275,7 @@ set(viewer_SOURCE_FILES llfloatersettingsdebug.cpp llfloatersidepanelcontainer.cpp llfloatersnapshot.cpp + llfloatersocial.cpp llfloatersounddevices.cpp llfloaterspellchecksettings.cpp llfloatertelehub.cpp @@ -510,6 +513,7 @@ set(viewer_SOURCE_FILES llsidetraypanelcontainer.cpp llsky.cpp llslurl.cpp + llsnapshotlivepreview.cpp llspatialpartition.cpp llspeakers.cpp llspeakingindicatormanager.cpp @@ -712,6 +716,7 @@ set(viewer_HEADER_FILES llavatarlist.h llavatarlistitem.h llavatarpropertiesprocessor.h + llavatarrenderinfoaccountant.h llblockedlistitem.h llblocklist.h llbox.h @@ -777,6 +782,7 @@ set(viewer_HEADER_FILES llexpandabletextbox.h llexternaleditor.h llface.h + llfacebookconnect.h llfasttimerview.h llfavoritesbar.h llfeaturemanager.h @@ -860,6 +866,7 @@ set(viewer_HEADER_FILES llfloatersettingsdebug.h llfloatersidepanelcontainer.h llfloatersnapshot.h + llfloatersocial.h llfloatersounddevices.h llfloaterspellchecksettings.h llfloatertelehub.h @@ -1087,6 +1094,7 @@ set(viewer_HEADER_FILES llsidetraypanelcontainer.h llsky.h llslurl.h + llsnapshotlivepreview.h llspatialpartition.h llspeakers.h llspeakingindicatormanager.h @@ -1747,6 +1755,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} @@ -1814,6 +1823,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} @@ -1938,7 +1948,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 @@ -2016,6 +2025,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} @@ -2048,6 +2058,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 5b3413147c957b8ea5c1233ea0409dfa13288fc0..3609cf77078c22803a5732ba2871c3414b95d826 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -3.6.7 +3.6.13 diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml index 4659673333b945cd68e064b9b63c5de1d8b3a419..ce878f156b47efbdbcd9b7d73354ec36481e895e 100755 --- a/indra/newview/app_settings/commands.xml +++ b/indra/newview/app_settings/commands.xml @@ -3,6 +3,8 @@ <command name="aboutland" available_in_toybox="true" icon="Command_AboutLand_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_AboutLand_Label" tooltip_ref="Command_AboutLand_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -13,6 +15,8 @@ <command name="appearance" available_in_toybox="true" icon="Command_Appearance_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Appearance_Label" tooltip_ref="Command_Appearance_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -23,6 +27,8 @@ <command name="avatar" available_in_toybox="true" icon="Command_Avatar_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Avatar_Label" tooltip_ref="Command_Avatar_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -33,6 +39,8 @@ <command name="build" available_in_toybox="true" icon="Command_Build_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Build_Label" tooltip_ref="Command_Build_Tooltip" execute_function="Build.Toggle" @@ -46,6 +54,8 @@ available_in_toybox="true" is_flashing_allowed="true" icon="Command_Chat_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Chat_Label" tooltip_ref="Command_Conversations_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -56,6 +66,8 @@ <command name="compass" available_in_toybox="false" icon="Command_Compass_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Compass_Label" tooltip_ref="Command_Compass_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -66,6 +78,8 @@ <command name="destinations" available_in_toybox="true" icon="Command_Destinations_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Destinations_Label" tooltip_ref="Command_Destinations_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -76,6 +90,8 @@ <command name="gestures" available_in_toybox="true" icon="Command_Gestures_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Gestures_Label" tooltip_ref="Command_Gestures_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -86,6 +102,8 @@ <command name="howto" available_in_toybox="true" icon="Command_HowTo_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_HowTo_Label" tooltip_ref="Command_HowTo_Tooltip" execute_function="Help.ToggleHowTo" @@ -94,6 +112,8 @@ <command name="inventory" available_in_toybox="true" icon="Command_Inventory_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Inventory_Label" tooltip_ref="Command_Inventory_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -104,6 +124,8 @@ <command name="map" available_in_toybox="true" icon="Command_Map_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Map_Label" tooltip_ref="Command_Map_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -114,6 +136,8 @@ <command name="marketplace" available_in_toybox="false" icon="Command_Marketplace_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Marketplace_Label" tooltip_ref="Command_Marketplace_Tooltip" execute_function="Avatar.OpenMarketplace" @@ -121,6 +145,8 @@ <command name="minimap" available_in_toybox="true" icon="Command_MiniMap_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_MiniMap_Label" tooltip_ref="Command_MiniMap_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -131,6 +157,8 @@ <command name="move" available_in_toybox="true" icon="Command_Move_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Move_Label" tooltip_ref="Command_Move_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -141,6 +169,8 @@ <command name="outbox" available_in_toybox="false" icon="Command_Outbox_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Outbox_Label" tooltip_ref="Command_Outbox_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -151,6 +181,8 @@ <command name="people" available_in_toybox="true" icon="Command_People_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_People_Label" tooltip_ref="Command_People_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -161,6 +193,8 @@ <command name="picks" available_in_toybox="true" icon="Command_Picks_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Picks_Label" tooltip_ref="Command_Picks_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -171,6 +205,8 @@ <command name="places" available_in_toybox="true" icon="Command_Places_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Places_Label" tooltip_ref="Command_Places_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -181,6 +217,8 @@ <command name="preferences" available_in_toybox="true" icon="Command_Preferences_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Preferences_Label" tooltip_ref="Command_Preferences_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -191,6 +229,8 @@ <command name="profile" available_in_toybox="true" icon="Command_Profile_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Profile_Label" tooltip_ref="Command_Profile_Tooltip" execute_function="Avatar.ToggleMyProfile" @@ -199,6 +239,8 @@ <command name="search" available_in_toybox="true" icon="Command_Search_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Search_Label" tooltip_ref="Command_Search_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -209,6 +251,8 @@ <command name="snapshot" available_in_toybox="true" icon="Command_Snapshot_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Snapshot_Label" tooltip_ref="Command_Snapshot_Tooltip" execute_function="Floater.ToggleOrBringToFront" @@ -216,9 +260,21 @@ 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" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_Speak_Label" tooltip_ref="Command_Speak_Tooltip" execute_function="Agent.PressMicrophone" @@ -233,6 +289,8 @@ <command name="view" available_in_toybox="true" icon="Command_View_Icon" + hover_icon_unselected="Command_Highlighting_Icon" + hover_icon_selected="Command_Highlighting_Selected_Icon" label_ref="Command_View_Label" tooltip_ref="Command_View_Tooltip" execute_function="Floater.ToggleOrBringToFront" diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index a87310955fa929d2952741f27a903971398779e9..ad843bca14d1844fe57a864c6b0182da23de9808 100755 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -62,10 +62,12 @@ STATUS_ROTATE_X Passed in the llSetStatus library function. If FALSE, object do STATUS_ROTATE_Y Passed in the llSetStatus library function. If FALSE, object doesn't rotate around local Y axis STATUS_ROTATE_Z Passed in the llSetStatus library function. If FALSE, object doesn't rotate around local Z axis STATUS_SANDBOX Passed in the llSetStatus library function. If TRUE, object can't cross region boundaries or move more than 10 meters from its start location -STATUS_BLOCK_GRAB Passed in the llSetStatus library function. If TRUE, object can't be grabbed and physically dragged +STATUS_BLOCK_GRAB Passed in the llSetStatus library function. If TRUE, root prim of linkset (or unlinked prim) can't be grabbed and physically dragged STATUS_DIE_AT_EDGE Passed in the llSetStatus library function. If TRUE, objects that reach the edge of the world just die:rather than teleporting back to the owner STATUS_RETURN_AT_EDGE Passed in the llSetStatus library function. If TRUE, script rezzed objects that reach the edge of the world:are returned rather than killed:STATUS_RETURN_AT_EDGE trumps STATUS_DIE_AT_EDGE if both are set STATUS_CAST_SHADOWS Passed in the llSetStatus library function. If TRUE, object casts shadows on other objects +STATUS_BLOCK_GRAB_OBJECT Passed in the llSetStatus library function. If TRUE, no prims in linkset can be grabbed or physically dragged + AGENT Passed in llSensor library function to look for other Agents ACTIVE Passed in llSensor library function to look for moving objects PASSIVE Passed in llSensor library function to look for objects that aren't moving @@ -92,7 +94,7 @@ PERMISSION_CHANGE_LINKS Passed to llRequestPermissions library function to req PERMISSION_TRACK_CAMERA Passed to llRequestPermissions library function to request permission to track agent's camera PERMISSION_CONTROL_CAMERA Passed to llRequestPermissions library function to request permission to change agent's camera PERMISSION_TELEPORT Passed to llRequestPermissions library function to request permission to teleport agent -SCRIPT_PERMISSION_SILENT_ESTATE_MANAGEMENT Passed to llRequestPermissions library function to request permission to silently modify estate access lists +PERMISSION_SILENT_ESTATE_MANAGEMENT Passed to llRequestPermissions library function to request permission to silently modify estate access lists PERMISSION_OVERRIDE_ANIMATIONS Passed to llRequestPermissions library function to request permission to override animations on agent PERMISSION_RETURN_OBJECTS Passed to llRequestPermissions library function to request permission to return objects @@ -132,6 +134,7 @@ PSYS_PART_FOLLOW_VELOCITY_MASK PSYS_PART_TARGET_POS_MASK PSYS_PART_EMISSIVE_MASK PSYS_PART_TARGET_LINEAR_MASK +PSYS_PART_RIBBON_MASK PSYS_SRC_PATTERN PSYS_SRC_INNERANGLE Deprecated -- Use PSYS_SRC_ANGLE_BEGIN @@ -148,12 +151,24 @@ PSYS_SRC_ACCEL PSYS_SRC_TEXTURE PSYS_SRC_TARGET_KEY PSYS_SRC_OMEGA +PSYS_PART_BLEND_FUNC_SOURCE +PSYS_PART_BLEND_FUNC_DEST +PSYS_PART_START_GLOW +PSYS_PART_END_GLOW PSYS_SRC_PATTERN_DROP PSYS_SRC_PATTERN_EXPLODE PSYS_SRC_PATTERN_ANGLE PSYS_SRC_PATTERN_ANGLE_CONE PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY +PSYS_PART_BF_ONE +PSYS_PART_BF_ZERO +PSYS_PART_BF_DEST_COLOR +PSYS_PART_BF_SOURCE_COLOR +PSYS_PART_BF_ONE_MINUS_DEST_COLOR +PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR +PSYS_PART_BF_SOURCE_ALPHA +PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA OBJECT_UNKNOWN_DETAIL Returned by llGetObjectDetails when passed an invalid object parameter type OBJECT_NAME Used with llGetObjectDetails to get an object's name @@ -164,6 +179,23 @@ OBJECT_VELOCITY Used with llGetObjectDetails to get an object's velocity OBJECT_OWNER Used with llGetObjectDetails to get an object's owner's key. Will be NULL_KEY if group owned OBJECT_GROUP Used with llGetObjectDetails to get an object's group's key OBJECT_CREATOR Used with llGetObjectDetails to get an object's creator's key +OBJECT_RUNNING_SCRIPT_COUNT Used with llGetObjectDetails to get the number of running scripts in an object +OBJECT_TOTAL_SCRIPT_COUNT Used with llGetObjectDetails to get the total number of scripts in an object +OBJECT_SCRIPT_MEMORY Used with llGetObjectDetails to get the total amount of script memory in an object +OBJECT_SCRIPT_TIME Used with llGetObjectDetails to get the average script time used by an object +OBJECT_PRIM_EQUIVALENCE Used with llGetObjectDetails to get the prim equivalence of an object +OBJECT_SERVER_COST Used with llGetObjectDetails to get the server cost of an object +OBJECT_STREAMING_COST Used with llGetObjectDetails to get the streaming (download) cost of an object +OBJECT_PHYSICS_COST Used with llGetObjectDetails to get the physics cost of an object +OBJECT_CHARACTER_TIME Used with llGetObjectDetails to get the pathfinding time (seconds) for an object +OBJECT_ROOT Used with llGetObjectDetails to get root ID of an object +OBJECT_ATTACHED_POINT Used with llGetObjectDetails to get attachent point where an object is attached +OBJECT_PATHFINDING_TYPE Used with llGetObjectDetails to get the pathfinding setting of an object +OBJECT_PHYSICS Used with llGetObjectDetails to determine if the object is physical or not +OBJECT_PHANTOM Used with llGetObjectDetails to determine if the object is phantom or not +OBJECT_TEMP_ON_REZ Used with llGetObjectDetails to determine if the object is temporary or not +OBJECT_RENDER_WEIGHT Used with llGetObjectDetails to return an avatar's rendering weight + # some vehicle params VEHICLE_TYPE_NONE @@ -346,7 +378,7 @@ PRIM_MATERIAL Followed by PRIM_MATERIAL_STONE, PRIM_MATERIAL_METAL, PRIM_MATERI PRIM_PHYSICS Sets physics to TRUE or FALSE PRIM_FLEXIBLE Followed by TRUE or FALSE, integer softness, float gravity, float friction, float wind, float tension, and vector force PRIM_POINT_LIGHT Followed by TRUE or FALSE, vector color, float intensity, float radius, float falloff -PRIM_TEMP_ON_REZ Sets temporay on rez to TRUE or FALSE +PRIM_TEMP_ON_REZ Sets temporary on rez to TRUE or FALSE PRIM_PHANTOM Sets phantom to TRUE or FALSE PRIM_CAST_SHADOWS DEPRECATED. Takes 1 parameter, an integer, but has no effect when set and always returns 0 if used in llGetPrimitiveParams PRIM_POSITION Sets primitive position to a vector position @@ -358,6 +390,19 @@ PRIM_BUMP_SHINY Followed by an integer face, one of PRIM_SHINY_NONE, PRIM_SHINY PRIM_FULLBRIGHT Followed by an integer face, and TRUE or FALSE PRIM_TEXGEN Followed by an integer face, and one of PRIM_TEXGEN_DEFAULT or PRIM_TEXGEN_PLANAR PRIM_GLOW Followed by an integer face, and a float from 0.0 to 1.0 specifying glow amount +PRIM_TEXT Followed by string text, vector color, and float alpha +PRIM_NAME Followed by string name +PRIM_DESC Followed by string description +PRIM_ROT_LOCAL Followed by rotation rot +PRIM_PHYSICS_SHAPE_TYPE Followed by PRIM_PHYSICS_SHAPE_PRIM, PRIM_PHYSICS_SHAPE_NONE, or PRIM_PHYSICS_SHAPE_CONVEX +PRIM_OMEGA Followed by vector axis, float spinrate, and float gain +PRIM_POS_LOCAL Followed by vector position +PRIM_LINK_TARGET Followed by integer link_target, then additional prim parameter flags +PRIM_SLICE Followed by vector slice + +PRIM_PHYSICS_SHAPE_PRIM Use the default physics shape +PRIM_PHYSICS_SHAPE_CONVEX Use the convex hull of the prim shape for physics +PRIM_PHYSICS_SHAPE_NONE Ignore this prim in the physics shape PRIM_TYPE_BOX Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear PRIM_TYPE_CYLINDER Followed by integer hole shape, vector cut, float hollow, vector twist,:vector top size, and vector top shear diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 388589a398b75c09b35e1d80c8acbe036a56eed2..d9093c2a6d240dfa572707a53e8ef4005b7805f6 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2224,6 +2224,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DebugShowAvatarRenderInfo</key> + <map> + <key>Comment</key> + <string>Show avatar render cost information</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DebugShowColor</key> <map> <key>Comment</key> @@ -3579,13 +3590,13 @@ </map> <key>FilterItemsMaxTimePerFrameUnvisible</key> <map> - <key>Comment</key> + <key>Comment</key> <string>Max time devoted to items filtering per frame for non visible inventory listings (in milliseconds)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>S32</string> - <key>Value</key> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> <integer>1</integer> </map> <key>FindLandArea</key> @@ -4930,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> @@ -5921,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> @@ -9747,10 +9779,22 @@ <key>Value</key> <integer>1</integer> </map> + <key>RenderAutoMuteByteLimit</key> <map> <key>Comment</key> - <string>Maximum bytes of attachments before an avatar is automatically visually muted (0 for no limit).</string> + <string>Maximum bytes of attachments before an avatar is rendered as a simple impostor (0 for no limit).</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>RenderAutoMuteRenderWeightLimit</key> + <map> + <key>Comment</key> + <string>Maximum render weight before an avatar is rendered as a simple impostor (0 to not use this limit).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9761,7 +9805,7 @@ <key>RenderAutoMuteSurfaceAreaLimit</key> <map> <key>Comment</key> - <string>Maximum surface area of attachments before an avatar is automatically visually muted (0 for no limit).</string> + <string>Maximum surface area of attachments before an avatar is rendered as a simple impostor (0 to not use this limit).</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -9769,7 +9813,28 @@ <key>Value</key> <integer>0</integer> </map> - + <key>RenderAutoMuteFunctions</key> + <map> + <key>Comment</key> + <string>Developing feature to render some avatars using simple impostors or colored silhouettes. (Set to 7 for all functionality)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <real>0</real> + </map> + <key>RenderAutoMuteLogging</key> + <map> + <key>Comment</key> + <string>Show extra information in viewer logs about avatar rendering costs</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RenderAutoHideSurfaceAreaLimit</key> <map> <key>Comment</key> @@ -9796,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> @@ -9926,6 +9991,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>RevokePermsOnStopAnimation</key> + <map> + <key>Comment</key> + <string>Clear animation permssions when choosing "Stop Animating Me"</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RotateRight</key> <map> <key>Comment</key> @@ -10389,6 +10465,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> @@ -13029,6 +13116,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> @@ -13247,7 +13345,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>-1</string> + <string>0</string> </map> <key>VivoxDebugSIPURIHostName</key> <map> @@ -14828,5 +14926,18 @@ <key>Value</key> <integer>0</integer> </map> + + <key>VersionChannelName</key> + <map> + <key>Comment</key> + <string>Version information generated by running the viewer</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> </map> </llsd> + diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 636caf5ef321cd69a50cb381609e6745ab26889f..500151c935277b05d2d5d04ddf64f93bf9273945 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 bc63d07d726ccda9dee47a148166cd0592cea4be..c98e7d1cd3779310fa90f239d176da122d91f5c6 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 efd0d03965725dcdd8b3fcb42efc68c0c9718690..39632d0cef04c8e72115ebfa6df3a4e8e7b74617 100755 --- a/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl +++ b/indra/newview/app_settings/shaders/class1/avatar/objectSkinV.glsl @@ -35,6 +35,9 @@ mat4 getObjectSkinnedTransform() vec4 w = fract(weight4); vec4 index = floor(weight4); + index = min(index, vec4(31.0)); + index = max(index, vec4( 0.0)); + float scale = 1.0/(w.x+w.y+w.z+w.w); w *= scale; diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index cd7a76db28c67959f6e50f8487be938a0ccc0bca..e5f7366b707264dc9d7feebc657458c7d9a504f4 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -185,7 +185,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec da *= spot*spot; // GL_SPOT_EXPONENT=2 //angular attenuation - da *= max(dot(n, lv), 0.0); + da *= max(dot(n, lv), 0.0); float lit = max(da * dist_atten,0.0); @@ -458,7 +458,7 @@ void main() float shadow = 1.0; -#if HAS_SHADOW +#if HAS_SHADOW vec4 spos = pos; if (spos.z > -shadow_clip.w) @@ -541,7 +541,7 @@ void main() #else float final_alpha = diff.a; #endif - + // Insure we don't pollute depth with invis pixels in impostor rendering // if (final_alpha < 0.01) @@ -549,7 +549,7 @@ void main() discard; } #else - + #ifdef USE_VERTEX_COLOR float final_alpha = diff.a * vertex_color.a; diff.rgb *= vertex_color.rgb; @@ -591,16 +591,16 @@ void main() color.rgb *= gamma_diff.rgb; //color.rgb = mix(diff.rgb, color.rgb, final_alpha); - + color.rgb = atmosLighting(color.rgb); color.rgb = scaleSoftClip(color.rgb); vec4 light = vec4(0,0,0,0); color.rgb = srgb_to_linear(color.rgb); - + #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diff.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); - + LIGHT_LOOP(1) LIGHT_LOOP(2) LIGHT_LOOP(3) diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl deleted file mode 100755 index 2ce44d599f1190064efc18ab75b78c8ae9d780d6..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedF.glsl +++ /dev/null @@ -1,150 +0,0 @@ -/** - * @file alphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DRect depthMap; -uniform sampler2D diffuseMap; - - -uniform vec2 screen_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; -VARYING vec4 vertex_color; -VARYING vec3 vary_norm; - -uniform mat4 inv_proj; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ - float a = pow(max(dot(n,l),0.0), 0.7); - return vec3(a,a,a); -} - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(pow(dot(n, lv), 0.7), 0.0); - } - - return vec3(da,da,da); -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - -void main() -{ - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - vec4 pos = vec4(vary_position, 1.0); - - vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy); - - vec3 n = vary_norm; - vec3 l = light_position[0].xyz; - vec3 dlight = calcDirectionalLight(n, l); - dlight = dlight * vary_directional.rgb * vary_pointlight_col; - - vec4 col = vec4(vary_ambient + dlight, vertex_color.a); - vec4 color = diff * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - vec3 light_col = vec3(0,0,0); - - #define LIGHT_LOOP(i) \ - light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); - - LIGHT_LOOP(1) - LIGHT_LOOP(2) - LIGHT_LOOP(3) - LIGHT_LOOP(4) - LIGHT_LOOP(5) - LIGHT_LOOP(6) - LIGHT_LOOP(7) - - color.rgb += diff.rgb * vary_pointlight_col * light_col; - - color.rgb = pow(color.rgb, vec3(1.0/2.2)); - - frag_color = color; - //frag_color = vec4(1,0,1,1); - //frag_color = vec4(1,0,1,1)*shadow; - -} - diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl deleted file mode 100755 index 1113a9845b275ca01562a597b60167b2c180f848..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaNonIndexedNoColorF.glsl +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @file alphaNonIndexedNoColorF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, 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$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform float minimum_alpha; - -uniform sampler2DRect depthMap; -uniform sampler2D diffuseMap; - -uniform vec2 screen_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; - -uniform mat4 inv_proj; - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - -void main() -{ - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - vec4 pos = vec4(vary_position, 1.0); - - vec4 diff= texture2D(diffuseMap,vary_texcoord0.xy); - - if (diff.a < minimum_alpha) - { - discard; - } - - vec4 col = vec4(vary_ambient + vary_directional.rgb, 1.0); - vec4 color = diff * col; - - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - - color.rgb += diff.rgb * vary_pointlight_col.rgb; - - frag_color = color; -} - diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl deleted file mode 100755 index 5f93986f1d240c38904756653e9d04874d243dce..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaSkinnedV.glsl +++ /dev/null @@ -1,136 +0,0 @@ -/** - * @file alphaSkinnedV.glsl - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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 projection_matrix; -uniform mat4 modelview_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec3 normal; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -mat4 getObjectSkinnedTransform(); -void calcAtmospherics(vec3 inPositionEye); - -float calcDirectionalLight(vec3 n, vec3 l); - -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); - -VARYING vec3 vary_position; -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_pointlight_col; -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - -VARYING vec3 vary_norm; - -uniform float near_clip; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -float calcDirectionalLight(vec3 n, vec3 l) -{ - float a = max(dot(n,l),0.0); - return a; -} - -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(dot(n, lv), 0.0); - } - - return da; -} - -void main() -{ - vary_texcoord0 = texcoord0; - - vec4 pos; - vec3 norm; - - mat4 trans = getObjectSkinnedTransform(); - trans = modelview_matrix * trans; - - pos = trans * vec4(position.xyz, 1.0); - - norm = position.xyz + normal.xyz; - norm = normalize(( trans*vec4(norm, 1.0) ).xyz-pos.xyz); - vary_norm = norm; - vec4 frag_pos = projection_matrix * pos; - gl_Position = frag_pos; - - vary_position = pos.xyz; - - calcAtmospherics(pos.xyz); - - //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); - vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); - vary_pointlight_col = diffuse_color.rgb; - col.rgb = vec3(0,0,0); - - // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); - - vary_ambient = col.rgb*diffuse_color.rgb; - vary_directional.rgb = atmosAffectDirectionalLight(1); - - col.rgb = col.rgb*diffuse_color.rgb; - - vertex_color = col; - - - - vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -} - - diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl index 60d414f2ff2c5ecb26fe7dcfbeadffd46c6857ab..b40785bbd77849518e090dc9a1ffb62a30dc4fb8 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaV.glsl @@ -122,7 +122,7 @@ void main() #ifdef USE_VERTEX_COLOR vertex_color = diffuse_color; #endif - + #ifdef HAS_SKIN vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); #else @@ -137,3 +137,4 @@ void main() #endif } + diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl deleted file mode 100755 index d6149fcc32ac9b02785ff3b47e9489141edf0e02..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarAlphaV.glsl +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @file avatarAlphaV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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 projection_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec3 normal; -ATTRIBUTE vec2 texcoord0; - -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -mat4 getSkinnedTransform(); -void calcAtmospherics(vec3 inPositionEye); - -float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); - -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); -vec3 scaleDownLight(vec3 light); -vec3 scaleUpLight(vec3 light); - -VARYING vec3 vary_position; -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_pointlight_col; -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - - -uniform float near_clip; - -uniform vec4 color; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -float calcDirectionalLight(vec3 n, vec3 l) -{ - float a = max(dot(n,l),0.0); - return a; -} - -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(dot(n, lv), 0.0); - } - - return da; -} - -void main() -{ - vary_texcoord0 = texcoord0; - - vec4 pos; - vec3 norm; - - mat4 trans = getSkinnedTransform(); - vec4 pos_in = vec4(position.xyz, 1.0); - pos.x = dot(trans[0], pos_in); - pos.y = dot(trans[1], pos_in); - pos.z = dot(trans[2], pos_in); - pos.w = 1.0; - - norm.x = dot(trans[0].xyz, normal); - norm.y = dot(trans[1].xyz, normal); - norm.z = dot(trans[2].xyz, normal); - norm = normalize(norm); - - vec4 frag_pos = projection_matrix * pos; - gl_Position = frag_pos; - - vary_position = pos.xyz; - - calcAtmospherics(pos.xyz); - - vec4 col = vec4(0.0, 0.0, 0.0, 1.0); - - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); - - vary_pointlight_col = col.rgb*color.rgb; - - col.rgb = vec3(0,0,0); - - // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); - - vary_ambient = col.rgb*color.rgb; - vary_directional = color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0)); - - col.rgb = col.rgb * color.rgb; - - vertex_color = col; - - - - vary_fragcoord.xyz = frag_pos.xyz + vec3(0,0,near_clip); -} - - diff --git a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl index bcccbf77d2df1e3338af941bc6e38553de6b9af1..662c762bca2e408b20aa3fbecd217f29d616cf4d 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/avatarF.glsl @@ -31,6 +31,8 @@ out vec4 frag_data[3]; uniform sampler2D diffuseMap; +uniform float minimum_alpha; + VARYING vec3 vary_normal; VARYING vec2 vary_texcoord0; @@ -44,7 +46,7 @@ void main() { vec4 diff = texture2D(diffuseMap, vary_texcoord0.xy); - if (diff.a < 0.2) + if (diff.a < minimum_alpha) { discard; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl b/indra/newview/app_settings/shaders/class1/deferred/giF.glsl deleted file mode 100755 index da1b234240007d2ecce4330ab4173a617f66687f..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/giF.glsl +++ /dev/null @@ -1,190 +0,0 @@ -/** - * @file giF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform sampler2D noiseMap; - -uniform sampler2D diffuseGIMap; -uniform sampler2D normalGIMap; -uniform sampler2D depthGIMap; - -uniform sampler2D lightFunc; - -// Inputs -VARYING vec2 vary_fragcoord; - -uniform vec2 screen_res; - -uniform mat4 inv_proj; -uniform mat4 gi_mat; //gPipeline.mGIMatrix - eye space to sun space -uniform mat4 gi_mat_proj; //gPipeline.mGIMatrixProj - eye space to projected sun space -uniform mat4 gi_norm_mat; //gPipeline.mGINormalMatrix - eye space normal to sun space normal matrix -uniform mat4 gi_inv_proj; //gPipeline.mGIInvProj - projected sun space to sun space -uniform float gi_radius; -uniform float gi_intensity; -uniform int gi_samples; -uniform vec2 gi_kern[25]; -uniform vec2 gi_scale; -uniform vec3 gi_quad; -uniform vec3 gi_spec; -uniform float gi_direction_weight; -uniform float gi_light_offset; - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos /= pos.w; - pos.w = 1.0; - return pos; -} - -vec4 getGIPosition(vec2 gi_tc) -{ - float depth = texture2D(depthGIMap, gi_tc).a; - vec2 sc = gi_tc*2.0; - sc -= vec2(1.0, 1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = gi_inv_proj*ndc; - pos.xyz /= pos.w; - pos.w = 1.0; - return pos; -} - -vec3 giAmbient(vec3 pos, vec3 norm) -{ - vec4 gi_c = gi_mat_proj * vec4(pos, 1.0); - gi_c.xyz /= gi_c.w; - - vec4 gi_pos = gi_mat*vec4(pos,1.0); - vec3 gi_norm = (gi_norm_mat*vec4(norm,1.0)).xyz; - gi_norm = normalize(gi_norm); - - vec2 tcx = gi_norm.xy; - vec2 tcy = gi_norm.yx; - - vec4 eye_pos = gi_mat*vec4(0,0,0,1.0); - - vec3 eye_dir = normalize(gi_pos.xyz-eye_pos.xyz/eye_pos.w); - - //vec3 eye_dir = vec3(0,0,-1); - //eye_dir = (gi_norm_mat*vec4(eye_dir, 1.0)).xyz; - //eye_dir = normalize(eye_dir); - - //float round_x = gi_scale.x; - //float round_y = gi_scale.y; - - vec3 debug = texture2D(normalGIMap, gi_c.xy).rgb*0.5+0.5; - debug.xz = vec2(0.0,0.0); - //debug = fract(debug); - - float round_x = 1.0/64.0; - float round_y = 1.0/64.0; - - //gi_c.x = floor(gi_c.x/round_x+0.5)*round_x; - //gi_c.y = floor(gi_c.y/round_y+0.5)*round_y; - - float fda = 0.0; - vec3 fdiff = vec3(0,0,0); - - vec3 rcol = vec3(0,0,0); - - float fsa = 0.0; - - for (int i = -1; i < 2; i+=2 ) - { - for (int j = -1; j < 2; j+=2) - { - vec2 tc = vec2(i, j)*0.75; - vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0+tc*0.5).xyz; - //tc += gi_norm.xy*nz.z; - tc += nz.xy*2.0; - tc /= gi_samples; - tc += gi_c.xy; - - vec3 lnorm = -normalize(texture2D(normalGIMap, tc.xy).xyz*2.0-1.0); - vec3 lpos = getGIPosition(tc.xy).xyz; - - vec3 at = lpos-gi_pos.xyz; - float dist = dot(at,at); - float da = clamp(1.0/(gi_spec.x*dist), 0.0, 1.0); - - if (da > 0.0) - { - //add angular attenuation - vec3 ldir = at; - float ang_atten = clamp(dot(ldir, gi_norm), 0.0, 1.0); - - float ld = -dot(ldir, lnorm); - - if (ang_atten > 0.0 && ld < 0.0) - { - vec3 diff = texture2D(diffuseGIMap, tc.xy).xyz; - da = da*ang_atten; - fda += da; - fdiff += diff*da; - } - } - } - } - - fdiff /= max(gi_spec.y*fda, gi_quad.z); - fdiff = clamp(fdiff, vec3(0), vec3(1)); - - vec3 ret = fda*fdiff; - //ret = ret*ret*gi_quad.x+ret*gi_quad.y+gi_quad.z; - - //fda *= nz.z; - - //rcol.rgb *= gi_intensity; - //return rcol.rgb+vary_AmblitColor.rgb*0.25; - //return vec4(debug, 0.0); - //return vec4(fda*fdiff, 0.0); - return clamp(ret,vec3(0.0), vec3(1.0)); - //return debug.xyz; -} - -void main() -{ - vec2 pos_screen = vary_fragcoord.xy; - vec4 pos = getPosition(pos_screen); - vec3 norm = texture2DRect(normalMap, pos_screen).xyz; - norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm - - frag_color.xyz = giAmbient(pos, norm); -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 8202b4978fb893bd8a215b9c74c07bd4725e68df..07d28ed4cdd2df2ea7ec7f8376fb0c3209640471 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -670,7 +670,7 @@ void main() vec4 diffuse = final_color; float envIntensity = final_normal.z; - vec3 col = vec3(0.0f,0.0f,0.0f); + vec3 col = vec3(0.0f,0.0f,0.0f); float bloom = 0.0; calcAtmospherics(pos.xyz, 1.0); @@ -698,7 +698,7 @@ void main() col.rgb = col.rgb + atmosAffectDirectionalLight(final_da); col.rgb *= gamma_diff.rgb; - + float glare = 0.0; @@ -747,9 +747,9 @@ void main() //convert to linear space before adding local lights col = srgb_to_linear(col); - - vec3 npos = normalize(-pos.xyz); + vec3 npos = normalize(-pos.xyz); + vec3 light = vec3(0,0,0); #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 3ba6de8b764f254473c430abbd8edaa522bb44d8..236567219bf404a660b1faa188a3aa1c90d1fc74 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -112,53 +112,53 @@ void main() dist /= light[i].w; if (dist <= 1.0) { - float da = dot(norm, lv); + float da = dot(norm, lv); if (da > 0.0) - { - lv = normalize(lv); - da = dot(norm, lv); + { + lv = normalize(lv); + da = dot(norm, lv); - float fa = light_col[i].a+1.0; - float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); - dist_atten *= dist_atten; - dist_atten *= 2.0; + float fa = light_col[i].a+1.0; + float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); + dist_atten *= dist_atten; + dist_atten *= 2.0; - dist_atten *= noise; + dist_atten *= noise; - float lit = da * dist_atten; + float lit = da * dist_atten; - vec3 col = light_col[i].rgb*lit*diff; + vec3 col = light_col[i].rgb*lit*diff; - //vec3 col = vec3(dist2, light_col[i].a, lit); + //vec3 col = vec3(dist2, light_col[i].a, lit); - if (spec.a > 0.0) - { - lit = min(da*6.0, 1.0) * dist_atten; - //vec3 ref = dot(pos+lv, norm); - vec3 h = normalize(lv+npos); - float nh = dot(norm, h); - float nv = dot(norm, npos); - float vh = dot(npos, h); - float sa = nh; - float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; - - float gtdenom = 2 * nh; - float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); + if (spec.a > 0.0) + { + lit = min(da*6.0, 1.0) * dist_atten; + //vec3 ref = dot(pos+lv, norm); + vec3 h = normalize(lv+npos); + float nh = dot(norm, h); + float nv = dot(norm, npos); + float vh = dot(npos, h); + float sa = nh; + float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + + float gtdenom = 2 * nh; + float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); - if (nh > 0.0) - { - float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); - col += lit*scol*light_col[i].rgb*spec.rgb; - //col += spec.rgb; - } + if (nh > 0.0) + { + float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); + col += lit*scol*light_col[i].rgb*spec.rgb; + //col += spec.rgb; } - - out_col += col; } + + out_col += col; } } + } + - frag_color.rgb = out_col; frag_color.a = 0.0; } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 2020e8691bdbf6615d7b3e1275dd6380d5464487..8d8a6c9dde2bee4074dae24eb82daf56f27360ad 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -22,7 +22,7 @@ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ - + #extension GL_ARB_texture_rectangle : enable #extension GL_ARB_shader_texture_lod : enable diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 72c46e240de72815238d8c64fa3b8b3bf6af6d18..1c3ad49a21c8c51899afa7865084f7249041edc2 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -187,9 +187,9 @@ void main() color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999); vec4 pos = vary_position; - + color.rgb += spec * specular; - + color.rgb = atmosTransport(color.rgb); color.rgb = scaleSoftClip(color.rgb); color.a = spec * sunAngle2; diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl deleted file mode 100755 index 9670d593996286f1cfa749b88943a68663adadb7..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedF.glsl +++ /dev/null @@ -1,235 +0,0 @@ -/** - * @file alphaF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DRect depthMap; -uniform sampler2D diffuseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 screen_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; -VARYING vec4 vertex_color; -VARYING vec3 vary_norm; - -uniform vec2 shadow_res; -uniform float shadow_bias; - -uniform mat4 inv_proj; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ - float a = pow(max(dot(n,l),0.0), 0.7); - return vec3(a,a,a); -} - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(pow(dot(n, lv), 0.7), 0.0); - } - - return vec3(da,da,da); -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos.xyz /= pos.w; - pos.w = 1.0; - return pos; -} - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) -{ - stc.xyz /= stc.w; - stc.z += shadow_bias; - - stc.x = floor(stc.x*shadow_res.x + fract(stc.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here - - float cs = shadow2D(shadowMap, stc.xyz).x; - float shadow = cs; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - - return shadow*0.2; -} - - -void main() -{ - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - float shadow = 0.0; - vec4 pos = vec4(vary_position, 1.0); - - vec4 spos = pos; - - if (spos.z > -shadow_clip.w) - { - vec4 lpos; - - vec4 near_split = shadow_clip*-0.75; - vec4 far_split = shadow_clip*-1.25; - vec4 transition_domain = near_split-far_split; - float weight = 0.0; - - if (spos.z < near_split.z) - { - lpos = shadow_matrix[3]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; - shadow += pcfShadow(shadowMap3, lpos)*w; - weight += w; - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); - } - - if (spos.z < near_split.y && spos.z > far_split.z) - { - lpos = shadow_matrix[2]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; - w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; - shadow += pcfShadow(shadowMap2, lpos)*w; - weight += w; - } - - if (spos.z < near_split.x && spos.z > far_split.y) - { - lpos = shadow_matrix[1]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; - w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; - shadow += pcfShadow(shadowMap1, lpos)*w; - weight += w; - } - - if (spos.z > far_split.x) - { - lpos = shadow_matrix[0]*spos; - - float w = 1.0; - w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; - - shadow += pcfShadow(shadowMap0, lpos)*w; - weight += w; - } - - - shadow /= weight; - - } - else - { - shadow = 1.0; - } - vec3 n = vary_norm; - vec3 l = light_position[0].xyz; - vec3 dlight = calcDirectionalLight(n, l); - dlight = dlight * vary_directional.rgb * vary_pointlight_col; - vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); - - vec4 col = vec4(vary_ambient + dlight*shadow, vertex_color.a); - vec4 color = diff * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - vec3 light_col = vec3(0,0,0); - - #define LIGHT_LOOP(i) \ - light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); - - LIGHT_LOOP(1) - LIGHT_LOOP(2) - LIGHT_LOOP(3) - LIGHT_LOOP(4) - LIGHT_LOOP(5) - LIGHT_LOOP(6) - LIGHT_LOOP(7) - - color.rgb += diff.rgb * vary_pointlight_col * light_col; - - frag_color = color; -} - diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl deleted file mode 100755 index fae279fba059578e1cd6b2e0bc2c07852fb94212..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaNonIndexedNoColorF.glsl +++ /dev/null @@ -1,242 +0,0 @@ -/** - * @file alphaNonIndexedNoColorF.glsl - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2005, 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$ - */ - -#extension GL_ARB_texture_rectangle : enable - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform float minimum_alpha; - -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DRect depthMap; -uniform sampler2D diffuseMap; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 screen_res; - -vec3 atmosLighting(vec3 light); -vec3 scaleSoftClip(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; -VARYING vec2 vary_texcoord0; -VARYING vec3 vary_norm; - -uniform vec2 shadow_res; - -uniform float shadow_bias; - -uniform mat4 inv_proj; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -vec3 calcDirectionalLight(vec3 n, vec3 l) -{ - float a = pow(max(dot(n,l),0.0), 0.7); - return vec3(a, a, a); -} - -vec3 calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(pow(dot(n, lv), 0.7), 0.0); - } - - return vec3(da,da,da); -} - -vec4 getPosition(vec2 pos_screen) -{ - float depth = texture2DRect(depthMap, pos_screen.xy).a; - vec2 sc = pos_screen.xy*2.0; - sc /= screen_res; - sc -= vec2(1.0,1.0); - vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); - vec4 pos = inv_proj * ndc; - pos.xyz /= pos.w; - pos.w = 1.0; - return pos; -} - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) -{ - stc.xyz /= stc.w; - stc.z += shadow_bias; - - stc.x = floor(stc.x*shadow_res.x + fract(stc.y*12345))/shadow_res.x; // add some chaotic jitter to X sample pos according to Y to disguise the snapping going on here - float cs = shadow2D(shadowMap, stc.xyz).x; - - float shadow = cs; - - shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; - shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; - - return shadow*0.2; -} - - -void main() -{ - vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; - frag *= screen_res; - - float shadow = 0.0; - vec4 pos = vec4(vary_position, 1.0); - - vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); - - if (diff.a < minimum_alpha) - { - discard; - } - - vec4 spos = pos; - - if (spos.z > -shadow_clip.w) - { - vec4 lpos; - - vec4 near_split = shadow_clip*-0.75; - vec4 far_split = shadow_clip*-1.25; - vec4 transition_domain = near_split-far_split; - float weight = 0.0; - - if (spos.z < near_split.z) - { - lpos = shadow_matrix[3]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; - shadow += pcfShadow(shadowMap3, lpos)*w; - weight += w; - shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); - } - - if (spos.z < near_split.y && spos.z > far_split.z) - { - lpos = shadow_matrix[2]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; - w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; - shadow += pcfShadow(shadowMap2, lpos)*w; - weight += w; - } - - if (spos.z < near_split.x && spos.z > far_split.y) - { - lpos = shadow_matrix[1]*spos; - - float w = 1.0; - w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; - w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; - shadow += pcfShadow(shadowMap1, lpos)*w; - weight += w; - } - - if (spos.z > far_split.x) - { - lpos = shadow_matrix[0]*spos; - - float w = 1.0; - w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; - - shadow += pcfShadow(shadowMap0, lpos)*w; - weight += w; - } - - - shadow /= weight; - } - else - { - shadow = 1.0; - } - vec3 n = vary_norm; - vec3 l = light_position[0].xyz; - vec3 dlight = calcDirectionalLight(n, l); - dlight = dlight * vary_directional.rgb * vary_pointlight_col; - - vec4 col = vec4(vary_ambient + dlight*shadow, 1.0); - vec4 color = diff * col; - - color.rgb = atmosLighting(color.rgb); - - color.rgb = scaleSoftClip(color.rgb); - vec3 light_col = vec3(0,0,0); - - #define LIGHT_LOOP(i) \ - light_col += light_diffuse[i].rgb * calcPointLightOrSpotLight(pos.xyz, vary_norm, light_position[i], light_direction[i], light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); - - LIGHT_LOOP(1) - LIGHT_LOOP(2) - LIGHT_LOOP(3) - LIGHT_LOOP(4) - LIGHT_LOOP(5) - LIGHT_LOOP(6) - LIGHT_LOOP(7) - - color.rgb += diff.rgb * vary_pointlight_col * light_col; - - frag_color = color; -} - diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl deleted file mode 100755 index 7f4d82ecc6a302dc3d2b9b57dc770b8705b9649d..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaSkinnedV.glsl +++ /dev/null @@ -1,156 +0,0 @@ -/** - * @file alphaSkinnedV.glsl - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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 projection_matrix; -uniform mat4 texture_matrix0; -uniform mat4 modelview_matrix; -uniform mat4 modelview_projection_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec3 normal; -ATTRIBUTE vec4 diffuse_color; -ATTRIBUTE vec2 texcoord0; - -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -void calcAtmospherics(vec3 inPositionEye); - -float calcDirectionalLight(vec3 n, vec3 l); -mat4 getObjectSkinnedTransform(); -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); -vec3 scaleDownLight(vec3 light); -vec3 scaleUpLight(vec3 light); - -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_position; -VARYING vec3 vary_pointlight_col; - -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; -VARYING vec3 vary_norm; - -uniform float near_clip; -uniform float shadow_offset; -uniform float shadow_bias; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -float calcDirectionalLight(vec3 n, vec3 l) -{ - float a = max(dot(n,l),0.0); - return a; -} - -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ -//get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(dot(n, lv), 0.0); - } - - return da; -} - -void main() -{ - vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; - - mat4 mat = getObjectSkinnedTransform(); - - mat = modelview_matrix * mat; - - vec3 pos = (mat*vec4(position, 1.0)).xyz; - - gl_Position = projection_matrix * vec4(pos, 1.0); - - vec4 n = vec4(position, 1.0); - n.xyz += normal.xyz; - n.xyz = (mat*n).xyz; - n.xyz = normalize(n.xyz-pos.xyz); - - vec3 norm = n.xyz; - vary_norm = norm; - - float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); - vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; - - calcAtmospherics(pos.xyz); - - //vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.)); - vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a); - - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); - - vary_pointlight_col = col.rgb*diffuse_color.rgb; - - col.rgb = vec3(0,0,0); - - // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); - - vary_ambient = col.rgb*diffuse_color.rgb; - vary_directional.rgb = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a))); - - col.rgb = min(col.rgb*diffuse_color.rgb, 1.0); - - vertex_color = col; - - - - pos.xyz = (modelview_projection_matrix * vec4(position.xyz, 1.0)).xyz; - vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); - -} - diff --git a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl b/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl deleted file mode 100755 index 44aaa98b977e49c6688f7b1ac4cf05db35162463..0000000000000000000000000000000000000000 --- a/indra/newview/app_settings/shaders/class2/deferred/avatarAlphaV.glsl +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @file avatarAlphaV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, 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 projection_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec3 normal; -ATTRIBUTE vec2 texcoord0; - -vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol); -mat4 getSkinnedTransform(); -void calcAtmospherics(vec3 inPositionEye); - -float calcDirectionalLight(vec3 n, vec3 l); -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float is_pointlight); - -vec3 atmosAmbient(vec3 light); -vec3 atmosAffectDirectionalLight(float lightIntensity); -vec3 scaleDownLight(vec3 light); -vec3 scaleUpLight(vec3 light); - -VARYING vec3 vary_position; -VARYING vec3 vary_ambient; -VARYING vec3 vary_directional; -VARYING vec3 vary_fragcoord; -VARYING vec3 vary_pointlight_col; -VARYING vec4 vertex_color; -VARYING vec2 vary_texcoord0; - -uniform vec4 color; - -uniform float near_clip; -uniform float shadow_offset; -uniform float shadow_bias; - -uniform vec4 light_position[8]; -uniform vec3 light_direction[8]; -uniform vec3 light_attenuation[8]; -uniform vec3 light_diffuse[8]; - -float calcDirectionalLight(vec3 n, vec3 l) -{ - float a = max(dot(n,l),0.0); - return a; -} - -float calcPointLightOrSpotLight(vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ - //get light vector - vec3 lv = lp.xyz-v; - - //get distance - float d = dot(lv,lv); - - float da = 0.0; - - if (d > 0.0 && la > 0.0 && fa > 0.0) - { - //normalize light vector - lv = normalize(lv); - - //distance attenuation - float dist2 = d/la; - da = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0); - - // spotlight coefficient. - float spot = max(dot(-ln, lv), is_pointlight); - da *= spot*spot; // GL_SPOT_EXPONENT=2 - - //angular attenuation - da *= max(dot(n, lv), 0.0); - } - - return da; -} - -void main() -{ - vary_texcoord0 = texcoord0; - - vec4 pos; - vec3 norm; - - mat4 trans = getSkinnedTransform(); - vec4 pos_in = vec4(position.xyz, 1.0); - pos.x = dot(trans[0], pos_in); - pos.y = dot(trans[1], pos_in); - pos.z = dot(trans[2], pos_in); - pos.w = 1.0; - - norm.x = dot(trans[0].xyz, normal); - norm.y = dot(trans[1].xyz, normal); - norm.z = dot(trans[2].xyz, normal); - norm = normalize(norm); - - gl_Position = projection_matrix * pos; - - float dp_directional_light = max(0.0, dot(norm, light_position[0].xyz)); - vary_position = pos.xyz + light_position[0].xyz * (1.0-dp_directional_light)*shadow_offset; - - calcAtmospherics(pos.xyz); - - vec4 col = vec4(0.0, 0.0, 0.0, 1.0); - - // Collect normal lights - col.rgb += light_diffuse[2].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[2], light_direction[2], light_attenuation[2].x, light_attenuation[2].y, light_attenuation[2].z); - col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].y, light_attenuation[3].z); - col.rgb += light_diffuse[4].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[4], light_direction[4], light_attenuation[4].x, light_attenuation[4].y, light_attenuation[4].z); - col.rgb += light_diffuse[5].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[5], light_direction[5], light_attenuation[5].x, light_attenuation[5].y, light_attenuation[5].z); - col.rgb += light_diffuse[6].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[6], light_direction[6], light_attenuation[6].x, light_attenuation[6].y, light_attenuation[6].z); - col.rgb += light_diffuse[7].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[7], light_direction[7], light_attenuation[7].x, light_attenuation[7].y, light_attenuation[7].z); - - vary_pointlight_col = col.rgb*color.rgb; - - col.rgb = vec3(0,0,0); - - // Add windlight lights - col.rgb = atmosAmbient(vec3(0.)); - - vary_ambient = col.rgb*color.rgb; - vary_directional = atmosAffectDirectionalLight(max(calcDirectionalLight(norm, light_position[0].xyz), 0.0)); - - col.rgb = col.rgb*color.rgb; - - vertex_color = col; - - - vary_fragcoord.xyz = pos.xyz + vec3(0,0,near_clip); -} - - diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index cc34285d65f2745deb2b73e737821ca432f7632e..1022c23f7b536c81adb6e3409eb925bf003008a1 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -468,7 +468,7 @@ void main() envIntensity); } - + if (norm.w < 0.5) { col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a); @@ -486,7 +486,7 @@ void main() //col = vec3(1,0,1); //col.g = envIntensity; } - + frag_color.rgb = col; frag_color.a = bloom; } diff --git a/indra/newview/app_settings/toolbars.xml b/indra/newview/app_settings/toolbars.xml index 29c019719dea0a42cb9bf1c41491345c877a48cc..86f99128156335e29c9951d10754a7541094062e 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/gpu_table.txt b/indra/newview/gpu_table.txt index 122577b13236c49e45a0a127c2cac60b6245b307..8efc4ee87da47f64b5fa244469367eea7121c7cb 100755 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -1,3 +1,4 @@ +//GPU_TABLE - that token on line 1 tags this as a gpu table file // // Categorizes graphics chips into various classes by name // @@ -21,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. @@ -34,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 @@ -46,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 @@ -73,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 @@ -127,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 @@ -172,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 @@ -186,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 @@ -194,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 @@ -201,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 @@ -223,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 @@ -235,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 @@ -252,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 @@ -281,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 @@ -298,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 @@ -485,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 @@ -494,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 @@ -512,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 @@ -558,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 8a6114f0d5736c8c0bcf3e0eac16246d00cb0145..dd316cdbdf420ca77d9947d5baa8fd9d10a7c8c0 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 @@ -720,7 +711,6 @@ ShowUninstDetails show Section Uninstall ; Start with some default values. -StrCpy $INSTFLAGS "" StrCpy $INSTPROG "${INSTNAME}" StrCpy $INSTEXE "${INSTEXE}" StrCpy $INSTSHORTCUT "${SHORTCUT}" @@ -919,7 +909,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}" @@ -966,7 +955,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 +974,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 +985,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 +997,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 f4ce3c9118c216d9c6c5de7c2ad97e99ac3dceb8..79da9e5873112b5e5951070f92ee42bcaf7359ac 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -91,6 +91,7 @@ #include "llwindow.h" #include "llworld.h" #include "llworldmap.h" +#include "lscript_byteformat.h" #include "stringize.h" #include "boost/foreach.hpp" @@ -1091,10 +1092,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(); } @@ -3059,6 +3068,55 @@ void LLAgent::sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request) sendReliableMessage(); } +// Send a message to the region to stop the NULL animation state +// This will reset animation state overrides for the agent. +void LLAgent::sendAnimationStateReset() +{ + if (gAgentID.isNull() || !mRegionp) + { + return; + } + + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_AgentAnimation); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, getID()); + msg->addUUIDFast(_PREHASH_SessionID, getSessionID()); + + msg->nextBlockFast(_PREHASH_AnimationList); + msg->addUUIDFast(_PREHASH_AnimID, LLUUID::null ); + msg->addBOOLFast(_PREHASH_StartAnim, FALSE); + + msg->nextBlockFast(_PREHASH_PhysicalAvatarEventList); + msg->addBinaryDataFast(_PREHASH_TypeData, NULL, 0); + sendReliableMessage(); +} + + +// Send a message to the region to revoke sepecified permissions on ALL scripts in the region +// If the target is an object in the region, permissions in scripts on that object are cleared. +// If it is the region ID, all scripts clear the permissions for this agent +void LLAgent::sendRevokePermissions(const LLUUID & target, U32 permissions) +{ + // Currently only the bits for SCRIPT_PERMISSION_TRIGGER_ANIMATION and SCRIPT_PERMISSION_OVERRIDE_ANIMATIONS + // are supported by the server. Sending any other bits will cause the message to be dropped without changing permissions + + if (gAgentID.notNull() && gMessageSystem) + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessageFast(_PREHASH_RevokePermissions); + msg->nextBlockFast(_PREHASH_AgentData); + msg->addUUIDFast(_PREHASH_AgentID, getID()); // Must be our ID + msg->addUUIDFast(_PREHASH_SessionID, getSessionID()); + + msg->nextBlockFast(_PREHASH_Data); + msg->addUUIDFast(_PREHASH_ObjectID, target); // Must be in the region + msg->addS32Fast(_PREHASH_ObjectPermissions, (S32) permissions); + + sendReliableMessage(); + } +} + void LLAgent::sendWalkRun(bool running) { LLMessageSystem* msgsys = gMessageSystem; @@ -4137,6 +4195,8 @@ void LLAgent::stopCurrentAnimations() // avatar, propagating this change back to the server. if (isAgentAvatarValid()) { + LLDynamicArray<LLUUID> anim_ids; + for ( LLVOAvatar::AnimIterator anim_it = gAgentAvatarp->mPlayingAnimations.begin(); anim_it != gAgentAvatarp->mPlayingAnimations.end(); @@ -4154,7 +4214,24 @@ void LLAgent::stopCurrentAnimations() // stop this animation locally gAgentAvatarp->stopMotion(anim_it->first, TRUE); // ...and tell the server to tell everyone. - sendAnimationRequest(anim_it->first, ANIM_REQUEST_STOP); + anim_ids.push_back(anim_it->first); + } + } + + sendAnimationRequests(anim_ids, ANIM_REQUEST_STOP); + + // Tell the region to clear any animation state overrides + sendAnimationStateReset(); + + // Revoke all animation permissions + if (mRegionp && + gSavedSettings.getBOOL("RevokePermsOnStopAnimation")) + { + U32 permissions = LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_TRIGGER_ANIMATION] | LSCRIPTRunTimePermissionBits[SCRIPT_PERMISSION_OVERRIDE_ANIMATIONS]; + sendRevokePermissions(mRegionp->getRegionID(), permissions); + if (gAgentAvatarp->isSitting()) + { // Also stand up, since auto-granted sit animation permission has been revoked + gAgent.standUp(); } } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index f5f26f69d806167afe0ae382c4fccc2998b723d5..7fac17d098b4c1b9e078e4d9090924b462f2c916 100755 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -431,6 +431,9 @@ public: void onAnimStop(const LLUUID& id); void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request); void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request); + void sendAnimationStateReset(); + void sendRevokePermissions(const LLUUID & target, U32 permissions); + void endAnimationUpdateUI(); void unpauseAnimation() { mPauseRequest = NULL; } BOOL getCustomAnim() const { return mCustomAnim; } diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index b9ec304b7eb8eb6996b68bdc1bfe630a8b5d825a..3410a37890505052f86db52601015e878f6f469c 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 dda5dc1fd11560afa2e9cbd56a83309d2371043d..bb48dad14c777545d2ffffb5ac2e60c6ff9f5d96 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 1edbbe2a2e8cf4ca6f49a7a817b99796fc5d7f96..fa810aac76bb6950fd5a3359cf794abe7f1ad5d7 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 30476b3d2267b42972a7ed0a463250731dd49816..91251ed7c03626d190675c23f7a9adfb60ddff76 100644 --- a/indra/newview/llappdelegate-objc.mm +++ b/indra/newview/llappdelegate-objc.mm @@ -54,6 +54,19 @@ } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageUpdated) name:@"NSTextInputContextKeyboardSelectionDidChangeNotification" object:nil]; + + [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; +} + +- (void) handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { + NSString *url= nil; + url = [[[[NSAppleEventManager sharedAppleEventManager]// 1 + currentAppleEvent]// 2 + paramDescriptorForKeyword:keyDirectObject]// 3 + stringValue];// 4 + + const char* url_utf8 = [url UTF8String]; + handleUrl(url_utf8); } - (void) applicationDidBecomeActive:(NSNotification *)notification diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index fd9236c8b384cf6403edb779c320396cc1a80e04..da1609297e434fe036d0f6a135786b7f4722ebe9 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 46252afbde14799662de45582dbf63150c1f819d..5ec80f1cf086d17956ca43e1a3e11571267b9c53 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 02eb67bf8092a645965f6aa66a478f6aecdce689..539d186441030cd76bae280490ac785472205988 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -96,6 +96,7 @@ #include "llupdaterservice.h" #include "llfloatertexturefetchdebugger.h" #include "llspellcheck.h" +#include "llavatarrenderinfoaccountant.h" // Linden library includes #include "llavatarnamecache.h" @@ -222,6 +223,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 @@ -570,7 +575,7 @@ static void settings_to_globals() LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize")); LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile"); - + LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO"); LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); LLImageGL::sCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures"); LLVOVolume::sLODFactor = gSavedSettings.getF32("RenderVolumeLODFactor"); @@ -695,6 +700,7 @@ LLAppViewer::LLAppViewer() : LLAppViewer::~LLAppViewer() { delete mSettingsLocationList; + LLViewerEventRecorder::instance().~LLViewerEventRecorder(); LLLoginInstance::instance().setUpdaterService(0); @@ -1637,6 +1643,8 @@ bool LLAppViewer::cleanup() //ditch LLVOAvatarSelf instance gAgentAvatarp = NULL; + LLNotifications::instance().clear(); + // workaround for DEV-35406 crash on shutdown LLEventPumps::instance().reset(); @@ -2247,13 +2255,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; } @@ -2282,7 +2290,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 @@ -2296,7 +2304,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; } } } @@ -2392,8 +2400,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 @@ -2457,8 +2463,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 @@ -2474,8 +2480,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"); @@ -2483,8 +2489,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"); @@ -2572,9 +2578,13 @@ bool LLAppViewer::initConfiguration() } } + if (clp.hasOption("logevents")) { + LLViewerEventRecorder::instance().setEventLoggingOn(); + } + std::string CmdLineChannel(gSavedSettings.getString("CmdLineChannel")); if(! CmdLineChannel.empty()) - { + { LLVersionInfo::resetChannel(CmdLineChannel); } @@ -2586,16 +2596,16 @@ bool LLAppViewer::initConfiguration() LLFastTimer::sLog = TRUE; LLFastTimer::sLogName = std::string("performance"); } - + 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")) { @@ -2604,14 +2614,14 @@ bool LLAppViewer::initConfiguration() // that value for validity. U32 graphicslevel = gSavedSettings.getU32("RenderQualityPerformance"); if (LLFeatureManager::instance().isValidGraphicsLevel(graphicslevel)) - { + { // graphicslevel is valid: save it and engage it later. Capture // the requested value separately from the settings variable // because, if this is the first run, LLViewerWindow's constructor // will call LLFeatureManager::applyRecommendedSettings(), which // overwrites this settings variable! mForceGraphicsLevel = graphicslevel; - } + } } LLFastTimerView::sAnalyzePerformance = gSavedSettings.getBOOL("AnalyzePerformance"); @@ -2642,16 +2652,32 @@ 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()) @@ -2792,7 +2818,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 @@ -3176,7 +3202,7 @@ bool LLAppViewer::initWindow() LLFeatureManager::getInstance()->setGraphicsLevel(*mForceGraphicsLevel, false); gSavedSettings.setU32("RenderQualityPerformance", *mForceGraphicsLevel); } - + // Set this flag in case we crash while initializing GL gSavedSettings.setBOOL("RenderInitError", TRUE); gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE ); @@ -4821,6 +4847,9 @@ void LLAppViewer::idle() gObjectList.updateApparentAngles(gAgent); } + // Update AV render info + LLAvatarRenderInfoAccountant::idle(); + { LLFastTimer t(FTM_AUDIO_UPDATE); diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 316c90d9d2484ce308e3f41b33e67d651eb0c10b..2723f0b90d5affe705c33d0b66863cdbc6587c31 100755 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -483,41 +483,24 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute() return (mute != 0); } -OSErr AEGURLHandler(const AppleEvent *messagein, AppleEvent *reply, long refIn) +void handleUrl(const char* url_utf8) { - OSErr result = noErr; - DescType actualType; - char buffer[1024]; // Flawfinder: ignore - Size size; - - result = AEGetParamPtr ( - messagein, - keyDirectObject, - typeCString, - &actualType, - (Ptr)buffer, - sizeof(buffer), - &size); - - if(result == noErr) - { - std::string url = buffer; + if (url_utf8) + { + std::string url = url_utf8; + // Safari 3.2 silently mangles secondlife:///app/ URLs into + // secondlife:/app/ (only one leading slash). + // Fix them up to meet the URL specification. JC + const std::string prefix = "secondlife:/app/"; + std::string test_prefix = url.substr(0, prefix.length()); + LLStringUtil::toLower(test_prefix); + if (test_prefix == prefix) + { + url.replace(0, prefix.length(), "secondlife:///app/"); + } - // Safari 3.2 silently mangles secondlife:///app/ URLs into - // secondlife:/app/ (only one leading slash). - // Fix them up to meet the URL specification. JC - const std::string prefix = "secondlife:/app/"; - std::string test_prefix = url.substr(0, prefix.length()); - LLStringUtil::toLower(test_prefix); - if (test_prefix == prefix) - { - url.replace(0, prefix.length(), "secondlife:///app/"); - } - - LLMediaCtrl* web = NULL; - const bool trusted_browser = false; - LLURLDispatcher::dispatch(url, "", web, trusted_browser); - } - - return(result); + LLMediaCtrl* web = NULL; + const bool trusted_browser = false; + LLURLDispatcher::dispatch(url, "", web, trusted_browser); + } } diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 3cf3c739d942b27a3205027018ce8526bcae6491..80a80f42989bc155bbd758064a66005a5dafb346 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 diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp index 1d72397cbc1d4d22c215b29c57bee20348876659..dd9354fe3a8b7d8f31a62ef83024a2fab509fafd 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 b513a52ff7c56c360c3f04af6edfdd900bb16201..70cc48f12b8fddef99008917a2e341295eee5e3f 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 6e1198cd09885b89f2b3d6c268f74558b410eef4..403414558e22943fa06bd92ac8beaf18db31b0a0 100755 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -110,6 +110,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. */ diff --git a/indra/newview/llavatarrenderinfoaccountant.cpp b/indra/newview/llavatarrenderinfoaccountant.cpp new file mode 100644 index 0000000000000000000000000000000000000000..77d734cbfe3ee73f2ef099881b26abf69a8ace8b --- /dev/null +++ b/indra/newview/llavatarrenderinfoaccountant.cpp @@ -0,0 +1,398 @@ +/** + * @file llavatarrenderinfoaccountant.cpp + * @author Dave Simmons + * @date 2013-02-28 + * @brief + * + * $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$ + */ + +// Precompiled header +#include "llviewerprecompiledheaders.h" +// associated header +#include "llavatarrenderinfoaccountant.h" +// STL headers +// std headers +// external library headers +// other Linden headers +#include "llcharacter.h" +#include "llhttpclient.h" +#include "lltimer.h" +#include "llviewercontrol.h" +#include "llviewermenu.h" +#include "llviewerobjectlist.h" +#include "llviewerregion.h" +#include "llvoavatar.h" +#include "llworld.h" + + +static const std::string KEY_AGENTS = "agents"; // map +static const std::string KEY_WEIGHT = "weight"; // integer + +static const std::string KEY_IDENTIFIER = "identifier"; +static const std::string KEY_MESSAGE = "message"; +static const std::string KEY_ERROR = "error"; + + +// Send data updates about once per minute, only need per-frame resolution +LLFrameTimer LLAvatarRenderInfoAccountant::sRenderInfoReportTimer; + + +// HTTP responder class for GET request for avatar render weight information +class LLAvatarRenderInfoGetResponder : public LLHTTPClient::Responder +{ +public: + LLAvatarRenderInfoGetResponder(U64 region_handle) : mRegionHandle(region_handle) + { + } + + virtual void error(U32 statusNum, const std::string& reason) + { + LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); + if (regionp) + { + llwarns << "HTTP error result for avatar weight GET: " << statusNum + << ", " << reason + << " returned by region " << regionp->getName() + << llendl; + } + else + { + llwarns << "Avatar render weight GET error recieved but region not found for " + << mRegionHandle + << ", error " << statusNum + << ", " << reason + << llendl; + } + + } + + virtual void result(const LLSD& content) + { + LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); + if (regionp) + { + if (LLAvatarRenderInfoAccountant::logRenderInfo()) + { + llinfos << "LRI: Result for avatar weights request for region " << regionp->getName() << ":" << llendl; + } + + if (content.isMap()) + { + if (content.has(KEY_AGENTS)) + { + const LLSD & agents = content[KEY_AGENTS]; + if (agents.isMap()) + { + LLSD::map_const_iterator report_iter = agents.beginMap(); + while (report_iter != agents.endMap()) + { + LLUUID target_agent_id = LLUUID(report_iter->first); + const LLSD & agent_info_map = report_iter->second; + LLViewerObject* avatarp = gObjectList.findObject(target_agent_id); + if (avatarp && + avatarp->isAvatar() && + agent_info_map.isMap()) + { // Extract the data for this avatar + + if (LLAvatarRenderInfoAccountant::logRenderInfo()) + { + llinfos << "LRI: Agent " << target_agent_id + << ": " << agent_info_map << llendl; + } + + if (agent_info_map.has(KEY_WEIGHT)) + { + ((LLVOAvatar *) avatarp)->setReportedVisualComplexity(agent_info_map[KEY_WEIGHT].asInteger()); + } + } + report_iter++; + } + } + } // has "agents" + else if (content.has(KEY_ERROR)) + { + const LLSD & error = content[KEY_ERROR]; + llwarns << "Avatar render info GET error: " + << error[KEY_IDENTIFIER] + << ": " << error[KEY_MESSAGE] + << " from region " << regionp->getName() + << llendl; + } + } + } + else + { + llinfos << "Avatar render weight info recieved but region not found for " + << mRegionHandle << llendl; + } + } + +private: + U64 mRegionHandle; +}; + + +// HTTP responder class for POST request for avatar render weight information +class LLAvatarRenderInfoPostResponder : public LLHTTPClient::Responder +{ +public: + LLAvatarRenderInfoPostResponder(U64 region_handle) : mRegionHandle(region_handle) + { + } + + virtual void error(U32 statusNum, const std::string& reason) + { + LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); + if (regionp) + { + llwarns << "HTTP error result for avatar weight POST: " << statusNum + << ", " << reason + << " returned by region " << regionp->getName() + << llendl; + } + else + { + llwarns << "Avatar render weight POST error recieved but region not found for " + << mRegionHandle + << ", error " << statusNum + << ", " << reason + << llendl; + } + } + + virtual void result(const LLSD& content) + { + LLViewerRegion * regionp = LLWorld::getInstance()->getRegionFromHandle(mRegionHandle); + if (regionp) + { + if (LLAvatarRenderInfoAccountant::logRenderInfo()) + { + llinfos << "LRI: Result for avatar weights POST for region " << regionp->getName() + << ": " << content << llendl; + } + + if (content.isMap()) + { + if (content.has(KEY_ERROR)) + { + const LLSD & error = content[KEY_ERROR]; + llwarns << "Avatar render info POST error: " + << error[KEY_IDENTIFIER] + << ": " << error[KEY_MESSAGE] + << " from region " << regionp->getName() + << llendl; + } + } + } + else + { + llinfos << "Avatar render weight POST result recieved but region not found for " + << mRegionHandle << llendl; + } + } + +private: + U64 mRegionHandle; +}; + + +// static +// Send request for one region, no timer checks +void LLAvatarRenderInfoAccountant::sendRenderInfoToRegion(LLViewerRegion * regionp) +{ + std::string url = regionp->getCapability("AvatarRenderInfo"); + if (!url.empty()) + { + if (logRenderInfo()) + { + llinfos << "LRI: Sending avatar render info to region " + << regionp->getName() + << " from " << url + << llendl; + } + + // Build the render info to POST to the region + LLSD report = LLSD::emptyMap(); + LLSD agents = LLSD::emptyMap(); + + std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); + while( iter != LLCharacter::sInstances.end() ) + { + LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*iter); + if (avatar && + avatar->getRezzedStatus() >= 2 && // Mostly rezzed (maybe without baked textures downloaded) + !avatar->isDead() && // Not dead yet + avatar->getObjectHost() == regionp->getHost()) // Ensure it's on the same region + { + avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date + + LLSD info = LLSD::emptyMap(); + if (avatar->getVisualComplexity() > 0) + { + info[KEY_WEIGHT] = avatar->getVisualComplexity(); + agents[avatar->getID().asString()] = info; + + if (logRenderInfo()) + { + llinfos << "LRI: Sending avatar render info for " << avatar->getID() + << ": " << info << llendl; + llinfos << "LRI: geometry " << avatar->getAttachmentGeometryBytes() + << ", area " << avatar->getAttachmentSurfaceArea() + << llendl; + } + } + } + iter++; + } + + report[KEY_AGENTS] = agents; + if (agents.size() > 0) + { + LLHTTPClient::post(url, report, new LLAvatarRenderInfoPostResponder(regionp->getHandle())); + } + } +} + + + + +// static +// Send request for one region, no timer checks +void LLAvatarRenderInfoAccountant::getRenderInfoFromRegion(LLViewerRegion * regionp) +{ + std::string url = regionp->getCapability("AvatarRenderInfo"); + if (!url.empty()) + { + if (logRenderInfo()) + { + llinfos << "LRI: Requesting avatar render info for region " + << regionp->getName() + << " from " << url + << llendl; + } + + // First send a request to get the latest data + LLHTTPClient::get(url, new LLAvatarRenderInfoGetResponder(regionp->getHandle())); + } +} + + +// static +// Called every frame - send render weight requests to every region +void LLAvatarRenderInfoAccountant::idle() +{ + if (sRenderInfoReportTimer.hasExpired()) + { + const F32 SECS_BETWEEN_REGION_SCANS = 5.f; // Scan the region list every 5 seconds + const F32 SECS_BETWEEN_REGION_REQUEST = 60.0; // Update each region every 60 seconds + + S32 num_avs = LLCharacter::sInstances.size(); + + if (logRenderInfo()) + { + llinfos << "LRI: Scanning all regions and checking for render info updates" + << llendl; + } + + // Check all regions and see if it's time to fetch/send data + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); ++iter) + { + LLViewerRegion* regionp = *iter; + if (regionp && + regionp->isAlive() && + regionp->capabilitiesReceived() && // Region has capability URLs available + regionp->getRenderInfoRequestTimer().hasExpired()) // Time to make request + { + sendRenderInfoToRegion(regionp); + getRenderInfoFromRegion(regionp); + + // Reset this regions timer, moving to longer intervals if there are lots of avatars around + regionp->getRenderInfoRequestTimer().resetWithExpiry(SECS_BETWEEN_REGION_REQUEST + (2.f * num_avs)); + } + } + + // We scanned all the regions, reset the request timer. + sRenderInfoReportTimer.resetWithExpiry(SECS_BETWEEN_REGION_SCANS); + } + + 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) + { + prev_render_auto_mute_functions = render_auto_mute_functions; + + // Adjust menus + BOOL show_items = (BOOL)(render_auto_mute_functions & 0x04); + gMenuAvatarOther->setItemVisible( std::string("Normal"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Always use impostor"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Never use impostor"), show_items); + gMenuAvatarOther->setItemVisible( std::string("Impostor seperator"), show_items); + + gMenuAttachmentOther->setItemVisible( std::string("Normal"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Always use impostor"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Never use impostor"), show_items); + gMenuAttachmentOther->setItemVisible( std::string("Impostor seperator"), show_items); + + if (!show_items) + { // Turning off visual muting + for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); + iter != LLCharacter::sInstances.end(); ++iter) + { // Make sure all AVs have the setting cleared + LLVOAvatar* inst = (LLVOAvatar*) *iter; + inst->setCachedVisualMute(false); + } + } + } +} + + +// static +// Make sRenderInfoReportTimer expire so the next call to idle() will scan and query a new region +// called via LLViewerRegion::setCapabilitiesReceived() boost signals when the capabilities +// are returned for a new LLViewerRegion, and is the earliest time to get render info +void LLAvatarRenderInfoAccountant::expireRenderInfoReportTimer(const LLUUID& region_id) +{ + if (logRenderInfo()) + { + llinfos << "LRI: Viewer has new region capabilities, clearing global render info timer" + << " and timer for region " << region_id + << llendl; + } + + // Reset the global timer so it will scan regions immediately + sRenderInfoReportTimer.reset(); + + LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id); + if (regionp) + { // Reset the region's timer so it will request data immediately + regionp->getRenderInfoRequestTimer().reset(); + } +} + +// static +bool LLAvatarRenderInfoAccountant::logRenderInfo() +{ + static LLCachedControl<bool> render_mute_logging_enabled(gSavedSettings, "RenderAutoMuteLogging", false); + return render_mute_logging_enabled; +} diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h new file mode 100644 index 0000000000000000000000000000000000000000..d68f2dccfbdd8f7cb140bf54ec328c769c5d1aaa --- /dev/null +++ b/indra/newview/llavatarrenderinfoaccountant.h @@ -0,0 +1,56 @@ +/** + * @file llavatarrenderinfoaccountant.h + * @author Dave Simmons + * @date 2013-02-28 + * @brief + * + * $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$ + */ + +#if ! defined(LL_llavatarrenderinfoaccountant_H) +#define LL_llavatarrenderinfoaccountant_H + +class LLViewerRegion; + +// Class to gather avatar rendering information +// that is sent to or fetched from regions. +class LLAvatarRenderInfoAccountant +{ +public: + LLAvatarRenderInfoAccountant() {}; + ~LLAvatarRenderInfoAccountant() {}; + + static void sendRenderInfoToRegion(LLViewerRegion * regionp); + static void getRenderInfoFromRegion(LLViewerRegion * regionp); + + static void expireRenderInfoReportTimer(const LLUUID& region_id); + + static void idle(); + + static bool logRenderInfo(); + +private: + // Send data updates about once per minute, only need per-frame resolution + static LLFrameTimer sRenderInfoReportTimer; +}; + +#endif /* ! defined(LL_llavatarrenderinfoaccountant_H) */ diff --git a/indra/newview/llblocklist.cpp b/indra/newview/llblocklist.cpp index 066cb71677a810488557f1594ff32806256c66cd..3849fbeb54b33fd0344b8827518ec1c7077286c7 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 1a215710f463ade3bf5d1f6edee32e808e4761dd..bac79f869e3c068d4fc084e4cbb373a9f534a5b3 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/llchathistory.cpp b/indra/newview/llchathistory.cpp index af3c6eff1169323a9dfe93d24aee41849024d6e4..2eb4074c97bac596dfd1af1ff165d48fa32dd086 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,18 @@ public: { LLAvatarActions::startIM(getAvatarId()); } + else if (level == "teleport") + { + LLAvatarActions::offerTeleport(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 +203,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 +536,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 +546,34 @@ protected: menu->setItemEnabled("Add Friend", false); menu->setItemEnabled("Send IM", false); menu->setItemEnabled("Remove Friend", false); + menu->setItemEnabled("Offer Teleport",false); + menu->setItemEnabled("Voice Call", 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("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); @@ -898,20 +995,10 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL LLStyle::Params link_params(body_message_params); link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); - if (from_me) - { std::string localized_name; - bool is_localized = LLTrans::findString(localized_name, "AgentNameSubst"); - mEditor->appendText((is_localized? localized_name:"(You)") + delimiter, - prependNewLineState, link_params); - prependNewLineState = false; - } - else - { // Add link to avatar's inspector and delimiter to message. - mEditor->appendText(std::string(link_params.link_href) + delimiter, - prependNewLineState, link_params); - prependNewLineState = false; - } + mEditor->appendText(std::string(link_params.link_href) + delimiter, + prependNewLineState, link_params); + prependNewLineState = false; } else { @@ -978,6 +1065,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) { @@ -999,6 +1102,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 88884042d4d0c482f65a1c1e5c1d84d3e483c6fb..131aea9da3890ce3ce24df217ab59b9dd5135dcd 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/llconversationloglist.cpp b/indra/newview/llconversationloglist.cpp index 5ab108b39fbc3279120a71c3933d9bdcd2c44ca2..44212298cf5cb73ac73f525ca3dc9aa9e54d1691 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 192a594c9dfae0e5da55269df1902fd7bb980191..affa24f78cb0c641b77c15295939f48291a031da 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/llconversationmodel.h b/indra/newview/llconversationmodel.h old mode 100755 new mode 100644 diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp old mode 100755 new mode 100644 index 9faa12b2eeade59bba5d8d7797d4c19b318804bb..82d3fe74c00ef264b317f2d2aa69c536f07b8ba7 --- a/indra/newview/llconversationview.cpp +++ b/indra/newview/llconversationview.cpp @@ -267,6 +267,23 @@ 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 +335,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/llconversationview.h b/indra/newview/llconversationview.h old mode 100755 new mode 100644 diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 04e31e648678dc5166db54663a4049c1e1b630c9..714f9a17188dca241b5b7c9f4885d2d622fe7cd9 100755 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -504,6 +504,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba { params.mGroup->rebuildMesh(); } + params.mVertexBuffer->setBuffer(mask); params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index e4ebfea665f72de79bf567e14d389aa5426049be..e27dc279f4e71745708b917e1e67aa36c2683b21 100755 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -379,10 +379,16 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) if (group->mSpatialPartition->mRenderByGroup && !group->isDead()) { - 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. - group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_PARTICLE && - group->mSpatialPartition->mPartitionType != LLViewerRegion::PARTITION_HUD_PARTICLE; + 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. + + static LLFastTimer::DeclareTimer FTM_RENDER_ALPHA_GROUP_LOOP("Alpha Group"); + LLFastTimer t(FTM_RENDER_ALPHA_GROUP_LOOP); + + bool disable_cull = is_particle_or_hud_particle; + LLGLDisable cull(disable_cull ? GL_CULL_FACE : 0); LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[LLRenderPass::PASS_ALPHA]; @@ -570,10 +576,15 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) } } + static LLFastTimer::DeclareTimer FTM_RENDER_ALPHA_PUSH("Alpha Push Verts"); + { + LLFastTimer t(FTM_RENDER_ALPHA_PUSH); + gGL.blendFunc((LLRender::eBlendFactor) params.mBlendFuncSrc, (LLRender::eBlendFactor) params.mBlendFuncDst, mAlphaSFactor, mAlphaDFactor); params.mVertexBuffer->setBuffer(mask & ~(params.mFullbright ? (LLVertexBuffer::MAP_TANGENT | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2) : 0)); params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); + } // If this alpha mesh has glow, then draw it a second time to add the destination-alpha (=glow). Interleaving these state-changing calls could be expensive, but glow must be drawn Z-sorted with alpha. if (current_shader && @@ -608,6 +619,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) } } + gGL.setSceneBlendType(LLRender::BT_ALPHA); + LLVertexBuffer::unbind(); if (!light_enabled) @@ -615,4 +628,3 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass) gPipeline.enableLightsDynamic(); } } - diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 66bbc6819b4fe6737bcebcb362ae41e01757229f..f622d5a63ac820ba26c91027815b308f2e65768e 100755 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -60,6 +60,7 @@ LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL; BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE; BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE; S32 LLDrawPoolAvatar::sDiffuseChannel = 0; +F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f; static bool is_deferred_render = false; @@ -283,7 +284,7 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha() gPipeline.bindDeferredShader(*sVertexProgram); - sVertexProgram->setMinimumAlpha(0.2f); + sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); } @@ -666,7 +667,7 @@ void LLDrawPoolAvatar::beginRigid() if (sVertexProgram != NULL) { //eyeballs render with the specular shader sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(0.2f); + sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); } } else @@ -696,7 +697,7 @@ void LLDrawPoolAvatar::beginDeferredImpostor() specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP); normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL); sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - gPipeline.bindDeferredShader(*sVertexProgram); + sVertexProgram->bind(); sVertexProgram->setMinimumAlpha(0.01f); } @@ -716,7 +717,7 @@ void LLDrawPoolAvatar::beginDeferredRigid() sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(0.2f); + sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); } void LLDrawPoolAvatar::endDeferredRigid() @@ -774,7 +775,7 @@ void LLDrawPoolAvatar::beginSkinned() if (LLGLSLShader::sNoFixedFunction) { - sVertexProgram->setMinimumAlpha(0.2f); + sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); } } @@ -1154,7 +1155,7 @@ void LLDrawPoolAvatar::beginDeferredSkinned() sRenderingSkinned = TRUE; sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(0.2f); + sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); gGL.getTexUnit(0)->activate(); @@ -1463,63 +1464,63 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) } void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face) - { - face->setGeomIndex(0); - face->setIndicesIndex(0); +{ + face->setGeomIndex(0); + face->setIndicesIndex(0); - //rigged faces do not batch textures - face->setTextureIndex(255); + //rigged faces do not batch textures + face->setTextureIndex(255); - if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable()) - { //make a new buffer - if (sShaderLevel > 0) - { - buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); - } - else - { - buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); - } - buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true); + if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable()) + { //make a new buffer + if (sShaderLevel > 0) + { + buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB); } else - { //resize existing buffer - buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices); + { + buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB); } + buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true); + } + else + { //resize existing buffer + buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices); + } - face->setSize(vol_face.mNumVertices, vol_face.mNumIndices); - face->setVertexBuffer(buffer); + face->setSize(vol_face.mNumVertices, vol_face.mNumIndices); + face->setVertexBuffer(buffer); - U16 offset = 0; + U16 offset = 0; - LLMatrix4 mat_vert = skin->mBindShapeMatrix; - glh::matrix4f m((F32*) mat_vert.mMatrix); - m = m.inverse().transpose(); + LLMatrix4 mat_vert = skin->mBindShapeMatrix; + glh::matrix4f m((F32*) mat_vert.mMatrix); + m = m.inverse().transpose(); - F32 mat3[] = - { m.m[0], m.m[1], m.m[2], - m.m[4], m.m[5], m.m[6], - m.m[8], m.m[9], m.m[10] }; + F32 mat3[] = + { m.m[0], m.m[1], m.m[2], + m.m[4], m.m[5], m.m[6], + m.m[8], m.m[9], m.m[10] }; - LLMatrix3 mat_normal(mat3); + LLMatrix3 mat_normal(mat3); - //let getGeometryVolume know if alpha should override shiny - U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture()); + //let getGeometryVolume know if alpha should override shiny + U32 type = gPipeline.getPoolTypeFromTE(face->getTextureEntry(), face->getTexture()); - if (type == LLDrawPool::POOL_ALPHA) - { - face->setPoolType(LLDrawPool::POOL_ALPHA); - } - else - { - face->setPoolType(LLDrawPool::POOL_AVATAR); - } + if (type == LLDrawPool::POOL_ALPHA) + { + face->setPoolType(LLDrawPool::POOL_ALPHA); + } + else + { + face->setPoolType(LLDrawPool::POOL_AVATAR); + } //llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl; - face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true); + face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true); - buffer->flush(); - } + buffer->flush(); +} void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face) { @@ -1723,7 +1724,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) stop_glerror(); - LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette", + LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv(LLViewerShaderMgr::AVATAR_MATRIX, count, FALSE, (GLfloat*) mat[0].mMatrix); @@ -1800,7 +1801,7 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) } } - if (face->mTextureMatrix) + if (face->mTextureMatrix && vobj->mTexAnimMode) { gGL.matrixMode(LLRender::MM_TEXTURE); gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix); @@ -1814,6 +1815,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow) buff->setBuffer(data_mask); buff->drawRange(LLRender::TRIANGLES, start, end, count, offset); } + + gPipeline.addTrianglesDrawn(count, LLRender::TRIANGLES); } } } diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 4fbda1f862b90aa67a98d3d17b8a82b7beb5223e..b9d220405211c0a8119bde65932ebf652dc434f3 100755 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -272,6 +272,7 @@ public: static BOOL sSkipOpaque; static BOOL sSkipTransparent; static S32 sDiffuseChannel; + static F32 sMinimumAlpha; static LLGLSLShader* sVertexProgram; }; diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 155e289c9d1385fd28077a23ab00d0ae411da70f..6b4c5cfca1abce22d1c4e56a41ab1677b8ec11c4 100755 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -461,6 +461,8 @@ void LLDrawPoolBump::unbindCubeMap(LLGLSLShader* shader, S32 shader_level, S32& } } } + // Moved below shader->disableTexture call to avoid false alarms from auto-re-enable of textures on stage 0 + // MAINT-755 cube_map->disable(); cube_map->restoreMatrix(); } @@ -1377,9 +1379,14 @@ void LLBumpImageList::onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLI LLGLDisable blend(GL_BLEND); gGL.setColorMask(TRUE, TRUE); gNormalMapGenProgram.bind(); - gNormalMapGenProgram.uniform1f("norm_scale", gSavedSettings.getF32("RenderNormalMapScale")); - gNormalMapGenProgram.uniform1f("stepX", 1.f/bump->getWidth()); - gNormalMapGenProgram.uniform1f("stepY", 1.f/bump->getHeight()); + + static LLStaticHashedString sNormScale("norm_scale"); + static LLStaticHashedString sStepX("stepX"); + static LLStaticHashedString sStepY("stepY"); + + gNormalMapGenProgram.uniform1f(sNormScale, gSavedSettings.getF32("RenderNormalMapScale")); + gNormalMapGenProgram.uniform1f(sStepX, 1.f/bump->getWidth()); + gNormalMapGenProgram.uniform1f(sStepY, 1.f/bump->getHeight()); LLVector2 v((F32) bump->getWidth()/gPipeline.mScreen.getWidth(), (F32) bump->getHeight()/gPipeline.mScreen.getHeight()); diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 0adb42428d470ea0c717b1bcdecbeb84607eb79c..c3ec23422310786c2176ab2d970709cfd2b49f3f 100755 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -354,8 +354,8 @@ void LLDrawPoolTerrain::renderFullShader() LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; llassert(shader); - shader->uniform4fv("object_plane_s", 1, tp0.mV); - shader->uniform4fv("object_plane_t", 1, tp1.mV); + shader->uniform4fv(LLShaderMgr::OBJECT_PLANE_S, 1, tp0.mV); + shader->uniform4fv(LLShaderMgr::OBJECT_PLANE_T, 1, tp1.mV); gGL.matrixMode(LLRender::MM_TEXTURE); gGL.loadIdentity(); @@ -864,8 +864,8 @@ void LLDrawPoolTerrain::renderSimple() if (LLGLSLShader::sNoFixedFunction) { - sShader->uniform4fv("object_plane_s", 1, tp0.mV); - sShader->uniform4fv("object_plane_t", 1, tp1.mV); + sShader->uniform4fv(LLShaderMgr::OBJECT_PLANE_S, 1, tp0.mV); + sShader->uniform4fv(LLShaderMgr::OBJECT_PLANE_T, 1, tp1.mV); } else { diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index 6774926f62a96f80fd117b6efc46560f254e2e1f..76e89b26e4384776750b99169802448a84e89c39 100755 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -407,8 +407,8 @@ void LLDrawPoolWater::renderOpaqueLegacyWater() } else { - shader->uniform4fv("object_plane_s", 1, tp0); - shader->uniform4fv("object_plane_t", 1, tp1); + shader->uniform4fv(LLShaderMgr::OBJECT_PLANE_S, 1, tp0); + shader->uniform4fv(LLShaderMgr::OBJECT_PLANE_T, 1, tp1); } gGL.diffuseColor3f(1.f, 1.f, 1.f); @@ -524,14 +524,14 @@ void LLDrawPoolWater::shade() if (eyedepth < 0.f && LLPipeline::sWaterReflections) { - if (deferred_render) - { + if (deferred_render) + { shader = &gDeferredUnderWaterProgram; - } + } else - { - shader = &gUnderWaterProgram; - } + { + shader = &gUnderWaterProgram; + } } else if (deferred_render) { @@ -553,7 +553,7 @@ void LLDrawPoolWater::shade() sTime = (F32)LLFrameTimer::getElapsedSeconds()*0.5f; - S32 reftex = shader->enableTexture(LLViewerShaderMgr::WATER_REFTEX); + S32 reftex = shader->enableTexture(LLShaderMgr::WATER_REFTEX); if (reftex > -1) { @@ -584,12 +584,12 @@ void LLDrawPoolWater::shade() mWaterNormp->setFilteringOption(LLTexUnit::TFO_POINT); } - S32 screentex = shader->enableTexture(LLViewerShaderMgr::WATER_SCREENTEX); + S32 screentex = shader->enableTexture(LLShaderMgr::WATER_SCREENTEX); if (screentex > -1) { - shader->uniform4fv(LLViewerShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV); - shader->uniform1f(LLViewerShaderMgr::WATER_FOGDENSITY, + shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV); + shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, param_mgr->getFogDensity()); gPipeline.mWaterDis.bindTexture(0, screentex); } @@ -601,7 +601,7 @@ void LLDrawPoolWater::shade() if (mVertexShaderLevel == 1) { sWaterFogColor.mV[3] = param_mgr->mDensitySliderValue; - shader->uniform4fv(LLViewerShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV); + shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV); } F32 screenRes[] = @@ -609,10 +609,10 @@ void LLDrawPoolWater::shade() 1.f/gGLViewport[2], 1.f/gGLViewport[3] }; - shader->uniform2fv("screenRes", 1, screenRes); + shader->uniform2fv(LLShaderMgr::DEFERRED_SCREEN_RES, 1, screenRes); stop_glerror(); - S32 diffTex = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); + S32 diffTex = shader->enableTexture(LLShaderMgr::DIFFUSE_MAP); stop_glerror(); light_dir.normVec(); @@ -621,26 +621,26 @@ void LLDrawPoolWater::shade() light_diffuse *= 6.f; //shader->uniformMatrix4fv("inverse_ref", 1, GL_FALSE, (GLfloat*) gGLObliqueProjectionInverse.mMatrix); - shader->uniform1f(LLViewerShaderMgr::WATER_WATERHEIGHT, eyedepth); - shader->uniform1f(LLViewerShaderMgr::WATER_TIME, sTime); - shader->uniform3fv(LLViewerShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV); - shader->uniform3fv(LLViewerShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV); - shader->uniform1f(LLViewerShaderMgr::WATER_SPECULAR_EXP, light_exp); - shader->uniform2fv(LLViewerShaderMgr::WATER_WAVE_DIR1, 1, param_mgr->getWave1Dir().mV); - shader->uniform2fv(LLViewerShaderMgr::WATER_WAVE_DIR2, 1, param_mgr->getWave2Dir().mV); - shader->uniform3fv(LLViewerShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV); - - shader->uniform3fv("normScale", 1, param_mgr->getNormalScale().mV); - shader->uniform1f("fresnelScale", param_mgr->getFresnelScale()); - shader->uniform1f("fresnelOffset", param_mgr->getFresnelOffset()); - shader->uniform1f("blurMultiplier", param_mgr->getBlurMultiplier()); + shader->uniform1f(LLShaderMgr::WATER_WATERHEIGHT, eyedepth); + shader->uniform1f(LLShaderMgr::WATER_TIME, sTime); + shader->uniform3fv(LLShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV); + shader->uniform3fv(LLShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV); + shader->uniform1f(LLShaderMgr::WATER_SPECULAR_EXP, light_exp); + shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR1, 1, param_mgr->getWave1Dir().mV); + shader->uniform2fv(LLShaderMgr::WATER_WAVE_DIR2, 1, param_mgr->getWave2Dir().mV); + shader->uniform3fv(LLShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV); + + shader->uniform3fv(LLShaderMgr::WATER_NORM_SCALE, 1, param_mgr->getNormalScale().mV); + shader->uniform1f(LLShaderMgr::WATER_FRESNEL_SCALE, param_mgr->getFresnelScale()); + shader->uniform1f(LLShaderMgr::WATER_FRESNEL_OFFSET, param_mgr->getFresnelOffset()); + shader->uniform1f(LLShaderMgr::WATER_BLUR_MULTIPLIER, param_mgr->getBlurMultiplier()); F32 sunAngle = llmax(0.f, light_dir.mV[2]); F32 scaledAngle = 1.f - sunAngle; - shader->uniform1f("sunAngle", sunAngle); - shader->uniform1f("scaledAngle", scaledAngle); - shader->uniform1f("sunAngle2", 0.1f + 0.2f*sunAngle); + shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE, sunAngle); + shader->uniform1f(LLShaderMgr::WATER_SCALED_ANGLE, scaledAngle); + shader->uniform1f(LLShaderMgr::WATER_SUN_ANGLE2, 0.1f + 0.2f*sunAngle); LLColor4 water_color; LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis(); @@ -648,12 +648,12 @@ void LLDrawPoolWater::shade() if (LLViewerCamera::getInstance()->cameraUnderWater()) { water_color.setVec(1.f, 1.f, 1.f, 0.4f); - shader->uniform1f(LLViewerShaderMgr::WATER_REFSCALE, param_mgr->getScaleBelow()); + shader->uniform1f(LLShaderMgr::WATER_REFSCALE, param_mgr->getScaleBelow()); } else { water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot)); - shader->uniform1f(LLViewerShaderMgr::WATER_REFSCALE, param_mgr->getScaleAbove()); + shader->uniform1f(LLShaderMgr::WATER_REFSCALE, param_mgr->getScaleAbove()); } if (water_color.mV[3] > 0.9f) @@ -696,12 +696,12 @@ void LLDrawPoolWater::shade() } } - shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); - shader->disableTexture(LLViewerShaderMgr::WATER_SCREENTEX); - shader->disableTexture(LLViewerShaderMgr::BUMP_MAP); - shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - shader->disableTexture(LLViewerShaderMgr::WATER_REFTEX); - shader->disableTexture(LLViewerShaderMgr::WATER_SCREENDEPTH); + shader->disableTexture(LLShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP); + shader->disableTexture(LLShaderMgr::WATER_SCREENTEX); + shader->disableTexture(LLShaderMgr::BUMP_MAP); + shader->disableTexture(LLShaderMgr::DIFFUSE_MAP); + shader->disableTexture(LLShaderMgr::WATER_REFTEX); + shader->disableTexture(LLShaderMgr::WATER_SCREENDEPTH); if (deferred_render) { diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 53339222ebef409633c033a9b41786b45b6a9e03..a98d3e6b051a1ea132fdb4677944e034ec356fb8 100755 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -152,7 +152,8 @@ void LLDrawPoolWLSky::renderDome(F32 camHeightLocal, LLGLSLShader * shader) cons gGL.translatef(0.f,-camHeightLocal, 0.f); // Draw WL Sky - shader->uniform3f("camPosLocal", 0.f, camHeightLocal, 0.f); + static LLStaticHashedString sCamPosLocal("camPosLocal"); + shader->uniform3f(sCamPosLocal, 0.f, camHeightLocal, 0.f); gSky.mVOWLSkyp->drawDome(); @@ -207,7 +208,8 @@ void LLDrawPoolWLSky::renderStars(void) const if (LLGLSLShader::sNoFixedFunction) { gCustomAlphaProgram.bind(); - gCustomAlphaProgram.uniform1f("custom_alpha", star_alpha.mV[3]); + static LLStaticHashedString sCustomAlpha("custom_alpha"); + gCustomAlphaProgram.uniform1f(sCustomAlpha, star_alpha.mV[3]); } else { diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 53e5b55b89507b0d4f0cde108ebf1e0b1c8e3a60..ae62be0ad010d88b2c44793b2c3399ede10f3f97 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -52,9 +52,20 @@ #include "llviewerwindow.h" #include "llviewershadermgr.h" #include "llviewertexture.h" +#include "llvoavatar.h" +#if LL_LINUX +// Work-around spurious used before init warning on Vector4a +// +#pragma GCC diagnostic ignored "-Wuninitialized" +#endif + +extern BOOL gGLDebugLoggingEnabled; #define LL_MAX_INDICES_COUNT 1000000 +static LLStaticHashedString sTextureIndexIn("texture_index_in"); +static LLStaticHashedString sColorIn("color_in"); + BOOL LLFace::sSafeRenderSelect = TRUE; // FALSE #define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2]) @@ -318,6 +329,12 @@ void LLFace::dirtyTexture() if (vobj) { vobj->mLODChanged = TRUE; + + LLVOAvatar* avatar = vobj->getAvatar(); + if (avatar) + { //avatar render cost may have changed + avatar->updateVisualComplexity(); + } } gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE); } @@ -821,21 +838,21 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, { v[i].setSelectWithMask(mask[i], min, max); } - + LLVector4a tv[8]; - + //transform bounding box into drawable space for (U32 i = 0; i < 8; ++i) { mat_vert.affineTransform(v[i], tv[i]); } - + //find bounding box LLVector4a& newMin = mExtents[0]; LLVector4a& newMax = mExtents[1]; - + newMin = newMax = tv[0]; - + for (U32 i = 1; i < 8; ++i) { newMin.setMin(newMin, tv[i]); @@ -851,11 +868,11 @@ BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f, } LLVector4a t; - t.setAdd(newMin, newMax); + t.setAdd(newMin,newMax); t.mul(0.5f); mCenterLocal.set(t.getF32ptr()); - + t.setSub(newMax,newMin); mBoundingSphereRadius = t.getLength3().getF32()*0.5f; @@ -1139,6 +1156,15 @@ static LLFastTimer::DeclareTimer FTM_FACE_GEOM_COLOR("Color"); static LLFastTimer::DeclareTimer FTM_FACE_GEOM_EMISSIVE("Emissive"); static LLFastTimer::DeclareTimer FTM_FACE_GEOM_WEIGHTS("Weights"); static LLFastTimer::DeclareTimer FTM_FACE_GEOM_TANGENT("Binormal"); + +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK("Face Feedback"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_POSITION("Feedback Position"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_NORMAL("Feedback Normal"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_TEXTURE("Feedback Texture"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_COLOR("Feedback Color"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_EMISSIVE("Feedback Emissive"); +static LLFastTimer::DeclareTimer FTM_FACE_GEOM_FEEDBACK_BINORMAL("Feedback Binormal"); + static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX("Index"); static LLFastTimer::DeclareTimer FTM_FACE_GEOM_INDEX_TAIL("Tail"); static LLFastTimer::DeclareTimer FTM_FACE_POSITION_STORE("Pos"); @@ -1360,16 +1386,19 @@ 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 && + mVertexBuffer->getUsage() == GL_DYNAMIC_COPY_ARB && gTransformPositionProgram.mProgramObject && //transform shaders are loaded mVertexBuffer->useVBOs() && //target buffer is in VRAM !rebuild_weights && //TODO: add support for weights !volume.isUnique()) //source volume is NOT flexi { //use transform feedback to pack vertex buffer - + //gGLDebugLoggingEnabled = TRUE; + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK); + LLGLEnable discard(GL_RASTERIZER_DISCARD); LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get(); if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices) @@ -1386,7 +1415,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_pos) { - LLFastTimer t(FTM_FACE_GEOM_POSITION); + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_POSITION); gTransformPositionProgram.bind(); mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount); @@ -1400,7 +1429,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, vp[2] = 0; vp[3] = 0; - gTransformPositionProgram.uniform1i("texture_index_in", val); + gTransformPositionProgram.uniform1i(sTextureIndexIn, val); glBeginTransformFeedback(GL_POINTS); buff->setBuffer(LLVertexBuffer::MAP_VERTEX); @@ -1411,14 +1440,14 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_color) { - LLFastTimer t(FTM_FACE_GEOM_COLOR); + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_COLOR); gTransformColorProgram.bind(); mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount); S32 val = *((S32*) color.mV); - gTransformColorProgram.uniform1i("color_in", val); + gTransformColorProgram.uniform1i(sColorIn, val); glBeginTransformFeedback(GL_POINTS); buff->setBuffer(LLVertexBuffer::MAP_VERTEX); push_for_transform(buff, vf.mNumVertices, mGeomCount); @@ -1427,7 +1456,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_emissive) { - LLFastTimer t(FTM_FACE_GEOM_EMISSIVE); + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_EMISSIVE); gTransformColorProgram.bind(); mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount); @@ -1439,7 +1468,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, (glow << 16) | (glow << 24); - gTransformColorProgram.uniform1i("color_in", glow32); + gTransformColorProgram.uniform1i(sColorIn, glow32); glBeginTransformFeedback(GL_POINTS); buff->setBuffer(LLVertexBuffer::MAP_VERTEX); push_for_transform(buff, vf.mNumVertices, mGeomCount); @@ -1448,7 +1477,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_normal) { - LLFastTimer t(FTM_FACE_GEOM_NORMAL); + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_NORMAL); gTransformNormalProgram.bind(); mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount); @@ -1474,7 +1503,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_tcoord) { - LLFastTimer t(FTM_FACE_GEOM_TEXTURE); + LLFastTimer t(FTM_FACE_GEOM_FEEDBACK_TEXTURE); gTransformTexCoordProgram.bind(); mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount); @@ -1497,7 +1526,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0); - gGL.popMatrix(); if (cur_shader) @@ -1897,20 +1925,31 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_pos) { - LLFastTimer t(FTM_FACE_GEOM_POSITION); + LLVector4a* src = vf.mPositions; + + //_mm_prefetch((char*)src, _MM_HINT_T0); + + LLVector4a* end = src+num_vertices; + //LLVector4a* end_64 = end-4; + + //LLFastTimer t(FTM_FACE_GEOM_POSITION); llassert(num_vertices > 0); mVertexBuffer->getVertexStrider(vert, mGeomIndex, mGeomCount, map_range); - LLMatrix4a mat_vert; mat_vert.loadu(mat_vert_in); - LLVector4a* src = vf.mPositions; - volatile F32* dst = (volatile F32*) vert.get(); + F32* dst = (F32*) vert.get(); + F32* end_f32 = dst+mGeomCount*4; + + //_mm_prefetch((char*)dst, _MM_HINT_NTA); + //_mm_prefetch((char*)src, _MM_HINT_NTA); + + //_mm_prefetch((char*)dst, _MM_HINT_NTA); + - volatile F32* end = dst+num_vertices*4; - LLVector4a res; + LLVector4a res0; //,res1,res2,res3; LLVector4a texIdx; @@ -1928,29 +1967,53 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, texIdx.set(0,0,0,val); + LLVector4a tmp; + { - LLFastTimer t(FTM_FACE_POSITION_STORE); - LLVector4a tmp; + //LLFastTimer t2(FTM_FACE_POSITION_STORE); - do + /*if (num_vertices > 4) + { //more than 64 bytes + while (src < end_64) + { + _mm_prefetch((char*)src + 64, _MM_HINT_T0); + _mm_prefetch((char*)dst + 64, _MM_HINT_T0); + + mat_vert.affineTransform(*src, res0); + tmp.setSelectWithMask(mask, texIdx, res0); + tmp.store4a((F32*) dst); + + mat_vert.affineTransform(*(src+1), res1); + tmp.setSelectWithMask(mask, texIdx, res1); + tmp.store4a((F32*) dst+4); + + mat_vert.affineTransform(*(src+2), res2); + tmp.setSelectWithMask(mask, texIdx, res2); + tmp.store4a((F32*) dst+8); + + mat_vert.affineTransform(*(src+3), res3); + tmp.setSelectWithMask(mask, texIdx, res3); + tmp.store4a((F32*) dst+12); + + dst += 16; + src += 4; + } + }*/ + + while (src < end) { - mat_vert.affineTransform(*src++, res); - tmp.setSelectWithMask(mask, texIdx, res); + mat_vert.affineTransform(*src++, res0); + tmp.setSelectWithMask(mask, texIdx, res0); tmp.store4a((F32*) dst); dst += 4; } - while(dst < end); } { - LLFastTimer t(FTM_FACE_POSITION_PAD); - S32 aligned_pad_vertices = mGeomCount - num_vertices; - res.set(res[0], res[1], res[2], 0.f); - - while (aligned_pad_vertices > 0) + //LLFastTimer t(FTM_FACE_POSITION_PAD); + while (dst < end_f32) { - --aligned_pad_vertices; - res.store4a((F32*) dst); + res0.store4a((F32*) dst); dst += 4; } } @@ -1964,14 +2027,16 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (rebuild_normal) { - LLFastTimer t(FTM_FACE_GEOM_NORMAL); + //LLFastTimer t(FTM_FACE_GEOM_NORMAL); mVertexBuffer->getNormalStrider(norm, mGeomIndex, mGeomCount, map_range); F32* normals = (F32*) norm.get(); - for (S32 i = 0; i < num_vertices; i++) + LLVector4a* src = vf.mNormals; + LLVector4a* end = src+num_vertices; + + while (src < end) { LLVector4a normal; - mat_normal.rotate(vf.mNormals[i], normal); - normal.normalize3fast(); + mat_normal.rotate(*src++, normal); normal.store4a(normals); normals += 4; } @@ -1994,14 +2059,18 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, mask.clear(); mask.setElement<3>(); - for (S32 i = 0; i < num_vertices; i++) + LLVector4a* src = vf.mTangents; + LLVector4a* end = vf.mTangents+num_vertices; + + while (src < end) { LLVector4a tangent_out; - mat_normal.rotate(vf.mTangents[i], tangent_out); + mat_normal.rotate(*src, tangent_out); tangent_out.normalize3fast(); - tangent_out.setSelectWithMask(mask, vf.mTangents[i], tangent_out); + tangent_out.setSelectWithMask(mask, *src, tangent_out); tangent_out.store4a(tangents); + src++; tangents += 4; } diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 66b5f137401f38379169f7f8ba4d70e4f7b23e5f..c9037ce1eba8f91f8f670391d950d247a84e64cd 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 0000000000000000000000000000000000000000..9a20ce8f1bc701c2febbfa90e0db15689396811b --- /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 0000000000000000000000000000000000000000..a77ac2416738b6ad6c8693aa91e00dc912fa59f8 --- /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 fbf72b1a852d5b0411f5475a011a2937f9eba6e0..06119620de1287281156a0f5c31e6611ac20e2ad 100755 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -345,7 +345,7 @@ BOOL LLFastTimerView::handleScrollWheel(S32 x, S32 y, S32 clicks) return TRUE; } -static LLFastTimer::DeclareTimer FTM_RENDER_TIMER("Timers", true); +static LLFastTimer::DeclareTimer FTM_RENDER_TIMER("Timers"); static std::map<LLFastTimer::NamedTimer*, LLColor4> sTimerColors; @@ -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 5766cfa0b0525f0012d75c641dbed57e2d60f25b..1349b1e99cdd8aafe81b94c5d4245ea23f93de2f 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/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index b35ef3a961748205f9051b7535eb74e30c9988c2..a2d075958725831d79e43289b18aeebff6e8a3f6 100755 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -552,6 +552,10 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con bool insert_before = true; if (!mItems.empty()) { + // [MAINT-2386] When multiple landmarks are selected and dragged onto an empty favorites bar, + // the viewer would crash when casting mLastTab below, as mLastTab is still null when the + // second landmark is being added. + // To ensure mLastTab is valid, we need to call updateButtons() at the end of this function dest = dynamic_cast<LLFavoriteLandmarkButton*>(mLandingTab); if (!dest) { @@ -623,6 +627,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con cb); } + // [MAINT-2386] Ensure the favorite button has been created and is valid. + // This also ensures that mLastTab will be valid when dropping multiple + // landmarks to an empty favorites bar. + updateButtons(); + llinfos << "Copied inventory item #" << item->getUUID() << " to favorites." << llendl; } diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 9d292ce7bb7a7f3fe6f66642715bcc0c4e9b3dad..73607e100a150240cadbd276ac9ec77b1ece617e 100755 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -261,7 +261,7 @@ BOOL LLFeatureManager::maskFeatures(const std::string& name) return maskList(*maskp); } -BOOL LLFeatureManager::loadFeatureTables() +bool LLFeatureManager::loadFeatureTables() { // *TODO - if I or anyone else adds something else to the skipped list // make this data driven. Put it in the feature table and parse it @@ -302,28 +302,36 @@ BOOL LLFeatureManager::loadFeatureTables() // use HTTP table if it exists std::string path; + bool parse_ok = false; if (gDirUtilp->fileExists(http_path)) { - path = http_path; + parse_ok = parseFeatureTable(http_path); + if (!parse_ok) + { + // the HTTP table failed to parse, so delete it + LLFile::remove(http_path); + LL_WARNS("RenderInit") << "Removed invalid feature table '" << http_path << "'" << LL_ENDL; + } } - else + + if (!parse_ok) { - path = app_path; + parse_ok = parseFeatureTable(app_path); } - - return parseFeatureTable(path); + return parse_ok; } -BOOL LLFeatureManager::parseFeatureTable(std::string filename) +bool LLFeatureManager::parseFeatureTable(std::string filename) { - llinfos << "Looking for feature table in " << filename << llendl; + LL_INFOS("RenderInit") << "Attempting to parse feature table from " << filename << LL_ENDL; llifstream file; std::string name; U32 version; + cleanupFeatureTables(); // in case an earlier attempt left partial results file.open(filename); /*Flawfinder: ignore*/ if (!file) @@ -338,13 +346,14 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename) if (name != "version") { LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL; - return FALSE; + return false; } mTableVersion = version; LLFeatureList *flp = NULL; - while (file >> name) + bool parse_ok = true; + while (file >> name && parse_ok) { char buffer[MAX_STRING]; /*Flawfinder: ignore*/ @@ -357,39 +366,58 @@ BOOL LLFeatureManager::parseFeatureTable(std::string filename) if (name == "list") { + LL_DEBUGS("RenderInit") << "Before new list" << std::endl; if (flp) { - //flp->dump(); + flp->dump(); + } + else + { + LL_CONT << "No current list"; } + LL_CONT << LL_ENDL; + // It's a new mask, create it. file >> name; - if (mMaskList.count(name)) + if (!mMaskList.count(name)) { - LL_ERRS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL; - } - flp = new LLFeatureList(name); mMaskList[name] = flp; } else { - if (!flp) - { - LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; - return FALSE; + LL_WARNS("RenderInit") << "Overriding mask " << name << ", this is invalid!" << LL_ENDL; + parse_ok = false; } + } + else + { + if (flp) + { S32 available; F32 recommended; file >> available >> recommended; flp->addFeature(name, available, recommended); } + else + { + LL_WARNS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL; + parse_ok = false; + } + } } file.close(); - return TRUE; + if (!parse_ok) + { + LL_WARNS("RenderInit") << "Discarding feature table data from " << filename << LL_ENDL; + cleanupFeatureTables(); + } + + return parse_ok; } -void LLFeatureManager::loadGPUClass() +bool LLFeatureManager::loadGPUClass() { // defaults mGPUClass = GPU_CLASS_UNKNOWN; @@ -407,29 +435,49 @@ void LLFeatureManager::loadGPUClass() // use HTTP table if it exists std::string path; + bool parse_ok = false; if (gDirUtilp->fileExists(http_path)) { - path = http_path; + parse_ok = parseGPUTable(http_path); + if (!parse_ok) + { + // the HTTP table failed to parse, so delete it + LLFile::remove(http_path); + LL_WARNS("RenderInit") << "Removed invalid gpu table '" << http_path << "'" << LL_ENDL; } - else + } + + if (!parse_ok) { - path = app_path; + parse_ok = parseGPUTable(app_path); } - parseGPUTable(path); + return parse_ok; // indicates that the file parsed correctly, not that the gpu was recognized } -void LLFeatureManager::parseGPUTable(std::string filename) +bool LLFeatureManager::parseGPUTable(std::string filename) { llifstream file; + LL_INFOS("RenderInit") << "Attempting to parse GPU table from " << filename << LL_ENDL; file.open(filename); - if (!file) + if (file) + { + const char recognizer[] = "//GPU_TABLE"; + char first_line[MAX_STRING]; + file.getline(first_line, MAX_STRING); + if (0 != strncmp(first_line, recognizer, strlen(recognizer))) + { + LL_WARNS("RenderInit") << "Invalid GPU table: " << filename << "!" << LL_ENDL; + return false; + } + } + else { LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL; - return; + return false; } std::string rawRenderer = gGLManager.getRawGLString(); @@ -556,6 +604,7 @@ void LLFeatureManager::parseGPUTable(std::string filename) #if LL_DARWIN // never go over "Mid" settings by default on OS X mGPUClass = llmin(mGPUClass, GPU_CLASS_2); #endif + return true; } // responder saves table into file diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h index 3b8d2512362b298c8b4a57c3ee0a8a236b5cb598..95141b241d6647b5769e291754cf16fba358fc5a 100755 --- a/indra/newview/llfeaturemanager.h +++ b/indra/newview/llfeaturemanager.h @@ -75,7 +75,7 @@ public: void setFeatureAvailable(const std::string& name, const BOOL available); void setRecommendedLevel(const std::string& name, const F32 level); - BOOL loadFeatureList(LLFILE *fp); + bool loadFeatureList(LLFILE *fp); BOOL maskList(LLFeatureList &mask); @@ -114,7 +114,7 @@ public: void maskCurrentList(const std::string& name); // Mask the current feature list with the named list - BOOL loadFeatureTables(); + bool loadFeatureTables(); EGPUClass getGPUClass() { return mGPUClass; } std::string& getGPUString() { return mGPUString; } @@ -157,9 +157,14 @@ public: void fetchHTTPTables(); protected: - void loadGPUClass(); - BOOL parseFeatureTable(std::string filename); - void parseGPUTable(std::string filename); + bool loadGPUClass(); + + bool parseFeatureTable(std::string filename); + ///< @returns TRUE is file parsed correctly, FALSE if not + + bool parseGPUTable(std::string filename); + ///< @returns true if file parsed correctly, false if not - does not reflect whether or not the gpu was recognized + void initBaseMask(); diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index b26d520557e65c4a0aaa300527a539b2ddaaff02..16eacc9392fb70382dc9466c2e46582f9211b0c1 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"; @@ -857,6 +873,8 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) success = false; } + send_agent_resume(); + // Account for the fact that the app has been stalled. LLFrameTimer::updateFrameTime(); return success; @@ -919,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) @@ -1090,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; @@ -1127,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", @@ -1179,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 0d279f73f3065d696877ebeec092e34318271022..f0f82c51db0a218acef6ae0d1d41dbd0b5c99476 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/llfilepicker_mac.mm b/indra/newview/llfilepicker_mac.mm index 2a84226e0a5a0dda62e69bb8bf377e16caabe9aa..13757904e3498b045b1dd87883d4d3f6a415aa64 100644 --- a/indra/newview/llfilepicker_mac.mm +++ b/indra/newview/llfilepicker_mac.mm @@ -117,6 +117,7 @@ std::string* doSaveDialog(const std::string* file, std::string *outfile = NULL; NSURL* url = [NSURL fileURLWithPath:fileName]; + [panel setNameFieldStringValue: fileName]; [panel setDirectoryURL: url]; if([panel runModal] == NSFileHandlingPanelOKButton) diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp index caad0afec054069262a9f4672bf55018c9aae67b..98c0c0bf51742bbb78aed209d9c16dcc0f58ffda 100755 --- a/indra/newview/llflexibleobject.cpp +++ b/indra/newview/llflexibleobject.cpp @@ -294,6 +294,9 @@ void LLVolumeImplFlexible::onSetVolume(const LLVolumeParams &volume_params, cons void LLVolumeImplFlexible::updateRenderRes() { + if (!mAttributes) + return; + LLDrawable* drawablep = mVO->mDrawable; S32 new_res = mAttributes->getSimulateLOD(); @@ -435,7 +438,7 @@ void LLVolumeImplFlexible::doFlexibleUpdate() } } - if(!mInitialized) + if(!mInitialized || !mAttributes) { //the object is not visible return ; @@ -689,30 +692,36 @@ void LLVolumeImplFlexible::doFlexibleUpdate() LLVector4(z_axis, 0.f), LLVector4(delta_pos, 1.f)); + LL_CHECK_MEMORY for (i=0; i<=num_render_sections; ++i) { new_point = &path->mPath[i]; LLVector3 pos = newSection[i].mPosition * rel_xform; LLQuaternion rot = mSection[i].mAxisRotation * newSection[i].mRotation * delta_rot; - - if (!mUpdated || (new_point->mPos-pos).magVec()/mVO->mDrawable->mDistanceWRTCamera > 0.001f) + + LLVector3 np(new_point->mPos.getF32ptr()); + + if (!mUpdated || (np-pos).magVec()/mVO->mDrawable->mDistanceWRTCamera > 0.001f) { - new_point->mPos = newSection[i].mPosition * rel_xform; + new_point->mPos.load3((newSection[i].mPosition * rel_xform).mV); mUpdated = FALSE; } - new_point->mRot = rot; - new_point->mScale = newSection[i].mScale; + new_point->mRot.loadu(LLMatrix3(rot)); + new_point->mScale.set(newSection[i].mScale.mV[0], newSection[i].mScale.mV[1], 0,1); new_point->mTexT = ((F32)i)/(num_render_sections); } - + LL_CHECK_MEMORY mLastSegmentRotation = parentSegmentRotation; } +static LLFastTimer::DeclareTimer FTM_FLEXI_PREBUILD("Flexi Prebuild"); + void LLVolumeImplFlexible::preRebuild() { if (!mUpdated) { + LLFastTimer t(FTM_FLEXI_PREBUILD); doFlexibleRebuild(); } } diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp index b570de14aa165f2846356c8105e8309e46f5afca..a303c2c6b3bb4ce74a945e63d53a3d9adf78f018 100755 --- a/indra/newview/llfloaterconversationpreview.cpp +++ b/indra/newview/llfloaterconversationpreview.cpp @@ -43,14 +43,16 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i mCurrentPage(0), mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")), mAccountName(session_id[LL_FCP_ACCOUNT_NAME]), - mCompleteName(session_id[LL_FCP_COMPLETE_NAME]) + mCompleteName(session_id[LL_FCP_COMPLETE_NAME]), + mMutex(NULL), + mShowHistory(false) { } BOOL LLFloaterConversationPreview::postBuild() { mChatHistory = getChild<LLChatHistory>("chat_history"); - LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::SetPages, this, _1, _2)); + LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2)); const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID); std::string name; @@ -90,73 +92,60 @@ BOOL LLFloaterConversationPreview::postBuild() mPageSpinner->setMinValue(1); mPageSpinner->set(1); mPageSpinner->setEnabled(false); - mChatHistoryLoaded = false; LLLogChat::startChatHistoryThread(file, load_params); return LLFloater::postBuild(); } -void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std::string& file_name) +void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name) { if(file_name == mChatHistoryFileName) { + // additional protection to avoid changes of mMessages in setPages() + LLMutexLock lock(&mMutex); mMessages = messages; + mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0); - - mCurrentPage = mMessages.size() / mPageSize; mPageSpinner->setEnabled(true); mPageSpinner->setMaxValue(mCurrentPage+1); mPageSpinner->set(mCurrentPage+1); 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) { - showHistory(); + mShowHistory = true; } void LLFloaterConversationPreview::showHistory() { - if (!mMessages.size()) + // additional protection to avoid changes of mMessages in setPages + LLMutexLock lock(&mMutex); + if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size()) { return; } mChatHistory->clear(); - std::ostringstream message; std::list<LLSD>::const_iterator iter = mMessages.begin(); + std::advance(iter, mCurrentPage * mPageSize); - int delta = 0; - if (mCurrentPage) + for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num) { - int remainder = mMessages.size() % mPageSize; - delta = (remainder == 0) ? 0 : (mPageSize - remainder); - } - - std::advance(iter, (mCurrentPage * mPageSize) - delta); - - for (int msg_num = 0; (iter != mMessages.end() && msg_num < mPageSize); ++iter, ++msg_num) - { - if (iter->size() == 0) - { - continue; - } - LLSD msg = *iter; LLUUID from_id = LLUUID::null; @@ -200,16 +189,16 @@ void LLFloaterConversationPreview::showHistory() mChatHistory->appendMessage(chat,chat_args); } - } 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 389f3dfd09b43d16e8572421130a89c205db737b..b0488f4ff127d51bdd58417b3cf0629bdc01e318 100755 --- a/indra/newview/llfloaterconversationpreview.h +++ b/indra/newview/llfloaterconversationpreview.h @@ -42,7 +42,7 @@ public: virtual ~LLFloaterConversationPreview(){}; virtual BOOL postBuild(); - void SetPages(std::list<LLSD>& messages,const std::string& file_name); + void setPages(std::list<LLSD>& messages,const std::string& file_name); virtual void draw(); virtual void onOpen(const LLSD& key); @@ -51,6 +51,7 @@ private: void onMoreHistoryBtnClick(); void showHistory(); + LLMutex mMutex; LLSpinCtrl* mPageSpinner; LLChatHistory* mChatHistory; LLUUID mSessionID; @@ -61,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/llfloatergroupinvite.cpp b/indra/newview/llfloatergroupinvite.cpp index 49da4e64b3c512b054961f6c61d4d3d2d14f0de0..d0f32897697386a4fb9eac6a77cbf13523b32144 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 4591b80ac4610705f6f2b9a57df9db7a4750a564..b5aa309066afd22107d1926fde325c84eee63d13 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -101,6 +101,7 @@ LLFloaterIMContainer::~LLFloaterIMContainer() gSavedPerAccountSettings.setBOOL("ConversationsListPaneCollapsed", mConversationsPane->isCollapsed()); gSavedPerAccountSettings.setBOOL("ConversationsMessagePaneCollapsed", mMessagesPane->isCollapsed()); + gSavedPerAccountSettings.setBOOL("ConversationsParticipantListCollapsed", !isParticipantListExpanded()); if (!LLSingleton<LLIMMgr>::destroyed()) { @@ -250,6 +251,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 +668,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); @@ -674,13 +680,18 @@ void LLFloaterIMContainer::setVisible(BOOL visible) void LLFloaterIMContainer::getDetachedConversationFloaters(floater_list_t& floaters) { typedef conversations_widgets_map::value_type conv_pair; + LLFloaterIMNearbyChat *nearby_chat = LLFloaterReg::findTypedInstance<LLFloaterIMNearbyChat>("nearby_chat"); + BOOST_FOREACH(conv_pair item, mConversationsWidgets) { LLConversationViewSession* widget = dynamic_cast<LLConversationViewSession*>(item.second); if (widget) { LLFloater* session_floater = widget->getSessionFloater(); - if (session_floater && session_floater->isDetachedAndNotMinimized()) + + // Exclude nearby chat from output, as it should be handled separately + if (session_floater && session_floater->isDetachedAndNotMinimized() + && session_floater != nearby_chat) { floaters.push_back(session_floater); } @@ -695,13 +706,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() @@ -710,6 +721,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) @@ -779,8 +800,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); @@ -829,7 +850,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; @@ -990,7 +1011,7 @@ void LLFloaterIMContainer::setSortOrder(const LLConversationSort& order) conversation_floater->setSortOrder(order); } } - + gSavedSettings.setU32("ConversationSortOrder", (U32)order); } @@ -1075,6 +1096,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); @@ -1177,7 +1202,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()); } @@ -1199,7 +1224,7 @@ void LLFloaterIMContainer::doToSelectedConversation(const std::string& command, { LLFloaterReg::showInstance("preview_conversation", LLSD(LLUUID::null), true); } - } +} } } @@ -1230,7 +1255,7 @@ void LLFloaterIMContainer::doToSelectedGroup(const LLSD& userdata) if (action == "group_profile") { - LLGroupActions::show(mSelectedSession); + LLGroupActions::show(mSelectedSession); } else if (action == "activate_group") { @@ -1604,7 +1629,7 @@ LLConversationItem* LLFloaterIMContainer::addConversationListItem(const LLUUID& // Create the participants widgets now // Note: usually, we do not get an updated avatar list at that point - if (uuid.isNull() || im_sessionp && !im_sessionp->isP2PSessionType()) + if (uuid.isNull() || (im_sessionp && !im_sessionp->isP2PSessionType())) { LLFolderViewModelItemCommon::child_list_t::const_iterator current_participant_model = item->getChildrenBegin(); LLFolderViewModelItemCommon::child_list_t::const_iterator end_participant_model = item->getChildrenEnd(); @@ -2077,6 +2102,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 @@ -2093,7 +2131,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. @@ -2102,7 +2140,7 @@ void LLFloaterIMContainer::onClickCloseBtn() LLMultiFloater::setMinimized(FALSE); } - LLFloater::closeFloater(); + LLFloater::closeFloater(app_quitting); } void LLFloaterIMContainer::closeHostedFloater() @@ -2149,7 +2187,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 36da457cacfb5f34ee4f549eb652ef81ff575a9a..f6d973b9b3be5f7646d3be62b25106d62bc39549 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 3d77ea4f0bb3ab7fc1861214f39b125173e0ae68..323e84751f6f7b819ba0410562d17d7735fccd65 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 05b48cccb03657a2b3e7f646f04cdc9225eec7c9..f0daacd6a9e7212e572f147f40d3082e7d84a94a 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/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp index cc00b6fd10d88f61e1cc9b3ed0eec40c5e44d367..a8f815c389343de80ebd1aa120c4efb1c10e0de7 100755 --- a/indra/newview/llfloaterimnearbychathandler.cpp +++ b/indra/newview/llfloaterimnearbychathandler.cpp @@ -187,14 +187,11 @@ void LLFloaterIMNearbyChatScreenChannel::deactivateToast(LLToast* toast) { toast_vec_t::iterator pos = std::find(m_active_toasts.begin(), m_active_toasts.end(), toast->getHandle()); - if (pos == m_active_toasts.end()) + if (pos != m_active_toasts.end()) { - llassert(pos == m_active_toasts.end()); - return; + LL_DEBUGS("NearbyChat") << "Deactivating toast" << llendl; + m_active_toasts.erase(pos); } - - LL_DEBUGS("NearbyChat") << "Deactivating toast" << llendl; - m_active_toasts.erase(pos); } void LLFloaterIMNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer) @@ -210,8 +207,8 @@ void LLFloaterIMNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool a { // Viewer is quitting. // Immediately stop processing chat messages (EXT-1419). - mStopProcessing = true; -} + mStopProcessing = true; + } else { // The toast is being closed by user (STORM-192). diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 5cb9df5625895f96c22dcfb1c9e58aa1195af85c..14e1a486d3232e1edc6689c2bc66452ada907d57 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -112,7 +112,7 @@ void LLFloaterIMSession::onTearOffClicked() } // virtual -void LLFloaterIMSession::onClickCloseBtn() +void LLFloaterIMSession::onClickCloseBtn(bool) { LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(mSessionID); diff --git a/indra/newview/llfloaterimsession.h b/indra/newview/llfloaterimsession.h index a0e0171b344baa322714bc3766e6851f499e7197..d6718843ca0109240572533c158000f33a5ab4d6 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); diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index d4355007c1fe493203266dc9545dc8d4dbba4a72..6c8e81e56324ae8cf404f29dce10eb815dc82681 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2027,6 +2027,10 @@ void LLPanelLandOptions::refresh() mSnapshotCtrl->setImageAssetID(parcel->getSnapshotID()); mSnapshotCtrl->setEnabled( can_change_identity ); + // find out where we're looking and convert that to an angle in degrees on a regular compass (not the internal representation) + LLVector3 user_look_at = parcel->getUserLookAt(); + U32 user_look_at_angle = ( (U32)( ( atan2(user_look_at[1], -user_look_at[0]) + F_PI * 2 ) * RAD_TO_DEG + 0.5) - 90) % 360; + LLVector3 pos = parcel->getUserLocation(); if (pos.isExactlyZero()) { @@ -2034,10 +2038,11 @@ void LLPanelLandOptions::refresh() } else { - mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d", + mLocationText->setTextArg("[LANDING]",llformat("%d, %d, %d (%d\xC2\xB0)", llround(pos.mV[VX]), llround(pos.mV[VY]), - llround(pos.mV[VZ]))); + llround(pos.mV[VZ]), + user_look_at_angle)); } mSetBtn->setEnabled( can_change_landing_point ); @@ -2092,7 +2097,6 @@ void LLPanelLandOptions::refresh() // virtual void LLPanelLandOptions::draw() { - refreshSearch(); // Is this necessary? JC LLPanel::draw(); } @@ -2106,9 +2110,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; } @@ -2135,10 +2138,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; @@ -2372,7 +2374,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 ); @@ -2539,6 +2541,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) @@ -2577,7 +2583,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); @@ -2587,11 +2592,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); @@ -2602,6 +2603,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); @@ -2648,17 +2654,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); } @@ -2692,7 +2687,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 100f1d580b96e0ea05ed425a62e03d799b8cc717..19cec558373392310f98ab2535e617288b10852d 100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -290,6 +290,22 @@ bool ll_is_degenerate(const LLVector4a& a, const LLVector4a& b, const LLVector4a bool validate_face(const LLVolumeFace& face) { + + for (U32 v = 0; v < face.mNumVertices; v++) + { + if(face.mPositions && !face.mPositions[v].isFinite3()) + { + llwarns << "NaN position data in face found!" << llendl; + return false; + } + + if(face.mNormals && !face.mNormals[v].isFinite3()) + { + llwarns << "NaN normal data in face found!" << llendl; + return false; + } + } + for (U32 i = 0; i < face.mNumIndices; ++i) { if (face.mIndices[i] >= face.mNumVertices) @@ -305,8 +321,10 @@ bool validate_face(const LLVolumeFace& face) return false; } + /*const LLVector4a scale(0.5f); + for (U32 i = 0; i < face.mNumIndices; i+=3) { U16 idx1 = face.mIndices[i]; @@ -323,7 +341,6 @@ bool validate_face(const LLVolumeFace& face) return false; } }*/ - return true; } @@ -5921,3 +5938,5 @@ void LLFloaterModelPreview::setPermissonsErrorStatus(U32 status, const std::stri LLNotificationsUtil::add("MeshUploadPermError"); } + + diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 4ebe813be63d510ef9d2044b51ae5ad6be10529b..87ae36716d4ef073f35f53db68a8b3bb5224d337 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -337,7 +337,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this)); mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this)); mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this)); - mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2)); + mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::refreshUI,this)); mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2)); mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2)); mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2)); @@ -618,9 +618,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) @@ -1150,6 +1153,8 @@ void LLFloaterPreference::refreshEnabledState() //Deferred/SSAO/Shadows LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); + LLCheckBoxCtrl* ctrl_deferred2 = getChild<LLCheckBoxCtrl>("UseLightShaders2"); + BOOL enabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && ((bumpshiny_ctrl && bumpshiny_ctrl->get()) ? TRUE : FALSE) && @@ -1159,11 +1164,13 @@ void LLFloaterPreference::refreshEnabledState() (ctrl_wind_light->get()) ? TRUE : FALSE; ctrl_deferred->setEnabled(enabled); - + ctrl_deferred2->setEnabled(enabled); + LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); LLComboBox* ctrl_shadow = getChild<LLComboBox>("ShadowDetail"); + // note, okay here to get from ctrl_deferred as it's twin, ctrl_deferred2 will alway match it enabled = enabled && LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO") && (ctrl_deferred->get() ? TRUE : FALSE); ctrl_deferred->set(gSavedSettings.getBOOL("RenderDeferred")); @@ -1191,6 +1198,7 @@ void LLFloaterPreference::disableUnavailableSettings() LLCheckBoxCtrl* ctrl_wind_light = getChild<LLCheckBoxCtrl>("WindLightUseAtmosShaders"); LLCheckBoxCtrl* ctrl_avatar_impostors = getChild<LLCheckBoxCtrl>("AvatarImpostors"); LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); + LLCheckBoxCtrl* ctrl_deferred2 = getChild<LLCheckBoxCtrl>("UseLightShaders2"); LLComboBox* ctrl_shadows = getChild<LLComboBox>("ShadowDetail"); LLCheckBoxCtrl* ctrl_ssao = getChild<LLCheckBoxCtrl>("UseSSAO"); LLCheckBoxCtrl* ctrl_dof = getChild<LLCheckBoxCtrl>("UseDoF"); @@ -1224,6 +1232,8 @@ void LLFloaterPreference::disableUnavailableSettings() ctrl_deferred->setEnabled(FALSE); ctrl_deferred->setValue(FALSE); + ctrl_deferred2->setEnabled(FALSE); + ctrl_deferred2->setValue(FALSE); } // disabled windlight @@ -1244,6 +1254,8 @@ void LLFloaterPreference::disableUnavailableSettings() ctrl_deferred->setEnabled(FALSE); ctrl_deferred->setValue(FALSE); + ctrl_deferred2->setEnabled(FALSE); + ctrl_deferred2->setValue(FALSE); } // disabled deferred @@ -1261,6 +1273,8 @@ void LLFloaterPreference::disableUnavailableSettings() ctrl_deferred->setEnabled(FALSE); ctrl_deferred->setValue(FALSE); + ctrl_deferred2->setEnabled(FALSE); + ctrl_deferred2->setValue(FALSE); } // disabled deferred SSAO @@ -1305,6 +1319,8 @@ void LLFloaterPreference::disableUnavailableSettings() ctrl_deferred->setEnabled(FALSE); ctrl_deferred->setValue(FALSE); + ctrl_deferred2->setEnabled(FALSE); + ctrl_deferred2->setValue(FALSE); } // disabled cloth @@ -1333,6 +1349,7 @@ void LLFloaterPreference::refresh() updateSliderText(getChild<LLSliderCtrl>("FlexibleMeshDetail", true), getChild<LLTextBox>("FlexibleMeshDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("TreeMeshDetail", true), getChild<LLTextBox>("TreeMeshDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail", true), getChild<LLTextBox>("AvatarMeshDetailText", true)); + updateSliderText(getChild<LLSliderCtrl>("AvatarMeshDetail2", true), getChild<LLTextBox>("AvatarMeshDetailText2", true)); updateSliderText(getChild<LLSliderCtrl>("AvatarPhysicsDetail", true), getChild<LLTextBox>("AvatarPhysicsDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("TerrainMeshDetail", true), getChild<LLTextBox>("TerrainMeshDetailText", true)); updateSliderText(getChild<LLSliderCtrl>("RenderPostProcess", true), getChild<LLTextBox>("PostProcessText", true)); @@ -1584,16 +1601,9 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im getChildView("chat_font_size")->setEnabled(TRUE); } -void LLFloaterPreference::onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name) +void LLFloaterPreference::refreshUI() { - std::string ctrl_name = name.asString(); - - if ((ctrl_name =="" )|| !hasChild(ctrl_name, TRUE)) - return; - - LLTextBox* text_box = getChild<LLTextBox>(name.asString()); - LLSliderCtrl* slider = dynamic_cast<LLSliderCtrl*>(ctrl); - updateSliderText(slider, text_box); + refresh(); } void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box) diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index 22e80a21cbc1019408be129b0b1d8efbecc6eb32..cb180f6f1eabf30694f49abd1badf16396101465 100755 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -154,8 +154,7 @@ public: void onChangeQuality(const LLSD& data); void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box); - void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name); -// void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator); + void refreshUI(); void onCommitParcelMediaAutoPlayEnable(); void onCommitMediaEnabled(); diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 50c013a49dfa3b479cf8adffada194f5b1a1a2b3..66bf49331b7e06200d56d9909f0ee6941eabf251 100755 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -1734,7 +1734,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 +1750,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 +2815,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 +2838,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/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index 5f9556a870d66810af487f69807501b362bf54c9..c5248719e933a010ce77a14d0f5be57f6fded6c0 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 491723471fb1109211764fe9b6757234071b9cf4..65ec8f604e65b4446f74783655dba90f5b0c6cc2 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 d8d62e5bbbee6d422889cce9408079e61b0638eb..ea385d7baf1b89297f9ec3cea51a76b0b13f7a7e 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 afe135fa407cd009258f4c5a375e28dd96867963..82af8c7a9dcaef54fbff52621064dedfd0cadcd0 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 0000000000000000000000000000000000000000..2a74c8e3eac8f145a9de54d7fe8d5183041ae6ab --- /dev/null +++ b/indra/newview/llfloatersocial.cpp @@ -0,0 +1,920 @@ +/** +* @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 LLRegisterPanelClassWrapper<LLSocialStatusPanel> t_panel_status("llsocialstatuspanel"); +static LLRegisterPanelClassWrapper<LLSocialPhotoPanel> t_panel_photo("llsocialphotopanel"); +static LLRegisterPanelClassWrapper<LLSocialCheckinPanel> t_panel_checkin("llsocialcheckinpanel"); +static LLRegisterPanelClassWrapper<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), +mLocationCheckbox(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"); + mLocationCheckbox = getChild<LLUICtrl>("add_location_cb"); + 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); + mLocationCheckbox->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(); + + // Add the location if required + bool add_location = mLocationCheckbox->getValue().asBoolean(); + if (add_location) + { + // Get the SLURL for the location + LLSLURL slurl; + LLAgentUI::buildSLURL(slurl); + std::string slurl_string = slurl.getSLURLString(); + + // Add query parameters so Google Analytics can track incoming clicks! + slurl_string += DEFAULT_PHOTO_QUERY_PARAMETERS; + + // Add it to the caption (pretty crude, but we don't have a better option with photos) + if (caption.empty()) + caption = slurl_string; + else + caption = caption + " " + slurl_string; + } + + // 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 0000000000000000000000000000000000000000..bbe07c970406ec6b4daa1689ad9ed6dcd6e7beef --- /dev/null +++ b/indra/newview/llfloatersocial.h @@ -0,0 +1,165 @@ +/** +* @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 * mLocationCheckbox; + 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/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 3fe2518de67230cb185fda3cc036366796cfd5aa..76b73fcf29e99f73cf960a9d70ddf91af2b8c693 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) { @@ -397,15 +406,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 +483,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 +495,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 cfc87e90155fd91c248e366ddc03d935715c0bda..f22940cd0720237af67b15bef892315fc92f3745 100755 --- a/indra/newview/llfloaterwebcontent.h +++ b/indra/newview/llfloaterwebcontent.h @@ -43,6 +43,7 @@ class LLFloaterWebContent : public LLInstanceTracker<LLFloaterWebContent, std::string> { public: + typedef LLInstanceTracker<LLFloaterWebContent, std::string> instance_tracker_t; LOG_CLASS(LLFloaterWebContent); @@ -54,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; @@ -105,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/llimview.cpp b/indra/newview/llimview.cpp index 9e23755d731a00ff38b6e0640cb90a2f5f9883eb..9ffbd1a6752ce9cde6488777024d9b436660aeca 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) { @@ -2670,7 +2670,8 @@ void LLIMMgr::addMessage( name_is_setted = true; } bool skip_message = false; - if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly")) + bool from_linden = LLMuteList::getInstance()->isLinden(from); + if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && !from_linden) { // Evaluate if we need to skip this message when that setting is true (default is false) skip_message = (LLAvatarTracker::instance().getBuddyInfo(other_participant_id) == NULL); // Skip non friends... @@ -2716,7 +2717,7 @@ void LLIMMgr::addMessage( // Logically it would make more sense to reject the session sooner, in another area of the // code, but the session has to be established inside the server before it can be left. - if (LLMuteList::getInstance()->isMuted(other_participant_id) && !LLMuteList::getInstance()->isLinden(from)) + if (LLMuteList::getInstance()->isMuted(other_participant_id) && !from_linden) { llwarns << "Leaving IM session from initiating muted resident " << from << llendl; if(!gIMMgr->leaveSession(new_session_id)) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index e4fc469bb7d489108aeaada6cc88745c566f132f..80ef506272c31337945466c4433ec18d9cf42929 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4739,6 +4739,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 +4835,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 +4845,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/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index b62db70ec84e4e0d75ddb767e118065a444387b0..06bf2944172ca8ba125d8b65b8e02169c65571bf 100755 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -1681,7 +1681,8 @@ void LLManipTranslate::highlightIntersection(LLVector3 normal, gGL.getModelviewMatrix().inverse().mult_vec_matrix(plane); - gClipProgram.uniform4fv("clip_plane", 1, plane.v); + static LLStaticHashedString sClipPlane("clip_plane"); + gClipProgram.uniform4fv(sClipPlane, 1, plane.v); BOOL particles = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES); BOOL clouds = gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS); diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp index 658fea944d0499bff4784ccc693ff78b9eae5dc4..14d3d4e7a8cfaaa513c70e277d45a81d01418403 100644 --- a/indra/newview/llmaterialmgr.cpp +++ b/indra/newview/llmaterialmgr.cpp @@ -50,10 +50,14 @@ #define MATERIALS_CAP_MATERIAL_FIELD "Material" #define MATERIALS_CAP_OBJECT_ID_FIELD "ID" #define MATERIALS_CAP_MATERIAL_ID_FIELD "MaterialID" +#define SIM_FEATURE_MAX_MATERIALS_PER_TRANSACTION "MaxMaterialsPerTransaction" +#define MATERIALS_GET_MAX_ENTRIES 50 #define MATERIALS_GET_TIMEOUT (60.f * 20) +#define MATERIALS_POST_MAX_ENTRIES 50 #define MATERIALS_POST_TIMEOUT (60.f * 5) #define MATERIALS_PUT_THROTTLE_SECS 1.f +#define MATERIALS_PUT_MAX_ENTRIES 50 /** * LLMaterialsResponder helper class @@ -591,7 +595,7 @@ void LLMaterialMgr::processGetQueue() material_queue_t& materials = itRegionQueue->second; U32 max_entries = regionp->getMaxMaterialsPerTransaction(); - material_queue_t::iterator loopMaterial = materials.begin(); + material_queue_t::iterator loopMaterial = materials.begin(); while ( (materials.end() != loopMaterial) && (materialsData.size() < max_entries) ) { material_queue_t::iterator itMaterial = loopMaterial++; @@ -687,34 +691,34 @@ void LLMaterialMgr::processPutQueue() { LLViewerRegion* regionp = objectp->getRegion(); if ( !regionp ) - { + { LL_WARNS("Materials") << "Object region is NULL" << LL_ENDL; mPutQueue.erase(itQueue); - } + } else if ( regionp->capabilitiesReceived() && !regionp->materialsCapThrottled()) { - LLSD& facesData = requests[regionp]; + LLSD& facesData = requests[regionp]; - facematerial_map_t& face_map = itQueue->second; + facematerial_map_t& face_map = itQueue->second; U32 max_entries = regionp->getMaxMaterialsPerTransaction(); - facematerial_map_t::iterator itFace = face_map.begin(); + facematerial_map_t::iterator itFace = face_map.begin(); while ( (face_map.end() != itFace) && (facesData.size() < max_entries) ) - { - LLSD faceData = LLSD::emptyMap(); - faceData[MATERIALS_CAP_FACE_FIELD] = static_cast<LLSD::Integer>(itFace->first); - faceData[MATERIALS_CAP_OBJECT_ID_FIELD] = static_cast<LLSD::Integer>(objectp->getLocalID()); - if (!itFace->second.isNull()) - { - faceData[MATERIALS_CAP_MATERIAL_FIELD] = itFace->second.asLLSD(); - } - facesData.append(faceData); - face_map.erase(itFace++); - } - if (face_map.empty()) - { - mPutQueue.erase(itQueue); - } + { + LLSD faceData = LLSD::emptyMap(); + faceData[MATERIALS_CAP_FACE_FIELD] = static_cast<LLSD::Integer>(itFace->first); + faceData[MATERIALS_CAP_OBJECT_ID_FIELD] = static_cast<LLSD::Integer>(objectp->getLocalID()); + if (!itFace->second.isNull()) + { + faceData[MATERIALS_CAP_MATERIAL_FIELD] = itFace->second.asLLSD(); } + facesData.append(faceData); + face_map.erase(itFace++); + } + if (face_map.empty()) + { + mPutQueue.erase(itQueue); + } + } } } diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h index e317a791adfe1b2ae47af55e19b520f7ad04a977..e83f1f4e01464f1d5912867dbc7e87b99fcb4405 100644 --- a/indra/newview/llmaterialmgr.h +++ b/indra/newview/llmaterialmgr.h @@ -124,6 +124,8 @@ protected: put_queue_t mPutQueue; material_map_t mMaterials; + + U32 getMaxEntries(const LLViewerRegion* regionp); }; #endif // LL_LLMATERIALMGR_H diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 7f2a5e164272c10d6cea1578f7dd1ebaef945e85..6c38c1fb568b5690fb9210bc1200b7e7d4a14fe2 100755 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -46,6 +46,7 @@ class LLMediaCtrl : { LOG_CLASS(LLMediaCtrl); public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> { Optional<std::string> start_url; diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 8d3539d297e8d4b6b91d88c3bbcedd27a25de9db..2e02805c02f87ecc4109cc8725df832a5914b54a 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -289,7 +289,14 @@ public: ~LLMeshSkinInfoResponder() { - llassert(mProcessed); + if (!LLApp::isQuitting() && + !mProcessed && + mMeshID.notNull()) + { // Something went wrong, retry + llwarns << "Timeout or service unavailable, retrying loadMeshSkinInfo() for " << mMeshID << llendl; + LLMeshRepository::sHTTPRetryCount++; + gMeshRepo.mThread->loadMeshSkinInfo(mMeshID); + } } virtual void completedRaw(U32 status, const std::string& reason, @@ -314,7 +321,14 @@ public: ~LLMeshDecompositionResponder() { - llassert(mProcessed); + if (!LLApp::isQuitting() && + !mProcessed && + mMeshID.notNull()) + { // Something went wrong, retry + llwarns << "Timeout or service unavailable, retrying loadMeshDecomposition() for " << mMeshID << llendl; + LLMeshRepository::sHTTPRetryCount++; + gMeshRepo.mThread->loadMeshDecomposition(mMeshID); + } } virtual void completedRaw(U32 status, const std::string& reason, @@ -339,7 +353,14 @@ public: ~LLMeshPhysicsShapeResponder() { - llassert(mProcessed); + if (!LLApp::isQuitting() && + !mProcessed && + mMeshID.notNull()) + { // Something went wrong, retry + llwarns << "Timeout or service unavailable, retrying loadMeshPhysicsShape() for " << mMeshID << llendl; + LLMeshRepository::sHTTPRetryCount++; + gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID); + } } virtual void completedRaw(U32 status, const std::string& reason, @@ -589,7 +610,7 @@ void LLMeshRepoThread::run() if (!fetchMeshLOD(req.mMeshParams, req.mLOD, count))//failed, resubmit { mMutex->lock(); - mLODReqQ.push(req) ; + mLODReqQ.push(req); mMutex->unlock(); } } @@ -1201,8 +1222,7 @@ bool LLMeshRepoThread::headerReceived(const LLVolumeParams& mesh_params, U8* dat LLMutexLock lock(mHeaderMutex); mMeshHeaderSize[mesh_id] = header_size; mMeshHeader[mesh_id] = header; - } - + } LLMutexLock lock(mMutex); // make sure only one thread access mPendingLOD at the same time. @@ -1920,7 +1940,7 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason, if (data_size < mRequestedBytes) { - if (status == 499 || status == 503) + if (status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE) { //timeout or service unavailable, try again llwarns << "Timeout or service unavailable, retrying." << llendl; LLMeshRepository::sHTTPRetryCount++; @@ -1928,7 +1948,7 @@ void LLMeshLODResponder::completedRaw(U32 status, const std::string& reason, } else { - llassert(status == 499 || status == 503); //intentionally trigger a breakpoint + llassert(status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint llwarns << "Unhandled status " << status << llendl; } return; @@ -1984,15 +2004,15 @@ void LLMeshSkinInfoResponder::completedRaw(U32 status, const std::string& reason if (data_size < mRequestedBytes) { - if (status == 499 || status == 503) + if (status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE) { //timeout or service unavailable, try again - llwarns << "Timeout or service unavailable, retrying." << llendl; + llwarns << "Timeout or service unavailable, retrying loadMeshSkinInfo() for " << mMeshID << llendl; LLMeshRepository::sHTTPRetryCount++; gMeshRepo.mThread->loadMeshSkinInfo(mMeshID); } else { - llassert(status == 499 || status == 503); //intentionally trigger a breakpoint + llassert(status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint llwarns << "Unhandled status " << status << llendl; } return; @@ -2047,15 +2067,15 @@ void LLMeshDecompositionResponder::completedRaw(U32 status, const std::string& r if (data_size < mRequestedBytes) { - if (status == 499 || status == 503) + if (status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE) { //timeout or service unavailable, try again - llwarns << "Timeout or service unavailable, retrying." << llendl; + llwarns << "Timeout or service unavailable, retrying loadMeshDecomposition() for " << mMeshID << llendl; LLMeshRepository::sHTTPRetryCount++; gMeshRepo.mThread->loadMeshDecomposition(mMeshID); } else { - llassert(status == 499 || status == 503); //intentionally trigger a breakpoint + llassert(status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint llwarns << "Unhandled status " << status << llendl; } return; @@ -2111,15 +2131,15 @@ void LLMeshPhysicsShapeResponder::completedRaw(U32 status, const std::string& re if (data_size < mRequestedBytes) { - if (status == 499 || status == 503) + if (status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE) { //timeout or service unavailable, try again - llwarns << "Timeout or service unavailable, retrying." << llendl; + llwarns << "Timeout or service unavailable, retrying loadMeshPhysicsShape() for " << mMeshID << llendl; LLMeshRepository::sHTTPRetryCount++; gMeshRepo.mThread->loadMeshPhysicsShape(mMeshID); } else { - llassert(status == 499 || status == 503); //intentionally trigger a breakpoint + llassert(status == HTTP_INTERNAL_ERROR || status == HTTP_SERVICE_UNAVAILABLE); //intentionally trigger a breakpoint llwarns << "Unhandled status " << status << llendl; } return; @@ -2172,16 +2192,16 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason, // << "Header responder failed with status: " // << status << ": " << reason << llendl; - // 503 (service unavailable) or 499 (timeout) + // 503 (service unavailable) or 499 (internal Linden-generated error) // can be due to server load and can be retried // TODO*: Add maximum retry logic, exponential backoff // and (somewhat more optional than the others) retries // again after some set period of time - llassert(status == 503 || status == 499); + llassert(status == HTTP_NOT_FOUND || status == HTTP_SERVICE_UNAVAILABLE || status == HTTP_REQUEST_TIME_OUT || status == HTTP_INTERNAL_ERROR); - if (status == 503 || status == 499) + if (status == HTTP_SERVICE_UNAVAILABLE || status == HTTP_REQUEST_TIME_OUT || status == HTTP_INTERNAL_ERROR) { //retry llwarns << "Timeout or service unavailable, retrying." << llendl; LLMeshRepository::sHTTPRetryCount++; @@ -2193,7 +2213,7 @@ void LLMeshHeaderResponder::completedRaw(U32 status, const std::string& reason, } else { - llwarns << "Unhandled status." << llendl; + llwarns << "Unhandled status: " << status << llendl; } } diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index 54522bb7f66c32401e25d61a73b4c6ff0a1556f7..0720d443f8f812735798f5073a41645693745288 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 7a70370fe33519106950250dd2f98d197ac25bdd..3e998b4f0e2ad852bf37485fdbf122fc1f00786a 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 dea90b90426f1ee72360ecf39418b8a2667e9e04..08b5eaedbbe9d5d899324b90a8ab3fc00de98081 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/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index eb4601a4690744b4cf28c67f79ee1d2c75d968c7..ef4d7356166546ffb31b6639e053f291b6e08821 100755 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -125,24 +125,29 @@ void log_name_callback(const std::string& full_name, const std::string& from_nam // static void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_file_only) { - LLUUID from_id = notification->getPayload()["from_id"]; + if (!gCacheName) + { + return; + } - if (from_id.isNull()) - { - // Normal behavior for system generated messages, don't spam. - // llwarns << " from_id for notification " << notification->getName() << " is null " << llendl; - return; - } + LLUUID from_id = notification->getPayload()["from_id"]; - if(to_file_only) - { - gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, "", notification->getMessage(), LLUUID())); - } - else - { - gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), from_id)); - } + if (from_id.isNull()) + { + // Normal behavior for system generated messages, don't spam. + // llwarns << " from_id for notification " << notification->getName() << " is null " << llendl; + return; + } + + if(to_file_only) + { + gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, "", notification->getMessage(), LLUUID())); } + else + { + gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), from_id)); + } +} // static void LLHandlerUtil::logGroupNoticeToIMGroup( diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 08c98e4f282e7c15d062925884f72f25376439e0..a3b15931c673f349ebcd7e3619c1caeca8830f0f 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/llpanelface.h b/indra/newview/llpanelface.h index 46b3375f64bb69bc948af3934bdf953fe924a547..b68488122580c63c1481ca47860b25da128bc549 100755 --- a/indra/newview/llpanelface.h +++ b/indra/newview/llpanelface.h @@ -259,7 +259,7 @@ private: // need to get per-face answer to this question for sane alpha mode retention on updates. // bool is_alpha_face = object->isImageAlphaBlended(face); - + // need to keep this original answer for valid comparisons in logic below // U8 original_default_alpha_mode = is_alpha_face ? LLMaterial::DIFFUSE_ALPHA_MODE_BLEND : LLMaterial::DIFFUSE_ALPHA_MODE_NONE; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 53deded2f23cc8594e3ab57b4924bbb3ce47d152..1ff0bfd09136e117774138a508ba1dc52865de1d 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -542,6 +542,13 @@ void LLPanelMainInventory::changed(U32) updateItemcountText(); } +void LLPanelMainInventory::setFocusFilterEditor() +{ + if(mFilterEditor) + { + mFilterEditor->setFocus(true); + } +} // virtual void LLPanelMainInventory::draw() diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 394b004e209ffafb95382edc148d1b2459da5775..fc8cc67c338dab0d47bf2b6c14f3670340f816d1 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 diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index d7c634d6194678b84bfb03f3bf19211ebe7422ed..f551fc96eed45eb26e32bd38619887de1734ca37 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 */ @@ -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 4740964deefab783e390b8bc38442ad2481231c7..c7141f36eeaec2c4a8e0e03de711b57c2f97fddc 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 49f7361c4ad78dc217cc7be84381c3c2b2a5159d..6979ae06e05187d27cd0d38c092c32ed0207d0b7 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 0a1dcef303f65cc55096adb79d18f1858a3f0df3..945382ebc51e7f2cde6dd050c73b3fcd56ec1938 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/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 76d38f067d4e263bd9593a2550737420418f24db..9504f22a1d59e20aae8b60f0fff29e9de9c845eb 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 eeb433e3062e0616dd6e8eeb8e5fa8c4d80db5b8..6d2eb3430e456290445fbaa5c816cab2c951e47f 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/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index c53760bca15c929c08b9e370521688659ca3d90e..ee6893907e2af575b38ed185e61d3bd867db1276 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 076c3e0235b9b22bb7c25eefcbccd1f321b47813..4f7d071d663ae3a7ae6e0bea118bf674d86044d4 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/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 91a98792eb56b3dd0e529db8c3dce9e9d1e4d916..1ed48a978fffa2693494b8e55221b0d4c8340e9f 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/llsceneview.cpp b/indra/newview/llsceneview.cpp index 09e799e4f741b11f4968aaa58579cb626906162c..cbd8bee9d5733e7706b5273a890cdf2a747663d2 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 2a3a14bbee45571dd6dee59bc3ab2633dfa7a380..1fceecb9e1a9efe975ff3574588c5f8805bfb6c9 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 928d26646b2b777f5e45213117ddb425f6f324da..c4d5450e2bd90bd40c812645b24df057f3bb297a 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/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index 8915bb2fef789c78f5c9c4a88dd178d987381f17..cbf43dbb937c522f51eaf32ee6712262b8188bea 100755 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -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/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index ad7c939728fe36b668a7f4d8283c13223a0289f4..9be6d0c5f1a8242920dba7885f1731eebf5e8eaa 100755 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -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 0000000000000000000000000000000000000000..7532ebfc5784d78ce688bb1af5face1e84d073db --- /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 0000000000000000000000000000000000000000..fe3d257b02b0dec650b3a07caeaadd0ae8bf992e --- /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 9e97790df89baad5ade893d87c2bddf749fa3b8e..2c83f6d0b707f1f0ecd5f9e455cfb89d1adc54cd 100755 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -89,28 +89,17 @@ class LLOcclusionQueryPool : public LLGLNamePool public: LLOcclusionQueryPool() { - mCurQuery = 1; + } protected: - std::list<GLuint> mAvailableName; - GLuint mCurQuery; - virtual GLuint allocateName() { GLuint ret = 0; - if (!mAvailableName.empty()) - { - ret = mAvailableName.front(); - mAvailableName.pop_front(); - } - else - { - ret = mCurQuery++; - } - + glGenQueriesARB(1, &ret); + return ret; } @@ -119,8 +108,7 @@ protected: #if LL_TRACK_PENDING_OCCLUSION_QUERIES LLSpatialGroup::sPendingQueries.erase(name); #endif - llassert(std::find(mAvailableName.begin(), mAvailableName.end(), name) == mAvailableName.end()); - mAvailableName.push_back(name); + glDeleteQueriesARB(1, &name); } }; @@ -1404,7 +1392,9 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node) if (bridge->mAvatar.notNull()) { bridge->mAvatar->mAttachmentGeometryBytes -= mGeometryBytes; + bridge->mAvatar->mAttachmentGeometryBytes = llmax(bridge->mAvatar->mAttachmentGeometryBytes, 0); bridge->mAvatar->mAttachmentSurfaceArea -= mSurfaceArea; + bridge->mAvatar->mAttachmentSurfaceArea = llmax(bridge->mAvatar->mAttachmentSurfaceArea, 0.f); } } @@ -1578,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 @@ -2240,6 +2230,18 @@ void drawBox(const LLVector4a& c, const LLVector4a& r) void drawBoxOutline(const LLVector3& pos, const LLVector3& size) { + + llassert(pos.isFinite()); + llassert(size.isFinite()); + + llassert(!llisnan(pos.mV[0])); + llassert(!llisnan(pos.mV[1])); + llassert(!llisnan(pos.mV[2])); + + llassert(!llisnan(size.mV[0])); + llassert(!llisnan(size.mV[1])); + llassert(!llisnan(size.mV[2])); + LLVector3 v1 = size.scaledVec(LLVector3( 1, 1,1)); LLVector3 v2 = size.scaledVec(LLVector3(-1, 1,1)); LLVector3 v3 = size.scaledVec(LLVector3(-1,-1,1)); @@ -3064,20 +3066,23 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE) const LLVector4a* ext; LLVector4a pos, size; - //render face bounding boxes - for (S32 i = 0; i < drawable->getNumFaces(); i++) + if (drawable->getVOVolume()) { - LLFace* facep = drawable->getFace(i); - if (facep) + //render face bounding boxes + for (S32 i = 0; i < drawable->getNumFaces(); i++) { - ext = facep->mExtents; + LLFace* facep = drawable->getFace(i); + if (facep) + { + ext = facep->mExtents; - pos.setAdd(ext[0], ext[1]); - pos.mul(0.5f); - size.setSub(ext[1], ext[0]); - size.mul(0.5f); + pos.setAdd(ext[0], ext[1]); + pos.mul(0.5f); + size.setSub(ext[1], ext[0]); + size.mul(0.5f); - drawBoxOutline(pos,size); + drawBoxOutline(pos,size); + } } } @@ -4195,6 +4200,10 @@ public: if (!group->isEmpty()) { gGL.diffuseColor3f(0,0,1); + + llassert(group->mObjectBounds[0].isFinite3()); + llassert(group->mObjectBounds[1].isFinite3()); + drawBoxOutline(group->mObjectBounds[0], group->mObjectBounds[1]); } @@ -4824,6 +4833,9 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, mMaterial(NULL), mShaderMask(0), mSpecColor(1.0f, 1.0f, 1.0f, 0.5f), + mBlendFuncSrc(LLRender::BF_SOURCE_ALPHA), + mBlendFuncDst(LLRender::BF_ONE_MINUS_SOURCE_ALPHA), + mHasGlow(FALSE), mEnvIntensity(0.0f), mAlphaMaskCutoff(0.5f), mDiffuseAlphaMode(0) diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 9732be90af7be9541e5ef0324d324742b638f06a..f26defd5e1b899ec2228a006ddc4eef220d19158 100755 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -70,12 +70,12 @@ protected: public: void* operator new(size_t size) { - return ll_aligned_malloc_16(size); + return ll_aligned_malloc(size,64); } void operator delete(void* ptr) { - ll_aligned_free_16(ptr); + ll_aligned_free(ptr); } @@ -123,6 +123,9 @@ public: LLMaterialPtr mMaterial; // If this is null, the following parameters are unused. LLMaterialID mMaterialID; U32 mShaderMask; + U32 mBlendFuncSrc; + U32 mBlendFuncDst; + BOOL mHasGlow; LLPointer<LLViewerTexture> mSpecularMap; const LLMatrix4* mSpecularMapMatrix; LLPointer<LLViewerTexture> mNormalMap; @@ -752,7 +755,7 @@ class LLVolumeGeometryManager: public LLGeometryManager virtual void rebuildGeom(LLSpatialGroup* group); virtual void rebuildMesh(LLSpatialGroup* group); virtual void getGeometry(LLSpatialGroup* group); - void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE, BOOL no_materials = FALSE); + void genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace** faces, U32 face_count, BOOL distance_sort = FALSE, BOOL batch_textures = FALSE, BOOL no_materials = FALSE); void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type); }; diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 1a3add2bfb1ded9b61ee32f466ef8d31939d24f9..626d69aca44387fbf369f05c6fb0c1ef9e881dab 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 cc5c057d8b395c8dd5ef17e260668eb12df72026..71b41476f53f62fa0b54afa5b814bcd22c023ff4 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 2b1ed5858af04e179afafd0901299bc0c7120277..4300cafb6bae86c5b7c37923ea7c0b7b8f9b5ec1 100755 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -134,7 +134,7 @@ public: void updateFilterPermMask(); void commitIfImmediateSet(); void commitCancel(); - + void onFilterEdit(const std::string& search_string ); void setCanApply(bool can_preview, bool can_apply); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 6173e76a35163ce13213ca3e4757f94fc12adc21..def26b3885e5c54aa3465abc49de061cb57c7893 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 @@ -2876,7 +2876,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 @@ -3099,8 +3099,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()); @@ -3359,8 +3359,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 9dfb29b905c96df4f4882f4a5f1ab503a1e7758e..448fae48de4ef8548e09803d139d0038167c31d7 100755 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -173,8 +173,20 @@ void LLToast::setHideButtonEnabled(bool enabled) //-------------------------------------------------------------------------- LLToast::~LLToast() -{ - mOnToastDestroyedSignal(this); +{ + if(LLApp::isQuitting()) + { + mOnFadeSignal.disconnect_all_slots(); + mOnDeleteToastSignal.disconnect_all_slots(); + mOnToastDestroyedSignal.disconnect_all_slots(); + mOnToastHoverSignal.disconnect_all_slots(); + mToastMouseEnterSignal.disconnect_all_slots(); + mToastMouseLeaveSignal.disconnect_all_slots(); + } + else + { + mOnToastDestroyedSignal(this); + } } //-------------------------------------------------------------------------- @@ -543,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); } //-------------------------------------------------------------------------- @@ -572,10 +584,34 @@ S32 LLToast::notifyParent(const LLSD& info) //static void LLToast::updateClass() { - for (LLInstanceTracker<LLToast>::instance_iter iter = LLInstanceTracker<LLToast>::beginInstances(); iter != LLInstanceTracker<LLToast>::endInstances(); ) + for (LLInstanceTracker<LLToast>::instance_iter iter = LLInstanceTracker<LLToast>::beginInstances(); + iter != LLInstanceTracker<LLToast>::endInstances(); ) { LLToast& toast = *iter++; toast.updateHoveredState(); } } + +// static +void LLToast::cleanupToasts() +{ + LLToast * toastp = NULL; + + while (LLInstanceTracker<LLToast>::instanceCount() > 0) + { + { // Need to scope iter to allow deletion + LLInstanceTracker<LLToast>::instance_iter iter = LLInstanceTracker<LLToast>::beginInstances(); + toastp = &(*iter); + } + + //llinfos << "Cleaning up toast id " << toastp->getNotificationID() << llendl; + + // LLToast destructor will remove it from the LLInstanceTracker. + if (!toastp) + break; // Don't get stuck in the loop if a null pointer somehow got on the list + + delete toastp; + } +} + diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index ea62f758f87a3967da7f388a82fc02fc0c696571..f02d7c2a1a99ea8f5247a5401a527d8067739b08 100755 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -73,6 +73,7 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast> { friend class LLToastLifeTimer; public: + typedef boost::function<void (LLToast* toast)> toast_callback_t; typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t; typedef boost::signals2::signal<void (LLToast* toast, bool mouse_enter)> toast_hover_check_signal_t; @@ -105,6 +106,7 @@ public: }; static void updateClass(); + static void cleanupToasts(); LLToast(const LLToast::Params& p); virtual ~LLToast(); diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 3f75f8da5e0212e88c034b37f367c87947e5b452..6083210080f9496f03c9db5efd037d30e2658bde 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 09ab31df369af8e85c346bd2ba993b625f954f01..bdbd8f1f835607da69d42d82781535d55ed6db2c 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 8bfde2bcf1f9d59248fd09682e4bcfc8605d6e3c..3a41bf28b4710fca52a56459b9cb9059f22db4e5 100755 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -60,7 +60,7 @@ LLToastNotifyPanel::LLToastNotifyPanel(const LLNotificationPtr& notification, co LLInstanceTracker<LLToastNotifyPanel, LLUUID>(notification->getID()) { init(rect, show_images); - } +} void LLToastNotifyPanel::addDefaultButton() { LLSD form_element; @@ -407,6 +407,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 d02171b512c3bc91cfad83a7ad25436fa51d979a..fe7f1cf8f3a91e2708c4cead95019f584bbd04f9 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 a30f8419806e89e1840f3d3fe4ccd858f3cf1c1d..e1b764a9438c541f142126bf9c2dd04fde1b0cab 100755 --- a/indra/newview/lltoastpanel.cpp +++ b/indra/newview/lltoastpanel.cpp @@ -52,6 +52,12 @@ std::string LLToastPanel::getTitle() return mNotification->getMessage(); } +//virtual +const std::string& LLToastPanel::getNotificationName() +{ + return mNotification->getName(); +} + //virtual const LLUUID& LLToastPanel::getID() { diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h index e4ab95007e521c104a1ca47f0839000112613a32..51630381f2118ff899b298484a1cc80d21df40d4 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/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index ef7d0cd81bb13dfd514bc3a526d83c0a38156a45..1a137f7129d5326ad66b5262b7f6b4bd7f20da14 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/lltoolselect.h b/indra/newview/lltoolselect.h index baa27f607166cad948d28a0cf59b5c4a5214abca..74dababe8c899ca242a976ae590e3a56cf055bb9 100755 --- a/indra/newview/lltoolselect.h +++ b/indra/newview/lltoolselect.h @@ -34,7 +34,7 @@ class LLObjectSelection; -class LLToolSelect : public LLTool, public LLSingleton<LLToolSelect> +class LLToolSelect : public LLTool { public: LLToolSelect( LLToolComposite* composite ); diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp index dd17068be55b9a3ac68312d3a3daa64050ca3bf8..a80b9da13c96e8b33ba029cad78095577b7b8f2d 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/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c6b28b9e5e9fd7bd9e926b345b1e7c7fc9be09f5..4ce049df03ffa1b6b62896aa456f351ab0224993 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -103,6 +103,7 @@ #include "llfloatersettingsdebug.h" #include "llfloatersidepanelcontainer.h" #include "llfloatersnapshot.h" +#include "llfloatersocial.h" #include "llfloatersounddevices.h" #include "llfloaterspellchecksettings.h" #include "llfloatertelehub.h" @@ -303,6 +304,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 +313,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/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp old mode 100755 new mode 100644 diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp index f6e840adcd803988264a97bd9c9c8f2b29b1ef81..aeeb591d55f31d33bcb863133970567defed02b2 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 47a8a04b6396f1703e6143c57748fda051304b91..aa9de076b87f46adee7fa15fae458fe0b90528eb 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -534,6 +534,11 @@ void stop_moving( EKeystate s ) void start_chat( EKeystate s ) { + if (LLAppViewer::instance()->quitRequested()) + { + return; // can't talk, gotta go, kthxbye! + } + // start chat LLFloaterIMNearbyChat::startChat(NULL); } @@ -682,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 2df028de69c098fcf3f58c64c4c0f316b62fa332..21fb8d519b3442c4067c8f14f30157edd7decf7d 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 49eb7dc94a17cb8e1a27ebbac6ef448640c0ee67..ac2940fcfccf6652f21f620ec7cda53563118182 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" @@ -1073,8 +1076,6 @@ class LLAdvancedCheckInfoDisplay : public view_listener_t U32 info_display = info_display_from_string( userdata.asString() ); bool new_value = false; - LL_INFOS("ViewerMenu") << "check " << userdata.asString() << LL_ENDL; - if ( info_display != 0 ) { new_value = LLPipeline::toggleRenderDebugControl( (void*)info_display ); @@ -1954,6 +1955,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 // @@ -2930,6 +2968,67 @@ bool enable_object_unmute() } } + +// 0 = normal, 1 = always, 2 = never +class LLAvatarCheckImpostorMode : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) return false; + + LLVOAvatar* avatar = find_avatar_from_object(object); + if (!avatar) return false; + + U32 mode = userdata.asInteger(); + switch (mode) + { + case 0: + return (avatar->getVisualMuteSettings() == LLVOAvatar::VISUAL_MUTE_NOT_SET); + case 1: + return (avatar->getVisualMuteSettings() == LLVOAvatar::ALWAYS_VISUAL_MUTE); + case 2: + return (avatar->getVisualMuteSettings() == LLVOAvatar::NEVER_VISUAL_MUTE); + default: + return false; + } + } // handleEvent() +}; + +// 0 = normal, 1 = always, 2 = never +class LLAvatarSetImpostorMode : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); + if (!object) return false; + + LLVOAvatar* avatar = find_avatar_from_object(object); + if (!avatar) return false; + + U32 mode = userdata.asInteger(); + switch (mode) + { + case 0: + avatar->setVisualMuteSettings(LLVOAvatar::VISUAL_MUTE_NOT_SET); + break; + case 1: + avatar->setVisualMuteSettings(LLVOAvatar::ALWAYS_VISUAL_MUTE); + break; + case 2: + avatar->setVisualMuteSettings(LLVOAvatar::NEVER_VISUAL_MUTE); + break; + default: + return false; + } + + avatar->forceUpdateVisualMuteSettings(); + LLVOAvatar::cullAvatarsByPixelArea(); + return true; + } // handleEvent() +}; + + class LLObjectMute : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -8361,6 +8460,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)); @@ -8619,6 +8720,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"); @@ -8681,6 +8783,8 @@ void initialize_menus() view_listener_t::addMenu( new LLCheckPanelPeopleTab(), "SideTray.CheckPanelPeopleTab"); // Avatar pie menu + view_listener_t::addMenu(new LLAvatarCheckImpostorMode(), "Avatar.CheckImpostorMode"); + view_listener_t::addMenu(new LLAvatarSetImpostorMode(), "Avatar.SetImpostorMode"); view_listener_t::addMenu(new LLObjectMute(), "Avatar.Mute"); view_listener_t::addMenu(new LLAvatarAddFriend(), "Avatar.AddFriend"); view_listener_t::addMenu(new LLAvatarAddContact(), "Avatar.AddContact"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e3335c9cd859b333045e82fa30967e3b2dbc96f5..3574d37adfe1b89c6e61443f8d7a8016c98721ec 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" @@ -2220,7 +2221,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 @@ -2361,7 +2362,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) BOOL is_owned_by_me = FALSE; BOOL is_friend = (LLAvatarTracker::instance().getBuddyInfo(from_id) == NULL) ? false : true; BOOL accept_im_from_only_friend = gSavedSettings.getBOOL("VoiceCallsFriendsOnly"); - + BOOL is_linden = chat.mSourceType != CHAT_SOURCE_OBJECT && + LLMuteList::getInstance()->isLinden(name); + chat.mMuted = is_muted; chat.mFromID = from_id; chat.mFromName = name; @@ -2461,7 +2464,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL; bool mute_im = is_muted; - if(accept_im_from_only_friend&&!is_friend) + if(accept_im_from_only_friend && !is_friend && !is_linden) { if (!gIMMgr->isNonFriendSessionNotified(session_id)) { @@ -2986,6 +2989,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) break; case IM_LURE_USER: + case IM_TELEPORT_REQUEST: { if (is_muted) { @@ -3008,7 +3012,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); @@ -3080,12 +3085,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; @@ -3214,7 +3229,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); } @@ -3225,6 +3253,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 @@ -3240,6 +3271,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } } } + } break; case IM_FRIENDSHIP_ACCEPTED: @@ -3802,19 +3834,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; @@ -4091,18 +4110,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(); @@ -4135,7 +4142,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**) { LLTracker::stopTracking(NULL); } - else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() ) + else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() && look_at.isExactlyZero()) { //look at the beacon LLVector3 global_agent_pos = agent_pos; @@ -5953,19 +5960,42 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem) } +static void process_special_alert_messages(const std::string & message) +{ + // Do special handling for alert messages. This is a legacy hack, and any actual displayed + // text should be altered in the notifications.xml files. + if ( message == "You died and have been teleported to your home location") + { + LLViewerStats::getInstance()->incStat(LLViewerStats::ST_KILLED_COUNT); + } + else if( message == "Home position set." ) + { + // save the home location image to disk + std::string snap_filename = gDirUtilp->getLindenUserDir(); + snap_filename += gDirUtilp->getDirDelimiter(); + snap_filename += SCREEN_HOME_FILENAME; + gViewerWindow->saveSnapshot(snap_filename, gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw(), FALSE, FALSE); + } +} + + + void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data) { // make sure the cursor is back to the usual default since the // alert is probably due to some kind of error. gViewerWindow->getWindow()->resetBusyCount(); + std::string message; + msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, message); + + process_special_alert_messages(message); + if (!attempt_standard_notification(msgsystem)) { BOOL modal = FALSE; msgsystem->getBOOL("AlertData", "Modal", modal); - std::string buffer; - msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); - process_alert_core(buffer, modal); + process_alert_core(message, modal); } } @@ -5980,12 +6010,15 @@ void process_alert_message(LLMessageSystem *msgsystem, void **user_data) // alert is probably due to some kind of error. gViewerWindow->getWindow()->resetBusyCount(); + std::string message; + msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, message); + + process_special_alert_messages(message); + if (!attempt_standard_notification(msgsystem)) { BOOL modal = FALSE; - std::string buffer; - msgsystem->getStringFast(_PREHASH_AlertData, _PREHASH_Message, buffer); - process_alert_core(buffer, modal); + process_alert_core(message, modal); } } @@ -6015,12 +6048,6 @@ bool handle_special_alerts(const std::string &pAlertName) void process_alert_core(const std::string& message, BOOL modal) { - // HACK -- handle callbacks for specific alerts. It also is localized in notifications.xml - if ( message == "You died and have been teleported to your home location") - { - LLViewerStats::getInstance()->incStat(LLViewerStats::ST_KILLED_COUNT); - } - const std::string ALERT_PREFIX("ALERT: "); const std::string NOTIFY_PREFIX("NOTIFY: "); if (message.find(ALERT_PREFIX) == 0) @@ -6851,6 +6878,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; @@ -6864,50 +6936,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; @@ -6947,6 +6981,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 0070240803995b15edeb4b9c81568973490151ae..1544e66431a9df31e911d66bd40fa820195db038 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -1578,6 +1578,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, dp->setPassFlags(value); dp->unpackUUID(owner_id, "Owner"); + mOwnerID = owner_id; + if (value & 0x80) { dp->unpackVector3(new_angv, "Omega"); @@ -1651,13 +1653,13 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, retval |= checkMediaURL(media_url); // - // Unpack particle system data + // Unpack particle system data (legacy) // if (value & 0x8) { - unpackParticleSource(*dp, owner_id); + unpackParticleSource(*dp, owner_id, true); } - else + else if (!(value & 0x400)) { deleteParticleSource(); } @@ -4860,7 +4862,7 @@ void LLViewerObject::unpackParticleSource(const S32 block_num, const LLUUID& own } } -void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id) +void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id, bool legacy) { if (!mPartSourcep.isNull() && mPartSourcep->isDead()) { @@ -4869,7 +4871,7 @@ void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_ if (mPartSourcep) { // If we've got one already, just update the existing source (or remove it) - if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp)) + if (!LLViewerPartSourceScript::unpackPSS(this, mPartSourcep, dp, legacy)) { mPartSourcep->setDead(); mPartSourcep = NULL; @@ -4877,7 +4879,7 @@ void LLViewerObject::unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_ } else { - LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp); + LLPointer<LLViewerPartSourceScript> pss = LLViewerPartSourceScript::unpackPSS(this, NULL, dp, legacy); //If the owner is muted, don't create the system if(LLMuteList::getInstance()->isMuted(owner_id, LLMute::flagParticles)) return; // We need to be able to deal with a particle source that hasn't changed, but still got an update! @@ -5723,6 +5725,11 @@ F32 LLAlphaObject::getPartSize(S32 idx) return 0.f; } +void LLAlphaObject::getBlendFunc(S32 face, U32& src, U32& dst) +{ + +} + // virtual void LLStaticViewerObject::updateDrawable(BOOL force_damped) { @@ -5872,6 +5879,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 16f1f403d3495dbaae55014afad6f09636e29693..80bdd628a13715beef292aaa62f0c2d2a3f656a4 100755 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -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() @@ -339,7 +341,7 @@ public: LLViewerTexture *getTENormalMap(const U8 te) const; LLViewerTexture *getTESpecularMap(const U8 te) const; - bool isImageAlphaBlended(const U8 te) const; + bool isImageAlphaBlended(const U8 te) const; void fitFaceTexture(const U8 face); void sendTEUpdate() const; // Sends packed representation of all texture entry information @@ -602,6 +604,7 @@ public: } EPhysicsShapeType; LLUUID mID; + LLUUID mOwnerID; //null if unknown // unique within region, not unique across regions // Local ID = 0 is not used @@ -682,7 +685,7 @@ protected: BOOL isOnMap(); void unpackParticleSource(const S32 block_num, const LLUUID& owner_id); - void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id); + void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id, bool legacy); void deleteParticleSource(); void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id); @@ -847,8 +850,11 @@ public: LLStrider<LLVector3>& normalsp, LLStrider<LLVector2>& texcoordsp, LLStrider<LLColor4U>& colorsp, + LLStrider<LLColor4U>& emissivep, LLStrider<U16>& indicesp) = 0; + virtual void getBlendFunc(S32 face, U32& src, U32& dst); + F32 mDepth; }; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 66615657d82a723d433c96b4e1fbeb1c688a5686..b4e287c446775197f2900e400f6b8e35f8d50df1 100755 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -954,15 +954,17 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) objectp = *idle_iter; llassert(objectp->isActive()); objectp->idleUpdate(agent, world, frame_time); - - } + } //update flexible objects LLVolumeImplFlexible::updateClass(); //update animated textures - LLViewerTextureAnim::updateClass(); - } + if (gAnimateTextures) + { + LLViewerTextureAnim::updateClass(); + } + } diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp index 61cdfd781874871e8e683fe58c2d5af5ef1d1357..163c90019fcd256ce0968d3cbe4af0d934cbffbc 100755 --- a/indra/newview/llviewerpartsim.cpp +++ b/indra/newview/llviewerpartsim.cpp @@ -80,12 +80,31 @@ LLViewerPart::LLViewerPart() : mImagep(NULL) { mPartSourcep = NULL; - + mParent = NULL; + mChild = NULL; ++LLViewerPartSim::sParticleCount2 ; } LLViewerPart::~LLViewerPart() { + if (mPartSourcep.notNull() && mPartSourcep->mLastPart == this) + { + mPartSourcep->mLastPart = NULL; + } + + //patch up holes in the ribbon + if (mParent) + { + llassert(mParent->mChild == this); + mParent->mChild = mChild; + } + + if (mChild) + { + llassert (mChild->mParent == this); + mChild->mParent = mParent; + } + mPartSourcep = NULL; --LLViewerPartSim::sParticleCount2 ; @@ -141,7 +160,11 @@ LLViewerPartGroup::LLViewerPartGroup(const LLVector3 ¢er_agent, const F32 bo } mVOPartGroupp->setViewerPartGroup(this); mVOPartGroupp->setPositionAgent(getCenterAgent()); + + mBoxSide = box_side; + F32 scale = box_side * 0.5f; + mVOPartGroupp->setScale(LLVector3(scale,scale,scale)); //gPipeline.addObject(mVOPartGroupp); @@ -367,6 +390,9 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt) part->mScale += frac*part->mEndScale; } + // Do glow interpolation + part->mGlow.mV[3] = (U8) llround(lerp(part->mStartGlow, part->mEndGlow, frac)*255.f); + // Set the last update time to now. part->mLastUpdateTime = cur_time; @@ -623,6 +649,9 @@ void LLViewerPartSim::updateSimulation() { static LLFrameTimer update_timer; + //reset VBO cursor + LLVOPartGroup::sVBSlotCursor = 0; + const F32 dt = llmin(update_timer.getElapsedTimeAndResetF32(), 0.1f); if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES))) diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h index c91fcf0691f986f6b3c34f8da93cd144c1e1c5fb..2daa07ed8c3eb6d76a38b71899019321f5b4b489 100755 --- a/indra/newview/llviewerpartsim.h +++ b/indra/newview/llviewerpartsim.h @@ -65,15 +65,22 @@ public: LLVPCallback mVPCallback; // Callback function for more complicated behaviors LLPointer<LLViewerPartSource> mPartSourcep; // Particle source used for this object - + + LLViewerPart* mParent; // particle to connect to if this is part of a particle ribbon + LLViewerPart* mChild; // child particle for clean reference destruction // Current particle state (possibly used for rendering) LLPointer<LLViewerTexture> mImagep; LLVector3 mPosAgent; LLVector3 mVelocity; LLVector3 mAccel; + LLVector3 mAxis; LLColor4 mColor; LLVector2 mScale; + F32 mStartGlow; + F32 mEndGlow; + LLColor4U mGlow; + static U32 sNextPartID; }; @@ -98,6 +105,9 @@ public: void shift(const LLVector3 &offset); + F32 getBoxRadius() { return mBoxRadius; } + F32 getBoxSide() { return mBoxSide; } + typedef std::vector<LLViewerPart*> part_list_t; part_list_t mParticles; @@ -118,6 +128,7 @@ public: protected: LLVector3 mCenterAgent; F32 mBoxRadius; + F32 mBoxSide; LLVector3 mMinObjPos; LLVector3 mMaxObjPos; diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp index b311f659fbd891f027b26903badd4b2bbc5242c7..b6bbd6140dcf64c19fd42a18a83c91f0f5f148d5 100755 --- a/indra/newview/llviewerpartsource.cpp +++ b/indra/newview/llviewerpartsource.cpp @@ -52,6 +52,8 @@ LLViewerPartSource::LLViewerPartSource(const U32 type) : static U32 id_seed = 0; mID = ++id_seed; + mLastPart = NULL; + mDelay = 0 ; } @@ -279,6 +281,22 @@ void LLViewerPartSourceScript::update(const F32 dt) { part->mFlags |= LLPartData::LL_PART_HUD; } + + if (part->mFlags & LLPartData::LL_PART_RIBBON_MASK && mLastPart) + { //set previous particle's parent to this particle to chain ribbon together + mLastPart->mParent = part; + part->mChild = mLastPart; + part->mAxis = LLVector3(0,0,1); + + if (mSourceObjectp.notNull()) + { + LLQuaternion rot = mSourceObjectp->getRenderRotation(); + part->mAxis *= rot; + } + } + + mLastPart = part; + part->mMaxAge = mPartSysData.mPartData.mMaxAge; part->mStartColor = mPartSysData.mPartData.mStartColor; part->mEndColor = mPartSysData.mPartData.mEndColor; @@ -290,6 +308,13 @@ void LLViewerPartSourceScript::update(const F32 dt) part->mAccel = mPartSysData.mPartAccel; + part->mBlendFuncDest = mPartSysData.mPartData.mBlendFuncDest; + part->mBlendFuncSource = mPartSysData.mPartData.mBlendFuncSource; + + part->mStartGlow = mPartSysData.mPartData.mStartGlow; + part->mEndGlow = mPartSysData.mPartData.mEndGlow; + part->mGlow = LLColor4U(0, 0, 0, (U8) llround(part->mStartGlow*255.f)); + if (mPartSysData.mPattern & LLPartSysData::LL_PART_SRC_PATTERN_DROP) { part->mPosAgent = mPosAgent; @@ -430,28 +455,51 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer } -LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp) +LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp, bool legacy) { if (!pssp) { LLPointer<LLViewerPartSourceScript> new_pssp = new LLViewerPartSourceScript(source_objp); - if (!new_pssp->mPartSysData.unpack(dp)) + if (legacy) { - return NULL; + if (!new_pssp->mPartSysData.unpackLegacy(dp)) + { + return NULL; + } + } + else + { + if (!new_pssp->mPartSysData.unpack(dp)) + { + return NULL; + } } + if (new_pssp->mPartSysData.mTargetUUID.notNull()) { LLViewerObject *target_objp = gObjectList.findObject(new_pssp->mPartSysData.mTargetUUID); new_pssp->setTargetObject(target_objp); } + return new_pssp; } else { - if (!pssp->mPartSysData.unpack(dp)) + if (legacy) { - return NULL; + if (!pssp->mPartSysData.unpackLegacy(dp)) + { + return NULL; + } } + else + { + if (!pssp->mPartSysData.unpack(dp)) + { + return NULL; + } + } + if (pssp->mPartSysData.mTargetUUID.notNull()) { LLViewerObject *target_objp = gObjectList.findObject(pssp->mPartSysData.mTargetUUID); @@ -569,6 +617,11 @@ void LLViewerPartSourceSpiral::update(const F32 dt) part->mScale.mV[0] = 0.25f; part->mScale.mV[1] = 0.25f; part->mParameter = ll_frand(F_TWO_PI); + part->mBlendFuncDest = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; + part->mBlendFuncSource = LLRender::BF_SOURCE_ALPHA; + part->mStartGlow = 0.f; + part->mEndGlow = 0.f; + part->mGlow = LLColor4U(0, 0, 0, 0); LLViewerPartSim::getInstance()->addPart(part); } @@ -721,6 +774,12 @@ void LLViewerPartSourceBeam::update(const F32 dt) part->mPosAgent = mPosAgent; part->mVelocity = mTargetPosAgent - mPosAgent; + part->mBlendFuncDest = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; + part->mBlendFuncSource = LLRender::BF_SOURCE_ALPHA; + part->mStartGlow = 0.f; + part->mEndGlow = 0.f; + part->mGlow = LLColor4U(0, 0, 0, 0); + LLViewerPartSim::getInstance()->addPart(part); } } @@ -825,6 +884,12 @@ void LLViewerPartSourceChat::update(const F32 dt) part->mScale.mV[0] = 0.25f; part->mScale.mV[1] = 0.25f; part->mParameter = ll_frand(F_TWO_PI); + part->mBlendFuncDest = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; + part->mBlendFuncSource = LLRender::BF_SOURCE_ALPHA; + part->mStartGlow = 0.f; + part->mEndGlow = 0.f; + part->mGlow = LLColor4U(0, 0, 0, 0); + LLViewerPartSim::getInstance()->addPart(part); } diff --git a/indra/newview/llviewerpartsource.h b/indra/newview/llviewerpartsource.h index 28702d36a2949017c7ff7d249af447691ab0bda6..12e926173b4f33f5cdf2e8a114fd566506a077c1 100755 --- a/indra/newview/llviewerpartsource.h +++ b/indra/newview/llviewerpartsource.h @@ -76,6 +76,7 @@ public: LLVector3 mLastUpdatePosAgent; LLPointer<LLViewerObject> mSourceObjectp; U32 mID; + LLViewerPart* mLastPart; //last particle emitted (for making particle ribbons) protected: U32 mType; @@ -85,7 +86,6 @@ protected: F32 mLastPartTime; LLUUID mOwnerUUID; LLPointer<LLViewerTexture> mImagep; - // Particle information U32 mPartFlags; // Flags for the particle U32 mDelay ; //delay to start particles @@ -114,7 +114,7 @@ public: // Returns a new particle source to attach to an object... static LLPointer<LLViewerPartSourceScript> unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, const S32 block_num); - static LLPointer<LLViewerPartSourceScript> unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp); + static LLPointer<LLViewerPartSourceScript> unpackPSS(LLViewerObject *source_objp, LLPointer<LLViewerPartSourceScript> pssp, LLDataPacker &dp, bool legacy); static LLPointer<LLViewerPartSourceScript> createPSS(LLViewerObject *source_objp, const LLPartSysData& particle_parameters); LLViewerTexture *getImage() const { return mImagep; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index c959166efddc81063968a5c8c464e9e9cc92d0cb..20b210e69a61d0822b6b17852cb40560a0c5acb0 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -44,6 +44,7 @@ #include "llagent.h" #include "llagentcamera.h" +#include "llavatarrenderinfoaccountant.h" #include "llcallingcard.h" #include "llcaphttpsender.h" #include "llcapabilitylistener.h" @@ -231,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 ; } @@ -305,7 +307,7 @@ public: /*CapabilityMap::const_iterator iter = regionp->getRegionImpl()->mCapabilities.begin(); while (iter!=regionp->getRegionImpl()->mCapabilities.end() ) { - llinfos<<"BaseCapabilitiesCompleteTracker Original "<<iter->first<<" "<< iter->second<<llendl; + llinfos << "BaseCapabilitiesCompleteTracker Original " << iter->first << " " << iter->second<<llendl; ++iter; } */ @@ -1585,6 +1587,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/llviewerregion.h b/indra/newview/llviewerregion.h index 109baccf9adfb91502b0e56dcc37805fb08b979d..8f8bfa23c17468abb9ac9f205b967242453980a8 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -343,7 +343,7 @@ public: void getNeighboringRegionsStatus( std::vector<S32>& regions ); const LLViewerRegionImpl * getRegionImpl() const { return mImpl; } LLViewerRegionImpl * getRegionImplNC() { return mImpl; } - + // implements the materials capability throttle bool materialsCapThrottled() const { return !mMaterialsCapThrottleTimer.hasExpired(); } void resetMaterialsCapThrottle(); @@ -382,6 +382,8 @@ public: LLDynamicArray<U32> mMapAvatars; LLDynamicArray<LLUUID> mMapAvatarIDs; + LLFrameTimer & getRenderInfoRequestTimer() { return mRenderInfoRequestTimer; }; + private: LLViewerRegionImpl * mImpl; @@ -443,6 +445,7 @@ private: // the materials capability throttle LLFrameTimer mMaterialsCapThrottleTimer; +LLFrameTimer mRenderInfoRequestTimer; }; inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 995eb599b80ae8b2390c4c1b3086c43c5ecf564e..553f6a2d5993ad2b10986137ca7d7efebdf8bc8a 100755 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -48,6 +48,13 @@ #define UNIFORM_ERRS LL_ERRS("Shader") #endif +static LLStaticHashedString sTexture0("texture0"); +static LLStaticHashedString sTexture1("texture1"); +static LLStaticHashedString sTex0("tex0"); +static LLStaticHashedString sTex1("tex1"); +static LLStaticHashedString sGlowMap("glowMap"); +static LLStaticHashedString sScreenMap("screenMap"); + // Lots of STL stuff in here, using namespace std to keep things more readable using std::vector; using std::pair; @@ -307,7 +314,6 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredMaterialWaterProgram[9+LLMaterial::SHADER_COUNT]); mShaderList.push_back(&gDeferredMaterialWaterProgram[13+LLMaterial::SHADER_COUNT]); mShaderList.push_back(&gDeferredAlphaProgram); - mShaderList.push_back(&gDeferredAlphaProgram); mShaderList.push_back(&gDeferredAlphaImpostorProgram); mShaderList.push_back(&gDeferredAlphaWaterProgram); mShaderList.push_back(&gDeferredSkinnedAlphaProgram); @@ -349,47 +355,6 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void) if (mReservedAttribs.empty()) { LLShaderMgr::initAttribsAndUniforms(); - - mAvatarUniforms.push_back("matrixPalette"); - mAvatarUniforms.push_back("gWindDir"); - mAvatarUniforms.push_back("gSinWaveParams"); - mAvatarUniforms.push_back("gGravity"); - - mWLUniforms.push_back("camPosLocal"); - - mTerrainUniforms.reserve(5); - mTerrainUniforms.push_back("detail_0"); - mTerrainUniforms.push_back("detail_1"); - mTerrainUniforms.push_back("detail_2"); - mTerrainUniforms.push_back("detail_3"); - mTerrainUniforms.push_back("alpha_ramp"); - - mGlowUniforms.push_back("glowDelta"); - mGlowUniforms.push_back("glowStrength"); - - mGlowExtractUniforms.push_back("minLuminance"); - mGlowExtractUniforms.push_back("maxExtractAlpha"); - mGlowExtractUniforms.push_back("lumWeights"); - mGlowExtractUniforms.push_back("warmthWeights"); - mGlowExtractUniforms.push_back("warmthAmount"); - - mShinyUniforms.push_back("origin"); - - mWaterUniforms.reserve(12); - mWaterUniforms.push_back("screenTex"); - mWaterUniforms.push_back("screenDepth"); - mWaterUniforms.push_back("refTex"); - mWaterUniforms.push_back("eyeVec"); - mWaterUniforms.push_back("time"); - mWaterUniforms.push_back("d1"); - mWaterUniforms.push_back("d2"); - mWaterUniforms.push_back("lightDir"); - mWaterUniforms.push_back("specular"); - mWaterUniforms.push_back("lightExp"); - mWaterUniforms.push_back("fogCol"); - mWaterUniforms.push_back("kd"); - mWaterUniforms.push_back("refScale"); - mWaterUniforms.push_back("waterHeight"); } } @@ -496,7 +461,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; @@ -977,7 +942,7 @@ BOOL LLViewerShaderMgr::loadShadersEnvironment() gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainV.glsl", GL_VERTEX_SHADER_ARB)); gTerrainProgram.mShaderFiles.push_back(make_pair("environment/terrainF.glsl", GL_FRAGMENT_SHADER_ARB)); gTerrainProgram.mShaderLevel = mVertexShaderLevel[SHADER_ENVIRONMENT]; - success = gTerrainProgram.createShader(NULL, &mTerrainUniforms); + success = gTerrainProgram.createShader(NULL, NULL); } if (!success) @@ -1015,7 +980,7 @@ BOOL LLViewerShaderMgr::loadShadersWater() gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER_ARB)); gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER_ARB)); gWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_WATER]; - success = gWaterProgram.createShader(NULL, &mWaterUniforms); + success = gWaterProgram.createShader(NULL, NULL); } if (success) @@ -1029,7 +994,7 @@ BOOL LLViewerShaderMgr::loadShadersWater() gUnderWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_WATER]; gUnderWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gUnderWaterProgram.createShader(NULL, &mWaterUniforms); + success = gUnderWaterProgram.createShader(NULL, NULL); } if (success) @@ -1047,7 +1012,7 @@ BOOL LLViewerShaderMgr::loadShadersWater() gTerrainWaterProgram.mShaderFiles.push_back(make_pair("environment/terrainWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gTerrainWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_ENVIRONMENT]; gTerrainWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - terrainWaterSuccess = gTerrainWaterProgram.createShader(NULL, &mTerrainUniforms); + terrainWaterSuccess = gTerrainWaterProgram.createShader(NULL, NULL); } /// Keep track of water shader levels @@ -1096,7 +1061,7 @@ BOOL LLViewerShaderMgr::loadShadersEffects() gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowV.glsl", GL_VERTEX_SHADER_ARB)); gGlowProgram.mShaderFiles.push_back(make_pair("effects/glowF.glsl", GL_FRAGMENT_SHADER_ARB)); gGlowProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT]; - success = gGlowProgram.createShader(NULL, &mGlowUniforms); + success = gGlowProgram.createShader(NULL, NULL); if (!success) { LLPipeline::sRenderGlow = FALSE; @@ -1110,7 +1075,7 @@ BOOL LLViewerShaderMgr::loadShadersEffects() gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractV.glsl", GL_VERTEX_SHADER_ARB)); gGlowExtractProgram.mShaderFiles.push_back(make_pair("effects/glowExtractF.glsl", GL_FRAGMENT_SHADER_ARB)); gGlowExtractProgram.mShaderLevel = mVertexShaderLevel[SHADER_EFFECT]; - success = gGlowExtractProgram.createShader(NULL, &mGlowExtractUniforms); + success = gGlowExtractProgram.createShader(NULL, NULL); if (!success) { LLPipeline::sRenderGlow = FALSE; @@ -1191,7 +1156,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() if (success) { - gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader"; + gDeferredDiffuseProgram.mName = "Deferred Diffuse Shader"; gDeferredDiffuseProgram.mShaderFiles.clear(); gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredDiffuseProgram.mShaderFiles.push_back(make_pair("deferred/diffuseIndexedF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1433,8 +1398,8 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() for (U32 i = 0; i < LL_DEFERRED_MULTI_LIGHT_COUNT; i++) { - if (success) - { + if (success) + { gDeferredMultiLightProgram[i].mName = llformat("Deferred MultiLight Shader %d", i); gDeferredMultiLightProgram[i].mShaderFiles.clear(); gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB)); @@ -1690,7 +1655,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); + success = gDeferredFullbrightShinyProgram.createShader(NULL, NULL); } if (success) @@ -1720,7 +1685,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSkinnedFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredSkinnedFullbrightShinyProgram.mShaderFiles.push_back(make_pair("deferred/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredSkinnedFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gDeferredSkinnedFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); + success = gDeferredSkinnedFullbrightShinyProgram.createShader(NULL, NULL); } if (success) @@ -1748,7 +1713,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredWaterProgram.mShaderFiles.push_back(make_pair("deferred/waterV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredWaterProgram.mShaderFiles.push_back(make_pair("deferred/waterF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredWaterProgram.createShader(NULL, &mWaterUniforms); + success = gDeferredWaterProgram.createShader(NULL, NULL); } if (success) @@ -1762,7 +1727,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredUnderWaterProgram.mShaderFiles.push_back(make_pair("deferred/waterV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredUnderWaterProgram.mShaderFiles.push_back(make_pair("deferred/underWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredUnderWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredUnderWaterProgram.createShader(NULL, &mWaterUniforms); + success = gDeferredUnderWaterProgram.createShader(NULL, NULL); } if (success) @@ -1798,7 +1763,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredSoftenWaterProgram.mShaderLevel = llmax(gDeferredSoftenWaterProgram.mShaderLevel, 2); } - success = gDeferredSoftenWaterProgram.createShader(NULL, &mWLUniforms); + success = gDeferredSoftenWaterProgram.createShader(NULL, NULL); } if (success) @@ -1844,7 +1809,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredAvatarShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0"); gDeferredAvatarShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredAvatarShadowProgram.createShader(NULL, &mAvatarUniforms); + success = gDeferredAvatarShadowProgram.createShader(NULL, NULL); } if (success) @@ -1866,7 +1831,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredTerrainProgram.mShaderFiles.push_back(make_pair("deferred/terrainF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredTerrainProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredTerrainProgram.createShader(NULL, &mTerrainUniforms); + success = gDeferredTerrainProgram.createShader(NULL, NULL); } if (success) @@ -1877,7 +1842,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gDeferredAvatarProgram.mShaderFiles.push_back(make_pair("deferred/avatarF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredAvatarProgram.createShader(NULL, &mAvatarUniforms); + success = gDeferredAvatarProgram.createShader(NULL, NULL); } if (success) @@ -1896,7 +1861,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", mVertexShaderLevel[SHADER_DEFERRED] > 1 ? "1" : "0"); gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; - success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms); + success = gDeferredAvatarAlphaProgram.createShader(NULL, NULL); gDeferredAvatarAlphaProgram.mFeatures.calculatesLighting = true; gDeferredAvatarAlphaProgram.mFeatures.hasLighting = true; @@ -1971,7 +1936,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredWLSkyProgram.mShaderFiles.push_back(make_pair("deferred/skyF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; gDeferredWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY; - success = gDeferredWLSkyProgram.createShader(NULL, &mWLUniforms); + success = gDeferredWLSkyProgram.createShader(NULL, NULL); } if (success) @@ -1982,7 +1947,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredWLCloudProgram.mShaderFiles.push_back(make_pair("deferred/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; gDeferredWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY; - success = gDeferredWLCloudProgram.createShader(NULL, &mWLUniforms); + success = gDeferredWLCloudProgram.createShader(NULL, NULL); } if (success) @@ -1993,7 +1958,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredStarProgram.mShaderFiles.push_back(make_pair("deferred/starsF.glsl", GL_FRAGMENT_SHADER_ARB)); gDeferredStarProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; gDeferredStarProgram.mShaderGroup = LLGLSLShader::SG_SKY; - success = gDeferredStarProgram.createShader(NULL, &mWLUniforms); + success = gDeferredStarProgram.createShader(NULL, NULL); } if (success) @@ -2345,7 +2310,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gObjectShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms); + success = gObjectShinyNonIndexedProgram.createShader(NULL, NULL); } if (success) @@ -2362,7 +2327,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; gObjectShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms); + success = gObjectShinyNonIndexedWaterProgram.createShader(NULL, NULL); } if (success) @@ -2378,7 +2343,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightShinyNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectFullbrightShinyNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, &mShinyUniforms); + success = gObjectFullbrightShinyNonIndexedProgram.createShader(NULL, NULL); } if (success) @@ -2396,7 +2361,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectFullbrightShinyNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; gObjectFullbrightShinyNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, &mShinyUniforms); + success = gObjectFullbrightShinyNonIndexedWaterProgram.createShader(NULL, NULL); } if (success) @@ -2496,12 +2461,11 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectBumpProgram.mShaderFiles.push_back(make_pair("objects/bumpF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectBumpProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; success = gObjectBumpProgram.createShader(NULL, NULL); - if (success) { //lldrawpoolbump assumes "texture0" has channel 0 and "texture1" has channel 1 gObjectBumpProgram.bind(); - gObjectBumpProgram.uniform1i("texture0", 0); - gObjectBumpProgram.uniform1i("texture1", 1); + gObjectBumpProgram.uniform1i(sTexture0, 0); + gObjectBumpProgram.uniform1i(sTexture1, 1); gObjectBumpProgram.unbind(); } } @@ -2650,7 +2614,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectShinyProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gObjectShinyProgram.createShader(NULL, &mShinyUniforms); + success = gObjectShinyProgram.createShader(NULL, NULL); } if (success) @@ -2667,7 +2631,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; gObjectShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gObjectShinyWaterProgram.createShader(NULL, &mShinyUniforms); + success = gObjectShinyWaterProgram.createShader(NULL, NULL); } if (success) @@ -2683,7 +2647,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyV.glsl", GL_VERTEX_SHADER_ARB)); gObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); + success = gObjectFullbrightShinyProgram.createShader(NULL, NULL); } if (success) @@ -2701,7 +2665,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; gObjectFullbrightShinyWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms); + success = gObjectFullbrightShinyWaterProgram.createShader(NULL, NULL); } if (mVertexShaderLevel[SHADER_AVATAR] > 0) @@ -2789,7 +2753,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectFullbrightShinyProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gSkinnedObjectFullbrightShinyProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, &mShinyUniforms); + success = gSkinnedObjectFullbrightShinyProgram.createShader(NULL, NULL); } if (success) @@ -2807,7 +2771,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectShinySimpleProgram.mShaderFiles.push_back(make_pair("objects/shinyF.glsl", GL_FRAGMENT_SHADER_ARB)); gSkinnedObjectShinySimpleProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectShinySimpleProgram.createShader(NULL, &mShinyUniforms); + success = gSkinnedObjectShinySimpleProgram.createShader(NULL, NULL); } if (success) @@ -2866,7 +2830,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinySkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectFullbrightShinyWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightShinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gSkinnedObjectFullbrightShinyWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, &mShinyUniforms); + success = gSkinnedObjectFullbrightShinyWaterProgram.createShader(NULL, NULL); } if (success) @@ -2886,7 +2850,7 @@ BOOL LLViewerShaderMgr::loadShadersObject() gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinySimpleSkinnedV.glsl", GL_VERTEX_SHADER_ARB)); gSkinnedObjectShinySimpleWaterProgram.mShaderFiles.push_back(make_pair("objects/shinyWaterF.glsl", GL_FRAGMENT_SHADER_ARB)); gSkinnedObjectShinySimpleWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT]; - success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, &mShinyUniforms); + success = gSkinnedObjectShinySimpleWaterProgram.createShader(NULL, NULL); } } @@ -2927,7 +2891,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarProgram.mShaderFiles.push_back(make_pair("avatar/avatarF.glsl", GL_FRAGMENT_SHADER_ARB)); gAvatarProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR]; - success = gAvatarProgram.createShader(NULL, &mAvatarUniforms); + success = gAvatarProgram.createShader(NULL, NULL); if (success) { @@ -2946,7 +2910,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() // Note: no cloth under water: gAvatarWaterProgram.mShaderLevel = llmin(mVertexShaderLevel[SHADER_AVATAR], 1); gAvatarWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; - success = gAvatarWaterProgram.createShader(NULL, &mAvatarUniforms); + success = gAvatarWaterProgram.createShader(NULL, NULL); } /// Keep track of avatar levels @@ -2965,7 +2929,7 @@ BOOL LLViewerShaderMgr::loadShadersAvatar() gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarV.glsl", GL_VERTEX_SHADER_ARB)); gAvatarPickProgram.mShaderFiles.push_back(make_pair("avatar/pickAvatarF.glsl", GL_FRAGMENT_SHADER_ARB)); gAvatarPickProgram.mShaderLevel = mVertexShaderLevel[SHADER_AVATAR]; - success = gAvatarPickProgram.createShader(NULL, &mAvatarUniforms); + success = gAvatarPickProgram.createShader(NULL, NULL); } if (success) @@ -3087,7 +3051,7 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gSplatTextureRectProgram.bind(); - gSplatTextureRectProgram.uniform1i("screenMap", 0); + gSplatTextureRectProgram.uniform1i(sScreenMap, 0); gSplatTextureRectProgram.unbind(); } } @@ -3103,8 +3067,8 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gGlowCombineProgram.bind(); - gGlowCombineProgram.uniform1i("glowMap", 0); - gGlowCombineProgram.uniform1i("screenMap", 1); + gGlowCombineProgram.uniform1i(sGlowMap, 0); + gGlowCombineProgram.uniform1i(sScreenMap, 1); gGlowCombineProgram.unbind(); } } @@ -3120,8 +3084,8 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gGlowCombineFXAAProgram.bind(); - gGlowCombineFXAAProgram.uniform1i("glowMap", 0); - gGlowCombineFXAAProgram.uniform1i("screenMap", 1); + gGlowCombineFXAAProgram.uniform1i(sGlowMap, 0); + gGlowCombineFXAAProgram.uniform1i(sScreenMap, 1); gGlowCombineFXAAProgram.unbind(); } } @@ -3138,8 +3102,8 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gTwoTextureAddProgram.bind(); - gTwoTextureAddProgram.uniform1i("tex0", 0); - gTwoTextureAddProgram.uniform1i("tex1", 1); + gTwoTextureAddProgram.uniform1i(sTex0, 0); + gTwoTextureAddProgram.uniform1i(sTex1, 1); } } @@ -3154,7 +3118,7 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gOneTextureNoColorProgram.bind(); - gOneTextureNoColorProgram.uniform1i("tex0", 0); + gOneTextureNoColorProgram.uniform1i(sTex0, 0); } } @@ -3169,7 +3133,7 @@ BOOL LLViewerShaderMgr::loadShadersInterface() if (success) { gSolidColorProgram.bind(); - gSolidColorProgram.uniform1i("tex0", 0); + gSolidColorProgram.uniform1i(sTex0, 0); gSolidColorProgram.unbind(); } } @@ -3273,7 +3237,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() gWLSkyProgram.mShaderFiles.push_back(make_pair("windlight/skyF.glsl", GL_FRAGMENT_SHADER_ARB)); gWLSkyProgram.mShaderLevel = mVertexShaderLevel[SHADER_WINDLIGHT]; gWLSkyProgram.mShaderGroup = LLGLSLShader::SG_SKY; - success = gWLSkyProgram.createShader(NULL, &mWLUniforms); + success = gWLSkyProgram.createShader(NULL, NULL); } if (success) @@ -3285,7 +3249,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight() gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB)); gWLCloudProgram.mShaderLevel = mVertexShaderLevel[SHADER_WINDLIGHT]; gWLCloudProgram.mShaderGroup = LLGLSLShader::SG_SKY; - success = gWLCloudProgram.createShader(NULL, &mWLUniforms); + success = gWLCloudProgram.createShader(NULL, NULL); } return success; diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index e4684c19d592ee0db17b3b16ee8786e36931118b..3d89f8d20a5326fbe9bead016eecc558fe205afa 100755 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -77,57 +77,6 @@ public: SHADER_COUNT }; - typedef enum - { - SHINY_ORIGIN = END_RESERVED_UNIFORMS - } eShinyUniforms; - - typedef enum - { - WATER_SCREENTEX = END_RESERVED_UNIFORMS, - WATER_SCREENDEPTH, - WATER_REFTEX, - WATER_EYEVEC, - WATER_TIME, - WATER_WAVE_DIR1, - WATER_WAVE_DIR2, - WATER_LIGHT_DIR, - WATER_SPECULAR, - WATER_SPECULAR_EXP, - WATER_FOGCOLOR, - WATER_FOGDENSITY, - WATER_REFSCALE, - WATER_WATERHEIGHT, - } eWaterUniforms; - - typedef enum - { - WL_CAMPOSLOCAL = END_RESERVED_UNIFORMS, - WL_WATERHEIGHT - } eWLUniforms; - - typedef enum - { - TERRAIN_DETAIL0 = END_RESERVED_UNIFORMS, - TERRAIN_DETAIL1, - TERRAIN_DETAIL2, - TERRAIN_DETAIL3, - TERRAIN_ALPHARAMP - } eTerrainUniforms; - - typedef enum - { - GLOW_DELTA = END_RESERVED_UNIFORMS - } eGlowUniforms; - - typedef enum - { - AVATAR_MATRIX = END_RESERVED_UNIFORMS, - AVATAR_WIND, - AVATAR_SINWAVE, - AVATAR_GRAVITY, - } eAvatarUniforms; - // simple model of forward iterator // http://www.sgi.com/tech/stl/ForwardIterator.html class shader_iter @@ -386,4 +335,3 @@ extern LLGLSLShader gNormalMapGenProgram; extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; extern LLGLSLShader gDeferredMaterialWaterProgram[LLMaterial::SHADER_COUNT*2]; #endif - diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 84f66c359fbda3ebcdb3eb8cc54331f97731718e..693eca8a061ba89c39022dfd346a126565e817f8 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -1422,7 +1422,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 +1747,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 +2828,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 d64db19733b4e658355dccf3db9e7f0cfb6200af..783d1f220226e005091ffcbb96fb694f57214775 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) @@ -561,38 +561,62 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image) llassert_always(mInitialized) ; llassert(image); if (image->isInImageList()) - { - llinfos << "LLViewerTextureList::addImageToList - Image already in list" << llendl; + { // Flag is already set? + llwarns << "LLViewerTextureList::addImageToList - image " << image->getID() << " already in list" << llendl; } + else + { if((mImageList.insert(image)).second != true) { - llinfos << "Error happens when insert image to mImageList!" << llendl ; + llwarns << "Error happens when insert image " << image->getID() << " into mImageList!" << llendl ; } - image->setInImageList(TRUE) ; } +} void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image) { assert_main_thread(); llassert_always(mInitialized) ; llassert(image); - if (!image->isInImageList()) + + S32 count = 0; + if (image->isInImageList()) + { + count = mImageList.erase(image) ; + if(count != 1) { - llinfos << "RefCount: " << image->getNumRefs() << llendl ; + llinfos << "Image " << image->getID() + << " had mInImageList set but mImageList.erase() returned " << count + << llendl; + } + } + else + { // Something is wrong, image is expected in list or callers should check first + llinfos << "Calling removeImageFromList() for " << image->getID() + << " but doesn't have mInImageList set" + << " ref count is " << image->getNumRefs() + << llendl; uuid_map_t::iterator iter = mUUIDMap.find(image->getID()); - if(iter == mUUIDMap.end() || iter->second != image) + if(iter == mUUIDMap.end()) { - llinfos << "Image is not in mUUIDMap!" << llendl ; + llinfos << "Image " << image->getID() << " is also not in mUUIDMap!" << llendl ; } - llinfos << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl; + else if (iter->second != image) + { + llinfos << "Image " << image->getID() << " was in mUUIDMap but with different pointer" << llendl ; } - - S32 count = mImageList.erase(image) ; - llassert(count == 1); - if(count != 1) + else { - llinfos << image->getID() << " removed with non-one count of " << count << llendl; + llinfos << "Image " << image->getID() << " was in mUUIDMap with same pointer" << llendl ; + } + count = mImageList.erase(image) ; + if(count != 0) + { // it was in the list already? + llwarns << "Image " << image->getID() + << " had mInImageList false but mImageList.erase() returned " << count + << llendl; + } } image->setInImageList(FALSE) ; @@ -1281,7 +1305,7 @@ S32 LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_m max_texmem = llmin(max_texmem, (S32)(system_ram/2)); else max_texmem = llmin(max_texmem, (S32)(system_ram)); - + // limit the texture memory to a multiple of the default if we've found some cards to behave poorly otherwise max_texmem = llmin(max_texmem, (S32) (mem_multiplier * (F32) max_texmem)); @@ -1349,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); @@ -1421,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 40b856007104ace5beb23386dc722785d25b21fe..cb7536edceb09a8383d11c929dae28695bf63a12 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -151,6 +151,7 @@ #include "lltexturecache.h" #include "lltexturefetch.h" #include "lltextureview.h" +#include "lltoast.h" #include "lltool.h" #include "lltoolbarview.h" #include "lltoolcomp.h" @@ -197,6 +198,8 @@ #include "llagentui.h" #include "llwearablelist.h" +#include "llviewereventrecorder.h" + #include "llnotifications.h" #include "llnotificationsutil.h" #include "llnotificationmanager.h" @@ -312,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; @@ -333,9 +336,10 @@ public: mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f ); // Draw stuff growing up from right lower corner of screen - U32 xpos = mWindow->getWorldViewWidthScaled() - 350; - U32 ypos = 64; - const U32 y_inc = 20; + S32 xpos = mWindow->getWorldViewWidthScaled() - 400; + xpos = llmax(xpos, 0); + S32 ypos = 64; + const S32 y_inc = 20; clearText(); @@ -635,6 +639,42 @@ public: LLVertexBuffer::sSetCount = LLImageGL::sUniqueCount = gPipeline.mNumVisibleNodes = LLPipeline::sVisibleLightCount = 0; } + if (gSavedSettings.getBOOL("DebugShowAvatarRenderInfo")) + { + std::map<std::string, LLVOAvatar*> sorted_avs; + + std::vector<LLCharacter*>::iterator sort_iter = LLCharacter::sInstances.begin(); + while (sort_iter != LLCharacter::sInstances.end()) + { + LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*sort_iter); + if (avatar && + !avatar->isDead()) // Not dead yet + { + // Stuff into a sorted map so the display is ordered + sorted_avs[avatar->getFullname()] = avatar; + } + sort_iter++; + } + + std::string trunc_name; + std::map<std::string, LLVOAvatar*>::reverse_iterator av_iter = sorted_avs.rbegin(); // Put "A" at the top + while (av_iter != sorted_avs.rend()) + { + LLVOAvatar* avatar = av_iter->second; + + avatar->calculateUpdateRenderCost(); // Make sure the numbers are up-to-date + + trunc_name = utf8str_truncate(avatar->getFullname(), 16); + addText(xpos, ypos, llformat("%s : rez %d, weight %d, bytes %d area %.2f", + trunc_name.c_str(), + avatar->getRezzedStatus(), + avatar->getVisualComplexity(), + avatar->getAttachmentGeometryBytes(), + avatar->getAttachmentSurfaceArea())); + ypos += y_inc; + av_iter++; + } + } if (gSavedSettings.getBOOL("DebugShowRenderMatrices")) { addText(xpos, ypos, llformat("%.4f .%4f %.4f %.4f", gGLProjection[12], gGLProjection[13], gGLProjection[14], gGLProjection[15])); @@ -916,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) ) @@ -944,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; @@ -1335,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 } @@ -1998,6 +2047,9 @@ void LLViewerWindow::shutdownViews() } llinfos << "Global views cleaned." << llendl ; + LLNotificationsUI::LLToast::cleanupToasts(); + llinfos << "Leftover toast cleaned up." << llendl; + // DEV-40930: Clear sModalStack. Otherwise, any LLModalDialog left open // will crump with LL_ERRS. LLModalDialog::shutdownModals(); @@ -2478,6 +2530,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; } @@ -2492,12 +2546,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; } } @@ -2507,6 +2563,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 @@ -2521,11 +2578,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; } @@ -2565,18 +2624,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; } @@ -2584,6 +2652,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; } @@ -2632,7 +2702,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) { @@ -2655,14 +2725,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; @@ -2671,8 +2734,6 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask) void LLViewerWindow::handleScrollWheel(S32 clicks) { - LLView::sMouseHandlerMessage.clear(); - LLUI::resetMouseIdleTimer(); LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 1a050800b4c61168ea20c8cebce4a289abb06b77..c3c1edb0a3cd884266fa6037daca372b0854fa17 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -58,6 +58,7 @@ #include "llhudmanager.h" #include "llhudnametag.h" #include "llhudtext.h" // for mText/mDebugText +#include "llimview.h" #include "llinitparam.h" #include "llkeyframefallmotion.h" #include "llkeyframestandmotion.h" @@ -666,8 +667,9 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, LLAvatarAppearance(&gAgentWearables), LLViewerObject(id, pcode, regionp), mSpecialRenderMode(0), - mAttachmentGeometryBytes(0), - mAttachmentSurfaceArea(0.f), + mAttachmentGeometryBytes(-1), + mAttachmentSurfaceArea(-1.f), + mReportedVisualComplexity(-1), mTurning(FALSE), mLastSkeletonSerialNum( 0 ), mIsSitting(FALSE), @@ -701,9 +703,11 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mFullyLoaded(FALSE), mPreviousFullyLoaded(FALSE), mFullyLoadedInitialized(FALSE), + mVisualComplexity(0), + mVisualComplexityStale(TRUE), mLoadedCallbacksPaused(FALSE), mHasPelvisOffset( FALSE ), - mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar")), + mRenderUnloadedAvatar(LLCachedControl<bool>(gSavedSettings, "RenderUnloadedAvatar", false)), mLastRezzedStatus(-1), mIsEditingAppearance(FALSE), mUseLocalAppearance(FALSE), @@ -769,6 +773,13 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mLastPelvisToFoot = 0.0f; mPelvisFixup = 0.0f; mLastPelvisFixup = 0.0f; + + mCachedVisualMute = !isSelf(); + mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() + 5.0; + mVisuallyMuteSetting = VISUAL_MUTE_NOT_SET; + + F32 color_value = (F32) (getID().mData[0]); + mMutedAVColor = calcMutedAVColor(color_value, 0, 256); } std::string LLVOAvatar::avString() const @@ -923,7 +934,7 @@ void LLVOAvatar::deleteLayerSetCaches(bool clearAll) } if (mBakedTextureDatas[i].mMaskTexName) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName)); + LLImageGL::deleteTextures(1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName)); mBakedTextureDatas[i].mMaskTexName = 0 ; } } @@ -2696,8 +2707,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()) { @@ -2923,7 +2934,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) { @@ -2972,16 +2983,94 @@ void LLVOAvatar::slamPosition() mRoot->updateWorldMatrixChildren(); } -bool LLVOAvatar::isVisuallyMuted() const +bool LLVOAvatar::isVisuallyMuted() { - static LLCachedControl<U32> max_attachment_bytes(gSavedSettings, "RenderAutoMuteByteLimit"); - static LLCachedControl<F32> max_attachment_area(gSavedSettings, "RenderAutoMuteSurfaceAreaLimit"); - - return LLMuteList::getInstance()->isMuted(getID()) - || (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) - || (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f); + bool muted = false; + + if (!isSelf()) + { + 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) + // * own avatar is never visually muted + // * if on the "always draw normally" list, draw them normally + // * if on the "always visually mute" list, mute them + // * draw them normally if they meet the following criteria: + // - within the closest N avatars OR on friends list OR in an IM chat + // - AND aren't over the thresholds + // * otherwise visually mute all other avatars + + 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 + muted = true; + } + else if (mVisuallyMuteSetting == NEVER_VISUAL_MUTE) + { // Never show as impostor + muted = false; + } + else + { + F64 now = LLFrameTimer::getTotalSeconds(); + + if (now < mCachedVisualMuteUpdateTime) + { // Use cached mute value + muted = mCachedVisualMute; + } + else + { // Determine if visually muted or not + + U32 max_cost = (U32) (max_render_cost*(LLVOAvatar::sLODFactor+0.5)); + + muted = LLMuteList::getInstance()->isMuted(getID()) || + (mAttachmentGeometryBytes > max_attachment_bytes && max_attachment_bytes > 0) || + (mAttachmentSurfaceArea > max_attachment_area && max_attachment_area > 0.f) || + (mVisualComplexity > max_cost && max_render_cost > 0); + + // Could be part of the grand || collection above, but yanked out to make the logic visible + if (!muted) + { + if (sMaxVisible > 0) + { // They are above the visibilty rank - mute them + muted = (mVisibilityRank > sMaxVisible); + } + + // Always draw friends or those in IMs. Needs UI? + if ((render_auto_mute_functions & 0x02) && + (muted || sMaxVisible == 0)) // Don't mute friends or IMs + { + muted = !(LLAvatarTracker::instance().isBuddy(getID())); + if (muted) + { // Not a friend, so they are muted ... are they in an IM? + LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL,getID()); + muted = !gIMMgr->hasSession(session_id); + } + } + } + + // Save visual mute state and set interval for updating + const F64 SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES = 1.5; + mCachedVisualMuteUpdateTime = now + SECONDS_BETWEEN_RENDER_AUTO_MUTE_UPDATES; + mCachedVisualMute = muted; + } + } + } + } + + return muted; +} + +void LLVOAvatar::forceUpdateVisualMuteSettings() +{ + // Set the cache time so it's updated ASAP + mCachedVisualMuteUpdateTime = LLFrameTimer::getTotalSeconds() - 1.0; } + //------------------------------------------------------------------------ // updateCharacter() // called on both your avatar and other avatars @@ -3077,7 +3166,8 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) // the rest should only be done occasionally for far away avatars //-------------------------------------------------------------------- - if (visible && (!isSelf() || isVisuallyMuted()) && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) + bool visually_muted = isVisuallyMuted(); + if (visible && (!isSelf() || visually_muted) && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) { const LLVector4a* ext = mDrawable->getSpatialExtents(); LLVector4a size; @@ -3086,8 +3176,8 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f); - if (isVisuallyMuted()) - { // muted avatars update at 16 hz + if (visually_muted) + { // visually muted avatars update at 16 hz mUpdatePeriod = 16; } else if (mVisibilityRank <= LLVOAvatar::sMaxVisible || @@ -3300,8 +3390,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); @@ -3725,11 +3815,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) { //LOD changed or new mesh created, allocate new vertex buffer if needed if (needs_rebuild || mDirtyMesh >= 2 || mVisibilityRank <= 4) { - updateMeshData(); + updateMeshData(); mDirtyMesh = 0; - mNeedsSkin = TRUE; - mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); - } + mNeedsSkin = TRUE; + mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY); + } } if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0) @@ -3887,9 +3977,11 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) BOOL first_pass = TRUE; if (!LLDrawPoolAvatar::sSkipOpaque) { + bool visually_muted = isVisuallyMuted(); + if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender) { - if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy) + if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy || visually_muted) { LLViewerJoint* head_mesh = getViewerJoint(MESH_ID_HEAD); if (head_mesh) @@ -3899,7 +3991,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) first_pass = FALSE; } } - if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy) + if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy || visually_muted) { LLViewerJoint* upper_mesh = getViewerJoint(MESH_ID_UPPER_BODY); if (upper_mesh) @@ -3909,7 +4001,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) first_pass = FALSE; } - if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy) + if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy || visually_muted) { LLViewerJoint* lower_mesh = getViewerJoint(MESH_ID_LOWER_BODY); if (lower_mesh) @@ -5429,7 +5521,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 { @@ -5462,8 +5562,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; @@ -5481,6 +5600,8 @@ const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_o return 0; } + mVisualComplexityStale = TRUE; + if (viewer_object->isSelected()) { LLSelectMgr::getInstance()->updateSelectionCenter(); @@ -5532,13 +5653,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); } } @@ -5628,6 +5758,7 @@ BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object) if (attachment->isObjectAttached(viewer_object)) { + mVisualComplexityStale = TRUE; cleanupAttachedMesh( viewer_object ); attachment->removeObject(viewer_object); lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl; @@ -5844,6 +5975,28 @@ BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const +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 @@ -7177,7 +7330,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture } U32 gl_name; - LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_ALPHA8, 1, &gl_name ); + LLImageGL::generateTextures(1, &gl_name ); stop_glerror(); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name); @@ -7214,7 +7367,7 @@ void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture maskData->mLastDiscardLevel = discard_level; if (self->mBakedTextureDatas[baked_index].mMaskTexName) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, &(self->mBakedTextureDatas[baked_index].mMaskTexName)); + LLImageGL::deleteTextures(1, &(self->mBakedTextureDatas[baked_index].mMaskTexName)); } self->mBakedTextureDatas[baked_index].mMaskTexName = gl_name; found_texture_id = true; @@ -7734,9 +7887,9 @@ void LLVOAvatar::updateImpostors() LLCharacter::sAllowInstancesChange = TRUE ; } -BOOL LLVOAvatar::isImpostor() const +BOOL LLVOAvatar::isImpostor() { - return (isVisuallyMuted() || (sUseImpostors && mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE; + return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE; } @@ -7779,135 +7932,181 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d angle.mV[2] = da; } + void LLVOAvatar::idleUpdateRenderCost() { - static const U32 ARC_BODY_PART_COST = 200; + static LLCachedControl<U32> max_render_cost(gSavedSettings, "RenderAutoMuteRenderWeightLimit", 0); static const U32 ARC_LIMIT = 20000; - static std::set<LLUUID> all_textures; - if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_ATTACHMENT_BYTES)) { //set debug text to attachment geometry bytes here so render cost will override setDebugText(llformat("%.1f KB, %.2f m^2", mAttachmentGeometryBytes/1024.f, mAttachmentSurfaceArea)); } - if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME)) + if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME) && max_render_cost == 0) { return; } - U32 cost = 0; - LLVOVolume::texture_cost_t textures; + calculateUpdateRenderCost(); // Update mVisualComplexity if needed + + if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME)) + { + std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); + setDebugText(llformat("%s %d", viz_string.c_str(), mVisualComplexity)); + F32 green = 1.f-llclamp(((F32) mVisualComplexity-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f); + F32 red = llmin((F32) mVisualComplexity/(F32)ARC_LIMIT, 1.f); + mText->setColor(LLColor4(red,green,0,1)); + } +} - for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) + +// Calculations for mVisualComplexity value +void LLVOAvatar::calculateUpdateRenderCost() +{ + static const U32 ARC_BODY_PART_COST = 200; + + // Diagnostic list of all textures on our avatar + static std::set<LLUUID> all_textures; + + if (mVisualComplexityStale) { - const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); - ETextureIndex tex_index = baked_dict->mTextureIndex; - if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT))) + mVisualComplexityStale = FALSE; + U32 cost = 0; + LLVOVolume::texture_cost_t textures; + + for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++) { - if (isTextureVisible(tex_index)) + const LLAvatarAppearanceDictionary::BakedEntry *baked_dict = LLAvatarAppearanceDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index); + ETextureIndex tex_index = baked_dict->mTextureIndex; + if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT))) { - cost +=ARC_BODY_PART_COST; + if (isTextureVisible(tex_index)) + { + cost +=ARC_BODY_PART_COST; + } } } - } - for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); - iter != mAttachmentPoints.end(); - ++iter) - { - LLViewerJointAttachment* attachment = iter->second; - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) + for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); + iter != mAttachmentPoints.end(); + ++iter) { - const LLViewerObject* attached_object = (*attachment_iter); - if (attached_object && !attached_object->isHUDAttachment()) + LLViewerJointAttachment* attachment = iter->second; + for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); + attachment_iter != attachment->mAttachedObjects.end(); + ++attachment_iter) { - textures.clear(); - const LLDrawable* drawable = attached_object->mDrawable; - if (drawable) + const LLViewerObject* attached_object = (*attachment_iter); + if (attached_object && !attached_object->isHUDAttachment()) { - const LLVOVolume* volume = drawable->getVOVolume(); - if (volume) + textures.clear(); + const LLDrawable* drawable = attached_object->mDrawable; + if (drawable) { - cost += volume->getRenderCost(textures); - - const_child_list_t children = volume->getChildren(); - for (const_child_list_t::const_iterator child_iter = children.begin(); - child_iter != children.end(); - ++child_iter) + const LLVOVolume* volume = drawable->getVOVolume(); + if (volume) { - LLViewerObject* child_obj = *child_iter; - LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); - if (child) + cost += volume->getRenderCost(textures); + + const_child_list_t children = volume->getChildren(); + for (const_child_list_t::const_iterator child_iter = children.begin(); + child_iter != children.end(); + ++child_iter) { - cost += child->getRenderCost(textures); + LLViewerObject* child_obj = *child_iter; + LLVOVolume *child = dynamic_cast<LLVOVolume*>( child_obj ); + if (child) + { + cost += child->getRenderCost(textures); + } } - } - for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) - { - // add the cost of each individual texture in the linkset - cost += iter->second; + for (LLVOVolume::texture_cost_t::iterator iter = textures.begin(); iter != textures.end(); ++iter) + { + // add the cost of each individual texture in the linkset + cost += iter->second; + } } } } } - } - - } - + } - // Diagnostic output to identify all avatar-related textures. - // Does not affect rendering cost calculation. - // Could be wrapped in a debug option if output becomes problematic. - if (isSelf()) - { - // print any attachment textures we didn't already know about. - for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it) + // Diagnostic output to identify all avatar-related textures. + // Does not affect rendering cost calculation. + // Could be wrapped in a debug option if output becomes problematic. + if (isSelf()) { - LLUUID image_id = it->first; - if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) - continue; - if (all_textures.find(image_id) == all_textures.end()) + // print any attachment textures we didn't already know about. + for (LLVOVolume::texture_cost_t::iterator it = textures.begin(); it != textures.end(); ++it) { - // attachment texture not previously seen. - llinfos << "attachment_texture: " << image_id.asString() << llendl; - all_textures.insert(image_id); + LLUUID image_id = it->first; + if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) + continue; + if (all_textures.find(image_id) == all_textures.end()) + { + // attachment texture not previously seen. + llinfos << "attachment_texture: " << image_id.asString() << llendl; + all_textures.insert(image_id); + } } - } - // print any avatar textures we didn't already know about - for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); + // print any avatar textures we didn't already know about + for (LLAvatarAppearanceDictionary::Textures::const_iterator iter = LLAvatarAppearanceDictionary::getInstance()->getTextures().begin(); iter != LLAvatarAppearanceDictionary::getInstance()->getTextures().end(); - ++iter) - { - const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; - // TODO: MULTI-WEARABLE: handle multiple textures for self - const LLViewerTexture* te_image = getImage(iter->first,0); - if (!te_image) - continue; - LLUUID image_id = te_image->getID(); - if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) - continue; - if (all_textures.find(image_id) == all_textures.end()) + ++iter) { - llinfos << "local_texture: " << texture_dict->mName << ": " << image_id << llendl; - all_textures.insert(image_id); + const LLAvatarAppearanceDictionary::TextureEntry *texture_dict = iter->second; + // TODO: MULTI-WEARABLE: handle multiple textures for self + const LLViewerTexture* te_image = getImage(iter->first,0); + if (!te_image) + continue; + LLUUID image_id = te_image->getID(); + if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR) + continue; + if (all_textures.find(image_id) == all_textures.end()) + { + llinfos << "local_texture: " << texture_dict->mName << ": " << image_id << llendl; + all_textures.insert(image_id); + } } } + + mVisualComplexity = cost; } +} - - std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); - setDebugText(llformat("%s %d", viz_string.c_str(), cost)); - mVisualComplexity = cost; - F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f); - F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f); - mText->setColor(LLColor4(red,green,0,1)); + +// static +LLColor4 LLVOAvatar::calcMutedAVColor(F32 value, S32 range_low, S32 range_high) +{ + F32 clamped_value = llmin(value, (F32) range_high); + clamped_value = llmax(value, (F32) range_low); + F32 spectrum = (clamped_value / range_high); // spectrum is between 0 and 1.f + + // Array of colors. These are arranged so only one RGB color changes between each step, + // and it loops back to red so there is an even distribution. It is not a heat map + const S32 NUM_SPECTRUM_COLORS = 7; + static LLColor4 * spectrum_color[NUM_SPECTRUM_COLORS] = { &LLColor4::red, &LLColor4::magenta, &LLColor4::blue, &LLColor4::cyan, &LLColor4::green, &LLColor4::yellow, &LLColor4::red }; + + spectrum = spectrum * (NUM_SPECTRUM_COLORS - 1); // Scale to range of number of colors + S32 spectrum_index_1 = floor(spectrum); // Desired color will be after this index + S32 spectrum_index_2 = spectrum_index_1 + 1; // and before this index (inclusive) + F32 fractBetween = spectrum - (F32)(spectrum_index_1); // distance between the two indexes (0-1) + + LLColor4 new_color = lerp(*spectrum_color[spectrum_index_1], *spectrum_color[spectrum_index_2], fractBetween); + new_color.normalize(); + new_color *= 0.7f; // Tone it down a bit + + //llinfos << "From value " << std::setprecision(3) << value << " returning color " << new_color + // << " using indexes " << spectrum_index_1 << ", " << spectrum_index_2 + // << " and fractBetween " << fractBetween + // << llendl; + + return new_color; } // static diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b05eed344b60ef3877de0f6719f4240bfc349e33..9d45a74ecc931de48e27a79af429cad8ab624670 100755 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -250,6 +250,20 @@ public: static void invalidateNameTags(); void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font); void idleUpdateRenderCost(); + void calculateUpdateRenderCost(); + void updateVisualComplexity() { mVisualComplexityStale = TRUE; } + + S32 getVisualComplexity() { return mVisualComplexity; }; // Numbers calculated here by rendering AV + S32 getAttachmentGeometryBytes() { return mAttachmentGeometryBytes; }; // number of bytes in attached geometry + F32 getAttachmentSurfaceArea() { return mAttachmentSurfaceArea; }; // estimated surface area of attachments + + S32 getReportedVisualComplexity() { return mReportedVisualComplexity; }; // Numbers as reported by the SL server + void setReportedVisualComplexity(S32 value) { mReportedVisualComplexity = value; }; + + S32 getUpdatePeriod() { return mUpdatePeriod; }; + const LLColor4 & getMutedAVColor() { return mMutedAVColor; }; + + void idleUpdateBelowWater(); //-------------------------------------------------------------------- @@ -303,12 +317,15 @@ public: static void logPendingPhasesAllAvatars(); void logMetricsTimerRecord(const std::string& phase_name, F32 elapsed, bool completed); + static LLColor4 calcMutedAVColor(F32 value, S32 range_low, S32 range_high); + protected: LLViewerStats::PhaseMap& getPhases() { return mPhases; } BOOL updateIsFullyLoaded(); BOOL processFullyLoadedChange(bool loading); void updateRuthTimer(bool loading); F32 calcMorphAmount(); + private: BOOL mFirstFullyVisible; BOOL mFullyLoaded; @@ -316,6 +333,8 @@ private: BOOL mFullyLoadedInitialized; S32 mFullyLoadedFrameCounter; S32 mVisualComplexity; + BOOL mVisualComplexityStale; + LLColor4 mMutedAVColor; LLFrameTimer mFullyLoadedTimer; LLFrameTimer mRuthTimer; @@ -369,7 +388,18 @@ public: public: U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0); - bool isVisuallyMuted() const; + bool isVisuallyMuted(); + void setCachedVisualMute(bool muted) { mCachedVisualMute = muted; }; + void forceUpdateVisualMuteSettings(); + + enum VisualMuteSettings + { + VISUAL_MUTE_NOT_SET = 0, + ALWAYS_VISUAL_MUTE = 1, + NEVER_VISUAL_MUTE = 2 + }; + void setVisualMuteSettings(VisualMuteSettings set) { mVisuallyMuteSetting = set; }; + VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; }; U32 renderRigid(); U32 renderSkinned(EAvatarRenderPass pass); @@ -380,9 +410,11 @@ public: static void destroyGL(); static void restoreGL(); S32 mSpecialRenderMode; // special lighting - U32 mAttachmentGeometryBytes; //number of bytes in attached geometry + S32 mAttachmentGeometryBytes; //number of bytes in attached geometry F32 mAttachmentSurfaceArea; //estimated surface area of attachments + S32 mReportedVisualComplexity; // Numbers as reported by the SL server + private: bool shouldAlphaMask(); @@ -392,6 +424,11 @@ private: S32 mUpdatePeriod; S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer. + bool mCachedVisualMute; // cached return value for isVisuallyMuted() + F64 mCachedVisualMuteUpdateTime; // Time to update mCachedVisualMute + + VisualMuteSettings mVisuallyMuteSetting; // Always or never visually mute this AV + //-------------------------------------------------------------------- // Morph masks //-------------------------------------------------------------------- @@ -430,7 +467,7 @@ private: // Impostors //-------------------------------------------------------------------- public: - BOOL isImpostor() const; + BOOL isImpostor(); BOOL needsImpostorUpdate() const; const LLVector3& getImpostorOffset() const; const LLVector2& getImpostorDim() const; @@ -694,6 +731,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 15628d5ab2a85e66e06b6002a3edfe6a0d61639f..9ce99444d9647e216699b11d2c0a530ea81e1b9c 100755 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -3066,7 +3066,7 @@ void LLVOAvatarSelf::deleteScratchTextures() namep; namep = sScratchTexNames.getNextData() ) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, 0, -1, 1, (U32 *)namep ); + LLImageGL::deleteTextures(1, (U32 *)namep ); stop_glerror(); } diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp index cab5c4bc1dfb05512b0e1e21ed2154f437e686ca..591d5cae0b139abad2b17e6cfac85f747cbaa32a 100755 --- a/indra/newview/llvograss.cpp +++ b/indra/newview/llvograss.cpp @@ -476,6 +476,7 @@ void LLVOGrass::getGeometry(S32 idx, LLStrider<LLVector3>& normalsp, LLStrider<LLVector2>& texcoordsp, LLStrider<LLColor4U>& colorsp, + LLStrider<LLColor4U>& emissivep, LLStrider<U16>& indicesp) { if(!mNumBlades)//stop rendering grass @@ -708,7 +709,11 @@ void LLGrassPartition::getGeometry(LLSpatialGroup* group) facep->setIndicesIndex(index_count); facep->setVertexBuffer(buffer); facep->setPoolType(LLDrawPool::POOL_ALPHA); - object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, indicesp); + + //dummy parameter (unused by this implementation) + LLStrider<LLColor4U> emissivep; + + object->getGeometry(facep->getTEOffset(), verticesp, normalsp, texcoordsp, colorsp, emissivep, indicesp); vertex_count += facep->getGeomCount(); index_count += facep->getIndicesCount(); diff --git a/indra/newview/llvograss.h b/indra/newview/llvograss.h index 122806766de78505e5164f00446dd3fb6118bc08..e54de854122fb871949abaf49decb056fb4962ca 100755 --- a/indra/newview/llvograss.h +++ b/indra/newview/llvograss.h @@ -63,6 +63,7 @@ public: LLStrider<LLVector3>& normalsp, LLStrider<LLVector2>& texcoordsp, LLStrider<LLColor4U>& colorsp, + LLStrider<LLColor4U>& emissivep, LLStrider<U16>& indicesp); void updateFaceSize(S32 idx) { } diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index af55c8f741ad800fba5c576def69a47daca9b7e7..815965fb0a7d495152b48350d1a0e9ead77f8bf7 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 cff355160709eb86fff70685073bbeaba04922eb..9497041482b6253823d11c69ba867aa437e9dd4a 100755 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -524,25 +524,25 @@ void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries) { LLViewerRegion *region = gAgent.getRegion(); - if ( region && (mVoiceEnabled || !mIsInitialized)) + // If we've not received the capability yet, return. + // the password will remain empty, so we'll remain in + // stateIdle + if ( region && + region->capabilitiesReceived() && + (mVoiceEnabled || !mIsInitialized)) { std::string url = region->getCapability("ProvisionVoiceAccountRequest"); - if ( url.empty() ) + if ( !url.empty() ) { - // we've not received the capability yet, so return. - // the password will remain empty, so we'll remain in - // stateIdle - return; - } - - LLHTTPClient::post( - url, - LLSD(), - new LLVivoxVoiceAccountProvisionResponder(retries)); + LLHTTPClient::post( + url, + LLSD(), + new LLVivoxVoiceAccountProvisionResponder(retries)); - setState(stateConnectorStart); + setState(stateConnectorStart); + } } } @@ -786,7 +786,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(); @@ -6892,6 +6891,9 @@ void LLVivoxProtocolParser::processResponse(std::string tag) */ // We don't need to process this, but we also shouldn't warn on it, since that confuses people. } + else if (!stricmp(eventTypeCstr, "VoiceServiceConnectionStateChangedEvent")) + { // Yet another ignored event + } else { LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL; diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp index 8ed86b4fd512a6fc95632194207a6c88c88421bd..9f4f11b317e508eecf06b7a4289b82f23e45f7a6 100755 --- a/indra/newview/llvopartgroup.cpp +++ b/indra/newview/llvopartgroup.cpp @@ -49,17 +49,11 @@ const F32 MAX_PART_LIFETIME = 120.f; extern U64 gFrameTime; LLPointer<LLVertexBuffer> LLVOPartGroup::sVB = NULL; -S32 LLVOPartGroup::sVBSlotFree[]; -S32* LLVOPartGroup::sVBSlotCursor = NULL; +S32 LLVOPartGroup::sVBSlotCursor = 0; void LLVOPartGroup::initClass() { - for (S32 i = 0; i < LL_MAX_PARTICLE_COUNT; ++i) - { - sVBSlotFree[i] = i; - } - - sVBSlotCursor = sVBSlotFree; + } //static @@ -124,36 +118,33 @@ void LLVOPartGroup::destroyGL() //static S32 LLVOPartGroup::findAvailableVBSlot() { - if (sVBSlotCursor >= sVBSlotFree+LL_MAX_PARTICLE_COUNT) + if (sVBSlotCursor >= LL_MAX_PARTICLE_COUNT) { //no more available slots return -1; } - S32 ret = *sVBSlotCursor; - sVBSlotCursor++; - - return ret; + return sVBSlotCursor++; } bool ll_is_part_idx_allocated(S32 idx, S32* start, S32* end) { - while (start < end) + /*while (start < end) { if (*start == idx) { //not allocated (in free list) return false; } ++start; - } + }*/ //allocated (not in free list) - return true; + return false; } //static void LLVOPartGroup::freeVBSlot(S32 idx) { - llassert(idx < LL_MAX_PARTICLE_COUNT && idx >= 0); + /*llassert(idx < LL_MAX_PARTICLE_COUNT && idx >= 0); //llassert(sVBSlotCursor > sVBSlotFree); //llassert(ll_is_part_idx_allocated(idx, sVBSlotCursor, sVBSlotFree+LL_MAX_PARTICLE_COUNT)); @@ -161,7 +152,7 @@ void LLVOPartGroup::freeVBSlot(S32 idx) { sVBSlotCursor--; *sVBSlotCursor = idx; - } + }*/ } LLVOPartGroup::LLVOPartGroup(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) @@ -185,23 +176,28 @@ BOOL LLVOPartGroup::isActive() const F32 LLVOPartGroup::getBinRadius() { - return mScale.mV[0]*2.f; + return mViewerPartGroupp->getBoxSide(); } void LLVOPartGroup::updateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) { const LLVector3& pos_agent = getPositionAgent(); - newMin.load3( (pos_agent - mScale).mV); - newMax.load3( (pos_agent + mScale).mV); + + LLVector4a scale; + LLVector4a p; + + p.load3(pos_agent.mV); + + scale.splat(mScale.mV[0]+mViewerPartGroupp->getBoxSide()*0.5f); + + newMin.setSub(p, scale); + newMax.setAdd(p,scale); llassert(newMin.isFinite3()); llassert(newMax.isFinite3()); - LLVector4a pos; - pos.load3(pos_agent.mV); - - llassert(pos.isFinite3()); - mDrawable->setPositionGroup(pos); + llassert(p.isFinite3()); + mDrawable->setPositionGroup(p); } void LLVOPartGroup::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) @@ -281,6 +277,16 @@ F32 LLVOPartGroup::getPartSize(S32 idx) return 0.f; } +void LLVOPartGroup::getBlendFunc(S32 idx, U32& src, U32& dst) +{ + if (idx < (S32) mViewerPartGroupp->mParticles.size()) + { + LLViewerPart* part = mViewerPartGroupp->mParticles[idx]; + src = part->mBlendFuncSource; + dst = part->mBlendFuncDest; + } +} + LLVector3 LLVOPartGroup::getCameraPosition() const { return gAgentCamera.getCameraPositionAgent(); @@ -340,13 +346,42 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) mDepth = 0.f; S32 i = 0 ; LLVector3 camera_agent = getCameraPosition(); + + F32 max_scale = 0.f; + + for (i = 0 ; i < (S32)mViewerPartGroupp->mParticles.size(); i++) { const LLViewerPart *part = mViewerPartGroupp->mParticles[i]; + + //remember the largest particle + max_scale = llmax(max_scale, part->mScale.mV[0], part->mScale.mV[1]); + + if (part->mFlags & LLPartData::LL_PART_RIBBON_MASK) + { //include ribbon segment length in scale + const LLVector3* pos_agent = NULL; + if (part->mParent) + { + pos_agent = &(part->mParent->mPosAgent); + } + else if (part->mPartSourcep.notNull()) + { + pos_agent = &(part->mPartSourcep->mPosAgent); + } + + if (pos_agent) + { + F32 dist = (*pos_agent-part->mPosAgent).length(); + + max_scale = llmax(max_scale, dist); + } + } + LLVector3 part_pos_agent(part->mPosAgent); LLVector3 at(part_pos_agent - camera_agent); + F32 camera_dist_squared = at.lengthSquared(); F32 inv_camera_dist_squared; if (camera_dist_squared > 1.f) @@ -423,6 +458,10 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable) facep->setSize(0, 0); } + //record max scale (used to stretch bounding box for visibility culling) + + mScale.set(max_scale, max_scale, max_scale); + mDrawable->movePartition(); LLPipeline::sCompiles++; return TRUE; @@ -485,75 +524,130 @@ BOOL LLVOPartGroup::lineSegmentIntersect(const LLVector4a& start, const LLVector void LLVOPartGroup::getGeometry(const LLViewerPart& part, LLStrider<LLVector4a>& verticesp) { - LLVector4a part_pos_agent; - part_pos_agent.load3(part.mPosAgent.mV); - LLVector4a camera_agent; - camera_agent.load3(getCameraPosition().mV); - LLVector4a at; - at.setSub(part_pos_agent, camera_agent); - LLVector4a up(0, 0, 1); - LLVector4a right; - - right.setCross3(at, up); - right.normalize3fast(); - - up.setCross3(right, at); - up.normalize3fast(); - - if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK) + if (part.mFlags & LLPartData::LL_PART_RIBBON_MASK) { - LLVector4a normvel; - normvel.load3(part.mVelocity.mV); - normvel.normalize3fast(); - LLVector2 up_fracs; - up_fracs.mV[0] = normvel.dot3(right).getF32(); - up_fracs.mV[1] = normvel.dot3(up).getF32(); - up_fracs.normalize(); - LLVector4a new_up; - LLVector4a new_right; - - //new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up; - LLVector4a t = right; - t.mul(up_fracs.mV[0]); - new_up = up; - new_up.mul(up_fracs.mV[1]); - new_up.add(t); - - //new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up; - t = right; - t.mul(up_fracs.mV[1]); - new_right = up; - new_right.mul(up_fracs.mV[0]); - t.sub(new_right); - - up = new_up; - right = t; - up.normalize3fast(); - right.normalize3fast(); + LLVector4a axis, pos, paxis, ppos; + F32 scale, pscale; + + pos.load3(part.mPosAgent.mV); + axis.load3(part.mAxis.mV); + scale = part.mScale.mV[0]; + + if (part.mParent) + { + ppos.load3(part.mParent->mPosAgent.mV); + paxis.load3(part.mParent->mAxis.mV); + pscale = part.mParent->mScale.mV[0]; + } + else + { //use source object as position + + if (part.mPartSourcep->mSourceObjectp.notNull()) + { + LLVector3 v = LLVector3(0,0,1); + v *= part.mPartSourcep->mSourceObjectp->getRenderRotation(); + paxis.load3(v.mV); + ppos.load3(part.mPartSourcep->mPosAgent.mV); + pscale = part.mStartScale.mV[0]; + } + else + { //no source object, no parent, nothing to draw + ppos = pos; + pscale = scale; + paxis = axis; + } + } + + LLVector4a p0, p1, p2, p3; + + scale *= 0.5f; + pscale *= 0.5f; + + axis.mul(scale); + paxis.mul(pscale); + + p0.setAdd(pos, axis); + p1.setSub(pos,axis); + p2.setAdd(ppos, paxis); + p3.setSub(ppos, paxis); + + (*verticesp++) = p2; + (*verticesp++) = p3; + (*verticesp++) = p0; + (*verticesp++) = p1; } + else + { + LLVector4a part_pos_agent; + part_pos_agent.load3(part.mPosAgent.mV); + LLVector4a camera_agent; + camera_agent.load3(getCameraPosition().mV); + LLVector4a at; + at.setSub(part_pos_agent, camera_agent); + LLVector4a up(0, 0, 1); + LLVector4a right; + + right.setCross3(at, up); + right.normalize3fast(); - right.mul(0.5f*part.mScale.mV[0]); - up.mul(0.5f*part.mScale.mV[1]); + up.setCross3(right, at); + up.normalize3fast(); + if (part.mFlags & LLPartData::LL_PART_FOLLOW_VELOCITY_MASK) + { + LLVector4a normvel; + normvel.load3(part.mVelocity.mV); + normvel.normalize3fast(); + LLVector2 up_fracs; + up_fracs.mV[0] = normvel.dot3(right).getF32(); + up_fracs.mV[1] = normvel.dot3(up).getF32(); + up_fracs.normalize(); + LLVector4a new_up; + LLVector4a new_right; + + //new_up = up_fracs.mV[0] * right + up_fracs.mV[1]*up; + LLVector4a t = right; + t.mul(up_fracs.mV[0]); + new_up = up; + new_up.mul(up_fracs.mV[1]); + new_up.add(t); + + //new_right = up_fracs.mV[1] * right - up_fracs.mV[0]*up; + t = right; + t.mul(up_fracs.mV[1]); + new_right = up; + new_right.mul(up_fracs.mV[0]); + t.sub(new_right); + + up = new_up; + right = t; + up.normalize3fast(); + right.normalize3fast(); + } + + right.mul(0.5f*part.mScale.mV[0]); + up.mul(0.5f*part.mScale.mV[1]); - //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should) - // this works because there is actually a 4th float stored after the vertex position which is used as a texture index - // also, somebody please VECTORIZE THIS - LLVector4a ppapu; - LLVector4a ppamu; + //HACK -- the verticesp->mV[3] = 0.f here are to set the texture index to 0 (particles don't use texture batching, maybe they should) + // this works because there is actually a 4th float stored after the vertex position which is used as a texture index + // also, somebody please VECTORIZE THIS - ppapu.setAdd(part_pos_agent, up); - ppamu.setSub(part_pos_agent, up); + LLVector4a ppapu; + LLVector4a ppamu; - verticesp->setSub(ppapu, right); - (*verticesp++).getF32ptr()[3] = 0.f; - verticesp->setSub(ppamu, right); - (*verticesp++).getF32ptr()[3] = 0.f; - verticesp->setAdd(ppapu, right); - (*verticesp++).getF32ptr()[3] = 0.f; - verticesp->setAdd(ppamu, right); - (*verticesp++).getF32ptr()[3] = 0.f; + ppapu.setAdd(part_pos_agent, up); + ppamu.setSub(part_pos_agent, up); + + verticesp->setSub(ppapu, right); + (*verticesp++).getF32ptr()[3] = 0.f; + verticesp->setSub(ppamu, right); + (*verticesp++).getF32ptr()[3] = 0.f; + verticesp->setAdd(ppapu, right); + (*verticesp++).getF32ptr()[3] = 0.f; + verticesp->setAdd(ppamu, right); + (*verticesp++).getF32ptr()[3] = 0.f; + } } @@ -563,6 +657,7 @@ void LLVOPartGroup::getGeometry(S32 idx, LLStrider<LLVector3>& normalsp, LLStrider<LLVector2>& texcoordsp, LLStrider<LLColor4U>& colorsp, + LLStrider<LLColor4U>& emissivep, LLStrider<U16>& indicesp) { if (idx >= (S32) mViewerPartGroupp->mParticles.size()) @@ -574,10 +669,43 @@ void LLVOPartGroup::getGeometry(S32 idx, getGeometry(part, verticesp); - *colorsp++ = part.mColor; - *colorsp++ = part.mColor; - *colorsp++ = part.mColor; - *colorsp++ = part.mColor; + LLColor4U pcolor; + LLColor4U color = part.mColor; + + LLColor4U pglow; + + if (part.mFlags & LLPartData::LL_PART_RIBBON_MASK) + { //make sure color blends properly + if (part.mParent) + { + pglow = part.mParent->mGlow; + pcolor = part.mParent->mColor; + } + else + { + pglow = LLColor4U(0, 0, 0, (U8) llround(255.f*part.mStartGlow)); + pcolor = part.mStartColor; + } + } + else + { + pglow = part.mGlow; + pcolor = color; + } + + *colorsp++ = pcolor; + *colorsp++ = pcolor; + *colorsp++ = color; + *colorsp++ = color; + + //if (pglow.mV[3] || part.mGlow.mV[3]) + { //only write glow if it is not zero + *emissivep++ = pglow; + *emissivep++ = pglow; + *emissivep++ = part.mGlow; + *emissivep++ = part.mGlow; + } + if (!(part.mFlags & LLPartData::LL_PART_EMISSIVE_MASK)) { //not fullbright, needs normal @@ -720,10 +848,13 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) LLStrider<LLVector3> normalsp; LLStrider<LLVector2> texcoordsp; LLStrider<LLColor4U> colorsp; + LLStrider<LLColor4U> emissivep; buffer->getVertexStrider(verticesp); buffer->getNormalStrider(normalsp); buffer->getColorStrider(colorsp); + buffer->getEmissiveStrider(emissivep); + LLSpatialGroup::drawmap_elem_t& draw_vec = group->mDrawMap[mRenderPass]; @@ -732,7 +863,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) LLFace* facep = *i; LLAlphaObject* object = (LLAlphaObject*) facep->getViewerObject(); - if (!facep->isState(LLFace::PARTICLE)) + //if (!facep->isState(LLFace::PARTICLE)) { //set the indices of this face S32 idx = LLVOPartGroup::findAvailableVBSlot(); if (idx >= 0) @@ -741,7 +872,7 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) facep->setIndicesIndex(idx*6); facep->setVertexBuffer(LLVOPartGroup::sVB); facep->setPoolType(LLDrawPool::POOL_ALPHA); - facep->setState(LLFace::PARTICLE); + //facep->setState(LLFace::PARTICLE); } else { @@ -756,9 +887,19 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) LLStrider<LLVector3> cur_norm = normalsp + geom_idx; LLStrider<LLVector2> cur_tc = texcoordsp + geom_idx; LLStrider<LLColor4U> cur_col = colorsp + geom_idx; + LLStrider<LLColor4U> cur_glow = emissivep + geom_idx; + + LLColor4U* start_glow = cur_glow.get(); - object->getGeometry(facep->getTEOffset(), cur_vert, cur_norm, cur_tc, cur_col, cur_idx); + object->getGeometry(facep->getTEOffset(), cur_vert, cur_norm, cur_tc, cur_col, cur_glow, cur_idx); + BOOL has_glow = FALSE; + + if (cur_glow.get() != start_glow) + { + has_glow = TRUE; + } + llassert(facep->getGeomCount() == 4); llassert(facep->getIndicesCount() == 6); @@ -773,24 +914,37 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) bool batched = false; - if (idx >= 0 && - draw_vec[idx]->mTexture == facep->getTexture() && - draw_vec[idx]->mFullbright == fullbright) + U32 bf_src = LLRender::BF_SOURCE_ALPHA; + U32 bf_dst = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; + + object->getBlendFunc(facep->getTEOffset(), bf_src, bf_dst); + + + if (idx >= 0) { - if (draw_vec[idx]->mEnd == facep->getGeomIndex()-1) - { - batched = true; - draw_vec[idx]->mCount += facep->getIndicesCount(); - draw_vec[idx]->mEnd += facep->getGeomCount(); - draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize); - } - else if (draw_vec[idx]->mStart == facep->getGeomIndex()+facep->getGeomCount()+1) + LLDrawInfo* info = draw_vec[idx]; + + if (info->mTexture == facep->getTexture() && + info->mHasGlow == has_glow && + info->mFullbright == fullbright && + info->mBlendFuncDst == bf_dst && + info->mBlendFuncSrc == bf_src) { - batched = true; - draw_vec[idx]->mCount += facep->getIndicesCount(); - draw_vec[idx]->mStart -= facep->getGeomCount(); - draw_vec[idx]->mOffset = facep->getIndicesStart(); - draw_vec[idx]->mVSize = llmax(draw_vec[idx]->mVSize, vsize); + if (draw_vec[idx]->mEnd == facep->getGeomIndex()-1) + { + batched = true; + info->mCount += facep->getIndicesCount(); + info->mEnd += facep->getGeomCount(); + info->mVSize = llmax(draw_vec[idx]->mVSize, vsize); + } + else if (draw_vec[idx]->mStart == facep->getGeomIndex()+facep->getGeomCount()+1) + { + batched = true; + info->mCount += facep->getIndicesCount(); + info->mStart -= facep->getGeomCount(); + info->mOffset = facep->getIndicesStart(); + info->mVSize = llmax(draw_vec[idx]->mVSize, vsize); + } } } @@ -807,6 +961,10 @@ void LLParticlePartition::getGeometry(LLSpatialGroup* group) info->mExtents[0] = group->mObjectExtents[0]; info->mExtents[1] = group->mObjectExtents[1]; info->mVSize = vsize; + info->mBlendFuncDst = bf_dst; + info->mBlendFuncSrc = bf_src; + info->mHasGlow = has_glow; + info->mParticle = TRUE; draw_vec.push_back(info); //for alpha sorting facep->setDrawInfo(info); diff --git a/indra/newview/llvopartgroup.h b/indra/newview/llvopartgroup.h index 2befb018239f85f43a04490c516c95187609eafd..724e915d02f6dca8d277095079169611d461642a 100755 --- a/indra/newview/llvopartgroup.h +++ b/indra/newview/llvopartgroup.h @@ -42,8 +42,7 @@ public: //vertex buffer for holding all particles static LLPointer<LLVertexBuffer> sVB; - static S32 sVBSlotFree[LL_MAX_PARTICLE_COUNT]; - static S32* sVBSlotCursor; + static S32 sVBSlotCursor; static void initClass(); static void restoreGL(); @@ -57,6 +56,7 @@ public: LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR | + LLVertexBuffer::MAP_EMISSIVE | LLVertexBuffer::MAP_TEXTURE_INDEX }; @@ -91,10 +91,12 @@ public: LLStrider<LLVector3>& normalsp, LLStrider<LLVector2>& texcoordsp, LLStrider<LLColor4U>& colorsp, + LLStrider<LLColor4U>& emissivep, LLStrider<U16>& indicesp); void updateFaceSize(S32 idx) { } F32 getPartSize(S32 idx); + void getBlendFunc(S32 idx, U32& src, U32& dst); LLUUID getPartOwner(S32 idx); LLUUID getPartSource(S32 idx); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 6b3611b7965cff12c066f13272f879662729ec22..c233221e5f33c639147287184b57e93666fe9840 100755 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -101,6 +101,8 @@ static LLFastTimer::DeclareTimer FTM_GEN_TRIANGLES("Generate Triangles"); static LLFastTimer::DeclareTimer FTM_GEN_VOLUME("Generate Volumes"); static LLFastTimer::DeclareTimer FTM_VOLUME_TEXTURES("Volume Textures"); +extern BOOL gGLDebugLoggingEnabled; + // Implementation class of LLMediaDataClientObject. See llmediadataclient.h class LLMediaDataClientObjectImpl : public LLMediaDataClientObject { @@ -341,6 +343,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } } mTexAnimMode = 0; + mTextureAnimp->unpackTAMessage(mesgsys, block_num); } else @@ -384,7 +387,6 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, } else { - // CORY TO DO: Figure out how to get the value here if (update_type != OUT_TERSE_IMPROVED) { LLVolumeParams volume_params; @@ -453,6 +455,11 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys, mFaceMappingChanged = TRUE; mTexAnimMode = 0; } + + if (value & 0x400) + { //particle system (new) + unpackParticleSource(*dp, mOwnerID, false); + } } else { @@ -687,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()) { @@ -1030,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()); @@ -1096,6 +1102,12 @@ void LLVOVolume::notifyMeshLoaded() { mSculptChanged = TRUE; gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE); + + LLVOAvatar* avatar = getAvatar(); + if (avatar) + { + avatar->updateVisualComplexity(); + } } // sculpt replaces generate() for sculpted surfaces @@ -1114,7 +1126,7 @@ void LLVOVolume::sculpt() S32 max_discard = mSculptTexture->getMaxDiscardLevel(); if (discard_level > max_discard) { - discard_level = max_discard; // clamp to the best we can do + discard_level = max_discard; // clamp to the best we can do } if(discard_level > MAX_DISCARD_LEVEL) { @@ -1124,28 +1136,38 @@ void LLVOVolume::sculpt() S32 current_discard = getVolume()->getSculptLevel() ; if(current_discard < -2) { - static S32 low_sculpty_discard_warning_count = 100; - if (++low_sculpty_discard_warning_count >= 100) - { // Log first time, then every 100 afterwards otherwise this can flood the logs + static S32 low_sculpty_discard_warning_count = 1; + S32 exponent = llmax(1, llfloor( log10((F64) low_sculpty_discard_warning_count) )); + S32 interval = pow(10.0, exponent); + if ( low_sculpty_discard_warning_count < 10 || + (low_sculpty_discard_warning_count % interval) == 0) + { // Log first 10 time, then decreasing intervals afterwards otherwise this can flood the logs llwarns << "WARNING!!: Current discard for sculpty " << mSculptTexture->getID() << " at " << current_discard - << " is less than -2." << llendl; - low_sculpty_discard_warning_count = 0; + << " is less than -2." + << " Hit this " << low_sculpty_discard_warning_count << " times" + << llendl; } + low_sculpty_discard_warning_count++; // corrupted volume... don't update the sculpty return; } else if (current_discard > MAX_DISCARD_LEVEL) { - static S32 high_sculpty_discard_warning_count = 100; - if (++high_sculpty_discard_warning_count >= 100) - { // Log first time, then every 100 afterwards otherwise this can flood the logs + static S32 high_sculpty_discard_warning_count = 1; + S32 exponent = llmax(1, llfloor( log10((F64) high_sculpty_discard_warning_count) )); + S32 interval = pow(10.0, exponent); + if ( high_sculpty_discard_warning_count < 10 || + (high_sculpty_discard_warning_count % interval) == 0) + { // Log first 10 time, then decreasing intervals afterwards otherwise this can flood the logs llwarns << "WARNING!!: Current discard for sculpty " << mSculptTexture->getID() << " at " << current_discard - << " is more than than allowed max of " << MAX_DISCARD_LEVEL << llendl; - high_sculpty_discard_warning_count = 0; + << " is more than than allowed max of " << MAX_DISCARD_LEVEL + << ". Hit this " << high_sculpty_discard_warning_count << " times" + << llendl; } + high_sculpty_discard_warning_count++; // corrupted volume... don't update the sculpty return; @@ -1238,7 +1260,7 @@ BOOL LLVOVolume::calcLOD() else { distance = mDrawable->mDistanceWRTCamera; - radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length(); + radius = getVolume() ? getVolume()->mLODScaleBias.scaledVec(getScale()).length() : getScale().length(); } //hold onto unmodified distance for debugging @@ -1268,7 +1290,7 @@ BOOL LLVOVolume::calcLOD() { //setDebugText(llformat("%.2f:%.2f, %d", debug_distance, radius, cur_detail)); - setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex())); + //setDebugText(llformat("%d", mDrawable->getFace(0)->getTextureIndex())); } if (cur_detail != mLOD) @@ -1458,7 +1480,7 @@ BOOL LLVOVolume::genBBoxes(BOOL force_global) continue; } res &= face->genVolumeBBoxes(*volume, i, - mRelativeXform, /*mRelativeXformInvTrans,*/ + mRelativeXform, (mVolumeImpl && mVolumeImpl->isVolumeGlobal()) || force_global); if (rebuild) @@ -3023,7 +3045,7 @@ void LLVOVolume::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_p //transform view vector into volume space view_vector -= getRenderPosition(); - mDrawable->mDistanceWRTCamera = view_vector.length(); + //mDrawable->mDistanceWRTCamera = view_vector.length(); LLQuaternion worldRot = getRenderRotation(); view_vector = view_vector * ~worldRot; if (!isVolumeGlobal()) @@ -3919,10 +3941,13 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons } //build matrix palette - LLMatrix4a mp[64]; + static const size_t kMaxJoints = 64; + + LLMatrix4a mp[kMaxJoints]; LLMatrix4* mat = (LLMatrix4*) mp; - for (U32 j = 0; j < skin->mJointNames.size(); ++j) + U32 maxJoints = llmin(skin->mJointNames.size(), kMaxJoints); + for (U32 j = 0; j < maxJoints; ++j) { LLJoint* joint = avatar->getJoint(skin->mJointNames[j]); if (joint) @@ -3977,8 +4002,10 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons F32 w = wght[k]; LLMatrix4a src; - src.setMul(mp[idx[k]], w); - + // Insure ref'd bone is in our clamped array of mats + llassert(idx[k] < kMaxJoints); + // clamp k to kMaxJoints to avoid reading garbage off stack in release + src.setMul(mp[idx[(k < kMaxJoints) ? k : 0]], w); final_mat.add(src); } @@ -4389,7 +4416,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (pAvatarVO) { pAvatarVO->mAttachmentGeometryBytes -= group->mGeometryBytes; + pAvatarVO->mAttachmentGeometryBytes = llmax(pAvatarVO->mAttachmentGeometryBytes, 0); pAvatarVO->mAttachmentSurfaceArea -= group->mSurfaceArea; + pAvatarVO->mAttachmentSurfaceArea = llmax(pAvatarVO->mAttachmentSurfaceArea, 0.f); } group->mGeometryBytes = 0; @@ -4402,14 +4431,25 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) mFaceList.clear(); - std::vector<LLFace*> fullbright_faces; - std::vector<LLFace*> bump_faces; - std::vector<LLFace*> norm_faces; - std::vector<LLFace*> spec_faces; - std::vector<LLFace*> normspec_faces; - std::vector<LLFace*> simple_faces; + const U32 MAX_FACE_COUNT = 4096; + + static LLFace** fullbright_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*),64); + static LLFace** bump_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*),64); + static LLFace** simple_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*),64); + static LLFace** norm_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*), 64); + static LLFace** spec_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*), 64); + static LLFace** normspec_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*), 64); + static LLFace** alpha_faces = (LLFace**) ll_aligned_malloc(MAX_FACE_COUNT*sizeof(LLFace*),64); + + U32 fullbright_count = 0; + U32 bump_count = 0; + U32 simple_count = 0; + U32 alpha_count = 0; + U32 norm_count = 0; + U32 spec_count = 0; + U32 normspec_count = 0; + - std::vector<LLFace*> alpha_faces; U32 useage = group->mSpatialPartition->mBufferUsage; U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcVertexSize(group->mSpatialPartition->mVertexDataMask); @@ -4420,6 +4460,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) bool emissive = false; + + { LLFastTimer t(FTM_REBUILD_VOLUME_FACE_LIST); @@ -4778,7 +4820,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { if (facep->canRenderAsMask()) { //can be treated as alpha mask - simple_faces.push_back(facep); + if (simple_count < MAX_FACE_COUNT) + { + simple_faces[simple_count++] = facep; + } } else { @@ -4786,7 +4831,10 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { //only treat as alpha in the pipeline if < 100% transparent drawablep->setState(LLDrawable::HAS_ALPHA); } - alpha_faces.push_back(facep); + if (alpha_count < MAX_FACE_COUNT) + { + alpha_faces[alpha_count++] = facep; + } } } else @@ -4806,51 +4854,81 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { if (mat->getSpecularID().notNull()) { //has normal and specular maps (needs texcoord1, texcoord2, and tangent) - normspec_faces.push_back(facep); + if (normspec_count < MAX_FACE_COUNT) + { + normspec_faces[normspec_count++] = facep; + } } else { //has normal map (needs texcoord1 and tangent) - norm_faces.push_back(facep); + if (norm_count < MAX_FACE_COUNT) + { + norm_faces[norm_count++] = facep; + } } } else if (mat->getSpecularID().notNull()) { //has specular map but no normal map, needs texcoord2 - spec_faces.push_back(facep); + if (spec_count < MAX_FACE_COUNT) + { + spec_faces[spec_count++] = facep; + } } else { //has neither specular map nor normal map, only needs texcoord0 - simple_faces.push_back(facep); + if (simple_count < MAX_FACE_COUNT) + { + simple_faces[simple_count++] = facep; + } } } else if (te->getBumpmap()) { //needs normal + tangent - bump_faces.push_back(facep); + if (bump_count < MAX_FACE_COUNT) + { + bump_faces[bump_count++] = facep; + } } else if (te->getShiny() || !te->getFullbright()) { //needs normal - simple_faces.push_back(facep); + if (simple_count < MAX_FACE_COUNT) + { + simple_faces[simple_count++] = facep; + } } else { //doesn't need normal facep->setState(LLFace::FULLBRIGHT); - fullbright_faces.push_back(facep); + if (fullbright_count < MAX_FACE_COUNT) + { + fullbright_faces[fullbright_count++] = facep; + } } } else { if (te->getBumpmap() && LLPipeline::sRenderBump) { //needs normal + tangent - bump_faces.push_back(facep); + if (bump_count < MAX_FACE_COUNT) + { + bump_faces[bump_count++] = facep; + } } else if ((te->getShiny() && LLPipeline::sRenderBump) || !(te->getFullbright() || bake_sunlight)) { //needs normal - simple_faces.push_back(facep); + if (simple_count < MAX_FACE_COUNT) + { + simple_faces[simple_count++] = facep; + } } else { //doesn't need normal facep->setState(LLFace::FULLBRIGHT); - fullbright_faces.push_back(facep); + if (fullbright_count < MAX_FACE_COUNT) + { + fullbright_faces[fullbright_count++] = facep; + } } } } @@ -4865,7 +4943,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) { if (!drawablep->isState(LLDrawable::RIGGED)) { - drawablep->setState(LLDrawable::RIGGED); + drawablep->setState(LLDrawable::RIGGED); //first time this is drawable is being marked as rigged, // do another LoD update to use avatar bounding box @@ -4912,13 +4990,13 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) fullbright_mask = fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX; } - genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, FALSE, batch_textures, FALSE); - genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, FALSE, batch_textures); - genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, TRUE, batch_textures); - genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, FALSE, FALSE); - genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, norm_faces, FALSE, FALSE); - genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, spec_faces, FALSE, FALSE); - genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, normspec_faces, FALSE, FALSE); + genDrawInfo(group, simple_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, simple_faces, simple_count, FALSE, batch_textures, FALSE); + genDrawInfo(group, fullbright_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, fullbright_faces, fullbright_count, FALSE, batch_textures); + genDrawInfo(group, alpha_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, alpha_faces, alpha_count, TRUE, batch_textures); + genDrawInfo(group, bump_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, bump_faces, bump_count, FALSE, FALSE); + genDrawInfo(group, norm_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, norm_faces, norm_count, FALSE, FALSE); + genDrawInfo(group, spec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, spec_faces, spec_count, FALSE, FALSE); + genDrawInfo(group, normspec_mask | LLVertexBuffer::MAP_TEXTURE_INDEX, normspec_faces, normspec_count, FALSE, FALSE); if (!LLPipeline::sDelayVBUpdate) { @@ -4943,11 +5021,26 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if (pAvatarVO) { + if (pAvatarVO->mAttachmentGeometryBytes < 0) + { // First time through value is -1 + pAvatarVO->mAttachmentGeometryBytes = group->mGeometryBytes; + } + else + { pAvatarVO->mAttachmentGeometryBytes += group->mGeometryBytes; + } + if (pAvatarVO->mAttachmentSurfaceArea < 0.f) + { // First time through value is -1 + pAvatarVO->mAttachmentSurfaceArea = group->mSurfaceArea; + } + else + { pAvatarVO->mAttachmentSurfaceArea += group->mSurfaceArea; } } +} +static LLFastTimer::DeclareTimer FTM_REBUILD_MESH_FLUSH("Flush Mesh"); void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) { @@ -4957,11 +5050,14 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) LLFastTimer ftm(FTM_REBUILD_VOLUME_VB); LLFastTimer t(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); //make sure getgeometryvolume shows up in the right place in timers - S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ; - group->mBuilt = 1.f; - std::set<LLVertexBuffer*> mapped_buffers; + S32 num_mapped_vertex_buffer = LLVertexBuffer::sMappedCount ; + + const U32 MAX_BUFFER_COUNT = 4096; + LLVertexBuffer* locked_buffer[MAX_BUFFER_COUNT]; + + U32 buffer_count = 0; for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) { @@ -4996,9 +5092,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) } - if (buff->isLocked()) + if (buff->isLocked() && buffer_count < MAX_BUFFER_COUNT) { - mapped_buffers.insert(buff); + locked_buffer[buffer_count++] = buff; } } } @@ -5014,7 +5110,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) } } - for (std::set<LLVertexBuffer*>::iterator iter = mapped_buffers.begin(); iter != mapped_buffers.end(); ++iter) + { + LLFastTimer t(FTM_REBUILD_MESH_FLUSH); + for (LLVertexBuffer** iter = locked_buffer, ** end_iter = locked_buffer+buffer_count; iter != end_iter; ++iter) { (*iter)->flush(); } @@ -5026,9 +5124,10 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group) { group->mVertexBuffer->flush(); } + } //if not all buffers are unmapped - if(num_mapped_veretx_buffer != LLVertexBuffer::sMappedCount) + if(num_mapped_vertex_buffer != LLVertexBuffer::sMappedCount) { llwarns << "Not all mapped vertex buffers are unmapped!" << llendl ; for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) @@ -5095,12 +5194,22 @@ static LLFastTimer::DeclareTimer FTM_GEN_DRAW_INFO_RESIZE_VB("Resize VB"); -void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort, BOOL batch_textures, BOOL no_materials) +void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace** faces, U32 face_count, BOOL distance_sort, BOOL batch_textures, BOOL no_materials) { LLFastTimer t(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); U32 buffer_usage = group->mBufferUsage; + static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false); + + if (use_transform_feedback && + gTransformPositionProgram.mProgramObject && //transform shaders are loaded + buffer_usage == GL_DYNAMIC_DRAW_ARB && //target buffer is in VRAM + !(mask & LLVertexBuffer::MAP_WEIGHT4)) //TODO: add support for weights + { + buffer_usage = GL_DYNAMIC_COPY_ARB; + } + #if LL_DARWIN // HACK from Leslie: // Disable VBO usage for alpha on Mac OS X because it kills the framerate @@ -5121,17 +5230,18 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: if (!distance_sort) { //sort faces by things that break batches - std::sort(faces.begin(), faces.end(), CompareBatchBreakerModified()); + std::sort(faces, faces+face_count, CompareBatchBreakerModified()); } else { //sort faces by distance - std::sort(faces.begin(), faces.end(), LLFace::CompareDistanceGreater()); + std::sort(faces, faces+face_count, LLFace::CompareDistanceGreater()); } } bool hud_group = group->isHUDGroup() ; - std::vector<LLFace*>::iterator face_iter = faces.begin(); + LLFace** face_iter = faces; + LLFace** end_faces = faces+face_count; LLSpatialGroup::buffer_map_t buffer_map; @@ -5160,7 +5270,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: //NEVER use more than 16 texture index channels (workaround for prevalent driver bug) texture_index_channels = llmin(texture_index_channels, 16); - while (face_iter != faces.end()) + bool flexi = false; + + while (face_iter != end_faces) { //pull off next face LLFace* facep = *face_iter; @@ -5187,11 +5299,16 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: U32 index_count = facep->getIndicesCount(); U32 geom_count = facep->getGeomCount(); + flexi = flexi || facep->getViewerObject()->getVolume()->isUnique(); + //sum up vertices needed for this render batch - std::vector<LLFace*>::iterator i = face_iter; + LLFace** i = face_iter; ++i; - std::vector<LLViewerTexture*> texture_list; + const U32 MAX_TEXTURE_COUNT = 32; + LLViewerTexture* texture_list[MAX_TEXTURE_COUNT]; + + U32 texture_count = 0; { LLFastTimer t(FTM_GEN_DRAW_INFO_FACE_SIZE); @@ -5199,12 +5316,15 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: { U8 cur_tex = 0; facep->setTextureIndex(cur_tex); - texture_list.push_back(tex); + if (texture_count < MAX_TEXTURE_COUNT) + { + texture_list[texture_count++] = tex; + } if (can_batch_texture(facep)) { //populate texture_list with any textures that can be batched //move i to the next unbatchable face - while (i != faces.end()) + while (i != end_faces) { facep = *i; @@ -5220,7 +5340,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: if (distance_sort) { //textures might be out of order, see if texture exists in current batch bool found = false; - for (U32 tex_idx = 0; tex_idx < texture_list.size(); ++tex_idx) + for (U32 tex_idx = 0; tex_idx < texture_count; ++tex_idx) { if (facep->getTexture() == texture_list[tex_idx]) { @@ -5232,7 +5352,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: if (!found) { - cur_tex = texture_list.size(); + cur_tex = texture_count; } } else @@ -5247,7 +5367,10 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: tex = facep->getTexture(); - texture_list.push_back(tex); + if (texture_count < MAX_TEXTURE_COUNT) + { + texture_list[texture_count++] = tex; + } } if (geom_count + facep->getGeomCount() > max_vertices) @@ -5256,6 +5379,9 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } ++i; + + flexi = flexi || facep->getViewerObject()->getVolume()->isUnique(); + index_count += facep->getIndicesCount(); geom_count += facep->getGeomCount(); @@ -5271,7 +5397,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: } else { - while (i != faces.end() && + while (i != end_faces && (LLPipeline::sTextureBindTest || (distance_sort || ((*i)->getTexture() == tex && @@ -5292,8 +5418,16 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std:: ++i; index_count += facep->getIndicesCount(); geom_count += facep->getGeomCount(); + + flexi = flexi || facep->getViewerObject()->getVolume()->isUnique(); + } } } + + + if (flexi && buffer_usage && buffer_usage != GL_STREAM_DRAW_ARB) + { + buffer_usage = GL_STREAM_DRAW_ARB; } //create vertex buffer diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 4f52ff977829a7132433d046556443121c9fe9f4..72d628fb88fbd8f2b713c066fd0e36c3a9d7ec0a 100755 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -188,13 +188,12 @@ void LLWaterParamManager::updateShaderUniforms(LLGLSLShader * shader) if (shader->mShaderGroup == LLGLSLShader::SG_WATER) { shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, LLWLParamManager::getInstance()->getRotatedLightDir().mV); - shader->uniform3fv("camPosLocal", 1, LLViewerCamera::getInstance()->getOrigin().mV); - shader->uniform4fv("waterFogColor", 1, LLDrawPoolWater::sWaterFogColor.mV); - shader->uniform1f("waterFogEnd", LLDrawPoolWater::sWaterFogEnd); - shader->uniform4fv("waterPlane", 1, mWaterPlane.mV); - shader->uniform1f("waterFogDensity", getFogDensity()); - shader->uniform1f("waterFogKS", mWaterFogKS); - shader->uniform1f("distance_multiplier", 0); +shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); + shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, LLDrawPoolWater::sWaterFogColor.mV); + shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, mWaterPlane.mV); + shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, getFogDensity()); + shader->uniform1f(LLShaderMgr::WATER_FOGKS, mWaterFogKS); + shader->uniform1f(LLViewerShaderMgr::DISTANCE_MULTIPLIER, 0); } } diff --git a/indra/newview/llwaterparamset.h b/indra/newview/llwaterparamset.h index b28585af59c37f33200a16a3f90cee8f5c5235a0..368cb0ccba9362e43ed9bbf2b555ec0e6d024a11 100755 --- a/indra/newview/llwaterparamset.h +++ b/indra/newview/llwaterparamset.h @@ -33,6 +33,7 @@ #include "v4math.h" #include "v4color.h" #include "llviewershadermgr.h" +#include "llstringtable.h" class LLWaterParamSet; @@ -47,6 +48,9 @@ public: private: LLSD mParamValues; + std::vector<LLStaticHashedString> mParamHashedNames; + + void updateHashedNames(); public: @@ -140,6 +144,17 @@ inline void LLWaterParamSet::setAll(const LLSD& val) mParamValues[mIt->first] = mIt->second; } } + updateHashedNames(); +} + +inline void LLWaterParamSet::updateHashedNames() +{ + mParamHashedNames.clear(); + // Iterate through values + for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter) + { + mParamHashedNames.push_back(LLStaticHashedString(iter->first)); + } } inline const LLSD& LLWaterParamSet::getAll() diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp index 641f338f2c6be343f352a010a6d0ca3849310dbd..69255af1792c7f8e0662b25c6ed5d36750562901 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 28f959eb7190eda9641da4cd38b3c71ec72691f3..a8e06511d725d64d1b865e476322516df3c00490 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/llwlanimator.h b/indra/newview/llwlanimator.h index 5223b453436fe263c98c809f832c84a3733635ee..810f4cf7e59f3d5ea928a5485835f4255b4d34d3 100755 --- a/indra/newview/llwlanimator.h +++ b/indra/newview/llwlanimator.h @@ -137,3 +137,4 @@ private: }; #endif // LL_WL_ANIMATOR_H + diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index 6077208799a654e663a974166b31f0386fcb7b92..ce9f61c0afedcfcb42c059737ba88d64ba7fb1f7 100755 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -351,8 +351,8 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader) if (shader->mShaderGroup == LLGLSLShader::SG_DEFAULT) { - shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, mRotatedLightDir.mV); - shader->uniform3fv("camPosLocal", 1, LLViewerCamera::getInstance()->getOrigin().mV); + shader->uniform4fv(LLShaderMgr::LIGHTNORM, 1, mRotatedLightDir.mV); + shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); } else if (shader->mShaderGroup == LLGLSLShader::SG_SKY) @@ -360,7 +360,7 @@ void LLWLParamManager::updateShaderUniforms(LLGLSLShader * shader) shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, mClampedLightDir.mV); } - shader->uniform1f("scene_light_strength", mSceneLightStrength); + shader->uniform1f(LLShaderMgr::SCENE_LIGHT_STRENGTH, mSceneLightStrength); } diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h index 72422500fcc8ebd48df45051a2c8d41b5998d2cc..e13aed98edfc507d5bec39592e9fdc8493cc67a1 100755 --- a/indra/newview/llwlparammanager.h +++ b/indra/newview/llwlparammanager.h @@ -412,3 +412,4 @@ inline LLVector4 LLWLParamManager::getRotatedLightDir(void) const } #endif + diff --git a/indra/newview/llwlparamset.cpp b/indra/newview/llwlparamset.cpp index dba397063572aba709f25901fef95951e9ffe4a1..8529a4614b5e08698b9291882df9b32ca65128b8 100755 --- a/indra/newview/llwlparamset.cpp +++ b/indra/newview/llwlparamset.cpp @@ -39,6 +39,22 @@ #include <sstream> +static LLStaticHashedString sStarBrightness("star_brightness"); +static LLStaticHashedString sPresetNum("preset_num"); +static LLStaticHashedString sSunAngle("sun_angle"); +static LLStaticHashedString sEastAngle("east_angle"); +static LLStaticHashedString sEnableCloudScroll("enable_cloud_scroll"); +static LLStaticHashedString sCloudScrollRate("cloud_scroll_rate"); +static LLStaticHashedString sLightNorm("lightnorm"); +static LLStaticHashedString sCloudDensity("cloud_pos_density1"); +static LLStaticHashedString sCloudScale("cloud_scale"); +static LLStaticHashedString sCloudShadow("cloud_shadow"); +static LLStaticHashedString sDensityMultiplier("density_multiplier"); +static LLStaticHashedString sDistanceMultiplier("distance_multiplier"); +static LLStaticHashedString sHazeDensity("haze_density"); +static LLStaticHashedString sHazeHorizon("haze_horizon"); +static LLStaticHashedString sMaxY("max_y"); + LLWLParamSet::LLWLParamSet(void) : mName("Unnamed Preset"), mCloudScrollXOffset(0.f), mCloudScrollYOffset(0.f) @@ -49,21 +65,24 @@ static LLFastTimer::DeclareTimer FTM_WL_PARAM_UPDATE("WL Param Update"); void LLWLParamSet::update(LLGLSLShader * shader) const { LLFastTimer t(FTM_WL_PARAM_UPDATE); - - for(LLSD::map_const_iterator i = mParamValues.beginMap(); - i != mParamValues.endMap(); - ++i) + LLSD::map_const_iterator i = mParamValues.beginMap(); + std::vector<LLStaticHashedString>::const_iterator n = mParamHashedNames.begin(); + for(;(i != mParamValues.endMap()) && (n != mParamHashedNames.end());++i, n++) { - const std::string& param = i->first; + const LLStaticHashedString& param = *n; - if (param == "star_brightness" || param == "preset_num" || param == "sun_angle" || - param == "east_angle" || param == "enable_cloud_scroll" || - param == "cloud_scroll_rate" || param == "lightnorm" ) + // check that our pre-hashed names are still tracking the mParamValues map correctly + // + llassert(param.String() == i->first); + + if (param == sStarBrightness || param == sPresetNum || param == sSunAngle || + param == sEastAngle || param == sEnableCloudScroll || + param == sCloudScrollRate || param == sLightNorm ) { continue; } - if (param == "cloud_pos_density1") + if (param == sCloudDensity) { LLVector4 val; val.mV[0] = F32(i->second[0].asReal()) + mCloudScrollXOffset; @@ -75,10 +94,10 @@ void LLWLParamSet::update(LLGLSLShader * shader) const shader->uniform4fv(param, 1, val.mV); stop_glerror(); } - else if (param == "cloud_scale" || param == "cloud_shadow" || - param == "density_multiplier" || param == "distance_multiplier" || - param == "haze_density" || param == "haze_horizon" || - param == "max_y" ) + else if (param == sCloudScale || param == sCloudShadow || + param == sDensityMultiplier || param == sDistanceMultiplier || + param == sHazeDensity || param == sHazeHorizon || + param == sMaxY ) { F32 val = (F32) i->second[0].asReal(); @@ -386,3 +405,14 @@ void LLWLParamSet::updateCloudScrolling(void) mCloudScrollYOffset += F32(delta_t * (getCloudScrollY() - 10.f) / 100.f); } } + +void LLWLParamSet::updateHashedNames() +{ + mParamHashedNames.clear(); + // Iterate through values + for(LLSD::map_iterator iter = mParamValues.beginMap(); iter != mParamValues.endMap(); ++iter) + { + mParamHashedNames.push_back(LLStaticHashedString(iter->first)); + } +} + diff --git a/indra/newview/llwlparamset.h b/indra/newview/llwlparamset.h index b087119dd503371151d2713908cc18b1385d46c5..6e5f1d3a4bc22daf5396a665d52803a77a7f1b59 100755 --- a/indra/newview/llwlparamset.h +++ b/indra/newview/llwlparamset.h @@ -29,9 +29,11 @@ #include <string> #include <map> +#include <vector> #include "v4math.h" #include "v4color.h" +#include "llstaticstringtable.h" class LLWLParamSet; class LLGLSLShader; @@ -47,9 +49,12 @@ public: private: LLSD mParamValues; - + std::vector<LLStaticHashedString> mParamHashedNames; + float mCloudScrollXOffset, mCloudScrollYOffset; + void updateHashedNames(); + public: LLWLParamSet(); @@ -177,6 +182,8 @@ inline void LLWLParamSet::setAll(const LLSD& val) if(val.isMap()) { mParamValues = val; } + + updateHashedNames(); } inline const LLSD& LLWLParamSet::getAll() @@ -236,3 +243,4 @@ inline F32 LLWLParamSet::getCloudScrollY() { #endif // LL_WLPARAM_SET_H + diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 7996f8a64005b31f6e1b3f58f93877639b46c7c5..103668d0510ce381d2daf42038b9d4698e9b56f7 100755 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -140,6 +140,7 @@ 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; @@ -161,6 +162,9 @@ LLViewerRegion* LLWorld::addRegion(const U64 ®ion_handle, const LLHost &host) llwarns << "LLWorld::addRegion exists, but isn't alive" << 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); @@ -188,6 +192,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 5fa380e0e3a920e8ef6a726a4d5b196e089c38d0..bfae142812f7e97fd690d500648903aea3961032 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 1940cf541ece1e631284083c6b2f8c8d209ed657..ae334d4bd24fa7612ec02062cb72a48764de1273 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1792,3 +1792,5 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask ) } return FALSE; } + + diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b4e59909db64a9134d790b064d955dd20db6d6c8..5da8a78b1b423ed43a30dc6e4007364297a4d64e 100755 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -261,6 +261,17 @@ LLFastTimer::DeclareTimer FTM_RENDER_DEFERRED("Deferred Shading"); static LLFastTimer::DeclareTimer FTM_STATESORT_DRAWABLE("Sort Drawables"); static LLFastTimer::DeclareTimer FTM_STATESORT_POSTSORT("Post Sort"); +static LLStaticHashedString sTint("tint"); +static LLStaticHashedString sAmbiance("ambiance"); +static LLStaticHashedString sAlphaScale("alpha_scale"); +static LLStaticHashedString sNormMat("norm_mat"); +static LLStaticHashedString sOffset("offset"); +static LLStaticHashedString sScreenRes("screenRes"); +static LLStaticHashedString sDelta("delta"); +static LLStaticHashedString sDistFactor("dist_factor"); +static LLStaticHashedString sKern("kern"); +static LLStaticHashedString sKernScale("kern_scale"); + //---------------------------------------- std::string gPoolNames[] = { @@ -799,16 +810,16 @@ void LLPipeline::resizeScreenTexture() if ((resX != mScreen.getWidth()) || (resY != mScreen.getHeight())) { releaseScreenBuffers(); - if (!allocateScreenBuffer(resX,resY)) + if (!allocateScreenBuffer(resX,resY)) { #if PROBABLE_FALSE_DISABLES_OF_ALM_HERE //FAILSAFE: screen buffer allocation failed, disable deferred rendering if it's enabled - //NOTE: if the session closes successfully after this call, deferred rendering will be - // disabled on future sessions - if (LLPipeline::sRenderDeferred) - { - gSavedSettings.setBOOL("RenderDeferred", FALSE); - LLPipeline::refreshCachedSettings(); + //NOTE: if the session closes successfully after this call, deferred rendering will be + // disabled on future sessions + if (LLPipeline::sRenderDeferred) + { + gSavedSettings.setBOOL("RenderDeferred", FALSE); + LLPipeline::refreshCachedSettings(); } #endif @@ -964,7 +975,7 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples) { screenFormat = GL_RGBA16F_ARB; } - + if (!mScreen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false; if (samples > 0) { @@ -1187,13 +1198,13 @@ void LLPipeline::releaseGLBuffers() if (mNoiseMap) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mNoiseMap); + LLImageGL::deleteTextures(1, &mNoiseMap); mNoiseMap = 0; } if (mTrueNoiseMap) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 0, 1, &mTrueNoiseMap); + LLImageGL::deleteTextures(1, &mTrueNoiseMap); mTrueNoiseMap = 0; } @@ -1202,7 +1213,7 @@ void LLPipeline::releaseGLBuffers() mWaterRef.release(); mWaterDis.release(); mHighlight.release(); - + for (U32 i = 0; i < 3; i++) { mGlow[i].release(); @@ -1218,7 +1229,7 @@ void LLPipeline::releaseLUTBuffers() { if (mLightFunc) { - LLImageGL::deleteTextures(LLTexUnit::TT_TEXTURE, GL_R16F, 0, 1, &mLightFunc); + LLImageGL::deleteTextures(1, &mLightFunc); mLightFunc = 0; } } @@ -1312,7 +1323,7 @@ void LLPipeline::createGLBuffers() noise[i].mV[2] = ll_frand()*scaler+1.f-scaler/2.f; } - LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mNoiseMap); + LLImageGL::generateTextures(1, &mNoiseMap); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mNoiseMap); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB, GL_FLOAT, noise, false); @@ -1328,7 +1339,7 @@ void LLPipeline::createGLBuffers() noise[i] = ll_frand()*2.0-1.0; } - LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, GL_RGB16F_ARB, 1, &mTrueNoiseMap); + LLImageGL::generateTextures(1, &mTrueNoiseMap); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mTrueNoiseMap); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGB16F_ARB, noiseRes, noiseRes, GL_RGB,GL_FLOAT, noise, false); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); @@ -1441,7 +1452,7 @@ void LLPipeline::createLUTBuffers() // pix_format = GL_R32F; #endif - LLImageGL::generateTextures(LLTexUnit::TT_TEXTURE, pix_format, 1, &mLightFunc); + LLImageGL::generateTextures(1, &mLightFunc); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLightFunc); LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, pix_format, lightResX, lightResY, GL_RED, GL_FLOAT, ls, false); //LLImageGL::setManualImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_UNSIGNED_BYTE, lightResX, lightResY, GL_RED, GL_UNSIGNED_BYTE, ls, false); @@ -2730,14 +2741,14 @@ void LLPipeline::downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& d { shader = &gDownsampleDepthRectProgram; shader->bind(); - shader->uniform2f("delta", 1.f, 1.f); + shader->uniform2f(sDelta, 1.f, 1.f); shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, source.getWidth(), source.getHeight()); } else { shader = &gDownsampleDepthProgram; shader->bind(); - shader->uniform2f("delta", 1.f/source.getWidth(), 1.f/source.getHeight()); + shader->uniform2f(sDelta, 1.f/source.getWidth(), 1.f/source.getHeight()); shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, 1.f, 1.f); } @@ -3112,7 +3123,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) llassert(vobj); // trying to catch a bad assumption if (vobj) // this test may not be needed, see above { - const LLVOAvatar* av = vobj->asAvatar(); + LLVOAvatar* av = vobj->asAvatar(); if (av && av->isImpostor()) { return; @@ -4942,9 +4953,9 @@ void LLPipeline::renderDebug() if (LLGLSLShader::sNoFixedFunction) { gPathfindingProgram.bind(); - gPathfindingProgram.uniform1f("tint", 1.f); - gPathfindingProgram.uniform1f("ambiance", 1.f); - gPathfindingProgram.uniform1f("alpha_scale", 1.f); + gPathfindingProgram.uniform1f(sTint, 1.f); + gPathfindingProgram.uniform1f(sAmbiance, 1.f); + gPathfindingProgram.uniform1f(sAlphaScale, 1.f); } //Requried character physics capsule render parameters @@ -4961,7 +4972,7 @@ void LLPipeline::renderDebug() llPathingLibInstance->renderSimpleShapeCapsuleID( gGL, id, pos, rot ); gGL.setColorMask(true, false); LLGLEnable blend(GL_BLEND); - gPathfindingProgram.uniform1f("alpha_scale", 0.90f); + gPathfindingProgram.uniform1f(sAlphaScale, 0.90f); llPathingLibInstance->renderSimpleShapeCapsuleID( gGL, id, pos, rot ); gPathfindingProgram.bind(); } @@ -4988,9 +4999,9 @@ void LLPipeline::renderDebug() { gPathfindingProgram.bind(); - gPathfindingProgram.uniform1f("tint", 1.f); - gPathfindingProgram.uniform1f("ambiance", ambiance); - gPathfindingProgram.uniform1f("alpha_scale", 1.f); + gPathfindingProgram.uniform1f(sTint, 1.f); + gPathfindingProgram.uniform1f(sAmbiance, ambiance); + gPathfindingProgram.uniform1f(sAlphaScale, 1.f); } if ( !pathfindingConsole->isRenderWorld() ) @@ -5014,7 +5025,7 @@ void LLPipeline::renderDebug() if ( pathfindingConsole->isRenderWorld() ) { LLGLEnable blend(GL_BLEND); - gPathfindingProgram.uniform1f("alpha_scale", 0.66f); + gPathfindingProgram.uniform1f(sAlphaScale, 0.66f); llPathingLibInstance->renderNavMesh(); } else @@ -5026,8 +5037,8 @@ void LLPipeline::renderDebug() if (LLGLSLShader::sNoFixedFunction) { gPathfindingNoNormalsProgram.bind(); - gPathfindingNoNormalsProgram.uniform1f("tint", 1.f); - gPathfindingNoNormalsProgram.uniform1f("alpha_scale", 1.f); + gPathfindingNoNormalsProgram.uniform1f(sTint, 1.f); + gPathfindingNoNormalsProgram.uniform1f(sAlphaScale, 1.f); llPathingLibInstance->renderNavMeshEdges(); gPathfindingProgram.bind(); } @@ -5067,7 +5078,7 @@ void LLPipeline::renderDebug() gGL.setColorMask(true, false); //render the bookends LLGLEnable blend(GL_BLEND); - gPathfindingProgram.uniform1f("alpha_scale", 0.90f); + gPathfindingProgram.uniform1f(sAlphaScale, 0.90f); llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_START ); llPathingLibInstance->renderPathBookend( gGL, LLPathingLib::LLPL_END ); gPathfindingProgram.bind(); @@ -5085,7 +5096,7 @@ void LLPipeline::renderDebug() if (LLGLSLShader::sNoFixedFunction) { LLGLEnable blend(GL_BLEND); - gPathfindingProgram.uniform1f("alpha_scale", 0.90f); + gPathfindingProgram.uniform1f(sAlphaScale, 0.90f); llPathingLibInstance->renderSimpleShapes( gGL, gAgent.getRegion()->getWaterHeight() ); } else @@ -5133,7 +5144,7 @@ void LLPipeline::renderDebug() LLGLEnable blend(GL_BLEND); { - gPathfindingProgram.uniform1f("ambiance", ambiance); + gPathfindingProgram.uniform1f(sAmbiance, ambiance); { //draw solid overlay LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_LEQUAL); @@ -5148,8 +5159,8 @@ void LLPipeline::renderDebug() if (pathfindingConsole->isRenderXRay()) { - gPathfindingProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint")); - gPathfindingProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity")); + gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); + gPathfindingProgram.uniform1f(sAlphaScale, gSavedSettings.getF32("PathfindingXRayOpacity")); LLGLEnable blend(GL_BLEND); LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER); @@ -5157,13 +5168,13 @@ void LLPipeline::renderDebug() if (gSavedSettings.getBOOL("PathfindingXRayWireframe")) { //draw hidden wireframe as darker and less opaque - gPathfindingProgram.uniform1f("ambiance", 1.f); + gPathfindingProgram.uniform1f(sAmbiance, 1.f); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); } else { glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - gPathfindingProgram.uniform1f("ambiance", ambiance); + gPathfindingProgram.uniform1f(sAmbiance, ambiance); llPathingLibInstance->renderNavMeshShapesVBO( render_order[i] ); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } @@ -5171,9 +5182,9 @@ void LLPipeline::renderDebug() { //draw visible wireframe as brighter, thicker and more opaque glPolygonOffset(offset, offset); - gPathfindingProgram.uniform1f("ambiance", 1.f); - gPathfindingProgram.uniform1f("tint", 1.f); - gPathfindingProgram.uniform1f("alpha_scale", 1.f); + gPathfindingProgram.uniform1f(sAmbiance, 1.f); + gPathfindingProgram.uniform1f(sTint, 1.f); + gPathfindingProgram.uniform1f(sAlphaScale, 1.f); glLineWidth(gSavedSettings.getF32("PathfindingLineWidth")); LLGLDisable blendOut(GL_BLEND); @@ -5205,19 +5216,19 @@ void LLPipeline::renderDebug() glLineWidth(2.0f); LLGLEnable cull(GL_CULL_FACE); - gPathfindingProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint")); - gPathfindingProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity")); + gPathfindingProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); + gPathfindingProgram.uniform1f(sAlphaScale, gSavedSettings.getF32("PathfindingXRayOpacity")); if (gSavedSettings.getBOOL("PathfindingXRayWireframe")) { //draw hidden wireframe as darker and less opaque glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); - gPathfindingProgram.uniform1f("ambiance", 1.f); + gPathfindingProgram.uniform1f(sAmbiance, 1.f); llPathingLibInstance->renderNavMesh(); glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); } else { - gPathfindingProgram.uniform1f("ambiance", ambiance); + gPathfindingProgram.uniform1f(sAmbiance, ambiance); llPathingLibInstance->renderNavMesh(); } @@ -5225,8 +5236,8 @@ void LLPipeline::renderDebug() if (LLGLSLShader::sNoFixedFunction) { gPathfindingNoNormalsProgram.bind(); - gPathfindingNoNormalsProgram.uniform1f("tint", gSavedSettings.getF32("PathfindingXRayTint")); - gPathfindingNoNormalsProgram.uniform1f("alpha_scale", gSavedSettings.getF32("PathfindingXRayOpacity")); + gPathfindingNoNormalsProgram.uniform1f(sTint, gSavedSettings.getF32("PathfindingXRayTint")); + gPathfindingNoNormalsProgram.uniform1f(sAlphaScale, gSavedSettings.getF32("PathfindingXRayOpacity")); llPathingLibInstance->renderNavMeshEdges(); gPathfindingProgram.bind(); } @@ -5422,7 +5433,7 @@ void LLPipeline::renderDebug() if (i > 3) { //render shadow frusta as volumes if (mShadowFrustPoints[i-4].empty()) - { + { continue; } @@ -6336,13 +6347,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool) F32 x = (3.f * (1.f + light->getLightFalloff())); // why this magic? probably trying to match a historic behavior. float linatten = x / (light_radius); // % of brightness at radius - if (LLPipeline::sRenderDeferred) - { - /*light_color.mV[0] = powf(light_color.mV[0], 2.2f); - light_color.mV[1] = powf(light_color.mV[1], 2.2f); - light_color.mV[2] = powf(light_color.mV[2], 2.2f);*/ - } - mHWLightColors[cur_light] = light_color; LLLightState* light_state = gGL.getLight(cur_light); @@ -7724,7 +7728,11 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) else { //focus on alt-zoom target - focus_point = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + LLViewerRegion* region = gAgent.getRegion(); + if (region) + { + focus_point = LLVector3(gAgentCamera.getFocusGlobal()-region->getOriginGlobal()); + } } } @@ -8347,10 +8355,10 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, U32 n shader.uniform1f(LLShaderMgr::DEFERRED_NORM_CUTOFF, RenderEdgeNormCutoff); - if (shader.getUniformLocation("norm_mat") >= 0) + if (shader.getUniformLocation(LLShaderMgr::DEFERRED_NORM_MATRIX) >= 0) { glh::matrix4f norm_mat = glh_get_current_modelview().inverse().transpose(); - shader.uniformMatrix4fv("norm_mat", 1, FALSE, norm_mat.m); + shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_NORM_MATRIX, 1, FALSE, norm_mat.m); } } @@ -8472,8 +8480,8 @@ void LLPipeline::renderDeferredLighting() } } - gDeferredSunProgram.uniform3fv("offset", slice, offset); - gDeferredSunProgram.uniform2f("screenRes", mDeferredLight.getWidth(), mDeferredLight.getHeight()); + gDeferredSunProgram.uniform3fv(sOffset, slice, offset); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredLight.getWidth(), mDeferredLight.getHeight()); { LLGLDisable blend(GL_BLEND); @@ -8517,10 +8525,10 @@ void LLPipeline::renderDeferredLighting() x += 1.f; } - gDeferredBlurLightProgram.uniform2f("delta", 1.f, 0.f); - gDeferredBlurLightProgram.uniform1f("dist_factor", dist_factor); - gDeferredBlurLightProgram.uniform3fv("kern", kern_length, gauss[0].mV); - gDeferredBlurLightProgram.uniform1f("kern_scale", blur_size * (kern_length/2.f - 0.5f)); + gDeferredBlurLightProgram.uniform2f(sDelta, 1.f, 0.f); + gDeferredBlurLightProgram.uniform1f(sDistFactor, dist_factor); + gDeferredBlurLightProgram.uniform3fv(sKern, kern_length, gauss[0].mV); + gDeferredBlurLightProgram.uniform1f(sKernScale, blur_size * (kern_length/2.f - 0.5f)); { LLGLDisable blend(GL_BLEND); @@ -8537,7 +8545,7 @@ void LLPipeline::renderDeferredLighting() mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); mDeferredLight.bindTarget(); - gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f); + gDeferredBlurLightProgram.uniform2f(sDelta, 0.f, 1.f); { LLGLDisable blend(GL_BLEND); @@ -9081,8 +9089,8 @@ void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target) } } - gDeferredSunProgram.uniform3fv("offset", slice, offset); - gDeferredSunProgram.uniform2f("screenRes", mDeferredLight.getWidth(), mDeferredLight.getHeight()); + gDeferredSunProgram.uniform3fv(LLShaderMgr::DEFERRED_SHADOW_OFFSET, slice, offset); + gDeferredSunProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mDeferredLight.getWidth(), mDeferredLight.getHeight()); { LLGLDisable blend(GL_BLEND); @@ -10399,14 +10407,14 @@ BOOL LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector const LLPlane& cp = camera.getAgentPlane(j); F32 dist = cp.dist(pp[i]); if (dist > 0.05f) //point is above some plane, not contained - { + { found = false; break; - } - } + } + } - if (found) - { + if (found) + { fp.push_back(pp[i]); } } @@ -11308,11 +11316,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) assertInitialized(); - bool muted = avatar->isVisuallyMuted(); + bool visually_muted = avatar->isVisuallyMuted(); pushRenderTypeMask(); - if (muted) + if (visually_muted) { andRenderTypeMask(LLPipeline::RENDER_TYPE_AVATAR, END_RENDER_TYPES); } @@ -11468,6 +11476,13 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) avatar->mImpostor.bindTarget(); } + F32 old_alpha = LLDrawPoolAvatar::sMinimumAlpha; + + if (visually_muted) + { //disable alpha masking for muted avatars (get whole skin silhouette) + LLDrawPoolAvatar::sMinimumAlpha = 0.f; + } + if (LLPipeline::sRenderDeferred) { avatar->mImpostor.clear(); @@ -11512,7 +11527,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) sImpostorRenderAlphaDepthPass = false; } - + + LLDrawPoolAvatar::sMinimumAlpha = old_alpha; + { //create alpha mask based on depth buffer (grey out if muted) LLFastTimer t(FTM_IMPOSTOR_BACKGROUND); @@ -11524,7 +11541,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) LLGLDisable blend(GL_BLEND); - if (muted) + if (visually_muted) { gGL.setColorMask(true, true); } @@ -11549,10 +11566,20 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) if (LLGLSLShader::sNoFixedFunction) { - gUIProgram.bind(); + gDebugProgram.bind(); } - gGL.color4ub(64,64,64,255); + + if (LLMuteList::getInstance()->isMuted(avatar->getID())) + { //grey muted avatar + gGL.diffuseColor4ub(64,64,64,255); + } + else + { // Visually muted avatar + gGL.diffuseColor4fv( avatar->getMutedAVColor().mV ); + } + + { gGL.begin(LLRender::QUADS); gGL.vertex3f(-1, -1, clip_plane); gGL.vertex3f(1, -1, clip_plane); @@ -11560,10 +11587,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) gGL.vertex3f(-1, 1, clip_plane); gGL.end(); gGL.flush(); + } if (LLGLSLShader::sNoFixedFunction) { - gUIProgram.unbind(); + gDebugProgram.unbind(); } gGL.popMatrix(); diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index fbbcf8f06da1b5dcaba67fe2d81617fe9178e5a8..9aeb2d4978cdc3afa9a6a3a7afd3f109c78152fc 100755 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -296,7 +296,7 @@ public: void unbindDeferredShader(LLGLSLShader& shader); void renderDeferredLighting(); void renderDeferredLightingToRT(LLRenderTarget* target); - + void generateWaterReflection(LLCamera& camera); void generateSunShadow(LLCamera& camera); void generateHighlight(LLCamera& camera); diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_add_person.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_ne.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_arrow_sw.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_call_log.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_call_log.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_close.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_collapse.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_expand.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_hang_up.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_open_call.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_plus.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png b/indra/newview/skins/default/textures/icons/Conv_toolbar_sort.png old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/textures/icons/Facebook.png b/indra/newview/skins/default/textures/icons/Facebook.png new file mode 100644 index 0000000000000000000000000000000000000000..8287d56f88e53b40ba527a35b01e30b34ad095c2 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Facebook.png differ diff --git a/indra/newview/skins/default/textures/icons/map_placeholder.png b/indra/newview/skins/default/textures/icons/map_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..31e457aa75d59f97732f6c739d61765a8f8afebe Binary files /dev/null and b/indra/newview/skins/default/textures/icons/map_placeholder.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 54f60f4441f309bdd2c391e0235cd597eaa68631..bb891996c9fb9c05f73e230aadb4cb8f0ae0ac5f 100755 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -148,10 +148,13 @@ 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" /> <texture name="Command_Voice_Icon" file_name="toolbar_icons/nearbyvoice.png" preload="true" /> + <texture name="Command_Highlighting_Icon" file_name="toolbar_icons/highlighting.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> + <texture name="Command_Highlighting_Selected_Icon" file_name="toolbar_icons/highlighting_selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> <texture name="Caret_Bottom_Icon" file_name="toolbar_icons/caret_bottom.png" preload="true" scale.left="1" scale.top="23" scale.right="15" scale.bottom="1" /> <texture name="Caret_Right_Icon" file_name="toolbar_icons/caret_right.png" preload="true" scale.left="5" scale.top="15" scale.right="28" scale.bottom="1" /> <texture name="Caret_Left_Icon" file_name="toolbar_icons/caret_left.png" preload="true" scale.left="1" scale.top="15" scale.right="23" scale.bottom="1" /> @@ -162,6 +165,7 @@ with the same filename but different name <texture name="ComboButton_On" file_name="widgets/ComboButton_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> + <texture name="ComboButton_Hovered" file_name="widgets/ComboButton_Hover.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Container" file_name="containers/Container.png" preload="false" /> @@ -199,6 +203,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 +329,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 +573,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 new file mode 100644 index 0000000000000000000000000000000000000000..b960b834dcaa4b3dcbf8538b2b070c1430e088ae Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/facebook.png differ diff --git a/indra/newview/skins/default/textures/toolbar_icons/highlighting.png b/indra/newview/skins/default/textures/toolbar_icons/highlighting.png new file mode 100644 index 0000000000000000000000000000000000000000..093bace257d61a308ef98d7c3062514e71c1c518 Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/highlighting.png differ diff --git a/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png b/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1bb26a56bb19e4b4023fffb5bd9293ee634beb Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/highlighting_selected.png differ diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png b/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d492b30b4059aebf49ecd8d4daacbf5fb2c07eff Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/ComboButton_Hover.png differ diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 815bde456e36d499f0de9ea46a2dd2082afcba24..9be129bbf616c285a5bea52868c0c372309c9876 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 72200a07ad55fe5a18cf82b131151e6881cec827..e494b2b755ac2e427bf3a3bd4ba22097ebca44c1 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 479e98817ee76b747ad7859e80838a88b3d8bc2b..7be9a9d5552447211a41772e8de519c9ff7c94d9 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_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml index 524546718327f201848959feadbe37e16b616dbb..bc0eae7c5de4d4233018aefb482199e423ff1b71 100755 --- a/indra/newview/skins/default/xui/de/floater_about.xml +++ b/indra/newview/skins/default/xui/de/floater_about.xml @@ -8,7 +8,9 @@ Kompiliert mit [COMPILER] version [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Sie befinden sich in [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Sie befinden sich an [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] auf <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(globale Koordinaten [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml index 8f99fc933c269082329e3384fdec1707983e00ba..27a74c874ea4eff9f2d2909e9baca2a66c2de445 100755 --- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="BERECHTIGUNGEN BEARBEITEN"> +<floater name="floaterbulkperms" title="INHALTSBERECHTIGUNGEN ÄNDERN"> <floater.string name="nothing_to_modify_text"> Auswahl enthält keinen Inhalt, der bearbeitet werden kann. </floater.string> @@ -33,7 +33,7 @@ <button label="√ Alle" label_selected="Alle" name="check_all"/> <button label="Löschen" label_selected="Keine" name="check_none"/> <text name="newperms"> - Neue Inhalts-Berechtigungen + Inhaltsberechtigungen ändern in </text> <text name="GroupLabel"> Gruppe: @@ -49,6 +49,7 @@ <check_box label="Bearbeiten" name="next_owner_modify"/> <check_box label="Kopieren" name="next_owner_copy"/> <check_box initial_value="true" label="Transferieren" name="next_owner_transfer" tool_tip="Nächster Eigentümer kann dieses Objekt weitergeben oder -verkaufen"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="Anwenden" name="apply"/> <button label="Abbrechen" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_goto_line.xml b/indra/newview/skins/default/xui/de/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..02550ec398d47eda70dca39de7c56e6a8d68b2a7 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="GEHE ZU ZEILE"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Gehe zu Zeile + </text> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml index f96eb72cb1dd9d2a532dd86ba7f3ff6b5ff3ca70..b07b74bf4a2e34032a34318f86758ad1f82060fe 100755 --- a/indra/newview/skins/default/xui/de/floater_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Chat übersetzen" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml index 88e9f53a4c3966631553a878a6d577ddc609c08d..ebf8f01632ff177b9f1838369b825381a8606b84 100755 --- a/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/de/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Anzeigen: </text> - <check_box label="Test" name="show_world"/> + <check_box label="Welt" name="show_world"/> <check_box label="Nur bewegliche Objekte" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index 5f5c34a5cf6d955c82103a33ed62615247524cad..6634a4bd90ca512bbbb6e18db719c5ffdf330a74 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/de/menu_attachment_other.xml index 237c92f7d260355ae8fdc337074b358fe91bf132..4c125c8b5d8d2d4c1f67b3c87f134961b4daaca1 100755 --- a/indra/newview/skins/default/xui/de/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/de/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Einfrieren" name="Freeze..."/> <menu_item_call label="Hinauswerfen" name="Eject..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="XML ausgeben" name="Dump XML"/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> <menu_item_call label="Bezahlen" name="Pay..."/> <menu_item_call label="Objektprofil" name="Object Inspect"/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml index 325d52a22ec7bab82e16069396d376c0e38d70c8..7888c7b0a119d7e77cf3052f69d62f390eebd180 100755 --- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Meine Gruppen" name="Groups..."/> <menu_item_call label="Mein Profil" name="Profile..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="XML ausgeben" name="Dump XML"/> <menu_item_call label="Fallen lassen" name="Drop"/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_other.xml b/indra/newview/skins/default/xui/de/menu_avatar_other.xml index 8aee0be3d2e1d8b6786cad226911dba60ff965c7..65dc054ed506483c7e91af04ac15fb7bad8eaf0c 100755 --- a/indra/newview/skins/default/xui/de/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Einfrieren" name="Freeze..."/> <menu_item_call label="Hinauswerfen" name="Eject..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="XML ausgeben" name="Dump XML"/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> <menu_item_call label="Bezahlen" name="Pay..."/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml index c49f4b198bf83b34e7af127a6c4f2066d8689397..022cd8c3caa513a3800021740928ef50d8ed0157 100755 --- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Meine Gruppen" name="Groups..."/> <menu_item_call label="Mein Profil" name="Profile..."/> <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/> + <menu_item_call label="XML ausgeben" name="Dump XML"/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_conversation.xml b/indra/newview/skins/default/xui/de/menu_conversation.xml index 30d3ab79e1a53bac35e0bc86c49eaedf61a21b50..bdfa66c23b8d52c0aad2e3096c6ffa01acd207e3 100644 --- a/indra/newview/skins/default/xui/de/menu_conversation.xml +++ b/indra/newview/skins/default/xui/de/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Unterhaltung schließen" name="close_conversation"/> <menu_item_call label="Unterhaltung öffnen" name="open_voice_conversation"/> <menu_item_call label="Voice-Verbindung trennen" name="disconnect_from_voice"/> + <menu_item_call label="Ausgewählte schließen" name="close_selected_conversations"/> <menu_item_call label="Profil anzeigen" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="Teleport anbieten" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/de/menu_land.xml b/indra/newview/skins/default/xui/de/menu_land.xml index de679da3d8e8f0b4b67060128dedee3fe3dd5777..0bbf8c666edcec55f62794c3d7548700cca17544 100755 --- a/indra/newview/skins/default/xui/de/menu_land.xml +++ b/indra/newview/skins/default/xui/de/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Pass kaufen" name="Land Buy Pass"/> <menu_item_call label="Bauen" name="Create"/> <menu_item_call label="Land bearbeiten" name="Edit Terrain"/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml index b43b41a5dc2cf0f80a47e047e4092d2d6c5f9431..62358cc5a88f388ce432b8fbd0e3db00cc40c38f 100755 --- a/indra/newview/skins/default/xui/de/menu_login.xml +++ b/indra/newview/skins/default/xui/de/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="Servicebedingungen anzeigen" name="TOS"/> <menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/> <menu_item_call label="Web Content Floater Debug Test" name="Web Content Floater Debug Test"/> - <menu label="Protokollierungsstufe festlegen" name="Set Logging Level"/> + <menu label="Protokollierungsstufe festlegen" name="Set Logging Level"> + <menu_item_check label="Debug" name="Debug"/> + <menu_item_check label="Info" name="Info"/> + <menu_item_check label="Warnung" name="Warning"/> + <menu_item_check label="Fehler" name="Error"/> + <menu_item_check label="Keine" name="None"/> + </menu> <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/> <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/de/menu_mute_particle.xml b/indra/newview/skins/default/xui/de/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea8ae03ee076d27ee7daaf799e26a117eba49b44 --- /dev/null +++ b/indra/newview/skins/default/xui/de/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml index 9f44ced928b7b77659aa780ddd9ab988198fde0b..de2b4096780f4eb7c81d299a9cdb08804bb23d31 100755 --- a/indra/newview/skins/default/xui/de/menu_object.xml +++ b/indra/newview/skins/default/xui/de/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="Bearbeiten" name="Edit..."/> <menu_item_call label="Bauen" name="Build"/> - <menu_item_call label="In Linksets anzeigen" name="show_in_linksets"/> - <menu_item_call label="In Figuren anzeigen" name="show_in_characters"/> <menu_item_call label="Öffnen" name="Open"/> <menu_item_call label="Hier sitzen" name="Object Sit"/> <menu_item_call label="Aufstehen" name="Object Stand Up"/> <menu_item_call label="Objektprofil" name="Object Inspect"/> <menu_item_call label="Hineinzoomen" name="Zoom In"/> + <menu_item_call label="In Linksets anzeigen" name="show_in_linksets"/> + <menu_item_call label="In Figuren anzeigen" name="show_in_characters"/> <context_menu label="Anziehen" name="Put On"> <menu_item_call label="Anziehen" name="Wear"/> <menu_item_call label="Hinzufügen" name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="Bezahlen" name="Pay..."/> <menu_item_call label="Kaufen" name="Buy..."/> <menu_item_call label="Löschen" name="Delete"/> + <menu_item_call label="Partikeleigentümer blockieren" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_agent.xml b/indra/newview/skins/default/xui/de/menu_url_agent.xml index c61ebb0eae29fcfa781d38ea3ca77c2a2abcb43b..ddb072ba8f11bc10799216ce21c973f1192b13d9 100755 --- a/indra/newview/skins/default/xui/de/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/de/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Profil anzeigen" name="show_agent"/> <menu_item_call label="IM senden..." name="send_im"/> <menu_item_call label="Freund hinzufügen..." name="add_friend"/> + <menu_item_call label="Freund entfernen..." name="remove_friend"/> <menu_item_call label="Name in Zwischenablage kopieren" name="url_copy_label"/> <menu_item_call label="SLurl in die Zwischenablage kopieren" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/de/menu_url_objectim.xml b/indra/newview/skins/default/xui/de/menu_url_objectim.xml index 77b7004e44f398928bdb80597d41d2e70c50e2df..fc01ea84447e158afec28986d4bebe443093f7bd 100755 --- a/indra/newview/skins/default/xui/de/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/de/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Objektprofil..." name="show_object"/> + <menu_item_call label="Blockieren..." name="block_object"/> <menu_item_call label="Auf Karte zeigen" name="show_on_map"/> <menu_item_call label="Zu Objekt-Position teleportieren" name="teleport_to_object"/> <menu_item_call label="Objektname in Zwischenablage kopieren" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index 47d9fec35276a4c25c6710782db1b0a8005bdc9e..be5d4891d71e63d1f8d5bd92fc6e49dd5a364c87 100755 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> <menu_item_call label="Gehen/Rennen/Fliegen..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"/> + <menu label="Status" name="Status"> + <menu_item_check label="Abwesend" name="Away"/> + <menu_item_check label="Nicht stören" name="Do Not Disturb"/> + </menu> <menu_item_call label="L$ kaufen..." name="Buy and Sell L$"/> <menu_item_call label="Händler-Outbox..." name="MerchantOutbox"/> <menu_item_call label="Kontoübersicht..." name="Manage My Account"> @@ -32,6 +35,7 @@ <menu_item_check label="Unterhaltungen..." name="Conversations"/> <menu_item_check label="Chat in der Nähe..." name="Nearby Chat"/> <menu_item_check label="Sprechen" name="Speak"/> + <menu_item_check label="Unterhaltungsprotokoll..." name="Conversation Log..."/> <menu label="Voice-Morphing" name="VoiceMorphing"> <menu_item_check label="Kein Voice-Morphing" name="NoVoiceMorphing"/> <menu_item_check label="Vorschau..." name="Preview"/> @@ -42,6 +46,7 @@ <menu_item_check label="Gruppen" name="My Groups"/> <menu_item_check label="Leute in der Nähe" name="Active Speakers"/> <menu_item_call label="Blockierliste" name="Block List"/> + <menu_item_check label="Nicht stören" name="Do Not Disturb"/> </menu> <menu label="Welt" name="World"> <menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/> @@ -110,6 +115,7 @@ <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/> <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/> </menu> + <menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Fokus auf Auswahl" name="Focus on Selection"/> <menu_item_call label="Auf Auswahl zoomen" name="Zoom to Selection"/> <menu label="Objekt" name="Object"> @@ -279,6 +285,7 @@ <menu_item_check label="Framerate randomisieren" name="Randomize Framerate"/> <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/> <menu_item_check label="Frame-Test" name="Frame Test"/> + <menu_item_call label="Rahmenprofil" name="Frame Profile"/> </menu> <menu label="Metadaten darstellen" name="Render Metadata"> <menu_item_check label="Bonding Boxes" name="Bounding Boxes"/> @@ -313,9 +320,10 @@ <menu_item_check label="Achsen" name="Axes"/> <menu_item_check label="Tangentenbasis" name="Tangent Basis"/> <menu_item_call label="Texturinfo für ausgewähltes Objekt" name="Selected Texture Info Basis"/> + <menu_item_call label="Ausgewählte Materialinfos" name="Selected Material Info"/> <menu_item_check label="Wireframe" name="Wireframe"/> <menu_item_check label="Objekt-Objekt Okklusion" name="Object-Object Occlusion"/> - <menu_item_check label="Uber Licht Modell" name="Advanced Lighting Model"/> + <menu_item_check label="Erweitertes Beleuchtungsmodell" name="Advanced Lighting Model"/> <menu_item_check label="Schatten von Sonne-/Mond-Projektoren" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO und Schattenglättung" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Fehler in GL beseitigen" name="Debug GL"/> @@ -325,7 +333,6 @@ <menu_item_check label="Animationstexturen" name="Animation Textures"/> <menu_item_check label="Texturen deaktivieren" name="Disable Textures"/> <menu_item_check label="Voll-Res-Texturen" name="Rull Res Textures"/> - <menu_item_check label="Textur-Atlas (experimentell)" name="Texture Atlas"/> <menu_item_check label="Angehängte Lichter rendern" name="Render Attached Lights"/> <menu_item_check label="Angehängte Partikel rendern" name="Render Attached Particles"/> <menu_item_check label="Leucht-Objekte schweben lassen" name="Hover Glow Objects"/> @@ -361,7 +368,6 @@ <menu_item_call label="Fokus ausgeben" name="Dump Focus Holder"/> <menu_item_call label="Ausgewählte Objektinfo drucken" name="Print Selected Object Info"/> <menu_item_call label="Agent-Info drucken" name="Print Agent Info"/> - <menu_item_call label="Speicher-Stats" name="Memory Stats"/> <menu_item_check label="Regions-Debug-Konsole" name="Region Debug Console"/> <menu_item_check label="Fehler in SelectMgr beseitigen" name="Debug SelectMgr"/> <menu_item_check label="Fehler in Klicks beseitigen" name="Debug Clicks"/> @@ -395,7 +401,6 @@ </menu> <menu_item_call label="Param auf Standard erzwingen" name="Force Params to Default"/> <menu_item_check label="Animations-Info" name="Animation Info"/> - <menu_item_check label="Zeitlupen-Animationen" name="Slow Motion Animations"/> <menu_item_check label="Kamerafokus anzeigen" name="Show Look At"/> <menu_item_check label="Klickpunkt anzeigen??" name="Show Point At"/> <menu_item_check label="Fehler in Landaktualisierung beseitigen" name="Debug Joint Updates"/> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index dc0d7dc6b4b6ebcf73d33006044f688429ba03b3..b3ae98f6333f2b9af455a126f1d82b07b8f98fb7 100755 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -146,7 +146,7 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/> </notification> <notification name="FriendsAndGroupsOnly"> - Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben. + Personen, die nicht auf Ihrer Freundesliste stehen, werden nicht informiert, dass Sie ihre Anrufe und Instant Messages ignorieren. <usetemplate name="okbutton" yestext="Ja"/> </notification> <notification name="FavoritesOnLogin"> @@ -216,6 +216,14 @@ Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> + <notification name="EjectGroupMemberWarning"> + Sie sind dabei, [AVATAR_NAME] aus der Gruppe hinauszuwerfen. + <usetemplate ignoretext="Hinauswerfen eines einzelnen Gruppenmitglieds bestätigen" name="okcancelignore" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Sie sind dabei, [COUNT] Mitglieder aus der Gruppe hinauszuwerfen. + <usetemplate ignoretext="Hinauswerfen mehrerer Gruppenmitglieder bestätigen" name="okcancelignore" notext="Abbrechen" yestext="Hinauswerfen"/> + </notification> <notification name="AttachmentDrop"> Sie möchten Ihren Anhang wirklich fallen lassen? Möchten Sie fortfahren? @@ -1124,7 +1132,7 @@ auf ALLEN LÄNDERN in diesem Sim LÖSCHEN? Geben sie einen höheren Betrag ein. </notification> <notification name="ConfirmItemDeleteHasLinks"> - Mindestens eines Ihrer ausgewählten Objekte verfügt über verknüpfte Objekte. Wenn Sie dieses Objekt löschen, funktionieren die Verknüpfungen nicht mehr. Wir empfehlen Ihnen daher, diese Verknüpfungen zuerst zu löschen. + Auf mindestens eines der Objekte wird über Verknüpfungen Bezug genommen. Wenn Sie dieses Objekt löschen, funktionieren die Verknüpfungen nicht mehr. Wir empfehlen daher, diese Verknüpfungen zuerst zu löschen. Möchten Sie diese Objekte wirklich löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> @@ -1142,9 +1150,9 @@ Möchten Sie diese Objekte löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - Mindestens eines der ausgewählten Objekt gehört nicht Ihnen. + Mindestens eines der ausgewählten Objekte gehört nicht Ihnen. -Möchten Sie diese Objekte löschen? +Möchten Sie diese Objekte wirklich löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1158,14 +1166,14 @@ Möchten Sie diese Objekte löschen? Mindestens ein Objekt ist gesperrt. Mindestens ein Objekt gehört nicht Ihnen. -Möchten Sie diese Objekte löschen? +Möchten Sie diese Objekte wirklich löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> Mindestens ein Objekt kann nicht kopiert werden. Mindestens ein Objekt gehört nicht Ihnen. -Möchten Sie diese Objekte löschen? +Möchten Sie diese Objekte wirklich löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> @@ -1173,7 +1181,7 @@ Möchten Sie diese Objekte löschen? Mindestens ein Objekt kann nicht kopiert werden. Mindestens ein Objekt gehört nicht Ihnen. -Möchten Sie diese Objekte löschen? +Möchten Sie diese Objekte wirklich löschen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> @@ -1492,13 +1500,43 @@ Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informationen zu diesem Update] </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> Ein erforderliches Softwareupdate wurde heruntergeladen. -Version [VERSION] +Version [VERSION] [[INFO_URL] Infos zu diesem Update] Zur Installation des Updates muss [APP_NAME] neu gestartet werden. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> Zur Installation des Updates muss [APP_NAME] neu gestartet werden. +[[INFO_URL] Infos zu diesem Update] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen. +Version [VERSION] +Dieser experimentelle Viewer wurde durch einen [NEW_CHANNEL] Viewer ersetzt; +weitere Details zu diesem Update finden Sie [[INFO_URL] hier]. + <usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + Für Ihre [APP_NAME]-Installation wurde ein Update heruntergeladen. +Version [VERSION] +Dieser experimentelle Viewer wurde durch einen [NEW_CHANNEL] Viewer ersetzt; +weitere Infos zu diesem Update finden Sie [[INFO_URL] hier]. + <usetemplate name="okcancelbuttons" notext="Später..." yestext="Jetzt installieren und [APP_NAME] neu starten"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + Ein erforderliches Softwareupdate wurde heruntergeladen. +Version [VERSION] +Dieser experimentelle Viewer wurde durch einen [NEW_CHANNEL] Viewer ersetzt; +weitere Infos zu diesem Update finden Sie [[INFO_URL] hier]. + +Zur Installation des Updates muss [APP_NAME] neu gestartet werden. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Zur Installation des Updates muss [APP_NAME] neu gestartet werden. +Dieser experimentelle Viewer wurde durch einen [NEW_CHANNEL] Viewer ersetzt; +weitere Infos zu diesem Update finden Sie [[INFO_URL] hier]. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1549,6 +1587,10 @@ Zur Installation des Updates muss [APP_NAME] neu gestartet werden. Diese Gruppe verlassen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Sie können die Gruppe nicht verlassen, da Sie der letzte Besitzer der Gruppe sind. Weisen Sie die Besitzerrolle zuerst einem anderen Mitglied zu. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> Möchten Sie WIRKLICH alle Benutzer aus dem Grid werfen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Alle Benutzer hinauswerfen"/> @@ -2410,9 +2452,7 @@ Wählen Sie ein einzelnes Objekt aus. „Teleportieren“ wählen.) </notification> <notification name="TeleportToPerson"> - Um Einwohner wie „[NAME]“ zu kontaktieren, klicken Sie auf die Schaltfläche „Leute“, wählen Sie eingeblendeten Fenster einen Einwohner aus - und klicken Sie unten im Fenster auf „IM“. - (Sie können auch auf den Namen doppelklicken bzw. ihn mit der rechten Maustaste anklicken und dann „IM“ wählen.) + Um eine private Unterhaltung zu beginnen, klicken Sie mit der rechten Maustaste auf den gewünschten Avatar und wählen Sie im Menü „IM“ aus. </notification> <notification name="CantSelectLandFromMultipleRegions"> Land kann nicht über Servergrenzen hinweg ausgewählt werden. @@ -2786,6 +2826,15 @@ Gewähren Sie dem Objekt nur dann Zugriff, wenn Sie genau verstehen, wieso ein s <button name="Deny" text="Verweigern"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + Die Runtime-Skript-Berechtigung, die von „<nolink>[OBJECTNAME]</nolink>“ (Besitzer: „[NAME]“) angefordert wurde, wird vom Viewer nicht erkannt und kann nicht gewährt werden. + +Um diese Berechtigung zu gewähren, laden Sie die neueste Version des Viewers von [DOWNLOADURL] herunter. + <form name="form"> + <button name="Deny" text="OK"/> + <button name="Mute" text="Blockieren"/> + </form> + </notification> <notification name="ScriptDialog"> „<nolink>[TITLE]</nolink>“ von [NAME] [MESSAGE] diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 8c05ca2c247f926bfc4494ae37ecc5ea6df73986..2d56d6b7d2ed3d8a6832c624ffa1f23b6bab891e 100755 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -49,6 +49,9 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <menu_button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> <dnd_button name="minus_btn" tool_tip="Ausgewählte Gruppe verlassen"/> </panel> + <text name="groupcount"> + Sie gehören [COUNT] Gruppen an und können [REMAINING] weiteren beitreten. + </text> </panel> <panel label="AKTUELL" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 8193fd42c1172fa36f2f4c1a8680a2c19ee29b64..8eb815fd1bd444cf5cd6100d81c4311d9fbe7c30 100755 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text-Chat" name="chat"> - <panel> + <panel name="general_chat_settings"> <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> - <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> + <check_box label="IMs per E-Mail zustellen, wenn ich offline bin" name="send_im_to_email"/> <check_box label="Nur IMs und Anrufe von Freunden oder Gruppen durchstellen" name="voice_call_friends_only_check"/> <text name="font_size"> Schriftgröße: @@ -14,10 +14,7 @@ </combo_box> <check_box label="Blasen-Chat" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Benachrichtigungen - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> IMs von Freunden: </text> @@ -25,8 +22,9 @@ <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> - <item label="None" name="None" value="none"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sound abspielen" name="play_sound_friend_im"/> <text name="non_friend_ims"> IMs von anderen: </text> @@ -34,8 +32,9 @@ <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> - <item label="None" name="None" value="none"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sound abspielen" name="play_sound_non_friend_im"/> <text name="conference_ims"> Konferenz-IMs: </text> @@ -43,8 +42,9 @@ <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> - <item label="None" name="None" value="none"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sound abspielen" name="play_sound_conference_im"/> <text name="group_chat"> Gruppen-Chat: </text> @@ -52,8 +52,9 @@ <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> <item label="Flash-Symbolleistenschaltfläche" name="FlashToolbarButton" value="flash"/> - <item label="None" name="None" value="none"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sound abspielen" name="play_sound_group_chat_im"/> <text name="nearby_chat"> Chat in der Nähe: </text> @@ -61,25 +62,36 @@ <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> <item label="Flash-Symbolleistenschaltfläche" name="FlashToolBarButton" value="flash"/> - <item label="None" name="None" value="none"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Sound abspielen" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + IMs von Objekten: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Unterhaltungsfenster öffnen" name="OpenConversationsWindow" value="openconversations"/> + <item label="Nachricht in Popup anzeigen" name="PopUpMessage" value="toast"/> + <item label="Flash-Symbolleistenschaltfläche" name="FlashToolBarButton" value="flash"/> + <item label="Keine Aktion" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sound abspielen" name="play_sound_object_im"/> <text name="notifications_alert"> Um vorübergehend alle Benachrichtigungen zu stoppen, wählen Sie „Unterhalten“ > „Nicht stören“. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Sound abspielen: </text> <check_box label="Neue Unterhaltung" name="new_conversation"/> - <check_box label="Eingehender Anruf..." name="incoming_voice_call"/> + <check_box label="Eingehender Anruf" name="incoming_voice_call"/> <check_box label="Teleport-Angebot" name="teleport_offer"/> <check_box label="Inventarangebot" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="Protokoll löschen..." name="clear_log"/> - <button label="Protokolle löschen..." name="delete_transcripts"/> - <button label="Durchsuchen..." label_selected="Durchsuchen" name="log_path_button"/> + <button label="Transkripte löschen..." name="delete_transcripts"/> + <button label="Durchsuchen..." label_selected="Durchblättern" name="log_path_button"/> </panel> <button label="Übersetzen..." name="ok_btn"/> <button label="Automatisch ersetzen..." name="autoreplace_showgui"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index 9175ea0bae9fb89f5a8f99580506ef178cdeea47..f3746a7c8246af5863504db8af493187d60eb391 100755 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -30,7 +30,7 @@ <check_box initial_value="true" label="Lokale Lichtquellen" name="LocalLights"/> <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/> <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Licht und Schatten" name="UseLightShaders"/> + <check_box initial_value="true" label="Erweitertes Beleuchtungsmodell" name="UseLightShaders"/> <check_box initial_value="true" label="Ambient Occlusion" name="UseSSAO"/> <check_box initial_value="true" label="Schärfentiefe" name="UseDoF"/> <text name="shadows_label"> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml index 8c7ea688d7f6f724e3152aa9df8aed100dd3b56a..24e5033bfc7e9090095a3961a545c2b2a0d4a8c9 100755 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -29,6 +29,7 @@ <combo_box.item label="Automatisch installieren" name="Install_automatically"/> <combo_box.item label="Updates manuell herunterladen und installieren" name="Install_manual"/> </combo_box> + <check_box label="Bereit, Release-Kandidaten zu verwenden" name="update_willing_to_test"/> <text name="Proxy Settings:"> Proxy-Einstellungen: </text> diff --git a/indra/newview/skins/default/xui/de/panel_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml index 7e03aeff15fec2e3ec31323658613299965ccdb9..d688bedd5ccb282d8bcfc4a3a792e2328a477742 100755 --- a/indra/newview/skins/default/xui/de/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Alle auswählen" name="Select All"/> <menu_item_call label="Auswahl aufheben" name="Deselect"/> <menu_item_call label="Suchen / Ersetzen..." name="Search / Replace..."/> + <menu_item_call label="Gehe zu Zeile..." name="Go to line..."/> </menu> <menu label="Hilfe" name="Help"> <menu_item_call label="Hilfe..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/de/panel_tools_texture.xml b/indra/newview/skins/default/xui/de/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..18517d7a7d3aa04fa6467f237c28ab84ea832961 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Textur" name="Texture"> + <panel.string name="string repeats per meter"> + Wiederholungen pro Meter + </panel.string> + <panel.string name="string repeats per face"> + Wiederholungen pro Fläche + </panel.string> + <text name="color label"> + Farbe + </text> + <color_swatch label="" name="colorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> + <text name="color trans"> + Transparenz % + </text> + <text name="glow label"> + Leuchten + </text> + <check_box label="Ganz hell" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Material" name="Materials"/> + <combo_box.item label="Medien" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Textur (diffus)" name="Texture (diffuse)"/> + <combo_box.item label="Unebenheit (normal)" name="Bumpiness (normal)"/> + <combo_box.item label="Glanzlicht (Spiegel)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Textur" name="texture control" tool_tip="Klicken, um ein Bild zu wählen"/> + <text name="label alphamode"> + Alpha-Modus + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Keiner" name="None"/> + <combo_box.item label="Alpha-Mischung" name="Alpha blending"/> + <combo_box.item label="Alpha-Maske" name="Alpha masking"/> + <combo_box.item label="Selbststrahlende Maske" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + Maskenabgrenzung + </text> + <texture_picker label="Textur" name="bumpytexture control" tool_tip="Klicken, um ein Bild auszuwählen"/> + <text name="label bumpiness"> + Unebenheit + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Keine" name="None"/> + <combo_box.item label="Helligkeit" name="Brightness"/> + <combo_box.item label="Dunkelheit" name="Darkness"/> + <combo_box.item label="Holzmaserung" name="woodgrain"/> + <combo_box.item label="Rinde" name="bark"/> + <combo_box.item label="Backsteine" name="bricks"/> + <combo_box.item label="Schachbrett" name="checker"/> + <combo_box.item label="Beton" name="concrete"/> + <combo_box.item label="Rostkachel" name="crustytile"/> + <combo_box.item label="Steinfliesen" name="cutstone"/> + <combo_box.item label="Scheiben" name="discs"/> + <combo_box.item label="Kies" name="gravel"/> + <combo_box.item label="Petrischale" name="petridish"/> + <combo_box.item label="Verkleidung" name="siding"/> + <combo_box.item label="Steinkachel" name="stonetile"/> + <combo_box.item label="Stuck" name="stucco"/> + <combo_box.item label="Saugkraft" name="suction"/> + <combo_box.item label="Gewebe" name="weave"/> + </combo_box> + <texture_picker label="Textur" name="shinytexture control" tool_tip="Klicken, um ein Bild auszuwählen"/> + <text name="label shininess"> + Glanz + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Keiner" name="None"/> + <combo_box.item label="Niedrig" name="Low"/> + <combo_box.item label="Mittel" name="Medium"/> + <combo_box.item label="Hoch" name="High"/> + </combo_box> + <text name="label glossiness"> + Glanz + </text> + <text name="label environment"> + Umgebung + </text> + <text name="label shinycolor"> + Farbe + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> + <text name="media_info"> + URL der ausgewählten Medien ggf. hier angeben + </text> + <button label="Auswählen..." name="add_media" tool_tip="Medien hinzufügen"/> + <button label="Entfernen" name="delete_media" tool_tip="Diese Medientextur löschen"/> + <button label="Ausrichten" label_selected="Medien ausrichten" name="button align" tool_tip="Medientextur ausrichten (muss zuerst geladen werden)"/> + <text name="tex gen"> + Zuordnung + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Standard" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> + </combo_box> + <spinner label="Horizontale Skalierung" name="TexScaleU"/> + <spinner label="Vertikale Skalierung" name="TexScaleV"/> + <spinner label="Wiederholungen pro Meter" name="rptctrl"/> + <spinner label="Drehung (Grad)" name="TexRot"/> + <spinner label="Horizontaler Versatz" name="TexOffsetU"/> + <spinner label="Vertikaler Versatz" name="TexOffsetV"/> + <spinner label="Horizontale Skalierung" name="bumpyScaleU"/> + <spinner label="Vertikale Skalierung" name="bumpyScaleV"/> + <spinner label="Drehung (Grad)" name="bumpyRot"/> + <spinner label="Horizontaler Versatz" name="bumpyOffsetU"/> + <spinner label="Vertikaler Versatz" name="bumpyOffsetV"/> + <spinner label="Horizontale Skalierung" name="shinyScaleU"/> + <spinner label="Vertikale Skalierung" name="shinyScaleV"/> + <spinner label="Drehung (Grad)" name="shinyRot"/> + <spinner label="Horizontaler Versatz" name="shinyOffsetU"/> + <spinner label="Vertikaler Versatz" name="shinyOffsetV"/> + <check_box initial_value="false" label="Planare Flächen ausrichten" name="checkbox planar align" tool_tip="Texturen auf allen ausgewählten Flächen an der zuletzt ausgewählten Fläche ausrichten. Erfordert planares Texture Mapping."/> +</panel> diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml index 5d9dcacd51c6d73b025d33877a9ebedd43166839..3e9d406e5f0f87730ad4317c32fe271f1e022ba7 100755 --- a/indra/newview/skins/default/xui/de/role_actions.xml +++ b/indra/newview/skins/default/xui/de/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, den Parzellennamen und die Veröffentlichungseinstellungen sowie die Anzeige des Suchverzeichnisses, den Landepunkt und die TP-Routenoptionen festzulegen." name="Parcel Identity"> <action description="„Ort in Suche anzeigen" ein-/ausschalten und Kategorie festlegen." longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „Ort in Suche anzeigen“ ein- und ausschalten und die Parzellenkategorie festlegen." name="land find places" value="17"/> - <action description="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern" longdescription="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern Diese Einstellungen finden Sie unter „Land-Info“ > Registerkarte „Optionen“." name="land change identity" value="18"/> + <action description="Parzellenname, Beschreibung und Einstelllungen für „Moderater Inhalt“ ändern" longdescription="Parzellenname, Beschreibung und Einstelllungen für „Moderater Inhalt“ ändern. Diese Einstellungen finden Sie unter „Land-Info“ > Registerkarte „Optionen“." name="land change identity" value="18"/> <action description="Landepunkt und Teleport-Route festlegen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle einen Landepunkt für ankommende Teleports und Teleport-Routen festlegen. Diese Einstellungen finden Sie unter „Land-Info“ > „Optionen“." name="land set landing point" value="19"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index e142cb8029674774bb4acb29c01be2e4a20f1900..4268b95370e795b42d5a1b4e00e4cb367314a689 100755 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> Mit dem von Ihnen verwendeten Viewer ist der Zugriff auf Second Life nicht mehr möglich. Laden Sie von den folgenden Seite einen neuen Viewer herunter: http://secondlife.com/download @@ -448,6 +451,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="SLappAgentRequestFriend"> Freundschaftsangebot </string> + <string name="SLappAgentRemoveFriend"> + Entfernen von Freunden + </string> <string name="BUTTON_CLOSE_DARWIN"> Schließen (⌘W) </string> @@ -838,6 +844,9 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="multiple_textures"> Mehrfach </string> + <string name="use_texture"> + Textur verwenden + </string> <string name="texture_loading"> Wird geladen... </string> @@ -937,6 +946,21 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="TeleportYourAgent"> Sie teleportieren </string> + <string name="JoinAnExperience"> + Bei einem Erlebnis mitmachen + </string> + <string name="SilentlyManageEstateAccess"> + Beim Verwalten von Grundbesitzzugangslisten Warnhinweise unterdrücken + </string> + <string name="OverrideYourAnimations"> + Ihre Standardanimationen ersetzen + </string> + <string name="ScriptReturnObjects"> + Objekte in Ihrem Namen zurückgeben + </string> + <string name="UnknownScriptPermission"> + (unbekannt) + </string> <string name="SIM_ACCESS_PG"> Generell </string> @@ -1250,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 @@ -1968,6 +1992,12 @@ Warten Sie kurz und versuchen Sie dann noch einmal, sich anzumelden. <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD unten rechts </string> + <string name="ATTACH_NECK"> + Hals + </string> + <string name="ATTACH_AVATAR_CENTER"> + Avatar-Mitte + </string> <string name="CursorPos"> Zeile [LINE], Spalte [COLUMN] </string> @@ -2997,6 +3027,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="Hip Width"> Breite der Hüfte </string> + <string name="Hover"> + Schweben + </string> <string name="In"> In </string> @@ -5081,4 +5114,7 @@ Setzen Sie den Editorpfad in Anführungszeichen <string name="logging_calls_enabled_log_empty"> Keine protokollierten Unterhaltungen verfügbar. Hier erscheint ein Protokolleintrag, wenn Sie eine Person kontaktieren oder von einer Person kontaktiert werden. </string> + <string name="loading_chat_logs"> + Laden... + </string> </strings> 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 793a6e6fa1ef6687508c6b3311fa7745af5a5392..a660e812ccf0bb966d61d34711af1928bc6abbd8 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 0000000000000000000000000000000000000000..0d35e22a19296bf101fb02246b2d0f9ceff52c65 --- /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 1215efb7f96478c879bf0c70d9bfaa693d01abe9..28c89868bdd6526bfe04eb892fcda5b05ef6b630 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_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 49d64767cc783f28164c1ad28da13ef9515bab51..853c209bcac0e4395a287dcef2142e6a187ec5fa 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 0000000000000000000000000000000000000000..b7ff374d5f6c6f6284350d3a03f778ea9e3c4f66 --- /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 cea10adca8e8b182df6f9c18259bac5e39d70afe..a80440e844892d3cefe08f35cbed13a7bdd6efb4 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_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml index 0a8beec7de025d569fb13bc68e5c6dbbfce16d3f..ba91b0b5d9489a7aa9fcb1e55bdcd87b58cf57f8 100755 --- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml @@ -112,8 +112,43 @@ <menu_item_call.on_enable function="Object.EnableInspect" /> </menu_item_call> + + <menu_item_separator /> + + <menu_item_check + name="Normal" + label="Normal Rendering"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="0" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="0" /> + </menu_item_check> + <menu_item_check + name="Always use impostor" + label="Always use impostor"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="1" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="1" /> + </menu_item_check> + <menu_item_check + name="Never use impostor" + label="Never use impostor"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="2" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="2" /> + </menu_item_check> + <menu_item_separator - layout="topleft" /> + layout="topleft" name="Impostor seperator"/> + <menu_item_call enabled="false" label="Block Particle Owner" 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 50910dff32437eba7156eaf03f2ca7aac9cfc720..77b9095f7cdf9996cc9e2506f662b2533f0b3912 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,26 @@ 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="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 +52,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_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml index 8be2683680fa6115b4a9740e6112320899a74e52..8bd013f14b2d132da86ee484f76dc502ea94b129 100755 --- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml @@ -39,8 +39,10 @@ <menu_item_call.on_click function="Avatar.InviteToGroup" /> </menu_item_call> + <menu_item_separator /> - <menu_item_call + + <menu_item_call enabled="false" label="Block" name="Avatar Mute"> @@ -103,8 +105,43 @@ <menu_item_call.on_enable function="EnablePayAvatar" /> </menu_item_call> - <menu_item_separator - layout="topleft" /> + + <menu_item_separator /> + + <menu_item_check + name="Normal" + label="Normal Rendering"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="0" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="0" /> + </menu_item_check> + <menu_item_check + name="Always use impostor" + label="Always use impostor"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="1" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="1" /> + </menu_item_check> + <menu_item_check + name="Never use impostor" + label="Never use impostor"> + <menu_item_check.on_check + function="Avatar.CheckImpostorMode" + parameter="2" /> + <menu_item_check.on_click + function="Avatar.SetImpostorMode" + parameter="2" /> + </menu_item_check> + + <menu_item_separator + layout="topleft" name="Impostor seperator"/> + <menu_item_call enabled="false" label="Block Particle Owner" diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index b3d28788da19817eec2ba77ab4b84e82fabcef0b..31b1d091eef1be5d8e80b57883ab7695790ec6bc 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -52,6 +52,13 @@ <on_click function="Avatar.DoToSelected" parameter="offer_teleport"/> <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" 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 8796b87955fb99aa096cebd76fec0bf38118fed6..a1a3afbf6820d2786a55f5dd920ac82fef5f5696 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 13dc0b941ad36df6026eea6e2e02b26792f60206..512205ba43c3de94448cb835189110039612fe57 100755 --- a/indra/newview/skins/default/xui/en/menu_inventory.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory.xml @@ -590,6 +590,14 @@ function="Inventory.DoToSelected" 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" 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 3abb5f7bc8ca3a8a142da8c254d20a47e0de3475..f12226ebeb48964ce71848a398bcecbd2e42394a 100755 --- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml @@ -28,6 +28,15 @@ function="Avatar.EnableItem" 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" @@ -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_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index f253ed3e06da98e7aa0dcd8b3c90f2896e3aded8..e5e2bd4c114d97226728a760861a9ad3a3c3b55d 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -15,6 +15,14 @@ function="ShowAgentProfile" 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"> @@ -93,7 +101,7 @@ <menu_item_check label="Fly" name="Fly" - shortcut="Home"> + shortcut="HOME"> <menu_item_check.on_check function="Agent.getFlying" /> <menu_item_check.on_click @@ -101,6 +109,15 @@ <menu_item_check.on_enable function="Agent.enableFlying" /> </menu_item_check> + <menu_item_call + label="Stop flying" + name="Stop flying" + shortcut="HOME"> + <menu_item_call.on_click + function="Agent.toggleFlying" /> + <menu_item_call.on_enable + function="Agent.getFlying" /> + </menu_item_call> <menu_item_check label="Always Run" name="Always Run" @@ -180,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 @@ -1288,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" @@ -1309,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" @@ -2205,6 +2214,16 @@ <menu_item_check.on_click function="ToggleControl" parameter="DebugShowRenderInfo" /> + </menu_item_check> + <menu_item_check + label="Show Avatar Render Info" + name="Show Avatar Render Info"> + <menu_item_check.on_check + function="CheckControl" + parameter="DebugShowAvatarRenderInfo" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="DebugShowAvatarRenderInfo" /> </menu_item_check> <menu_item_check label="Show Texture Info" @@ -2928,6 +2947,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"> @@ -3029,6 +3076,13 @@ function="Advanced.WebContentTest" 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"> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ebd2799ebf8b3d1cbcc1c105acc74579115bbf6d..35f2e7b31e9e7570fd426569d78c14775e00d70c 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" @@ -4069,6 +4069,27 @@ Join me in [REGION] </form> </notification> + <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" @@ -6017,6 +6038,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,12 +6337,21 @@ 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. </notification> + <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" @@ -6637,7 +6674,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 +6739,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 +6808,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 +6857,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 +6866,6 @@ Friendship offer accepted. icon="notify.tga" name="FriendshipDeclinedByMe" log_to_im="true" - show_toast="false" type="notify"> <tag>friendship</tag> Friendship offer declined. @@ -6841,7 +6896,7 @@ This will add a bookmark in your inventory so you can quickly IM this Resident. 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> @@ -6851,7 +6906,7 @@ If you stay in this region you will be logged out. 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 +8789,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 @@ -9502,6 +9557,14 @@ Cannot attach object because you do not have permission to move it. Not enough script resources available to attach object! </notification> + <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" @@ -10109,7 +10172,7 @@ An internal error prevented us from properly updating your viewer. The L$ balan <tag>fail</tag> Cannot create large prims that intersect other players. Please re-try when other players have moved. </notification> - + <notification icon="alertmodal.tga" name="PreferenceChatClearLog" 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 a054e71e34710eaa61d99e731fcf50397606a715..4372cf69bf208029e88c52361ea6e21d6c48cce5 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_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 3edeb9aa3670b7e782b7afac5715e28633fbeb5c..c7edba21f85aa56e2ea2e084102ed0a56b7d3ef9 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 ed274d02337bd81253c674aaf23e7faa1dca6f08..3caf2b3d7efab2f286bc8d49b343816c7f19f92c 100755 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -66,7 +66,8 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M tab_position="top" top="0" halign="center" - right="-5"> + right="-5" + use_highlighting_on_hover="true"> <!-- ================================= NEARBY tab =========================== --> @@ -365,6 +366,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,7 +501,7 @@ 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" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 3c4d28803729b82942bcca6674ea73e2f59192e1..6c485c0595ea3131d5fb211186a68b6287fe3781 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -177,10 +177,86 @@ width="80"> Ultra </text> + <slider + control_name="RenderAvatarLODFactor" + invisiblity_control="ShowAdvancedGraphicsSettings" + follows="left|top" + height="16" + increment="0.125" + initial_value="160" + label="Avatar detail:" + label_width="90" + layout="topleft" + left="30" + name="AvatarMeshDetail2" + show_text="false" + top="72" + width="300"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="AvatarMeshDetailText2" /> + </slider> + <text + type="string" + invisiblity_control="ShowAdvancedGraphicsSettings" + length="1" + follows="left|top" + height="12" + layout="topleft" + name="AvatarMeshDetailText2" + top_delta="0" + left_delta="304" + width="128"> + Low + </text> + <slider + control_name="RenderFarClip" + invisiblity_control="ShowAdvancedGraphicsSettings" + decimal_digits="0" + follows="left|top" + height="16" + increment="8" + initial_value="160" + label="Draw distance:" + label_width="90" + layout="topleft" + left="30" + max_val="512" + min_val="64" + name="DrawDistance" + top="110" + width="330" /> + <text + type="string" + invisiblity_control="ShowAdvancedGraphicsSettings" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="330" + name="DrawDistanceMeterText2" + top_delta="0" + width="128"> + m + </text> + <check_box + control_name="RenderDeferred" + invisiblity_control="ShowAdvancedGraphicsSettings" + height="16" + initial_value="true" + label="Advanced Lighting Model" + layout="topleft" + left="30" + name="UseLightShaders2" + top="148" + width="256"> + <check_box.commit_callback + function="Pref.VertexShaderEnable" /> + </check_box> <panel - visiblity_control="ShowAdvancedGraphicsSettings" + visiblity_control="ShowAdvancedGraphicsSettings" border="false" - follows="top|left" + follows="top|left" height="300" label="CustomGraphics" layout="topleft" @@ -224,13 +300,13 @@ function="Pref.VertexShaderEnable" /> </check_box> <check_box - control_name="RenderLocalLights" - height="16" - initial_value="true" - label="Local Lights" - layout="topleft" - left_delta="0" - name="LocalLights" + control_name="RenderLocalLights" + height="16" + initial_value="true" + label="Local Lights" + layout="topleft" + left_delta="0" + name="LocalLights" top_pad="1" width="256" /> <check_box 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 d9067b41c75bc3fc7eb158d59bd87b42e6e67049..8794e3bf95ac9d54e4084203b16433e6b5a72208 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 198ccd6e2f7cdf352d91881c97fa5a0a4c2ed62d..8f90521bb21c07bebd59509c6783dacdecff9be3 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 d2f29ade44c74911b534f3ced8309a54140ee112..61c8c971c28766cb8968175ba418f039f904acef 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 0000000000000000000000000000000000000000..d7235396fe64e8c712f5ce14c38e3d8393148804 --- /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 0000000000000000000000000000000000000000..a55613b52a92681945ebec98ae09c048664e3106 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_social_photo.xml @@ -0,0 +1,152 @@ + <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> + <check_box + follows="left|top" + initial_value="true" + label="Include location in posting" + name="add_location_cb" + left="9" + height="16" + top_pad="8"/> + </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 0000000000000000000000000000000000000000..13e94f6998ce42168c2d3e3fb05c5f5382b45a5b --- /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 0000000000000000000000000000000000000000..54cfa3f52486bad7e8e0a05e84a9c4edd10a0f07 --- /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 dd2a0c6627aa9405c16037c4247eecc69a19114f..064ece6e4be5e9ae81c79a67d39d72498dbb1c35 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 0a3a46106a8dc4b20d40cb918cc6d70dfeb34813..3a34c0df5f1676779fe1b86dceef9201e8e1d8a0 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -148,6 +148,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 +387,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 --> @@ -410,10 +418,13 @@ Please try logging in again in a minute.</string> <string name="AddAndRemoveJoints">Add and remove joints with other objects</string> <string name="ChangePermissions">Change its permissions</string> <string name="TrackYourCamera">Track your camera</string> - <string name="ControlYourCamera">Control your camera</string> + <string name="ControlYourCamera">Control your camera</string> + <string name="TeleportYourAgent">Teleport you</string> + <string name="ManageEstateSilently">Manage your estates silently</string> + <string name="ChangeYourDefaultAnimations">Change your default animations</string> + <string name="NotConnected">Not Connected</string> <string name="AgentNameSubst">(You)</string> <!-- Substitution for agent name --> - <string name="TeleportYourAgent">Teleport you</string> <string name="JoinAnExperience">Join an experience</string> <!-- not used --> <string name="SilentlyManageEstateAccess">Suppress alerts when managing estate access lists</string> <string name="OverrideYourAnimations">Replace your default animations</string> @@ -445,6 +456,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> @@ -644,11 +657,11 @@ Returns the wind velocity at the object position + offset </string> <string name="LSLTipText_llSetStatus" translate="false"> llSetStatus(integer status, integer value) -Sets status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) to value +Sets status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_BLOCK_GRAB_OBJECT, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) to value </string> <string name="LSLTipText_llGetStatus" translate="false"> integer llGetStatus(integer status) -Returns value of status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_ROTATE_X, STATUS_ROTATE_Y, and/or STATUS_ROTATE_Z) +Returns the boolean value of status (STATUS_PHYSICS, STATUS_PHANTOM, STATUS_BLOCK_GRAB, STATUS_BLOCK_GRAB_OBJECT, STATUS_ROTATE_X, STATUS_ROTATE_Y, or STATUS_ROTATE_Z) </string> <string name="LSLTipText_llSetScale" translate="false"> llSetScale(vector scale) @@ -2182,7 +2195,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> @@ -2461,7 +2474,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> @@ -3424,6 +3441,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) @@ -3857,6 +3877,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> @@ -3884,6 +3905,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/conversation_view_participant.xml b/indra/newview/skins/default/xui/en/widgets/conversation_view_participant.xml old mode 100755 new mode 100644 diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 61ec046649d85ddced12ac0f6810beb9a2af34a4..4ea1aa6efbef011e50aa451780be76313855d0fb 100755 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -150,6 +150,7 @@ <combo_button name="Location History" label="" + image_hover_unselected="ComboButton_Hovered" pad_right="0"/> <combo_list bg_writeable_color="MenuDefaultBgColor" 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 0000000000000000000000000000000000000000..af5aec2c34d0c5a9389dffa8fa21d3e1760369c5 --- /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 0000000000000000000000000000000000000000..46c1b7ff75f2807041d70325accc847198427ad7 --- /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/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml index 0586119681a5cf16953c5bd056eec0a9e2b8298f..9559be214a56117ef6e2efe10afe12c3e45e6d32 100755 --- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml +++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml @@ -24,17 +24,26 @@ label_pad_left - padding to the left of tab button labels tab_bottom_image_unselected="Toolbar_Left_Off" tab_bottom_image_selected="Toolbar_Left_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over" + tab_top_image_hovered="TabTop_Left_Selected" + tab_button_image_hovered="Toolbar_Left_Selected" + tab_left_image_hovered="SegmentedBtn_Left_Selected_Over"/> <middle_tab tab_top_image_unselected="TabTop_Middle_Off" tab_top_image_selected="TabTop_Middle_Selected" tab_bottom_image_unselected="Toolbar_Middle_Off" tab_bottom_image_selected="Toolbar_Middle_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over" + tab_top_image_hovered="TabTop_Middle_Selected" + tab_button_image_hovered="Toolbar_Middle_Selected" + tab_left_image_hovered="SegmentedBtn_Left_Selected_Over"/> <last_tab tab_top_image_unselected="TabTop_Right_Off" tab_top_image_selected="TabTop_Right_Selected" tab_bottom_image_unselected="Toolbar_Right_Off" tab_bottom_image_selected="Toolbar_Right_Selected" tab_left_image_unselected="SegmentedBtn_Left_Disabled" - tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/> + tab_left_image_selected="SegmentedBtn_Left_Selected_Over" + tab_top_image_hovered="TabTop_Right_Selected" + tab_button_image_hovered="Toolbar_Right_Selected" + tab_left_image_hovered="SegmentedBtn_Left_Selected_Over"/> </tab_container> diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml index 7ca1e3721f48952bafa9d73296033b08219c2e77..e0a2375067f21460501b91ff6f363346916de98a 100755 --- a/indra/newview/skins/default/xui/es/floater_about.xml +++ b/indra/newview/skins/default/xui/es/floater_about.xml @@ -8,7 +8,9 @@ Compilado con [COMPILER], versión [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1], de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Estás en la posición [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] de [REGION], alojada en <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(coordenadas globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml index f1948220b46571ece65b781294122a56c30304c8..5cd8b3c01f76c0dc7cbd96581f4fc0b5de50668b 100755 --- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="EDITAR LOS PERMISOS DEL CONTENIDO"> +<floater name="floaterbulkperms" title="AJUSTAR LOS PERMISOS DEL CONTENIDO"> <floater.string name="nothing_to_modify_text"> Lo seleccionado tiene contenidos no editables. </floater.string> @@ -33,7 +33,7 @@ <button label="√ Todos" label_selected="Todo" name="check_all"/> <button label="Limpiar" label_selected="Ninguno" name="check_none"/> <text name="newperms"> - Permisos nuevos del contenido + Ajustar los permisos del contenido a </text> <text name="GroupLabel"> Grupo: @@ -49,6 +49,7 @@ <check_box label="Modificarlo" name="next_owner_modify"/> <check_box label="Copiarlo" name="next_owner_copy"/> <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="Aplicar" name="apply"/> <button label="Cancelar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_goto_line.xml b/indra/newview/skins/default/xui/es/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef3ed80fcb981f57bd90534bdb345d9946066dfa --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="IR A LA LÃNEA"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Ir a la lÃnea + </text> +</floater> 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 c351db5eaecebc72ec35c37f1dab14da7bc3b1bb..c2327c96c442f9d379de53a0cc6da013c8fb91e9 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_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml index 5f38fbd61512717b13f094d10d6f71c2d9453cab..e5f48e3fd5b525b3ae9bd8de32733575ae1d3afa 100755 --- a/indra/newview/skins/default/xui/es/floater_im_session.xml +++ b/indra/newview/skins/default/xui/es/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Traducir el chat" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traducir el chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml index 3602270e5a5d9a8fcdbe86fd05693a1b710e5115..e93ecc9e10d3483cacaf1db2888999333fc19399 100755 --- a/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/es/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostrar: </text> - <check_box label="Prueba" name="show_world"/> + <check_box label="Mundo virtual" name="show_world"/> <check_box label="Solamente los objetos movibles" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 15462c37266fe1cd17d50a6f054d82d1ab4a7a38..32baa5bb7dbb51e64c7ff326dfb406bcb203cf51 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/es/menu_attachment_other.xml index 00bdb748813ee6d973b9e63ba014b449da8e429c..7698348c0041fd245bc4cc1554f92ba3955be944 100755 --- a/indra/newview/skins/default/xui/es/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Congelar" name="Freeze..."/> <menu_item_call label="Expulsar" name="Eject..."/> <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Volcar XML" name="Dump XML"/> <menu_item_call label="Acercar el zoom" name="Zoom In"/> <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Perfil del objeto" name="Object Inspect"/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml index 0ba39378bb9e3317792c2b46b833b451377ef55e..5acd0c327a3842d5f782e43208a5fb4af0cadec7 100755 --- a/indra/newview/skins/default/xui/es/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Mis grupos" name="Groups..."/> <menu_item_call label="Mi perfil" name="Profile..."/> <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Volcar XML" name="Dump XML"/> <menu_item_call label="Soltar" name="Drop"/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_other.xml b/indra/newview/skins/default/xui/es/menu_avatar_other.xml index 7df2d7c4e08ea2e60ad228d224070a5876873f5e..244099214a2718eb0feea49f7d830b1337a72dac 100755 --- a/indra/newview/skins/default/xui/es/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Congelar" name="Freeze..."/> <menu_item_call label="Expulsar" name="Eject..."/> <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Volcar XML" name="Dump XML"/> <menu_item_call label="Acercar el zoom" name="Zoom In"/> <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml index 268d6f70ab434317a4de4d26e01ac7657ceec631..717b46ac744cb0a5295b5ca9afa93cff376045b9 100755 --- a/indra/newview/skins/default/xui/es/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Mis grupos" name="Groups..."/> <menu_item_call label="Mi perfil" name="Profile..."/> <menu_item_call label="Depurar las texturas" name="Debug..."/> + <menu_item_call label="Volcar XML" name="Dump XML"/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_conversation.xml b/indra/newview/skins/default/xui/es/menu_conversation.xml index e4e9a0bf63d0dc80cdd7d2260bfb07bf77b56b81..b63711589db6550ee51a22bfd675d7b0946d336d 100644 --- a/indra/newview/skins/default/xui/es/menu_conversation.xml +++ b/indra/newview/skins/default/xui/es/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Cerrar conversación" name="close_conversation"/> <menu_item_call label="Abrir conversación de voz" name="open_voice_conversation"/> <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Cerrar seleccionados" name="close_selected_conversations"/> <menu_item_call label="Ver el perfil" name="view_profile"/> <menu_item_call label="MI" name="im"/> <menu_item_call label="Ofrecer teleporte" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/es/menu_land.xml b/indra/newview/skins/default/xui/es/menu_land.xml index b0f15be1b637316dee2000c098dbb13739ff0da0..20976283566296d2d76419a76270d9895534a523 100755 --- a/indra/newview/skins/default/xui/es/menu_land.xml +++ b/indra/newview/skins/default/xui/es/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Comprar un pase" name="Land Buy Pass"/> <menu_item_call label="Construir" name="Create"/> <menu_item_call label="Modificar el terreno" name="Edit Terrain"/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml index 289ac3f0757089861087c2e3a867d93e05f73267..2286d0527a5c500b9afd5265279bced4f2e334ae 100755 --- a/indra/newview/skins/default/xui/es/menu_login.xml +++ b/indra/newview/skins/default/xui/es/menu_login.xml @@ -17,7 +17,13 @@ <menu_item_call label="Mostrar los 'TOS'" name="TOS"/> <menu_item_call label="Mostrar mensaje crÃtico" name="Critical"/> <menu_item_call label="Prueba de depuración de ventanas de contenido web" name="Web Content Floater Debug Test"/> - <menu label="Configurar el nivel de registro" name="Set Logging Level"/> + <menu label="Configurar el nivel de registro" name="Set Logging Level"> + <menu_item_check label="Depurar" name="Debug"/> + <menu_item_check label="Información" name="Info"/> + <menu_item_check label="¡Atención!" name="Warning"/> + <menu_item_check label="Error" name="Error"/> + <menu_item_check label="Ninguno" name="None"/> + </menu> <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/> <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/es/menu_mute_particle.xml b/indra/newview/skins/default/xui/es/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..daddf982de68d5690dc22d044c8f306202dd0f4a --- /dev/null +++ b/indra/newview/skins/default/xui/es/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml index 33ea8c88d8ad2bb6dd934ca3992255b9fb3b6f46..e75c7283af1a9ecac317627cdf2e9589482a3d08 100755 --- a/indra/newview/skins/default/xui/es/menu_object.xml +++ b/indra/newview/skins/default/xui/es/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="Editar" name="Edit..."/> <menu_item_call label="Construir" name="Build"/> - <menu_item_call label="Mostrar en linksets" name="show_in_linksets"/> - <menu_item_call label="Mostrar en personajes" name="show_in_characters"/> <menu_item_call label="Abrir" name="Open"/> <menu_item_call label="Sentarme aquÃ" name="Object Sit"/> <menu_item_call label="Levantarme" name="Object Stand Up"/> <menu_item_call label="Perfil del objeto" name="Object Inspect"/> <menu_item_call label="Acercar el zoom" name="Zoom In"/> + <menu_item_call label="Mostrar en linksets" name="show_in_linksets"/> + <menu_item_call label="Mostrar en personajes" name="show_in_characters"/> <context_menu label="Ponerme" name="Put On"> <menu_item_call label="Ponerme" name="Wear"/> <menu_item_call label="Añadir" name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Comprar" name="Buy..."/> <menu_item_call label="Borrar" name="Delete"/> + <menu_item_call label="Ignorar al propietario de la partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml index 69a03671aba0d0465df2fb65fd4ae1c394c0fe24..610d65465d92a3da4ef409c71d7522e0df163ae9 100755 --- a/indra/newview/skins/default/xui/es/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Ver el perfil" name="show_agent"/> <menu_item_call label="Enviar un MI..." name="send_im"/> <menu_item_call label="Añadir como amigo..." name="add_friend"/> + <menu_item_call label="Quitar de los amigos..." name="remove_friend"/> <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/> <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml index e78fdec55802b4087ec1dfd04ed4fa5af2d22d37..c3c8439ea2ae53f7ce93d9a18c57d1f7cb061e6d 100755 --- a/indra/newview/skins/default/xui/es/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Perfil del objeto..." name="show_object"/> + <menu_item_call label="Ignorar..." name="block_object"/> <menu_item_call label="Mostrar en el mapa" name="show_on_map"/> <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/> <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 1e0ceb2220522f4b525942315738d14d58200232..e4fe871683b480f32331ce8174c76068b4cc4018 100755 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> <menu_item_call label="Caminar / Correr / Volar..." name="Walk / run / fly"/> </menu> - <menu label="Estado" name="Status"/> + <menu label="Estado" name="Status"> + <menu_item_check label="Ausente" name="Away"/> + <menu_item_check label="No molestar" name="Do Not Disturb"/> + </menu> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Panel de control de la cuenta..." name="Manage My Account"> <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/> @@ -31,6 +34,7 @@ <menu_item_check label="Conversaciones..." name="Conversations"/> <menu_item_check label="Chat..." name="Nearby Chat"/> <menu_item_check label="Hablar" name="Speak"/> + <menu_item_check label="Registro de conversación..." name="Conversation Log..."/> <menu label="Transformación de voz" name="VoiceMorphing"> <menu_item_check label="Sin transformación de voz" name="NoVoiceMorphing"/> <menu_item_check label="Probar..." name="Preview"/> @@ -41,6 +45,7 @@ <menu_item_check label="Grupos" name="My Groups"/> <menu_item_check label="Gente cerca" name="Active Speakers"/> <menu_item_call label="Lista de ignorados" name="Block List"/> + <menu_item_check label="No molestar" name="Do Not Disturb"/> </menu> <menu label="Mundo" name="World"> <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/> @@ -109,6 +114,7 @@ <menu_item_call label="Incluir la parte siguiente" name="Include Next Part"/> <menu_item_call label="Incluir la parte previa" name="Include Previous Part"/> </menu> + <menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Visión en lo seleccionado" name="Focus on Selection"/> <menu_item_call label="Zoom en lo seleccionado" name="Zoom to Selection"/> <menu label="Objeto" name="Object"> @@ -272,6 +278,7 @@ <menu_item_check label="Camera Offset" name="Camera Offset"/> <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/> <menu_item_check label="Frame Test" name="Frame Test"/> + <menu_item_call label="Perfil del fotograma" name="Frame Profile"/> </menu> <menu label="Render Metadata" name="Render Metadata"> <menu_item_check label="Normales" name="Normals"/> @@ -292,15 +299,15 @@ </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> + <menu_item_call label="Información sobre el material seleccionado" name="Selected Material Info"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Luces y sombras" name="Advanced Lighting Model"/> + <menu_item_check label="Modelo de iluminación avanzado" name="Advanced Lighting Model"/> <menu_item_check label="Sombras del sol/la luna/proyectores" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO y sombras suavizadas" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Capas alfa automáticas (deferidas)" name="Automatic Alpha Masks (deferred)"/> <menu_item_check label="Capas alfa automáticas (no deferidas)" name="Automatic Alpha Masks (non-deferred)"/> <menu_item_check label="Animation Textures" name="Animation Textures"/> <menu_item_check label="Disable Textures" name="Disable Textures"/> - <menu_item_check label="Atlas de texturas (experimental)" name="Texture Atlas"/> <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/> <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/> <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/> @@ -319,7 +326,6 @@ <menu_item_call label="Prueba de navegadores de medios" name="Web Browser Test"/> <menu_item_call label="Navegador de contenido web" name="Web Content Browser"/> <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> - <menu_item_call label="Memory Stats" name="Memory Stats"/> <menu_item_check label="Consola de depuración de región" name="Region Debug Console"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 05455f54c39d8c1b73a6460658430e87ee7d0b51..d4451ad2510f5dc6659f384e9e5254eb0f3fa873 100755 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -206,6 +206,14 @@ No podrás removérseles de ese rol, sino que deberán renunciar a él por sà m ¿Añadir esta capacidad a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> + <notification name="EjectGroupMemberWarning"> + Estás a punto de expulsar a [AVATAR_NAME] del grupo. + <usetemplate ignoretext="Confirmar la expulsión de un miembro del grupo" name="okcancelignore" notext="Cancelar" yestext="Expulsar"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Estás a punto de expulsar a [COUNT] miembros del grupo. + <usetemplate ignoretext="Confirmar la expulsión de varios miembros del grupo" name="okcancelignore" notext="Cancelar" yestext="Expulsar"/> + </notification> <notification name="AttachmentDrop"> Vas a soltar tu anexado. ¿Estás seguro de que quieres continuar? @@ -1113,7 +1121,7 @@ en TODO EL TERRENO de este sim? Por favor, elige un pago mayor. </notification> <notification name="ConfirmItemDeleteHasLinks"> - Por lo menos uno de los elementos seleccionados contiene vÃnculos que le señalan. Si eliminas este elemento, los vÃnculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vÃnculos. + Por lo menos uno de los elementos contiene vÃnculos que lo señalan. Si eliminas este elemento, los vÃnculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vÃnculos. ¿Estás seguro de que quieres eliminar los elementos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> @@ -1131,9 +1139,9 @@ Por favor, elige un pago mayor. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - No eres el propietario de, al menos, uno de los Ãtems que has seleccionado. + Uno o más de los elementos seleccionados no son tuyos. -¿Estás seguro de que quieres borrar estos Ãtems? +¿Estás seguro de que quieres eliminar los elementos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1144,25 +1152,25 @@ Al menos un objeto no es copiable. <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> - Al menos un objeto está bloqueado. -No eres propietario de, al menos, un objeto. + Hay un objeto bloqueado como mÃnimo. +No eres propietario de al menos un objeto. -¿Estás seguro de que quieres borrar estos Ãtems? +¿Estás seguro de que quieres eliminar los elementos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Al menos un objeto no es copiable. -No eres propietario de, al menos, un objeto. + No se puede copiar un objeto como mÃnimo. +No eres propietario de al menos un objeto. -¿Estás seguro de que quieres borrar estos Ãtems? +¿Estás seguro de que quieres eliminar los elementos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Al menos un objeto está bloqueado. -Al menos un objeto no es copiable. -No eres propietario de, al menos, un objeto. + Hay un objeto bloqueado como mÃnimo. +No se puede copiar un objeto como mÃnimo. +No eres propietario de al menos un objeto. -¿Estás seguro de que quieres borrar estos Ãtems? +¿Estás seguro de que quieres eliminar los elementos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> @@ -1486,13 +1494,43 @@ Versión [VERSION] [[RELEASE_NOTES_FULL_URL]; información acerca de esta actual </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> Hemos descargado una actualización de software necesaria. -Versión [VERSION] +Versión [VERSION] [[INFO_URL] Información sobre esta actualización] -Debemos reiniciar [APP_NAME] para instalar la actualización. +Para instalar la actualización, hay que reiniciar [APP_NAME]. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> - Debemos reiniciar [APP_NAME] para instalar la actualización. + Para instalar la actualización, hay que reiniciar [APP_NAME]. +[[INFO_URL] Información sobre esta actualización] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + Hemos descargado una actualización aplicable a tu instalación de [APP_NAME]. +Versión [VERSION] +Este visor experimental se ha sustituido por un visor de [NEW_CHANNEL]. +Consulta [[INFO_URL] para informarte sobre esta actualización.] + <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + Hemos descargado una actualización aplicable a tu instalación de [APP_NAME]. +Versión [VERSION] +Este visor experimental se ha sustituido por un visor de [NEW_CHANNEL]. +Consulta [[INFO_URL] Información sobre esta actualización]. + <usetemplate name="okcancelbuttons" notext="Más tarde..." yestext="Instalar ahora y reiniciar [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + Hemos descargado una actualización de software necesaria. +Versión [VERSION] +Este visor experimental se ha sustituido por un visor de [NEW_CHANNEL]. +Consulta [[INFO_URL] Información sobre esta actualización]. + +Para instalar la actualización, hay que reiniciar [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Para instalar la actualización, hay que reiniciar [APP_NAME]. +Este visor experimental se ha sustituido por un visor de [NEW_CHANNEL]. +Consulta [[INFO_URL] Información sobre esta actualización]. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1543,6 +1581,10 @@ Debemos reiniciar [APP_NAME] para instalar la actualización. ¿Deseas abandonar el grupo? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + No es posible abandonar el grupo. No puedes abandonarlo porque eres su último propietario. Antes tienes que asignar el papel de propietario a otro miembro. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> ¿Quieres realmente expulsar a todos los residentes de la cuadrÃcula? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/> @@ -2404,9 +2446,7 @@ Por favor, selecciona un sólo objeto. elegir 'Teleportar'.) </notification> <notification name="TeleportToPerson"> - Para ponerte en contacto con Residentes como '[NAME]', pulsa el botón "Gente", selecciona un Residente en la ventana que se abre y después pulsa en 'MI' en - la parte inferior de la ventana. - (También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir 'MI'). + Para abrir una conversación privada con alguien, pulsa con el botón derecho en su avatar y selecciona 'MI' en el menú. </notification> <notification name="CantSelectLandFromMultipleRegions"> No puedes seleccionar un terreno que cruce las fronteras entre servidores. @@ -2780,6 +2820,15 @@ No autorices el acceso a tu cuenta si no conoces cuál es la razón exacta. <button name="Deny" text="Denegar"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + '<nolink>[OBJECTNAME]</nolink>', un objeto propiedad de '[NAME]', ha solicitado un permiso de script en tiempo de ejecución que el visor no reconoce ni puede conceder. + +Para obtener el permiso, descárgate aquà la última versión: [DOWNLOADURL]. + <form name="form"> + <button name="Deny" text="Aceptar"/> + <button name="Mute" text="Ignorar"/> + </form> + </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 7a7dfca0b8eb1bc6fab1245fbe76bc31a37bbaad..06150f7619d98b851a0930708034d576a860f641 100755 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -49,6 +49,9 @@ <menu_button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> <dnd_button name="minus_btn" tool_tip="Dejar el grupo seleccionado"/> </panel> + <text name="groupcount"> + Formas parte de [COUNT] grupos y puedes unirte a [REMAINING] más. + </text> </panel> <panel label="RECIENTE" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 28bc98f9885451c4896a379d0bf633dc54586334..7feff9005cadb0b7cdd409089f548d4586c8b649 100755 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat de texto" name="chat"> - <panel> + <panel name="general_chat_settings"> <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> @@ -8,66 +8,78 @@ Tamaño de la fuente: </text> <combo_box name="chat_font_size"> - <item label="Pequeña" name="Small" value="0"/> - <item label="Mediana" name="Medium" value="1"/> + <item label="Pequeño" name="Small" value="0"/> + <item label="Medio" name="Medium" value="1"/> <item label="Grande" name="Large" value="2"/> </combo_box> <check_box label="Bocadillos del chat" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Notificaciones - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> MI de amigos: </text> <combo_box name="FriendIMOptions"> - <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> - <item label="Ninguno" name="None" value="ninguno"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Reproducir sonido" name="play_sound_friend_im"/> <text name="non_friend_ims"> MI de no amigos: </text> <combo_box name="NonFriendIMOptions"> - <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> - <item label="Ninguno" name="None" value="ninguno"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Reproducir sonido" name="play_sound_non_friend_im"/> <text name="conference_ims"> - MI de conferencia: + MI de conferencias: </text> <combo_box name="ConferenceIMOptions"> - <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> - <item label="Ninguno" name="None" value="ninguno"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Reproducir sonido" name="play_sound_conference_im"/> <text name="group_chat"> Chat de grupo: </text> <combo_box name="GroupChatOptions"> - <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> <item label="Botón de la barra de herramientas de Flash" name="FlashToolbarButton" value="flash"/> - <item label="Ninguno" name="None" value="ninguno"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Reproducir sonido" name="play_sound_group_chat_im"/> <text name="nearby_chat"> - Chat: + Chat con gente cercana: </text> <combo_box name="NearbyChatOptions"> - <item label="Ventana Conversaciones abiertas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mensaje en ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> + <item label="Botón de la barra de herramientas de Flash" name="FlashToolBarButton" value="flash"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Reproducir sonido" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + MI de objetos: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Abrir ventana de conversaciones" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir el mensaje en una ventana emergente" name="PopUpMessage" value="toast"/> <item label="Botón de la barra de herramientas de Flash" name="FlashToolBarButton" value="flash"/> - <item label="Ninguno" name="None" value="ninguno"/> + <item label="Ninguna acción" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Reproducir sonido" name="play_sound_object_im"/> <text name="notifications_alert"> - Para suspender provisionalmente todas las notificaciones, usa Comunicarme > No molestar. + Para dejar de recibir avisos durante un tiempo, usa Comunicarme > No molestar. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Reproducir sonido: </text> @@ -76,9 +88,9 @@ <check_box label="Oferta de teleporte" name="teleport_offer"/> <check_box label="Oferta de inventario" name="inventory_offer"/> </panel> - <panel> - <button label="Limpiar el registro..." name="clear_log"/> - <button label="Eliminar transcripciones..." name="delete_transcripts"/> + <panel name="log_settings"> + <button label="Borrar registro..." name="clear_log"/> + <button label="Borrar grabaciones..." name="delete_transcripts"/> <button label="Examinar..." label_selected="Examinar" name="log_path_button"/> </panel> <button label="Traducción…" name="ok_btn"/> 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 281b871fed155c43c6a3ac3ce227e52ea81a1217..a9eab74e2b5983df5c94430368dd16c6ae23029f 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="Luces y sombras" 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 81a29dae5ad2f38e59998605925d73603e6846b7..508bfbcd3262ac6375e1132d3fa297c1287577f7 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> @@ -29,6 +29,7 @@ <combo_box.item label="Instalar automáticamente" name="Install_automatically"/> <combo_box.item label="Descargar e instalar actualizaciones manualmente" name="Install_manual"/> </combo_box> + <check_box label="Admitir candidatos a la versión comercial a la hora de realizar actualizaciones" name="update_willing_to_test"/> <text name="Proxy Settings:"> Configuración de proxy: </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 5cb1654c70302d8e70c45ff2ddbfdeb41c9cbaa9..dcd698471520f3058181562cb0a8da84f0d20c42 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_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml index 4c4077b96f0ad3b3724c915e83f0ef7735b08864..87314820a6179dcfc1bc23d1c63fed35f3f186b4 100755 --- a/indra/newview/skins/default/xui/es/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Seleccionar todo" name="Select All"/> <menu_item_call label="Deseleccionar" name="Deselect"/> <menu_item_call label="Buscar / Reemplazar..." name="Search / Replace..."/> + <menu_item_call label="Ir a la lÃnea..." name="Go to line..."/> </menu> <menu label="Ayuda" name="Help"> <menu_item_call label="Ayuda..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/es/panel_tools_texture.xml b/indra/newview/skins/default/xui/es/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..b820880e60a43f5f37bb263f73ae0769357a9332 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Textura" name="Texture"> + <panel.string name="string repeats per meter"> + Repeticiones por metro + </panel.string> + <panel.string name="string repeats per face"> + Repeticiones por cara + </panel.string> + <text name="color label"> + Color + </text> + <color_swatch label="" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/> + <text name="color trans"> + Porcentaje de transparencia + </text> + <text name="glow label"> + Resplandor + </text> + <check_box label="Brillo total" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Materiales" name="Materials"/> + <combo_box.item label="Media" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Textura (difuminar)" name="Texture (diffuse)"/> + <combo_box.item label="Rugosidad (normal)" name="Bumpiness (normal)"/> + <combo_box.item label="Brillo (efecto espejo)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Textura" name="texture control" tool_tip="Pulsa para elegir una imagen"/> + <text name="label alphamode"> + Modo alfa + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Ninguno" name="None"/> + <combo_box.item label="Mezclado alfa" name="Alpha blending"/> + <combo_box.item label="Máscara alfa" name="Alpha masking"/> + <combo_box.item label="Máscara de emisión lumÃnica" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + LÃmite de máscara + </text> + <texture_picker label="Textura" name="bumpytexture control" tool_tip="Pulsa para elegir una imagen"/> + <text name="label bumpiness"> + Rugosidad + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Ninguna" name="None"/> + <combo_box.item label="Claridad" name="Brightness"/> + <combo_box.item label="Oscuridad" name="Darkness"/> + <combo_box.item label="madera" name="woodgrain"/> + <combo_box.item label="corteza" name="bark"/> + <combo_box.item label="ladrillos" name="bricks"/> + <combo_box.item label="cuadrÃcula" name="checker"/> + <combo_box.item label="hormigón" name="concrete"/> + <combo_box.item label="azulejo" name="crustytile"/> + <combo_box.item label="piedralabrada" name="cutstone"/> + <combo_box.item label="discos" name="discs"/> + <combo_box.item label="gravilla" name="gravel"/> + <combo_box.item label="placadepetri" name="petridish"/> + <combo_box.item label="revestimiento" name="siding"/> + <combo_box.item label="baldosa" name="stonetile"/> + <combo_box.item label="estuco" name="stucco"/> + <combo_box.item label="succión" name="suction"/> + <combo_box.item label="tejido" name="weave"/> + </combo_box> + <texture_picker label="Textura" name="shinytexture control" tool_tip="Pulsa para elegir una imagen"/> + <text name="label shininess"> + Brillo + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Ninguno" name="None"/> + <combo_box.item label="Bajo" name="Low"/> + <combo_box.item label="Medio" name="Medium"/> + <combo_box.item label="Alto" name="High"/> + </combo_box> + <text name="label glossiness"> + Efecto pulido + </text> + <text name="label environment"> + Entorno + </text> + <text name="label shinycolor"> + Color + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Pulsa para abrir el selector de color"/> + <text name="media_info"> + Espacio para la URL del media elegido, si procede + </text> + <button label="Elegir..." name="add_media" tool_tip="Añadir un media"/> + <button label="Eliminar" name="delete_media" tool_tip="Borrar esta textura para media"/> + <button label="Centrar" label_selected="Centrar los media" name="button align" tool_tip="Centrar esta textura para media (primero debe cargarse)"/> + <text name="tex gen"> + Representación + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Por defecto" name="Default"/> + <combo_box.item label="En el plano" name="Planar"/> + </combo_box> + <spinner label="Escala horizontal" name="TexScaleU"/> + <spinner label="Escala vertical" name="TexScaleV"/> + <spinner label="Repeticiones por metro" name="rptctrl"/> + <spinner label="Grados de rotación" name="TexRot"/> + <spinner label="Desplazamiento horizontal" name="TexOffsetU"/> + <spinner label="Desplazamiento vertical" name="TexOffsetV"/> + <spinner label="Escala horizontal" name="bumpyScaleU"/> + <spinner label="Escala vertical" name="bumpyScaleV"/> + <spinner label="Grados de rotación" name="bumpyRot"/> + <spinner label="Desplazamiento horizontal" name="bumpyOffsetU"/> + <spinner label="Desplazamiento vertical" name="bumpyOffsetV"/> + <spinner label="Escala horizontal" name="shinyScaleU"/> + <spinner label="Escala vertical" name="shinyScaleV"/> + <spinner label="Grados de rotación" name="shinyRot"/> + <spinner label="Desplazamiento horizontal" name="shinyOffsetU"/> + <spinner label="Desplazamiento vertical" name="shinyOffsetV"/> + <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/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml index 660293b02c5792f64dc089a072c813fc6f814778..902ed4df520e0222d45b4121ffc12c0bf345ddc4 100755 --- a/indra/newview/skins/default/xui/es/role_actions.xml +++ b/indra/newview/skins/default/xui/es/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, asà como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte." name="Parcel Identity"> <action description="Cambiar 'Mostrar el sitio en Buscar' y configurar la categorÃa" longdescription="Cambia 'Mostrar el sitio en Buscar' y el configurar la categorÃa de una parcela en Acerca del terreno > pestaña Opciones." name="land find places" value="17"/> - <action description="Cambiar el nombre de la parcela, su descripción, y la configuración de 'Mostrar el sitio en Buscar'" longdescription="Cambia el nombre de la parcela, su descripción, y la configuración de 'Mostrar el sitio en Buscar'. Se hace en Acerca del terreno > pestaña Opciones." name="land change identity" value="18"/> + <action description="Cambia el nombre de la parcela, su descripción y la configuración de 'Contenido moderado'." longdescription="Cambia el nombre de la parcela, su descripción y la configuración de 'Contenido moderado'. Se hace en Acerca del terreno > pestaña Opciones." name="land change identity" value="18"/> <action description="Definir los puntos de llegada y teleporte" longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno > pestaña Opciones." name="land set landing point" value="19"/> </action_set> <action_set description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como 'Crear objetos', 'Editar el terreno' y las configuraciones de la música y los media." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 937433e210ff18645f441e184bd9b520a575e3b0..484511a08b0154adb1094ba5c21a86fffc828a75 100755 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -130,6 +130,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download. + </string> <string name="LoginFailedViewerNotPermitted"> Ya no puedes acceder a Second Life con el visor que estás utilizando. Visita la siguiente página para descargar un nuevo visor: http://secondlife.com/download. @@ -439,6 +442,9 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="SLappAgentRequestFriend"> Petición de amistad </string> + <string name="SLappAgentRemoveFriend"> + Eliminación de amigos + </string> <string name="BUTTON_CLOSE_DARWIN"> Cerrar (⌘W) </string> @@ -823,6 +829,9 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="anim_yes_head"> Sà </string> + <string name="use_texture"> + Usar textura + </string> <string name="texture_loading"> Cargando... </string> @@ -919,6 +928,21 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="TeleportYourAgent"> Teleportarte </string> + <string name="JoinAnExperience"> + Únete a una experiencia + </string> + <string name="SilentlyManageEstateAccess"> + Suprimir alertas al gestionar las listas de acceso a un estado + </string> + <string name="OverrideYourAnimations"> + Reemplazar tus animaciones predeterminadas + </string> + <string name="ScriptReturnObjects"> + Devolver objetos en tu nombre + </string> + <string name="UnknownScriptPermission"> + (desconocido) + </string> <string name="SIM_ACCESS_PG"> General </string> @@ -1232,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 @@ -1944,6 +1968,12 @@ Intenta iniciar sesión de nuevo en unos instantes. <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD: abajo der. </string> + <string name="ATTACH_NECK"> + Cuello + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro del avatar + </string> <string name="CursorPos"> LÃnea [LINE], Columna [COLUMN] </string> @@ -2931,6 +2961,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="Hip Width"> Cadera: ancho </string> + <string name="Hover"> + Pasa el cursor + </string> <string name="In"> Pegadas </string> @@ -4991,4 +5024,7 @@ Inténtalo incluyendo la ruta de acceso al editor entre comillas <string name="logging_calls_enabled_log_empty"> No hay conversaciones grabadas. Después de contactar con una persona, o de que alguien contacte contigo, aquà se mostrará una entrada de registro. </string> + <string name="loading_chat_logs"> + Cargando... + </string> </strings> diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml index d45bdccf3e8f3e75f75fc2f0eb73ec6abe69017a..384966354e5fd6dae2127f93b9f53e5da3fda815 100755 --- a/indra/newview/skins/default/xui/fr/floater_about.xml +++ b/indra/newview/skins/default/xui/fr/floater_about.xml @@ -9,6 +9,8 @@ </floater.string> <floater.string name="AboutPosition"> Vous êtes à [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] dans [REGION], se trouvant à <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL : <nolink>[SLURL]</nolink> +(coordonnées globales [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml index ab68ce166b0f4152279d1d258d1a36cb4ce2bc01..7ee444175861897e7eb5e81d02126195791dd5d7 100755 --- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="MODIFIER LES DROITS"> +<floater name="floaterbulkperms" title="MODIFIER LES DROITS RELATIFS AU CONTENU"> <floater.string name="nothing_to_modify_text"> Certains contenus sont non modifiables. </floater.string> @@ -33,7 +33,7 @@ <button label="√ Tout" label_selected="Tout" name="check_all"/> <button label="Effacer" label_selected="Aucun" name="check_none"/> <text name="newperms"> - Nouveaux droits + Modifier les droits relatifs au contenu et remplacer par </text> <text name="GroupLabel"> Groupe : @@ -49,6 +49,7 @@ <check_box label="Modifier" name="next_owner_modify"/> <check_box label="Copier" name="next_owner_copy"/> <check_box initial_value="true" label="Transférer" name="next_owner_transfer" tool_tip="Le prochain propriétaire peut donner ou revendre cet objet"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="Appliquer" name="apply"/> <button label="Annuler" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_goto_line.xml b/indra/newview/skins/default/xui/fr/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..fdc800b40be7006c34ed13f7c561354cc889aff6 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="ALLER À LA LIGNE"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Aller à la ligne + </text> +</floater> 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 098f8fc7131522940ce660937ff5c56df87c2c55..bb146556ba0f1ae1cc8ae159722fb441b9f3d54e 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_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml index 8ab98b8e4ead695ec0426cf2c15754c10de1a22c..6d98f0a846e803508100232bceb0907a97ee7fec 100755 --- a/indra/newview/skins/default/xui/fr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Traduire le chat" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduire le chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml index 0bcf55aba5965bde8c7f436cef0c7f9d684dd9fa..02d969dc0896734ede6fabdf4e77e81cfbfd1a7d 100755 --- a/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/fr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Afficher : </text> - <check_box label="Test" name="show_world"/> + <check_box label="Monde" name="show_world"/> <check_box label="Mobiles uniquement" name="show_world_movables_only"/> <check_box label="Maillage de navigation" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index bcc3423862aac23afa7778e750445298bab83146..421e14d51baf8ba1c1a8b54e75c0d9d023f5a14e 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml index f48513eb2b4005ae90d5d165c8f9a3f96d1267dd..0450be28e085edec52a5460088733658283024c4 100755 --- a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Figer" name="Freeze..."/> <menu_item_call label="Expulser" name="Eject..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Payer" name="Pay..."/> <menu_item_call label="Profil de l'objet" name="Object Inspect"/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml index 6af2064e440d0d397986dad0de776b590a285531..f2e7928c24ce92cb64870bcd2ce2128da5642213 100755 --- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Mes groupes" name="Groups..."/> <menu_item_call label="Mon profil" name="Profile..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Lâcher" name="Drop"/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml index 08d1a2036157606eaf25c9516188c6656ff51d2b..1f5c1724f8037fc832838f83c00022f1ff765844 100755 --- a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Figer" name="Freeze..."/> <menu_item_call label="Expulser" name="Eject..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Payer" name="Pay..."/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml index 6310a2177a8bbbd703cc56db791f59f631157cd4..4815ad06763bb8bae42c3e531d2fd5d93bfeb4b1 100755 --- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Mes groupes" name="Groups..."/> <menu_item_call label="Mon profil" name="Profile..."/> <menu_item_call label="Déboguer les textures" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_conversation.xml b/indra/newview/skins/default/xui/fr/menu_conversation.xml index 857ead603b55e9f77154e5676315eaf8f62b99d8..09109f45558eff87291b1e02e3af407bcddbc5e9 100644 --- a/indra/newview/skins/default/xui/fr/menu_conversation.xml +++ b/indra/newview/skins/default/xui/fr/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Fermer la conversation" name="close_conversation"/> <menu_item_call label="Ouvrir une conversation vocale" name="open_voice_conversation"/> <menu_item_call label="Se déconnecter de la conversation et du canal vocal" name="disconnect_from_voice"/> + <menu_item_call label="Fermer la sélection" name="close_selected_conversations"/> <menu_item_call label="Voir le profil" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="Proposer une téléportation." name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/fr/menu_land.xml b/indra/newview/skins/default/xui/fr/menu_land.xml index b84daee3ae90862a9994a5b34b6420fc6b680a4f..7beaf00c58a2664a43a4b4fe5f3a397c2210b739 100755 --- a/indra/newview/skins/default/xui/fr/menu_land.xml +++ b/indra/newview/skins/default/xui/fr/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Acheter un pass" name="Land Buy Pass"/> <menu_item_call label="Construire" name="Create"/> <menu_item_call label="Modifier le terrain" name="Edit Terrain"/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml index dc6b2793caefbe4990d4c2016e060ff4888f087e..7b1e106474f16bb259c74ec6dc9bd1a78b472f37 100755 --- a/indra/newview/skins/default/xui/fr/menu_login.xml +++ b/indra/newview/skins/default/xui/fr/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="Afficher les conditions d'utilisation" name="TOS"/> <menu_item_call label="Afficher le message critique" name="Critical"/> <menu_item_call label="Test de débogage de la fenêtre flottante du contenu Web" name="Web Content Floater Debug Test"/> - <menu label="Définir le niveau de connexion" name="Set Logging Level"/> + <menu label="Définir le niveau de connexion" name="Set Logging Level"> + <menu_item_check label="Débogage" name="Debug"/> + <menu_item_check label="Infos" name="Info"/> + <menu_item_check label="Avertissement" name="Warning"/> + <menu_item_check label="Erreur" name="Error"/> + <menu_item_check label="Aucun" name="None"/> + </menu> <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/> <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/fr/menu_mute_particle.xml b/indra/newview/skins/default/xui/fr/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..5f5e4c8b084a293873ff340b948c72d941fc2785 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml index 573b6da582749fa18f7ca5791a5c17ef353adf28..d7b69e495a2f972d8aa42e0b741a8efa75ed5452 100755 --- a/indra/newview/skins/default/xui/fr/menu_object.xml +++ b/indra/newview/skins/default/xui/fr/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="Modifier" name="Edit..."/> <menu_item_call label="Construire" name="Build"/> - <menu_item_call label="Voir parmi les groupes de liens" name="show_in_linksets"/> - <menu_item_call label="Voir parmi les personnages" name="show_in_characters"/> <menu_item_call label="Ouvrir" name="Open"/> <menu_item_call label="M'asseoir ici" name="Object Sit"/> <menu_item_call label="Me lever" name="Object Stand Up"/> <menu_item_call label="Profil de l'objet" name="Object Inspect"/> <menu_item_call label="Zoomer en avant" name="Zoom In"/> + <menu_item_call label="Voir parmi les groupes de liens" name="show_in_linksets"/> + <menu_item_call label="Voir parmi les personnages" name="show_in_characters"/> <context_menu label="Porter" name="Put On"> <menu_item_call label="Porter" name="Wear"/> <menu_item_call label="Ajouter" name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="Payer" name="Pay..."/> <menu_item_call label="Acheter" name="Buy..."/> <menu_item_call label="Supprimer" name="Delete"/> + <menu_item_call label="Ignorer le propriétaire des particules" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_agent.xml b/indra/newview/skins/default/xui/fr/menu_url_agent.xml index d701b3a41431248e1dc350b9ed13a9e71c6d4cc5..2c7443c6ca193821411a2cc31a2d87cd6e6a3f58 100755 --- a/indra/newview/skins/default/xui/fr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Voir le profil" name="show_agent"/> <menu_item_call label="Envoyer IM..." name="send_im"/> <menu_item_call label="Devenir amis..." name="add_friend"/> + <menu_item_call label="Supprimer cet ami..." name="remove_friend"/> <menu_item_call label="Copier le nom dans le presse-papiers" name="url_copy_label"/> <menu_item_call label="Copier la SLurl dans le presse-papiers" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml index 0a934d3e69c2842a20680ea471749b3e7fc5e6a4..5d745ef5f899a3f4d903340ae9f5c87624e060d7 100755 --- a/indra/newview/skins/default/xui/fr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/fr/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Profil de l'objet…" name="show_object"/> + <menu_item_call label="Ignorer…" name="block_object"/> <menu_item_call label="Voir sur la carte" name="show_on_map"/> <menu_item_call label="Me téléporter à l'emplacement de l'objet" name="teleport_to_object"/> <menu_item_call label="Copier le nom de l'objet dans le presse-papiers" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 548f144742e6026a0cacd38dc2cb80ea839cdcfe..5d0026ace00e867dee4ef97308d45362696e95cf 100755 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> <menu_item_call label="Marcher / Courir / Voler..." name="Walk / run / fly"/> </menu> - <menu label="Statut" name="Status"/> + <menu label="Statut" name="Status"> + <menu_item_check label="Absent" name="Away"/> + <menu_item_check label="Ne pas déranger" name="Do Not Disturb"/> + </menu> <menu_item_call label="Acheter des L$..." name="Buy and Sell L$"/> <menu_item_call label="Boîte d'envoi vendeur..." name="MerchantOutbox"/> <menu_item_call label="Page d'accueil du compte..." name="Manage My Account"> @@ -32,6 +35,7 @@ <menu_item_check label="Conversations..." name="Conversations"/> <menu_item_check label="Chat près de moi..." name="Nearby Chat"/> <menu_item_check label="Parler" name="Speak"/> + <menu_item_check label="Journal des conversations..." name="Conversation Log..."/> <menu label="Effet de voix" name="VoiceMorphing"> <menu_item_check label="Aucun effet de voix" name="NoVoiceMorphing"/> <menu_item_check label="Aperçu..." name="Preview"/> @@ -42,6 +46,7 @@ <menu_item_check label="Groupes" name="My Groups"/> <menu_item_check label="Personnes près de vous" name="Active Speakers"/> <menu_item_call label="Liste des ignorés" name="Block List"/> + <menu_item_check label="Ne pas déranger" name="Do Not Disturb"/> </menu> <menu label="Monde" name="World"> <menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/> @@ -110,6 +115,7 @@ <menu_item_call label="Inclure la partie suivante" name="Include Next Part"/> <menu_item_call label="Inclure la partie précédente" name="Include Previous Part"/> </menu> + <menu_item_call label="Groupes de liens..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Point central sur la sélection" name="Focus on Selection"/> <menu_item_call label="Zoomer sur la sélection" name="Zoom to Selection"/> <menu label="Objet" name="Object"> @@ -279,6 +285,7 @@ <menu_item_check label="Taux de défilement aléatoire" name="Randomize Framerate"/> <menu_item_check label="Cadre lent périodique" name="Periodic Slow Frame"/> <menu_item_check label="Test cadre" name="Frame Test"/> + <menu_item_call label="Profil du cadre" name="Frame Profile"/> </menu> <menu label="Métadonnées de rendu" name="Render Metadata"> <menu_item_check label="Cadres" name="Bounding Boxes"/> @@ -313,9 +320,10 @@ <menu_item_check label="Axes" name="Axes"/> <menu_item_check label="Tangente" name="Tangent Basis"/> <menu_item_call label="Base des infos de la texture sélectionnée" name="Selected Texture Info Basis"/> + <menu_item_call label="Infos sur les matériaux sélectionnés" name="Selected Material Info"/> <menu_item_check label="Filaire" name="Wireframe"/> <menu_item_check label="Occlusion objet-objet" name="Object-Object Occlusion"/> - <menu_item_check label="Éclairage et ombres" name="Advanced Lighting Model"/> + <menu_item_check label="Modèle d'éclairage avancé" name="Advanced Lighting Model"/> <menu_item_check label="Ombres du soleil/de la lune/des projecteurs" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO et lissage des ombres" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Débogage GL" name="Debug GL"/> @@ -325,7 +333,6 @@ <menu_item_check label="Textures d'animation" name="Animation Textures"/> <menu_item_check label="Désactiver les textures" name="Disable Textures"/> <menu_item_check label="Textures pleine résolution" name="Rull Res Textures"/> - <menu_item_check label="Atlas des textures (expérimental)" name="Texture Atlas"/> <menu_item_check label="Rendu des lumières jointes" name="Render Attached Lights"/> <menu_item_check label="Rendu des particules jointes" name="Render Attached Particles"/> <menu_item_check label="Objets en surbrillance avec le pointeur" name="Hover Glow Objects"/> @@ -361,7 +368,6 @@ <menu_item_call label="Dump Focus Holder" name="Dump Focus Holder"/> <menu_item_call label="Imprimer les infos sur l'objet sélectionné" name="Print Selected Object Info"/> <menu_item_call label="Imprimer les infos sur l'avatar" name="Print Agent Info"/> - <menu_item_call label="Statistiques de mémoire" name="Memory Stats"/> <menu_item_check label="Console de débogage de région" name="Region Debug Console"/> <menu_item_check label="Débogage SelectMgr" name="Debug SelectMgr"/> <menu_item_check label="Débogage clics" name="Debug Clicks"/> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index e73cc6e6e040501d12097b956676dd771caf3760..c295a6f5a7edbeda5f0ed9a00940049474a969a7 100755 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -209,6 +209,14 @@ Ajouter ce pouvoir à « [ROLE_NAME] » ? Ajouter ce pouvoir à « [ROLE_NAME] » ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> + <notification name="EjectGroupMemberWarning"> + Vous allez expulser [AVATAR_NAME] du groupe. + <usetemplate ignoretext="Confirmer l'expulsion d'un membre du groupe" name="okcancelignore" notext="Annuler" yestext="Expulser"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Vous allez expulser [COUNT] membres du groupe. + <usetemplate ignoretext="Confirmer l'expulsion de plusieurs membres du groupe" name="okcancelignore" notext="Annuler" yestext="Expulser"/> + </notification> <notification name="AttachmentDrop"> Vous êtes sur le point d'abandonner l'élément joint. Voulez-vous vraiment continuer ? @@ -1106,7 +1114,7 @@ Voir https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries Veuillez saisir un montant plus élevé. </notification> <notification name="ConfirmItemDeleteHasLinks"> - Des articles liés pointent vers au moins un article sélectionné. Les liens arrêteront définitivement de fonctionner si vous supprimez cet article. Il est vivement conseillé de supprimer d'abord ces liens. + Des liens pointent vers au moins un article sélectionné. Les liens arrêteront définitivement de fonctionner si vous supprimez cet article. Il est vivement conseillé de supprimer d'abord ces liens. Voulez-vous vraiment supprimer ces articles ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> @@ -1126,7 +1134,7 @@ Voulez-vous vraiment supprimer ces articles ? <notification name="ConfirmObjectDeleteNoOwn"> Au moins un des objets que vous avez sélectionnés ne vous appartient pas. -Êtes-vous certain de vouloir supprimer ces objets ? +Voulez-vous vraiment supprimer ces articles ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1140,23 +1148,23 @@ Au moins un des objets n'est pas copiable. Au moins un des objets est verrouillé. Au moins un des objets ne vous appartient pas. -Êtes-vous certain de vouloir supprimer ces objets ? +Voulez-vous vraiment supprimer ces articles ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Au moins un des objets n'est pas copiable. + Au moins un des objets n'est pas reproductible. Au moins un des objets ne vous appartient pas. -Êtes-vous certain de vouloir supprimer ces objets ? +Voulez-vous vraiment supprimer ces articles ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> Au moins un des objets est verrouillé. -Au moins un des objets n'est pas copiable. +Au moins un des objets n'est pas reproductible. Au moins un des objets ne vous appartient pas. -Êtes-vous certain de vouloir supprimer ces objets ? - <usetemplate name="okcancelbuttons" notext="annuler" yestext="OK"/> +Voulez-vous vraiment supprimer ces articles ? + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> Au moins un des objets est verrouillé. @@ -1477,13 +1485,43 @@ Version [VERSION] [[RELEASE_NOTES_FULL_URL] Informations relatives à cette mise </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> Nous avons téléchargé une mise à jour logicielle requise. -Version [VERSION] +Version [VERSION] [Informations au sujet de cette mise à jour [INFO_URL]] [APP_NAME] doit être redémarré pour que la mise à jour soit installée. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> [APP_NAME] doit être redémarré pour que la mise à jour soit installée. +[Informations au sujet de cette mise à jour [INFO_URL]] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + Nous avons téléchargé une mise à jour de votre installation [APP_NAME]. +Version [VERSION] +Le client expérimental a été remplacé par un nouveau client [NEW_CHANNEL] ; +consultez [[INFO_URL] pour en savoir plus sur cette mise à jour] + <usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + Nous avons téléchargé une mise à jour de votre installation [APP_NAME]. +Version [VERSION] +Le client expérimental a été remplacé par un nouveau client [NEW_CHANNEL] ; +consultez [Informations au sujet de cette mise à jour [INFO_URL]] + <usetemplate name="okcancelbuttons" notext="Ultérieurement..." yestext="Installer maintenant et redémarrer [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + Nous avons téléchargé une mise à jour logicielle requise. +Version [VERSION] +Le client expérimental a été remplacé par un nouveau client [NEW_CHANNEL] ; +consultez [Informations au sujet de cette mise à jour [INFO_URL]] + +[APP_NAME] doit être redémarré pour que la mise à jour soit installée. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + [APP_NAME] doit être redémarré pour que la mise à jour soit installée. +Le client expérimental a été remplacé par un nouveau client [NEW_CHANNEL] ; +consultez [Informations au sujet de cette mise à jour [INFO_URL]] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1534,6 +1572,10 @@ Version [VERSION] Quitter le groupe ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Impossible de quitter le groupe. Vous ne pouvez pas quitter le groupe car vous en êtes le dernier propriétaire. Vous devez d'abord affecter le rôle de propriétaire à un autre membre. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> Souhaitez-vous vraiment éjecter tous les résidents de la grille ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous les résidents"/> @@ -2396,9 +2438,7 @@ Veuillez sélectionner un seul objet. choisir Téléportation). </notification> <notification name="TeleportToPerson"> - Pour contacter un résident tel que [NAME], cliquez sur le bouton Personnes, sélectionnez le résident dans la fenêtre qui s'ouvre, puis cliquez sur IM en - bas de la fenêtre. - (Vous pouvez aussi double-cliquer sur le nom du résident dans la liste ou cliquer-droit dessus et choisir IM.) + Pour ouvrir une conversation privée avec une autre personne, cliquez-droit sur son avatar et choisissez IM dans le menu. </notification> <notification name="CantSelectLandFromMultipleRegions"> Vous ne pouvez pas sélectionner de terrain en dehors des limites du serveur. @@ -2772,6 +2812,15 @@ N'autorisez pas cet accès si vous ne comprenez pas entièrement pourquoi l <button name="Deny" text="Refuser"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + Le client ne reconnaît pas le droit de script à l'exécution demandé par <nolink>[OBJECTNAME]</nolink>, objet appartenant à [NAME], et ne peut donc pas l'accorder. + +Pour accorder ce droit, mettez votre client à jour pour passer à la version la plus récente, à partir de [DOWNLOADURL]. + <form name="form"> + <button name="Deny" text="OK"/> + <button name="Mute" text="Ignorer"/> + </form> + </notification> <notification name="ScriptDialog"> <nolink>[TITLE]</nolink> de [NAME] [MESSAGE] diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 227ce26df729b368d0260b01ffa0b3518399b14c..e306a0018366c975a5d9a188c73107165ab6610e 100755 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -49,6 +49,9 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <menu_button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> <dnd_button name="minus_btn" tool_tip="Quitter le groupe sélectionné"/> </panel> + <text name="groupcount"> + Vous appartenez à [COUNT] groupes, et pouvez en rejoindre [REMAINING] autres. + </text> </panel> <panel label="RÉCENT" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 972190dc159c9528ba7715d8af834eacaa1c980c..52c6ed24b9d999c33ada7b1693e6d9d2e967bbda 100755 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat écrit" name="chat"> - <panel> + <panel name="general_chat_settings"> <check_box initial_value="true" label="Exécuter l'animation clavier quand vous écrivez" name="play_typing_animation"/> <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> @@ -14,60 +14,72 @@ </combo_box> <check_box label="Bulles de chat" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Notifications - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> IM amis : </text> <combo_box name="FriendIMOptions"> <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> - <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> - <item label="Aucun(e)" name="None" value="aucun(e)"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Écouter le son" name="play_sound_friend_im"/> <text name="non_friend_ims"> IM non amis : </text> <combo_box name="NonFriendIMOptions"> <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> - <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> - <item label="Aucun(e)" name="None" value="aucun(e)"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Écouter le son" name="play_sound_non_friend_im"/> <text name="conference_ims"> IM conférence : </text> <combo_box name="ConferenceIMOptions"> <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> - <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> - <item label="Aucun(e)" name="None" value="aucun(e)"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Écouter le son" name="play_sound_conference_im"/> <text name="group_chat"> Chat de groupe : </text> <combo_box name="GroupChatOptions"> <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> - <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="clignote"/> - <item label="Aucun(e)" name="None" value="aucun(e)"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolbarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Écouter le son" name="play_sound_group_chat_im"/> <text name="nearby_chat"> Chat près de moi : </text> <combo_box name="NearbyChatOptions"> <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> - <item label="Bouton de la barre d'outils Flash" name="FlashToolBarButton" value="clignote"/> - <item label="Aucun(e)" name="None" value="aucun(e)"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolBarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Écouter le son" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + IM objet : + </text> + <combo_box name="ObjectIMOptions"> + <item label="Ouvrir la fenêtre Conversation" name="OpenConversationsWindow" value="openconversations"/> + <item label="Afficher le message dans une fenêtre popup" name="PopUpMessage" value="toast"/> + <item label="Bouton de la barre d'outils Flash" name="FlashToolBarButton" value="flash"/> + <item label="Aucune action" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Écouter le son" name="play_sound_object_im"/> <text name="notifications_alert"> Pour suspendre temporairement toutes les notifications, utilisez Communication > Ne pas déranger. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Écouter le son : </text> @@ -76,7 +88,7 @@ <check_box label="Offre de téléportation" name="teleport_offer"/> <check_box label="Offre d'inventaire" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="Effacer le journal..." name="clear_log"/> <button label="Supprimer les transcriptions..." name="delete_transcripts"/> <button label="Parcourir..." label_selected="Parcourir" name="log_path_button"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index a738b2d43fd57508a48c989724cfbb96c783b94c..4946b098142f069306f943d244f0c8cb6261bab2 100755 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -30,7 +30,7 @@ <check_box initial_value="true" label="Lumières locales" name="LocalLights"/> <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="La désactivation de cette option peut éviter le plantage de certains pilotes de cartes graphiques"/> <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Éclairage et ombres" name="UseLightShaders"/> + <check_box initial_value="true" label="Modèle d'éclairage avancé" name="UseLightShaders"/> <check_box initial_value="true" label="Occlusion ambiante" name="UseSSAO"/> <check_box initial_value="true" label="Profondeur de champ" name="UseDoF"/> <text name="shadows_label"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml index 83303950dcdea36d1cfdd364df93b90493c1aac6..50f4a49bd0399f20d4dd8b14961a82394e9a7b21 100755 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -29,6 +29,7 @@ <combo_box.item label="Installation automatique" name="Install_automatically"/> <combo_box.item label="Téléchargement et installation manuels" name="Install_manual"/> </combo_box> + <check_box label="Accepte de passer aux versions avant sortie officielle" name="update_willing_to_test"/> <text name="Proxy Settings:"> Paramètres de proxy : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml index 29fbe3c7e7d7d1c2f184d5b028b676113a87c183..38e5cbe1f1520382314e031fec4df0ae418272a6 100755 --- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Tout sélectionner" name="Select All"/> <menu_item_call label="Désélectionner" name="Deselect"/> <menu_item_call label="Rechercher / Remplacer..." name="Search / Replace..."/> + <menu_item_call label="Aller à la ligne..." name="Go to line..."/> </menu> <menu label="Aide" name="Help"> <menu_item_call label="Aide..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/fr/panel_tools_texture.xml b/indra/newview/skins/default/xui/fr/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..c69cb61a9261cb8076ab9c06a77be5f7ce909636 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Texture" name="Texture"> + <panel.string name="string repeats per meter"> + Répétitions au mètre + </panel.string> + <panel.string name="string repeats per face"> + Répétitions par face + </panel.string> + <text name="color label"> + Couleur + </text> + <color_swatch label="" name="colorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <text name="color trans"> + % de transparence + </text> + <text name="glow label"> + Rayonnement + </text> + <check_box label="Lumineux" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Matériaux" name="Materials"/> + <combo_box.item label="Médias" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Texture (diffuse)" name="Texture (diffuse)"/> + <combo_box.item label="Relief (normal)" name="Bumpiness (normal)"/> + <combo_box.item label="Brillance (spéculaire)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Texture" name="texture control" tool_tip="Cliquer pour sélectionner une image."/> + <text name="label alphamode"> + Mode alpha + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Aucun" name="None"/> + <combo_box.item label="Fusion alpha" name="Alpha blending"/> + <combo_box.item label="Masquage alpha" name="Alpha masking"/> + <combo_box.item label="Masque émissif" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + Coupe du masque + </text> + <texture_picker label="Texture" name="bumpytexture control" tool_tip="Cliquer pour sélectionner une image."/> + <text name="label bumpiness"> + Relief + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Aucun" name="None"/> + <combo_box.item label="Luminosité" name="Brightness"/> + <combo_box.item label="Obscurité" name="Darkness"/> + <combo_box.item label="aggloméré" name="woodgrain"/> + <combo_box.item label="écorce" name="bark"/> + <combo_box.item label="briques" name="bricks"/> + <combo_box.item label="damier" name="checker"/> + <combo_box.item label="béton" name="concrete"/> + <combo_box.item label="carrelage" name="crustytile"/> + <combo_box.item label="pierre de taille" name="cutstone"/> + <combo_box.item label="disques" name="discs"/> + <combo_box.item label="gravier" name="gravel"/> + <combo_box.item label="boîte de Petri" name="petridish"/> + <combo_box.item label="lattes" name="siding"/> + <combo_box.item label="carreaux" name="stonetile"/> + <combo_box.item label="stuc" name="stucco"/> + <combo_box.item label="ventouses" name="suction"/> + <combo_box.item label="tissage" name="weave"/> + </combo_box> + <texture_picker label="Texture" name="shinytexture control" tool_tip="Cliquer pour sélectionner une image."/> + <text name="label shininess"> + Brillance + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Aucune" name="None"/> + <combo_box.item label="Faible" name="Low"/> + <combo_box.item label="Moyenne" name="Medium"/> + <combo_box.item label="Élevée" name="High"/> + </combo_box> + <text name="label glossiness"> + Lustrage + </text> + <text name="label environment"> + Environnement + </text> + <text name="label shinycolor"> + Couleur + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/> + <text name="media_info"> + L'URL du média choisi, le cas échéant, se place ici. + </text> + <button label="Choisir..." name="add_media" tool_tip="Ajouter un média"/> + <button label="Supprimer" name="delete_media" tool_tip="Supprimer cette texture de média"/> + <button label="Aligner" label_selected="Aligner le média" name="button align" tool_tip="Ajuster la texture du média (le chargement doit d’abord se terminer)"/> + <text name="tex gen"> + Application + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Valeur par défaut" name="Default"/> + <combo_box.item label="Plan" name="Planar"/> + </combo_box> + <spinner label="Échelle horizontale" name="TexScaleU"/> + <spinner label="Échelle verticale" name="TexScaleV"/> + <spinner label="Répétitions au mètre" name="rptctrl"/> + <spinner label="Degrés de rotation" name="TexRot"/> + <spinner label="Décalage horizontal" name="TexOffsetU"/> + <spinner label="Décalage vertical" name="TexOffsetV"/> + <spinner label="Échelle horizontale" name="bumpyScaleU"/> + <spinner label="Échelle verticale" name="bumpyScaleV"/> + <spinner label="Degrés de rotation" name="bumpyRot"/> + <spinner label="Décalage horizontal" name="bumpyOffsetU"/> + <spinner label="Décalage vertical" name="bumpyOffsetV"/> + <spinner label="Échelle horizontale" name="shinyScaleU"/> + <spinner label="Échelle verticale" name="shinyScaleV"/> + <spinner label="Degrés de rotation" name="shinyRot"/> + <spinner label="Décalage horizontal" name="shinyOffsetU"/> + <spinner label="Décalage vertical" name="shinyOffsetV"/> + <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."/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml index 7187de87601339aac26dc91ba9772d61c44e10f0..2a68ca0ddb656b53ae0f9109fbd39059d6569583 100755 --- a/indra/newview/skins/default/xui/fr/role_actions.xml +++ b/indra/newview/skins/default/xui/fr/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Ces pouvoirs permettent de modifier le nom de la parcelle, son référencement dans la recherche et le lieu de téléportation." name="Parcel Identity"> <action description="Activer Afficher le lieu dans la recherche et définir la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d'une parcelle dans l'onglet À propos du terrain > Options." name="land find places" value="17"/> - <action description="Modifier le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d'affichage du lieu dans la recherche. Pour ce faire, utilisez l'onglet À propos du terrain > Options." name="land change identity" value="18"/> + <action description="Changer le nom de la parcelle, la description et les paramètres de contenu modéré" longdescription="Changez le nom de la parcelle, la description et les paramètres de contenu modéré. Pour ce faire, utilisez l'onglet À propos du terrain > Options." name="land change identity" value="18"/> <action description="Définir le lieu d'arrivée et le routage des téléportations" longdescription="Définissez le lieu d'arrivée des téléportations et le routage à partir du menu À propos du terrain > Options." name="land set landing point" value="19"/> </action_set> <action_set description="Ces pouvoirs permettent de définir les options de la parcelle concernant la musique, les médias, la création d'objets et le relief." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index 69ed20f3764542ca6116e13db152a989b84418c6..78d846ff4f74e62c2d2ab343e2057ac88fa7c1bb 100755 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> Le client que vous utilisez ne permet plus d'accéder à Second Life. Téléchargez un nouveau client à la page suivante : http://secondlife.com/download @@ -448,6 +451,9 @@ Veuillez réessayer de vous connecter dans une minute. <string name="SLappAgentRequestFriend"> Demande d'amitié </string> + <string name="SLappAgentRemoveFriend"> + Suppression d'un ami + </string> <string name="BUTTON_CLOSE_DARWIN"> Fermer (⌘W) </string> @@ -838,6 +844,9 @@ Veuillez réessayer de vous connecter dans une minute. <string name="multiple_textures"> Multiples </string> + <string name="use_texture"> + Utiliser la texture + </string> <string name="texture_loading"> Chargement... </string> @@ -937,6 +946,21 @@ Veuillez réessayer de vous connecter dans une minute. <string name="TeleportYourAgent"> Vous téléporter </string> + <string name="JoinAnExperience"> + Rejoindre une expérience + </string> + <string name="SilentlyManageEstateAccess"> + Supprimer les alertes lors de la gestion des listes d'accès aux domaines + </string> + <string name="OverrideYourAnimations"> + Remplacer vos animations par défaut + </string> + <string name="ScriptReturnObjects"> + Renvoyer les objets de votre part + </string> + <string name="UnknownScriptPermission"> + (inconnu) + </string> <string name="SIM_ACCESS_PG"> Général </string> @@ -1250,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 @@ -1968,6 +1992,12 @@ Veuillez réessayer de vous connecter dans une minute. <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD en bas à droite </string> + <string name="ATTACH_NECK"> + Cou + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centre de l'avatar + </string> <string name="CursorPos"> Ligne [LINE], colonne [COLUMN] </string> @@ -2997,6 +3027,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="Hip Width"> Largeur hanche </string> + <string name="Hover"> + Survol + </string> <string name="In"> Rentré </string> @@ -5081,4 +5114,7 @@ Essayez avec le chemin d'accès à l'éditeur entre guillemets doubles <string name="logging_calls_enabled_log_empty"> Il n'y a aucune conversation enregistrée. Quand quelqu'un vous contacte ou quand vous contactez quelqu'un, une entrée de journal s'affiche ici. </string> + <string name="loading_chat_logs"> + Chargement... + </string> </strings> diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml index b0fb585fa252f9a118db2282639e6fa26b5a7afe..6f09eca90c4eb09703fbc9a34967798a815707c5 100755 --- a/indra/newview/skins/default/xui/it/floater_about.xml +++ b/indra/newview/skins/default/xui/it/floater_about.xml @@ -8,7 +8,9 @@ Generato con [COMPILER] versione [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Tu sei [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) + Tu sei a [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] in [REGION] che si trova a <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(coordinate globali [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml index 89f4a0cb71f6d9a146e18a9ccf47368be4135eee..399eb15802973675845bc69cb70ac04c52bdf66f 100755 --- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="MODIFICA PERMESSI DEL CONTENUTO"> +<floater name="floaterbulkperms" title="CAMBIA I PERMESSI DEL CONTENUTO"> <floater.string name="nothing_to_modify_text"> La selezione non contiene nessun contenuto modificabile. </floater.string> @@ -33,7 +33,7 @@ <button label="√ Tutti" label_selected="Tutti" name="check_all"/> <button label="Cancella" label_selected="Nessuno" name="check_none"/> <text name="newperms"> - Nuovi permessi del contenuto + Cambia i permessi del contenuto a </text> <text name="GroupLabel"> Gruppo: @@ -49,6 +49,7 @@ <check_box label="Modificare" name="next_owner_modify"/> <check_box label="Copiare" name="next_owner_copy"/> <check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="Applica" name="apply"/> <button label="Annulla" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_goto_line.xml b/indra/newview/skins/default/xui/it/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..29a4aabb990cb9335fd04bfda2eac07102128148 --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="PASSA ALLA RIGA"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Passa alla riga + </text> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml index d38ec7a5fe5098f311acad2d8d44f652b002470b..71f90accde14113d2bb03c5fa1212377f2fe2248 100755 --- a/indra/newview/skins/default/xui/it/floater_im_session.xml +++ b/indra/newview/skins/default/xui/it/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Traduci chat" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduci chat" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml index 7777444161266ed813342aaa5238bb880da40707..77be220a2acafce137b19b31e0852f2665b9f394 100755 --- a/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/it/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Mostra: </text> - <check_box label="Test" name="show_world"/> + <check_box label="Mondo" name="show_world"/> <check_box label="Solo elementi spostabili" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index dd59035dd4f59a288227a374bfccd93efeb34322..468f284ccb00bc7d124e7434c8bbf7c715d8e454 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/it/menu_attachment_other.xml index d4d6fd68d0ba254c108e292d2bb586bab1897f1d..d4ce25e6a57e9e97192f42c91868a7b89b0cc2e1 100755 --- a/indra/newview/skins/default/xui/it/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/it/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Congela" name="Freeze..."/> <menu_item_call label="Espelli" name="Eject..."/> <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Zoom avanti" name="Zoom In"/> <menu_item_call label="Paga" name="Pay..."/> <menu_item_call label="Profilo dell'oggetto" name="Object Inspect"/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml index 0b841d591f20502da8e2aa0f83cb5442450976a7..b28137262fa27547e39e8d9c054fe7d20351f377 100755 --- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="I miei gruppi" name="Groups..."/> <menu_item_call label="Il mio profilo" name="Profile..."/> <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Lascia" name="Drop"/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_other.xml b/indra/newview/skins/default/xui/it/menu_avatar_other.xml index c2edc32a49a3ace2bba80639b44a721eea81b142..a2b864b3e168b6bf493b0bfc4852bbb07ddf6a03 100755 --- a/indra/newview/skins/default/xui/it/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Congela" name="Freeze..."/> <menu_item_call label="Espelli" name="Eject..."/> <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> <menu_item_call label="Zoom avanti" name="Zoom In"/> <menu_item_call label="Paga" name="Pay..."/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml index a4dafd7b5f442b1ff9f69ae073a76dacc4fa8636..36665710652ea73da387ce4eac2331e85acf23f5 100755 --- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="I miei gruppi" name="Groups..."/> <menu_item_call label="Il mio profilo" name="Profile..."/> <menu_item_call label="Debug delle texture" name="Debug..."/> + <menu_item_call label="Dump XML" name="Dump XML"/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_conversation.xml b/indra/newview/skins/default/xui/it/menu_conversation.xml index 46ced93f1df1fd8d74c62c25919db92e631bd07f..24486f2af20b45f152c26249858ab0af21c4f866 100644 --- a/indra/newview/skins/default/xui/it/menu_conversation.xml +++ b/indra/newview/skins/default/xui/it/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Chiudi la conversazione" name="close_conversation"/> <menu_item_call label="Apri conversazione a voce" name="open_voice_conversation"/> <menu_item_call label="Interrompi collegamento a voce" name="disconnect_from_voice"/> + <menu_item_call label="Chiudi selezionato" name="close_selected_conversations"/> <menu_item_call label="Vedi profilo" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="Offri teleport" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/it/menu_land.xml b/indra/newview/skins/default/xui/it/menu_land.xml index f510078e147c1deff080c483c8adc18d6acf9fe4..816849a7b5ac1f1b7320b44036a2503afbbe7fb5 100755 --- a/indra/newview/skins/default/xui/it/menu_land.xml +++ b/indra/newview/skins/default/xui/it/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Acquista Permesso" name="Land Buy Pass"/> <menu_item_call label="Costruisci" name="Create"/> <menu_item_call label="Modifica terreno" name="Edit Terrain"/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml index 7b060e65654074640e9042ac16031fdcb8ad12fb..35053ec4990e5085be15502738f6b15ee52d0905 100755 --- a/indra/newview/skins/default/xui/it/menu_login.xml +++ b/indra/newview/skins/default/xui/it/menu_login.xml @@ -17,7 +17,13 @@ <menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/> <menu_item_call label="Mostra messaggio critico" name="Critical"/> <menu_item_call label="Test debug finestra contenuti Web" name="Web Content Floater Debug Test"/> - <menu label="Imposta livello di registrazione" name="Set Logging Level"/> + <menu label="Imposta livello di registrazione" name="Set Logging Level"> + <menu_item_check label="Debug" name="Debug"/> + <menu_item_check label="Info" name="Info"/> + <menu_item_check label="Attenzione" name="Warning"/> + <menu_item_check label="Errore" name="Error"/> + <menu_item_check label="Nessuno" name="None"/> + </menu> <menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/> <menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/it/menu_mute_particle.xml b/indra/newview/skins/default/xui/it/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..7eb4b09495655031e3f37c8c53ddf520ea2888d6 --- /dev/null +++ b/indra/newview/skins/default/xui/it/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml index 7f41e8937f1f926015f4eb33f7bf65f9cc85929b..9bcc0879d2172ca27db334af6d00956114c9be6b 100755 --- a/indra/newview/skins/default/xui/it/menu_object.xml +++ b/indra/newview/skins/default/xui/it/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="Modifica" name="Edit..."/> <menu_item_call label="Costruisci" name="Build"/> - <menu_item_call label="Mostra nei set collegati" name="show_in_linksets"/> - <menu_item_call label="Mostra nei personaggi" name="show_in_characters"/> <menu_item_call label="Apri" name="Open"/> <menu_item_call label="Siediti qui" name="Object Sit"/> <menu_item_call label="Alzati" name="Object Stand Up"/> <menu_item_call label="Profilo dell'oggetto" name="Object Inspect"/> <menu_item_call label="Zoom avanti" name="Zoom In"/> + <menu_item_call label="Mostra nei set collegati" name="show_in_linksets"/> + <menu_item_call label="Mostra nei personaggi" name="show_in_characters"/> <context_menu label="Metti" name="Put On"> <menu_item_call label="Indossa" name="Wear"/> <menu_item_call label="Aggiungi" name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="Paga" name="Pay..."/> <menu_item_call label="Acquista" name="Buy..."/> <menu_item_call label="Elimina" name="Delete"/> + <menu_item_call label="Blocca proprietario particella" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml index abfbab35a34bd41855caed60ff639a58f4550901..e5c20fb9e9b337dc418a5f07ed92fa98d3e950b9 100755 --- a/indra/newview/skins/default/xui/it/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Vedi profilo" name="show_agent"/> <menu_item_call label="Manda IM..." name="send_im"/> <menu_item_call label="Aggiungi come amico..." name="add_friend"/> + <menu_item_call label="Togli amicizia..." name="remove_friend"/> <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/> <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml index 8456d14b63e485190c05424fc1d47814487d08a3..116b6521727aa80028fb67871970ed62b9bcf048 100755 --- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Profilo oggetto..." name="show_object"/> + <menu_item_call label="Blocca..." name="block_object"/> <menu_item_call label="Mostra sulla mappa" name="show_on_map"/> <menu_item_call label="Teleport sul luogo dell'oggetto" name="teleport_to_object"/> <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml index 2b7bc71df799080eb96c48bc60034595e5d92267..52247d6c9cf6c2bcb907b061a8702110946725b9 100755 --- a/indra/newview/skins/default/xui/it/menu_viewer.xml +++ b/indra/newview/skins/default/xui/it/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/> <menu_item_call label="Cammina / corri / vola..." name="Walk / run / fly"/> </menu> - <menu label="Stato" name="Status"/> + <menu label="Stato" name="Status"> + <menu_item_check label="Assente" name="Away"/> + <menu_item_check label="Non disturbare" name="Do Not Disturb"/> + </menu> <menu_item_call label="Acquista L$..." name="Buy and Sell L$"/> <menu_item_call label="Casella venditore in uscita..." name="MerchantOutbox"/> <menu_item_call label="Dashboard dell'account..." name="Manage My Account"> @@ -32,6 +35,7 @@ <menu_item_check label="Conversazioni..." name="Conversations"/> <menu_item_check label="Chat nei dintorni..." name="Nearby Chat"/> <menu_item_check label="Parla" name="Speak"/> + <menu_item_check label="Registro conversazioni..." name="Conversation Log..."/> <menu label="Manipolazione voce" name="VoiceMorphing"> <menu_item_check label="Nessuna manipolazione voce" name="NoVoiceMorphing"/> <menu_item_check label="Anteprima..." name="Preview"/> @@ -42,6 +46,7 @@ <menu_item_check label="Gruppi" name="My Groups"/> <menu_item_check label="Persone vicine" name="Active Speakers"/> <menu_item_call label="Blocca lista" name="Block List"/> + <menu_item_check label="Non disturbare" name="Do Not Disturb"/> </menu> <menu label="Mondo" name="World"> <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/> @@ -110,6 +115,7 @@ <menu_item_call label="Includi parte successiva" name="Include Next Part"/> <menu_item_call label="Includi parte precedente" name="Include Previous Part"/> </menu> + <menu_item_call label="Set collegati..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Ingrandisci selezione" name="Focus on Selection"/> <menu_item_call label="Zoom sulla selezione" name="Zoom to Selection"/> <menu label="Oggetto" name="Object"> @@ -273,6 +279,7 @@ <menu_item_check label="Spostamento fotocamera" name="Camera Offset"/> <menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/> <menu_item_check label="Test frame" name="Frame Test"/> + <menu_item_call label="Profilo frame" name="Frame Profile"/> </menu> <menu label="Render Metadata" name="Render Metadata"> <menu_item_check label="Normali" name="Normals"/> @@ -293,15 +300,15 @@ </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Assi" name="Axes"/> + <menu_item_call label="Info materiale selezionato" name="Selected Material Info"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Luci e ombre" name="Advanced Lighting Model"/> + <menu_item_check label="Modello illuminazione avanzato" name="Advanced Lighting Model"/> <menu_item_check label="Ombra dal sole, dalla luna e dai proiettori" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO e ombre fluide" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Maschera alfa automatica (differita)" name="Automatic Alpha Masks (deferred)"/> <menu_item_check label="Maschera alfa automatica (non differita)" name="Automatic Alpha Masks (non-deferred)"/> <menu_item_check label="Texture delle animazioni" name="Animation Textures"/> <menu_item_check label="Disabilita texture" name="Disable Textures"/> - <menu_item_check label="Atlante tessitura (sperimentale)" name="Texture Atlas"/> <menu_item_check label="Rendering delle luci unite" name="Render Attached Lights"/> <menu_item_check label="Rendering particelle unite" name="Render Attached Particles"/> <menu_item_check label="Gli oggetti brillano quando sono sotto il cursore" name="Hover Glow Objects"/> @@ -320,7 +327,6 @@ <menu_item_call label="Test browser multimedia" name="Web Browser Test"/> <menu_item_call label="Browser contenuto Web" name="Web Content Browser"/> <menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/> - <menu_item_call label="Statistiche memoria" name="Memory Stats"/> <menu_item_check label="Console di debug regione" name="Region Debug Console"/> <menu_item_check label="Debug clic" name="Debug Clicks"/> <menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 8adbebb62acf4a72b8bd0616820cc6e4597283b0..96b8c96595b011f188a50123291fb51e2ee419b9 100755 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -210,6 +210,14 @@ Aggiungi questo potere a '[ROLE_NAME]'? Aggiungi questo potere a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="No" yestext="Si"/> </notification> + <notification name="EjectGroupMemberWarning"> + Stai per espellere [AVATAR_NAME] dal gruppo. + <usetemplate ignoretext="Conferma l'espulsione di un partecipante dal gruppo" name="okcancelignore" notext="Annulla" yestext="Espelli"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Stai per espellere [COUNT] membri dal gruppo. + <usetemplate ignoretext="Conferma l'espulsione di vari partecipanti dal gruppo" name="okcancelignore" notext="Annulla" yestext="Espelli"/> + </notification> <notification name="AttachmentDrop"> Stai per abbandonare il tuo accessorio. Vuoi continuare? @@ -1110,7 +1118,7 @@ su TUTTI I TERRENI di questa sim? Introduci un prezzo più alto. </notification> <notification name="ConfirmItemDeleteHasLinks"> - Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti. Se elimini l'oggetto, i relativi link non funzioneranno più. Pertanto si consiglia vivamente di eliminare prima i link. + Almeno uno degli oggetti è collegato tramite link ad altri oggetti. Se elimini l'oggetto, i relativi link non funzioneranno più. Si consiglia vivamente di eliminare prima i link. Sei sicuro di volere eliminare gli oggetti? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> @@ -1128,9 +1136,9 @@ Confermi di voler cancellare questi elementi? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - Non possiedi neanche uno degli oggetti selezionati. + Non possiedi almeno uno degli oggetti selezionati. -Confermi di voler cancellare questi elementi? +Sei sicuro di volere eliminare gli oggetti? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1142,24 +1150,24 @@ Confermi di voler cancellare questi elementi? </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> Almeno un oggetto è bloccato. -Non possiedi neanche un oggetto. +Non possiedi almeno uno degli oggetti. -Confermi di voler cancellare questi elementi? +Sei sicuro di volere eliminare gli oggetti? <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Almeno un oggetto non è copiabile. -Non possiedi neanche un oggetto. + Almeno un oggetto non può essere copiato. +Non possiedi almeno uno degli oggetti. -Confermi di voler cancellare questi elementi? +Sei sicuro di volere eliminare gli oggetti? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> Almeno un oggetto è bloccato. -Almeno un oggetto è non copiabile. -Non possiedi neanche un oggetto. +Almeno un oggetto non può essere copiato. +Non possiedi almeno uno degli oggetti. -Confermi di voler cancellare questi elementi? +Sei sicuro di volere eliminare gli oggetti? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> @@ -1481,13 +1489,43 @@ Versione [VERSION] [[RELEASE_NOTES_FULL_URL] Informazioni su questo aggiornament </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> È stato scaricato un aggiornamento obbligatorio del software. -Versione [VERSION] +Versione [VERSION] [[INFO_URL] Informazioni su questo aggiornamento] Per installare l'aggiornamento è necessario riavviare [APP_NAME]. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> Per installare l'aggiornamento è necessario riavviare [APP_NAME]. +[[INFO_URL] Informazioni su questo aggiornamento] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + È stato scaricato un aggiornamento dell'installazione di [APP_NAME]. +Versione [VERSION] +Questo viewer sperimentale è stato sostituito con un viewer [NEW_CHANNEL]; +vedi [[INFO_URL] per informazioni su queesto aggiornamento] + <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + È stato scaricato un aggiornamento dell'installazione di [APP_NAME]. +Versione [VERSION] +Questo viewer sperimentale è stato sostituito con un viewer [NEW_CHANNEL]; +vedi [[INFO_URL] Informazioni su questo aggiornamento] + <usetemplate name="okcancelbuttons" notext="Più tardi..." yestext="Installa ora e riavvia [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + È stato scaricato un aggiornamento obbligatorio del software. +Versione [VERSION] +Questo viewer sperimentale è stato sostituito con un viewer [NEW_CHANNEL]; +vedi [[INFO_URL] Informazioni su questo aggiornamento] + +Per installare l'aggiornamento è necessario riavviare [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Per installare l'aggiornamento è necessario riavviare [APP_NAME]. +Questo viewer sperimentale è stato sostituito con un viewer [NEW_CHANNEL]; +vedi [[INFO_URL] Informazioni su questo aggiornamento] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1538,6 +1576,10 @@ Per installare l'aggiornamento è necessario riavviare [APP_NAME]. Lasciare il gruppo? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Impossibile abbandonare il gruppo. Non puoi abbandonare il gruppo perché sei l'ultimo proprietario del gruppo. Devi prima assegnare a un altro membro il ruolo di proprietario. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> Vuoi veramente espellere tutti i residenti dalla griglia? <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/> @@ -2401,9 +2443,7 @@ Seleziona solo un oggetto. scegliere Teleport.) </notification> <notification name="TeleportToPerson"> - Per contattare Residenti come '[NAME]', clicca sul pulsante "Persone", seleziona un Residente nel pannello che viene aperto, quindi clicca su 'IM' in - basso nel pannello. - (Puoi anche fare doppio clic sul nome nell'elenco oppure fare clic con il pulsante destro del mouse e selezionare 'IM'). + Per avviare una conversazione privata con un'altra persona, fai clic con il tasto destro sull'avatar e seleziona 'IM' dal menu. </notification> <notification name="CantSelectLandFromMultipleRegions"> Non è possibile selezionare il terreno attraverso i confini del server. @@ -2777,6 +2817,15 @@ Non consentire l'accesso se non comprendi perfettamente il motivo per cui d <button name="Deny" text="Nega"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + L'autorizzazione per script runtime richiesta da '<nolink>[OBJECTNAME]</nolink>', un oggetto di proprietà di '[NAME]', non è stata riconosciuta nel viewer e non può essere concessa. + +Per concedere questa autorizzazione è necessario che il viewer venga aggiornato alla versione più recente da [DOWNLOADURL]. + <form name="form"> + <button name="Deny" text="Ok"/> + <button name="Mute" text="Blocca"/> + </form> + </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' di [NAME] [MESSAGE] diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml index e1468db76ea048ec6e457eb240926b7539fb9239..2f40d4bdc4a24b54db72639c7423cc0f3b512936 100755 --- a/indra/newview/skins/default/xui/it/panel_people.xml +++ b/indra/newview/skins/default/xui/it/panel_people.xml @@ -49,6 +49,9 @@ Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa <menu_button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/> <dnd_button name="minus_btn" tool_tip="Lascia il gruppo selezionato"/> </panel> + <text name="groupcount"> + Fai parte di [COUNT] gruppi e puoi iscriverti a [REMAINING] altri. + </text> </panel> <panel label="RECENTE" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index c2ac6e97a9c53d580ef36117ded5362cdd73f6a2..09d7c963708b6053341f0fbf5161cb89909c54d2 100755 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Text Chat" name="chat"> - <panel> - <check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/> + <panel name="general_chat_settings"> + <check_box initial_value="true" label="Simula la battitura tasti quando sei in chat" name="play_typing_animation"/> <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/> <check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/> <text name="font_size"> - Dimensioni caratteri: + Dimensioni carattere: </text> <combo_box name="chat_font_size"> <item label="Piccolo" name="Small" value="0"/> @@ -14,10 +14,7 @@ </combo_box> <check_box label="Chat a vignetta" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Notifiche - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> IM degli amici: </text> @@ -25,8 +22,9 @@ <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> - <item label="Nessuno" name="None" value="none"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Riproduci suono" name="play_sound_friend_im"/> <text name="non_friend_ims"> IM non di amici: </text> @@ -34,8 +32,9 @@ <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> - <item label="Nessuno" name="None" value="none"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Riproduci suono" name="play_sound_non_friend_im"/> <text name="conference_ims"> IM conferenza: </text> @@ -43,8 +42,9 @@ <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> - <item label="Nessuno" name="None" value="none"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Riproduci suono" name="play_sound_conference_im"/> <text name="group_chat"> Chat di gruppo: </text> @@ -52,8 +52,9 @@ <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> <item label="Pulsante barra strumenti Flash" name="FlashToolbarButton" value="flash"/> - <item label="Nessuno" name="None" value="none"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Riproduci suono" name="play_sound_group_chat_im"/> <text name="nearby_chat"> Chat nei dintorni: </text> @@ -61,13 +62,24 @@ <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> <item label="Pulsante barra strumenti Flash" name="FlashToolBarButton" value="flash"/> - <item label="Nessuno" name="None" value="none"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Riproduci suono" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + IM di oggetti: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Apri finestra Conversazioni" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mostra il messaggio in una finestra pop-up" name="PopUpMessage" value="toast"/> + <item label="Pulsante barra strumenti Flash" name="FlashToolBarButton" value="flash"/> + <item label="Nessuna azione" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Riproduci suono" name="play_sound_object_im"/> <text name="notifications_alert"> Per interrompere temporaneamente le notifiche, usa Comunica > Non disturbare. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Riproduci suono: </text> @@ -76,7 +88,7 @@ <check_box label="Offerta di Teleport" name="teleport_offer"/> <check_box label="Offerta inventario" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="Cancella registro..." name="clear_log"/> <button label="Cancella trascrizioni..." name="delete_transcripts"/> <button label="Sfoglia..." label_selected="Sfoglia" name="log_path_button"/> 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 1f2b97af45003962a62feac2e817705948608846..2978c48db6a7fc4a054ffa06d65bb22808184355 100755 --- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml @@ -25,12 +25,12 @@ <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."/> <check_box initial_value="true" label="Effetti grafici atmosferici" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Luci e ombre" name="UseLightShaders"/> + <check_box initial_value="true" label="Modello illuminazione avanzato" name="UseLightShaders"/> <check_box initial_value="true" label="Occlusione ambientale" name="UseSSAO"/> <check_box initial_value="true" label="Profondità di campo" name="UseDoF"/> <text name="shadows_label"> 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 0189d47f45e6bdd5976403693bc0989b6b4dbd70..fcc9661d03aa838b9a8424b0b64fe53da3c9efd3 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> @@ -29,6 +29,7 @@ <combo_box.item label="Installa automaticamente" name="Install_automatically"/> <combo_box.item label="Scarica e installa manualmente gli aggiornamenti" name="Install_manual"/> </combo_box> + <check_box label="Disponibile agli aggiornamenti con versioni non rilasciate" name="update_willing_to_test"/> <text name="Proxy Settings:"> Impostazioni proxy: </text> diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml index d7ee8230b354fffbdfd0088c1c67eed40723ec3b..feee8b19276e78da0bbd07bd921a2fba693a4cfa 100755 --- a/indra/newview/skins/default/xui/it/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Seleziona tutto" name="Select All"/> <menu_item_call label="Deseleziona" name="Deselect"/> <menu_item_call label="Cerca / Sostituisci..." name="Search / Replace..."/> + <menu_item_call label="Passa alla riga..." name="Go to line..."/> </menu> <menu label="Guida" name="Help"> <menu_item_call label="Aiuto..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/it/panel_tools_texture.xml b/indra/newview/skins/default/xui/it/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..36ad2980cb1afca36e22dfd1380ef351952221ec --- /dev/null +++ b/indra/newview/skins/default/xui/it/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Texture" name="Texture"> + <panel.string name="string repeats per meter"> + Ripetizioni al metro + </panel.string> + <panel.string name="string repeats per face"> + Ripetizioni per faccia + </panel.string> + <text name="color label"> + Colore + </text> + <color_swatch label="" name="colorswatch" tool_tip="Clicca per aprire il selettore dei colori"/> + <text name="color trans"> + Trasparenza % + </text> + <text name="glow label"> + Bagliore + </text> + <check_box label="Luminosità massima" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Materiali" name="Materials"/> + <combo_box.item label="Multimedia" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Texture (diffusa)" name="Texture (diffuse)"/> + <combo_box.item label="Irregolarità (normale)" name="Bumpiness (normal)"/> + <combo_box.item label="Lucentezza (speculare)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Texture" name="texture control" tool_tip="Clicca per scegliere una fotografia"/> + <text name="label alphamode"> + Modalità Alfa + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Nessuno" name="None"/> + <combo_box.item label="Miscelazione Alfa" name="Alpha blending"/> + <combo_box.item label="Mascheratura Alfa" name="Alpha masking"/> + <combo_box.item label="Mascheratura emissiva" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + Limite mascheratura + </text> + <texture_picker label="Texture" name="bumpytexture control" tool_tip="Clicca per scegliere una fotografia"/> + <text name="label bumpiness"> + Irregolarità + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Nessuno" name="None"/> + <combo_box.item label="Luminosità " name="Brightness"/> + <combo_box.item label="Oscurità " name="Darkness"/> + <combo_box.item label="venatura" name="woodgrain"/> + <combo_box.item label="corteccia" name="bark"/> + <combo_box.item label="mattoni" name="bricks"/> + <combo_box.item label="scacchiera" name="checker"/> + <combo_box.item label="cemento" name="concrete"/> + <combo_box.item label="incrostatura" name="crustytile"/> + <combo_box.item label="gemma" name="cutstone"/> + <combo_box.item label="dischi" name="discs"/> + <combo_box.item label="ciottoli" name="gravel"/> + <combo_box.item label="batteri" name="petridish"/> + <combo_box.item label="rivestimento" name="siding"/> + <combo_box.item label="lastricato" name="stonetile"/> + <combo_box.item label="stucco" name="stucco"/> + <combo_box.item label="suzione" name="suction"/> + <combo_box.item label="trama" name="weave"/> + </combo_box> + <texture_picker label="Texture" name="shinytexture control" tool_tip="Clicca per scegliere una fotografia"/> + <text name="label shininess"> + Lucentezza + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Nessuna" name="None"/> + <combo_box.item label="Bassa" name="Low"/> + <combo_box.item label="Media" name="Medium"/> + <combo_box.item label="Alta" name="High"/> + </combo_box> + <text name="label glossiness"> + Patinatura + </text> + <text name="label environment"> + Ambiente + </text> + <text name="label shinycolor"> + Colore + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Clicca per aprire il selettore dei colori"/> + <text name="media_info"> + L'URL dell'eventuale elemento multimediale selezionato va qui + </text> + <button label="Scegli..." name="add_media" tool_tip="Aggiungi elemento multimediale"/> + <button label="Rimuovi" name="delete_media" tool_tip="Cancella questa texture dell'elemento multimediale"/> + <button label="Alllinea" label_selected="Allinea elmento multimediale" name="button align" tool_tip="Allinea texture dell'elemento multimediale (il caricamento deve prima essere completato)"/> + <text name="tex gen"> + Mappatura + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Predefinita" name="Default"/> + <combo_box.item label="Planare" name="Planar"/> + </combo_box> + <spinner label="Scala orizzontale" name="TexScaleU"/> + <spinner label="Scala veritcale" name="TexScaleV"/> + <spinner label="Ripetizioni al metro" name="rptctrl"/> + <spinner label="Gradi di rotazione" name="TexRot"/> + <spinner label="Spostamento orizzontale" name="TexOffsetU"/> + <spinner label="Spostamento verticale" name="TexOffsetV"/> + <spinner label="Scala orizzontale" name="bumpyScaleU"/> + <spinner label="Scala veritcale" name="bumpyScaleV"/> + <spinner label="Gradi di rotazione" name="bumpyRot"/> + <spinner label="Spostamento orizzontale" name="bumpyOffsetU"/> + <spinner label="Spostamento verticale" name="bumpyOffsetV"/> + <spinner label="Scala orizzontale" name="shinyScaleU"/> + <spinner label="Scala veritcale" name="shinyScaleV"/> + <spinner label="Gradi di rotazione" name="shinyRot"/> + <spinner label="Spostamento orizzontale" name="shinyOffsetU"/> + <spinner label="Spostamento verticale" name="shinyOffsetV"/> + <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/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml index 300e6cf72130bb25584fe0b347ebe200bd37df52..3ccb674ed0b4eeea3aa1bc79f4d961923a879f00 100755 --- a/indra/newview/skins/default/xui/it/role_actions.xml +++ b/indra/newview/skins/default/xui/it/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity"> <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno > scheda Opzioni." name="land find places" value="17"/> - <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno > scheda Opzioni." name="land change identity" value="18"/> + <action description="Cambia il nome, la descrizione e le impostazioni 'Contenuto Moderato' per il lotto" longdescription="Cambia il nome, la descrizione e le impostazioni 'Contenuto Moderato' per il lotto. Ciò viene fatto in Informazioni sul terreno > scheda Opzioni." name="land change identity" value="18"/> <action description="Impostare il punto di arrivo e l'indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l'indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno > Opzioni." name="land set landing point" value="19"/> </action_set> <action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index f95318542b4c0e96b40b68e8213586fc02c75b54..60ed2b0929dbabfaaa3f76ac7a5c2374fb59a9c1 100755 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -136,6 +136,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download. + </string> <string name="LoginFailedViewerNotPermitted"> Il viewer utilizzato non è più in grado di accedere a Second Life. Visita la parina seguente per scaricare un nuovo viewer: http://secondlife.com/download. @@ -445,6 +448,9 @@ Prova ad accedere nuovamente tra un minuto. <string name="SLappAgentRequestFriend"> Richiesta di amicizia </string> + <string name="SLappAgentRemoveFriend"> + Rimozione amico + </string> <string name="BUTTON_CLOSE_DARWIN"> Chiudi (⌘W) </string> @@ -832,6 +838,9 @@ Prova ad accedere nuovamente tra un minuto. <string name="multiple_textures"> Multiple </string> + <string name="use_texture"> + Usa texture + </string> <string name="texture_loading"> Caricamento in corso... </string> @@ -928,6 +937,21 @@ Prova ad accedere nuovamente tra un minuto. <string name="TeleportYourAgent"> Teleportarti </string> + <string name="JoinAnExperience"> + Partecipa a un'esperienza + </string> + <string name="SilentlyManageEstateAccess"> + Omette gli avvisi durante la gestione degli elenchi di accesso alle proprietà immobiliari + </string> + <string name="OverrideYourAnimations"> + Sostituisce le animazioni predefinite + </string> + <string name="ScriptReturnObjects"> + Restituisce oggetti per conto tuo + </string> + <string name="UnknownScriptPermission"> + (sconosciuto)! + </string> <string name="SIM_ACCESS_PG"> Generale </string> @@ -1241,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 @@ -1953,6 +1977,12 @@ Prova ad accedere nuovamente tra un minuto. <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD basso a destra </string> + <string name="ATTACH_NECK"> + Collo + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro avatar + </string> <string name="CursorPos"> Riga [LINE], Colonna [COLUMN] </string> @@ -2940,6 +2970,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. <string name="Hip Width"> Larghezza bacino </string> + <string name="Hover"> + Muovi sopra + </string> <string name="In"> Dentro </string> @@ -4994,4 +5027,7 @@ Prova a racchiudere il percorso dell'editor in doppie virgolette. <string name="logging_calls_enabled_log_empty"> Nessuna conversazione in registro. Dopo che hai contattato qualcuno o se qualcuno ti contatta, una voce del registro verrà mostrata qui. </string> + <string name="loading_chat_logs"> + Caricamento in corso... + </string> </strings> diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml index eae52c98ec2375af9c3aecadfb7a9fb1b6a1c37d..63a4e69c102a7dfa4a0fa7fbd8bd2e98556b0ea5 100755 --- a/indra/newview/skins/default/xui/ja/floater_about.xml +++ b/indra/newview/skins/default/xui/ja/floater_about.xml @@ -8,7 +8,9 @@ コンパイラー [COMPILER] [COMPILER_VERSION] ãƒãƒ¼ã‚¸ãƒ§ãƒ³ </floater.string> <floater.string name="AboutPosition"> - ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ <nolink>[HOSTNAME]</nolink> ã§ã™ã€‚([HOSTIP]) + ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_LOCAL_0,number,1]ã€[POSITION_LOCAL_1,number,1]ã€[POSITION_LOCAL_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ <nolink>[HOSTNAME]</nolink> ã§ã™ã€‚([HOSTIP]) +SLURL:<nolink>[SLURL]</nolink> +(ã‚°ãƒãƒ¼ãƒãƒ«åº§æ¨™ [POSITION_0,number,1]ã€[POSITION_1,number,1]ã€[POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index d8d0164618177e41c4c3723ce8f1cb9467a36fa8..1b5a745cc46bb633c66413ff8ca3ef744c641dd0 100755 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="ä¸èº«ã®æ¨©é™ã®ç·¨é›†"> +<floater name="floaterbulkperms" title="コンテンツ権é™ã‚’調整"> <floater.string name="nothing_to_modify_text"> é¸æŠžã—ãŸä¸ã«ç·¨é›†ã§ããªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ </floater.string> @@ -33,7 +33,7 @@ <button label="ã™ã¹ã¦ã« √" label_selected="å…¨ã¦" name="check_all"/> <button label="クリア" label_selected="ãªã—" name="check_none"/> <text name="newperms"> - æ–°ã—ã„ä¸èº«ã®æ¨©é™ + コンテンツ権é™ã‚’以下ã«èª¿æ•´ </text> <text name="GroupLabel"> グループ: @@ -49,6 +49,7 @@ <check_box label="ä¿®æ£" name="next_owner_modify"/> <check_box label="コピー" name="next_owner_copy"/> <check_box initial_value="true" label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="é©ç”¨" name="apply"/> <button label="ã‚ャンセル" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_goto_line.xml b/indra/newview/skins/default/xui/ja/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..5f2717ace54bb474ab296d1abcb234ed5bdea0c6 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="行ã«ç§»å‹•"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + 行ã«ç§»å‹• + </text> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml index a44c843df7fa5ec58569d23243730453410b5b32..7ed46f7f013a720d3594687f0673e218f19c0ff5 100755 --- a/indra/newview/skins/default/xui/ja/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ãƒãƒ£ãƒƒãƒˆã‚’翻訳" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml index 9733c6191818a0e6bafb86a48f1e84e6576d9b9b..ec107f3e6b914bfcb87bc44354e693b2a3c0f90c 100755 --- a/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ja/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 表示: </text> - <check_box label="テスト" name="show_world"/> + <check_box label="世界" name="show_world"/> <check_box label="å¯å‹•物ã®ã¿" name="show_world_movables_only"/> <check_box label="ナビメッシュ" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml index 4bd6439ad25e35287f9f036e5129847a4bd6f2f8..5511433ae3773d5b30090936c19a723a7e1f093b 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index 5adf0b3745f599a1190df59ede3440e44e76a505..930af106923a9b69b35d30f93117b7da9fd82e3d 100755 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="ダンプ XML" name="Dump XML"/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール" name="Object Inspect"/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml index 6036e1075e79a419ca57af9d2f30ff677082351d..d87ef8e2a08edcd7369ebe34bb7e86cf05646f1d 100755 --- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="グループ" name="Groups..."/> <menu_item_call label="プãƒãƒ•ィール" name="Profile..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="ダンプ XML" name="Dump XML"/> <menu_item_call label="下ã«è½ã¨ã™" name="Drop"/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index 54dd96f5effd7c8d9e3f9bdf3d86384c30574c06..f9cadc36ac5adbc074ed057b962d56ad89ad03f2 100755 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="フリーズ" name="Freeze..."/> <menu_item_call label="追放" name="Eject..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="ダンプ XML" name="Dump XML"/> <menu_item_call label="ズームイン" name="Zoom In"/> <menu_item_call label="支払ã†" name="Pay..."/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml index 4709522665b02c0def972e959bcd16c7983423d1..eb8e98059a9427bb9201db7b509b5ffce06771bd 100755 --- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="グループ" name="Groups..."/> <menu_item_call label="プãƒãƒ•ィール" name="Profile..."/> <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/> + <menu_item_call label="ダンプ XML" name="Dump XML"/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index c7df20d2529b930d6f6d6acc97207ad005abe4d0..66940471da8098a95f675e054cdefdd73701cc82 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="会話を終ãˆã‚‹" name="close_conversation"/> <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’å§‹ã‚ã‚‹" name="open_voice_conversation"/> <menu_item_call label="ボイスãƒãƒ£ãƒƒãƒˆã‚’切æ–ã™ã‚‹" name="disconnect_from_voice"/> + <menu_item_call label="é¸æŠžã—ãŸé …目を閉ã˜ã‚‹" name="close_selected_conversations"/> <menu_item_call label="プãƒãƒ•ィールを表示" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml index 89c122f14fd9c013cec9a7e3f64228cd75e67b6e..3754bd7fa43fdd837ba22fdf21c18220dd428eda 100755 --- a/indra/newview/skins/default/xui/ja/menu_land.xml +++ b/indra/newview/skins/default/xui/ja/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="å…¥å ´è¨±å¯ã‚’購入" name="Land Buy Pass"/> <menu_item_call label="制作" name="Create"/> <menu_item_call label="地形を編集" name="Edit Terrain"/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index ab6d9e3546d560f24e16dfed4da7be0488c45822..3918732fa8e45102a54e778bb5449c1f5cea95d5 100755 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="利用è¦ç´„を表示" name="TOS"/> <menu_item_call label="クリティカルメッセージを表示" name="Critical"/> <menu_item_call label="Web コンテンツフãƒãƒ¼ã‚¿ãƒ¼ã®ãƒ‡ãƒãƒƒã‚°ãƒ†ã‚¹ãƒˆ" name="Web Content Floater Debug Test"/> - <menu label="ãƒã‚°ãƒ¬ãƒ™ãƒ«ã‚’è¨å®š" name="Set Logging Level"/> + <menu label="ãƒã‚°ãƒ¬ãƒ™ãƒ«ã‚’è¨å®š" name="Set Logging Level"> + <menu_item_check label="デãƒãƒƒã‚°" name="Debug"/> + <menu_item_check label="æƒ…å ±" name="Info"/> + <menu_item_check label="è¦å‘Š" name="Warning"/> + <menu_item_check label="エラー" name="Error"/> + <menu_item_check label="ãªã—" name="None"/> + </menu> <menu_item_check label="グリッドピッカーを表示ã™ã‚‹" name="Show Grid Picker"/> <menu_item_call label="通知コンソールを表示ã™ã‚‹" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..8dab025309014b17802698c74842de19209723c1 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml index 01436ad12bc888679c5bb79490f59172e6a9ab48..39c32bc41e425a8b7ffc0407534361c880d03542 100755 --- a/indra/newview/skins/default/xui/ja/menu_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="編集" name="Edit..."/> <menu_item_call label="制作" name="Build"/> - <menu_item_call label="リンクセットã§è¡¨ç¤º" name="show_in_linksets"/> - <menu_item_call label="ã‚ャラクターã§è¡¨ç¤º" name="show_in_characters"/> <menu_item_call label="é–‹ã" name="Open"/> <menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Object Sit"/> <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Object Stand Up"/> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール" name="Object Inspect"/> <menu_item_call label="ズームイン" name="Zoom In"/> + <menu_item_call label="リンクセットã§è¡¨ç¤º" name="show_in_linksets"/> + <menu_item_call label="ã‚ャラクターã§è¡¨ç¤º" name="show_in_characters"/> <context_menu label="装ç€" name="Put On"> <menu_item_call label="装ç€" name="Wear"/> <menu_item_call label="è¿½åŠ " name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="支払ã†" name="Pay..."/> <menu_item_call label="è²·ã†" name="Buy..."/> <menu_item_call label="削除" name="Delete"/> + <menu_item_call label="パーティクル所有者をブãƒãƒƒã‚¯" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 72722db7cca9ca2f782edc21192413910844120f..639602ce3c06e745812259ad60071cb8a7a2ee5a 100755 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="プãƒãƒ•ィールを表示" name="show_agent"/> <menu_item_call label="IM ã‚’é€ä¿¡..." name="send_im"/> <menu_item_call label="ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’è¿½åŠ ..." name="add_friend"/> + <menu_item_call label="フレンドを削除..." name="remove_friend"/> <menu_item_call label="åå‰ã‚’クリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> <menu_item_call label="SLurl をクリップボードã«ã‚³ãƒ”ー" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index 9e340e3239c8868be24a394819148738de9a4d05..a02ca8415d3fc665ffba504144237484a8bcdb24 100755 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="オブジェクトã®ãƒ—ãƒãƒ•ィール..." name="show_object"/> + <menu_item_call label="ブãƒãƒƒã‚¯..." name="block_object"/> <menu_item_call label="地図ã«è¡¨ç¤º" name="show_on_map"/> <menu_item_call label="オブジェクトã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="teleport_to_object"/> <menu_item_call label="オブジェクトåをクリップボードã«ã‚³ãƒ”ー" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 89f58d3bacecf0fce59859f02b408589b81ac2b0..b1ec62115c602d8502f701fb1f43f97ded7ebe39 100755 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ¢ã™ã‚‹" name="Stop Animating My Avatar"/> <menu_item_call label="æ©è¡Œï¼èµ°è¡Œï¼é£›è¡Œ..." name="Walk / run / fly"/> </menu> - <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"/> + <menu label="ãƒã‚°ã‚¤ãƒ³" name="Status"> + <menu_item_check label="一時退å¸ä¸" name="Away"/> + <menu_item_check label="ç€ä¿¡æ‹’å¦" name="Do Not Disturb"/> + </menu> <menu_item_call label="L$ ã®è³¼å…¥..." name="Buy and Sell L$"/> <menu_item_call label="マーãƒãƒ£ãƒ³ãƒˆã‚¢ã‚¦ãƒˆãƒœãƒƒã‚¯ã‚¹..." name="MerchantOutbox"/> <menu_item_call label="マイアカウント..." name="Manage My Account"> @@ -32,6 +35,7 @@ <menu_item_check label="会話..." name="Conversations"/> <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ..." name="Nearby Chat"/> <menu_item_check label="話ã™" name="Speak"/> + <menu_item_check label="会話ãƒã‚°..." name="Conversation Log..."/> <menu label="ボイスモーフィング" name="VoiceMorphing"> <menu_item_check label="ボイスモーフィングãªã—" name="NoVoiceMorphing"/> <menu_item_check label="プレビュー..." name="Preview"/> @@ -42,6 +46,7 @@ <menu_item_check label="グループ" name="My Groups"/> <menu_item_check label="è¿‘ãã«ã„る人" name="Active Speakers"/> <menu_item_call label="リストをブãƒãƒƒã‚¯" name="Block List"/> + <menu_item_check label="ç€ä¿¡æ‹’å¦" name="Do Not Disturb"/> </menu> <menu label="世界" name="World"> <menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/> @@ -110,6 +115,7 @@ <menu_item_call label="次ã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Next Part"/> <menu_item_call label="å‰å›žã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Previous Part"/> </menu> + <menu_item_call label="リンクセット..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã«ç„¦ç‚¹ã‚’åˆã‚ã›ã‚‹" name="Focus on Selection"/> <menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã‚’ズームã™ã‚‹" name="Zoom to Selection"/> <menu label="オブジェクト" name="Object"> @@ -279,6 +285,7 @@ <menu_item_check label="フレームレートをランダム化" name="Randomize Framerate"/> <menu_item_check label="定期的ã«é…ã„フレームを挿入ã™ã‚‹" name="Periodic Slow Frame"/> <menu_item_check label="フレームテスト" name="Frame Test"/> + <menu_item_call label="フレームプãƒãƒ•ィール" name="Frame Profile"/> </menu> <menu label="メタデータã®ãƒ¬ãƒ³ãƒ€ãƒ¼" name="Render Metadata"> <menu_item_check label="ãƒã‚¦ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãƒœãƒƒã‚¯ã‚¹" name="Bounding Boxes"/> @@ -313,9 +320,10 @@ <menu_item_check label="軸" name="Axes"/> <menu_item_check label="接線基底" name="Tangent Basis"/> <menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…å ±åŸºåº•" name="Selected Texture Info Basis"/> + <menu_item_call label="é¸æŠžã—ãŸãƒžãƒ†ãƒªã‚¢ãƒ«æƒ…å ±" name="Selected Material Info"/> <menu_item_check label="ワイヤーフレーム" name="Wireframe"/> <menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/> - <menu_item_check label="å…‰ã¨å½±" name="Advanced Lighting Model"/> + <menu_item_check label="高度ãªãƒ©ã‚¤ãƒ†ã‚£ãƒ³ã‚°ãƒ¢ãƒ‡ãƒ«" name="Advanced Lighting Model"/> <menu_item_check label="太陽・月・プãƒã‚¸ã‚§ã‚¯ã‚¿ã‹ã‚‰ã®å½±" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO ã¨å½±ã®å¹³æ»‘化" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/> @@ -325,7 +333,6 @@ <menu_item_check label="アニメーションテクスãƒãƒ£" name="Animation Textures"/> <menu_item_check label="テクスãƒãƒ£ã‚’無効ã«ã™ã‚‹" name="Disable Textures"/> <menu_item_check label="フル解åƒåº¦ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Rull Res Textures"/> - <menu_item_check label="テクスãƒãƒ£ã‚¢ãƒˆãƒ©ã‚¹ï¼ˆè©¦é¨“段階)" name="Texture Atlas"/> <menu_item_check label="装ç€ã•れãŸå…‰æºã‚’æç”»ã™ã‚‹" name="Render Attached Lights"/> <menu_item_check label="å–り付ã‘られãŸãƒ‘ーティクルをæç”»ã™ã‚‹" name="Render Attached Particles"/> <menu_item_check label="マウスオーãƒãƒ¼ã§å¼·èª¿è¡¨ç¤ºã™ã‚‹" name="Hover Glow Objects"/> @@ -361,7 +368,6 @@ <menu_item_call label="フォーカスホールダーをダンプ" name="Dump Focus Holder"/> <menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæƒ…å ±ã‚’ãƒ—ãƒªãƒ³ãƒˆ" name="Print Selected Object Info"/> <menu_item_call label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆæƒ…å ±ã‚’ãƒ—ãƒªãƒ³ãƒˆ" name="Print Agent Info"/> - <menu_item_call label="メモリ使用状æ³" name="Memory Stats"/> <menu_item_check label="地域デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Region Debug Console"/> <menu_item_check label="SelectMgr ã®ãƒ‡ãƒãƒƒã‚°" name="Debug SelectMgr"/> <menu_item_check label="ダブルクリック" name="Debug Clicks"/> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 356506f19123da7db5356f933d0680b30c6b01db..f1c916bf533f605086207a7622e0322ae5082b48 100755 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -150,7 +150,7 @@ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å˜"/> </notification> <notification name="FriendsAndGroupsOnly"> - フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 + フレンド以外ã®äººã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã™ã‚‹è¨å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="FavoritesOnLogin"> @@ -221,6 +221,14 @@ ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/> </notification> + <notification name="EjectGroupMemberWarning"> + [AVATAR_NAME] をグループã‹ã‚‰è¿½æ”¾ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + <usetemplate ignoretext="グループã‹ã‚‰ã®å‚åŠ è€…ã®è¿½æ”¾ã‚’確èªã—ã¾ã™" name="okcancelignore" notext="å–り消ã—" yestext="追放"/> + </notification> + <notification name="EjectGroupMembersWarning"> + [COUNT] åã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’グループã‹ã‚‰è¿½æ”¾ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + <usetemplate ignoretext="グループã‹ã‚‰ã®è¤‡æ•°ã®ãƒ¡ãƒ³ãƒãƒ¼ã®è¿½æ”¾ã‚’確èªã—ã¾ã™" name="okcancelignore" notext="å–り消ã—" yestext="追放"/> + </notification> <notification name="AttachmentDrop"> アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«ç½®ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ @@ -1139,7 +1147,7 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries ã‚’å‚ç…§ã—ã¦ã 金é¡ã‚’増やã—ã¦ãã ã•ã„。 </notification> <notification name="ConfirmItemDeleteHasLinks"> - ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ãŒå°‘ãªãã¨ã‚‚1ã¤ã‚りã¾ã™ã€‚ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã™ã‚‹ã¨ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚‚ã®ãŒæ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ リンクを先ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ + 1 ã¤ä»¥ä¸Šã®ã‚¢ã‚¤ãƒ†ãƒ ã«ãƒã‚¤ãƒ³ãƒˆã™ã‚‹ãƒªãƒ³ã‚¯ãŒã‚りã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã™ã‚‹å ´åˆã€ãã®ãƒªãƒ³ã‚¯ã¯æ°¸ä¹…ã«æ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ã¾ãšæœ€åˆã«ãƒªãƒ³ã‚¯ã‚’削除ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚ ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> @@ -1157,9 +1165,9 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries ã‚’å‚ç…§ã—ã¦ã <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 + é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã® 1 ã¤ä»¥ä¸Šã‚’所有ã—ã¦ã„ã¾ã›ã‚“。 -本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1170,26 +1178,26 @@ https://wiki.secondlife.com/wiki/Adding_Spelling_Dictionaries ã‚’å‚ç…§ã—ã¦ã <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> - å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 + 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¾ã—ãŸã€‚ +1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを所有ã—ã¦ã„ã¾ã›ã‚“。 -本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 + 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを所有ã—ã¦ã„ã¾ã›ã‚“。 -本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ -å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 -å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。 + 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ +1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。 +1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを所有ã—ã¦ã„ã¾ã›ã‚“。 -本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ - <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="OK"/> +ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ を削除ã—ã¾ã™ã‹ï¼Ÿ + <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚ @@ -1513,13 +1521,43 @@ http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> å¿…è¦ãªã‚½ãƒ•トウェアã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸã€‚ -ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] [[INFO_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±] アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +[[INFO_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸã€‚ +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] +ã“ã®è©¦é¨“çš„ãªãƒ“ューア㌠[NEW_CHANNEL] ビューアã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ã¾ã™; +ã“ã®ã‚¢ãƒƒãƒ—デートã®è©³ç´°ã«ã¤ã„ã¦ã¯ã€[[INFO_URL] ã‚’å‚ç…§ã—ã¦ãã ã•ã„] + <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + ãŠä½¿ã„ã® [APP_NAME] ã«å¿…è¦ãªã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸã€‚ +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] +ã“ã®è©¦é¨“çš„ãªãƒ“ューア㌠[NEW_CHANNEL] ビューアã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ã¾ã™; +[[INFO_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±] ã‚’å‚ç…§ + <usetemplate name="okcancelbuttons" notext="後ã§å®Ÿè¡Œ" yestext="今ã™ãインストールã—㦠[APP_NAME] ã‚’å†èµ·å‹•"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + å¿…è¦ãªã‚½ãƒ•トウェアã®ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸã€‚ +ãƒãƒ¼ã‚¸ãƒ§ãƒ³ [VERSION] +ã“ã®è©¦é¨“çš„ãªãƒ“ューア㌠[NEW_CHANNEL] ビューアã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ã¾ã™; +[[INFO_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±] ã‚’å‚ç…§ + +アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + アップデートをインストールã™ã‚‹ã«ã¯ [APP_NAME] ã‚’å†èµ·å‹•ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ +ã“ã®è©¦é¨“çš„ãªãƒ“ューア㌠[NEW_CHANNEL] ビューアã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ã¾ã™; +[[INFO_URL] ã“ã®ã‚¢ãƒƒãƒ—デートã«é–¢ã™ã‚‹æƒ…å ±] ã‚’å‚ç…§ <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1572,6 +1610,10 @@ http://secondlife.com/download ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ グループã‹ã‚‰è„±é€€ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + グループを抜ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã€‚ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¾Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã§ã‚ã‚‹ãŸã‚ã€ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。最åˆã«ã€åˆ¥ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’オーナーã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã¦ãã ã•ã„。 + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> 本当ã«ä½äººå…¨å“¡ã‚’グリッドã‹ã‚‰è¿½ã„出ã—ã¾ã™ã‹ï¼Ÿ <usetemplate name="okcancelbuttons" notext="ã‚ャンセル" yestext="ä½äººå…¨å“¡ã‚’追ã„出ã™"/> @@ -2443,9 +2485,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚» 「テレãƒãƒ¼ãƒˆã€ã‚’é¸æŠžã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚) </notification> <notification name="TeleportToPerson"> - [NAME] ã®ã‚ˆã†ãªä½äººã«é€£çµ¡ã‚’ã¨ã‚‹ã«ã¯ã€ã€Œäººã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã€è¡¨ç¤ºã•れるウィンドウã§ã€Œä½äººã€ã‚’é¸æŠžã—ã¦ã‹ã‚‰ã€ -ウィンドウ下部ã«ã‚る「IMã€ã‚’クリックã—ã¾ã™ã€‚ -(リストã®åå‰ã‚’ダブルクリックã€ã¾ãŸã¯å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒIMã€ã‚’é¸ã‚“ã§ã‚‚åŒã˜ã§ã™ã€‚) + 誰ã‹ã¨ã®ãƒ—ライベートãªä¼šè©±ã‚’é–‹ãã«ã¯ã€ç›¸æ‰‹ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’クリックã—ã¦ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã€ŒIMã€ã‚’é¸æŠžã—ã¾ã™ã€‚ </notification> <notification name="CantSelectLandFromMultipleRegions"> サーãƒãƒ¼ã®å¢ƒç•Œã‚’è¶Šãˆã¦åœŸåœ°ã‚’é¸æŠžã™ã‚‹ã“ã¨ã§ãã¾ã›ã‚“。 @@ -2820,6 +2860,15 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚» <button name="Deny" text="æ‹’å¦"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + '[NAME]' ãŒæ‰€æœ‰ã™ã‚‹ '<nolink>[OBJECTNAME]</nolink>' ã«ã‚ˆã£ã¦ãƒªã‚¯ã‚¨ã‚¹ãƒˆã•れãŸãƒ©ãƒ³ã‚¿ã‚¤ãƒ スクリプト権é™ãŒãƒ“ューアã«ã‚ˆã£ã¦èªè˜ã•れãªã„ãŸã‚ã€è¨±å¯ã§ãã¾ã›ã‚“。 + +ã“ã®æ¨©é™ã‚’許å¯ã™ã‚‹ã«ã¯ã€ãƒ“ューアを [DOWNLOADURL] ã‹ã‚‰ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—デートã—ã¦ãã ã•ã„。 + <form name="form"> + <button name="Deny" text="Ok"/> + <button name="Mute" text="ブãƒãƒƒã‚¯"/> + </form> + </notification> <notification name="ScriptDialog"> [NAME] ã®ã€Œ<nolink>[TITLE]</nolink>〠[MESSAGE] diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml index 03ce87537a50bc049fc5b2edfea29c8bb2915a8b..dd8fd416815eed727835ba48cac545ef08f8317c 100755 --- a/indra/newview/skins/default/xui/ja/panel_people.xml +++ b/indra/newview/skins/default/xui/ja/panel_people.xml @@ -49,6 +49,9 @@ <menu_button name="plus_btn" tool_tip="グループã«å‚åŠ / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/> <dnd_button name="minus_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è„±é€€"/> </panel> + <text name="groupcount"> + ã‚ãªãŸã¯[COUNT]グループã«å±žã—ã¦ã„ã‚‹ã®ã§ã€ã¾ã [REMAINING]å‚åŠ ã§ãã¾ã™ã€‚ + </text> </panel> <panel label="最新" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index ae5391c7bd86b37267a341853d76df7b3ec4d024..1c3204ea04d2410138ef8e497c9dc92a91b81b56 100755 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"> - <panel> + <panel name="general_chat_settings"> <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/> <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/> <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/> @@ -14,71 +14,83 @@ </combo_box> <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - 通知 - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> フレンド IM: </text> <combo_box name="FriendIMOptions"> - <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> - <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> - <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> - <item label="フィルターãªã—" name="None" value="none"/> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolbarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_friend_im"/> <text name="non_friend_ims"> - éžãƒ•レンド IM: + フレンドã®ã„ãªã„ IM: </text> <combo_box name="NonFriendIMOptions"> - <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> - <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> - <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> - <item label="フィルターãªã—" name="None" value="none"/> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolbarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_non_friend_im"/> <text name="conference_ims"> - コンファレンス IM: + ä¼šè° IM: </text> <combo_box name="ConferenceIMOptions"> - <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> - <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> - <item label="Flashツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> - <item label="フィルターãªã—" name="None" value="none"/> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolbarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_conference_im"/> <text name="group_chat"> グループãƒãƒ£ãƒƒãƒˆ: </text> <combo_box name="GroupChatOptions"> - <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> - <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> - <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolbarButton" value="flash"/> - <item label="ãªã—" name="None" value="none"/> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolbarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_group_chat_im"/> <text name="nearby_chat"> è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ: </text> <combo_box name="NearbyChatOptions"> - <item label="会話ウィンドウを開ã" name="OpenConversationsWindow" value="openconversations"/> - <item label="メッセージã®ãƒãƒƒãƒ—アップ" name="PopUpMessage" value="toast"/> - <item label="Flash ツールãƒãƒ¼ãƒœã‚¿ãƒ³" name="FlashToolBarButton" value="flash"/> - <item label="フィルターãªã—" name="None" value="none"/> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolBarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + オブジェクト IM: + </text> + <combo_box name="ObjectIMOptions"> + <item label="é–‹ã„ã¦ã„る会話ウィンドウ" name="OpenConversationsWindow" value="openconversations"/> + <item label="メッセージをãƒãƒƒãƒ—アップ表示" name="PopUpMessage" value="トースト"/> + <item label="フラッシュ ツールãƒãƒ¼ ボタン" name="FlashToolBarButton" value="フラッシュ"/> + <item label="動作ãªã—" name="NoAction" value="noaction"/> </combo_box> + <check_box label="サウンドをå†ç”Ÿ" name="play_sound_object_im"/> <text name="notifications_alert"> - ã™ã¹ã¦ã®é€šçŸ¥ã‚’一時的ã«å—ã‘付ã‘ãªã„よã†ã«ã™ã‚‹ã«ã¯ã€ã€Œã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ãƒˆã€>「通知をå—ã‘ãªã„ã€ã‚’使用ã—ã¾ã™ã€‚ + 一時的ã«ã™ã¹ã¦ã®é€šçŸ¥ã‚’åœæ¢ã™ã‚‹ã«ã¯ã€ã€Œã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã€ > 「ç€ä¿¡æ‹’å¦]を使用ã—ã¾ã™ã€‚ </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> - 音ã®å†ç”Ÿ: + サウンドをå†ç”Ÿ: </text> <check_box label="æ–°ã—ã„会話" name="new_conversation"/> - <check_box label="ボイスコールã®ç€ä¿¡" name="incoming_voice_call"/> - <check_box label="テレãƒãƒ¼ãƒˆã‚’渡ã™" name="teleport_offer"/> - <check_box label="アイテムã®ã‚ªãƒ•ァー" name="inventory_offer"/> + <check_box label="å—信音声コール" name="incoming_voice_call"/> + <check_box label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹" name="teleport_offer"/> + <check_box label="インベントリをé€ã‚‹" name="inventory_offer"/> </panel> - <panel> - <button label="ãƒã‚°ã®ã‚¯ãƒªã‚¢..." name="clear_log"/> - <button label="テã‚ストã®å‰Šé™¤..." name="delete_transcripts"/> + <panel name="log_settings"> + <button label="ãƒã‚°ã‚’消去..." name="clear_log"/> + <button label="テã‚ストãƒãƒ£ãƒƒãƒˆã‚’削除..." name="delete_transcripts"/> <button label="å‚ç…§..." label_selected="å‚ç…§" name="log_path_button"/> </panel> <button label="ä»–ã®è¨€èªž..." name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml index 1786b4befc9925829a645a39f4cd9d303501e84c..15017e330e42171a0819bf146c6c17a75eba61d5 100755 --- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml @@ -30,7 +30,7 @@ <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="UseLightShaders"/> <check_box initial_value="true" label="アンビエントオクルージョン" name="UseSSAO"/> <check_box initial_value="true" label="フィールドã®é 近感" name="UseDoF"/> <text name="shadows_label"> diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml index d90a1632ab6172cef0b93fbb1d93aeec8855bb0a..2c0359cb1561b703943e8a0fbafbd7beb3b0231c 100755 --- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml @@ -29,6 +29,7 @@ <combo_box.item label="自動的ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«" name="Install_automatically"/> <combo_box.item label="手動ã§ã‚¢ãƒƒãƒ—デートをダウンãƒãƒ¼ãƒ‰&インストール" name="Install_manual"/> </combo_box> + <check_box label="release candidate ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™" name="update_willing_to_test"/> <text name="Proxy Settings:"> プãƒã‚ã‚·è¨å®šï¼š </text> diff --git a/indra/newview/skins/default/xui/ja/panel_script_ed.xml b/indra/newview/skins/default/xui/ja/panel_script_ed.xml index 14d55002a386af0637085f1b4a611626aa01c8f6..b6d51085eb33b292ddc1c656292d90f977a0fa09 100755 --- a/indra/newview/skins/default/xui/ja/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/ja/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/> <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/> <menu_item_call label="検索 / å†é…ç½®..." name="Search / Replace..."/> + <menu_item_call label="行ã«ç§»å‹•..." name="Go to line..."/> </menu> <menu label="ヘルプ" name="Help"> <menu_item_call label="ヘルプ..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/ja/panel_tools_texture.xml b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..34763f78c12a5ab785a62d5e8ab91fd94361de91 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="テクスãƒãƒ£" name="Texture"> + <panel.string name="string repeats per meter"> + メーターã”ã¨ã«ç¹°ã‚Šè¿”ã™ + </panel.string> + <panel.string name="string repeats per face"> + é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™ + </panel.string> + <text name="color label"> + 色 + </text> + <color_swatch label="" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> + <text name="color trans"> + é€éŽåº¦ % + </text> + <text name="glow label"> + ã‚°ãƒãƒ¼ + </text> + <check_box label="明るã•全開" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="æè³ª" name="Materials"/> + <combo_box.item label="メディア" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="テクスãƒãƒ£ (æ‹¡æ•£)" name="Texture (diffuse)"/> + <combo_box.item label="凹凸 (標準)" name="Bumpiness (normal)"/> + <combo_box.item label="è¼ã (åå°„)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="テクスãƒãƒ£" name="texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <text name="label alphamode"> + アルファモード + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="アルファブレンディング" name="Alpha blending"/> + <combo_box.item label="アルファマスã‚ング" name="Alpha masking"/> + <combo_box.item label="放射状マスク" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + マスクカットオフ + </text> + <texture_picker label="テクスãƒãƒ£" name="bumpytexture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <text name="label bumpiness"> + 凹凸 + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="明るã•" name="Brightness"/> + <combo_box.item label="æš—ã•" name="Darkness"/> + <combo_box.item label="木目調" name="woodgrain"/> + <combo_box.item label="ãƒãƒ¼ã‚¯" name="bark"/> + <combo_box.item label="レンガ" name="bricks"/> + <combo_box.item label="å¸‚æ¾æ¨¡æ§˜" name="checker"/> + <combo_box.item label="コンクリート" name="concrete"/> + <combo_box.item label="å …ã„タイル" name="crustytile"/> + <combo_box.item label="カットストーン" name="cutstone"/> + <combo_box.item label="円æ¿" name="discs"/> + <combo_box.item label="å°çŸ³" name="gravel"/> + <combo_box.item label="ペトリ皿" name="petridish"/> + <combo_box.item label="サイディング" name="siding"/> + <combo_box.item label="ストーンタイル" name="stonetile"/> + <combo_box.item label="化粧ã—ã£ãã„" name="stucco"/> + <combo_box.item label="サクション" name="suction"/> + <combo_box.item label="ウィーブ" name="weave"/> + </combo_box> + <texture_picker label="テクスãƒãƒ£" name="shinytexture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/> + <text name="label shininess"> + è¼ã + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="ãªã—" name="None"/> + <combo_box.item label="低" name="Low"/> + <combo_box.item label="ä¸" name="Medium"/> + <combo_box.item label="高" name="High"/> + </combo_box> + <text name="label glossiness"> + 光沢度 + </text> + <text name="label environment"> + 環境 + </text> + <text name="label shinycolor"> + 色 + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/> + <text name="media_info"> + é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã® URL ãŒã‚‚ã—ã‚れã°ã€ã“ã“ã«å…¥ã‚Šã¾ã™ + </text> + <button label="é¸æŠž..." name="add_media" tool_tip="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’è¿½åŠ ã—ã¾ã™"/> + <button label="削除" name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/> + <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã‚‹ï¼ˆæœ€åˆã«èªã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/> + <text name="tex gen"> + マッピング + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="デフォルト" name="Default"/> + <combo_box.item label="å¹³é¢" name="Planar"/> + </combo_box> + <spinner label="水平スケール" name="TexScaleU"/> + <spinner label="垂直スケール" name="TexScaleV"/> + <spinner label="メーターã”ã¨ã«ç¹°ã‚Šè¿”ã™" name="rptctrl"/> + <spinner label="回転度" name="TexRot"/> + <spinner label="水平オフセット" name="TexOffsetU"/> + <spinner label="垂直オフセット" name="TexOffsetV"/> + <spinner label="水平スケール" name="bumpyScaleU"/> + <spinner label="垂直スケール" name="bumpyScaleV"/> + <spinner label="回転度" name="bumpyRot"/> + <spinner label="水平オフセット" name="bumpyOffsetU"/> + <spinner label="垂直オフセット" name="bumpyOffsetV"/> + <spinner label="水平スケール" name="shinyScaleU"/> + <spinner label="垂直スケール" name="shinyScaleV"/> + <spinner label="回転度" name="shinyRot"/> + <spinner label="水平オフセット" name="shinyOffsetU"/> + <spinner label="垂直オフセット" name="shinyOffsetV"/> + <check_box initial_value="false" label="å¹³é¢ã‚’æƒãˆã‚‹" name="checkbox planar align" tool_tip="é¸æŠžé¢å…¨ã¦ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’ã€æœ€å¾Œã«é¸æŠžã•れãŸé¢ã«æƒãˆã¾ã™ã€‚å¹³é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒžãƒƒãƒ”ングãŒå¿…è¦ã§ã™ã€‚"/> +</panel> diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml index 896ed556ae4de38d4515b216837dec531081fdd8..5c2e18df03f67f83fa242403f4b5fe2df0a6a5c4 100755 --- a/indra/newview/skins/default/xui/ja/role_actions.xml +++ b/indra/newview/skins/default/xui/ja/role_actions.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚åŠ ã‚’èªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership"> <action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「招待ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’招待ã—ã¾ã™ã€‚" name="member invite" value="1"/> @@ -25,7 +25,7 @@ </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã« TP ルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity"> <action description="ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã‚’切り替ãˆã‚«ãƒ†ã‚´ãƒªã‚’è¨å®š" longdescription="ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–ã§åŒºç”»ã®ã‚«ãƒ†ã‚´ãƒªã‚’è¨å®šã—ã¾ã™ã€‚" name="land find places" value="17"/> - <action description="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨å®šã‚’変更" longdescription="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨å®šã‚’変更ã—ã¾ã™ã€‚ ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land change identity" value="18"/> + <action description="区画åã€èª¬æ˜Žã€ãŠã‚ˆã³ã€ŒModerate コンテンツã€è¨å®šã‚’変更" longdescription="区画åã€èª¬æ˜Žã€ãŠã‚ˆã³ã€ŒModerate コンテンツã€è¨å®šã‚’変更ã—ã¾ã™ã€‚ã€ŒåœŸåœ°æƒ…å ±ã€ > 「オプションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land change identity" value="18"/> <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’è¨å®š" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’è¨å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’è¨å®šã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/> </action_set> <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€éŸ³æ¥½ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨å®šãªã©ã€åŒºç”»ã®ã‚ªãƒ—ションã«é–¢é€£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index b27904c4d74228d989b796d90fd57c0a181f0f1d..a0f45e5a55d331a76d75f02a166bc9d94257bbbb 100755 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> ãŠä½¿ã„ã®å¤ã„ビューワã§ã¯ Second Life ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。以下ã®ãƒšãƒ¼ã‚¸ã‹ã‚‰æ–°ã—ã„ビューワをダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã•ã„: http://secondlife.com/download @@ -448,6 +451,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="SLappAgentRequestFriend"> フレンド登録リクエスト </string> + <string name="SLappAgentRemoveFriend"> + フレンドã®å‰Šé™¤ + </string> <string name="BUTTON_CLOSE_DARWIN"> é–‰ã˜ã‚‹ (⌘W) </string> @@ -838,6 +844,9 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="multiple_textures"> 複数 </string> + <string name="use_texture"> + テクスãƒãƒ£ã‚’使用 + </string> <string name="texture_loading"> ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </string> @@ -937,6 +946,21 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="TeleportYourAgent"> ã‚ãªãŸã‚’テレãƒãƒ¼ãƒˆ </string> + <string name="JoinAnExperience"> + 体験ã«å‚åŠ ã™ã‚‹ + </string> + <string name="SilentlyManageEstateAccess"> + 土地ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’管ç†ã™ã‚‹ã¨ãã«ã‚¢ãƒ©ãƒ¼ãƒˆã‚’表示ã—ãªã„ + </string> + <string name="OverrideYourAnimations"> + デフォルトã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ç½®ãæ›ãˆ + </string> + <string name="ScriptReturnObjects"> + ã‚ãªãŸã®ä»£ã‚りã«ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’è¿”å´ + </string> + <string name="UnknownScriptPermission"> + (䏿˜Ž)! + </string> <string name="SIM_ACCESS_PG"> General </string> @@ -1250,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 @@ -1968,6 +1992,12 @@ support@secondlife.com ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。 <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD(å³ä¸‹ï¼‰ </string> + <string name="ATTACH_NECK"> + 首 + </string> + <string name="ATTACH_AVATAR_CENTER"> + ã‚¢ãƒã‚¿ãƒ¼ã®ä¸å¤® + </string> <string name="CursorPos"> [LINE] 行目ã€[COLUMN] 列目 </string> @@ -2997,6 +3027,9 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã <string name="Hip Width"> è…°ã®å¹… </string> + <string name="Hover"> + ホãƒãƒ¼ + </string> <string name="In"> 内å‘ã </string> @@ -5081,4 +5114,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã <string name="logging_calls_enabled_log_empty"> ãƒã‚°ã‚¤ãƒ³æ™‚ã®ä¼šè©±ã¯ã‚りã¾ã›ã‚“。誰ã‹ã«ã”連絡ã—ãŸå¾Œã€ã¾ãŸã¯èª°ã‹ãŒã‚ãªãŸã«é€£çµ¡ã—ãŸå¾Œã€ãƒã‚°ã‚¨ãƒ³ãƒˆãƒªãŒã“ã“ã«è¡¨ç¤ºã•れã¾ã™ã€‚ </string> + <string name="loading_chat_logs"> + ãƒãƒ¼ãƒ‰ä¸... + </string> </strings> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 9e6fed838764667ce242b701813c3d0d59c2adb3..69d5c23f9c8dc82385cfc9b572485574b56680cb 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 f2beef091a413646edb99fefe1b43d950a79af0c..4cd271a14125868d8418b2c4db77f39a3d0624ec 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 fa0a5981a8711f62b775bf2f231710522d54790b..b663e182278bd38c7125f0bb72bd61726c37ab7d 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_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml index d08926634208f1442c31cf58c7d69f83f8993413..47975a6386a88790235c658a534f62fda1e8266e 100755 --- a/indra/newview/skins/default/xui/pt/floater_about.xml +++ b/indra/newview/skins/default/xui/pt/floater_about.xml @@ -7,7 +7,9 @@ ConstruÃdo com [COMPILER] versão [COMPILER_VERSION] </floater.string> <floater.string name="AboutPosition"> - Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em [HOSTNAME]</nolink>([HOSTIP]) + Você está em [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] em [REGION] localizado em <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(coordenadas globais [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml index 8823d04b624616ec23ad91ca4ba43a8215fd3588..998fa8b2d6df778f8d7dcccb8238c9a2ca3fd21f 100755 --- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="EDITAR AUTORIZAÇÕES DE CONTEÚDO"> +<floater name="floaterbulkperms" title="AJUSTAR PERMISSÕES DE CONTEÚDO"> <floater.string name="nothing_to_modify_text"> A seleção não contém nenhum conteúdo editável. </floater.string> @@ -33,7 +33,7 @@ <button label="Tudo" label_selected="Todas" name="check_all"/> <button label="Limpar" label_selected="Nenhuma" name="check_none"/> <text name="newperms"> - Novas autorizações de conteúdo + Ajustar permissões de conteúdo para </text> <text name="GroupLabel"> Grupo: @@ -49,6 +49,7 @@ <check_box label="Modificar" name="next_owner_modify"/> <check_box label="Copiar" name="next_owner_copy"/> <check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/> - <button label="OK" name="apply"/> + <button label="OK" name="ok"/> + <button label="Aplicar" name="apply"/> <button label="Cancelar" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_goto_line.xml b/indra/newview/skins/default/xui/pt/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..f2ef825ba08570fbc8e2e7e1640845363dcd0aff --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="IR PARA A LINHA"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Ir para a linha + </text> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml index 9f6a7a06ad0545d94af892d3ba670d04cb0dff98..e592b14fa7ec999c1d795d7edc84de97c4aba01c 100755 --- a/indra/newview/skins/default/xui/pt/floater_im_session.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Traduzir bate-papo" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Traduzir conversa" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml index d04cf2a173c92556db45252d9f41dd1cfe5cd0b8..182f2513e0c6f0e413aae43ef1687fb423cac842 100755 --- a/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/pt/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Exibir: </text> - <check_box label="Testar" name="show_world"/> + <check_box label="Mundo" name="show_world"/> <check_box label="Apenas móveis" name="show_world_movables_only"/> <check_box label="Navmesh" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 8c245c582e227d04b0346372fdaeb8d4a218f913..66c14cdecfeb02277dbf0f11d1fdccd8a17f406c 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml index cfd69158bca1d8df952cac54ef469299e22f4cd5..61953f9f786835ab91c6d8f67eb1d8d893f89c32 100755 --- a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Congelar" name="Freeze..."/> <menu_item_call label="Ejetar" name="Eject..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Descartar XML" name="Dump XML"/> <menu_item_call label="Mais zoom" name="Zoom In"/> <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Perfil do objeto" name="Object Inspect"/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml index 5b32784c32303f2b43a8946ebf9e625424ac352f..2d4cd670e69198ac06d2502bff17316ad54621ea 100755 --- a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Meus grupos" name="Groups..."/> <menu_item_call label="Meu perfil" name="Profile..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Descartar XML" name="Dump XML"/> <menu_item_call label="Largar" name="Drop"/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml index a4a26144c7974061f046863b7da722af65a25d8d..1af8d64438cb128ff02a241262de77189557ee1a 100755 --- a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Congelar" name="Freeze..."/> <menu_item_call label="Ejetar" name="Eject..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Descartar XML" name="Dump XML"/> <menu_item_call label="Mais zoom" name="Zoom In"/> <menu_item_call label="Pagar" name="Pay..."/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml index e84dcb093db4ada7713438e0387f19c2af544264..447b77657bfba86b13319a23a74c063b7cbbafd4 100755 --- a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Meus grupos" name="Groups..."/> <menu_item_call label="Meu perfil" name="Profile..."/> <menu_item_call label="Depurar texturas" name="Debug..."/> + <menu_item_call label="Descartar XML" name="Dump XML"/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_conversation.xml b/indra/newview/skins/default/xui/pt/menu_conversation.xml index 01316b887d4b17c83b4ef82608a75e4f72507f40..2dd150a61efe780b05377f5f9d93e0706ef38269 100644 --- a/indra/newview/skins/default/xui/pt/menu_conversation.xml +++ b/indra/newview/skins/default/xui/pt/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Encerrar conversa" name="close_conversation"/> <menu_item_call label="Abrir conversa de voz" name="open_voice_conversation"/> <menu_item_call label="Desconectar de voz" name="disconnect_from_voice"/> + <menu_item_call label="Fechar selecionados" name="close_selected_conversations"/> <menu_item_call label="Exibir perfil" name="view_profile"/> <menu_item_call label="MI" name="im"/> <menu_item_call label="Oferecer teletransporte" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/pt/menu_land.xml b/indra/newview/skins/default/xui/pt/menu_land.xml index 9182ce321afab21db6190f0e29a8afec9dc4a70d..2ebe85df6e388f353e89fb400f41c7178b7ba016 100755 --- a/indra/newview/skins/default/xui/pt/menu_land.xml +++ b/indra/newview/skins/default/xui/pt/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Comprar passe" name="Land Buy Pass"/> <menu_item_call label="Construir" name="Create"/> <menu_item_call label="Editar a topografia" name="Edit Terrain"/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml index be94ad49dbeba0f08598de1764b9f4cb3e583f26..cd840f3137f475fe64cac711dd9e66a507430eec 100755 --- a/indra/newview/skins/default/xui/pt/menu_login.xml +++ b/indra/newview/skins/default/xui/pt/menu_login.xml @@ -17,7 +17,13 @@ <menu_item_call label="Mostrar TOS" name="TOS"/> <menu_item_call label="Mostrar mensagem crÃtica" name="Critical"/> <menu_item_call label="Test de Bugs de Conteúdo Web" name="Web Content Floater Debug Test"/> - <menu label="Configurar nÃvel de registro em log" name="Set Logging Level"/> + <menu label="Configurar nÃvel de registro em log" name="Set Logging Level"> + <menu_item_check label="Depurar" name="Debug"/> + <menu_item_check label="Info" name="Info"/> + <menu_item_check label="Aviso" name="Warning"/> + <menu_item_check label="Erro" name="Error"/> + <menu_item_check label="Nenhum" name="None"/> + </menu> <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/> <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/pt/menu_mute_particle.xml b/indra/newview/skins/default/xui/pt/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..be13c66d7a71284fae2cdd63c314b3cb2bb03aeb --- /dev/null +++ b/indra/newview/skins/default/xui/pt/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml index 28dd9febe244513166d6e009f84f416f851de10f..a552a5de5aa4d5f0f98b39c9f29bfb40064bf4cb 100755 --- a/indra/newview/skins/default/xui/pt/menu_object.xml +++ b/indra/newview/skins/default/xui/pt/menu_object.xml @@ -5,13 +5,13 @@ </menu_item_call> <menu_item_call label="Editar" name="Edit..."/> <menu_item_call label="Construir" name="Build"/> - <menu_item_call label="Exibir em linksets" name="show_in_linksets"/> - <menu_item_call label="Exibir em personagens" name="show_in_characters"/> <menu_item_call label="Abrir" name="Open"/> <menu_item_call label="Sentar aqui" name="Object Sit"/> <menu_item_call label="Ficar de pé" name="Object Stand Up"/> <menu_item_call label="Perfil do objeto" name="Object Inspect"/> <menu_item_call label="Mais zoom" name="Zoom In"/> + <menu_item_call label="Exibir em linksets" name="show_in_linksets"/> + <menu_item_call label="Exibir em personagens" name="show_in_characters"/> <context_menu label="Colocar no(a)" name="Put On"> <menu_item_call label="Vestir" name="Wear"/> <menu_item_call label="Adicionar" name="Add"/> @@ -28,4 +28,5 @@ <menu_item_call label="Pagar" name="Pay..."/> <menu_item_call label="Comprar" name="Buy..."/> <menu_item_call label="Excluir" name="Delete"/> + <menu_item_call label="Bloquear proprietário da partÃcula" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml index aa0a42640543f4bb6156045a366b1f7cff39c50c..102df18b28c9a5c39e0fc71c55db3b02418a5bcb 100755 --- a/indra/newview/skins/default/xui/pt/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Exibir perfil" name="show_agent"/> <menu_item_call label="Enviar MI..." name="send_im"/> <menu_item_call label="Adicionar amigo..." name="add_friend"/> + <menu_item_call label="Remover amigo..." name="remove_friend"/> <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/> <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml index 247a92567af84a4dfb2d769db8546d967d45e0df..2cd0f52ef31cf23b87b22ff914150525d55b17d5 100755 --- a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Perfil do objeto..." name="show_object"/> + <menu_item_call label="Bloquear..." name="block_object"/> <menu_item_call label="Mostrar no mapa" name="show_on_map"/> <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/> <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 15814fed4cfe8015c5ef1f03f28bb22d76d1c3a8..e6eceb5f2fd689e3b76ce09a7506c79757df57c1 100755 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> <menu_item_call label="Andar/correr/voar..." name="Walk / run / fly"/> </menu> - <menu label="Status" name="Status"/> + <menu label="Status" name="Status"> + <menu_item_check label="Ausente" name="Away"/> + <menu_item_check label="Não perturbe" name="Do Not Disturb"/> + </menu> <menu_item_call label="Comprar L$..." name="Buy and Sell L$"/> <menu_item_call label="Caixa de saÃda do lojista..." name="MerchantOutbox"/> <menu_item_call label="Painel da conta..." name="Manage My Account"> @@ -32,6 +35,7 @@ <menu_item_check label="Conversas..." name="Conversations"/> <menu_item_check label="Bate-papo local..." name="Nearby Chat"/> <menu_item_check label="Falar" name="Speak"/> + <menu_item_check label="Registro de conversas..." name="Conversation Log..."/> <menu label="Distorção de voz" name="VoiceMorphing"> <menu_item_check label="Não distorcer voz" name="NoVoiceMorphing"/> <menu_item_check label="Visualizar..." name="Preview"/> @@ -42,6 +46,7 @@ <menu_item_check label="Grupos" name="My Groups"/> <menu_item_check label="Pessoas próximas" name="Active Speakers"/> <menu_item_call label="Lista de bloqueados" name="Block List"/> + <menu_item_check label="Não perturbe" name="Do Not Disturb"/> </menu> <menu label="Mundo" name="World"> <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/> @@ -110,6 +115,7 @@ <menu_item_call label="Incluir próxima parte" name="Include Next Part"/> <menu_item_call label="Incluir parte anterior" name="Include Previous Part"/> </menu> + <menu_item_call label="Linksets..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Enfocar seleção" name="Focus on Selection"/> <menu_item_call label="Ampliar seleção" name="Zoom to Selection"/> <menu label="Objeto:" name="Object"> @@ -273,6 +279,7 @@ <menu_item_check label="Camera Offset" name="Camera Offset"/> <menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/> <menu_item_check label="Frame Test" name="Frame Test"/> + <menu_item_call label="Perfil do quadro" name="Frame Profile"/> </menu> <menu label="Render Metadata" name="Render Metadata"> <menu_item_check label="Normais" name="Normals"/> @@ -293,15 +300,15 @@ </menu> <menu label="Rendering" name="Rendering"> <menu_item_check label="Axes" name="Axes"/> + <menu_item_call label="Informações sobre o material selecionado" name="Selected Material Info"/> <menu_item_check label="Wireframe" name="Wireframe"/> - <menu_item_check label="Iluminação e sombras" name="Advanced Lighting Model"/> + <menu_item_check label="Modelo avançado de luzes" name="Advanced Lighting Model"/> <menu_item_check label="Sombras da projeção do sol/lua" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO e sombra suave" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Máscaras alpha automáticas (adiadas)" name="Automatic Alpha Masks (deferred)"/> <menu_item_check label="Máscaras alpha automáticas (sem adiar)" name="Automatic Alpha Masks (non-deferred)"/> <menu_item_check label="Texturas de animação" name="Animation Textures"/> <menu_item_check label="Desativar texturas" name="Disable Textures"/> - <menu_item_check label="Atlas texturizado (fase experimental)" name="Texture Atlas"/> <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/> <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/> <menu_item_check label="Objetos iridescentes" name="Hover Glow Objects"/> @@ -320,7 +327,6 @@ <menu_item_call label="Teste de mÃdia do navegador" name="Web Browser Test"/> <menu_item_call label="Navegador de conteúdo web" name="Web Content Browser"/> <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> - <menu_item_call label="Dados de memória" name="Memory Stats"/> <menu_item_check label="Console de depuração de região" name="Region Debug Console"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index d9f5e48745d3f380a1bce18719259c8439dc2a88..d5096ec85864c9370bfdfbfc27a6e3b1f36bc221 100755 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -209,6 +209,14 @@ Qualquer membro numa função com esta habilidade, pode atribuir a sà mesmo -- Adicionar esta habilidade a '[ROLE_NAME]'? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> + <notification name="EjectGroupMemberWarning"> + Você está prestes a expulsar [AVATAR_NAME] do grupo. + <usetemplate ignoretext="Confirmar expulsão de um participante do grupo" name="okcancelignore" notext="Cancelar" yestext="Expulsar"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Você está prestes a expulsar [COUNT] membros do grupo. + <usetemplate ignoretext="Confirmar expulsão de diversos membros do grupo" name="okcancelignore" notext="Cancelar" yestext="Expulsar"/> + </notification> <notification name="AttachmentDrop"> Você está prestes a largar seu anexo. Tem certeza de que quer prosseguir? @@ -1105,9 +1113,9 @@ em TODOS OS TERRENOS deste sim? Por favor, insira um valor maior. </notification> <notification name="ConfirmItemDeleteHasLinks"> - Pelo menos um dos itens possui links que levam a ele. Ao excluir o item, os links não funcionarão mais. Por isso, recomendamos excluir os links primeiro. + Pelo menos um dos itens possui links que levam a ele. Ao excluir o item, os links não funcionarão mais. Por isso, recomendamos excluir os links primeiro. -Tem certeza de que quer excluir estes items? +Tem certeza de que quer excluir estes itens? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmObjectDeleteLock"> @@ -1123,9 +1131,9 @@ Tem certeza de que deseja apagar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmObjectDeleteNoOwn"> - Você não é proprietário de pelo menos um dos itens selecionados. + Ao menos um dos itens selecionados não é seu. -Tem certeza de que deseja apagar estes itens? +Tem certeza de que quer excluir estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopy"> @@ -1135,22 +1143,26 @@ Tem certeza de que deseja apagar estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmObjectDeleteLockNoOwn"> - Pelo menos um dos objetos está trancado ou não é de sua posse. + Ao menos um objeto está bloqueado. +Ao menos um objeto não é seu. -Tem certeza de que deseja apagar estes itens? +Tem certeza de que quer excluir estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmObjectDeleteNoCopyNoOwn"> - Pelo menos um dos objetos não é copiável ou não é de sua posse. + Ao menos um objeto não é copiável. +Ao menos um objeto não é seu. -Tem certeza de que deseja apagar estes itens? +Tem certeza de que quer excluir estes itens? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="ConfirmObjectDeleteLockNoCopyNoOwn"> - Pelo menos um dos objetos está trancado, não é copiável ou você não o possui. + Ao menos um objeto está bloqueado. +Ao menos um objeto não é copiável. +Ao menos um objeto não é seu. -Tem certeza de que deseja apagar estes itens? - <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> +Tem certeza de que quer excluir estes itens? + <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/> </notification> <notification name="ConfirmObjectTakeLock"> Pelo menos um dos objetos está trancado. @@ -1468,13 +1480,43 @@ Versão [VERSION] [[RELEASE_NOTES_FULL_URL] sobre esta atualização] </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> O software requer uma atualização que já foi baixada. -Versão [VERSION] +Versão [VERSION] Informação [[INFO_URL] sobre essa atualização] Para instalar a atualização, será preciso reiniciar o [APP_NAME]. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> Para instalar a atualização, será preciso reiniciar o [APP_NAME]. +Informação [[INFO_URL] sobre essa atualização] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + Baixamos uma atualização para a instalação do [APP_NAME]. +Versão [VERSION] +O visualizador experimental foi substituÃdo por um visualizador [NEW_CHANNEL]; +consulte [[INFO_URL] para obter mais detalhes sobre essa atualização] + <usetemplate name="okcancelbuttons" notext="Depois..." yestext="Instalar agora e reiniciar o [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + Baixamos uma atualização para a instalação do [APP_NAME]. +Versão [VERSION] +O visualizador experimental foi substituÃdo por um visualizador [NEW_CHANNEL]; +consulte a informação [[INFO_URL] sobre essa atualização] + <usetemplate name="okcancelbuttons" notext="Depois..." yestext="Instalar agora e reiniciar o [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + O software requer uma atualização que já foi baixada. +Versão [VERSION] +O visualizador experimental foi substituÃdo por um visualizador [NEW_CHANNEL]; +consulte a informação [[INFO_URL] sobre essa atualização] + +Para instalar a atualização, será preciso reiniciar o [APP_NAME]. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Para instalar a atualização, será preciso reiniciar o [APP_NAME]. +O visualizador experimental foi substituÃdo por um visualizador [NEW_CHANNEL]; +consulte a informação [[INFO_URL] sobre essa atualização] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1524,6 +1566,10 @@ Para instalar a atualização, será preciso reiniciar o [APP_NAME]. Você é atualmente um membro do grupo <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Não foi possÃvel deixar o grupo. Você não pode deixar o grupo pois é o último proprietário dele. Primeiramente, atribua outro membro à função de proprietário. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> Tem CERTEZA de que deseja expulsar todos os residentes do grid? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Chutar todos"/> @@ -2384,9 +2430,7 @@ Selecione só um objeto. e selecionar 'Teletransportar'.) </notification> <notification name="TeleportToPerson"> - Para entrar em contato com residentes como '[NAME]', clique no botão "Pessoas", selecione um residente na janela que é exibida e clique em 'MI' na - parte inferior da janela. - (Também é possÃvel clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar 'MI'.) + Para iniciar uma conversa particular com alguém, clique com o botão direito no avatar e selecione "MI" no menu. </notification> <notification name="CantSelectLandFromMultipleRegions"> ImpossÃvel selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra. @@ -2757,6 +2801,15 @@ Não conceda acesso se você não entender completamente por que ele deseja aces <button name="Deny" text="Negar"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + A permissão de script de tempo de execução solicitada por '<nolink>[OBJECTNAME]</nolink>', um objeto de '[NAME]', não é reconhecida pelo visualizador e não pode ser concedida. + +Para conceder essa permissão, atualize seu visualizador para a versão mais recente em [DOWNLOADURL]. + <form name="form"> + <button name="Deny" text="Ok"/> + <button name="Mute" text="Bloquear"/> + </form> + </notification> <notification name="ScriptDialog"> '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index babb48c208f30609ebe6eda2b987881af0076c1a..205fd6b97dd4d09ecfed74f3c74a7705ce3dfbb0 100755 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -49,6 +49,9 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <menu_button name="plus_btn" tool_tip="Entrar em um grupo/Criar novo grupo"/> <dnd_button name="minus_btn" tool_tip="Sair do grupo selecionado"/> </panel> + <text name="groupcount"> + Você pertence a [COUNT] grupos e pode entrar em mais [REMAINING]. + </text> </panel> <panel label="RECENTE" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index baf14c2c23f985ae9f3c5f645209a4605ec3355e..89f1e076479fddb758d341dde452bbfdeed0e2f6 100755 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Chat" name="chat"> - <panel> - <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> - <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> + <panel name="general_chat_settings"> + <check_box initial_value="true" label="Executar animação de digitação durante o bate-papo" name="play_typing_animation"/> + <check_box label="Envie MIs por email quando eu estiver desconectado" name="send_im_to_email"/> <check_box label="Apenas amigos e grupos podem me ligar ou enviar MIs" name="voice_call_friends_only_check"/> <text name="font_size"> Tamanho da fonte: @@ -12,62 +12,74 @@ <item label="Médio" name="Medium" value="1"/> <item label="Grande" name="Large" value="2"/> </combo_box> - <check_box label="Balão de bate-papo" name="bubble_text_chat"/> + <check_box label="Balão de conversa" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Notificações - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> MIs de amigos: </text> <combo_box name="FriendIMOptions"> <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> - <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> - <item label="Nenhum" name="None" value="none"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Executar som" name="play_sound_friend_im"/> <text name="non_friend_ims"> MIs de não amigos: </text> <combo_box name="NonFriendIMOptions"> <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> - <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> - <item label="Nenhum" name="None" value="none"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Executar som" name="play_sound_non_friend_im"/> <text name="conference_ims"> MIs de conferências: </text> <combo_box name="ConferenceIMOptions"> <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> - <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> - <item label="Nenhum" name="None" value="none"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Executar som" name="play_sound_conference_im"/> <text name="group_chat"> - Bate-papo de grupo: + Conversa em grupo: </text> <combo_box name="GroupChatOptions"> <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> - <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="flash"/> - <item label="Nenhum" name="None" value="none"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolbarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Executar som" name="play_sound_group_chat_im"/> <text name="nearby_chat"> - Bate-papo local: + Conversa local: </text> <combo_box name="NearbyChatOptions"> <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> - <item label="Abrir pop up com mensagem" name="PopUpMessage" value="toast"/> - <item label="Piscar botão da barra de ferramentas" name="FlashToolBarButton" value="flash"/> - <item label="Nenhum" name="None" value="none"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolBarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Executar som" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + MIs de objetos: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Abrir janela Conversas" name="OpenConversationsWindow" value="openconversations"/> + <item label="Abrir pop up com mensagem" name="PopUpMessage" value="avisos"/> + <item label="Piscar botão da barra de ferramentas" name="FlashToolBarButton" value="piscar"/> + <item label="Nenhuma ação" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Executar som" name="play_sound_object_im"/> <text name="notifications_alert"> Para interromper temporariamente todas as notificações, use Comunicar > Não perturbe. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Executar som: </text> @@ -76,7 +88,7 @@ <check_box label="Oferta de teletransporte" name="teleport_offer"/> <check_box label="Oferta de inventário" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="Limpar registro..." name="clear_log"/> <button label="Excluir transcrições..." name="delete_transcripts"/> <button label="Procurar..." label_selected="Procurar" name="log_path_button"/> 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 28e71843267de71f36b0901b07f222cb45e0e4d1..756e345cb8c437909537a9fdc677728132bd1199 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="Iluminação e sombras" 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 ebbd63138a59bf6dba998400c8315588f4e21532..1279e74e21dcaa759241263fa32edb26263d2687 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> @@ -29,6 +29,7 @@ <combo_box.item label="Instalar automaticamente" name="Install_automatically"/> <combo_box.item label="Baixar e instalar atualizações manualmente" name="Install_manual"/> </combo_box> + <check_box label="Disposto a atualizar para candidatos da versão" name="update_willing_to_test"/> <text name="Proxy Settings:"> Configurações de proxy: </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 d910a7b812e9a0e782cbad0c27f3d4a0c4de951d..fff5fd700579be2ac80588e0c9d910f9460a2342 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/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml index de02aafe2fd1aaf8f5cd01875438f04e77e2bff4..39bb5edc754b46f387a2905672dcc8ccc449db69 100755 --- a/indra/newview/skins/default/xui/pt/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Selecionar tudo" name="Select All"/> <menu_item_call label="Desmarcar" name="Deselect"/> <menu_item_call label="Buscar / Substituir..." name="Search / Replace..."/> + <menu_item_call label="Ir para a linha..." name="Go to line..."/> </menu> <menu label="Ajuda" name="Help"> <menu_item_call label="ajuda..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/pt/panel_tools_texture.xml b/indra/newview/skins/default/xui/pt/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..03da89dd3bc79484c78e741edafad2f3e5d8cc20 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Textura" name="Texture"> + <panel.string name="string repeats per meter"> + Repetições por metro + </panel.string> + <panel.string name="string repeats per face"> + Repetições por face + </panel.string> + <text name="color label"> + Cor + </text> + <color_swatch label="" name="colorswatch" tool_tip="Selecionar a cor"/> + <text name="color trans"> + % de transparência + </text> + <text name="glow label"> + Brilho + </text> + <check_box label="Completamente luminoso" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Materiais" name="Materials"/> + <combo_box.item label="MÃdia" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Textura (difusa)" name="Texture (diffuse)"/> + <combo_box.item label="Relevo (normal)" name="Bumpiness (normal)"/> + <combo_box.item label="Brilho (especular)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Textura" name="texture control" tool_tip="Selecionar imagem"/> + <text name="label alphamode"> + Modo alpha + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Nenhum" name="None"/> + <combo_box.item label="Mistura alpha" name="Alpha blending"/> + <combo_box.item label="Máscara alpha" name="Alpha masking"/> + <combo_box.item label="Máscara emissiva" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + Corte da máscara + </text> + <texture_picker label="Textura" name="bumpytexture control" tool_tip="Selecionar imagem"/> + <text name="label bumpiness"> + Relevo + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Nenhum" name="None"/> + <combo_box.item label="Luminosidade" name="Brightness"/> + <combo_box.item label="Escuridão" name="Darkness"/> + <combo_box.item label="grão de madeira" name="woodgrain"/> + <combo_box.item label="casca de árvore" name="bark"/> + <combo_box.item label="tijolos" name="bricks"/> + <combo_box.item label="quadriculado" name="checker"/> + <combo_box.item label="concreto" name="concrete"/> + <combo_box.item label="ladrilho rÃspido" name="crustytile"/> + <combo_box.item label="pedra talhada" name="cutstone"/> + <combo_box.item label="discos" name="discs"/> + <combo_box.item label="cascalho" name="gravel"/> + <combo_box.item label="placa de petri" name="petridish"/> + <combo_box.item label="desvio" name="siding"/> + <combo_box.item label="ladrilho de pedra" name="stonetile"/> + <combo_box.item label="estuque" name="stucco"/> + <combo_box.item label="sucção" name="suction"/> + <combo_box.item label="tecelagem" name="weave"/> + </combo_box> + <texture_picker label="Textura" name="shinytexture control" tool_tip="Selecionar imagem"/> + <text name="label shininess"> + Brilho + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Nenhum" name="None"/> + <combo_box.item label="Baixo" name="Low"/> + <combo_box.item label="Médio" name="Medium"/> + <combo_box.item label="Alto" name="High"/> + </combo_box> + <text name="label glossiness"> + Acetinação + </text> + <text name="label environment"> + Ambiente + </text> + <text name="label shinycolor"> + Cor + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Selecionar a cor"/> + <text name="media_info"> + A URL da mÃdia escolhida, caso haja, é inserida aqui + </text> + <button label="Selecionar..." name="add_media" tool_tip="Adicionar mÃdia"/> + <button label="Remover" name="delete_media" tool_tip="Excluir esta textura de mÃdia"/> + <button label="Alinhar" label_selected="Alinhar mÃdia" name="button align" tool_tip="Alinhar texturas de mÃdia (após carregar mÃdia)"/> + <text name="tex gen"> + Mapeamento + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Padrão" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> + </combo_box> + <spinner label="Escala horizontal" name="TexScaleU"/> + <spinner label="Escala vertical" name="TexScaleV"/> + <spinner label="Repetições por metro" name="rptctrl"/> + <spinner label="Graus de rotação" name="TexRot"/> + <spinner label="Offset horizontal" name="TexOffsetU"/> + <spinner label="Offset vertical" name="TexOffsetV"/> + <spinner label="Escala horizontal" name="bumpyScaleU"/> + <spinner label="Escala vertical" name="bumpyScaleV"/> + <spinner label="Graus de rotação" name="bumpyRot"/> + <spinner label="Offset horizontal" name="bumpyOffsetU"/> + <spinner label="Offset vertical" name="bumpyOffsetV"/> + <spinner label="Escala horizontal" name="shinyScaleU"/> + <spinner label="Escala vertical" name="shinyScaleV"/> + <spinner label="Graus de rotação" name="shinyRot"/> + <spinner label="Offset horizontal" name="shinyOffsetU"/> + <spinner label="Offset vertical" name="shinyOffsetV"/> + <check_box initial_value="false" label="Alinhar planos planares" name="checkbox planar align" tool_tip="Alinhar texturas de todos os planos selecionados com o plano selecionado por último. Requer mapeamento de textura planar."/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml index 21b085431e4ad692f6ac7c581a0d832d69eae0f2..e45a3bd21f04aca8966d27538c074e30532f289b 100755 --- a/indra/newview/skins/default/xui/pt/role_actions.xml +++ b/indra/newview/skins/default/xui/pt/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem & opções de rota de TP." name="Parcel Identity"> <action description="Alternar 'Exibir nos resultados de busca' e selecionar a categoria" longdescription="Alterne entre 'Exibir nos resultados de busca' ou não, e selecione a categoria do terreno em 'Sobre o terreno'." name="land find places" value="17"/> - <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno > guia Opções." name="land change identity" value="18"/> + <action description="Alterar nome da parcela, descrição e configurações de "Conteúdo moderado"" longdescription="Altere o nome da parcela, descrição e configurações de "Conteúdo moderado". Isso é feito em Sobre o terreno > guia Opções." name="land change identity" value="18"/> <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno > aba Opções." name="land set landing point" value="19"/> </action_set> <action_set description="Estas habilidade incluem poderes que afetam opções de parcela, como 'Criar objetos', 'Editar terreno' e música & configurações de mÃdia." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 4bf18aab7059f23bf4f2c276d1a4daa61c8bf272..2eb4c0a02e07594cb393afac27cda92375f9da5e 100755 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -130,6 +130,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> O visualizador utilizado já não é compatÃvel com o Second Life. Visite a página abaixo para baixar uma versão atual: http://secondlife.com/download @@ -400,6 +403,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="SLappAgentRequestFriend"> Pedido de amizade </string> + <string name="SLappAgentRemoveFriend"> + Remoção de amigo + </string> <string name="BUTTON_CLOSE_DARWIN"> Fechar (⌘W) </string> @@ -787,6 +793,9 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="multiple_textures"> Múltiplo </string> + <string name="use_texture"> + Usar textura + </string> <string name="texture_loading"> Carregando... </string> @@ -883,6 +892,21 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="TeleportYourAgent"> Teletransportá-lo </string> + <string name="JoinAnExperience"> + Participar de uma experiência + </string> + <string name="SilentlyManageEstateAccess"> + Suprimir alertas ao gerenciar listas de acesso ao terreno + </string> + <string name="OverrideYourAnimations"> + Substituir suas animações padrão + </string> + <string name="ScriptReturnObjects"> + Retornar objetos em seu nome + </string> + <string name="UnknownScriptPermission"> + (desconhecido)! + </string> <string name="SIM_ACCESS_PG"> Público geral </string> @@ -1196,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 @@ -1908,6 +1932,12 @@ Pessoas com contas gratuitas não poderão acessar o Second Life no momento para <string name="ATTACH_HUD_BOTTOM_RIGHT"> HUD direito inferior </string> + <string name="ATTACH_NECK"> + Pescoço + </string> + <string name="ATTACH_AVATAR_CENTER"> + Centro do avatar + </string> <string name="CursorPos"> Linha [LINE], Coluna [COLUMN] </string> @@ -2894,6 +2924,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="Hip Width"> Largura do quadril </string> + <string name="Hover"> + Pairar + </string> <string name="In"> Dentro </string> @@ -4951,4 +4984,7 @@ Tente colocar o caminho do editor entre aspas. <string name="logging_calls_enabled_log_empty"> Não há conversas registradas. Depois que você entrar em contato com alguém, ou alguém entrar em contato com você, um registro será exibido aqui. </string> + <string name="loading_chat_logs"> + Carregando... + </string> </strings> diff --git a/indra/newview/skins/default/xui/ru/floater_about.xml b/indra/newview/skins/default/xui/ru/floater_about.xml index 2b2b3cf453385abf54408b2fb5c3df30fe525ab2..9494106e96fda9da2689fd476113d67f58e21d0b 100755 --- a/indra/newview/skins/default/xui/ru/floater_about.xml +++ b/indra/newview/skins/default/xui/ru/floater_about.xml @@ -9,6 +9,8 @@ </floater.string> <floater.string name="AboutPosition"> Ð’Ñ‹ в точке [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] в регионе «[REGION]», раÑположенном на <nolink>[HOSTNAME]</nolink> ([HOSTIP]) +SLURL: <nolink>[SLURL]</nolink> +(глобальные координаты [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/ru/floater_auction.xml b/indra/newview/skins/default/xui/ru/floater_auction.xml index d84dc2e941247dfc4f0f934e24100e5e0b0dcfb4..105c75c919f96bafdadd5c1806c2e16338bc286d 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 ccf13cf02abb68321879ed8c65d189be0df893a4..304bf97dc1b11721474616d37464016495f24005 100755 --- a/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ru/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="ИЗМЕÐИТЬ Ð ÐЗРЕШЕÐИЯ ÐРИСПОЛЬЗОВÐÐИЕ КОÐТЕÐТÐ"> +<floater name="floaterbulkperms" title="ÐÐСТРОИТЬ Ð ÐЗРЕШЕÐИЯ ÐРИСПОЛЬЗОВÐÐИЕ КОÐТЕÐТÐ"> <floater.string name="nothing_to_modify_text"> Ð’ выбранной облаÑти нет контента, который можно изменÑть. </floater.string> @@ -24,7 +24,7 @@ <button label="√ Ð’Ñе" name="check_all"/> <button label="ОчиÑтить" label_selected="Ðет" name="check_none"/> <text name="newperms"> - Ðовые Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° контент + ÐаÑтроить Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° иÑпользование контента: </text> <text name="GroupLabel"> Группа: @@ -39,7 +39,8 @@ </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="Следующий владелец может отдать или перепродать объект"/> - <button label="ОК" name="apply"/> + <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"/> </floater> diff --git a/indra/newview/skins/default/xui/ru/floater_goto_line.xml b/indra/newview/skins/default/xui/ru/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..51caaa471dfaa299c7a0b5eda90f3a00b19f7eca --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="ПЕРЕЙТИ ÐРСТРОКУ"> + <button label="OK" label_selected="OK" name="goto_btn"/> + <text name="txt"> + Перейти на Ñтроку + </text> +</floater> 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 43f8c364734de444741691165fefb79923367707..d7da112a273e8faef0f2a26c507b05dddb3a85f3 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_im_session.xml b/indra/newview/skins/default/xui/ru/floater_im_session.xml index ea110ffb44ac27e6096f2098a7733c986e8d436f..d4ca04b88b58c1983028f80fe6d6fa54e60e968f 100755 --- a/indra/newview/skins/default/xui/ru/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ru/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Переводить чат" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Переводить чат" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> 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 d8047fc0453b37f902cfe5fb9aa362293392e22c..fb6e747592041be29fa1c2e2463fe652e0b5df2a 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_pathfinding_console.xml b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml index 8faddb1805815d08558e837d1ed11a294f577235..fa72df04fdc1e15d4326b55cba5b49fa1c4bd771 100755 --- a/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/ru/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Показать: </text> - <check_box label="ТеÑÑ‚" name="show_world"/> + <check_box label="Мир" name="show_world"/> <check_box label="Только перемещаемые предметы" name="show_world_movables_only"/> <check_box label="ÐÐ°Ð²Ð¸Ð³Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ñетка" name="show_navmesh"/> <text name="show_walkability_label"> 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 a704b87bd1667b50aaa0374e463395c549982941..626f3c9321287f21460746ff0dafb7a1e9eecdeb 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 4eecfedf172becc2241775d8d9c49ff7837240ec..13cff2bcbe58d0978e9fb9e4de95954880aff22a 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 7db014ef53d5e7120623ef43cdaed85e03d09f46..db78d11e90cf955186d862738d6293155e3f4bed 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 a9a21e7d4a1b84f75ebadba17435ff201f74e4e2..c9e117362f9226b2b219a142a4fc1986310483b4 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 c312f73428bd8ad628fe29eeb5c89a9f3c11721a..35921d147fd01863e756c02ef4cbe492420450d8 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 ef8dfe22ae9352343c980d4bd0f2528bbacd960a..7d2acfd9a0dea61378f0370e9ce6c6adb07faccb 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml index fb1c24448bd5a8229c55f4a9f3931974e4c3d352..76acb32a6415b947b6abeb36ecd11bbb88def584 100755 --- a/indra/newview/skins/default/xui/ru/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ru/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Заморозить" name="Freeze..."/> <menu_item_call label="Выкинуть" name="Eject..."/> <menu_item_call label="Отладка текÑтур" name="Debug..."/> + <menu_item_call label="Вывод XML" name="Dump XML"/> <menu_item_call label="Приблизить" name="Zoom In"/> <menu_item_call label="Заплатить" name="Pay..."/> <menu_item_call label="Профиль объекта" name="Object Inspect"/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml index f241b48871280ddd219b81f694adc6fce35fe15b..2b1291a8d5f5ae74266b2becc574536599f050d1 100755 --- a/indra/newview/skins/default/xui/ru/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ru/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Мои группы" name="Groups..."/> <menu_item_call label="Мой профиль" name="Profile..."/> <menu_item_call label="Отладка текÑтур" name="Debug..."/> + <menu_item_call label="Вывод XML" name="Dump XML"/> <menu_item_call label="БроÑить" name="Drop"/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml index fb283c9d800919a8734642609d0275e58bc1e27d..dfe3c2e7011bde1477c7d64f9c02f569f731be12 100755 --- a/indra/newview/skins/default/xui/ru/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ru/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Заморозить" name="Freeze..."/> <menu_item_call label="Выкинуть" name="Eject..."/> <menu_item_call label="Отладка текÑтур" name="Debug..."/> + <menu_item_call label="Вывод XML" name="Dump XML"/> <menu_item_call label="Приблизить" name="Zoom In"/> <menu_item_call label="Заплатить" name="Pay..."/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml index b72f3dcc427b7443ca818a4f89bf3cfb52804298..e09117226ce6fe77128ca5abd69155c57c6c7b01 100755 --- a/indra/newview/skins/default/xui/ru/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ru/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Мои группы" name="Groups..."/> <menu_item_call label="Мой профиль" name="Profile..."/> <menu_item_call label="Отладка текÑтур" name="Debug..."/> + <menu_item_call label="Вывод XML" name="Dump XML"/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_conversation.xml b/indra/newview/skins/default/xui/ru/menu_conversation.xml index 530b1ea704e6815464b88f6e7058f6aa7b41c8a3..4d1240db9887c8f890b10221f926a3be7b968c14 100644 --- a/indra/newview/skins/default/xui/ru/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ru/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Закрыть разговор" name="close_conversation"/> <menu_item_call label="Открыть голоÑовой чат" name="open_voice_conversation"/> <menu_item_call label="Прекратить голоÑовой чат" name="disconnect_from_voice"/> + <menu_item_call label="Закрыть выбранные" name="close_selected_conversations"/> <menu_item_call label="Смотреть профиль" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="Предложить телепортацию" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/ru/menu_land.xml b/indra/newview/skins/default/xui/ru/menu_land.xml index 89889d7bf64676519fb5e80c6e3bda3296cdd3d0..5aa4e6ccd2f8c9e50c78099e037c00bbc417ef97 100755 --- a/indra/newview/skins/default/xui/ru/menu_land.xml +++ b/indra/newview/skins/default/xui/ru/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="Купить пропуÑк" name="Land Buy Pass"/> <menu_item_call label="СтроительÑтво" name="Create"/> <menu_item_call label="Изменить ландшафт" name="Edit Terrain"/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_login.xml b/indra/newview/skins/default/xui/ru/menu_login.xml index 93a5ffbb25f96b1b09454eefdd3ec0f6da3f7579..835c4e186e839248c1291d1f13aeae00c2f8cab7 100755 --- a/indra/newview/skins/default/xui/ru/menu_login.xml +++ b/indra/newview/skins/default/xui/ru/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="Показать лицензионное Ñоглашение" name="TOS"/> <menu_item_call label="Показать Ñообщение об ошибке" name="Critical"/> <menu_item_call label="ТеÑÑ‚ отладки плавающего окна Ñ Ð²ÐµÐ±-контентом" name="Web Content Floater Debug Test"/> - <menu label="Уровень журнала" name="Set Logging Level"/> + <menu label="Уровень журнала" name="Set Logging Level"> + <menu_item_check label="Отладка" name="Debug"/> + <menu_item_check label="ИнформациÑ" name="Info"/> + <menu_item_check label="Внимание!" name="Warning"/> + <menu_item_check label="Ошибка" name="Error"/> + <menu_item_check label="Ðет" name="None"/> + </menu> <menu_item_check label="Выбор Ñетки" name="Show Grid Picker"/> <menu_item_call label="КонÑоль уведомлений" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/ru/menu_mute_particle.xml b/indra/newview/skins/default/xui/ru/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..0c5a1474198c0a8bdba489897a3b8b748105ebca --- /dev/null +++ b/indra/newview/skins/default/xui/ru/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_object.xml b/indra/newview/skins/default/xui/ru/menu_object.xml index 288df3beb92ea1b9a4bad9c998668a07bd3a5c08..056dab74c14dd491a61195939206a5485bb3806c 100755 --- a/indra/newview/skins/default/xui/ru/menu_object.xml +++ b/indra/newview/skins/default/xui/ru/menu_object.xml @@ -3,13 +3,13 @@ <menu_item_call label="КоÑнутьÑÑ" name="Object Touch"/> <menu_item_call label="Изменить" name="Edit..."/> <menu_item_call label="СтроительÑтво" name="Build"/> - <menu_item_call label="Показывать в наборах ÑвÑзей" name="show_in_linksets"/> - <menu_item_call label="Показывать в перÑонажах" name="show_in_characters"/> <menu_item_call label="Открыто" name="Open"/> <menu_item_call label="СеÑть здеÑÑŒ" name="Object Sit"/> <menu_item_call label="Ð’Ñтать" name="Object Stand Up"/> <menu_item_call label="Профиль объекта" name="Object Inspect"/> <menu_item_call label="Приблизить" name="Zoom In"/> + <menu_item_call label="Показывать в наборах ÑвÑзей" name="show_in_linksets"/> + <menu_item_call label="Показывать в перÑонажах" name="show_in_characters"/> <context_menu label="Ðадеть" name="Put On"> <menu_item_call label="Ðадеть" name="Wear"/> <menu_item_call label="Добавить" name="Add"/> @@ -26,4 +26,5 @@ <menu_item_call label="Заплатить" name="Pay..."/> <menu_item_call label="Купить" name="Buy..."/> <menu_item_call label="Удалить" name="Delete"/> + <menu_item_call label="Блокировать владельца учаÑтка" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_agent.xml b/indra/newview/skins/default/xui/ru/menu_url_agent.xml index 230d049fad6c64750f98be26dab5588c7e7cddf0..fcd1fe310db8dce86cdd971f8b760f12545913b5 100755 --- a/indra/newview/skins/default/xui/ru/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Смотреть профиль" name="show_agent"/> <menu_item_call label="Отправить Ñообщение..." name="send_im"/> <menu_item_call label="Добавить в друзьÑ..." name="add_friend"/> + <menu_item_call label="Удалить из друзей..." name="remove_friend"/> <menu_item_call label="Копировать название в буфер обмена" name="url_copy_label"/> <menu_item_call label="Копировать URL-Ð°Ð´Ñ€ÐµÑ SL в буфер обмена" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml index 1326db708e5450c15d58a844f72784aa7912fcb5..4f5361b2e364ce93dfb342a46a4d3b18457c5b80 100755 --- a/indra/newview/skins/default/xui/ru/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ru/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Профиль объекта..." name="show_object"/> + <menu_item_call label="Блокировать..." name="block_object"/> <menu_item_call label="Показать на карте" name="show_on_map"/> <menu_item_call label="Телепорт в меÑтоположение объекта" name="teleport_to_object"/> <menu_item_call label="Копировать название объекта в буфер обмена" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/ru/menu_viewer.xml b/indra/newview/skins/default/xui/ru/menu_viewer.xml index 92a9943b937f13bce73bde7990506e5874f4b701..fcb7c4e5310ecfecf5d86534b159cdca5012fe42 100755 --- a/indra/newview/skins/default/xui/ru/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ru/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="ОÑтановить анимацию" name="Stop Animating My Avatar"/> <menu_item_call label="Ходьба / бег / полет..." name="Walk / run / fly"/> </menu> - <menu label="СтатуÑ" name="Status"/> + <menu label="СтатуÑ" name="Status"> + <menu_item_check label="Ðет на меÑте" name="Away"/> + <menu_item_check label="Ðе беÑпокоить" name="Do Not Disturb"/> + </menu> <menu_item_call label="Купить L$..." name="Buy and Sell L$"/> <menu_item_call label="Торговые иÑходÑщие..." name="MerchantOutbox"/> <menu_item_call label="Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ аккаунта..." name="Manage My Account"/> @@ -30,6 +33,7 @@ <menu_item_check label="Разговоры..." name="Conversations"/> <menu_item_check label="Локальный чат..." name="Nearby Chat"/> <menu_item_check label="Говорить" name="Speak"/> + <menu_item_check label="Журнал разговора..." name="Conversation Log..."/> <menu label="Изменение голоÑа" name="VoiceMorphing"> <menu_item_check label="Без Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð¾Ð»Ð¾Ñа" name="NoVoiceMorphing"/> <menu_item_check label="ПроÑмотр..." name="Preview"/> @@ -40,6 +44,7 @@ <menu_item_check label="Группы" name="My Groups"/> <menu_item_check label="Люди неподалеку" name="Active Speakers"/> <menu_item_call label="Черный ÑпиÑок" name="Block List"/> + <menu_item_check label="Ðе беÑпокоить" name="Do Not Disturb"/> </menu> <menu label="Мир" name="World"> <menu_item_call label="Добавить закладку на Ñто меÑто" name="Create Landmark Here"/> @@ -108,13 +113,13 @@ <menu_item_call label="Включить Ñледующую" name="Include Next Part"/> <menu_item_call label="Включить предыдущую" name="Include Previous Part"/> </menu> + <menu_item_call label="Ðаборы ÑвÑзей..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Ð¤Ð¾ÐºÑƒÑ Ð½Ð° выбранном" name="Focus on Selection"/> <menu_item_call label="Приблизить к выбранному" name="Zoom to Selection"/> <menu label="Объект" name="Object"> <menu_item_call label="Купить" name="Menu Object Buy"/> <menu_item_call label="ВзÑть" name="Menu Object Take"/> <menu_item_call label="ВзÑть копию" name="Take Copy"/> - <menu_item_call label="Сохранить в моем инвентаре" name="Save Object Back to My Inventory"/> <menu_item_call label="Сохранить в контенте объектов" name="Save Object Back to Object Contents"/> <menu_item_call label="Вернуть объект" name="Return Object back to Owner"/> </menu> @@ -270,6 +275,7 @@ <menu_item_check label="Ð¡Ð»ÑƒÑ‡Ð°Ð¹Ð½Ð°Ñ Ñ‡Ð°Ñтота кадров" name="Randomize Framerate"/> <menu_item_check label="ПериодичеÑкое замедление кадров" name="Periodic Slow Frame"/> <menu_item_check label="ТеÑÑ‚ кадров" name="Frame Test"/> + <menu_item_call label="Профиль кадра" name="Frame Profile"/> </menu> <menu label="Визуализировать метаданные" name="Render Metadata"> <menu_item_check label="Рамки" name="Bounding Boxes"/> @@ -304,9 +310,10 @@ <menu_item_check label="ОÑи" name="Axes"/> <menu_item_check label="КаÑательный базиÑ" name="Tangent Basis"/> <menu_item_call label="Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ñ‚ÐµÐºÑтура в оÑнове" name="Selected Texture Info Basis"/> + <menu_item_call label="Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ выбранном материале" name="Selected Material Info"/> <menu_item_check label="КаркаÑ" name="Wireframe"/> <menu_item_check label="Смыкание объектов" name="Object-Object Occlusion"/> - <menu_item_check label="ОÑвещение и тени" name="Advanced Lighting Model"/> + <menu_item_check label="РаÑÑˆÐ¸Ñ€ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ оÑвещениÑ" name="Advanced Lighting Model"/> <menu_item_check label="Тени от Ñолнца, луны и прожекторов" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO и Ñглаживание теней" name="SSAO and Shadow Smoothing"/> <menu_item_check label="Отладка GL" name="Debug GL"/> @@ -316,7 +323,6 @@ <menu_item_check label="ТекÑтуры анимаций" name="Animation Textures"/> <menu_item_check label="Отключить текÑтуры" name="Disable Textures"/> <menu_item_check label="ТекÑтуры в полном разрешении" name="Rull Res Textures"/> - <menu_item_check label="ÐÑ‚Ð»Ð°Ñ Ñ‚ÐµÐºÑтур (ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)" name="Texture Atlas"/> <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных иÑточников Ñвета" name="Render Attached Lights"/> <menu_item_check label="Ð’Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ñоединенных чаÑтиц" name="Render Attached Particles"/> <menu_item_check label="ПарÑщие ÑветÑщиеÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ñ‹" name="Hover Glow Objects"/> @@ -352,7 +358,6 @@ <menu_item_call label="Вывод ÑредÑтва фокуÑировки" name="Dump Focus Holder"/> <menu_item_call label="Печать информации о выбранных объектах" name="Print Selected Object Info"/> <menu_item_call label="Печать информации об агенте" name="Print Agent Info"/> - <menu_item_call label="СтатиÑтичеÑÐºÐ°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ памÑти" name="Memory Stats"/> <menu_item_check label="КонÑоль отладки региона" name="Region Debug Console"/> <menu_item_check label="Отладка SelectMgr" name="Debug SelectMgr"/> <menu_item_check label="Отладка щелчков мышью" name="Debug Clicks"/> @@ -386,7 +391,6 @@ </menu> <menu_item_call label="Скинуть параметры" name="Force Params to Default"/> <menu_item_check label="Данные об анимации" name="Animation Info"/> - <menu_item_check label="ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ñ‹Ñ… движений" name="Slow Motion Animations"/> <menu_item_check label="Показать взглÑд" name="Show Look At"/> <menu_item_check label="Показать указание" name="Show Point At"/> <menu_item_check label="Отладка обновленных движений ÑуÑтавов" name="Debug Joint Updates"/> diff --git a/indra/newview/skins/default/xui/ru/notifications.xml b/indra/newview/skins/default/xui/ru/notifications.xml index 00ab0b5763381740971acae88176759d87b3b318..1dc8202b00cd3f063ea09599e3bd317b3bd067c5 100755 --- a/indra/newview/skins/default/xui/ru/notifications.xml +++ b/indra/newview/skins/default/xui/ru/notifications.xml @@ -210,6 +210,14 @@ Добавить Ñту ÑпоÑобноÑть к роли «[ROLE_NAME]»? <usetemplate name="okcancelbuttons" notext="Ðет" yestext="Да"/> </notification> + <notification name="EjectGroupMemberWarning"> + Ð’Ñ‹ ÑобираетеÑÑŒ иÑключить [AVATAR_NAME] из группы. + <usetemplate ignoretext="Подтвердите иÑключение учаÑтника из группы" name="okcancelignore" notext="Отмена" yestext="Выкинуть"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Ð’Ñ‹ ÑобираетеÑÑŒ иÑключить [COUNT] учаÑтников из группы. + <usetemplate ignoretext="Подтвердите иÑключение учаÑтников из группы" name="okcancelignore" notext="Отмена" yestext="Выкинуть"/> + </notification> <notification name="AttachmentDrop"> Ð’Ñ‹ ÑобираетеÑÑŒ ÑброÑить Ñвое приÑоединение. Продолжить? @@ -1111,7 +1119,7 @@ Введите более выÑокую цену. </notification> <notification name="ConfirmItemDeleteHasLinks"> - ИмеетÑÑ ÑÑылка, ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ ÐºÐ°Ðº минимум на один из выбранных вами предметов. ЕÑли удалить Ñтот предмет, его ÑÑылки переÑтанут работать. ÐаÑтоÑтельно рекомендуетÑÑ Ñначала удалить ÑÑылки. + По крайней мере у одного предмета еÑть ÑÑылки, указывающие на него. ЕÑли удалить Ñтот предмет, его ÑÑылки переÑтанут работать. ÐаÑтоÑтельно рекомендуетÑÑ Ñначала удалить ÑÑылки. ДейÑтвительно удалить Ñти предметы? <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/> @@ -1161,7 +1169,7 @@ Ð’Ñ‹ не владеете по крайней мере одним объектом. ДейÑтвительно удалить Ñти предметы? - <usetemplate name="okcancelbuttons" notext="отмена" yestext="OK"/> + <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/> </notification> <notification name="ConfirmObjectTakeLock"> Как минимум один объект фикÑирован. @@ -1480,13 +1488,43 @@ http://secondlife.com/download. </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> Загружено обÑзательное обновление. -ВерÑÐ¸Ñ [VERSION] +ВерÑÐ¸Ñ [VERSION]. [[INFO_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении] Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ. +[[INFO_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении] + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME]. +ВерÑÐ¸Ñ [VERSION] +Ðа замену Ñтой ÑкÑпериментальной верÑии клиента предлагаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚ [NEW_CHANNEL]; +Ñм. [[INFO_URL] об Ñтом обновлении] + <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + Загружено обновление Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ¹ верÑии [APP_NAME]. +ВерÑÐ¸Ñ [VERSION] +Ðа замену Ñтой ÑкÑпериментальной верÑии клиента предлагаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚ [NEW_CHANNEL]; +Ñм. [[INFO_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении] + <usetemplate name="okcancelbuttons" notext="Позже..." yestext="УÑтановите обновление и перезапуÑтите [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + Загружено обÑзательное обновление. +ВерÑÐ¸Ñ [VERSION] +Ðа замену Ñтой ÑкÑпериментальной верÑии клиента предлагаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚ [NEW_CHANNEL]; +Ñм. [[INFO_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении] + +Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Ðеобходимо перезапуÑтить [APP_NAME] Ð´Ð»Ñ ÑƒÑтановки обновлениÑ. +Ðа замену Ñтой ÑкÑпериментальной верÑии клиента предлагаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚ [NEW_CHANNEL]; +Ñм. [[INFO_URL] Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом обновлении] <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="DeedObjectToGroup"> @@ -1537,6 +1575,10 @@ http://secondlife.com/download. Хотите покинуть группу? <usetemplate name="okcancelbuttons" notext="Отмена" yestext="OK"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Ðевозможно покинуть группу. Ð’Ñ‹ не можете покинуть группу, так как вы ее поÑледний владелец. Сначала назначьте владельцем другого учаÑтника. + <usetemplate name="okbutton" yestext="OK"/> + </notification> <notification name="ConfirmKick"> Ð’Ñ‹ ДЕЙСТВИТЕЛЬÐО хотите выброÑить вÑех жителей Ñ Ñетки? <usetemplate name="okcancelbuttons" notext="Отмена" yestext="ВыброÑить вÑех жителей"/> @@ -2396,9 +2438,7 @@ http://secondlife.com/download. выбрать команду «ТелепортациÑ».) </notification> <notification name="TeleportToPerson"> - Чтобы обратитьÑÑ Ðº жителю, например «[NAME]», нажмите кнопку «Люди», выберите Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² поÑвившемÑÑ Ð¾ÐºÐ½Ðµ и нажмите кнопку - «IM» внизу окна. - (Также можно дважды щелкнуть Ð¸Ð¼Ñ Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² ÑпиÑке или щелкнуть его правой кнопкой мыши и выбрать команду «IM».) + Чтобы начать личный разговор, щелкните аватар ÑобеÑедника правой кнопкой мыши и выберите в меню «IM». </notification> <notification name="CantSelectLandFromMultipleRegions"> ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ землю Ñ Ð¾Ð±ÐµÐ¸Ñ… Ñторон границы между Ñерверами. @@ -2772,6 +2812,15 @@ http://secondlife.com/download. <button name="Deny" text="Отклонить"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + Объект <nolink>[OBJECTNAME]</nolink>» владельца «[NAME]» требует Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° выполнение Ñкрипта; разрешение не раÑпознаетÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ и не будет предоÑтавлено + +Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñтого Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÑƒÑтановите поÑледнюю верÑию клиента из [DOWNLOADURL]. + <form name="form"> + <button name="Deny" text="OK"/> + <button name="Mute" text="Заблокировать"/> + </form> + </notification> <notification name="ScriptDialog"> [NAME] – «<nolink>[TITLE]</nolink>» [MESSAGE] 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 4d7e1c9fffcaa19867bc0c05efa5036f774aa530..ba38dbf89e743394365a4463487e8461e02e49b3 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 6dc435db20a3fc0aa27df32be7cbf623c177d203..d52397832cb3e7849100f00ef705d6d2f59cc45a 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 680cba9c140c0d53df03b381a7cbff3b523edf2c..cfb006f34676aefe0b1443862939073e9002b7dd 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 6b30dc799cb375b205f7e85cf3f58956cb0d5557..bae491472a9fb6a0a10254239072dfc34e806f99 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_people.xml b/indra/newview/skins/default/xui/ru/panel_people.xml index 7da7fb3191f25ecb12e0ec6f3e42022048c204df..9606f0aec134c5a8ba8296c0b8a48dc800863682 100755 --- a/indra/newview/skins/default/xui/ru/panel_people.xml +++ b/indra/newview/skins/default/xui/ru/panel_people.xml @@ -49,6 +49,9 @@ <menu_button name="plus_btn" tool_tip="ПриÑоединитьÑÑ Ðº группе/Ñоздать новую группу"/> <dnd_button name="minus_btn" tool_tip="Покинуть выбранную группу"/> </panel> + <text name="groupcount"> + Ð’Ñ‹ входите в [COUNT] групп и можете приÑоединитьÑÑ ÐµÑ‰Ðµ к [REMAINING]. + </text> </panel> <panel label="ÐЕДÐÐ’ÐИЕ" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index 6383fc8c2c0901381669cffc33d495c6ca799e2c..914426c91e38a8af378faeb35389b1b8335fcd5a 100755 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="ТекÑтовый чат" name="chat"> - <panel> - <check_box initial_value="иÑтина" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> + <panel name="general_chat_settings"> + <check_box initial_value="true" label="ВоÑпроизводить анимацию ввода текÑта при общении" name="play_typing_animation"/> <check_box label="ОтправлÑть мне ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ почте, когда Ð¼ÐµÐ½Ñ Ð½ÐµÑ‚ в Ñети" name="send_im_to_email"/> <check_box label="Только Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ группы могут звонить мне и отправлÑть IM" name="voice_call_friends_only_check"/> <text name="font_size"> @@ -14,10 +14,7 @@ </combo_box> <check_box label="Чат в пузырьках" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> IM друзей: </text> @@ -25,8 +22,9 @@ <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> - <item label="Ðет" name="None" value="нет"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Звук" name="play_sound_friend_im"/> <text name="non_friend_ims"> IM чужих: </text> @@ -34,8 +32,9 @@ <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> - <item label="Ðет" name="None" value="нет"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Звук" name="play_sound_non_friend_im"/> <text name="conference_ims"> IM конференции: </text> @@ -43,8 +42,9 @@ <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> - <item label="Ðет" name="None" value="нет"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Звук" name="play_sound_conference_im"/> <text name="group_chat"> Групповой чат: </text> @@ -52,8 +52,9 @@ <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolbarButton" value="мигание"/> - <item label="Ðет" name="None" value="нет"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Звук" name="play_sound_group_chat_im"/> <text name="nearby_chat"> Локальный чат: </text> @@ -61,13 +62,24 @@ <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolBarButton" value="мигание"/> - <item label="Ðет" name="None" value="нет"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Звук" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + IM объектов: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Открыть окно разговоров" name="OpenConversationsWindow" value="openconversations"/> + <item label="Сообщение во вÑплывающем окне" name="PopUpMessage" value="вÑплывание"/> + <item label="Мигание кнопки на панели инÑтрументов" name="FlashToolBarButton" value="мигание"/> + <item label="Без дейÑтвиÑ" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Звук" name="play_sound_object_im"/> <text name="notifications_alert"> Ð”Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñех уведомлений вызовите меню «Общение > Ðе беÑпокоить». </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Звук: </text> @@ -76,7 +88,7 @@ <check_box label="Предложение телепортации" name="teleport_offer"/> <check_box label="Предложение инвентарÑ" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="ОчиÑтить журнал..." name="clear_log"/> <button label="Удалить запиÑи..." name="delete_transcripts"/> <button label="Обзор..." label_selected="Обзор" name="log_path_button"/> 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 c7a850f78a11cd0901e819aaeea411817f7cd757..62617caed389552702363bd8110dac9144236fe6 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 a7e826f5fcb625d7d83e9f4973200e9e092cf83f..c93955fcdce648ec9f775d7771832c9f8a2e82e6 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 8e7fc71f0d5503c41d3f96785e243808110e1c2f..1741397a8411403911c2cafaec35e3e89e271f6c 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> @@ -29,6 +29,7 @@ <combo_box.item label="УÑтанавливать автоматичеÑки" name="Install_automatically"/> <combo_box.item label="Загружать и уÑтанавливать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ" name="Install_manual"/> </combo_box> + <check_box label="УÑтанавливать бета-верÑии" name="update_willing_to_test"/> <text name="Proxy Settings:"> ÐаÑтройки прокÑи-Ñервера: </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 bf673750d22b3ec811cfdf91a1e687d0ad865bc6..44f270527c538bbba3ac25431f6b4239ffdd3527 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_script_ed.xml b/indra/newview/skins/default/xui/ru/panel_script_ed.xml index 05ccaeb54b3603b2a4224edfef8660637d42d2bd..a9e5d9ef107ecbf7150292c3a2787e962e03078b 100755 --- a/indra/newview/skins/default/xui/ru/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/ru/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Выделить вÑе" name="Select All"/> <menu_item_call label="СнÑть выделение" name="Deselect"/> <menu_item_call label="ПоиÑк и замена..." name="Search / Replace..."/> + <menu_item_call label="Перейти на Ñтроку..." name="Go to line..."/> </menu> <menu label="Справка" name="Help"> <menu_item_call label="Справка..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/ru/panel_tools_texture.xml b/indra/newview/skins/default/xui/ru/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..1abf7294871501fe3eaf95a51cdce12b11fe4c6b --- /dev/null +++ b/indra/newview/skins/default/xui/ru/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="ТекÑтура" name="Texture"> + <panel.string name="string repeats per meter"> + Повторений на метр + </panel.string> + <panel.string name="string repeats per face"> + Повторений на грань + </panel.string> + <text name="color label"> + Цвет + </text> + <color_swatch label="" name="colorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/> + <text name="color trans"> + ПрозрачноÑть % + </text> + <text name="glow label"> + Свечение + </text> + <check_box label="СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ ÑркоÑть" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Материалы" name="Materials"/> + <combo_box.item label="Медиа" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="ТекÑтура (раÑÑеÑннаÑ)" name="Texture (diffuse)"/> + <combo_box.item label="ШероховатоÑть (обычнаÑ)" name="Bumpiness (normal)"/> + <combo_box.item label="БлеÑк (зеркальный)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="ТекÑтура" name="texture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/> + <text name="label alphamode"> + Ðльфа-режим + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Ðет" name="None"/> + <combo_box.item label="Ðльфа-Ñмешивание" name="Alpha blending"/> + <combo_box.item label="Ðльфа-маÑкирование" name="Alpha masking"/> + <combo_box.item label="Ð˜Ð·Ð»ÑƒÑ‡Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð°Ñка" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + ОтÑечка маÑки + </text> + <texture_picker label="ТекÑтура" name="bumpytexture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/> + <text name="label bumpiness"> + РельефноÑть + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Ðет" name="None"/> + <combo_box.item label="ЯркоÑть" name="Brightness"/> + <combo_box.item label="По темному" name="Darkness"/> + <combo_box.item label="дерево" name="woodgrain"/> + <combo_box.item label="кора" name="bark"/> + <combo_box.item label="кирпич" name="bricks"/> + <combo_box.item label="ÑˆÐ°Ñ…Ð¼Ð°Ñ‚Ð½Ð°Ñ Ð´Ð¾Ñка" name="checker"/> + <combo_box.item label="бетон" name="concrete"/> + <combo_box.item label="ÑÑ‚Ð°Ñ€Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="crustytile"/> + <combo_box.item label="теÑаный камень" name="cutstone"/> + <combo_box.item label="диÑки" name="discs"/> + <combo_box.item label="гравий" name="gravel"/> + <combo_box.item label="чашка Петри" name="petridish"/> + <combo_box.item label="Ñайдинг" name="siding"/> + <combo_box.item label="ÐºÐ°Ð¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð»Ð¸Ñ‚ÐºÐ°" name="stonetile"/> + <combo_box.item label="штукатурка" name="stucco"/> + <combo_box.item label="приÑоÑка" name="suction"/> + <combo_box.item label="переплетение" name="weave"/> + </combo_box> + <texture_picker label="ТекÑтура" name="shinytexture control" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° изображениÑ"/> + <text name="label shininess"> + БлеÑк + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Ðет" name="None"/> + <combo_box.item label="Ðизкий" name="Low"/> + <combo_box.item label="Средний" name="Medium"/> + <combo_box.item label="Ð’Ñ‹Ñокий" name="High"/> + </combo_box> + <text name="label glossiness"> + ГлÑнец + </text> + <text name="label environment"> + Среда + </text> + <text name="label shinycolor"> + Цвет + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Щелкните Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° цвета"/> + <text name="media_info"> + URL выбранного медиа (еÑли еÑть) + </text> + <button label="Выбрать..." name="add_media" tool_tip="Добавить медиа"/> + <button label="Удалить" name="delete_media" tool_tip="Удалить медиа-текÑтуру"/> + <button label="ВыровнÑть" label_selected="ВыровнÑть медиа" name="button align" tool_tip="МаÑштабирование медиа-текÑтуры (Ñначала нужно загрузить)"/> + <text name="tex gen"> + Ðаложение + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="По умолчанию" name="Default"/> + <combo_box.item label="Ðа плоÑкоÑть" name="Planar"/> + </combo_box> + <spinner label="МаÑштаб по горизонтали" name="TexScaleU"/> + <spinner label="МаÑштаб по вертикали" name="TexScaleV"/> + <spinner label="Повторений на метр" name="rptctrl"/> + <spinner label="Поворот, градуÑÑ‹" name="TexRot"/> + <spinner label="Смещение по горизонтали" name="TexOffsetU"/> + <spinner label="Смещение по вертикали" name="TexOffsetV"/> + <spinner label="МаÑштаб по горизонтали" name="bumpyScaleU"/> + <spinner label="МаÑштаб по вертикали" name="bumpyScaleV"/> + <spinner label="Поворот, градуÑÑ‹" name="bumpyRot"/> + <spinner label="Смещение по горизонтали" name="bumpyOffsetU"/> + <spinner label="Смещение по вертикали" name="bumpyOffsetV"/> + <spinner label="МаÑштаб по горизонтали" name="shinyScaleU"/> + <spinner label="МаÑштаб по вертикали" name="shinyScaleV"/> + <spinner label="Поворот, градуÑÑ‹" name="shinyRot"/> + <spinner label="Смещение по горизонтали" name="shinyOffsetU"/> + <spinner label="Смещение по вертикали" name="shinyOffsetV"/> + <check_box initial_value="false" label="СоглаÑование" name="checkbox planar align" tool_tip="СоглаÑование текÑтур на вÑех выбранных гранÑÑ… по поÑледней выбранной грани. Должно быть выбрано наложение по плоÑкоÑÑ‚Ñм."/> +</panel> diff --git a/indra/newview/skins/default/xui/ru/role_actions.xml b/indra/newview/skins/default/xui/ru/role_actions.xml index b6ba818abd85bd81e4147d994391e2c01df591d0..3f31ecfa10852bd840573163ac8ad87d08062f2e 100755 --- a/indra/newview/skins/default/xui/ru/role_actions.xml +++ b/indra/newview/skins/default/xui/ru/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка и Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð°Ñтроек, поиÑк видимых каталогов, а также наÑтройки точек и вариантов телепортации." name="Parcel Identity"> <action description="Включение-отключение показа меÑта в результатах поиÑка и наÑтройка категории" longdescription="Включить-отключить показ меÑта в результатах поиÑка и наÑтроить категорию учаÑтка можно в окне «О земле» на вкладке «Параметры»." name="land find places" value="17"/> - <action description="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке»" longdescription="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Показать меÑто в поиÑке». Ðто можно выполнить в окне «О земле» на вкладке «Параметры»." name="land change identity" value="18"/> + <action description="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Умеренный контент»" longdescription="Изменение Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ опиÑÐ°Ð½Ð¸Ñ ÑƒÑ‡Ð°Ñтка, наÑтройки «Умеренный контент». Ðто можно выполнить в окне «О земле» на вкладке «Параметры»." name="land change identity" value="18"/> <action description="УÑтановка конечной точки и варианта телепортации" longdescription="УчаÑтники роли Ñ Ñтой ÑпоÑобноÑтью могут уÑтановить конечную точку телепортации на учаÑтке группы, а также задать вариант телепортации Ð´Ð»Ñ ÑƒÑÐ¸Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ. Ðто можно выполнить в окне «О земле» на вкладке «Параметры»." name="land set landing point" value="19"/> </action_set> <action_set description="К Ñтим ÑпоÑобноÑÑ‚Ñм отноÑитÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ наÑтроек учаÑтка, в Ñ‚. ч. «Создать объекты», «Изменить ландшафт», а также наÑтройки музыки и медиа." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index d7d4df4a37c8603abeefaf7811bb3aef0a934fb7..0f71edcee0811ed2868a73db3da4dde64abe3221 100755 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> У клиента, которым вы пользуетеÑÑŒ, больше нет доÑтупа к игре Second Life. Загрузить новую верÑию клиента можно по адреÑу http://secondlife.com/download @@ -448,6 +451,9 @@ support@secondlife.com. <string name="SLappAgentRequestFriend"> Предложить дружбу </string> + <string name="SLappAgentRemoveFriend"> + Удаление друга + </string> <string name="BUTTON_CLOSE_DARWIN"> Закрыть (⌘W) </string> @@ -835,6 +841,9 @@ support@secondlife.com. <string name="multiple_textures"> ÐеÑколько </string> + <string name="use_texture"> + ИÑпользовать текÑтуру + </string> <string name="texture_loading"> Загрузка... </string> @@ -934,6 +943,21 @@ support@secondlife.com. <string name="TeleportYourAgent"> Телепортировать Ð²Ð°Ñ </string> + <string name="JoinAnExperience"> + ПриÑоединитеÑÑŒ + </string> + <string name="SilentlyManageEstateAccess"> + Отключить Ð¸Ð·Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ управлении ÑпиÑками доÑтупа к землевладениÑм + </string> + <string name="OverrideYourAnimations"> + Заменить ваши Ñтандартные анимации + </string> + <string name="ScriptReturnObjects"> + Вернуть объекты от вашего имени + </string> + <string name="UnknownScriptPermission"> + (неизвеÑтно)! + </string> <string name="SIM_ACCESS_PG"> Общий </string> @@ -1247,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 @@ -1965,6 +1989,12 @@ support@secondlife.com. <string name="ATTACH_HUD_BOTTOM_RIGHT"> Данные в игре внизу Ñправа </string> + <string name="ATTACH_NECK"> + Ð¨ÐµÑ + </string> + <string name="ATTACH_AVATAR_CENTER"> + Центр аватара + </string> <string name="CursorPos"> Строка [LINE], Ñтолбец [COLUMN] </string> @@ -2991,6 +3021,9 @@ support@secondlife.com. <string name="Hip Width"> Ширина бедер </string> + <string name="Hover"> + Ðаведите + </string> <string name="In"> Внутрь </string> @@ -5087,4 +5120,7 @@ support@secondlife.com. <string name="logging_calls_enabled_log_empty"> Ðет зарегиÑтрированных разговоров. ЕÑли вы обратитеÑÑŒ к кому-то или наоборот, в журнале поÑвитÑÑ Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ. </string> + <string name="loading_chat_logs"> + Загрузка... + </string> </strings> diff --git a/indra/newview/skins/default/xui/tr/floater_about.xml b/indra/newview/skins/default/xui/tr/floater_about.xml index 4dcf6200c6377d7606f117da9062ee0a6449efed..7b925e8830d6b1f2302a21d8920af6bbabb52e91 100755 --- a/indra/newview/skins/default/xui/tr/floater_about.xml +++ b/indra/newview/skins/default/xui/tr/floater_about.xml @@ -9,6 +9,8 @@ </floater.string> <floater.string name="AboutPosition"> <nolink>[HOSTNAME]</nolink> ([HOSTIP]) üzerinde bulunan [REGION] içerisinde [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1] konumundasınız +SLURL: <nolink>[SLURL]</nolink> +(küresel koordinatlar [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml index 1d929a2dd3d7a238f28c47957e31b56075671cd4..bf4473ce1fc24ed523292af5b62bb5deb3c07b1d 100755 --- a/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/tr/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="İÇERİK İZİNLERİNİ DÜZENLE"> +<floater name="floaterbulkperms" title="İÇERİK İZİNLERİNİ AYARLA"> <floater.string name="nothing_to_modify_text"> Seçim içerisinde düzenlenebilir içerik yok. </floater.string> @@ -24,7 +24,7 @@ <button label="√ Tümü" name="check_all"/> <button label="Temizle" label_selected="Hiçbiri" name="check_none"/> <text name="newperms"> - Yeni İçerik İzinleri + Åžunun İçin İçerik İzinlerini Ayarla: </text> <text name="GroupLabel"> Grup: @@ -40,6 +40,7 @@ <check_box label="DeÄŸiÅŸtir" name="next_owner_modify"/> <check_box label="Kopyala" name="next_owner_copy"/> <check_box initial_value="true" label="Aktar" name="next_owner_transfer" tool_tip="Sonraki sahibi bu nesneyi verebilir veya tekrar satabilir"/> - <button label="Tamam" name="apply"/> + <button label="Tamam" name="ok"/> + <button label="Uygula" name="apply"/> <button label="İptal" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/tr/floater_goto_line.xml b/indra/newview/skins/default/xui/tr/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..673fe553cc7d17ec906d9696371c14d5d53f5bbd --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="ÅžU SATIRA GİT:"> + <button label="Tamam" label_selected="Tamam" name="goto_btn"/> + <text name="txt"> + Åžu satıra git: + </text> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_im_session.xml b/indra/newview/skins/default/xui/tr/floater_im_session.xml index 8ce8f0fe13d52f7ca3ded715cbf33509e5904dec..52a10feeefdc9fb3743f8740fef35e0fb1c45770 100755 --- a/indra/newview/skins/default/xui/tr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/tr/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="Sohbeti çevir" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml index 35f47e6dfaa985a607bfb7c0e283ccf905321562..6eecc7fb776e233c624f655e0bb075e24fb80ad0 100755 --- a/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/tr/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> Göster: </text> - <check_box label="Test" name="show_world"/> + <check_box label="Dünya" name="show_world"/> <check_box label="Sadece hareket ettirilebilir nesneler" name="show_world_movables_only"/> <check_box label="Navigasyon örgüsü" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/tr/floater_tools.xml b/indra/newview/skins/default/xui/tr/floater_tools.xml index 4bf0372a8aaaa9488e4416a5be5cc6ed983a7f56..39a3569efafb38623df2ff8d7f0a9164f4442b47 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml index 9ba214ff313a09288e60e117444d86d48c8703ce..0cb233a6578306277d6dac4b9c5e89d3f462806b 100755 --- a/indra/newview/skins/default/xui/tr/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/tr/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="Dondur" name="Freeze..."/> <menu_item_call label="Çıkar" name="Eject..."/> <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/> + <menu_item_call label="XML Dökümünü Al" name="Dump XML"/> <menu_item_call label="YakınlaÅŸtır" name="Zoom In"/> <menu_item_call label="Öde" name="Pay..."/> <menu_item_call label="Nesne Profili" name="Object Inspect"/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml index 16d1e3f3568e20d849f3215f67bd4610bdf84d40..ff7c7189791aab7efc6e3304ca3d173ad03fdd5a 100755 --- a/indra/newview/skins/default/xui/tr/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/tr/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="Gruplarım" name="Groups..."/> <menu_item_call label="Profilim" name="Profile..."/> <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/> + <menu_item_call label="XML Dökümünü Al" name="Dump XML"/> <menu_item_call label="Bırak" name="Drop"/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml index 7d691d2ac59b7772c6a29c853089cc6a8777f843..0da328a89464224da8de9476b3eaa4cd7299258c 100755 --- a/indra/newview/skins/default/xui/tr/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/tr/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="Dondur" name="Freeze..."/> <menu_item_call label="Çıkar" name="Eject..."/> <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/> + <menu_item_call label="XML Dökümünü Al" name="Dump XML"/> <menu_item_call label="YakınlaÅŸtır" name="Zoom In"/> <menu_item_call label="Öde" name="Pay..."/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml index c520aff521f3db36ae49d04eebec417d6f887339..6996dc612fe38d523ef87411b681283eab3a9bc9 100755 --- a/indra/newview/skins/default/xui/tr/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/tr/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="Gruplarım" name="Groups..."/> <menu_item_call label="Profilim" name="Profile..."/> <menu_item_call label="Dokularda Hata Ayıkla" name="Debug..."/> + <menu_item_call label="XML Dökümünü Al" name="Dump XML"/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_conversation.xml b/indra/newview/skins/default/xui/tr/menu_conversation.xml index 31404f250109a58d89d79381301f80704e7be490..c2773cdc2636586a09161f3cb97e5fded0ebf610 100644 --- a/indra/newview/skins/default/xui/tr/menu_conversation.xml +++ b/indra/newview/skins/default/xui/tr/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="Sohbeti kapat" name="close_conversation"/> <menu_item_call label="Ses sohbetini aç" name="open_voice_conversation"/> <menu_item_call label="Ses baÄŸlantısını kes" name="disconnect_from_voice"/> + <menu_item_call label="Seçileni Kapat" name="close_selected_conversations"/> <menu_item_call label="Profili Göster" name="view_profile"/> <menu_item_call label="Aİ" name="im"/> <menu_item_call label="Işınlama teklif et" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/tr/menu_land.xml b/indra/newview/skins/default/xui/tr/menu_land.xml index db65f1af1ec4fd6ca730e3ed6f7ec855100fde0b..d6d8dbf73011c5c5ebf8ef25e39595368bda7e9f 100755 --- a/indra/newview/skins/default/xui/tr/menu_land.xml +++ b/indra/newview/skins/default/xui/tr/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="GeçiÅŸ Hakkı Satın Al" name="Land Buy Pass"/> <menu_item_call label="İnÅŸa Et" name="Create"/> <menu_item_call label="Yüzeyi Düzenle" name="Edit Terrain"/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_login.xml b/indra/newview/skins/default/xui/tr/menu_login.xml index f27908bf7ae2071d39ca5695df940fc9a56bf01d..79c95407e8e60c37429a29db6db1b3cf9af75fcc 100755 --- a/indra/newview/skins/default/xui/tr/menu_login.xml +++ b/indra/newview/skins/default/xui/tr/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="Hizmet Åžartlarını Göster" name="TOS"/> <menu_item_call label="Kritik İletiyi Göster" name="Critical"/> <menu_item_call label="Web İçeriÄŸi Gezdiricisi Hata Ayıklama Testi" name="Web Content Floater Debug Test"/> - <menu label="Günlük Tutma Seviyesini Seç" name="Set Logging Level"/> + <menu label="Günlük Tutma Seviyesini Seç" name="Set Logging Level"> + <menu_item_check label="Hata ayıkla" name="Debug"/> + <menu_item_check label="Bilgi" name="Info"/> + <menu_item_check label="Uyarı" name="Warning"/> + <menu_item_check label="Hata" name="Error"/> + <menu_item_check label="Hiçbiri" name="None"/> + </menu> <menu_item_check label="Izgara Seçiciyi Göster" name="Show Grid Picker"/> <menu_item_call label="Bildirimler Konsolunu Göster" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/tr/menu_mute_particle.xml b/indra/newview/skins/default/xui/tr/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..a05a745ed029a2bf9ee1922f88c40490e68e236e --- /dev/null +++ b/indra/newview/skins/default/xui/tr/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_object.xml b/indra/newview/skins/default/xui/tr/menu_object.xml index 72f7adf016358b87b4d7c4cea886a63e423d9c5e..2f8b5c03624e03199ce3ff8486364a12267e0acd 100755 --- a/indra/newview/skins/default/xui/tr/menu_object.xml +++ b/indra/newview/skins/default/xui/tr/menu_object.xml @@ -3,13 +3,13 @@ <menu_item_call label="Dokun" name="Object Touch"/> <menu_item_call label="Düzenle" name="Edit..."/> <menu_item_call label="İnÅŸa Et" name="Build"/> - <menu_item_call label="BaÄŸlantı kümelerinde göster" name="show_in_linksets"/> - <menu_item_call label="Karakterlerde göster" name="show_in_characters"/> <menu_item_call label="Aç" name="Open"/> <menu_item_call label="Buraya Otur" name="Object Sit"/> <menu_item_call label="Kalk" name="Object Stand Up"/> <menu_item_call label="Nesne Profili" name="Object Inspect"/> <menu_item_call label="YakınlaÅŸtır" name="Zoom In"/> + <menu_item_call label="BaÄŸlantı kümelerinde göster" name="show_in_linksets"/> + <menu_item_call label="Karakterlerde göster" name="show_in_characters"/> <context_menu label="Üzerine Koy" name="Put On"> <menu_item_call label="Giy" name="Wear"/> <menu_item_call label="Ekle" name="Add"/> @@ -26,4 +26,5 @@ <menu_item_call label="Öde" name="Pay..."/> <menu_item_call label="Satın Al" name="Buy..."/> <menu_item_call label="Sil" name="Delete"/> + <menu_item_call label="Parçacık Sahibini Engelle" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_agent.xml b/indra/newview/skins/default/xui/tr/menu_url_agent.xml index b14a0509bfe25b2d6a307db6d36f4402865b9b00..109cd62495139ff8af1370cf51963b00421a8bae 100755 --- a/indra/newview/skins/default/xui/tr/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="Profili Göster" name="show_agent"/> <menu_item_call label="Aİ Gönder..." name="send_im"/> <menu_item_call label="ArkadaÅŸ Ekle..." name="add_friend"/> + <menu_item_call label="Arkadaşı Çıkar..." name="remove_friend"/> <menu_item_call label="Adı panoya kopyala" name="url_copy_label"/> <menu_item_call label="SLurl'yi Panoya Kopyala" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml index 00fa3c27c2e66d335cc86832e2787f14b66be883..ae6866960576caca03eeb3bf364956add943b773 100755 --- a/indra/newview/skins/default/xui/tr/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/tr/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="Nesne Profili..." name="show_object"/> + <menu_item_call label="Engelle..." name="block_object"/> <menu_item_call label="Haritada Göster" name="show_on_map"/> <menu_item_call label="Nesne Konumuna Işınla" name="teleport_to_object"/> <menu_item_call label="Nesne Adını panoya kopyala" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/tr/menu_viewer.xml b/indra/newview/skins/default/xui/tr/menu_viewer.xml index 35485bb292b303cfa307bfceac4888f620587016..4236f9163618dbe3e2c65f454efa1c51d3e5695d 100755 --- a/indra/newview/skins/default/xui/tr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/tr/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="Beni Anime Etmeyi Durdur" name="Stop Animating My Avatar"/> <menu_item_call label="Yürü / koÅŸ / uç..." name="Walk / run / fly"/> </menu> - <menu label="Durum" name="Status"/> + <menu label="Durum" name="Status"> + <menu_item_check label="Uzakta" name="Away"/> + <menu_item_check label="Rahatsız Etme" name="Do Not Disturb"/> + </menu> <menu_item_call label="L$ Satın Al..." name="Buy and Sell L$"/> <menu_item_call label="Satıcı Giden Kutusu..." name="MerchantOutbox"/> <menu_item_call label="Hesap kontrol paneli..." name="Manage My Account"/> @@ -30,6 +33,7 @@ <menu_item_check label="Sohbetler..." name="Conversations"/> <menu_item_check label="Yakındaki Sohbet..." name="Nearby Chat"/> <menu_item_check label="KonuÅŸ" name="Speak"/> + <menu_item_check label="Sohbet Günlüğü..." name="Conversation Log..."/> <menu label="Ses ÅŸekillendirme" name="VoiceMorphing"> <menu_item_check label="Ses ÅŸekillendirme yok" name="NoVoiceMorphing"/> <menu_item_check label="Önizleme..." name="Preview"/> @@ -40,6 +44,7 @@ <menu_item_check label="Gruplar" name="My Groups"/> <menu_item_check label="Yakındaki kiÅŸiler" name="Active Speakers"/> <menu_item_call label="Engelleme Listesi" name="Block List"/> + <menu_item_check label="Rahatsız Etme" name="Do Not Disturb"/> </menu> <menu label="Dünya" name="World"> <menu_item_call label="Bu Yeri Yer İmlerine Ekle" name="Create Landmark Here"/> @@ -108,6 +113,7 @@ <menu_item_call label="Sonraki Parçayı Dahil Et" name="Include Next Part"/> <menu_item_call label="Önceki Parçayı Dahil Et" name="Include Previous Part"/> </menu> + <menu_item_call label="BaÄŸlantı kümeleri..." name="pathfinding_linkset_menu_item"/> <menu_item_call label="Seçime Odaklan" name="Focus on Selection"/> <menu_item_call label="Seçimi YakınlaÅŸtır" name="Zoom to Selection"/> <menu label="Nesne" name="Object"> @@ -277,6 +283,7 @@ <menu_item_check label="Çerçeve Hızını Rastgele Seç" name="Randomize Framerate"/> <menu_item_check label="Düzenli YavaÅŸ Çerçeve" name="Periodic Slow Frame"/> <menu_item_check label="Çerçeve Testi" name="Frame Test"/> + <menu_item_call label="Çerçeve Profili..." name="Frame Profile"/> </menu> <menu label="Meta Verileri İşle" name="Render Metadata"> <menu_item_check label="Sınırlama Kutuları" name="Bounding Boxes"/> @@ -311,9 +318,10 @@ <menu_item_check label="Eksenler" name="Axes"/> <menu_item_check label="Tanjant Temeli" name="Tangent Basis"/> <menu_item_call label="Seçilen Doku Bilgi Temeli" name="Selected Texture Info Basis"/> + <menu_item_call label="Seçilen Malzeme Bilgisi" name="Selected Material Info"/> <menu_item_check label="Telkafes" name="Wireframe"/> <menu_item_check label="Görünen Nesneler İçin Gölgeleme" name="Object-Object Occlusion"/> - <menu_item_check label="Işıklandırma ve Gölgeler" name="Advanced Lighting Model"/> + <menu_item_check label="GeliÅŸmiÅŸ Aydınlatma Modeli" name="Advanced Lighting Model"/> <menu_item_check label="GüneÅŸ/Ay/Projektörlerden Gelen Gölgeler" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="SSAO ve Gölge YumuÅŸatma" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL Hata Ayıklama" name="Debug GL"/> @@ -323,7 +331,6 @@ <menu_item_check label="Animasyon Dokuları" name="Animation Textures"/> <menu_item_check label="Dokuları Devre Dışı Bırak" name="Disable Textures"/> <menu_item_check label="Tam Çöz. Dokular" name="Rull Res Textures"/> - <menu_item_check label="Doku Atlas (deneysel)" name="Texture Atlas"/> <menu_item_check label="EklenmiÅŸ Işıkları İşle" name="Render Attached Lights"/> <menu_item_check label="EklenmiÅŸ Parçacıkları İşle" name="Render Attached Particles"/> <menu_item_check label="Parıldayan Nesneler Üzerine Gel" name="Hover Glow Objects"/> @@ -359,7 +366,6 @@ <menu_item_call label="Odaklayıcı Tutucunun Dökümünü Al" name="Dump Focus Holder"/> <menu_item_call label="Seçilen Nesne Bilgisini Yazdır" name="Print Selected Object Info"/> <menu_item_call label="Aracı Bilgisini Yazdır" name="Print Agent Info"/> - <menu_item_call label="Bellek İstatistikleri" name="Memory Stats"/> <menu_item_check label="Bölge Hata Ayıklama Konsolu" name="Region Debug Console"/> <menu_item_check label="SelectMgr İçin Hata Ayıklama" name="Debug SelectMgr"/> <menu_item_check label="Tıklamalar İçin Hata Ayıklama" name="Debug Clicks"/> diff --git a/indra/newview/skins/default/xui/tr/notifications.xml b/indra/newview/skins/default/xui/tr/notifications.xml index ad92a4b478dce6831d057fe1616ebc8a5ef7365c..492178ab8246fe4a2b5efb57057efe82fee4d095 100755 --- a/indra/newview/skins/default/xui/tr/notifications.xml +++ b/indra/newview/skins/default/xui/tr/notifications.xml @@ -210,6 +210,14 @@ Bu Yetenek '[ROLE_NAME]' rolüne eklensin mi? Bu Yetenek '[ROLE_NAME]' rolüne eklensin mi? <usetemplate name="okcancelbuttons" notext="Hayır" yestext="Evet"/> </notification> + <notification name="EjectGroupMemberWarning"> + Gruptan [AVATAR_NAME] adlı üyeyi çıkarmak üzeresiniz. + <usetemplate ignoretext="Gruptan bir katılımcının çıkarılmasını doÄŸrulayın" name="okcancelignore" notext="İptal" yestext="Çıkar"/> + </notification> + <notification name="EjectGroupMembersWarning"> + Gruptan [COUNT] üyeyi çıkarmak üzeresiniz. + <usetemplate ignoretext="Gruptan birden çok üyenin çıkarılmasını doÄŸrulayın" name="okcancelignore" notext="İptal" yestext="Çıkar"/> + </notification> <notification name="AttachmentDrop"> Aksesuarınızı çıkarmak üzeresiniz. Devam etmek istediÄŸinize emin misiniz? @@ -1111,7 +1119,7 @@ bu simdeki TÜM ARAZİLERDEN SİLMEK istediÄŸinize emin misiniz? Lütfen daha yüksek bir tutar girin. </notification> <notification name="ConfirmItemDeleteHasLinks"> - SeçtiÄŸiniz öğelerden en az birinin kendisine iÅŸaret eden baÄŸlantılı öğeler var. Bu öğeyi silerseniz, baÄŸlantıları kalıcı olarak çalışmaz hale gelecek. Önce baÄŸlantıları silmeniz önemle tavsiye edilir. + Öğelerden en az birinde kendisine iÅŸaret eden baÄŸlantılar var. Bu öğeyi silerseniz, baÄŸlantıları kalıcı olarak çalışmaz hale gelecek. Önce baÄŸlantıları silmeniz önemle tavsiye edilir. Bu öğeleri silmek istediÄŸinize emin misiniz? <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> @@ -1479,14 +1487,44 @@ Sürüm [VERSION] [[RELEASE_NOTES_FULL_URL] Bu güncelleme hakkında ayrıntıl <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Åžimdi kur ve [APP_NAME] uygulamasını yeniden baÅŸlat"/> </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> - Gerekli bir yazılım güncellemesini karşıdan yükledik. -Sürüm [VERSION] + Gerekli bir yazılım güncellemesi indirdik. +Sürüm [VERSION] [[INFO_URL] Bu güncelleme hakkında ayrıntılı bilgi] -Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. +Güncellemeyi yüklemek için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. <usetemplate name="okbutton" yestext="Tamam"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> - Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. + Güncellemeyi yüklemek için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. +[[INFO_URL] Bu güncelleme hakkında bilgi] + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + [APP_NAME] kurulumunuz için bir güncelleme indirdik. +Sürüm [VERSION] +Bu deneysel görüntüleyicinin yerini bir [NEW_CHANNEL] görüntüleyici aldı; +bkz. [bu güncelleme hakkında bilgi için [INFO_URL]] + <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Åžimdi yükle ve [APP_NAME] uygulamasını yeniden baÅŸlat"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + [APP_NAME] kurulumunuz için bir güncelleme indirdik. +Sürüm [VERSION] +Bu deneysel görüntüleyicinin yerini bir [NEW_CHANNEL] görüntüleyici aldı; +bkz. [[INFO_URL] Bu güncelleme hakkında bilgi] + <usetemplate name="okcancelbuttons" notext="Sonra..." yestext="Åžimdi yükle ve [APP_NAME] uygulamasını yeniden baÅŸlat"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + Gerekli bir yazılım güncellemesi indirdik. +Sürüm [VERSION] +Bu deneysel görüntüleyicinin yerini bir [NEW_CHANNEL] görüntüleyici aldı; +bkz. [[INFO_URL] Bu güncelleme hakkında bilgi] + +Güncellemeyi yüklemek için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + Güncellemeyi yüklemek için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız. +Bu deneysel görüntüleyicinin yerini bir [NEW_CHANNEL] görüntüleyici aldı; +bkz. [[INFO_URL] Bu güncelleme hakkında bilgi] <usetemplate name="okbutton" yestext="Tamam"/> </notification> <notification name="DeedObjectToGroup"> @@ -1537,6 +1575,10 @@ Güncellemeyi kurmak için [APP_NAME] uygulamasını yeniden baÅŸlatmalısınız Gruptan ayrılmak istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal" yestext="Tamam"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + Gruptan ayrılınamıyor. Gruptan ayrılamazsınız çünkü grubun son sahibisiniz. Lütfen önce sahip rolüne baÅŸka bir üye atayın. + <usetemplate name="okbutton" yestext="Tamam"/> + </notification> <notification name="ConfirmKick"> Tüm Sakinleri GERÇEKTEN aÄŸ dışına çıkarmak istiyor musunuz? <usetemplate name="okcancelbuttons" notext="İptal Et" yestext="Tüm Sakinleri Çıkar"/> @@ -2396,9 +2438,7 @@ Lütfen tek bir nesne seçin. 'Işınla' seçimini yapabilirsiniz.) </notification> <notification name="TeleportToPerson"> - '[NAME]' gibi sakinlerle baÄŸlantıya geçmek için "KiÅŸiler" düğmesine tıklayın, açılan pencereden bir Sakin seçin ve sonra - pencerenin altında 'Anlık İleti" üzerine tıklayın. - (Listede adlarına çift tıklayarak veya saÄŸ tıklayıp "Anlık İleti"yi seçerek de bunu yapabilirsiniz.) + Biriyle özel bir sohbet baÅŸlatmak için, avatarlarına saÄŸ tıklayın ve menüden "Aİ" seçimini yapın. </notification> <notification name="CantSelectLandFromMultipleRegions"> Sunucunun sınırları dışındaki arazi seçilemez. @@ -2772,6 +2812,15 @@ EÄŸer hesabınıza neden eriÅŸmek istediÄŸini tam olarak anlamıyorsanız, eriÅŸ <button name="Deny" text="Reddet"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + '[NAME]' tarafından sahip olunan bir nesne olan '<nolink>[OBJECTNAME]</nolink>' tarafından istenen çalışma zamanı komut dosyası izni görüntüleyici tarafından tanınmadı ve verilemez. + +Bu izni vermek için lütfen [DOWNLOADURL] adresinden görüntüleyicinizi en son sürüme güncelleyin. + <form name="form"> + <button name="Deny" text="Tamam"/> + <button name="Mute" text="Engelle"/> + </form> + </notification> <notification name="ScriptDialog"> [NAME] adlı kiÅŸiye ait '<nolink>[TITLE]</nolink>' [MESSAGE] diff --git a/indra/newview/skins/default/xui/tr/panel_people.xml b/indra/newview/skins/default/xui/tr/panel_people.xml index 08efd0aa6162ab9497b8acf9ab9907d8c97b81d6..b499ec830768aa0a4bfcaf6e3d9a202a9de5164e 100755 --- a/indra/newview/skins/default/xui/tr/panel_people.xml +++ b/indra/newview/skins/default/xui/tr/panel_people.xml @@ -49,6 +49,9 @@ Birlikte takılacak kiÅŸiler mi arıyorsunuz? [secondlife:///app/worldmap Dünya <menu_button name="plus_btn" tool_tip="Gruba katıl/yeni grup oluÅŸtur"/> <dnd_button name="minus_btn" tool_tip="Seçilen gruptan ayrıl"/> </panel> + <text name="groupcount"> + [COUNT] gruba üyesiniz, daha [REMAINING] gruba üye olabilirsiniz. + </text> </panel> <panel label="SON" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index aaeebdfe6e8eb0c51dee25dc4c991447e7b27d1c..d46f3e08ccb0eae83f08a632799b91dfad00e14c 100755 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Metin Sohbeti" name="chat"> - <panel> + <panel name="general_chat_settings"> <check_box initial_value="true" label="Sohbet sırasında yazma animasyonunu oynat" name="play_typing_animation"/> <check_box label="Çevrimdışı olduÄŸunda Aİ'ler e-posta ile bana gönderilsin" name="send_im_to_email"/> <check_box label="Sadece arkadaÅŸlar ve gruplar beni arasın veya Aİ göndersin" name="voice_call_friends_only_check"/> @@ -14,19 +14,17 @@ </combo_box> <check_box label="Balon Sohbeti" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - Bildirimler - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> ArkadaÅŸ Aİ'leri: </text> <combo_box name="FriendIMOptions"> <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> - <item label="Hiçbiri" name="None" value="none"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sesi çal" name="play_sound_friend_im"/> <text name="non_friend_ims"> ArkadaÅŸ harici Aİ'ler: </text> @@ -34,40 +32,54 @@ <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> - <item label="Hiçbiri" name="None" value="none"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sesi çal" name="play_sound_non_friend_im"/> <text name="conference_ims"> Konferans Aİ'leri: </text> <combo_box name="ConferenceIMOptions"> <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> - <item label="Hiçbiri" name="None" value="none"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sesi çal" name="play_sound_conference_im"/> <text name="group_chat"> Grup sohbeti: </text> <combo_box name="GroupChatOptions"> <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolbarButton" value="flash"/> - <item label="Hiçbiri" name="None" value="none"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sesi çal" name="play_sound_group_chat_im"/> <text name="nearby_chat"> Yakındaki sohbet: </text> <combo_box name="NearbyChatOptions"> <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> - <item label="Mesajı aç" name="PopUpMessage" value="toast"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> + <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolBarButton" value="flash"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="Sesi çal" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + Nesne Aİ'leri: + </text> + <combo_box name="ObjectIMOptions"> + <item label="Sohbetler penceresini aç" name="OpenConversationsWindow" value="openconversations"/> + <item label="Mesajı açılır pencerede göster" name="PopUpMessage" value="toast"/> <item label="Araç çubuÄŸu düğmesi yanıp sönsün" name="FlashToolBarButton" value="flash"/> - <item label="Hiçbiri" name="None" value="none"/> + <item label="Eylem yok" name="NoAction" value="noaction"/> </combo_box> + <check_box label="Sesi çal" name="play_sound_object_im"/> <text name="notifications_alert"> Tüm bildirimleri geçici olarak durdurmak için İletiÅŸim Kur > Rahatsız Etme seçeneÄŸini kullanın. </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> Sesi çal: </text> @@ -76,7 +88,7 @@ <check_box label="Işınlama teklifi" name="teleport_offer"/> <check_box label="Envanter teklifi" name="inventory_offer"/> </panel> - <panel> + <panel name="log_settings"> <button label="Günlüğü temizle..." name="clear_log"/> <button label="Dökümleri sil..." name="delete_transcripts"/> <button label="Gözat..." label_selected="Gözat" name="log_path_button"/> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml index ddb83ffc695498f7d25da16d98643f0978c67bc0..25c9e966c77c6894ad02606a1485f3b9ce02477c 100755 --- a/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_graphics1.xml @@ -30,7 +30,7 @@ <check_box initial_value="true" label="Yerel Işıklar" name="LocalLights"/> <check_box initial_value="true" label="Temel gölgeleyiciler" name="BasicShaders" tool_tip="Bu seçeneÄŸin devre dışı bırakılması bazı grafik kartlarının sürücülerinin kilitlenmesini önleyebilir"/> <check_box initial_value="true" label="Atmosferik gölgeleyiciler" name="WindLightUseAtmosShaders"/> - <check_box initial_value="true" label="Işıklandırma ve Gölgeler" name="UseLightShaders"/> + <check_box initial_value="true" label="GeliÅŸmiÅŸ Aydınlatma Modeli" name="UseLightShaders"/> <check_box initial_value="true" label="Ortam Gölgeleme" name="UseSSAO"/> <check_box initial_value="true" label="Alan DerinliÄŸi" name="UseDoF"/> <text name="shadows_label"> diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml index 9d03d9b01d6007681905b00bf148dd5ee7f73e79..2039761748c63d49697d775853d34a97970d9361 100755 --- a/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_setup.xml @@ -29,6 +29,7 @@ <combo_box.item label="Otomatik olarak kurulsun" name="Install_automatically"/> <combo_box.item label="GüncelleÅŸtirmeler manuel olarak karşıdan yüklensin ve kurulsun" name="Install_manual"/> </combo_box> + <check_box label="Sürüm adaylarına güncelleme yapmaya gönüllü" name="update_willing_to_test"/> <text name="Proxy Settings:"> Proxy Ayarları: </text> diff --git a/indra/newview/skins/default/xui/tr/panel_script_ed.xml b/indra/newview/skins/default/xui/tr/panel_script_ed.xml index 7aa1da6fb2c33318f9dbfdaccb84edcdf29a8c2a..79cd86c3f067d48b3d7c9823d07e40daa716b1b2 100755 --- a/indra/newview/skins/default/xui/tr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/tr/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="Tümünü Seç" name="Select All"/> <menu_item_call label="Seçimi Kaldır" name="Deselect"/> <menu_item_call label="Ara / DeÄŸiÅŸtir..." name="Search / Replace..."/> + <menu_item_call label="Åžu satıra git:" name="Go to line..."/> </menu> <menu label="Yardım" name="Help"> <menu_item_call label="Yardım..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/tr/panel_tools_texture.xml b/indra/newview/skins/default/xui/tr/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..2ce7c9c11f09481dab2016b0b5ebd71ebb9b1701 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Doku" name="Texture"> + <panel.string name="string repeats per meter"> + Metrede Kaç Kez Tekrarlandığı + </panel.string> + <panel.string name="string repeats per face"> + Bir Yüzde Kaç Kez Tekrarlandığı + </panel.string> + <text name="color label"> + Renk + </text> + <color_swatch label="" name="colorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/> + <text name="color trans"> + Saydamlık % + </text> + <text name="glow label"> + Parıltı + </text> + <check_box label="Tam Parlak" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="Malzemeler" name="Materials"/> + <combo_box.item label="Ortam" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="Doku (yayılmış)" name="Texture (diffuse)"/> + <combo_box.item label="Yumruluk (normal)" name="Bumpiness (normal)"/> + <combo_box.item label="Parıldama (yansıtan)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="Doku" name="texture control" tool_tip="Bir resim seçmek için tıklayın"/> + <text name="label alphamode"> + Alfa modu + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="Hiçbiri" name="None"/> + <combo_box.item label="Alfa karıştırma" name="Alpha blending"/> + <combo_box.item label="Alfa maskeleme" name="Alpha masking"/> + <combo_box.item label="Yayımlatıcı maske" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + Maske kesimi + </text> + <texture_picker label="Doku" name="bumpytexture control" tool_tip="Bir resim seçmek için tıklayın"/> + <text name="label bumpiness"> + Yumruluk + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="Yok" name="None"/> + <combo_box.item label="Parlaklık" name="Brightness"/> + <combo_box.item label="Koyuluk" name="Darkness"/> + <combo_box.item label="damarlı ahÅŸap" name="woodgrain"/> + <combo_box.item label="aÄŸaç kabuÄŸu" name="bark"/> + <combo_box.item label="tuÄŸlalar" name="bricks"/> + <combo_box.item label="dama tahtası" name="checker"/> + <combo_box.item label="beton" name="concrete"/> + <combo_box.item label="sert çini" name="crustytile"/> + <combo_box.item label="kesilmiÅŸ taÅŸ" name="cutstone"/> + <combo_box.item label="diskler" name="discs"/> + <combo_box.item label="çakıl" name="gravel"/> + <combo_box.item label="petri kabı" name="petridish"/> + <combo_box.item label="dış kaplama" name="siding"/> + <combo_box.item label="taÅŸ çini" name="stonetile"/> + <combo_box.item label="stükko" name="stucco"/> + <combo_box.item label="vakum" name="suction"/> + <combo_box.item label="örgü" name="weave"/> + </combo_box> + <texture_picker label="Doku" name="shinytexture control" tool_tip="Bir resim seçmek için tıklayın"/> + <text name="label shininess"> + Parıldama + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="Yok" name="None"/> + <combo_box.item label="Düşük" name="Low"/> + <combo_box.item label="Orta" name="Medium"/> + <combo_box.item label="Yüksek" name="High"/> + </combo_box> + <text name="label glossiness"> + Pürüzsüzlük + </text> + <text name="label environment"> + Ortam + </text> + <text name="label shinycolor"> + Renk + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="Renk seçiciyi açmak için tıklayın"/> + <text name="media_info"> + Varsa, seçilen ortamın URL'si burada yer alır + </text> + <button label="Seç..." name="add_media" tool_tip="Ortam Ekle"/> + <button label="Kaldır" name="delete_media" tool_tip="Bu ortam dokusunu sil"/> + <button label="Hizala" label_selected="Ortamı Hizala" name="button align" tool_tip="Ortam dokusunu hizala (önce yüklenmelidir)"/> + <text name="tex gen"> + EÅŸleÅŸtirme + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="Varsayılan" name="Default"/> + <combo_box.item label="Planar" name="Planar"/> + </combo_box> + <spinner label="Yatay ölçek" name="TexScaleU"/> + <spinner label="Dikey ölçek" name="TexScaleV"/> + <spinner label="Metrede kaç kez tekrarlandığı" name="rptctrl"/> + <spinner label="Dönüş derecesi" name="TexRot"/> + <spinner label="Yatay ofset" name="TexOffsetU"/> + <spinner label="Dikey ofset" name="TexOffsetV"/> + <spinner label="Yatay ölçek" name="bumpyScaleU"/> + <spinner label="Dikey ölçek" name="bumpyScaleV"/> + <spinner label="Dönüş derecesi" name="bumpyRot"/> + <spinner label="Yatay ofset" name="bumpyOffsetU"/> + <spinner label="Dikey ofset" name="bumpyOffsetV"/> + <spinner label="Yatay ölçek" name="shinyScaleU"/> + <spinner label="Dikey ölçek" name="shinyScaleV"/> + <spinner label="Dönüş derecesi" name="shinyRot"/> + <spinner label="Yatay ofset" name="shinyOffsetU"/> + <spinner label="Dikey ofset" name="shinyOffsetV"/> + <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."/> +</panel> diff --git a/indra/newview/skins/default/xui/tr/role_actions.xml b/indra/newview/skins/default/xui/tr/role_actions.xml index 655ac641720e66e4529d4383316cc91399b714a3..76ca58c319f1f4653d97d4e780a3b563c6e97653 100755 --- a/indra/newview/skins/default/xui/tr/role_actions.xml +++ b/indra/newview/skins/default/xui/tr/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="Bu yetenekler arasında parsel adını ve yayınlama ayarlarını, Bul dizinindeki görünürlük ile iniÅŸ noktası ve TP yönlendirme seçeneklerini deÄŸiÅŸtirme imkanları yer alır." name="Parcel Identity"> <action description="'Konumu Arama Sonuçlarında Göster' seçeneÄŸini Aç/Kapa ve kategoriyi ayarla" longdescription="Arazi Hakkında > Seçenekler sekmesinden 'Konumu Arama Sonuçlarında Göster' seçeneÄŸini Açın/Kapayın ve parsel kategorisini ayarlayın." name="land find places" value="17"/> - <action description="Parsel adını, açıklamasını ve "Konumu Arama Sonuçlarında Göster" ayarlarını deÄŸiÅŸtir" longdescription="Parsel adını, açıklamasını ve "Konumu Arama Sonuçlarında Göster" ayarlarını deÄŸiÅŸtirin. Bu iÅŸlem Arazi Hakkında > Seçenekler sekmesinde yapılır." name="land change identity" value="18"/> + <action description="Parsel adını, açıklamasını ve "Orta Seviyede İçerik" ayarlarını deÄŸiÅŸtir" longdescription="Parsel adını, açıklamasını ve "Orta Seviyede İçerik" ayarlarını deÄŸiÅŸtir. Bu iÅŸlem Arazi Hakkında > Seçenekler sekmesinde yapılır." name="land change identity" value="18"/> <action description="İniÅŸ noktasını ve ışınlama yönlendirmesini ayarlayın" longdescription="Bir grubun sahip olduÄŸu parsel üzerinde, bu YeteneÄŸe sahip olan bir Roldeki Üyeler gelen ışınlanmaların varacağı iniÅŸ noktasını ve daha fazla kontrol için ışınlama yönlendirmesini ayarlayabilirler. Bu iÅŸlem Arazi Hakkında > Seçenekler sekmesinde yapılır." name="land set landing point" value="19"/> </action_set> <action_set description="Bu Yeteneklere 'Nesneleri OluÅŸtur', 'Yüzeyi Düzenle', müzik ve ortam ayarları gibi parsel seçeneklerini etkileyen güçler de dahildir." name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/tr/strings.xml b/indra/newview/skins/default/xui/tr/strings.xml index 155dc8749a06518782003e46eb468386c96f4cff..c4b1530b2b767a465012dcb9a509564d7f6212ba 100755 --- a/indra/newview/skins/default/xui/tr/strings.xml +++ b/indra/newview/skins/default/xui/tr/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> Kullandığınız görüntüleyici ile artık Second Life'a eriÅŸemezsiniz. Yeni bir görüntüleyiciyi karşıdan yüklemek için lütfen ÅŸu sayfayı ziyaret edin: http://secondlife.com/download @@ -448,6 +451,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="SLappAgentRequestFriend"> ArkadaÅŸlık Talebi </string> + <string name="SLappAgentRemoveFriend"> + ArkadaÅŸların Çıkarılması + </string> <string name="BUTTON_CLOSE_DARWIN"> Kapat (⌘W) </string> @@ -835,6 +841,9 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="multiple_textures"> Birden Çok </string> + <string name="use_texture"> + Dokuyu kullan + </string> <string name="texture_loading"> Yükleniyor... </string> @@ -934,6 +943,21 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="TeleportYourAgent"> Sizi ışınlama </string> + <string name="JoinAnExperience"> + Bir tecrübeye katıl + </string> + <string name="SilentlyManageEstateAccess"> + Gayri menkul eriÅŸim listelerini yönetirken uyarıları bastır + </string> + <string name="OverrideYourAnimations"> + Varsayılan animasyonlarınızı deÄŸiÅŸtirin + </string> + <string name="ScriptReturnObjects"> + Kendi adınıza nesneler iade edin + </string> + <string name="UnknownScriptPermission"> + (bilinmiyor)! + </string> <string name="SIM_ACCESS_PG"> Genel </string> @@ -1247,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 @@ -1965,6 +1989,12 @@ Lütfen bir dakika içerisinde tekrar oturum açmayı deneyin. <string name="ATTACH_HUD_BOTTOM_RIGHT"> BÜG SaÄŸ Alt </string> + <string name="ATTACH_NECK"> + Boyun + </string> + <string name="ATTACH_AVATAR_CENTER"> + Avatar Merkezi + </string> <string name="CursorPos"> Satır [LINE], Sütun [COLUMN] </string> @@ -2994,6 +3024,9 @@ Bu iletiyi almaya devam ederseniz, lütfen [SUPPORT_SITE] bölümüne baÅŸvurun. <string name="Hip Width"> Kalça GeniÅŸliÄŸi </string> + <string name="Hover"> + Üzerine getir + </string> <string name="In"> İçeri </string> @@ -5088,4 +5121,7 @@ Düzenleyici yolunu çift tırnakla çevrelemeyi deneyin. <string name="logging_calls_enabled_log_empty"> Günlüğü tutulmuÅŸ sohbet yok. Siz biriyle iletiÅŸime geçtikten sonra veya biri sizinle iletiÅŸime geçtikten sonra, burada bir günlük giriÅŸi gösterilir. </string> + <string name="loading_chat_logs"> + Yükleniyor... + </string> </strings> diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 1193243c7ecbfeb4776c3099ff0a5ee74e1709f7..2dfb35fa5458a1c4c5ad43d3686ad2cad4d20ac1 100755 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -9,6 +9,8 @@ </floater.string> <floater.string name="AboutPosition"> ä½ çš„æ–¹ä½æ˜¯ [POSITION_LOCAL_0,number,1], [POSITION_LOCAL_1,number,1], [POSITION_LOCAL_2,number,1],地å€å:[REGION],主機:<nolink>[HOSTNAME]</nolink> ([HOSTIP]) +第二人生 URL:<nolink>[SLURL]</nolink> +ï¼ˆå…¨åŸŸåæ¨™ï¼š[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1]) [SERVER_VERSION] [SERVER_RELEASE_NOTES_URL] </floater.string> diff --git a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml index 59751a3a4695c5be6fa52bd8f24a6539cbeffef6..c103ea938fc4155987dd5fd7a8a3dde4b433f67e 100755 --- a/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/zh/floater_bulk_perms.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floaterbulkperms" title="編輯內容物權é™"> +<floater name="floaterbulkperms" title="調整內容物權é™"> <floater.string name="nothing_to_modify_text"> 鏿“‡æœªåŒ…å«å¯ç·¨è¼¯çš„內容物。 </floater.string> @@ -24,7 +24,7 @@ <button label="√ 全部" name="check_all"/> <button label="清除" label_selected="ç„¡" name="check_none"/> <text name="newperms"> - æ–°å…§å®¹ç‰©æ¬Šé™ + 調整內容物權é™ï¼š </text> <text name="GroupLabel"> 群組: @@ -40,6 +40,7 @@ <check_box label="修改" name="next_owner_modify"/> <check_box label="æšåº¨" name="next_owner_copy"/> <check_box initial_value="true" label="轉移" name="next_owner_transfer" tool_tip="下一個所有人å¯è´ˆé€æˆ–轉售這個物件"/> - <button label="確定" name="apply"/> + <button label="確定" name="ok"/> + <button label="套用" name="apply"/> <button label="å–æ¶ˆ" name="close"/> </floater> diff --git a/indra/newview/skins/default/xui/zh/floater_goto_line.xml b/indra/newview/skins/default/xui/zh/floater_goto_line.xml new file mode 100644 index 0000000000000000000000000000000000000000..e0215aef8a85591f357413feba2c8fc076a4166c --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_goto_line.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="script goto" title="å‰å¾€æŸè¡Œæ•¸"> + <button label="確定" label_selected="確定" name="goto_btn"/> + <text name="txt"> + å‰å¾€æŸè¡Œæ•¸ + </text> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_im_session.xml b/indra/newview/skins/default/xui/zh/floater_im_session.xml index d63c5507db79470a69b24cb001aad9cedb43d9df..864af2e592cdaccf9ac911ed903ccfae4ce11f2c 100755 --- a/indra/newview/skins/default/xui/zh/floater_im_session.xml +++ b/indra/newview/skins/default/xui/zh/floater_im_session.xml @@ -34,13 +34,11 @@ <layout_panel name="body_panel"> <layout_stack name="im_panels"> <layout_panel name="right_part_holder"> - <panel name="trnsAndChat_panel"> - <layout_stack name="translate_and_chat_stack"> - <layout_panel name="translate_chat_checkbox_lp"> - <check_box label="ç¿»è¯èŠå¤©å…§å®¹" name="translate_chat_checkbox"/> - </layout_panel> - </layout_stack> - </panel> + <layout_stack name="translate_and_chat_stack"> + <layout_panel name="translate_chat_checkbox_lp"> + <check_box label="ç¿»è¯èŠå¤©å…§å®¹" name="translate_chat_checkbox"/> + </layout_panel> + </layout_stack> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml index d0978b8b0101b68b244d293f2d0281438be03606..be009b54d88e38a44ad18deac2a6b52f8d051163 100755 --- a/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/zh/floater_pathfinding_console.xml @@ -71,7 +71,7 @@ <text name="show_label"> 顯示: </text> - <check_box label="測試" name="show_world"/> + <check_box label="世界" name="show_world"/> <check_box label="僅é™å¯ç§»å‹•çš„" name="show_world_movables_only"/> <check_box label="導航網é¢" name="show_navmesh"/> <text name="show_walkability_label"> diff --git a/indra/newview/skins/default/xui/zh/floater_tools.xml b/indra/newview/skins/default/xui/zh/floater_tools.xml index 33c9ebeaf084a9809f1db64c0f5808c98e8a02d9..7e6c972f404db7c3626e4e53b7306784f714a4b0 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/menu_attachment_other.xml b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml index 885c4b9addb3d8bf6892a90e37d87994929cd5eb..41b34096272fba6d3ab0cbc7d33a666a1a862e53 100755 --- a/indra/newview/skins/default/xui/zh/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/zh/menu_attachment_other.xml @@ -11,7 +11,9 @@ <menu_item_call label="å‡çµ" name="Freeze..."/> <menu_item_call label="踢出" name="Eject..."/> <menu_item_call label="æè³ªé™¤éŒ¯" name="Debug..."/> + <menu_item_call label="å‚¾å° XML" name="Dump XML"/> <menu_item_call label="放大" name="Zoom In"/> <menu_item_call label="支付" name="Pay..."/> <menu_item_call label="物件檔案" name="Object Inspect"/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml index c14a98c64bed9932c0a02075a71312e19ea89773..eb1bad0ca27477b2eee1b99f5b89a2c481af72c4 100755 --- a/indra/newview/skins/default/xui/zh/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/zh/menu_attachment_self.xml @@ -12,5 +12,7 @@ <menu_item_call label="我的群組" name="Groups..."/> <menu_item_call label="我的個人檔案" name="Profile..."/> <menu_item_call label="æè³ªé™¤éŒ¯" name="Debug..."/> + <menu_item_call label="å‚¾å° XML" name="Dump XML"/> <menu_item_call label="丟棄" name="Drop"/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml index 1d024647487a8e412cf7ba5dbe27b9e8f2f18d25..dc035bafa03aeec377a8c053c222fd9b03738e90 100755 --- a/indra/newview/skins/default/xui/zh/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/zh/menu_avatar_other.xml @@ -11,6 +11,8 @@ <menu_item_call label="å‡çµ" name="Freeze..."/> <menu_item_call label="踢出" name="Eject..."/> <menu_item_call label="æè³ªé™¤éŒ¯" name="Debug..."/> + <menu_item_call label="å‚¾å° XML" name="Dump XML"/> <menu_item_call label="放大" name="Zoom In"/> <menu_item_call label="支付" name="Pay..."/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml index 32757bbff630fd536d99aa3dd46a2d1159840a6f..68d0600141bacac139d5a39aacc9fbea556692e0 100755 --- a/indra/newview/skins/default/xui/zh/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/zh/menu_avatar_self.xml @@ -29,4 +29,6 @@ <menu_item_call label="我的群組" name="Groups..."/> <menu_item_call label="我的個人檔案" name="Profile..."/> <menu_item_call label="æè³ªé™¤éŒ¯" name="Debug..."/> + <menu_item_call label="å‚¾å° XML" name="Dump XML"/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_conversation.xml b/indra/newview/skins/default/xui/zh/menu_conversation.xml index 507255d0c0426f11bcdb7348faa5f46810d3bf7b..adfeefc337ca2cfa1ba355b2cb10c311cde7ca5b 100644 --- a/indra/newview/skins/default/xui/zh/menu_conversation.xml +++ b/indra/newview/skins/default/xui/zh/menu_conversation.xml @@ -3,6 +3,7 @@ <menu_item_call label="關閉交談" name="close_conversation"/> <menu_item_call label="開啟語音交談" name="open_voice_conversation"/> <menu_item_call label="切斷語音交談" name="disconnect_from_voice"/> + <menu_item_call label="關閉所é¸" name="close_selected_conversations"/> <menu_item_call label="察看檔案" name="view_profile"/> <menu_item_call label="IM" name="im"/> <menu_item_call label="發出瞬間傳é€é‚€è«‹" name="offer_teleport"/> diff --git a/indra/newview/skins/default/xui/zh/menu_land.xml b/indra/newview/skins/default/xui/zh/menu_land.xml index a87ab77dd0897747b0af71be633cce47697dd3a8..3ad9c0ab31e9ed422bb7cc9b77b3b2b0c21ebe0c 100755 --- a/indra/newview/skins/default/xui/zh/menu_land.xml +++ b/indra/newview/skins/default/xui/zh/menu_land.xml @@ -6,4 +6,5 @@ <menu_item_call label="購買通行權" name="Land Buy Pass"/> <menu_item_call label="å»ºé€ " name="Create"/> <menu_item_call label="編輯地形" name="Edit Terrain"/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_login.xml b/indra/newview/skins/default/xui/zh/menu_login.xml index c327b132a11e7b2bbcc3ad76273a8f34167da560..1d3d771efbe4772b4150d334fb9694f29206973b 100755 --- a/indra/newview/skins/default/xui/zh/menu_login.xml +++ b/indra/newview/skins/default/xui/zh/menu_login.xml @@ -18,7 +18,13 @@ <menu_item_call label="顯示 TOS" name="TOS"/> <menu_item_call label="顯示嚴é‡è¨Šæ¯" name="Critical"/> <menu_item_call label="ç¶²é 內容浮動視窗除錯測試" name="Web Content Floater Debug Test"/> - <menu label="è¨å®šè¨˜éŒ„細節" name="Set Logging Level"/> + <menu label="è¨å®šè¨˜éŒ„細節" name="Set Logging Level"> + <menu_item_check label="除錯" name="Debug"/> + <menu_item_check label="資訊" name="Info"/> + <menu_item_check label="è¦å‘Š" name="Warning"/> + <menu_item_check label="錯誤" name="Error"/> + <menu_item_check label="ç„¡" name="None"/> + </menu> <menu_item_check label="é¡¯ç¤ºç¶²æ ¼æŒ‘é¸å™¨" name="Show Grid Picker"/> <menu_item_call label="顯示通知控制å°" name="Show Notifications Console"/> </menu> diff --git a/indra/newview/skins/default/xui/zh/menu_mute_particle.xml b/indra/newview/skins/default/xui/zh/menu_mute_particle.xml new file mode 100644 index 0000000000000000000000000000000000000000..fbde9b435d57d0508017d96762dbeb90acbfe6cb --- /dev/null +++ b/indra/newview/skins/default/xui/zh/menu_mute_particle.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<!-- *NOTE: See also menu_attachment_other.xml --> +<context_menu name="Mute Particle Pie"> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> +</context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_object.xml b/indra/newview/skins/default/xui/zh/menu_object.xml index 4282c1e1317ca17e9d7a524b797e5cc080b2a912..f6657d876e9ebdcfebe68d143975036f4721b363 100755 --- a/indra/newview/skins/default/xui/zh/menu_object.xml +++ b/indra/newview/skins/default/xui/zh/menu_object.xml @@ -3,13 +3,13 @@ <menu_item_call label="觸碰" name="Object Touch"/> <menu_item_call label="編輯" name="Edit..."/> <menu_item_call label="å»ºé€ " name="Build"/> - <menu_item_call label="在è¯çµé›†è£¡é¡¯ç¤º" name="show_in_linksets"/> - <menu_item_call label="在角色ä¸é¡¯ç¤º" name="show_in_characters"/> <menu_item_call label="打開" name="Open"/> <menu_item_call label="å在這裡" name="Object Sit"/> <menu_item_call label="èµ·ç«‹" name="Object Stand Up"/> <menu_item_call label="物件檔案" name="Object Inspect"/> <menu_item_call label="放大" name="Zoom In"/> + <menu_item_call label="在è¯çµé›†è£¡é¡¯ç¤º" name="show_in_linksets"/> + <menu_item_call label="在角色ä¸é¡¯ç¤º" name="show_in_characters"/> <context_menu label="穿上" name="Put On"> <menu_item_call label="穿上" name="Wear"/> <menu_item_call label="æ·»åŠ " name="Add"/> @@ -26,4 +26,5 @@ <menu_item_call label="支付" name="Pay..."/> <menu_item_call label="購買" name="Buy..."/> <menu_item_call label="刪除" name="Delete"/> + <menu_item_call label="å°éŽ–ç²’åæ‰€æœ‰äºº" name="Mute Particle"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_agent.xml b/indra/newview/skins/default/xui/zh/menu_url_agent.xml index 72629822d4bcb5ae29b6e206f2035ad5eba6fea6..752634dc6b21d47401bdb5e3be07aa92fee46c3d 100755 --- a/indra/newview/skins/default/xui/zh/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_agent.xml @@ -3,6 +3,7 @@ <menu_item_call label="察看檔案" name="show_agent"/> <menu_item_call label="é€å‡º IM..." name="send_im"/> <menu_item_call label="åŠ ç‚ºæœ‹å‹..." name="add_friend"/> + <menu_item_call label="移除朋å‹â€¦" name="remove_friend"/> <menu_item_call label="覆製å稱到剪貼簿" name="url_copy_label"/> <menu_item_call label="覆製 SLurl 到剪貼簿" name="url_copy"/> </context_menu> diff --git a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml index 9f3a9d58ffdc201c53d1d81cdde74a84d5031938..ac366f92efcfbe62c056f64434f28d1a5068323e 100755 --- a/indra/newview/skins/default/xui/zh/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/zh/menu_url_objectim.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <context_menu name="Url Popup"> <menu_item_call label="物件檔案..." name="show_object"/> + <menu_item_call label="å°éŽ–â€¦" name="block_object"/> <menu_item_call label="顯示在地圖上" name="show_on_map"/> <menu_item_call label="瞬間傳é€åˆ°ç‰©ä»¶ä½ç½®" name="teleport_to_object"/> <menu_item_call label="覆製物件å稱到剪貼簿" name="url_copy_label"/> diff --git a/indra/newview/skins/default/xui/zh/menu_viewer.xml b/indra/newview/skins/default/xui/zh/menu_viewer.xml index d4844b191b5f5e19c2e53d1775a2c680b40731b5..b267bda2bbe132e2eaf2fea6f24e62adb8e69189 100755 --- a/indra/newview/skins/default/xui/zh/menu_viewer.xml +++ b/indra/newview/skins/default/xui/zh/menu_viewer.xml @@ -16,7 +16,10 @@ <menu_item_call label="åœæ¢æˆ‘身上的動作" name="Stop Animating My Avatar"/> <menu_item_call label="行走 / è·‘æ¥ / 飛行…" name="Walk / run / fly"/> </menu> - <menu label="狀態" name="Status"/> + <menu label="狀態" name="Status"> + <menu_item_check label="離開" name="Away"/> + <menu_item_check label="請勿打擾" name="Do Not Disturb"/> + </menu> <menu_item_call label="購買 L$…" name="Buy and Sell L$"/> <menu_item_call label="商家發件匣…" name="MerchantOutbox"/> <menu_item_call label="帳戶主控臺…" name="Manage My Account"/> @@ -30,6 +33,7 @@ <menu_item_check label="交談……" name="Conversations"/> <menu_item_check label="附近的èŠå¤©â€¦â€¦" name="Nearby Chat"/> <menu_item_check label="說話" name="Speak"/> + <menu_item_check label="交談記錄…" name="Conversation Log..."/> <menu label="語音變è²" name="VoiceMorphing"> <menu_item_check label="æ²’æœ‰è®Šè²æ•ˆæžœ" name="NoVoiceMorphing"/> <menu_item_check label="é 覽……" name="Preview"/> @@ -40,6 +44,7 @@ <menu_item_check label="群組" name="My Groups"/> <menu_item_check label="附近的人群" name="Active Speakers"/> <menu_item_call label="å°éŽ–æ¸…å–®" name="Block List"/> + <menu_item_check label="請勿打擾" name="Do Not Disturb"/> </menu> <menu label="世界" name="World"> <menu_item_call label="å°‡æ¤è™•記為地標" name="Create Landmark Here"/> @@ -108,6 +113,7 @@ <menu_item_call label="包括下一部ä½" name="Include Next Part"/> <menu_item_call label="包括上一部ä½" name="Include Previous Part"/> </menu> + <menu_item_call label="è¯çµé›†â€¦" name="pathfinding_linkset_menu_item"/> <menu_item_call label="èšç„¦æ–¼æ‰€é¸éƒ¨ä½" name="Focus on Selection"/> <menu_item_call label="縮放至所é¸éƒ¨ä½" name="Zoom to Selection"/> <menu label="物件" name="Object"> @@ -277,6 +283,7 @@ <menu_item_check label="隨機變動幀率" name="Randomize Framerate"/> <menu_item_check label="å®šæœŸå‡ºç¾æ…¢å¹€çއ" name="Periodic Slow Frame"/> <menu_item_check label="ç•«é¢æ¸¬è©¦" name="Frame Test"/> + <menu_item_call label="幀特性" name="Frame Profile"/> </menu> <menu label="呈åƒçš„元資料" name="Render Metadata"> <menu_item_check label="外框箱" name="Bounding Boxes"/> @@ -311,9 +318,10 @@ <menu_item_check label="軸" name="Axes"/> <menu_item_check label="切線基礎" name="Tangent Basis"/> <menu_item_call label="å·²é¸å–æè³ªè³‡è¨ŠåŸºç¤Ž" name="Selected Texture Info Basis"/> + <menu_item_call label="æ‰€é¸ææ–™è³‡è¨Š" name="Selected Material Info"/> <menu_item_check label="線框" name="Wireframe"/> <menu_item_check label="物件導å‘çš„é®è”½" name="Object-Object Occlusion"/> - <menu_item_check label="光線和陰影" name="Advanced Lighting Model"/> + <menu_item_check label="進階照明模型" name="Advanced Lighting Model"/> <menu_item_check label="來自日/月/投影物的陰影" name="Shadows from Sun/Moon/Projectors"/> <menu_item_check label="å±å¹•空間環境光é®è”½å’Œé™°å½±å¹³æ»‘技術" name="SSAO and Shadow Smoothing"/> <menu_item_check label="GL 除錯" name="Debug GL"/> @@ -323,7 +331,6 @@ <menu_item_check label="動作æè³ª" name="Animation Textures"/> <menu_item_check label="關閉æè³ª" name="Disable Textures"/> <menu_item_check label="全解æžåº¦æè³ª" name="Rull Res Textures"/> - <menu_item_check label="æè³ªåœ–集(實驗性質)" name="Texture Atlas"/> <menu_item_check label="使附著燈光呈åƒ" name="Render Attached Lights"/> <menu_item_check label="ä½¿é™„è‘—ä¾‹åæ•ˆæžœå‘ˆåƒ" name="Render Attached Particles"/> <menu_item_check label="åœæ‡¸ç™¼å…‰ç‰©ä»¶" name="Hover Glow Objects"/> @@ -359,7 +366,6 @@ <menu_item_call label="傾å°ç„¦é»žå®¹å™¨" name="Dump Focus Holder"/> <menu_item_call label="åˆ—å°æ‰€é¸ç‰©ä»¶è³‡è¨Š" name="Print Selected Object Info"/> <menu_item_call label="列å°ç”¨æˆ¶è³‡è¨Š" name="Print Agent Info"/> - <menu_item_call label="計憶體狀態" name="Memory Stats"/> <menu_item_check label="地å€é™¤éŒ¯æŽ§åˆ¶å°" name="Region Debug Console"/> <menu_item_check label="除錯 SelectMgr" name="Debug SelectMgr"/> <menu_item_check label="除錯點按動作" name="Debug Clicks"/> diff --git a/indra/newview/skins/default/xui/zh/notifications.xml b/indra/newview/skins/default/xui/zh/notifications.xml index 59be26d43bf7688594ca5a92563d7e799a9446f7..864f20fc1585e0466511040c80d6bf96a4d247a1 100755 --- a/indra/newview/skins/default/xui/zh/notifications.xml +++ b/indra/newview/skins/default/xui/zh/notifications.xml @@ -210,6 +210,14 @@ ä½ ä»è¦æ–°å¢žé€™é …能力給「[ROLE_NAME]ã€ï¼Ÿ <usetemplate name="okcancelbuttons" notext="å¦" yestext="是"/> </notification> + <notification name="EjectGroupMemberWarning"> + ä½ å³å°‡æŠŠ [AVATAR_NAME] 踢出群組。 + <usetemplate ignoretext="確定將æŸäººè¸¢å‡ºç¾¤çµ„" name="okcancelignore" notext="å–æ¶ˆ" yestext="踢出"/> + </notification> + <notification name="EjectGroupMembersWarning"> + ä½ å³å°‡æŠŠ [COUNT] 個人踢出群組。 + <usetemplate ignoretext="確定將多人踢出群組" name="okcancelignore" notext="å–æ¶ˆ" yestext="踢出"/> + </notification> <notification name="AttachmentDrop"> ä½ å³å°‡å¸é™¤ä½ 的附件。 ä½ ç¢ºå®šä½ è¦ç¹¼çºŒï¼Ÿ @@ -1470,13 +1478,43 @@ SHA1 指紋:[MD5_DIGEST] </notification> <notification name="RequiredUpdateDownloadedVerboseDialog"> 我們已下載了一個必è¦çš„軟體更新。 -版本:[VERSION] +[VERSION] 版本 [[INFO_URL] é—œæ–¼æ¤æ›´æ–°çš„資訊] æˆ‘é–€å¿…é ˆé‡æ–°å•Ÿå‹• [APP_NAME] ä»¥å®‰è£æ›´æ–°ã€‚ <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="RequiredUpdateDownloadedDialog"> æˆ‘é–€å¿…é ˆé‡æ–°å•Ÿå‹• [APP_NAME] ä»¥å®‰è£æ›´æ–°ã€‚ +[[INFO_URL] é—œæ–¼æ¤æ›´æ–°çš„資訊] + <usetemplate name="okbutton" yestext="確定"/> + </notification> + <notification name="OtherChannelDownloadBackgroundTip"> + æˆ‘å€‘å·²ç‚ºä½ çš„ [APP_NAME] 軟體下載了更新。 +版本:[VERSION] +原本試驗性質的ç€è¦½å™¨å·²è¢« [NEW_CHANNEL] ç€è¦½å™¨å–代, +åƒè¦‹[[INFO_URL] æ¤æ›´æ–°ç‰ˆçš„詳情] + <usetemplate name="okcancelbuttons" notext="ç¨å€™..." yestext="ç«‹å³å®‰è£ä¸¦é‡æ–°å•Ÿå‹• [APP_NAME]"/> + </notification> + <notification name="OtherChannelDownloadBackgroundDialog"> + æˆ‘å€‘å·²ç‚ºä½ çš„ [APP_NAME] 軟體下載了更新。 +版本:[VERSION] +原本試驗性質的ç€è¦½å™¨å·²è¢« [NEW_CHANNEL] ç€è¦½å™¨å–代, +åƒè¦‹[[INFO_URL] ä»‹ç´¹æ¤æ›´æ–°ç‰ˆçš„資訊] + <usetemplate name="okcancelbuttons" notext="ç¨å€™â€¦" yestext="ç«‹å³å®‰è£ä¸¦é‡æ–°å•Ÿå‹• [APP_NAME]"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedVerboseDialog"> + 我們已下載了一個必è¦çš„軟體更新。 +版本:[VERSION] +原本試驗性質的ç€è¦½å™¨å·²è¢« [NEW_CHANNEL] ç€è¦½å™¨å–代, +åƒè¦‹[[INFO_URL] ä»‹ç´¹æ¤æ›´æ–°ç‰ˆçš„資訊] + +æˆ‘å€‘å¿…é ˆé‡æ–°å•Ÿå‹• [APP_NAME] ä»¥ä¾¿å®‰è£æ›´æ–°ã€‚ + <usetemplate name="okbutton" yestext="確定"/> + </notification> + <notification name="OtherChannelRequiredUpdateDownloadedDialog"> + æˆ‘å€‘å¿…é ˆé‡æ–°å•Ÿå‹• [APP_NAME] ä»¥ä¾¿å®‰è£æ›´æ–°ã€‚ +原本試驗性質的ç€è¦½å™¨å·²è¢« [NEW_CHANNEL] ç€è¦½å™¨å–代, +åƒè¦‹[[INFO_URL] ä»‹ç´¹æ¤æ›´æ–°ç‰ˆçš„資訊] <usetemplate name="okbutton" yestext="確定"/> </notification> <notification name="DeedObjectToGroup"> @@ -1527,6 +1565,10 @@ SHA1 指紋:[MD5_DIGEST] 是å¦è¦é›¢é–‹ç¾¤çµ„? <usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="確定"/> </notification> + <notification name="OwnerCannotLeaveGroup"> + 無法離開群組。 ä½ æ˜¯æ¤ç¾¤çµ„僅å˜çš„æ‰€æœ‰äººï¼Œä¸å¾—離開群組。 請先把所有人è·éŠœæŒ‡æ´¾çµ¦å¦ä¸€äººã€‚ + <usetemplate name="okbutton" yestext="確定"/> + </notification> <notification name="ConfirmKick"> ä½ ç¢ºå®šè¦è¸¢å‡ºé€™ç¶²æ ¼å…§çš„全部居民? <usetemplate name="okcancelbuttons" notext="å–æ¶ˆ" yestext="踢出全部居民"/> @@ -2386,9 +2428,7 @@ SHA1 指紋:[MD5_DIGEST] ï¼ˆä½ é‚„å¯ä»¥ç›´æŽ¥æŒ‰å…©ä¸‹é‚£å€‹åœ°æ¨™ï¼Œæˆ–æŒ‰æ»‘é¼ å³éµï¼Œé¸æ“‡ã€Œçž¬é–“傳é€ã€ã€‚) </notification> <notification name="TeleportToPerson"> - è¦è¯çµ¡å¦‚「[NAME]ã€çš„任何一ä½å±…æ°‘ï¼Œè«‹é»žæŒ‰ã€Œäººç¾¤ã€æŒ‰éˆ•,從打開的視窗ä¸é¸æ“‡ä¸€ä½å±…民,å†é»žæŒ‰è¦–窗底下的「IMã€ã€‚ - - ï¼ˆä½ é‚„å¯ä»¥å¾žæ¸…單直接按兩下åå—ï¼Œæˆ–æŒ‰æ»‘é¼ å³éµï¼Œé¸æ“‡ã€ŒIMã€ã€‚) + è¦å’ŒæŸäººç§ä¸‹äº¤è«‡ï¼Œè«‹å³éµé»žæŒ‰åŒ–身,å†é»žæŒ‰é¸å–®çš„「IMã€ã€‚ </notification> <notification name="CantSelectLandFromMultipleRegions"> ç„¡æ³•é¸æ“‡è¶…出伺æœå™¨é‚Šç•Œçš„土地。 @@ -2762,6 +2802,15 @@ SHA1 指紋:[MD5_DIGEST] <button name="Deny" text="拒絕"/> </form> </notification> + <notification name="UnknownScriptQuestion"> + ç”± '[NAME]' æ‰€æ“æœ‰çš„物件 '<nolink>[OBJECTNAME]</nolink>' æ£è«‹æ±‚æŸé …執行時期腳本權é™ï¼Œä½†æœ¬ç€è¦½å™¨ç„¡æ³•辨è˜è©²æ¬Šé™ï¼Œæ•…ä¸å…准。 + +æ¬²å‡†è¨±æ¤æ¬Šé™ï¼Œè«‹å¾ž [DOWNLOADURL] 下載並更新為最新版ç€è¦½å™¨ã€‚ + <form name="form"> + <button name="Deny" text="確定"/> + <button name="Mute" text="å°éŽ–"/> + </form> + </notification> <notification name="ScriptDialog"> [NAME] çš„ '<nolink>[TITLE]</nolink>' [MESSAGE] diff --git a/indra/newview/skins/default/xui/zh/panel_people.xml b/indra/newview/skins/default/xui/zh/panel_people.xml index 5f7aca387a63067e49081123c2e003a38b9a7047..da5918d55341125dcd8a8b359c323b7887661ef0 100755 --- a/indra/newview/skins/default/xui/zh/panel_people.xml +++ b/indra/newview/skins/default/xui/zh/panel_people.xml @@ -49,6 +49,9 @@ <menu_button name="plus_btn" tool_tip="åŠ å…¥ç¾¤çµ„/創立新群組"/> <dnd_button name="minus_btn" tool_tip="離開所é¸ç¾¤çµ„"/> </panel> + <text name="groupcount"> + ä½ ç›®å‰å±¬æ–¼ [COUNT] 個群組,å¯å†åŠ å…¥ [REMAINING] 個。 + </text> </panel> <panel label="最近" name="recent_panel"> <panel label="bottom_panel" name="recent_buttons_panel"> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index e700e35516d49cb875d17c37dea1370678b73e1c..b5cdddc252f3929daaba6e850707cac17d80c70b 100755 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -1,11 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="æ–‡å—èŠå¤©" name="chat"> - <panel> - <check_box initial_value="true" label="èŠå¤©æ™‚æ’æ”¾æ‰“å—動作" name="play_typing_animation"/> + <panel name="general_chat_settings"> + <check_box initial_value="true" label="èŠå¤©æ™‚å‘ˆç¾æ‰“å—動作" name="play_typing_animation"/> <check_box label="當我離線時將收到的 IM 訊æ¯éƒµå¯„給我" name="send_im_to_email"/> - <check_box label="åªæœ‰æˆ‘的朋å‹å’Œç¾¤çµ„å¯ä»¥ IM 或與我通話。" name="voice_call_friends_only_check"/> + <check_box label="åªå…許我的朋å‹å’Œç¾¤çµ„與我通話或 IM 給我" name="voice_call_friends_only_check"/> <text name="font_size"> - å—型尺寸: + å—型大å°ï¼š </text> <combo_box name="chat_font_size"> <item label="å°" name="Small" value="0"/> @@ -14,10 +14,7 @@ </combo_box> <check_box label="èŠå¤©æ³¡æ³¡" name="bubble_text_chat"/> </panel> - <panel> - <text name="notifications"> - 通知 - </text> + <panel name="im_notification_settings"> <text name="friend_ims"> æœ‹å‹ IM: </text> @@ -25,8 +22,9 @@ <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> - <item label="ç„¡" name="None" value="ç„¡"/> + <item label="無動作" name="NoAction" value="noaction"/> </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_friend_im"/> <text name="non_friend_ims"> éžæœ‹å‹ IM: </text> @@ -34,8 +32,9 @@ <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> - <item label="ç„¡" name="None" value="ç„¡"/> + <item label="無動作" name="NoAction" value="noaction"/> </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_non_friend_im"/> <text name="conference_ims"> 多方交談 IM: </text> @@ -43,8 +42,9 @@ <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> - <item label="ç„¡" name="None" value="ç„¡"/> + <item label="無動作" name="NoAction" value="noaction"/> </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_conference_im"/> <text name="group_chat"> 群組èŠå¤©ï¼š </text> @@ -52,8 +52,9 @@ <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> <item label="Flash 工具列按鈕" name="FlashToolbarButton" value="flash"/> - <item label="ç„¡" name="None" value="ç„¡"/> + <item label="無動作" name="NoAction" value="noaction"/> </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_group_chat_im"/> <text name="nearby_chat"> 附近的èŠå¤©ï¼š </text> @@ -61,13 +62,24 @@ <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> <item label="Flash 工具列按鈕" name="FlashToolBarButton" value="flash"/> - <item label="ç„¡" name="None" value="ç„¡"/> + <item label="無動作" name="NoAction" value="noaction"/> + </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_nearby_chat_im"/> + <text name="object_ims"> + 來自物件的 IM: + </text> + <combo_box name="ObjectIMOptions"> + <item label="開啟交談視窗" name="OpenConversationsWindow" value="openconversations"/> + <item label="以çªé¡¯å¼è¦–窗顯示訊æ¯" name="PopUpMessage" value="toast"/> + <item label="Flash 工具列按鈕" name="FlashToolBarButton" value="flash"/> + <item label="無動作" name="NoAction" value="noaction"/> </combo_box> + <check_box label="æ’æ”¾è²éŸ³" name="play_sound_object_im"/> <text name="notifications_alert"> è‹¥è¦æš«æ™‚åœæ¢æ‰€æœ‰é€šçŸ¥ï¼Œè«‹è¨å®šã€Œæºé€š > 請勿打擾ã€ã€‚ </text> </panel> - <panel> + <panel name="play_sound_settings"> <text name="play_sound"> æ’æ”¾è²éŸ³ï¼š </text> @@ -76,9 +88,9 @@ <check_box label="瞬間傳é€é‚€è«‹" name="teleport_offer"/> <check_box label="æ”¶ç´ç‰©å“è´ˆé€" name="inventory_offer"/> </panel> - <panel> - <button label="清空記錄……" name="clear_log"/> - <button label="刪除交談內容記錄……" name="delete_transcripts"/> + <panel name="log_settings"> + <button label="清空記錄…" name="clear_log"/> + <button label="刪除交談內容記錄…" name="delete_transcripts"/> <button label="ç€è¦½â€¦" label_selected="ç€è¦½" name="log_path_button"/> </panel> <button label="ç¿»è¯â€¦" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml index 3948a4899209cbf0f4697bf1086c070dea169f35..2311eb99a75438f317448f677f341e3f26ca2544 100755 --- a/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_graphics1.xml @@ -30,7 +30,7 @@ <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="UseLightShaders"/> <check_box initial_value="true" label="環境光é®è”½" name="UseSSAO"/> <check_box initial_value="true" label="景深" name="UseDoF"/> <text name="shadows_label"> 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 a607a7c33b936722bcf1e637b5d8ab1e467470f7..ab4d9a881dfc298696bedb2f8f0b929979f15cd5 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"/> @@ -29,6 +29,7 @@ <combo_box.item label="自動安è£" name="Install_automatically"/> <combo_box.item label="手動下載åŠå®‰è£" name="Install_manual"/> </combo_box> + <check_box label="願æ„在更新時æ¶å…ˆè©¦ç”¨é‡‹å‡ºå€™é¸ç‰ˆ" name="update_willing_to_test"/> <text name="Proxy Settings:"> 代ç†ä¼ºæœå™¨è¨å®šï¼š </text> diff --git a/indra/newview/skins/default/xui/zh/panel_script_ed.xml b/indra/newview/skins/default/xui/zh/panel_script_ed.xml index 29e9a35869f102e9248449a090b1441bf673118e..198e59be7be43c809efc2f2192f24d9852708b79 100755 --- a/indra/newview/skins/default/xui/zh/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/zh/panel_script_ed.xml @@ -34,6 +34,7 @@ <menu_item_call label="å…¨é¸" name="Select All"/> <menu_item_call label="å–æ¶ˆé¸æ“‡" name="Deselect"/> <menu_item_call label="æœå°‹ / å–代..." name="Search / Replace..."/> + <menu_item_call label="å‰å¾€æŸè¡Œæ•¸â€¦" name="Go to line..."/> </menu> <menu label="幫助" name="Help"> <menu_item_call label="幫助..." name="Help..."/> diff --git a/indra/newview/skins/default/xui/zh/panel_tools_texture.xml b/indra/newview/skins/default/xui/zh/panel_tools_texture.xml new file mode 100644 index 0000000000000000000000000000000000000000..5ea6d818c73453f4af2a44bb2b68ce8e9849243c --- /dev/null +++ b/indra/newview/skins/default/xui/zh/panel_tools_texture.xml @@ -0,0 +1,116 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="æè³ª" name="Texture"> + <panel.string name="string repeats per meter"> + æ¯å…¬å°ºé‡è¦†æ¬¡æ•¸ + </panel.string> + <panel.string name="string repeats per face"> + æ¯ä¸€é¢é‡è¦†æ¬¡æ•¸ + </panel.string> + <text name="color label"> + é¡è‰² + </text> + <color_swatch label="" name="colorswatch" tool_tip="點按以開啟é¡è‰²æŒ‘é¸å™¨"/> + <text name="color trans"> + 逿˜Žåº¦ % + </text> + <text name="glow label"> + 光暈 + </text> + <check_box label="全亮" name="checkbox fullbright"/> + <combo_box name="combobox matmedia"> + <combo_box.item label="ææ–™" name="Materials"/> + <combo_box.item label="媒體" name="Media"/> + </combo_box> + <combo_box name="combobox mattype"> + <combo_box.item label="æè³ªï¼ˆæ¼«å射圖)" name="Texture (diffuse)"/> + <combo_box.item label="凹凸度(æ£äº¤ï¼‰" name="Bumpiness (normal)"/> + <combo_box.item label="閃亮度(é¡å光)" name="Shininess (specular)"/> + </combo_box> + <texture_picker label="æè³ª" name="texture control" tool_tip="點按以挑é¸åœ–片"/> + <text name="label alphamode"> + åŠé€æ˜Žæ¨¡å¼ + </text> + <combo_box name="combobox alphamode"> + <combo_box.item label="ç„¡" name="None"/> + <combo_box.item label="åŠé€æ˜Žæ”™æ··" name="Alpha blending"/> + <combo_box.item label="åŠé€æ˜Žé®ç½©" name="Alpha masking"/> + <combo_box.item label="自發光é®ç½©" name="Emissive mask"/> + </combo_box> + <text name="label maskcutoff"> + é®ç½©æˆªæ–·å€¼ + </text> + <texture_picker label="æè³ª" name="bumpytexture control" tool_tip="點按以挑é¸åœ–片"/> + <text name="label bumpiness"> + 凹凸度 + </text> + <combo_box name="combobox bumpiness"> + <combo_box.item label="ç„¡" name="None"/> + <combo_box.item label="亮度" name="Brightness"/> + <combo_box.item label="暗度" name="Darkness"/> + <combo_box.item label="木紋" name="woodgrain"/> + <combo_box.item label="樹皮" name="bark"/> + <combo_box.item label="磚" name="bricks"/> + <combo_box.item label="æ ¼å" name="checker"/> + <combo_box.item label="æ··å‡åœŸ" name="concrete"/> + <combo_box.item label="粗花磚" name="crustytile"/> + <combo_box.item label="石磚" name="cutstone"/> + <combo_box.item label="圓盤" name="discs"/> + <combo_box.item label="碎石" name="gravel"/> + <combo_box.item label="培養皿" name="petridish"/> + <combo_box.item label="å´é‚Šç‰‡" name="siding"/> + <combo_box.item label="çŸ³ç£šæ ¼" name="stonetile"/> + <combo_box.item label="彩色沙岩" name="stucco"/> + <combo_box.item label="å¸é™„" name="suction"/> + <combo_box.item label="編織" name="weave"/> + </combo_box> + <texture_picker label="æè³ª" name="shinytexture control" tool_tip="點按以挑é¸åœ–片"/> + <text name="label shininess"> + 閃亮度 + </text> + <combo_box name="combobox shininess"> + <combo_box.item label="ç„¡" name="None"/> + <combo_box.item label="低" name="Low"/> + <combo_box.item label="ä¸" name="Medium"/> + <combo_box.item label="高" name="High"/> + </combo_box> + <text name="label glossiness"> + 光滑度 + </text> + <text name="label environment"> + 環境 + </text> + <text name="label shinycolor"> + é¡è‰² + </text> + <color_swatch label="" name="shinycolorswatch" tool_tip="點按以開啟é¡è‰²æŒ‘é¸å™¨"/> + <text name="media_info"> + 所é¸åª’體如有 URLï¼Œç½®æ–¼æ¤ + </text> + <button label="鏿“‡â€¦" name="add_media" tool_tip="æ·»åŠ åª’é«”"/> + <button label="移除" name="delete_media" tool_tip="刪除這個媒體æè³ª"/> + <button label="å°é½Š" label_selected="å°é½Šåª’é«”" name="button align" tool_tip="å°é½Šåª’é«”æè³ªï¼ˆé ˆå…ˆè¼‰å…¥ï¼‰"/> + <text name="tex gen"> + æ˜ å°„æ–¹å¼ + </text> + <combo_box name="combobox texgen"> + <combo_box.item label="é è¨" name="Default"/> + <combo_box.item label="å¹³é¢" name="Planar"/> + </combo_box> + <spinner label="水平刻度" name="TexScaleU"/> + <spinner label="垂直刻度" name="TexScaleV"/> + <spinner label="æ¯å…¬å°ºé‡è¦†æ¬¡æ•¸" name="rptctrl"/> + <spinner label="旋轉角度" name="TexRot"/> + <spinner label="æ°´å¹³åè·" name="TexOffsetU"/> + <spinner label="垂直åè·" name="TexOffsetV"/> + <spinner label="水平刻度" name="bumpyScaleU"/> + <spinner label="垂直刻度" name="bumpyScaleV"/> + <spinner label="旋轉角度" name="bumpyRot"/> + <spinner label="æ°´å¹³åè·" name="bumpyOffsetU"/> + <spinner label="垂直åè·" name="bumpyOffsetV"/> + <spinner label="水平刻度" name="shinyScaleU"/> + <spinner label="垂直刻度" name="shinyScaleV"/> + <spinner label="旋轉角度" name="shinyRot"/> + <spinner label="æ°´å¹³åè·" name="shinyOffsetU"/> + <spinner label="垂直åè·" name="shinyOffsetV"/> + <check_box initial_value="false" label="å°é½Šå¹³é¢" name="checkbox planar align" tool_tip="ä»¥æœ€å¾Œæ‰€é¸æ“‡çš„é¢ç‚ºåŸºæº–,å°é½Šå…¨éƒ¨æ‰€é¸æ“‡çš„é¢ä¸Šçš„æè³ªã€‚ é€™å¿…é ˆä½¿ç”¨å¹³é¢æè³ªæ˜ å°„æ–¹å¼ã€‚"/> +</panel> diff --git a/indra/newview/skins/default/xui/zh/role_actions.xml b/indra/newview/skins/default/xui/zh/role_actions.xml index 767bcecde75ff7d49ee248220b35f3f250c8e434..9587981444a58620aed82fcff172b924d4afc5a5 100755 --- a/indra/newview/skins/default/xui/zh/role_actions.xml +++ b/indra/newview/skins/default/xui/zh/role_actions.xml @@ -25,7 +25,7 @@ </action_set> <action_set description="é€™äº›èƒ½åŠ›åŒ…æ‹¬å¯æ›´æ”¹åœ°æ®µå稱和發佈è¨å®šã€è¨å®šæ˜¯å¦å…¬é–‹åˆ°æœå°‹çµæžœã€è¨å®šç™»é™¸åœ°é»žå’Œçž¬é–“傳é€ç¹žè·¯é¸é …。" name="Parcel Identity"> <action description="切æ›ã€Œå°‡åœ°é»žé¡¯ç¤ºåœ¨æœå°‹çµæžœã€è¨å®šï¼Œä¸¦é¸å®šé¡žåˆ¥" longdescription="切æ›ã€Œå°‡åœ°é»žé¡¯ç¤ºåœ¨æœå°‹çµæžœã€è¨å®šï¼Œä¸¦åœ¨ã€ŒåœŸåœ°è³‡æ–™ã€> é¸é …é 籤è¨å®šåœ°æ®µé¡žåˆ¥ã€‚" name="land find places" value="17"/> - <action description="更改地段åç¨±ã€æè¿°ï¼Œå’Œã€Œå°‡åœ°é»žé¡¯ç¤ºåœ¨æœå°‹çµæžœã€è¨å®šã€‚" longdescription="更改地段åç¨±ã€æè¿°ï¼Œå’Œã€Œå°‡åœ°é»žé¡¯ç¤ºåœ¨æœå°‹çµæžœã€è¨å®šã€‚ 這å¯åœ¨ã€ŒåœŸåœ°è³‡æ–™ã€> é¸é …é 籤完æˆã€‚" name="land change identity" value="18"/> + <action description="更改地段åç¨±ã€æè¿°ã€ã€Œé©åº¦æˆäººå…§å®¹ã€è¨å®š" longdescription="更改地段åç¨±ã€æè¿°ã€ã€Œé©åº¦æˆäººå…§å®¹ã€è¨å®šã€‚ 這å¯åœ¨ã€ŒåœŸåœ°è³‡æ–™ã€> é¸é …é 籤完æˆã€‚" name="land change identity" value="18"/> <action description="è¨å®šç™»é™¸åœ°é»žå’Œçž¬é–“傳é€ç¹žè·¯è¨å®šã€‚" longdescription="åœ¨ç¾¤çµ„æ‰€æœ‰çš„åœ°æ®µä¸Šï¼Œèº«è² å…·æ¤èƒ½åŠ›çš„æˆå“¡ï¼Œå¯ä»¥è¨å®šäººå€‘瞬間傳é€é€²ä¾†æ™‚的登陸地點,和瞬間傳é€çš„繞路é¸é …。 這å¯åœ¨ã€ŒåœŸåœ°è³‡æ–™ã€> é¸é …é 籤完æˆã€‚" name="land set landing point" value="19"/> </action_set> <action_set description="這些能力包括有權更改地段é¸é …,例如「新建物件ã€ã€ã€Œç·¨è¼¯åœ°å½¢ã€ï¼Œå’ŒéŸ³æ¨‚ã€åª’é«”è¨å®šç‰ã€‚" name="Parcel Settings"> diff --git a/indra/newview/skins/default/xui/zh/strings.xml b/indra/newview/skins/default/xui/zh/strings.xml index 31713ac2816819e1b6ba846409bcc00bba22f306..d9fa105ef492fd6ea127da1e724f1352eb34644f 100755 --- a/indra/newview/skins/default/xui/zh/strings.xml +++ b/indra/newview/skins/default/xui/zh/strings.xml @@ -139,6 +139,9 @@ <string name="create_account_url"> http://join.secondlife.com/?sourceid=[sourceid] </string> + <string name="ViewerDownloadURL"> + http://secondlife.com/download + </string> <string name="LoginFailedViewerNotPermitted"> ä½ ç›®å‰æ‰€ç”¨çš„ Viewer 已經無法å†é€²å…¥ç¬¬äºŒäººç”Ÿã€‚ 請到這個é é¢ä¸‹è¼‰æœ€æ–° Viewer: http://secondlife.com/download @@ -443,6 +446,9 @@ http://secondlife.com/viewer-access-faq <string name="SLappAgentRequestFriend"> 交å‹è¦æ±‚ </string> + <string name="SLappAgentRemoveFriend"> + ç§»é™¤æœ‹å‹ + </string> <string name="BUTTON_CLOSE_DARWIN"> 關閉(⌘W) </string> @@ -830,6 +836,9 @@ http://secondlife.com/viewer-access-faq <string name="multiple_textures"> 多個 </string> + <string name="use_texture"> + 使用æè³ª + </string> <string name="texture_loading"> 載入ä¸... </string> @@ -929,6 +938,21 @@ http://secondlife.com/viewer-access-faq <string name="TeleportYourAgent"> 瞬間傳é€ä½ 本人 </string> + <string name="JoinAnExperience"> + åŠ å…¥é«”é©— + </string> + <string name="SilentlyManageEstateAccess"> + 管ç†é ˜å‡ºå…¥è¨±å¯å單時,ä¸é¡¯ç¤ºè¦ç¤º + </string> + <string name="OverrideYourAnimations"> + 替æ›ä½ é è¨çš„動作 + </string> + <string name="ScriptReturnObjects"> + ç‚ºä½ é€è¿”物件 + </string> + <string name="UnknownScriptPermission"> + ï¼ˆæœªçŸ¥ï¼‰ï¼ + </string> <string name="SIM_ACCESS_PG"> 一般普級 </string> @@ -1960,6 +1984,12 @@ http://secondlife.com/viewer-access-faq <string name="ATTACH_HUD_BOTTOM_RIGHT"> æ“¡é 顯示å³ä¸‹ </string> + <string name="ATTACH_NECK"> + é ¸éƒ¨ + </string> + <string name="ATTACH_AVATAR_CENTER"> + 化身ä¸å¿ƒ + </string> <string name="CursorPos"> 橫行 [LINE],縱列 [COLUMN] </string> @@ -2989,6 +3019,9 @@ http://secondlife.com/viewer-access-faq <string name="Hip Width"> 腰寬 </string> + <string name="Hover"> + åœæ‡¸ + </string> <string name="In"> å‘å…§ </string> @@ -5085,4 +5118,7 @@ http://secondlife.com/viewer-access-faq <string name="logging_calls_enabled_log_empty"> ç›®å‰æ²’有交談記錄。 åœ¨ä½ è¯çµ¡æŸäººæˆ–æŸäººè¯çµ¡ä½ 之後,這裡將留å˜è¨˜éŒ„。 </string> + <string name="loading_chat_logs"> + 載入ä¸â€¦ + </string> </strings> diff --git a/indra/newview/tests/gpus_results.txt b/indra/newview/tests/gpus_results.txt index 68e2e688cb9f7aefb22967f097caf775bb6e94be..106593afd5f9752219f2ded6b504e056a9d8081e 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 570f92a9b064c85a4b623b1c824e9bfd7e5ed641..a417cb37617b763d14aa623977ef1667813c0f17 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 0000000000000000000000000000000000000000..083f29aaa01e0d85ae7ae769df17c4ad3d1c0155 --- /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/llagentaccess_test.cpp b/indra/newview/tests/llagentaccess_test.cpp index a40b5c9a3d1836691d7ca0f2adeb1e77ad58158e..45ce1ba62f34e4754c4a434b739221ce43632323 100755 --- a/indra/newview/tests/llagentaccess_test.cpp +++ b/indra/newview/tests/llagentaccess_test.cpp @@ -40,7 +40,7 @@ static U32 test_preferred_maturity = SIM_ACCESS_PG; LLControlGroup::LLControlGroup(const std::string& name) - : LLInstanceTracker<LLControlGroup, std::string>(name) +: LLInstanceTracker<LLControlGroup, std::string>(name) { } diff --git a/indra/newview/tests/lltranslate_test.cpp b/indra/newview/tests/lltranslate_test.cpp index fd9527d631a921ce957e8b41e1b56a1c98ec4123..8ce56326d83c54d84419f97a738900e93bc5f8be 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 19863dd84548f7eb077899f97dfb55a2fdcaeb7a..9e8623c1f9c12910a6eff8c81ea8bdde5bb8c09f 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -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 try: from llbase import llsd except ImportError: @@ -104,26 +104,45 @@ 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() + + # did we actually copy anything into settings_install dict? + if settings_install: + # 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 +205,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 +295,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 +346,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 +579,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 +613,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)}) @@ -649,7 +643,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 +665,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") @@ -807,6 +801,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'] @@ -836,22 +831,16 @@ class DarwinManifest(ViewerManifest): # 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 +867,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 +915,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 +950,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 +978,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 +1020,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 +1108,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/lltemplatemessagebuilder_tut.cpp b/indra/test/lltemplatemessagebuilder_tut.cpp index 6c0b70edd2e15690186dfd30af42fefa7d02b0ac..dde70f98c8fc1f087ce15f1651b93fe588b6143b 100755 --- a/indra/test/lltemplatemessagebuilder_tut.cpp +++ b/indra/test/lltemplatemessagebuilder_tut.cpp @@ -958,6 +958,7 @@ namespace tut reader->validateMessage(buffer, builtSize, LLHost()); reader->readMessage(buffer, LLHost()); reader->getU32(_PREHASH_Test0, _PREHASH_Test0, outValue); + (void)outValue; char outBuffer[bufferSize]; memset(buffer, 0xcc, bufferSize); reader->getString(_PREHASH_Test1, _PREHASH_Test0, bufferSize, diff --git a/indra/test_apps/llfbconnecttest/CMakeLists.txt b/indra/test_apps/llfbconnecttest/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..f56329a0101cc545cab7de4b1a0e66901049e7d9 --- /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 0000000000000000000000000000000000000000..3995627ea9e1caa6d759272d14466231f83a1f1b --- /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 0000000000000000000000000000000000000000..483a15c468b9dac99a282e247abd47d151dd626d --- /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 0000000000000000000000000000000000000000..6f442a55b3e2db5fa5c8bfb056b7609fd4e93354 --- /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 d6e06e5316adf502f3cbd418f8c22394d5f5f115..dc8ff2f64476517cbbb573556a1ff6141739cdb9 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 c28ad76c77f81d18fed2c26ef18d0822e0bbf9b2..c42112af807d24e9e94a9e51342a3f2706c2b305 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 16950e1d62ea821010119022e227c2b7ecba3654..cb3be5bbdcd5a7879a601ee57c72243a3e612684 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 2fc6fcdb29e1b04a33feb56014cc96af7b84d131..08f4f0ebb9649bd284d301090a690658107b1436 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 @@ -136,6 +142,23 @@ def write_marker(markerfile, markertext): # try to log it -- otherwise shrug. 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 # **************************************************************************** @@ -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 diff --git a/scripts/gpu_table_tester b/scripts/gpu_table_tester index 9bc958636dc9a899089c700cdef4f0708bf29ff0..af0678000d7c011977be57ccbbdbf4b772fe809f 100755 --- a/scripts/gpu_table_tester +++ b/scripts/gpu_table_tester @@ -73,6 +73,10 @@ die "Must specify a --gpu-table <gpu_table.txt> value" open(GPUS, "<$GpuTable") || die "Failed to open gpu table '$GpuTable':\n\t$!\n"; +my $FirstLine = <GPUS>; +die "First line of gpu table does not begin with '//GPU_TABLE'" + unless $FirstLine =~ m|^//GPU_TABLE|; + # Parse the GPU table into these tables, indexed by the name my %NameLine; # name -> line number on which a given name was found (catches duplicate names) my %RecognizerLine; # name -> line number on which a given name was found (catches duplicate names) @@ -81,11 +85,15 @@ my %Recognizer; # name -> recognizer my %Class; # recognizer -> class my %Supported; # recognizer -> supported my @InOrder; # lowercased recognizers in file order - these are the ones really used to match +my %StatsBased; +my %ExpectedOpenGL; $Name{$NoMatch} = $NoMatch; $NameLine{$NoMatch} = '(hard-coded)'; # use this for error messages in table parsing $Class{$NoMatch} = ''; $Supported{$NoMatch} = ''; +$StatsBased{$NoMatch} = ''; +$ExpectedOpenGL{$NoMatch} = ''; while (<GPUS>) { @@ -93,7 +101,7 @@ while (<GPUS>) next if m|^\s*$|; # skip blank lines chomp; - my ($name, $regex, $class, $supported, $extra) = split('\t+'); + my ($name, $regex, $class, $supported, $stats_based, $expected_opengl, $extra) = split('\t+'); my $errsOnLine = $ErrorsSeen; if (!$name) { @@ -119,7 +127,7 @@ while (<GPUS>) print STDERR " $INPUT_LINE_NUMBER: name '$name' " . ($supported ? "supported" : "unsupported") . " class $class - ignored\n"; $ErrorsSeen++; } - if ($class !~ m/[0123]/) + if ($class !~ m/[012345]/) { print STDERR "Invalid class value '$class' on $GpuTable line $INPUT_LINE_NUMBER\n"; $ErrorsSeen++; @@ -129,6 +137,16 @@ while (<GPUS>) print STDERR "Invalid supported value '$supported' on $GpuTable line $INPUT_LINE_NUMBER\n"; $ErrorsSeen++; } + if ($stats_based !~ m/[01]/) + { + print STDERR "Invalid stats_based value '$stats_based' on $GpuTable line $INPUT_LINE_NUMBER\n"; + $ErrorsSeen++; + } + if ($expected_opengl !~ m/\d+(\.\d+)?/) + { + print STDERR "Invalid expected_opengl value '$expected_opengl' on $GpuTable line $INPUT_LINE_NUMBER\n"; + $ErrorsSeen++; + } if ($extra) { print STDERR "Extra data '$extra' on $GpuTable line $INPUT_LINE_NUMBER\n"; @@ -144,6 +162,8 @@ while (<GPUS>) $Recognizer{$name} = $regex; $Class{$regex} = $class; $Supported{$regex} = $supported ? "supported" : "unsupported"; + $StatsBased{$regex} = $stats_based; + $ExpectedOpenGL{$regex} = $expected_opengl; } } @@ -159,6 +179,7 @@ my %RecognizedBy; while (<>) { chomp; + $_ = substr($_,0,100); my $lcInput = lc $_; # the real gpu table parser lowercases the input string my $recognizer; $RecognizedBy{$_} = $NoMatch; @@ -174,34 +195,31 @@ while (<>) } format STDOUT_TOP = -GPU String Supported? Class Recognizer ------------------------------------------------------------------------------------------------------- ----------- ----- ------------------------------------ +GPU String Supported? Class Stats OpenGL Recognizer +------------------------------------------------------------------------------------------------------ ----------- ----- ----- ------ ------------------------------------ . format STDOUT = -@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... @<<<<<<<<<< @> @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... -$_, $Supported{$RecognizedBy{$_}},$Class{$RecognizedBy{$_}},$Name{$RecognizedBy{$_}} +@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<< @> @> @<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... +$_, $Supported{$RecognizedBy{$_}},$Class{$RecognizedBy{$_}},$StatsBased{$RecognizedBy{$_}},$ExpectedOpenGL{$RecognizedBy{$_}},$Name{$RecognizedBy{$_}} . -my $ReportLineTemplate = "A102xxxA12xxxAA*"; # MUST match the format STDOUT above - -format DIFF_TOP = - ------ OLD ------ ------ NEW ------ -GPU String Supported? Class Supported? Class ------------------------------------------------------------------------------------------------------- ----------- ----- ----------- ----- -. +my $ReportLineTemplate = "A102xxxA12xxxA2xxxxA2xxxxA5A*"; # Used to read a previous report - MUST match the format STDOUT above my ( $oldSupported, $oldClass, $newSupported, $newClass ); +format DIFF_TOP = + ------------- OLD ------------- ----------- NEW -------------------- +GPU String Supported? Class Stats OpenGL Supported? Class Stats OpenGL Line +------------------------------------------------------------------------------------------------------ ----------- ----- ----- ------ ----------- ----- ----- ------ ----- +. format DIFF = -@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... @<<<<<<<<<< @> @<<<<<<<<<< @> -$_, $oldSupported, $oldClass, $newSupported, $newClass +@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<< @> @> @<<<< @<<<<<<<<<< @> @> @<<<< @>>>> +$_, $oldSupported, $oldClass, $oldStatsBased, $oldExpectedOpenGL, $newSupported, $newClass, $newStatsBased, $newExpectedOpenGL, $newRecognizedLine . if ( ! $Diff ) { - ## Print results. - ## For each input, show supported or unsupported, the class, and the recognizer name - + ## Print results of testing each input line and how it was recognized. foreach ( sort keys %RecognizedBy ) { write if ! $UnMatchedOnly || $Name{$RecognizedBy{$_}} eq $NoMatch; @@ -210,17 +228,20 @@ if ( ! $Diff ) } else { + ## Print a comparison of how the recognition this time compared to the results from the $Diff file open OLD, "<$Diff" || die "Failed to open --diff file '$Diff'\n\t$!\n"; my $discard = 2; while ( <OLD> ) { - if ( $discard > 0 ) + if ( $discard <= 0 ) { - my ( $gpu, $supported, $class ) = unpack $ReportLineTemplate; + my ( $gpu, $supported, $class, $stats, $opengl ) = unpack $ReportLineTemplate; $gpu =~ s/\s*$//; ( $OldSupported{$gpu} = $supported ) =~ s/\s*$//; ( $OldClass{$gpu} = $class ) =~ s/\s*$//; + ( $OldStatsBased{$gpu} = $stats ) =~ s/\s*$//; + ( $OldExpectedOpenGL{$gpu} = $opengl ) =~ s/\s*$//; } else { @@ -229,33 +250,43 @@ else } close OLD; - $FORMAT_TOP_NAME = DIFF_TOP; - $FORMAT_NAME = DIFF; + $FORMAT_TOP_NAME = 'DIFF_TOP'; + $FORMAT_NAME = 'DIFF'; foreach ( sort keys %RecognizedBy ) { $newSupported = $Supported{$RecognizedBy{$_}} || $NoMatch; $newClass = $Class{$RecognizedBy{$_}}; + $newStatsBased = $StatsBased{$RecognizedBy{$_}}; + $newExpectedOpenGL = $ExpectedOpenGL{$RecognizedBy{$_}}; + $newRecognizedLine = $RecognizerLine{$RecognizedBy{$_}}; if ( ! defined $OldSupported{$_} ) { $oldSupported = 'NEW'; $oldClass = '-'; + $oldStatsBased = '-'; + $oldExpectedOpenGL = '-'; + write; + $-++; # suppresses pagination } else { $oldSupported = $OldSupported{$_} || $NoMatch; $oldClass = $OldClass{$_}; + $oldStatsBased = $OldStatsBased{$_}; + $oldExpectedOpenGL = $OldExpectedOpenGL{$_}; - if ( ( $oldSupported eq $newSupported ) - && ( $oldClass eq $newClass ) + if ( ( $oldSupported ne $newSupported ) + || ( $oldClass ne $newClass ) + || ( $oldStatsBased ne $newStatsBased ) + || ( $oldExpectedOpenGL ne $newExpectedOpenGL ) ) { - $newSupported = ''; - $newClass = ''; + write; + $-++; # suppresses pagination } } - write; - $-++; # suppresses pagination + } }