diff options
Diffstat (limited to 'indra/newview')
82 files changed, 1728 insertions, 1910 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 87caca56af..631089f6ce 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -47,6 +47,7 @@ include(OpenGL)  include(OpenSSL)  include(PNG)  include(TemplateCheck) +include(Tracy)  include(UI)  include(UnixInstall)  include(ViewerMiscLibs) @@ -92,6 +93,7 @@ include_directories(      ${LIBS_PREBUILT_DIR}/include/collada/1.4      ${LLAPPEARANCE_INCLUDE_DIRS}      ${CMAKE_CURRENT_SOURCE_DIR} +    ${TRACY_INCLUDE_DIR}      )  include_directories(SYSTEM @@ -587,7 +589,6 @@ set(viewer_SOURCE_FILES      llsyntaxid.cpp      llsyswellitem.cpp      llsyswellwindow.cpp -    lltelemetry.cpp      llteleporthistory.cpp      llteleporthistorystorage.cpp      lltextureatlas.cpp @@ -1835,10 +1836,6 @@ if (WINDOWS)        ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt        ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt -      ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll -      ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll -      ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll -      ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll        ${viewer_APPSETTINGS_FILES}        SLPlugin        media_plugin_cef @@ -1855,11 +1852,15 @@ if (WINDOWS)          list(APPEND COPY_INPUT_DEPENDENCIES              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk_x64.dll              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp_x64.dll +           ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1-x64.dll +           ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1-x64.dll              )      else (ADDRESS_SIZE EQUAL 64)          list(APPEND COPY_INPUT_DEPENDENCIES              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll              ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll +            ${ARCH_PREBUILT_DIRS_RELEASE}/libcrypto-1_1.dll +            ${ARCH_PREBUILT_DIRS_RELEASE}/libssl-1_1.dll              )      endif (ADDRESS_SIZE EQUAL 64) @@ -1913,11 +1914,9 @@ if (WINDOWS)        add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts)      endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) -    add_dependencies(${VIEWER_BINARY_NAME} SLPlugin) - -    if (NOT USE_BUGSPLAT) -        add_dependencies(${VIEWER_BINARY_NAME} windows-crash-logger) -    endif (NOT USE_BUGSPLAT) +    add_dependencies(${VIEWER_BINARY_NAME} +      SLPlugin +    )      # sets the 'working directory' for debugging from visual studio.      # Condition for version can be moved to requirements once build agents will be updated (see TOOL-3865) @@ -2067,6 +2066,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}      ${LLPHYSICS_LIBRARIES}      ${LLPHYSICSEXTENSIONS_LIBRARIES}      ${LLAPPEARANCE_LIBRARIES} +    ${TRACY_LIBRARY}      )  if (USE_BUGSPLAT) @@ -2226,10 +2226,6 @@ if (DARWIN)    add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_libvlc media_plugin_cef) -  if (NOT USE_BUGSPLAT) -      add_dependencies(${VIEWER_BINARY_NAME} mac-crash-logger) -  endif (NOT USE_BUGSPLAT) -    if (ENABLE_SIGNING)        set(SIGNING_SETTING "--signature=${SIGNING_IDENTITY}")    else (ENABLE_SIGNING) @@ -2271,62 +2267,7 @@ endif (INSTALL)  # Note that the conventional VIEWER_SYMBOL_FILE is set by ../../build.sh  if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIEWER_SYMBOL_FILE) -  if (NOT USE_BUGSPLAT) -    # Breakpad symbol-file generation -    set(SYMBOL_SEARCH_DIRS "") -    if (WINDOWS) -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") -      # slplugin.exe failing symbols dump - need to debug, might have to do with updated version of google breakpad -      # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") -      set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") -      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") -      set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) -    endif (WINDOWS) -    if (DARWIN) -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") -      # *TODO: Generate these search dirs in the cmake files related to each binary. -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/llplugin/slplugin/${CMAKE_CFG_INTDIR}") -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/mac_crash_logger/${CMAKE_CFG_INTDIR}") -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/media_plugins/gstreamer010/${CMAKE_CFG_INTDIR}") -      set(VIEWER_EXE_GLOBS "'${product}' SLPlugin") -      set(VIEWER_EXE_GLOBS "'${product}' mac-crash-logger") -      set(VIEWER_LIB_GLOB "*.dylib") -    endif (DARWIN) -    if (LINUX) -      list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") -      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin") -      set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin") -      set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") -      set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) -    endif (LINUX) - -    if(CMAKE_CFG_INTDIR STREQUAL ".") -        set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) -    else(CMAKE_CFG_INTDIR STREQUAL ".") -        # set LLBUILD_CONFIG to be a shell variable evaluated at build time -        # reflecting the configuration we are currently building. -        set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) -    endif(CMAKE_CFG_INTDIR STREQUAL ".") -    add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" -      COMMAND "${PYTHON_EXECUTABLE}" -      ARGS -        "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" -        "${LLBUILD_CONFIG}" -        "${SYMBOL_SEARCH_DIRS}" -        "${VIEWER_EXE_GLOBS}" -        "${VIEWER_LIB_GLOB}" -        "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" -        "${VIEWER_SYMBOL_FILE}" -      DEPENDS generate_breakpad_symbols.py -          VERBATIM) - -    add_custom_target(generate_symbols DEPENDS "${VIEWER_SYMBOL_FILE}" ${VIEWER_BINARY_NAME} "${VIEWER_COPY_MANIFEST}") -    add_dependencies(generate_symbols ${VIEWER_BINARY_NAME}) -    if (WINDOWS OR LINUX) -      add_dependencies(generate_symbols "${VIEWER_COPY_MANIFEST}") -    endif (WINDOWS OR LINUX) - -  else (NOT USE_BUGSPLAT) +  if (BUGSPLAT_DB)      # BugSplat symbol-file generation      if (WINDOWS)        # Just pack up a tarball containing only the .pdb file for the @@ -2410,7 +2351,7 @@ if (PACKAGE AND (RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) AND VIE      if (LINUX)        # TBD      endif (LINUX) -  endif (NOT USE_BUGSPLAT) +  endif (BUGSPLAT_DB)    # for both Bugsplat and Breakpad    add_dependencies(llpackage generate_symbols) diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt index 4c8366c864..f186cd8874 100644 --- a/indra/newview/VIEWER_VERSION.txt +++ b/indra/newview/VIEWER_VERSION.txt @@ -1 +1 @@ -6.4.23 +6.4.24 diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5987bc3ddf..aeeba58a68 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -812,17 +812,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>FramePerSecondLimit</key> -    <map> -      <key>Comment</key> -      <string>Controls upper limit of frames per second</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>U32</string> -      <key>Value</key> -      <integer>120</integer> -    </map>      <key>BackgroundYieldTime</key>      <map>        <key>Comment</key> @@ -3366,13 +3355,13 @@      <key>DisableVerticalSync</key>      <map>        <key>Comment</key> -      <string>Update frames as fast as possible (FALSE = update frames between display scans)</string> +      <string>Update frames as fast as possible (FALSE = update frames between display scans).  Requires restart.</string>        <key>Persist</key>        <integer>1</integer>        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>1</integer> +      <integer>0</integer>      </map>      <key>EnableGroupChatPopups</key>      <map> @@ -9836,7 +9825,7 @@        <key>Type</key>        <string>Boolean</string>        <key>Value</key> -      <integer>0</integer> +      <integer>1</integer>      </map>      <key>RenderGlow</key>      <map> diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py deleted file mode 100755 index d351c406bc..0000000000 --- a/indra/newview/generate_breakpad_symbols.py +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env python -"""\ -@file generate_breakpad_symbols.py -@author Brad Kittenbrink <brad@lindenlab.com> -@brief Simple tool for generating google_breakpad symbol information -       for the crash reporter. - -$LicenseInfo:firstyear=2010&license=viewerlgpl$ -Second Life Viewer Source Code -Copyright (C) 2010-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$ -""" - - -import collections -import fnmatch -import itertools -import os -import re -import sys -import shlex -import subprocess -import tarfile -import StringIO -import pprint - -DEBUG=False - -def usage(): -    print >>sys.stderr, "usage: %s search_dirs viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0] - -class MissingModuleError(Exception): -    def __init__(self, modules): -        Exception.__init__(self, "Failed to find required modules: %r" % modules) -        self.modules = modules - -def main(configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): -    print "generate_breakpad_symbols run with args: %s" % str((configuration, search_dirs, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) - -    if not re.match("release", configuration, re.IGNORECASE): -        print "skipping breakpad symbol generation for non-release build." -        return 0 - -    # split up list of viewer_exes -    # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] -    viewer_exes = shlex.split(viewer_exes) - -    found_required = dict([(module, False) for module in viewer_exes]) - -    def matches(f): -        if f in viewer_exes: -            found_required[f] = True -            return True -        return fnmatch.fnmatch(f, libs_suffix) - -    search_dirs = search_dirs.split(";") - -    def list_files(): -        for search_dir in search_dirs: -            for (dirname, subdirs, filenames) in os.walk(search_dir): -                if DEBUG: -                    print "scanning '%s' for modules..." % dirname -                for f in itertools.ifilter(matches, filenames): -                    yield os.path.join(dirname, f) - -    def dump_module(m): -        print "dumping module '%s' with '%s'..." % (m, dump_syms_tool) -        dsym_full_path = m -        child = subprocess.Popen([dump_syms_tool, dsym_full_path] , stdout=subprocess.PIPE) -        out, err = child.communicate() -        return (m,child.returncode, out, err) - -     -    modules = {} -         -    for m in list_files(): -        if DEBUG: -            print "examining module '%s' ... " % m, -        filename=os.path.basename(m) -        if -1 != m.find("DWARF"): -            # Just use this module; it has the symbols we want. -            modules[filename] = m -            if DEBUG: -                print "found dSYM entry" -        elif filename not in modules: -            # Only use this if we don't already have a (possibly better) entry. -            modules[filename] = m -            if DEBUG: -                print "found new entry" -        elif DEBUG: -            print "ignoring entry" - - -    print "Found these following modules:" -    pprint.pprint( modules ) - -    out = tarfile.open(viewer_symbol_file, 'w:bz2') -    for (filename,status,symbols,err) in itertools.imap(dump_module, modules.values()): -        if status == 0: -            module_line = symbols[:symbols.index('\n')] -            module_line = module_line.split() -            hash_id = module_line[3] -            module = ' '.join(module_line[4:]) -            if sys.platform in ['win32', 'cygwin']: -                mod_name = module[:module.rindex('.pdb')] -            else: -                mod_name = module -            symbolfile = StringIO.StringIO(symbols) -            info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name)) -            info.size = symbolfile.len -            out.addfile(info, symbolfile) -        else: -            print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err) - -    out.close() - -    missing_modules = [m for (m,_) in -        itertools.ifilter(lambda (k,v): not v, found_required.iteritems()) -    ] -    if missing_modules: -        print >> sys.stderr, "failed to generate %s" % viewer_symbol_file -        os.remove(viewer_symbol_file) -        raise MissingModuleError(missing_modules) - -    symbols = tarfile.open(viewer_symbol_file, 'r:bz2') -    tarfile_members = symbols.getnames() -    symbols.close() - -    for required_module in viewer_exes: -        def match_module_basename(m): -            return os.path.splitext(required_module)[0].lower() \ -                   == os.path.splitext(os.path.basename(m))[0].lower() -        # there must be at least one .sym file in tarfile_members that matches -        # each required module (ignoring file extensions) -        if not any(itertools.imap(match_module_basename, tarfile_members)): -            print >> sys.stderr, "failed to find required %s in generated %s" \ -                    % (required_module, viewer_symbol_file) -            os.remove(viewer_symbol_file) -            raise MissingModuleError([required_module]) - -    print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes) - -    return 0 - -if __name__ == "__main__": -    if len(sys.argv) != 7: -        usage() -        sys.exit(1) -    sys.exit(main(*sys.argv[1:])) - diff --git a/indra/newview/installers/darwin/apple-notarize.sh b/indra/newview/installers/darwin/apple-notarize.sh new file mode 100755 index 0000000000..466898ecda --- /dev/null +++ b/indra/newview/installers/darwin/apple-notarize.sh @@ -0,0 +1,54 @@ +#!/bin/sh +if [[ $SKIP_NOTARIZATION == "true" ]]; then +    echo "Skipping notarization" +    exit 0 +fi + +CONFIG_FILE="$build_secrets_checkout/code-signing-osx/notarize_creds.sh" +if [ -f "$CONFIG_FILE" ]; then +    source $CONFIG_FILE +    app_file="$1" +    zip_file=${app_file/app/zip} +    ditto -c -k --keepParent "$app_file" "$zip_file" +    if [ -f "$zip_file" ]; then +        res=$(xcrun altool --notarize-app --primary-bundle-id "com.secondlife.viewer" \ +                                   --username $USERNAME \ +                                   --password $PASSWORD \ +                                   --asc-provider $ASC_PROVIDER \ +                                   --file "$zip_file" 2>&1) +        requestUUID=$(echo $res | awk '/RequestUUID/ { print $NF; }') + +        echo "Apple Notarization RequestUUID: $requestUUID" + +        if [[ -n $requestUUID ]]; then +            status="in progress" +            while [[ "$status" == "in progress" ]]; do +                sleep 30 +                status=$(xcrun altool --notarization-info "$requestUUID" \ +                                            --username $USERNAME \ +                                            --password $PASSWORD 2>&1 \ +                                | awk -F ': ' '/Status:/ { print $2; }' ) +                echo "$status" +            done +            # log results +            xcrun altool --notarization-info "$requestUUID" \ +                        --username $USERNAME \ +                        --password $PASSWORD + +            #remove temporary file +            rm "$zip_file" + +            if [["$status" == "success"]]; then +                xcrun stapler staple "$app_file" +            elif [["$status" == "invalid"]]; then +                echo "Notarization error: failed to process the app file" +                exit 1 +            fi +        else +            echo "Notarization error: couldn't get request UUID" +            echo $res +            exit 1 +        fi +    fi +fi + diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 41a83a1484..8492aba222 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -91,7 +91,6 @@  #include "llsdutil_math.h"  #include "lllocationhistory.h"  #include "llfasttimerview.h" -#include "lltelemetry.h"  #include "llvector4a.h"  #include "llviewermenufile.h"  #include "llvoicechannel.h" @@ -614,7 +613,7 @@ static void settings_modify()  	LLPipeline::sRenderDeferred		= LLPipeline::sRenderTransparentWater && LLPipeline::sRenderBump && gSavedSettings.getBOOL("RenderDeferred");  	LLVOSurfacePatch::sLODFactor		= gSavedSettings.getF32("RenderTerrainLODFactor");  	LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] -	gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession; +    gDebugGL = gSavedSettings.getBOOL("RenderDebugGL") || gDebugSession;  	gDebugPipeline = gSavedSettings.getBOOL("RenderDebugPipeline");  } @@ -695,8 +694,7 @@ LLAppViewer::LLAppViewer()  	mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),  	mFastTimerLogThread(NULL),  	mSettingsLocationList(NULL), -	mIsFirstRun(false), -	mMinMicroSecPerFrame(0.f) +	mIsFirstRun(false)  {  	if(NULL != sInstance)  	{ @@ -739,7 +737,7 @@ LLAppViewer::LLAppViewer()  	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");  #   endif // ! LL_BUGSPLAT  	mDumpPath = logdir; -	setMiniDumpDir(logdir); +  	setDebugFileNames(logdir);  } @@ -1012,19 +1010,6 @@ bool LLAppViewer::init()  		return 0;  	} -    // If we don't have the right shader requirements. -    if (!gGLManager.mHasShaderObjects -        || !gGLManager.mHasVertexShader -        || !gGLManager.mHasFragmentShader) -    { -        LLUIString details = LLNotifications::instance().getGlobalString("UnsupportedShaderRequirements"); -        OSMessageBox( -            details.getString(), -            LLStringUtil::null, -            OSMB_OK); -        return 0; -    } -  	// Without SSE2 support we will crash almost immediately, warn here.  	if (!gSysCPU.hasSSE2())  	{ @@ -1327,10 +1312,6 @@ bool LLAppViewer::init()  	joystick = LLViewerJoystick::getInstance();  	joystick->setNeedsReset(true);  	/*----------------------------------------------------------------------*/ - -	gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2)); -	onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit")); -  	// Load User's bindings  	loadKeyBindings(); @@ -1359,7 +1340,8 @@ void LLAppViewer::initMaxHeapSize()  }  static LLTrace::BlockTimerStatHandle FTM_MESSAGES("System Messages"); -static LLTrace::BlockTimerStatHandle FTM_SLEEP("Sleep"); +static LLTrace::BlockTimerStatHandle FTM_SLEEP1("Sleep1"); +static LLTrace::BlockTimerStatHandle FTM_SLEEP2("Sleep2");  static LLTrace::BlockTimerStatHandle FTM_YIELD("Yield");  static LLTrace::BlockTimerStatHandle FTM_TEXTURE_CACHE("Texture Cache"); @@ -1421,13 +1403,17 @@ bool LLAppViewer::frame()  bool LLAppViewer::doFrame()  { +	LL_RECORD_BLOCK_TIME(FTM_FRAME); +  	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));  	LLSD newFrame; -	LL_RECORD_BLOCK_TIME(FTM_FRAME); -	LLTrace::BlockTimer::processTimes(); -	LLTrace::get_frame_recording().nextPeriod(); -	LLTrace::BlockTimer::logStats(); +	{ +		LL_PROFILE_ZONE_NAMED( "df blocktimer" ) +		LLTrace::BlockTimer::processTimes(); +		LLTrace::get_frame_recording().nextPeriod(); +		LLTrace::BlockTimer::logStats(); +	}  	LLTrace::get_thread_recorder()->pullFromChildren(); @@ -1435,6 +1421,7 @@ bool LLAppViewer::doFrame()  	LL_CLEAR_CALLSTACKS();  	{ +		LL_PROFILE_ZONE_NAMED( "df processMiscNativeEvents" )  		pingMainloopTimeout("Main:MiscNativeWindowEvents");  		if (gViewerWindow) @@ -1443,7 +1430,10 @@ bool LLAppViewer::doFrame()  			gViewerWindow->getWindow()->processMiscNativeEvents();  		} -		pingMainloopTimeout("Main:GatherInput"); +		{ +			LL_PROFILE_ZONE_NAMED( "df gatherInput" ) +			pingMainloopTimeout("Main:GatherInput"); +		}  		if (gViewerWindow)  		{ @@ -1467,13 +1457,21 @@ bool LLAppViewer::doFrame()  			}  		} -		// canonical per-frame event -		mainloop.post(newFrame); -		// give listeners a chance to run -		llcoro::suspend(); +		{ +			LL_PROFILE_ZONE_NAMED( "df mainloop" ) +			// canonical per-frame event +			mainloop.post(newFrame); +		} + +		{ +			LL_PROFILE_ZONE_NAMED( "df suspend" ) +			// give listeners a chance to run +			llcoro::suspend(); +		}  		if (!LLApp::isExiting())  		{ +			LL_PROFILE_ZONE_NAMED( "df JoystickKeyboard" )  			pingMainloopTimeout("Main:JoystickKeyboard");  			// Scan keyboard for movement keys.  Command keys and typing @@ -1494,12 +1492,18 @@ bool LLAppViewer::doFrame()  			// Update state based on messages, user input, object idle.  			{ -				pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds! +				{ +					LL_PROFILE_ZONE_NAMED( "df pauseMainloopTimeout" ) +					pauseMainloopTimeout(); // *TODO: Remove. Messages shouldn't be stalling for 20+ seconds! +				}  				LL_RECORD_BLOCK_TIME(FTM_IDLE);  				idle(); -				resumeMainloopTimeout(); +				{ +					LL_PROFILE_ZONE_NAMED( "df resumeMainloopTimeout" ) +					resumeMainloopTimeout(); +				}  			}  			if (gDoDisconnect && (LLStartUp::getStartupState() == STATE_STARTED)) @@ -1514,46 +1518,40 @@ bool LLAppViewer::doFrame()  			// *TODO: Should we run display() even during gHeadlessClient?  DK 2011-02-18  			if (!LLApp::isExiting() && !gHeadlessClient && gViewerWindow)  			{ +				LL_PROFILE_ZONE_NAMED( "df Display" )  				pingMainloopTimeout("Main:Display");  				gGLActive = TRUE;  				display(); -				static U64 last_call = 0; -				if (!gTeleportDisplay)  				{ -					// Frame/draw throttling, controlled by FramePerSecondLimit -					U64 elapsed_time = LLTimer::getTotalTime() - last_call; -					if (elapsed_time < mMinMicroSecPerFrame) -					{ -						LL_RECORD_BLOCK_TIME(FTM_SLEEP); -						// llclamp for when time function gets funky -						U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6); -						micro_sleep(sleep_time, 0); -					} -				} -				last_call = LLTimer::getTotalTime(); - -				pingMainloopTimeout("Main:Snapshot"); -				LLFloaterSnapshot::update(); // take snapshots +					LL_PROFILE_ZONE_NAMED( "df Snapshot" ) +					pingMainloopTimeout("Main:Snapshot"); +					LLFloaterSnapshot::update(); // take snapshots  					LLFloaterOutfitSnapshot::update(); -				gGLActive = FALSE; +					gGLActive = FALSE; +				}  			}  		} -		pingMainloopTimeout("Main:Sleep"); +		{ +			LL_PROFILE_ZONE_NAMED( "df pauseMainloopTimeout" ) +			pingMainloopTimeout("Main:Sleep"); -		pauseMainloopTimeout(); +			pauseMainloopTimeout(); +		}  		// Sleep and run background threads  		{ -			LL_RECORD_BLOCK_TIME(FTM_SLEEP); +			//LL_RECORD_BLOCK_TIME(SLEEP2); +			LL_PROFILE_ZONE_WARN( "Sleep2" )  			// yield some time to the os based on command line option  			static LLCachedControl<S32> yield_time(gSavedSettings, "YieldTime", -1);  			if(yield_time >= 0)  			{  				LL_RECORD_BLOCK_TIME(FTM_YIELD); +				LL_PROFILE_ZONE_NUM( yield_time )  				ms_sleep(yield_time);  			} @@ -1572,8 +1570,8 @@ bool LLAppViewer::doFrame()  					|| !gFocusMgr.getAppHasFocus()))  			{  				// Sleep if we're not rendering, or the window is minimized. -				static LLCachedControl<S32> s_bacground_yeild_time(gSavedSettings, "BackgroundYieldTime", 40); -				S32 milliseconds_to_sleep = llclamp((S32)s_bacground_yeild_time, 0, 1000); +				static LLCachedControl<S32> s_background_yield_time(gSavedSettings, "BackgroundYieldTime", 40); +				S32 milliseconds_to_sleep = llclamp((S32)s_background_yield_time, 0, 1000);  				// don't sleep when BackgroundYieldTime set to 0, since this will still yield to other threads  				// of equal priority on Windows  				if (milliseconds_to_sleep > 0) @@ -1624,16 +1622,22 @@ bool LLAppViewer::doFrame()  				total_io_pending += io_pending ;  			} -			gMeshRepo.update() ; + +			{ +				LL_PROFILE_ZONE_NAMED( "df gMeshRepo" ) +				gMeshRepo.update() ; +			}  			if(!total_work_pending) //pause texture fetching threads if nothing to process.  			{ +				LL_PROFILE_ZONE_NAMED( "df getTextureCache" )  				LLAppViewer::getTextureCache()->pause();  				LLAppViewer::getImageDecodeThread()->pause();  				LLAppViewer::getTextureFetch()->pause();  			}  			if(!total_io_pending) //pause file threads if nothing to process.  			{ +				LL_PROFILE_ZONE_NAMED( "df LLVFSThread" )  				LLVFSThread::sLocal->pause();  				LLLFSThread::sLocal->pause();  			} @@ -1641,6 +1645,7 @@ bool LLAppViewer::doFrame()  			//texture fetching debugger  			if(LLTextureFetchDebugger::isEnabled())  			{ +				LL_PROFILE_ZONE_NAMED( "df tex_fetch_debugger_instance" )  				LLFloaterTextureFetchDebugger* tex_fetch_debugger_instance =  					LLFloaterReg::findTypedInstance<LLFloaterTextureFetchDebugger>("tex_fetch_debugger");  				if(tex_fetch_debugger_instance) @@ -1649,8 +1654,10 @@ bool LLAppViewer::doFrame()  				}  			} -			resumeMainloopTimeout(); - +			{ +				LL_PROFILE_ZONE_NAMED( "df resumeMainloopTimeout" ) +				resumeMainloopTimeout(); +			}  			pingMainloopTimeout("Main:End");  		}  	} @@ -1676,7 +1683,7 @@ bool LLAppViewer::doFrame()  		LL_INFOS() << "Exiting main_loop" << LL_ENDL;  	} -    LLPROFILE_UPDATE(); +    LL_PROFILER_FRAME_END  	return ! LLApp::isRunning();  } @@ -2014,7 +2021,9 @@ bool LLAppViewer::cleanup()  	if (LLConversationLog::instanceExists())  	{  		LLConversationLog::instance().cache(); -	} +    } + +    clearSecHandler();  	if (mPurgeCacheOnExit)  	{ @@ -2344,7 +2353,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,  			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); +			auto settings_group = LLControlGroup::getInstance(file.name);  			if(!settings_group)  			{  				LL_WARNS("Settings") << "No matching settings group for name " << file.name() << LL_ENDL; @@ -2454,7 +2463,7 @@ bool tempSetControl(const std::string& name, const std::string& value)  		group_part = name.substr(0, pos);  		name_part = name.substr(pos+1);  		LL_INFOS() << "Setting " << group_part << "." << name_part << " to " << value << LL_ENDL; -		LLControlGroup* g = LLControlGroup::getInstance(group_part); +		auto g = LLControlGroup::getInstance(group_part);  		if (g) control = g->getControl(name_part);  	}  	else @@ -2521,12 +2530,7 @@ bool LLAppViewer::initConfiguration()  #ifndef	LL_RELEASE_FOR_DOWNLOAD  	// provide developer build only overrides for these control variables that are not  	// persisted to settings.xml -	LLControlVariable* c = gSavedSettings.getControl("ShowConsoleWindow"); -	if (c) -	{ -		c->setValue(true, false); -	} -	c = gSavedSettings.getControl("AllowMultipleViewers"); +	LLControlVariable* c = gSavedSettings.getControl("AllowMultipleViewers");  	if (c)  	{  		c->setValue(true, false); @@ -2668,10 +2672,10 @@ bool LLAppViewer::initConfiguration()              {                  const std::string& name = *itr;                  const std::string& value = *(++itr); -				if (!tempSetControl(name,value)) -				{ -					LL_WARNS() << "Failed --set " << name << ": setting name unknown." << LL_ENDL; -				} +                if (!tempSetControl(name,value)) +                { +                    LL_WARNS() << "Failed --set " << name << ": setting name unknown." << LL_ENDL; +                }              }          }      } @@ -4859,6 +4863,7 @@ void LLAppViewer::idle()  	LLNotificationsUI::LLToast::updateClass();  	LLSmoothInterpolation::updateInterpolants();  	LLMortician::updateClass(); +    LLImageGL::updateClass();  	LLFilePickerThread::clearDead();  //calls LLFilePickerThread::notify()  	LLDirPickerThread::clearDead();  	F32 dt_raw = idle_timer.getElapsedTimeAndResetF32(); @@ -5644,19 +5649,6 @@ void LLAppViewer::disconnectViewer()  	LLUrlEntryParcel::setDisconnected(gDisconnected);  } -bool LLAppViewer::onChangeFrameLimit(LLSD const & evt) -{ -	if (evt.asInteger() > 0) -	{ -		mMinMicroSecPerFrame = (U64)(1000000.0f / F32(evt.asInteger())); -	} -	else -	{ -		mMinMicroSecPerFrame = 0; -	} -	return false; -} -  void LLAppViewer::forceErrorLLError()  {     	LL_ERRS() << "This is a deliberate llerror" << LL_ENDL; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 0afb70958c..37119aeef9 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -109,7 +109,6 @@ public:  	virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.  	                                     // return false if the error trap needed restoration. -	virtual void initCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report?  	static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.      void checkForCrash(); @@ -262,8 +261,6 @@ private:      void sendLogoutRequest();      void disconnectViewer(); -	bool onChangeFrameLimit(LLSD const & evt); -  	// *FIX: the app viewer class should be some sort of singleton, no?  	// Perhaps its child class is the singleton and this should be an abstract base.  	static LLAppViewer* sInstance;  @@ -319,10 +316,7 @@ private:  	// llcorehttp library init/shutdown helper  	LLAppCoreHttp mAppCoreHttp; -        bool mIsFirstRun; -	U64 mMinMicroSecPerFrame; // frame throttling - - +    bool mIsFirstRun;  };  // consts from viewer.h diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp index 42946e4415..aa932f9c89 100644 --- a/indra/newview/llappviewermacosx.cpp +++ b/indra/newview/llappviewermacosx.cpp @@ -222,14 +222,7 @@ LLAppViewerMacOSX::~LLAppViewerMacOSX()  bool LLAppViewerMacOSX::init()  { -	bool success = LLAppViewer::init(); -     -    if (success) -    { -        LLAppViewer* pApp = LLAppViewer::instance(); -        pApp->initCrashReporting(); -    } -    return success; +    return LLAppViewer::init();  }  // MacOSX may add and addition command line arguement for the process serial number. @@ -347,28 +340,6 @@ bool LLAppViewerMacOSX::restoreErrorTrap()  	return reset_count == 0;  } -void LLAppViewerMacOSX::initCrashReporting(bool reportFreeze) -{ -#if defined LL_BUGSPLAT -    LL_DEBUGS("InitOSX", "Bugsplat") << "using BugSplat crash logger" << LL_ENDL; -#elif LL_SEND_CRASH_REPORTS -    LL_DEBUGS("InitOSX") << "Initializing legacy crash logger" << LL_ENDL; -	std::string command_str = "mac-crash-logger.app"; -     -    std::stringstream pid_str; -    pid_str <<  LLApp::getPid(); -    std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); -    std::string appname = gDirUtilp->getExecutableFilename(); -    std::string str[] = { "-pid", pid_str.str(), "-dumpdir", logdir, "-procname", appname.c_str() }; -    std::vector< std::string > args( str, str + ( sizeof ( str ) /  sizeof ( std::string ) ) ); -    LL_WARNS() << "about to launch mac-crash-logger" << pid_str.str() -               << " " << logdir << " " << appname << LL_ENDL; -    launchApplication(&command_str, &args); -#else -    LL_DEBUGS("InitOSX") << "No crash logger enabled" << LL_ENDL;     -#endif // ! LL_BUGSPLAT -} -  std::string LLAppViewerMacOSX::generateSerialNumber()  {  	char serial_md5[MD5HEX_STR_SIZE];		// Flawfinder: ignore diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h index d5a80864be..b0e325a955 100644 --- a/indra/newview/llappviewermacosx.h +++ b/indra/newview/llappviewermacosx.h @@ -44,7 +44,6 @@ public:  protected:  	virtual bool restoreErrorTrap(); -	virtual void initCrashReporting(bool reportFreeze);  	std::string generateSerialNumber();  	virtual bool initParseCommandLine(LLCommandLineParser& clp); diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 9daea515e5..758bd73cb0 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -323,6 +323,10 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,                       PWSTR     pCmdLine,                       int       nCmdShow)  { +    // Call Tracy first thing to have it allocate memory +    // https://github.com/wolfpld/tracy/issues/196 +    LL_PROFILER_FRAME_END +  	const S32 MAX_HEAPS = 255;  	DWORD heap_enable_lfh_error[MAX_HEAPS];  	S32 num_heaps = 0; @@ -599,9 +603,6 @@ bool LLAppViewerWin32::init()  #if ! defined(LL_BUGSPLAT)  #pragma message("Building without BugSplat") -	LLAppViewer* pApp = LLAppViewer::instance(); -	pApp->initCrashReporting(); -  #else // LL_BUGSPLAT  #pragma message("Building with BugSplat") @@ -846,57 +847,6 @@ bool LLAppViewerWin32::restoreErrorTrap()  	return true; // we don't check for handler collisions on windows, so just say they're ok  } -void LLAppViewerWin32::initCrashReporting(bool reportFreeze) -{ -	if (isSecondInstance()) return; //BUG-5707 do not start another crash reporter for second instance. - -	const char* logger_name = "win_crash_logger.exe"; -	std::string exe_path = gDirUtilp->getExecutableDir(); -	exe_path += gDirUtilp->getDirDelimiter(); -	exe_path += logger_name; - -    std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, ""); -    std::string appname = gDirUtilp->getExecutableFilename(); - -	S32 slen = logdir.length() -1; -	S32 end = slen; -	while (logdir.at(end) == '/' || logdir.at(end) == '\\') end--; -	 -	if (slen !=end) -	{ -		logdir = logdir.substr(0,end+1); -	} -	//std::string arg_str = "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid()); -	//_spawnl(_P_NOWAIT, exe_path.c_str(), arg_str.c_str(), NULL); -	std::string arg_str =  "\"" + exe_path + "\" -dumpdir \"" + logdir + "\" -procname \"" + appname + "\" -pid " + stringize(LLApp::getPid());  - -	STARTUPINFO startInfo={sizeof(startInfo)}; -	PROCESS_INFORMATION processInfo; - -	std::wstring exe_wstr; -	exe_wstr = utf8str_to_utf16str(exe_path); - -	std::wstring arg_wstr; -	arg_wstr = utf8str_to_utf16str(arg_str); - -	LL_INFOS("CrashReport") << "Creating crash reporter process " << exe_path << " with params: " << arg_str << LL_ENDL; -    if(CreateProcess(exe_wstr.c_str(),      -                     &arg_wstr[0],                 // Application arguments -                     0, -                     0, -                     FALSE, -                     CREATE_DEFAULT_ERROR_MODE, -                     0, -                     0,                              // Working directory -                     &startInfo, -                     &processInfo) == FALSE) -      // Could not start application -> call 'GetLastError()' -	{ -        LL_WARNS("CrashReport") << "CreateProcess failed " << GetLastError() << LL_ENDL; -        return; -    } -} -  //virtual  bool LLAppViewerWin32::sendURLToOtherInstance(const std::string& url)  { diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 83ae875a15..82b6b0c77c 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -51,9 +51,8 @@ protected:  	bool initHardwareTest() override; // Win32 uses DX9 to test hardware.  	bool initParseCommandLine(LLCommandLineParser& clp) override; -	bool beingDebugged() override; -	bool restoreErrorTrap() override; -	void initCrashReporting(bool reportFreeze) override; +	virtual bool beingDebugged(); +	virtual bool restoreErrorTrap();  	bool sendURLToOtherInstance(const std::string& url) override; diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp index 0460bff1b4..30ac35fff7 100644 --- a/indra/newview/llbrowsernotification.cpp +++ b/indra/newview/llbrowsernotification.cpp @@ -43,14 +43,14 @@ LLBrowserNotification::LLBrowserNotification()  bool LLBrowserNotification::processNotification(const LLNotificationPtr& notification)  {  	LLUUID media_id = notification->getPayload()["media_id"].asUUID(); -	LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(media_id); +	auto media_instance = LLMediaCtrl::getInstance(media_id);  	if (media_instance)  	{  		media_instance->showNotification(notification);  	}  	else if (LLViewerMediaFocus::instance().getControlsMediaID() == media_id)  	{ -		LLViewerMediaImpl* impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(media_id); +		auto impl = LLViewerMedia::getInstance()->getMediaImplFromTextureID(media_id);  		if (impl)  		{  			impl->showNotification(notification); diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index fab249f988..606e670805 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -241,7 +241,7 @@ void LLControlAvatar::matchVolumeTransform()  			if (skin_info)  			{                  LL_DEBUGS("BindShape") << getFullname() << " bind shape " << skin_info->mBindShapeMatrix << LL_ENDL; -                bind_rot = LLSkinningUtil::getUnscaledQuaternion(skin_info->mBindShapeMatrix); +                bind_rot = LLSkinningUtil::getUnscaledQuaternion(LLMatrix4(skin_info->mBindShapeMatrix));  			}  #endif  			setRotation(bind_rot*obj_rot); diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 507af56cb0..495e06b6f7 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -101,6 +101,8 @@ LLDrawable::LLDrawable(LLViewerObject *vobj, bool new_entry)  void LLDrawable::init(bool new_entry)  { +	LL_PROFILE_ZONE_SCOPED +  	// mXform  	mParent = NULL;  	mRenderType = 0; @@ -335,6 +337,7 @@ static LLTrace::BlockTimerStatHandle FTM_ALLOCATE_FACE("Allocate Face");  LLFace*	LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)  { +	LL_PROFILE_ZONE_SCOPED  	LLFace *face;  	{ @@ -363,6 +366,8 @@ LLFace*	LLDrawable::addFace(LLFacePool *poolp, LLViewerTexture *texturep)  LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)  { +	LL_PROFILE_ZONE_SCOPED +  	LLFace *face;  	{ @@ -387,6 +392,8 @@ LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)  LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp)  { +	LL_PROFILE_ZONE_SCOPED +  	LLFace *face;  	face = new LLFace(this, mVObjp); @@ -408,6 +415,8 @@ LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep,  LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp)  { +	LL_PROFILE_ZONE_SCOPED +  	LLFace *face;  	face = new LLFace(this, mVObjp); @@ -430,6 +439,8 @@ LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep,  void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)  { +	LL_PROFILE_ZONE_SCOPED +  	if (newFaces == (S32)mFaces.size())  	{  		return; @@ -453,6 +464,8 @@ void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerText  void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)  { +	LL_PROFILE_ZONE_SCOPED +  	if (newFaces <= (S32)mFaces.size() && newFaces >= (S32)mFaces.size()/2)  	{  		return; @@ -476,6 +489,8 @@ void LLDrawable::setNumFacesFast(const S32 newFaces, LLFacePool *poolp, LLViewer  void LLDrawable::mergeFaces(LLDrawable* src)  { +	LL_PROFILE_ZONE_SCOPED +  	U32 face_count = mFaces.size() + src->mFaces.size();  	mFaces.reserve(face_count); @@ -509,6 +524,8 @@ void LLDrawable::updateMaterial()  void LLDrawable::makeActive()  {		 +	LL_PROFILE_ZONE_SCOPED +  #if !LL_RELEASE_FOR_DOWNLOAD  	if (mVObjp.notNull())  	{ @@ -572,6 +589,8 @@ void LLDrawable::makeActive()  void LLDrawable::makeStatic(BOOL warning_enabled)  { +	LL_PROFILE_ZONE_SCOPED +  	if (isState(ACTIVE) &&   		!isState(ACTIVE_CHILD) &&   		!mVObjp->isAttachment() &&  @@ -618,6 +637,8 @@ void LLDrawable::makeStatic(BOOL warning_enabled)  // Returns "distance" between target destination and resulting xfrom  F32 LLDrawable::updateXform(BOOL undamped)  { +	LL_PROFILE_ZONE_SCOPED +  	BOOL damped = !undamped;  	// Position @@ -769,6 +790,8 @@ void LLDrawable::moveUpdatePipeline(BOOL moved)  void LLDrawable::movePartition()  { +	LL_PROFILE_ZONE_SCOPED +  	LLSpatialPartition* part = getSpatialPartition();  	if (part)  	{ @@ -813,6 +836,8 @@ BOOL LLDrawable::updateMoveUndamped()  void LLDrawable::updatePartition()  { +	LL_PROFILE_ZONE_SCOPED +  	if (!getVOVolume())  	{  		movePartition(); @@ -830,6 +855,8 @@ void LLDrawable::updatePartition()  BOOL LLDrawable::updateMoveDamped()  { +	LL_PROFILE_ZONE_SCOPED +  	F32 dist_squared = updateXform(FALSE);  	mGeneration++; @@ -853,6 +880,8 @@ BOOL LLDrawable::updateMoveDamped()  void LLDrawable::updateDistance(LLCamera& camera, bool force_update)  { +	LL_PROFILE_ZONE_SCOPED +  	if (LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)  	{  		LL_WARNS() << "Attempted to update distance for non-world camera." << LL_ENDL; @@ -957,6 +986,8 @@ void LLDrawable::updateTexture()  BOOL LLDrawable::updateGeometry(BOOL priority)  { +	LL_PROFILE_ZONE_SCOPED +  	llassert(mVObjp.notNull());  	BOOL res = mVObjp->updateGeometry(this);  	return res; @@ -1034,6 +1065,8 @@ const LLVector3& LLDrawable::getBounds(LLVector3& min, LLVector3& max) const  void LLDrawable::updateSpatialExtents()  { +	LL_PROFILE_ZONE_SCOPED +  	if (mVObjp)  	{  		const LLVector4a* exts = getSpatialExtents(); @@ -1164,6 +1197,8 @@ void LLDrawable::setGroup(LLViewerOctreeGroup *groupp)  LLSpatialPartition* LLDrawable::getSpatialPartition()  {  +	LL_PROFILE_ZONE_SCOPED +  	LLSpatialPartition* retval = NULL;  	if (!mVObjp ||  @@ -1247,6 +1282,8 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat  	LLDrawable(root->getVObj(), true),  	LLSpatialPartition(data_mask, render_by_group, GL_STREAM_DRAW_ARB, regionp)  { +	LL_PROFILE_ZONE_SCOPED +  	mBridge = this;  	mDrawable = root;  	root->setSpatialBridge(this); @@ -1292,6 +1329,8 @@ void LLSpatialBridge::destroyTree()  void LLSpatialBridge::updateSpatialExtents()  { +	LL_PROFILE_ZONE_SCOPED +  	LLSpatialGroup* root = (LLSpatialGroup*) mOctree->getListener(0);  	{ @@ -1455,6 +1494,8 @@ public:  void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results, BOOL for_select)  { +	LL_PROFILE_ZONE_SCOPED +  	if (!gPipeline.hasRenderType(mDrawableType))  	{  		return; @@ -1552,6 +1593,8 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*  void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)  { +	LL_PROFILE_ZONE_SCOPED +  	if (mDrawable == NULL)  	{  		markDead(); diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index d583a692f9..3e4f97e494 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -404,6 +404,7 @@ void LLRenderPass::renderTexture(U32 type, U32 mask, BOOL batch_textures)  void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture, BOOL batch_textures)  { +    LL_PROFILE_ZONE_SCOPED;  	for (LLCullResult::drawinfo_iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)	  	{  		LLDrawInfo* pparams = *i; @@ -452,6 +453,7 @@ void LLRenderPass::applyModelMatrix(const LLDrawInfo& params)  void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)  { +    LL_PROFILE_ZONE_SCOPED;      if (!params.mCount)      {          return; @@ -469,7 +471,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  			{  				if (params.mTextureList[i].notNull())  				{ -					gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); +					gGL.getTexUnit(i)->bindFast(params.mTextureList[i]);  				}  			}  		} @@ -477,8 +479,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  		{ //not batching textures or batch has only 1 texture -- might need a texture matrix  			if (params.mTexture.notNull())  			{ -				params.mTexture->addTextureStats(params.mVSize); -				gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ; +				gGL.getTexUnit(0)->bindFast(params.mTexture);  				if (params.mTextureMatrix)  				{  					tex_setup = true; @@ -490,24 +491,20 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL ba  			}  			else  			{ -				gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +				gGL.getTexUnit(0)->unbindFast(LLTexUnit::TT_TEXTURE);  			}  		}  	} -	if (params.mVertexBuffer.notNull()) -	{ -		if (params.mGroup) -		{ -			params.mGroup->rebuildMesh(); -		} +    if (params.mGroup) +    { +        params.mGroup->rebuildMesh(); +    } -		LLGLEnableFunc stencil_test(GL_STENCIL_TEST, params.mSelected, &LLGLCommonFunc::selected_stencil_test); -	 -		params.mVertexBuffer->setBuffer(mask); -		params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); -		gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); -	} +    LLGLEnableFunc stencil_test(GL_STENCIL_TEST, params.mSelected, &LLGLCommonFunc::selected_stencil_test); + +    params.mVertexBuffer->setBufferFast(mask); +    params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);  	if (tex_setup)  	{ diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index 4ee08e869a..369d7a6bb8 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -55,19 +55,7 @@ static BOOL deferred_render = FALSE;  static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_SETUP("Alpha Setup");  static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_GROUP_LOOP("Alpha Group"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_PUSH("Alpha Push Verts");  static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_DEFERRED("Alpha Deferred"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_SETBUFFER("Alpha SetBuffer"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_DRAW("Alpha Draw"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_TEX_BINDS("Alpha Tex Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_MATS("Alpha Mat Tex Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_GLOW("Alpha Glow Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_SHADER_BINDS("Alpha Shader Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_DEFERRED_SHADER_BINDS("Alpha Def Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_DEFERRED_TEX_BINDS("Alpha Def Tex Binds"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_MESH_REBUILD("Alpha Mesh Rebuild"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_EMISSIVE("Alpha Emissive"); -static LLTrace::BlockTimerStatHandle FTM_RENDER_ALPHA_LIGHT_SETUP("Alpha Light Setup");  LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) :  		LLRenderPass(type), current_shader(NULL), target_shader(NULL), @@ -86,6 +74,10 @@ LLDrawPoolAlpha::~LLDrawPoolAlpha()  void LLDrawPoolAlpha::prerender()  {  	mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT); + +    // TODO: is this even necessay?  These are probably set to never discard +    LLViewerFetchedTexture::sFlatNormalImagep->addTextureStats(1024.f*1024.f); +    LLViewerFetchedTexture::sWhiteImagep->addTextureStats(1024.f * 1024.f);  }  S32 LLDrawPoolAlpha::getNumPostDeferredPasses()  @@ -309,7 +301,7 @@ void LLDrawPoolAlpha::render(S32 pass)  		gGL.diffuseColor4f(1,0,0,1);  		LLViewerFetchedTexture::sSmokeImagep->addTextureStats(1024.f*1024.f); -		gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sSmokeImagep, TRUE) ; +		gGL.getTexUnit(0)->bindFast(LLViewerFetchedTexture::sSmokeImagep);  		renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |  							LLVertexBuffer::MAP_TEXCOORD0); @@ -358,9 +350,8 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)  				{  					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); +				params.mVertexBuffer->setBufferFast(mask); +				params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);  			}  		}  	} @@ -383,27 +374,23 @@ inline bool IsEmissive(LLDrawInfo& params)  inline void Draw(LLDrawInfo* draw, U32 mask)  { -    draw->mVertexBuffer->setBuffer(mask); +    draw->mVertexBuffer->setBufferFast(mask);      LLRenderPass::applyModelMatrix(*draw); -	draw->mVertexBuffer->drawRange(draw->mDrawMode, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset);                     -    gPipeline.addTrianglesDrawn(draw->mCount, draw->mDrawMode); +	draw->mVertexBuffer->drawRangeFast(draw->mDrawMode, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset);                      } -bool LLDrawPoolAlpha::TexSetup(LLDrawInfo* draw, bool use_shaders, bool use_material, LLGLSLShader* current_shader) +bool LLDrawPoolAlpha::TexSetup(LLDrawInfo* draw, bool use_material, LLGLSLShader* current_shader)  { -    LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_TEX_BINDS);     -      bool tex_setup = false;      if (deferred_render && use_material && current_shader)      { -        LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_DEFERRED_TEX_BINDS);          if (draw->mNormalMap) -		{             +		{  			draw->mNormalMap->addTextureStats(draw->mVSize);  			current_shader->bindTexture(LLShaderMgr::BUMP_MAP, draw->mNormalMap);  		}  -						 +  		if (draw->mSpecularMap)  		{  			draw->mSpecularMap->addTextureStats(draw->mVSize); @@ -412,18 +399,16 @@ bool LLDrawPoolAlpha::TexSetup(LLDrawInfo* draw, bool use_shaders, bool use_mate      }      else if (current_shader == simple_shader)      { -        LLViewerFetchedTexture::sFlatNormalImagep->addTextureStats(draw->mVSize);	     -	    LLViewerFetchedTexture::sWhiteImagep->addTextureStats(draw->mVSize); -        current_shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);						 +        current_shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep);  	    current_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep);      } -	if (use_shaders && draw->mTextureList.size() > 1) +	if (draw->mTextureList.size() > 1)  	{  		for (U32 i = 0; i < draw->mTextureList.size(); ++i)  		{  			if (draw->mTextureList[i].notNull())  			{ -				gGL.getTexUnit(i)->bind(draw->mTextureList[i], TRUE); +				gGL.getTexUnit(i)->bindFast(draw->mTextureList[i]);  			}  		}  	} @@ -431,16 +416,15 @@ bool LLDrawPoolAlpha::TexSetup(LLDrawInfo* draw, bool use_shaders, bool use_mate  	{ //not batching textures or batch has only 1 texture -- might need a texture matrix  		if (draw->mTexture.notNull())  		{ -			draw->mTexture->addTextureStats(draw->mVSize); -			if (use_shaders && use_material) +			if (use_material)  			{  				current_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, draw->mTexture);  			}  			else  			{ -			    gGL.getTexUnit(0)->bind(draw->mTexture, TRUE) ; +			    gGL.getTexUnit(0)->bindFast(draw->mTexture);  			} -						 +  			if (draw->mTextureMatrix)  			{  				tex_setup = true; @@ -452,7 +436,7 @@ bool LLDrawPoolAlpha::TexSetup(LLDrawInfo* draw, bool use_shaders, bool use_mate  		}  		else  		{ -			gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); +			gGL.getTexUnit(0)->unbindFast(LLTexUnit::TT_TEXTURE);  		}  	} @@ -470,37 +454,15 @@ void LLDrawPoolAlpha::RestoreTexSetup(bool tex_setup)  	}  } -void LLDrawPoolAlpha::renderSimples(U32 mask, std::vector<LLDrawInfo*>& simples) -{ -    gPipeline.enableLightsDynamic(); -    simple_shader->bind(); -	simple_shader->bindTexture(LLShaderMgr::BUMP_MAP, LLViewerFetchedTexture::sFlatNormalImagep); -	simple_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, LLViewerFetchedTexture::sWhiteImagep); -    simple_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, 1.0f, 1.0f, 1.0f, 1.0f); -	simple_shader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, 0.0f); -    simple_shader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, 0.0f); -    bool use_shaders = gPipeline.canUseVertexShaders(); -    for (LLDrawInfo* draw : simples) -    { -        bool tex_setup = TexSetup(draw, use_shaders, false, simple_shader); -        LLGLEnableFunc stencil_test(GL_STENCIL_TEST, draw->mSelected, &LLGLCommonFunc::selected_stencil_test); -		gGL.blendFunc((LLRender::eBlendFactor) draw->mBlendFuncSrc, (LLRender::eBlendFactor) draw->mBlendFuncDst, mAlphaSFactor, mAlphaDFactor); - -	    Draw(draw, mask); -        RestoreTexSetup(tex_setup); -    } -    simple_shader->unbind(); -} -  void LLDrawPoolAlpha::renderFullbrights(U32 mask, std::vector<LLDrawInfo*>& fullbrights)  {      gPipeline.enableLightsFullbright();      fullbright_shader->bind();      fullbright_shader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, 1.0f); -    bool use_shaders = gPipeline.canUseVertexShaders(); +          for (LLDrawInfo* draw : fullbrights)      { -        bool tex_setup = TexSetup(draw, use_shaders, false, fullbright_shader); +        bool tex_setup = TexSetup(draw, false, fullbright_shader);          LLGLEnableFunc stencil_test(GL_STENCIL_TEST, draw->mSelected, &LLGLCommonFunc::selected_stencil_test);  		gGL.blendFunc((LLRender::eBlendFactor) draw->mBlendFuncSrc, (LLRender::eBlendFactor) draw->mBlendFuncDst, mAlphaSFactor, mAlphaDFactor); @@ -511,65 +473,10 @@ void LLDrawPoolAlpha::renderFullbrights(U32 mask, std::vector<LLDrawInfo*>& full      fullbright_shader->unbind();  } -void LLDrawPoolAlpha::renderMaterials(U32 mask, std::vector<LLDrawInfo*>& materials) -{ -    LLGLSLShader::bindNoShader(); -    current_shader = NULL; - -    gPipeline.enableLightsDynamic(); -    bool use_shaders = gPipeline.canUseVertexShaders(); -    for (LLDrawInfo* draw : materials) -    { -        U32 mask = draw->mShaderMask; - -		llassert(mask < LLMaterial::SHADER_COUNT); -		target_shader = (LLPipeline::sUnderWaterRender) ? &(gDeferredMaterialWaterProgram[mask]) : &(gDeferredMaterialProgram[mask]); - -		if (current_shader != target_shader) -		{ -            LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_DEFERRED_SHADER_BINDS); -            if (current_shader) -            { -                gPipeline.unbindDeferredShader(*current_shader); -            } -			gPipeline.bindDeferredShader(*target_shader); -            current_shader = target_shader; -		} -         -        bool tex_setup = TexSetup(draw, use_shaders, true, current_shader); - -        current_shader->uniform4f(LLShaderMgr::SPECULAR_COLOR, draw->mSpecColor.mV[0], draw->mSpecColor.mV[1], draw->mSpecColor.mV[2], draw->mSpecColor.mV[3]);						 -		current_shader->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, draw->mEnvIntensity); -		current_shader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, draw->mFullbright ? 1.f : 0.f); - -        { -            LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_DEFERRED_TEX_BINDS); -			if (draw->mNormalMap) -			{ -				draw->mNormalMap->addTextureStats(draw->mVSize); -				current_shader->bindTexture(LLShaderMgr::BUMP_MAP, draw->mNormalMap); -			}  -						 -			if (draw->mSpecularMap) -			{ -				draw->mSpecularMap->addTextureStats(draw->mVSize); -				current_shader->bindTexture(LLShaderMgr::SPECULAR_MAP, draw->mSpecularMap); -			} -        } - -        LLGLEnableFunc stencil_test(GL_STENCIL_TEST, draw->mSelected, &LLGLCommonFunc::selected_stencil_test); -		gGL.blendFunc((LLRender::eBlendFactor) draw->mBlendFuncSrc, (LLRender::eBlendFactor) draw->mBlendFuncDst, mAlphaSFactor, mAlphaDFactor); - -        Draw(draw, mask); -        RestoreTexSetup(tex_setup); -    } -} -  void LLDrawPoolAlpha::drawEmissive(U32 mask, LLDrawInfo* draw)  { -    draw->mVertexBuffer->setBuffer((mask & ~LLVertexBuffer::MAP_COLOR) | LLVertexBuffer::MAP_EMISSIVE); -	draw->mVertexBuffer->drawRange(draw->mDrawMode, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset); -	gPipeline.addTrianglesDrawn(draw->mCount, draw->mDrawMode); +    draw->mVertexBuffer->setBufferFast((mask & ~LLVertexBuffer::MAP_COLOR) | LLVertexBuffer::MAP_EMISSIVE); +	draw->mVertexBuffer->drawRangeFast(draw->mDrawMode, draw->mStart, draw->mEnd, draw->mCount, draw->mOffset);  }  void LLDrawPoolAlpha::drawEmissiveInline(U32 mask, LLDrawInfo* draw) @@ -599,10 +506,10 @@ void LLDrawPoolAlpha::renderEmissives(U32 mask, std::vector<LLDrawInfo*>& emissi      // install glow-accumulating blend mode      // don't touch color, add to alpha (glow)  	gGL.blendFunc(LLRender::BF_ZERO, LLRender::BF_ONE, LLRender::BF_ONE, LLRender::BF_ONE);  -    bool use_shaders = gPipeline.canUseVertexShaders(); +       for (LLDrawInfo* draw : emissives)      { -        bool tex_setup = TexSetup(draw, use_shaders, false, emissive_shader); +        bool tex_setup = TexSetup(draw, false, emissive_shader);          drawEmissive(mask, draw);          RestoreTexSetup(tex_setup);      } @@ -620,8 +527,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  	BOOL initialized_lighting = FALSE;  	BOOL light_enabled = TRUE; -	BOOL use_shaders = gPipeline.canUseVertexShaders(); -		  	for (LLCullResult::sg_iterator i = gPipeline.beginAlphaGroups(); i != gPipeline.endAlphaGroups(); ++i)  	{  		LLSpatialGroup* group = *i; @@ -631,8 +536,10 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  		if (group->getSpatialPartition()->mRenderByGroup &&  		    !group->isDead())  		{ -            std::vector<LLDrawInfo*> emissives; -            std::vector<LLDrawInfo*> fullbrights; +            static std::vector<LLDrawInfo*> emissives; +            static std::vector<LLDrawInfo*> fullbrights; +            emissives.resize(0); +            fullbrights.resize(0);  			bool is_particle_or_hud_particle = group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_PARTICLE  													  || group->getSpatialPartition()->mPartitionType == LLViewerRegion::PARTITION_HUD_PARTICLE; @@ -649,6 +556,7 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  			for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)	  			{ +                LL_PROFILE_ZONE_NAMED("ra - push batch")  				LLDrawInfo& params = **k;                  U32 have_mask = params.mVertexBuffer->getTypeMask() & mask;  				if (have_mask != mask) @@ -696,34 +604,17 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  					// Turn off lighting if it hasn't already been so.  					if (light_enabled || !initialized_lighting)  					{ -                        LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_LIGHT_SETUP); -  						initialized_lighting = TRUE; -						if (use_shaders)  -						{ -							target_shader = fullbright_shader; -						} -						else -						{ -							gPipeline.enableLightsFullbright(); -						} +						target_shader = fullbright_shader; +  						light_enabled = FALSE;  					}  				}  				// Turn on lighting if it isn't already.  				else if (!light_enabled || !initialized_lighting)  				{ -                    LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_LIGHT_SETUP); -  					initialized_lighting = TRUE; -					if (use_shaders)  -					{ -						target_shader = simple_shader; -					} -					else -					{ -						gPipeline.enableLightsDynamic(); -					} +					target_shader = simple_shader;  					light_enabled = TRUE;  				} @@ -741,7 +632,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  					if (current_shader != target_shader)  					{ -                        LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_DEFERRED_SHADER_BINDS);  						gPipeline.bindDeferredShader(*target_shader);                          current_shader = target_shader;  					} @@ -755,25 +645,19 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  					target_shader = fullbright_shader;  				} -				if(use_shaders && (current_shader != target_shader)) +				if(current_shader != target_shader)  				{// If we need shaders, and we're not ALREADY using the proper shader, then bind it  				// (this way we won't rebind shaders unnecessarily). -                    LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_SHADER_BINDS);  					current_shader = target_shader;  					current_shader->bind();  				} -				else if (!use_shaders && current_shader != NULL) -				{ -					LLGLSLShader::bindNoShader(); -					current_shader = NULL; -				}                  LLVector4 spec_color(1, 1, 1, 1);                  F32 env_intensity = 0.0f;                  F32 brightness = 1.0f;                  // We have a material.  Supply the appropriate data here. -				if (use_shaders && mat && deferred_render) +				if (mat && deferred_render)  				{  					spec_color    = params.mSpecColor;                      env_intensity = params.mEnvIntensity; @@ -792,20 +676,16 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  					params.mGroup->rebuildMesh();  				} -                bool tex_setup = TexSetup(¶ms, use_shaders, use_shaders && (mat != nullptr), current_shader); +                bool tex_setup = TexSetup(¶ms, (mat != nullptr), current_shader);  				{ -					LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_PUSH); -  					LLGLEnableFunc stencil_test(GL_STENCIL_TEST, params.mSelected, &LLGLCommonFunc::selected_stencil_test);  					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->setBufferFast(mask & ~(params.mFullbright ? (LLVertexBuffer::MAP_TANGENT | LLVertexBuffer::MAP_TEXCOORD1 | LLVertexBuffer::MAP_TEXCOORD2) : 0));                      { -                        LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_DRAW); -					    params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); -					    gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); +					    params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);                      }  				} @@ -814,8 +694,6 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  					draw_glow_for_this_partition &&  					params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE))  				{ -                    LL_RECORD_BLOCK_TIME(FTM_RENDER_ALPHA_EMISSIVE); -                      if (batch_emissives)                      {                          emissives.push_back(¶ms); @@ -835,19 +713,29 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask, S32 pass)  				}  			} + +            bool rebind = false;              if (batch_fullbrights)              { -                light_enabled = false; -                renderFullbrights(mask, fullbrights); +                if (!fullbrights.empty()) +                { +                    light_enabled = false; +                    renderFullbrights(mask, fullbrights); +                    rebind = true; +                }              }              if (batch_emissives)              { -                light_enabled = true; -                renderEmissives(mask, emissives); +                if (!emissives.empty()) +                { +                    light_enabled = true; +                    renderEmissives(mask, emissives); +                    rebind = true; +                }              } -            if (current_shader) +            if (current_shader && rebind)              {                  current_shader->bind();              } diff --git a/indra/newview/lldrawpoolalpha.h b/indra/newview/lldrawpoolalpha.h index a069f805e8..a50b1d929e 100644 --- a/indra/newview/lldrawpoolalpha.h +++ b/indra/newview/lldrawpoolalpha.h @@ -75,15 +75,13 @@ private:  	LLGLSLShader* fullbright_shader;	  	LLGLSLShader* emissive_shader; -    void renderSimples(U32 mask, std::vector<LLDrawInfo*>& simples);      void renderFullbrights(U32 mask, std::vector<LLDrawInfo*>& fullbrights); -    void renderMaterials(U32 mask, std::vector<LLDrawInfo*>& fullbrights);      void renderEmissives(U32 mask, std::vector<LLDrawInfo*>& emissives);      void drawEmissive(U32 mask, LLDrawInfo* draw);      void drawEmissiveInline(U32 mask, LLDrawInfo* draw); -    bool TexSetup(LLDrawInfo* draw, bool use_shaders, bool use_material, LLGLSLShader* current_shader); +    bool TexSetup(LLDrawInfo* draw, bool use_material, LLGLSLShader* current_shader);      void RestoreTexSetup(bool tex_setup);  	// our 'normal' alpha blend function for this pass diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 687b13d2c8..8dd8c15b87 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -121,6 +121,8 @@ LLDrawPoolAvatar::~LLDrawPoolAvatar()  // virtual  BOOL LLDrawPoolAvatar::isDead()  { +    LL_PROFILE_ZONE_SCOPED +      if (!LLFacePool::isDead())      {          return FALSE; @@ -138,11 +140,15 @@ BOOL LLDrawPoolAvatar::isDead()  S32 LLDrawPoolAvatar::getShaderLevel() const  { +    LL_PROFILE_ZONE_SCOPED +  	return (S32) LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);  }  void LLDrawPoolAvatar::prerender()  { +    LL_PROFILE_ZONE_SCOPED +  	mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);  	sShaderLevel = mShaderLevel; @@ -163,12 +169,15 @@ void LLDrawPoolAvatar::prerender()  		{  			LLVOAvatar* avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();  			updateRiggedVertexBuffers(avatarp); +            updateSkinInfoMatrixPalettes(avatarp);  		}  	}  }  LLMatrix4& LLDrawPoolAvatar::getModelView()  { +    LL_PROFILE_ZONE_SCOPED +  	static LLMatrix4 ret;  	ret.initRows(LLVector4(gGLModelView+0), @@ -257,6 +266,8 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)  void LLDrawPoolAvatar::renderDeferred(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	render(pass);  } @@ -267,6 +278,8 @@ S32 LLDrawPoolAvatar::getNumPostDeferredPasses()  void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	switch (pass)  	{  	case 0: @@ -295,6 +308,8 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)  void LLDrawPoolAvatar::beginPostDeferredAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	sSkipOpaque = TRUE;  	sShaderLevel = mShaderLevel;  	sVertexProgram = &gDeferredAvatarAlphaProgram; @@ -309,6 +324,8 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()  void LLDrawPoolAvatar::beginDeferredRiggedAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	sVertexProgram = &gDeferredSkinnedAlphaProgram;  	gPipeline.bindDeferredShader(*sVertexProgram);  	sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); @@ -317,6 +334,8 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha()  void LLDrawPoolAvatar::beginDeferredRiggedMaterialAlpha(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	switch (pass)  	{  	case 0: pass = 1; break; @@ -343,6 +362,8 @@ void LLDrawPoolAvatar::beginDeferredRiggedMaterialAlpha(S32 pass)  void LLDrawPoolAvatar::endDeferredRiggedAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	gPipeline.unbindDeferredShader(*sVertexProgram);  	sDiffuseChannel = 0; @@ -353,6 +374,8 @@ void LLDrawPoolAvatar::endDeferredRiggedAlpha()  void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	switch (pass)  	{  	case 0: @@ -381,6 +404,8 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)  void LLDrawPoolAvatar::endPostDeferredAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done  	sRenderingSkinned = FALSE;  	sSkipOpaque = FALSE; @@ -392,6 +417,8 @@ void LLDrawPoolAvatar::endPostDeferredAlpha()  void LLDrawPoolAvatar::renderPostDeferred(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	static const S32 actual_pass[] =  	{ //map post deferred pass numbers to what render() expects  		2, //skinned @@ -428,225 +455,235 @@ S32 LLDrawPoolAvatar::getNumShadowPasses()  void LLDrawPoolAvatar::beginShadowPass(S32 pass)  {  	LL_RECORD_BLOCK_TIME(FTM_SHADOW_AVATAR); +    { +        LL_PROFILE_ZONE_SCOPED; -	if (pass == SHADOW_PASS_AVATAR_OPAQUE) -	{ -		sVertexProgram = &gDeferredAvatarShadowProgram; -		 -		if ((sShaderLevel > 0))  // for hardware blending -		{ -			sRenderingSkinned = TRUE; -			sVertexProgram->bind(); -		} +        if (pass == SHADOW_PASS_AVATAR_OPAQUE) +        { +            sVertexProgram = &gDeferredAvatarShadowProgram; -		gGL.diffuseColor4f(1,1,1,1); -	} -    else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND) -	{ -		sVertexProgram = &gDeferredAvatarAlphaShadowProgram; +            if ((sShaderLevel > 0))  // for hardware blending +            { +                sRenderingSkinned = TRUE; +                sVertexProgram->bind(); +            } -        // bind diffuse tex so we can reference the alpha channel... -        S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); -        sDiffuseChannel = 0; -        if (loc != -1) +            gGL.diffuseColor4f(1, 1, 1, 1); +        } +        else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND)          { -            sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -		} +            sVertexProgram = &gDeferredAvatarAlphaShadowProgram; -		if ((sShaderLevel > 0))  // for hardware blending -		{ -			sRenderingSkinned = TRUE; -			sVertexProgram->bind(); -		} +            // bind diffuse tex so we can reference the alpha channel... +            S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); +            sDiffuseChannel = 0; +            if (loc != -1) +            { +                sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +            } -		gGL.diffuseColor4f(1,1,1,1); -	} -    else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK) -	{ -		sVertexProgram = &gDeferredAvatarAlphaMaskShadowProgram; +            if ((sShaderLevel > 0))  // for hardware blending +            { +                sRenderingSkinned = TRUE; +                sVertexProgram->bind(); +            } -        // bind diffuse tex so we can reference the alpha channel... -        S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); -        sDiffuseChannel = 0; -        if (loc != -1) +            gGL.diffuseColor4f(1, 1, 1, 1); +        } +        else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK)          { -            sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -		} +            sVertexProgram = &gDeferredAvatarAlphaMaskShadowProgram; -		if ((sShaderLevel > 0))  // for hardware blending -		{ -			sRenderingSkinned = TRUE; -			sVertexProgram->bind(); -		} +            // bind diffuse tex so we can reference the alpha channel... +            S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); +            sDiffuseChannel = 0; +            if (loc != -1) +            { +                sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +            } -		gGL.diffuseColor4f(1,1,1,1); -	} -    else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_BLEND) -	{ -		sVertexProgram = &gDeferredAttachmentAlphaShadowProgram; +            if ((sShaderLevel > 0))  // for hardware blending +            { +                sRenderingSkinned = TRUE; +                sVertexProgram->bind(); +            } -        // bind diffuse tex so we can reference the alpha channel... -        S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); -        sDiffuseChannel = 0; -        if (loc != -1) +            gGL.diffuseColor4f(1, 1, 1, 1); +        } +        else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_BLEND)          { -            sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -		} -		 -		if ((sShaderLevel > 0))  // for hardware blending -		{ -			sRenderingSkinned = TRUE; -			sVertexProgram->bind(); -		} +            sVertexProgram = &gDeferredAttachmentAlphaShadowProgram; -		gGL.diffuseColor4f(1,1,1,1); -	} -    else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_MASK) -	{ -		sVertexProgram = &gDeferredAttachmentAlphaMaskShadowProgram; +            // bind diffuse tex so we can reference the alpha channel... +            S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); +            sDiffuseChannel = 0; +            if (loc != -1) +            { +                sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +            } -        // bind diffuse tex so we can reference the alpha channel... -		S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); -        sDiffuseChannel = 0; -        if (loc != -1) +            if ((sShaderLevel > 0))  // for hardware blending +            { +                sRenderingSkinned = TRUE; +                sVertexProgram->bind(); +            } + +            gGL.diffuseColor4f(1, 1, 1, 1); +        } +        else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_MASK)          { -            sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -		} +            sVertexProgram = &gDeferredAttachmentAlphaMaskShadowProgram; -		if ((sShaderLevel > 0))  // for hardware blending -		{ -			sRenderingSkinned = TRUE; -			sVertexProgram->bind(); -		} +            // bind diffuse tex so we can reference the alpha channel... +            S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); +            sDiffuseChannel = 0; +            if (loc != -1) +            { +                sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +            } -		gGL.diffuseColor4f(1,1,1,1); -	} -	else // SHADOW_PASS_ATTACHMENT_OPAQUE -	{ -		sVertexProgram = &gDeferredAttachmentShadowProgram; -		S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); -        sDiffuseChannel = 0; -        if (loc != -1) +            if ((sShaderLevel > 0))  // for hardware blending +            { +                sRenderingSkinned = TRUE; +                sVertexProgram->bind(); +            } + +            gGL.diffuseColor4f(1, 1, 1, 1); +        } +        else // SHADOW_PASS_ATTACHMENT_OPAQUE          { -            sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -		} -		sVertexProgram->bind(); -	} +            sVertexProgram = &gDeferredAttachmentShadowProgram; +            S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); +            sDiffuseChannel = 0; +            if (loc != -1) +            { +                sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); +            } +            sVertexProgram->bind(); +        } +    }  }  void LLDrawPoolAvatar::endShadowPass(S32 pass)  {  	LL_RECORD_BLOCK_TIME(FTM_SHADOW_AVATAR); +    { +        LL_PROFILE_ZONE_SCOPED; -	if (pass == SHADOW_PASS_ATTACHMENT_OPAQUE) -	{ -		LLVertexBuffer::unbind(); -	} +        if (pass == SHADOW_PASS_ATTACHMENT_OPAQUE) +        { +            LLVertexBuffer::unbind(); +        } -    if (sShaderLevel > 0) -	{			 -		sVertexProgram->unbind(); -	} -    sVertexProgram = NULL; -    sRenderingSkinned = FALSE; -    LLDrawPoolAvatar::sShadowPass = -1; +        if (sShaderLevel > 0) +        { +            sVertexProgram->unbind(); +        } +        sVertexProgram = NULL; +        sRenderingSkinned = FALSE; +        LLDrawPoolAvatar::sShadowPass = -1; +    }  }  void LLDrawPoolAvatar::renderShadow(S32 pass)  { -	LL_RECORD_BLOCK_TIME(FTM_SHADOW_AVATAR); +    LL_RECORD_BLOCK_TIME(FTM_SHADOW_AVATAR); +    { +        LL_PROFILE_ZONE_SCOPED; -	if (mDrawFace.empty()) -	{ -		return; -	} +        if (mDrawFace.empty()) +        { +            return; +        } -	const LLFace *facep = mDrawFace[0]; -	if (!facep->getDrawable()) -	{ -		return; -	} -	LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); +        const LLFace *facep = mDrawFace[0]; +        if (!facep->getDrawable()) +        { +            return; +        } +        LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); -	if (avatarp->isDead() || avatarp->isUIAvatar() || avatarp->mDrawable.isNull()) -	{ -		return; -	} -	LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); -	BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor(); -	if (oa == LLVOAvatar::AOA_INVISIBLE || -		(impostor && oa == LLVOAvatar::AOA_JELLYDOLL)) -	{ -		// No shadows for jellydolled or invisible avs. -		return; -	} -	 -    LLDrawPoolAvatar::sShadowPass = pass; +        if (avatarp->isDead() || avatarp->isUIAvatar() || avatarp->mDrawable.isNull()) +        { +            return; +        } +        LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); +        BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor(); +        if (impostor || (oa == LLVOAvatar::AOA_INVISIBLE)) +        { +            // No shadows for impostored (including jellydolled) or invisible avs. +            return; +        } -	if (pass == SHADOW_PASS_AVATAR_OPAQUE) -	{ -        LLDrawPoolAvatar::sSkipTransparent = true; -		avatarp->renderSkinned(); -        LLDrawPoolAvatar::sSkipTransparent = false; -	} -    else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND) -	{ -        LLDrawPoolAvatar::sSkipOpaque = true; -		avatarp->renderSkinned(); -        LLDrawPoolAvatar::sSkipOpaque = false; -	} -    else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK) -	{ -        LLDrawPoolAvatar::sSkipOpaque = true; -		avatarp->renderSkinned(); -        LLDrawPoolAvatar::sSkipOpaque = false; -	} -    else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_BLEND) // rigged alpha -	{ -        LLDrawPoolAvatar::sSkipOpaque = true; -        renderRigged(avatarp, RIGGED_MATERIAL_ALPHA); -        renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_EMISSIVE); -        renderRigged(avatarp, RIGGED_ALPHA); -        renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA); -        renderRigged(avatarp, RIGGED_GLOW); -        renderRigged(avatarp, RIGGED_SPECMAP_BLEND); -        renderRigged(avatarp, RIGGED_NORMMAP_BLEND); -        renderRigged(avatarp, RIGGED_NORMSPEC_BLEND); -        LLDrawPoolAvatar::sSkipOpaque = false; -	} -    else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_MASK) // rigged alpha mask -	{ -        LLDrawPoolAvatar::sSkipOpaque = true; -        renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_MASK); -        renderRigged(avatarp, RIGGED_NORMMAP_MASK); -        renderRigged(avatarp, RIGGED_SPECMAP_MASK); -		renderRigged(avatarp, RIGGED_NORMSPEC_MASK);     -        renderRigged(avatarp, RIGGED_GLOW); -        LLDrawPoolAvatar::sSkipOpaque = false; -	} -	else // rigged opaque (SHADOW_PASS_ATTACHMENT_OPAQUE -	{ -        LLDrawPoolAvatar::sSkipTransparent = true; -		renderRigged(avatarp, RIGGED_MATERIAL); -        renderRigged(avatarp, RIGGED_SPECMAP); -		renderRigged(avatarp, RIGGED_SPECMAP_EMISSIVE); -		renderRigged(avatarp, RIGGED_NORMMAP);		 -		renderRigged(avatarp, RIGGED_NORMMAP_EMISSIVE); -		renderRigged(avatarp, RIGGED_NORMSPEC); -		renderRigged(avatarp, RIGGED_NORMSPEC_EMISSIVE); -		renderRigged(avatarp, RIGGED_SIMPLE); -		renderRigged(avatarp, RIGGED_FULLBRIGHT); -		renderRigged(avatarp, RIGGED_SHINY); -		renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY); -		renderRigged(avatarp, RIGGED_GLOW); -		renderRigged(avatarp, RIGGED_DEFERRED_BUMP); -		renderRigged(avatarp, RIGGED_DEFERRED_SIMPLE); -        LLDrawPoolAvatar::sSkipTransparent = false; -	} +        LLDrawPoolAvatar::sShadowPass = pass; + +        if (pass == SHADOW_PASS_AVATAR_OPAQUE) +        { +            LLDrawPoolAvatar::sSkipTransparent = true; +            avatarp->renderSkinned(); +            LLDrawPoolAvatar::sSkipTransparent = false; +        } +        else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND) +        { +            LLDrawPoolAvatar::sSkipOpaque = true; +            avatarp->renderSkinned(); +            LLDrawPoolAvatar::sSkipOpaque = false; +        } +        else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK) +        { +            LLDrawPoolAvatar::sSkipOpaque = true; +            avatarp->renderSkinned(); +            LLDrawPoolAvatar::sSkipOpaque = false; +        } +        else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_BLEND) // rigged alpha +        { +            LLDrawPoolAvatar::sSkipOpaque = true; +            renderRigged(avatarp, RIGGED_MATERIAL_ALPHA); +            renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_EMISSIVE); +            renderRigged(avatarp, RIGGED_ALPHA); +            renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA); +            renderRigged(avatarp, RIGGED_GLOW); +            renderRigged(avatarp, RIGGED_SPECMAP_BLEND); +            renderRigged(avatarp, RIGGED_NORMMAP_BLEND); +            renderRigged(avatarp, RIGGED_NORMSPEC_BLEND); +            LLDrawPoolAvatar::sSkipOpaque = false; +        } +        else if (pass == SHADOW_PASS_ATTACHMENT_ALPHA_MASK) // rigged alpha mask +        { +            LLDrawPoolAvatar::sSkipOpaque = true; +            renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_MASK); +            renderRigged(avatarp, RIGGED_NORMMAP_MASK); +            renderRigged(avatarp, RIGGED_SPECMAP_MASK); +            renderRigged(avatarp, RIGGED_NORMSPEC_MASK); +            renderRigged(avatarp, RIGGED_GLOW); +            LLDrawPoolAvatar::sSkipOpaque = false; +        } +        else // rigged opaque (SHADOW_PASS_ATTACHMENT_OPAQUE +        { +            LLDrawPoolAvatar::sSkipTransparent = true; +            renderRigged(avatarp, RIGGED_MATERIAL); +            renderRigged(avatarp, RIGGED_SPECMAP); +            renderRigged(avatarp, RIGGED_SPECMAP_EMISSIVE); +            renderRigged(avatarp, RIGGED_NORMMAP); +            renderRigged(avatarp, RIGGED_NORMMAP_EMISSIVE); +            renderRigged(avatarp, RIGGED_NORMSPEC); +            renderRigged(avatarp, RIGGED_NORMSPEC_EMISSIVE); +            renderRigged(avatarp, RIGGED_SIMPLE); +            renderRigged(avatarp, RIGGED_FULLBRIGHT); +            renderRigged(avatarp, RIGGED_SHINY); +            renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY); +            renderRigged(avatarp, RIGGED_GLOW); +            renderRigged(avatarp, RIGGED_DEFERRED_BUMP); +            renderRigged(avatarp, RIGGED_DEFERRED_SIMPLE); +            LLDrawPoolAvatar::sSkipTransparent = false; +        } +    }  }  S32 LLDrawPoolAvatar::getNumPasses()  { +    LL_PROFILE_ZONE_SCOPED +  	if (LLPipeline::sImpostorRender)  	{  		return 8; @@ -660,6 +697,8 @@ S32 LLDrawPoolAvatar::getNumPasses()  S32 LLDrawPoolAvatar::getNumDeferredPasses()  { +    LL_PROFILE_ZONE_SCOPED +  	if (LLPipeline::sImpostorRender)  	{  		return 19; @@ -780,6 +819,8 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)  void LLDrawPoolAvatar::beginImpostor()  { +    LL_PROFILE_ZONE_SCOPED +  	if (!LLPipeline::sReflectionRender)  	{  		LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); @@ -798,6 +839,8 @@ void LLDrawPoolAvatar::beginImpostor()  void LLDrawPoolAvatar::endImpostor()  { +    LL_PROFILE_ZONE_SCOPED +  	if (LLGLSLShader::sNoFixedFunction)  	{  		gImpostorProgram.unbind(); @@ -807,6 +850,8 @@ void LLDrawPoolAvatar::endImpostor()  void LLDrawPoolAvatar::beginRigid()  { +    LL_PROFILE_ZONE_SCOPED +  	if (gPipeline.canUseVertexShaders())  	{  		if (LLPipeline::sUnderWaterRender) @@ -840,6 +885,8 @@ void LLDrawPoolAvatar::beginRigid()  void LLDrawPoolAvatar::endRigid()  { +    LL_PROFILE_ZONE_SCOPED +  	sShaderLevel = mShaderLevel;  	if (sVertexProgram != NULL)  	{ @@ -849,6 +896,8 @@ void LLDrawPoolAvatar::endRigid()  void LLDrawPoolAvatar::beginDeferredImpostor()  { +    LL_PROFILE_ZONE_SCOPED +  	if (!LLPipeline::sReflectionRender)  	{  		LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); @@ -865,6 +914,8 @@ void LLDrawPoolAvatar::beginDeferredImpostor()  void LLDrawPoolAvatar::endDeferredImpostor()  { +    LL_PROFILE_ZONE_SCOPED +  	sShaderLevel = mShaderLevel;  	sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);  	sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP); @@ -876,6 +927,8 @@ void LLDrawPoolAvatar::endDeferredImpostor()  void LLDrawPoolAvatar::beginDeferredRigid()  { +    LL_PROFILE_ZONE_SCOPED +  	sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;  	sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);  	sVertexProgram->bind(); @@ -892,6 +945,8 @@ void LLDrawPoolAvatar::beginDeferredRigid()  void LLDrawPoolAvatar::endDeferredRigid()  { +    LL_PROFILE_ZONE_SCOPED +  	sShaderLevel = mShaderLevel;  	sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);  	sVertexProgram->unbind(); @@ -901,6 +956,8 @@ void LLDrawPoolAvatar::endDeferredRigid()  void LLDrawPoolAvatar::beginSkinned()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -967,6 +1024,8 @@ void LLDrawPoolAvatar::beginSkinned()  void LLDrawPoolAvatar::endSkinned()  { +    LL_PROFILE_ZONE_SCOPED +  	// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done  	if (sShaderLevel > 0)  	{ @@ -991,6 +1050,8 @@ void LLDrawPoolAvatar::endSkinned()  void LLDrawPoolAvatar::beginRiggedSimple()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -1031,6 +1092,8 @@ void LLDrawPoolAvatar::beginRiggedSimple()  void LLDrawPoolAvatar::endRiggedSimple()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())  	{ @@ -1041,27 +1104,37 @@ void LLDrawPoolAvatar::endRiggedSimple()  void LLDrawPoolAvatar::beginRiggedAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	beginRiggedSimple();  }  void LLDrawPoolAvatar::endRiggedAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	endRiggedSimple();  }  void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	beginRiggedFullbright();  }  void LLDrawPoolAvatar::endRiggedFullbrightAlpha()  { +    LL_PROFILE_ZONE_SCOPED +  	endRiggedFullbright();  }  void LLDrawPoolAvatar::beginRiggedGlow()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -1108,11 +1181,15 @@ void LLDrawPoolAvatar::beginRiggedGlow()  void LLDrawPoolAvatar::endRiggedGlow()  { +    LL_PROFILE_ZONE_SCOPED +  	endRiggedFullbright();  }  void LLDrawPoolAvatar::beginRiggedFullbright()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -1170,6 +1247,8 @@ void LLDrawPoolAvatar::beginRiggedFullbright()  void LLDrawPoolAvatar::endRiggedFullbright()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())  	{ @@ -1180,6 +1259,8 @@ void LLDrawPoolAvatar::endRiggedFullbright()  void LLDrawPoolAvatar::beginRiggedShinySimple()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -1220,6 +1301,8 @@ void LLDrawPoolAvatar::beginRiggedShinySimple()  void LLDrawPoolAvatar::endRiggedShinySimple()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())  	{ @@ -1231,6 +1314,8 @@ void LLDrawPoolAvatar::endRiggedShinySimple()  void LLDrawPoolAvatar::beginRiggedFullbrightShiny()  { +    LL_PROFILE_ZONE_SCOPED +  	if (sShaderLevel > 0)  	{  		if (LLPipeline::sUnderWaterRender) @@ -1296,6 +1381,8 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()  void LLDrawPoolAvatar::endRiggedFullbrightShiny()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())  	{ @@ -1308,6 +1395,8 @@ void LLDrawPoolAvatar::endRiggedFullbrightShiny()  void LLDrawPoolAvatar::beginDeferredRiggedSimple()  { +    LL_PROFILE_ZONE_SCOPED +  	sVertexProgram = &gDeferredSkinnedDiffuseProgram;  	sDiffuseChannel = 0;  	sVertexProgram->bind(); @@ -1323,6 +1412,8 @@ void LLDrawPoolAvatar::beginDeferredRiggedSimple()  void LLDrawPoolAvatar::endDeferredRiggedSimple()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	sVertexProgram->unbind();  	sVertexProgram = NULL; @@ -1330,6 +1421,8 @@ void LLDrawPoolAvatar::endDeferredRiggedSimple()  void LLDrawPoolAvatar::beginDeferredRiggedBump()  { +    LL_PROFILE_ZONE_SCOPED +  	sVertexProgram = &gDeferredSkinnedBumpProgram;  	sVertexProgram->bind();      if (LLPipeline::sRenderingHUDs) @@ -1346,6 +1439,8 @@ void LLDrawPoolAvatar::beginDeferredRiggedBump()  void LLDrawPoolAvatar::endDeferredRiggedBump()  { +    LL_PROFILE_ZONE_SCOPED +  	LLVertexBuffer::unbind();  	sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);  	sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); @@ -1357,6 +1452,8 @@ void LLDrawPoolAvatar::endDeferredRiggedBump()  void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	if (pass == 1 ||  		pass == 5 ||  		pass == 9 || @@ -1387,6 +1484,8 @@ void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass)  void LLDrawPoolAvatar::endDeferredRiggedMaterial(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	if (pass == 1 ||  		pass == 5 ||  		pass == 9 || @@ -1407,6 +1506,8 @@ void LLDrawPoolAvatar::endDeferredRiggedMaterial(S32 pass)  void LLDrawPoolAvatar::beginDeferredSkinned()  { +    LL_PROFILE_ZONE_SCOPED +  	sShaderLevel = mShaderLevel;  	sVertexProgram = &gDeferredAvatarProgram;  	sRenderingSkinned = TRUE; @@ -1428,6 +1529,8 @@ void LLDrawPoolAvatar::beginDeferredSkinned()  void LLDrawPoolAvatar::endDeferredSkinned()  { +    LL_PROFILE_ZONE_SCOPED +  	// if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done  	sRenderingSkinned = FALSE;  	sVertexProgram->unbind(); @@ -1582,7 +1685,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)  				renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_EMISSIVE);  				renderRigged(avatarp, RIGGED_NORMMAP);  				renderRigged(avatarp, RIGGED_NORMMAP_MASK); -				renderRigged(avatarp, RIGGED_NORMMAP_EMISSIVE);	 +				renderRigged(avatarp, RIGGED_NORMMAP_EMISSIVE);  				renderRigged(avatarp, RIGGED_SPECMAP);  				renderRigged(avatarp, RIGGED_SPECMAP_MASK);  				renderRigged(avatarp, RIGGED_SPECMAP_EMISSIVE); @@ -1740,6 +1843,8 @@ void LLDrawPoolAvatar::getRiggedGeometry(      LLVolume* volume,      const LLVolumeFace& vol_face)  { +    LL_PROFILE_ZONE_SCOPED +      face->setGeomIndex(0);      face->setIndicesIndex(0); @@ -1794,7 +1899,7 @@ void LLDrawPoolAvatar::getRiggedGeometry(  	U16 offset = 0; -	LLMatrix4 mat_vert = skin->mBindShapeMatrix; +	LLMatrix4 mat_vert = LLMatrix4(skin->mBindShapeMatrix);  	glh::matrix4f m((F32*) mat_vert.mMatrix);  	m = m.inverse().transpose(); @@ -1836,24 +1941,26 @@ void LLDrawPoolAvatar::getRiggedGeometry(  void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(      LLVOAvatar* avatar,      LLFace* face, -    const LLMeshSkinInfo* skin, +    const LLVOVolume* vobj,      LLVolume* volume,      LLVolumeFace& vol_face)  { +    LL_PROFILE_ZONE_SCOPED; +  	LLVector4a* weights = vol_face.mWeights;  	if (!weights)  	{  		return;  	} +    if (!vobj || vobj->isNoLOD()) +    { +        return; +    } +  	LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();  	LLDrawable* drawable = face->getDrawable(); -	if (drawable->getVOVolume() && drawable->getVOVolume()->isNoLOD()) -	{ -		return; -	} -      const U32 max_joints = LLSkinningUtil::getMaxJointCount();  #if USE_SEPARATE_JOINT_INDICES_AND_WEIGHTS @@ -1893,23 +2000,26 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(      }  #endif -    // FIXME ugly const cast -    LLSkinningUtil::scrubInvalidJoints(avatar, const_cast<LLMeshSkinInfo*>(skin)); - -	U32 data_mask = face->getRiggedVertexBufferDataMask(); +    U32 data_mask = face->getRiggedVertexBufferDataMask(); +    const LLMeshSkinInfo* skin = nullptr; -    if (!vol_face.mWeightsScrubbed) -    { -        LLSkinningUtil::scrubSkinWeights(weights, vol_face.mNumVertices, skin); -        vol_face.mWeightsScrubbed = TRUE; -    } -	  	if (buffer.isNull() ||   		buffer->getTypeMask() != data_mask ||  		buffer->getNumVerts() != vol_face.mNumVertices ||  		buffer->getNumIndices() != vol_face.mNumIndices ||  		(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))  	{ +        LL_PROFILE_ZONE_NAMED("Rigged VBO Rebuild"); +        skin = vobj->getSkinInfo(); +        // FIXME ugly const cast +        LLSkinningUtil::scrubInvalidJoints(avatar, const_cast<LLMeshSkinInfo*>(skin)); + +        if (!vol_face.mWeightsScrubbed) +        { +            LLSkinningUtil::scrubSkinWeights(weights, vol_face.mNumVertices, skin); +            vol_face.mWeightsScrubbed = TRUE; +        } +  		if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))  		{              //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues @@ -1935,18 +2045,13 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(  		}  	} -	if (buffer.isNull() || -		buffer->getNumVerts() != vol_face.mNumVertices || -		buffer->getNumIndices() != vol_face.mNumIndices) -	{ -		// Allocation failed -		return; -	} - -	if (!buffer.isNull() &&  -		sShaderLevel <= 0 &&  -		face->mLastSkinTime < avatar->getLastSkinTime()) +	if (sShaderLevel <= 0 &&  +        face->mLastSkinTime < avatar->getLastSkinTime() && +        !buffer.isNull() && +        buffer->getNumVerts() == vol_face.mNumVertices && +        buffer->getNumIndices() == vol_face.mNumIndices)  	{ +        LL_PROFILE_ZONE_NAMED("Software Skinning");  		//perform software vertex skinning for this face  		LLStrider<LLVector3> position;  		LLStrider<LLVector3> normal; @@ -1962,54 +2067,12 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(  		LLVector4a* pos = (LLVector4a*) position.get();  		LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL; -		 -		//build matrix palette -		LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; -        U32 count = LLSkinningUtil::getMeshJointCount(skin); -        LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar); -        LLSkinningUtil::checkSkinWeights(weights, buffer->getNumVerts(), skin); -		LLMatrix4a bind_shape_matrix; -		bind_shape_matrix.loadu(skin->mBindShapeMatrix); +        const MatrixPaletteCache& mpc = updateSkinInfoMatrixPalette(avatar, vobj->getMeshID()); +        const LLMatrix4a* mat = &(mpc.mMatrixPalette[0]); +        const LLMatrix4a& bind_shape_matrix = mpc.mBindShapeMatrix; -#if USE_SEPARATE_JOINT_INDICES_AND_WEIGHTS -        U8* joint_indices_cursor = vol_face.mJointIndices; -        // fast path with joint indices separate from weights -        if (joint_indices_cursor) -        { -            LLMatrix4a src[4]; -		    for (U32 j = 0; j < buffer->getNumVerts(); ++j) -		    { -			    LLMatrix4a final_mat; -                //LLMatrix4a final_mat_correct; - -                F32* jw = just_weights[j].getF32ptr(); - -                LLSkinningUtil::getPerVertexSkinMatrixWithIndices(jw, joint_indices_cursor, mat, final_mat, src);                 - -                joint_indices_cursor += 4; - -			    LLVector4a& v = vol_face.mPositions[j]; - -			    LLVector4a t; -			    LLVector4a dst; -			    bind_shape_matrix.affineTransform(v, t); -			    final_mat.affineTransform(t, dst); -			    pos[j] = dst; - -			    if (norm) -			    { -				    LLVector4a& n = vol_face.mNormals[j]; -				    bind_shape_matrix.rotate(n, t); -				    final_mat.rotate(t, dst); -				    dst.normalize3fast(); -				    norm[j] = dst; -			    } -		    } -        } -        // slow path with joint indices calculated from weights -        else -#endif +        if (!mpc.mMatrixPalette.empty())          {              for (U32 j = 0; j < buffer->getNumVerts(); ++j)  		    { @@ -2038,22 +2101,25 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(  void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  { +    LL_PROFILE_ZONE_SCOPED +  	if (!avatar->shouldRenderRigged())  	{  		return;  	} -	stop_glerror(); +    LLUUID lastMeshId;  	for (U32 i = 0; i < mRiggedFace[type].size(); ++i)  	{ +        LL_PROFILE_ZONE_NAMED("Render Rigged Face");  		LLFace* face = mRiggedFace[type][i];          S32 offset = face->getIndicesStart();  		U32 count = face->getIndicesCount();          U16 start = face->getGeomStart(); -		U16 end = start + face->getGeomCount()-1;			 +		U16 end = start + face->getGeomCount()-1;  		LLDrawable* drawable = face->getDrawable();  		if (!drawable) @@ -2076,19 +2142,6 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  			continue;  		} -		const LLMeshSkinInfo* skin = vobj->getSkinInfo(); -		if (!skin) -		{ -			continue; -		} - -		//stop_glerror(); - -		//const LLVolumeFace& vol_face = volume->getVolumeFace(te); -		//updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face); -		 -		//stop_glerror(); -  		U32 data_mask = LLFace::getRiggedDataMask(type);  		LLVertexBuffer* buff = face->getVertexBuffer(); @@ -2175,57 +2228,36 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)          }  		if (buff) -		{         +		{  			if (sShaderLevel > 0)  			{ -                // upload matrix palette to shader -				LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; -				U32 count = LLSkinningUtil::getMeshJointCount(skin); -                LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, count, skin, avatar); - -				stop_glerror(); - -				F32 mp[LL_MAX_JOINTS_PER_MESH_OBJECT*12]; - -				for (U32 i = 0; i < count; ++i) -				{ -					F32* m = (F32*) mat[i].mMatrix[0].getF32ptr(); - -					U32 idx = i*12; - -					mp[idx+0] = m[0]; -					mp[idx+1] = m[1]; -					mp[idx+2] = m[2]; -					mp[idx+3] = m[12]; - -					mp[idx+4] = m[4]; -					mp[idx+5] = m[5]; -					mp[idx+6] = m[6]; -					mp[idx+7] = m[13]; +                auto& meshId = vobj->getMeshID(); +                 +                if (lastMeshId != meshId) // <== only upload matrix palette to GL if the skininfo changed +                { +                    // upload matrix palette to shader +                    const MatrixPaletteCache& mpc = updateSkinInfoMatrixPalette(avatar, meshId); +                    U32 count = mpc.mMatrixPalette.size(); -					mp[idx+8] = m[8]; -					mp[idx+9] = m[9]; -					mp[idx+10] = m[10]; -					mp[idx+11] = m[14]; -				} +                    if (count == 0) +                    { +                        //skin info not loaded yet, don't render +                        continue; +                    } -				LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX,  -					count, -					FALSE, -					(GLfloat*) mp); +                    LLDrawPoolAvatar::sVertexProgram->uniformMatrix3x4fv(LLViewerShaderMgr::AVATAR_MATRIX, +                        count, +                        FALSE, +                        (GLfloat*) &(mpc.mGLMp[0])); +                } -				stop_glerror(); +                lastMeshId = meshId;  			}  			else  			{  				data_mask &= ~LLVertexBuffer::MAP_WEIGHT4;  			} -			/*if (glow) -			{ -				gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow()); -			}*/ -  			if (mat)  			{  				//order is important here LLRender::DIFFUSE_MAP should be last, becouse it change  @@ -2240,13 +2272,17 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)                  {                      specular = face->getTexture(LLRender::SPECULAR_MAP);                  } -                if (specular) +                if (specular && specular_channel >= 0)                  { -                    gGL.getTexUnit(specular_channel)->bind(specular); +                    gGL.getTexUnit(specular_channel)->bindFast(specular);                  } -				gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP)); -				gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP), false, true); +                if (normal_channel >= 0) +                { +                    gGL.getTexUnit(normal_channel)->bindFast(face->getTexture(LLRender::NORMAL_MAP)); +                } + +				gGL.getTexUnit(sDiffuseChannel)->bindFast(face->getTexture(LLRender::DIFFUSE_MAP));  				LLColor4 col = mat->getSpecularLightColor(); @@ -2277,23 +2313,28 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  					sVertexProgram->setMinimumAlpha(0.f);  				} -				for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) -				{ -					LLViewerTexture* tex = face->getTexture(i); -					if (tex) -					{ -						tex->addTextureStats(avatar->getPixelArea()); -					} -				} +                if (!LLPipeline::sShadowRender && !LLPipeline::sReflectionRender) +                { +                    for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) +                    { +                        LLViewerTexture* tex = face->getTexture(i); +                        if (tex) +                        { +                            tex->addTextureStats(avatar->getPixelArea()); +                        } +                    } +                }  			}  			else  			{ -				gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());  				sVertexProgram->setMinimumAlpha(0.f);  				if (normal_channel > -1)  				{  					LLDrawPoolBump::bindBumpMap(face, normal_channel);  				} + +                gGL.getTexUnit(sDiffuseChannel)->bindFast(face->getTexture()); +  			}  			if (face->mTextureMatrix && vobj->mTexAnimMode) @@ -2307,8 +2348,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  				    gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);                  } -				buff->setBuffer(data_mask); -				buff->drawRange(LLRender::TRIANGLES, start, end, count, offset); +				buff->setBufferFast(data_mask); +				buff->drawRangeFast(LLRender::TRIANGLES, start, end, count, offset);                  if (tex_index <= 1)                  { @@ -2319,27 +2360,31 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)  			}  			else  			{ -				buff->setBuffer(data_mask); -				buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);		 +				buff->setBufferFast(data_mask); +				buff->drawRangeFast(LLRender::TRIANGLES, start, end, count, offset);  			} - -			gPipeline.addTrianglesDrawn(count, LLRender::TRIANGLES);  		}  	}  }  void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);  }  void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_DEFERRED_BUMP);  }  void LLDrawPoolAvatar::renderDeferredRiggedMaterial(LLVOAvatar* avatar, S32 pass)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, pass);  } @@ -2352,8 +2397,10 @@ void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)  	//update rigged vertex buffers  	for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)  	{ +        LL_PROFILE_ZONE_NAMED("Pass");  		for (U32 i = 0; i < mRiggedFace[type].size(); ++i)  		{ +            LL_PROFILE_ZONE_NAMED("Face");  			LLFace* face = mRiggedFace[type][i];  			LLDrawable* drawable = face->getDrawable();  			if (!drawable) @@ -2376,43 +2423,120 @@ void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)  				continue;  			} -			const LLMeshSkinInfo* skin = vobj->getSkinInfo(); -			if (!skin) -			{ -				continue; -			} - -			stop_glerror(); -  			LLVolumeFace& vol_face = volume->getVolumeFace(te); -			updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face); +			updateRiggedFaceVertexBuffer(avatar, face, vobj, volume, vol_face);  		}  	}  } +void LLDrawPoolAvatar::updateSkinInfoMatrixPalettes(LLVOAvatar* avatarp) +{ +    LL_PROFILE_ZONE_SCOPED; +    //evict matrix palettes from the cache that haven't been updated in 10 frames +    for (matrix_palette_cache_t::iterator iter = mMatrixPaletteCache.begin(); iter != mMatrixPaletteCache.end(); ) +    { +        if (gFrameCount - iter->second.mFrame > 10) +        { +            iter = mMatrixPaletteCache.erase(iter); +        } +        else +        { +            ++iter; +        } +    } +} + +const LLDrawPoolAvatar::MatrixPaletteCache& LLDrawPoolAvatar::updateSkinInfoMatrixPalette(LLVOAvatar * avatarp, const LLUUID& meshId) +{ +    MatrixPaletteCache& entry = mMatrixPaletteCache[meshId]; + +    if (entry.mFrame != gFrameCount) +    { +        LL_PROFILE_ZONE_SCOPED; + +        const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(meshId); +        entry.mFrame = gFrameCount; + +        if (skin != nullptr) +        { +            entry.mBindShapeMatrix = skin->mBindShapeMatrix; + +            //build matrix palette +            U32 count = LLSkinningUtil::getMeshJointCount(skin); +            entry.mMatrixPalette.resize(count); +            LLSkinningUtil::initSkinningMatrixPalette(&(entry.mMatrixPalette[0]), count, skin, avatarp); + +            const LLMatrix4a* mat = &(entry.mMatrixPalette[0]); + +            entry.mGLMp.resize(count * 12); + +            F32* mp = &(entry.mGLMp[0]); + +            for (U32 i = 0; i < count; ++i) +            { +                F32* m = (F32*)mat[i].mMatrix[0].getF32ptr(); + +                U32 idx = i * 12; + +                mp[idx + 0] = m[0]; +                mp[idx + 1] = m[1]; +                mp[idx + 2] = m[2]; +                mp[idx + 3] = m[12]; + +                mp[idx + 4] = m[4]; +                mp[idx + 5] = m[5]; +                mp[idx + 6] = m[6]; +                mp[idx + 7] = m[13]; + +                mp[idx + 8] = m[8]; +                mp[idx + 9] = m[9]; +                mp[idx + 10] = m[10]; +                mp[idx + 11] = m[14]; +            } +        } +        else +        { +            entry.mMatrixPalette.resize(0); +            entry.mGLMp.resize(0); +        } +    } + +    return entry; +} +  void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_SIMPLE);  }  void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_FULLBRIGHT);  }  void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_SHINY);  }  void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	renderRigged(avatar, RIGGED_FULLBRIGHT_SHINY);  }  void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	if (!mRiggedFace[RIGGED_ALPHA].empty())  	{  		LLGLEnable blend(GL_BLEND); @@ -2430,6 +2554,8 @@ void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)  void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	if (!mRiggedFace[RIGGED_FULLBRIGHT_ALPHA].empty())  	{  		LLGLEnable blend(GL_BLEND); @@ -2447,6 +2573,8 @@ void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)  void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)  { +    LL_PROFILE_ZONE_SCOPED +  	if (!mRiggedFace[RIGGED_GLOW].empty())  	{  		LLGLEnable blend(GL_BLEND); @@ -2474,6 +2602,8 @@ void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)  //-----------------------------------------------------------------------------  LLViewerTexture *LLDrawPoolAvatar::getDebugTexture()  { +    LL_PROFILE_ZONE_SCOPED +  	if (mReferences.empty())  	{  		return NULL; @@ -2497,6 +2627,8 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const  void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)  { +    LL_PROFILE_ZONE_SCOPED +      llassert (facep->isState(LLFace::RIGGED));      llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);      if (facep->getPool() && facep->getPool() != this) @@ -2519,6 +2651,8 @@ void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)  void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)  { +    LL_PROFILE_ZONE_SCOPED +      llassert (facep->isState(LLFace::RIGGED));      llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);      if (facep->getPool() != this) @@ -2556,7 +2690,7 @@ LLVertexBufferAvatar::LLVertexBufferAvatar()  : LLVertexBuffer(sDataMask,   	GL_STREAM_DRAW_ARB) //avatars are always stream draw due to morph targets  { - +    LL_PROFILE_ZONE_SCOPED  } diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index 92a8538958..800bbc5f62 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -28,14 +28,18 @@  #define LL_LLDRAWPOOLAVATAR_H  #include "lldrawpool.h" +#include "llmodel.h" + +#include <unordered_map>  class LLVOAvatar; +class LLVOVolume;  class LLGLSLShader;  class LLFace; -class LLMeshSkinInfo;  class LLVolume;  class LLVolumeFace; +extern U32 gFrameCount;  class LLDrawPoolAvatar : public LLFacePool  { @@ -253,11 +257,13 @@ typedef enum  	void getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face);  	void updateRiggedFaceVertexBuffer(LLVOAvatar* avatar,  									  LLFace* facep,  -									  const LLMeshSkinInfo* skin,  +									  const LLVOVolume* vobj,  									  LLVolume* volume,  									  LLVolumeFace& vol_face);  	void updateRiggedVertexBuffers(LLVOAvatar* avatar); +    void updateSkinInfoMatrixPalettes(LLVOAvatar* avatarp); +  	void renderRigged(LLVOAvatar* avatar, U32 type, bool glow = false);  	void renderRiggedSimple(LLVOAvatar* avatar);  	void renderRiggedAlpha(LLVOAvatar* avatar); @@ -277,6 +283,27 @@ typedef enum  	std::vector<LLFace*> mRiggedFace[NUM_RIGGED_PASSES]; +    LL_ALIGN_PREFIX(16) +    class MatrixPaletteCache +    { +    public: +        U32 mFrame; +        LLMeshSkinInfo::matrix_list_t mMatrixPalette; +        LL_ALIGN_16(LLMatrix4a mBindShapeMatrix); +        // Float array ready to be sent to GL +        std::vector<F32> mGLMp; + +        MatrixPaletteCache() : +            mFrame(gFrameCount-1) +        { +        } +    } LL_ALIGN_POSTFIX(16); +     +    const MatrixPaletteCache& updateSkinInfoMatrixPalette(LLVOAvatar* avatarp, const LLUUID& meshId); + +    typedef std::unordered_map<LLUUID, MatrixPaletteCache> matrix_palette_cache_t; +    matrix_palette_cache_t mMatrixPaletteCache; +  	/*virtual*/ LLViewerTexture *getDebugTexture();  	/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp index 14069fa6c2..d75884cc16 100644 --- a/indra/newview/lldrawpoolbump.cpp +++ b/indra/newview/lldrawpoolbump.cpp @@ -677,6 +677,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLFace* face, S32 channel)  //static  BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsize, S32 channel)  { +    LL_PROFILE_ZONE_SCOPED;  	//Note: texture atlas does not support bump texture now.  	LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(texture) ;  	if(!tex) @@ -693,7 +694,7 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi  		break;  	case BE_BRIGHTNESS:   	case BE_DARKNESS: -		bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code );		 +		bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code );  		break;  	default: @@ -709,12 +710,12 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi  	{  		if (channel == -2)  		{ -			gGL.getTexUnit(1)->bind(bump); -			gGL.getTexUnit(0)->bind(bump); +			gGL.getTexUnit(1)->bindFast(bump); +			gGL.getTexUnit(0)->bindFast(bump);  		}  		else  		{ -			gGL.getTexUnit(channel)->bind(bump); +			gGL.getTexUnit(channel)->bindFast(bump);  		}  		return TRUE; @@ -1061,6 +1062,7 @@ void LLBumpImageList::updateImages()  // Note: the caller SHOULD NOT keep the pointer that this function returns.  It may be updated as more data arrives.  LLViewerTexture* LLBumpImageList::getBrightnessDarknessImage(LLViewerFetchedTexture* src_image, U8 bump_code )  { +    LL_PROFILE_ZONE_SCOPED;  	llassert( (bump_code == BE_BRIGHTNESS) || (bump_code == BE_DARKNESS) );  	LLViewerTexture* bump = NULL; @@ -1497,6 +1499,7 @@ void LLDrawPoolBump::renderBump(U32 type, U32 mask)  void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures)  { +    LL_PROFILE_ZONE_SCOPED;  	applyModelMatrix(params);  	bool tex_setup = false; @@ -1507,7 +1510,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL  		{  			if (params.mTextureList[i].notNull())  			{ -				gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); +				gGL.getTexUnit(i)->bindFast(params.mTextureList[i]);  			}  		}  	} @@ -1522,13 +1525,6 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL  			}  			else  			{ -				if (!LLGLSLShader::sNoFixedFunction) -				{ -					gGL.getTexUnit(1)->activate(); -					gGL.matrixMode(LLRender::MM_TEXTURE); -					gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); -				} -  				gGL.getTexUnit(0)->activate();  				gGL.matrixMode(LLRender::MM_TEXTURE);  				gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); @@ -1545,8 +1541,7 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL  		{  			if (params.mTexture.notNull())  			{ -				gGL.getTexUnit(diffuse_channel)->bind(params.mTexture); -				params.mTexture->addTextureStats(params.mVSize);		 +				gGL.getTexUnit(diffuse_channel)->bindFast(params.mTexture);  			}  			else  			{ @@ -1559,10 +1554,10 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL  	{  		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); -	if (tex_setup) +	params.mVertexBuffer->setBufferFast(mask); +	params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); + +    if (tex_setup)  	{  		if (mShiny)  		{ @@ -1570,12 +1565,6 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL  		}  		else  		{ -			if (!LLGLSLShader::sNoFixedFunction) -			{ -				gGL.getTexUnit(1)->activate(); -				gGL.matrixMode(LLRender::MM_TEXTURE); -				gGL.loadIdentity(); -			}  			gGL.getTexUnit(0)->activate();  			gGL.matrixMode(LLRender::MM_TEXTURE);  		} diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h index 476b1d41b7..bab160c34d 100644 --- a/indra/newview/lldrawpoolbump.h +++ b/indra/newview/lldrawpoolbump.h @@ -32,6 +32,8 @@  #include "lltextureentry.h"  #include "lluuid.h" +#include <unordered_map> +  class LLImageRaw;  class LLSpatialGroup;  class LLDrawInfo; @@ -161,7 +163,7 @@ private:  	static void onSourceLoaded( BOOL success, LLViewerTexture *src_vi, LLImageRaw* src, LLUUID& source_asset_id, EBumpEffect bump );  private: -	typedef std::map<LLUUID, LLPointer<LLViewerTexture> > bump_image_map_t; +	typedef std::unordered_map<LLUUID, LLPointer<LLViewerTexture> > bump_image_map_t;  	bump_image_map_t mBrightnessEntries;  	bump_image_map_t mDarknessEntries;  }; diff --git a/indra/newview/lldrawpoolmaterials.cpp b/indra/newview/lldrawpoolmaterials.cpp index 05b0c1f1a9..d2a8757379 100644 --- a/indra/newview/lldrawpoolmaterials.cpp +++ b/indra/newview/lldrawpoolmaterials.cpp @@ -106,6 +106,7 @@ void LLDrawPoolMaterials::endDeferredPass(S32 pass)  void LLDrawPoolMaterials::renderDeferred(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED;  	static const U32 type_list[] =   	{  		LLRenderPass::PASS_MATERIAL, @@ -157,7 +158,10 @@ void LLDrawPoolMaterials::renderDeferred(S32 pass)  		mShader->setMinimumAlpha(params.mAlphaMaskCutoff);  		mShader->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, params.mFullbright ? 1.f : 0.f); -		pushBatch(params, mask, TRUE); +        { +            LL_PROFILE_ZONE_SCOPED; +            pushMaterialsBatch(params, mask); +        }  	}  } @@ -171,49 +175,37 @@ void LLDrawPoolMaterials::bindNormalMap(LLViewerTexture* tex)  	mShader->bindTexture(LLShaderMgr::BUMP_MAP, tex);  } -void LLDrawPoolMaterials::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) +void LLDrawPoolMaterials::pushMaterialsBatch(LLDrawInfo& params, U32 mask)  { +    LL_PROFILE_ZONE_SCOPED;  	applyModelMatrix(params);  	bool tex_setup = false; -	if (batch_textures && params.mTextureList.size() > 1) +	//not batching textures or batch has only 1 texture -- might need a texture matrix +	if (params.mTextureMatrix)  	{ -		for (U32 i = 0; i < params.mTextureList.size(); ++i) +		//if (mShiny)  		{ -			if (params.mTextureList[i].notNull()) -			{ -				gGL.getTexUnit(i)->bind(params.mTextureList[i], TRUE); -			} +			gGL.getTexUnit(0)->activate(); +			gGL.matrixMode(LLRender::MM_TEXTURE);  		} -	} -	else -	{ //not batching textures or batch has only 1 texture -- might need a texture matrix -		if (params.mTextureMatrix) -		{ -			//if (mShiny) -			{ -				gGL.getTexUnit(0)->activate(); -				gGL.matrixMode(LLRender::MM_TEXTURE); -			} -			gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); -			gPipeline.mTextureMatrixOps++; +		gGL.loadMatrix((GLfloat*) params.mTextureMatrix->mMatrix); +		gPipeline.mTextureMatrixOps++; -			tex_setup = true; -		} +		tex_setup = true; +	} -		if (mShaderLevel > 1 && texture) +	if (mShaderLevel > 1) +	{ +		if (params.mTexture.notNull()) +		{ +			gGL.getTexUnit(diffuse_channel)->bindFast(params.mTexture); +		} +		else  		{ -			if (params.mTexture.notNull()) -			{ -				gGL.getTexUnit(diffuse_channel)->bind(params.mTexture); -				params.mTexture->addTextureStats(params.mVSize); -			} -			else -			{ -				gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE); -			} +			gGL.getTexUnit(diffuse_channel)->unbindFast(LLTexUnit::TT_TEXTURE);  		}  	} @@ -224,9 +216,9 @@ void LLDrawPoolMaterials::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture,  	LLGLEnableFunc stencil_test(GL_STENCIL_TEST, params.mSelected, &LLGLCommonFunc::selected_stencil_test); -	params.mVertexBuffer->setBuffer(mask); -	params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); -	gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode); +	params.mVertexBuffer->setBufferFast(mask); +	params.mVertexBuffer->drawRangeFast(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset); +  	if (tex_setup)  	{  		gGL.getTexUnit(0)->activate(); diff --git a/indra/newview/lldrawpoolmaterials.h b/indra/newview/lldrawpoolmaterials.h index eae1aba87c..6e39821b07 100644 --- a/indra/newview/lldrawpoolmaterials.h +++ b/indra/newview/lldrawpoolmaterials.h @@ -69,7 +69,7 @@ public:  	void bindSpecularMap(LLViewerTexture* tex);  	void bindNormalMap(LLViewerTexture* tex); -	/*virtual*/ void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures = FALSE); +	/*virtual*/ void pushMaterialsBatch(LLDrawInfo& params, U32 mask);  };  #endif //LL_LLDRAWPOOLMATERIALS_H diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp index f211cf6e27..843288cfb0 100644 --- a/indra/newview/lldrawpoolsimple.cpp +++ b/indra/newview/lldrawpoolsimple.cpp @@ -150,13 +150,6 @@ void LLDrawPoolGlow::render(S32 pass)  	}  } -void LLDrawPoolGlow::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture, BOOL batch_textures) -{ -	//gGL.diffuseColor4ubv(params.mGlowColor.mV); -	LLRenderPass::pushBatch(params, mask, texture, batch_textures); -} - -  LLDrawPoolSimple::LLDrawPoolSimple() :  	LLRenderPass(POOL_SIMPLE)  { @@ -199,11 +192,7 @@ void LLDrawPoolSimple::beginRenderPass(S32 pass)  	}  	else   	{ -		// don't use shaders! -		if (gGLManager.mHasShaderObjects) -		{ -			LLGLSLShader::bindNoShader(); -		}		 +		LLGLSLShader::bindNoShader();  	}  } @@ -301,11 +290,7 @@ void LLDrawPoolAlphaMask::beginRenderPass(S32 pass)  	}  	else   	{ -		// don't use shaders! -		if (gGLManager.mHasShaderObjects) -		{ -			LLGLSLShader::bindNoShader(); -		}		 +		LLGLSLShader::bindNoShader();  	}  } @@ -392,11 +377,7 @@ void LLDrawPoolFullbrightAlphaMask::beginRenderPass(S32 pass)  	}  	else   	{ -		// don't use shaders! -		if (gGLManager.mHasShaderObjects) -		{ -			LLGLSLShader::bindNoShader(); -		}		 +		LLGLSLShader::bindNoShader();  	}  } @@ -483,6 +464,7 @@ void LLDrawPoolSimple::endDeferredPass(S32 pass)  void LLDrawPoolSimple::renderDeferred(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED;  	LLGLDisable blend(GL_BLEND);  	LLGLDisable alpha_test(GL_ALPHA_TEST); @@ -567,11 +549,7 @@ void LLDrawPoolGrass::beginRenderPass(S32 pass)  	else   	{  		gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); -		// don't use shaders! -		if (gGLManager.mHasShaderObjects) -		{ -			LLGLSLShader::bindNoShader(); -		}		 +		LLGLSLShader::bindNoShader();  	}  } diff --git a/indra/newview/lldrawpoolsimple.h b/indra/newview/lldrawpoolsimple.h index 608ad9e1eb..b27cc4babc 100644 --- a/indra/newview/lldrawpoolsimple.h +++ b/indra/newview/lldrawpoolsimple.h @@ -187,7 +187,6 @@ public:  	/*virtual*/ S32 getNumPasses();  	void render(S32 pass = 0); -	void pushBatch(LLDrawInfo& params, U32 mask, BOOL texture = TRUE, BOOL batch_textures = FALSE);  }; diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index b6f55e800a..b1eefaab81 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -82,13 +82,7 @@ void LLDrawPoolSky::render(S32 pass)  	}  	else  	{ -		// don't use shaders! -		if (gGLManager.mHasShaderObjects) -		{ -			// Ironically, we must support shader objects to be -			// able to use this call. -			LLGLSLShader::bindNoShader(); -		} +		LLGLSLShader::bindNoShader();  		mShader = NULL;  	} diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 37dc80e2b7..34a8b6b2cc 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -343,8 +343,6 @@ void LLDrawPoolTerrain::renderFullShader()      LLSettingsWater::ptr_t pwater = LLEnvironment::instance().getCurrentWater(); -    ((LLSettingsVOWater*)pwater.get())->updateShader(shader); -  	//  	// detail texture 1  	// diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 0d5195bdbf..a1ff020068 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -153,6 +153,7 @@ void LLDrawPoolTree::beginDeferredPass(S32 pass)  void LLDrawPoolTree::renderDeferred(S32 pass)  { +    LL_PROFILE_ZONE_SCOPED;  	render(pass);  } diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 0c3d8f3098..8c8dc3f3d2 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -182,8 +182,6 @@ void LLDrawPoolWLSky::renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 ca          sky_shader->bindTexture(LLShaderMgr::RAINBOW_MAP, rainbow_tex);          sky_shader->bindTexture(LLShaderMgr::HALO_MAP,  halo_tex); -        ((LLSettingsVOSky*)psky.get())->updateShader(sky_shader); -          F32 moisture_level  = (float)psky->getSkyMoistureLevel();          F32 droplet_radius  = (float)psky->getSkyDropletRadius();          F32 ice_level       = (float)psky->getSkyIceLevel(); @@ -406,8 +404,6 @@ void LLDrawPoolWLSky::renderSkyCloudsDeferred(const LLVector3& camPosLocal, F32          cloudshader->uniform1f(LLShaderMgr::CLOUD_VARIANCE, cloud_variance);          cloudshader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor()); -        ((LLSettingsVOSky*)psky.get())->updateShader(cloudshader); -  		/// Render the skydome          renderDome(camPosLocal, camHeightLocal, cloudshader); @@ -462,8 +458,6 @@ void LLDrawPoolWLSky::renderSkyClouds(const LLVector3& camPosLocal, F32 camHeigh          cloudshader->uniform1f(LLShaderMgr::CLOUD_VARIANCE, cloud_variance);          cloudshader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor()); -        ((LLSettingsVOSky*)psky.get())->updateShader(cloudshader); -  		/// Render the skydome          renderDome(camPosLocal, camHeightLocal, cloudshader); diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 8881d11802..69d3075928 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -1471,6 +1471,7 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::getSharedEnvironmentInstance()  void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool forced)  { +    LL_PROFILE_ZONE_SCOPED;      DayInstance::ptr_t pinstance = getSelectedEnvironmentInstance();      if ((mCurrentEnvironment != pinstance) || forced) @@ -1488,6 +1489,8 @@ void LLEnvironment::updateEnvironment(LLSettingsBase::Seconds transition, bool f          {              mCurrentEnvironment = pinstance;          } + +        updateSettingsUniforms();      }  } @@ -1614,6 +1617,8 @@ void LLEnvironment::update(const LLViewerCamera * cam)      stop_glerror(); +    updateSettingsUniforms(); +      // *TODO: potential optimization - this block may only need to be      // executed some of the time.  For example for water shaders only.      { @@ -1648,10 +1653,16 @@ void LLEnvironment::updateCloudScroll()  }  // static -void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLSettingsBase::ptr_t &psetting) +void LLEnvironment::updateGLVariablesForSettings(LLShaderUniforms* uniforms, const LLSettingsBase::ptr_t &psetting)  {      LL_RECORD_BLOCK_TIME(FTM_SHADER_PARAM_UPDATE); +    for (int i = 0; i < LLGLSLShader::SG_COUNT; ++i) +    { +        uniforms[i].clear(); +    } + +    LLShaderUniforms* shader = &uniforms[LLGLSLShader::SG_ANY];      //_WARNS("RIDER") << "----------------------------------------------------------------" << LL_ENDL;      LLSettingsBase::parammapping_t params = psetting->getParameterMap();      for (auto &it: params) @@ -1694,7 +1705,7 @@ void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLS          {              LLVector4 vect4(value);              //_WARNS("RIDER") << "pushing '" << (*it).first << "' as " << vect4 << LL_ENDL; -            shader->uniform4fv(it.second.getShaderKey(), 1, vect4.mV); +            shader->uniform4fv(it.second.getShaderKey(), vect4 );              break;          } @@ -1707,17 +1718,30 @@ void LLEnvironment::updateGLVariablesForSettings(LLGLSLShader *shader, const LLS          default:              break;          } -        stop_glerror();      }      //_WARNS("RIDER") << "----------------------------------------------------------------" << LL_ENDL; -    psetting->applySpecial(shader); +    psetting->applySpecial(uniforms); +} + +void LLEnvironment::updateShaderUniforms(LLGLSLShader* shader) +{ +    LL_PROFILE_ZONE_SCOPED; + +    // apply uniforms that should be applied to all shaders +    mSkyUniforms[LLGLSLShader::SG_ANY].apply(shader); +    mWaterUniforms[LLGLSLShader::SG_ANY].apply(shader); + +    // apply uniforms specific to the given shader's shader group +    auto group = shader->mShaderGroup; +    mSkyUniforms[group].apply(shader); +    mWaterUniforms[group].apply(shader);  } -void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader) +void LLEnvironment::updateSettingsUniforms()  { -    updateGLVariablesForSettings(shader, mCurrentEnvironment->getWater()); -    updateGLVariablesForSettings(shader, mCurrentEnvironment->getSky()); +    updateGLVariablesForSettings(mWaterUniforms, mCurrentEnvironment->getWater()); +    updateGLVariablesForSettings(mSkyUniforms, mCurrentEnvironment->getSky());  }  void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo, LLSettingsBase::Seconds transition) @@ -2618,6 +2642,7 @@ LLEnvironment::DayInstance::ptr_t LLEnvironment::DayInstance::clone() const  bool LLEnvironment::DayInstance::applyTimeDelta(const LLSettingsBase::Seconds& delta)  { +    LL_PROFILE_ZONE_SCOPED;      ptr_t keeper(shared_from_this());   // makes sure that this does not go away while it is being worked on.      bool changed(false); diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h index 7cbf2d25bb..3568fbcfd1 100644 --- a/indra/newview/llenvironment.h +++ b/indra/newview/llenvironment.h @@ -38,11 +38,12 @@  #include "llatmosphere.h" +#include "llglslshader.h" +  #include <boost/signals2.hpp>  //-------------------------------------------------------------------------  class LLViewerCamera; -class LLGLSLShader;  class LLParcel;  //------------------------------------------------------------------------- @@ -50,8 +51,8 @@ class LLEnvironment : public LLSingleton<LLEnvironment>  {      LLSINGLETON_C11(LLEnvironment);      LOG_CLASS(LLEnvironment); -  public: +      static const F64Seconds     TRANSITION_INSTANT;      static const F64Seconds     TRANSITION_FAST;      static const F64Seconds     TRANSITION_DEFAULT; @@ -131,9 +132,14 @@ public:      void                        update(const LLViewerCamera * cam); -    static void                 updateGLVariablesForSettings(LLGLSLShader *shader, const LLSettingsBase::ptr_t &psetting); +    static void                 updateGLVariablesForSettings(LLShaderUniforms* uniforms, const LLSettingsBase::ptr_t &psetting); +     +    // apply current sky settings to given shader      void                        updateShaderUniforms(LLGLSLShader *shader); +    // prepare settings to be applied to shaders (call whenever settings are updated) +    void                        updateSettingsUniforms(); +      void                        setSelectedEnvironment(EnvSelection_t env, LLSettingsBase::Seconds transition = TRANSITION_DEFAULT, bool forced = false);      EnvSelection_t              getSelectedEnvironment() const                  { return mSelectedEnvironment; } @@ -234,6 +240,11 @@ public:      void                        handleEnvironmentPush(LLSD &message); +    //cached uniform values from LLSD values +    LLShaderUniforms mWaterUniforms[LLGLSLShader::SG_COUNT]; +    LLShaderUniforms mSkyUniforms[LLGLSLShader::SG_COUNT]; +    // ======================================================================================= +      class DayInstance: public std::enable_shared_from_this<DayInstance>      {      public: @@ -288,6 +299,7 @@ public:          LLSettingsDay::ptr_t        mDayCycle;          LLSettingsSky::ptr_t        mSky;          LLSettingsWater::ptr_t      mWater; +          S32                         mSkyTrack;          bool                        mInitialized; diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp index ee5d561927..c441fbc09f 100644 --- a/indra/newview/llexperiencelog.cpp +++ b/indra/newview/llexperiencelog.cpp @@ -149,10 +149,6 @@ std::string LLExperienceLog::getPermissionString( const LLSD& message, const std  		{  			buf.str(entry);  		} -		else -		{ -			buf.str(); -		}  	}  	if(buf.str().empty()) diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 4a802ad9aa..34448a780d 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -241,6 +241,8 @@ void LLFace::setPool(LLFacePool* pool)  void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep)  { +	LL_PROFILE_ZONE_SCOPED +  	if (!new_pool)  	{  		LL_ERRS() << "Setting pool to null!" << LL_ENDL; @@ -320,6 +322,8 @@ void LLFace::setSpecularMap(LLViewerTexture* tex)  void LLFace::dirtyTexture()  { +	LL_PROFILE_ZONE_SCOPED +  	LLDrawable* drawablep = getDrawable();  	if (mVObjp.notNull() && mVObjp->getVolume()) @@ -535,6 +539,8 @@ void LLFace::updateCenterAgent()  void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)  { +	LL_PROFILE_ZONE_SCOPED +  	if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)  	{  		return; @@ -585,6 +591,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)  						glTexCoordPointer(2, GL_FLOAT, 8, vol_face.mTexCoords);  					}  					gGL.syncMatrices(); +					LL_PROFILER_GPU_ZONEC( "gl.DrawElements", 0x00FF00 );  					glDrawElements(GL_TRIANGLES, vol_face.mNumIndices, GL_UNSIGNED_SHORT, vol_face.mIndices);  					glDisableClientState(GL_TEXTURE_COORD_ARRAY);  				} @@ -605,6 +612,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)  void renderFace(LLDrawable* drawable, LLFace *face)  { +	LL_PROFILE_ZONE_SCOPED +      LLVOVolume* vobj = drawable->getVOVolume();      if (vobj)      { @@ -891,6 +900,8 @@ bool less_than_max_mag(const LLVector4a& vec)  BOOL LLFace::genVolumeBBoxes(const LLVolume &volume, S32 f,                               const LLMatrix4& mat_vert_in, BOOL global_volume)  { +	LL_PROFILE_ZONE_SCOPED +  	//get bounding box  	if (mDrawablep->isState(LLDrawable::REBUILD_VOLUME | LLDrawable::REBUILD_POSITION | LLDrawable::REBUILD_RIGGED))  	{ @@ -2375,6 +2386,8 @@ F32 LLFace::getTextureVirtualSize()  BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)  { +	LL_PROFILE_ZONE_SCOPED +  	//VECTORIZE THIS  	//get area of circle around face  	LLVector4a center; @@ -2654,6 +2667,8 @@ const LLMatrix4& LLFace::getRenderMatrix() const  S32 LLFace::renderElements(const U16 *index_array) const  { +	LL_PROFILE_ZONE_SCOPED +  	S32 ret = 0;  	if (isState(GLOBAL)) @@ -2673,6 +2688,8 @@ S32 LLFace::renderElements(const U16 *index_array) const  S32 LLFace::renderIndexed()  { +	LL_PROFILE_ZONE_SCOPED +  	if(mDrawablep == NULL || mDrawPoolp == NULL)  	{  		return 0; @@ -2683,6 +2700,8 @@ S32 LLFace::renderIndexed()  S32 LLFace::renderIndexed(U32 mask)  { +	LL_PROFILE_ZONE_SCOPED +  	if (mVertexBuffer.isNull())  	{  		return 0; diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index e6bbe234b3..98c8531cd6 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -670,11 +670,7 @@ void LLFeatureManager::applyBaseMasks()  	}  	// now all those wacky ones -	if (!gGLManager.mHasFragmentShader) -	{ -		maskFeatures("NoPixelShaders"); -	} -	if (!gGLManager.mHasVertexShader || !mGPUSupported) +	if (!mGPUSupported)  	{  		maskFeatures("NoVertexShaders");  	} diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index d9edd4dc30..0e54b66ea9 100644 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -1357,31 +1357,31 @@ void LLFloaterModelPreview::clearAvatarTab()  			}  void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides) -			{ +{      S32 display_lod = mModelPreview->mPreviewLOD;      if (mModelPreview->mModel[display_lod].empty()) -				{ +    {          mSelectedJointName.clear();          return; -					} +    }      // Joints will be listed as long as they are listed in mAlternateBindMatrix      // even if they are for some reason identical to defaults.      // Todo: Are overrides always identical for all lods? They normally are, but there might be situations where they aren't.      if (mJointOverrides[display_lod].empty()) -					{ +    {          // populate map          for (LLModelLoader::scene::iterator iter = mModelPreview->mScene[display_lod].begin(); iter != mModelPreview->mScene[display_lod].end(); ++iter) -					{ +        {              for (LLModelLoader::model_instance_list::iterator model_iter = iter->second.begin(); model_iter != iter->second.end(); ++model_iter) -					{ +            {                  LLModelInstance& instance = *model_iter;                  LLModel* model = instance.mModel;                  const LLMeshSkinInfo *skin = &model->mSkinInfo;                  U32 joint_count = LLSkinningUtil::getMeshJointCount(skin);                  U32 bind_count = highlight_overrides ? skin->mAlternateBindMatrix.size() : 0; // simply do not include overrides if data is not needed                  if (bind_count > 0 && bind_count != joint_count) -						{ +                {                      std::ostringstream out;                      out << "Invalid joint overrides for model " << model->getName();                      out << ". Amount of joints " << joint_count; @@ -1390,68 +1390,68 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides)                      addStringToLog(out.str(), true);                      // Disable overrides for this model                      bind_count = 0; -						} +                }                  if (bind_count > 0) -						{ +                {                      for (U32 j = 0; j < joint_count; ++j) -							{ -                        const LLVector3& joint_pos = skin->mAlternateBindMatrix[j].getTranslation(); +                    { +                        const LLVector3& joint_pos = LLVector3(skin->mAlternateBindMatrix[j].getTranslation());                          LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];                          LLJoint* pJoint = LLModelPreview::lookupJointByName(skin->mJointNames[j], mModelPreview);                          if (pJoint) -							{ +                        {                              // see how voavatar uses aboveJointPosThreshold                              if (pJoint->aboveJointPosThreshold(joint_pos)) -				{ +                            {                                  // valid override                                  if (data.mPosOverrides.size() > 0                                      && (data.mPosOverrides.begin()->second - joint_pos).lengthSquared() > (LL_JOINT_TRESHOLD_POS_OFFSET * LL_JOINT_TRESHOLD_POS_OFFSET)) -					{ +                                {                                      // File contains multiple meshes with conflicting joint offsets                                      // preview may be incorrect, upload result might wary (depends onto                                      // mesh_id that hasn't been generated yet).                                      data.mHasConflicts = true; -							} +                                }                                  data.mPosOverrides[model->getName()] = joint_pos; -						} -						else -						{ +                            } +                            else +                            {                                  // default value, it won't be accounted for by avatar                                  data.mModelsNoOverrides.insert(model->getName()); -					} -					} -				} -			} -			else -			{ +                            } +                        } +                    } +                } +                else +                {                      for (U32 j = 0; j < joint_count; ++j) -				{				 +                    {                          LLJointOverrideData &data = mJointOverrides[display_lod][skin->mJointNames[j]];                          data.mModelsNoOverrides.insert(model->getName());                      }                  } -			} -		} -	} +            } +        } +    }      LLPanel *panel = mTabContainer->getPanelByName("rigging_panel");      LLScrollListCtrl *joints_list = panel->getChild<LLScrollListCtrl>("joints_list");      if (joints_list->isEmpty()) -	{ +    {          // Populate table -    std::map<std::string, std::string> joint_alias_map; +        std::map<std::string, std::string> joint_alias_map;          mModelPreview->getJointAliases(joint_alias_map); -     +          S32 conflicts = 0;          joint_override_data_map_t::iterator joint_iter = mJointOverrides[display_lod].begin();          joint_override_data_map_t::iterator joint_end = mJointOverrides[display_lod].end();          while (joint_iter != joint_end) -	{ +        {              const std::string& listName = joint_iter->first; -         +              LLScrollListItem::Params item_params;              item_params.value(listName); @@ -1459,38 +1459,38 @@ void LLFloaterModelPreview::updateAvatarTab(bool highlight_overrides)              cell_params.font = LLFontGL::getFontSansSerif();              cell_params.value = listName;              if (joint_alias_map.find(listName) == joint_alias_map.end()) -	{ +            {                  // Missing names                  cell_params.color = LLColor4::red; -	} +            }              if (joint_iter->second.mHasConflicts) -	{ +            {                  // Conflicts                  cell_params.color = LLColor4::orange;                  conflicts++; -	} +            }              if (highlight_overrides && joint_iter->second.mPosOverrides.size() > 0) -	{ +            {                  cell_params.font.style = "BOLD"; -	} +            }              item_params.columns.add(cell_params);              joints_list->addRow(item_params, ADD_BOTTOM);              joint_iter++; -	} +        }          joints_list->selectFirstItem();          LLScrollListItem *selected = joints_list->getFirstSelected();          if (selected) -{ +        {              mSelectedJointName = selected->getValue().asString(); -	} +        }          LLTextBox *joint_conf_descr = panel->getChild<LLTextBox>("conflicts_description");          joint_conf_descr->setTextArg("[CONFLICTS]", llformat("%d", conflicts));          joint_conf_descr->setTextArg("[JOINTS_COUNT]", llformat("%d", mJointOverrides[display_lod].size())); -		} -	} +    } +}  //-----------------------------------------------------------------------------  // addStringToLogTab() diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 23fd6d9c8e..ceab472c55 100644 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -159,7 +159,7 @@ LLFloater* LLFloaterWebContent::create( Params p)  //static  void LLFloaterWebContent::closeRequest(const std::string &uuid)  { -	LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid); +	auto floaterp = instance_tracker_t::getInstance(uuid);  	if (floaterp)  	{  		floaterp->closeFloater(false); @@ -169,7 +169,7 @@ void LLFloaterWebContent::closeRequest(const std::string &uuid)  //static  void LLFloaterWebContent::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height)  { -	LLFloaterWebContent* floaterp = instance_tracker_t::getInstance(uuid); +	auto floaterp = instance_tracker_t::getInstance(uuid);  	if (floaterp)  	{  		floaterp->geometryChanged(x, y, width, height); diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 698c15bd2d..0f288e05ca 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -993,9 +993,8 @@ private:  //-----------------------------------------------------------------------------  F32 gpu_benchmark()  { -	if (!gGLManager.mHasShaderObjects || !gGLManager.mHasTimerQuery) -	{ // don't bother benchmarking the fixed function -      // or venerable drivers which don't support accurate timing anyway +	if (!gGLManager.mHasTimerQuery) +	{ // don't bother benchmarking venerable drivers which don't support accurate timing anyway        // and are likely to be correctly identified by the GPU table already.  		return -1.f;  	} diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp index 9d49c30a49..55a4b5a457 100644 --- a/indra/newview/llhudnametag.cpp +++ b/indra/newview/llhudnametag.cpp @@ -224,6 +224,7 @@ BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector4a& start, const LLVector4  void LLHUDNameTag::render()  { +    LL_PROFILE_ZONE_SCOPED;  	if (sDisplayText)  	{  		LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); @@ -731,6 +732,7 @@ void LLHUDNameTag::updateSize()  void LLHUDNameTag::updateAll()  { +    LL_PROFILE_ZONE_SCOPED;  	// iterate over all text objects, calculate their restoration forces,  	// and add them to the visible set if they are on screen and close enough  	sVisibleTextObjects.clear(); diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 2c1c1191da..a19d6d0b19 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -4045,29 +4045,28 @@ S32 LLMeshRepository::getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lo  const LLMeshSkinInfo* LLMeshRepository::getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj)  { -	LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH); - -	if (mesh_id.notNull()) -	{ -		skin_map::iterator iter = mSkinMap.find(mesh_id); -		if (iter != mSkinMap.end()) -		{ -			return &(iter->second); -		} -		 -		//no skin info known about given mesh, try to fetch it -		{ -			LLMutexLock lock(mMeshMutex); -			//add volume to list of loading meshes -			skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); -			if (iter == mLoadingSkins.end()) -			{ //no request pending for this skin info -				mPendingSkinRequests.push(mesh_id); -			} -			mLoadingSkins[mesh_id].insert(requesting_obj->getID()); -		} -	} +    LL_PROFILE_ZONE_SCOPED; +    if (mesh_id.notNull()) +    { +        skin_map::iterator iter = mSkinMap.find(mesh_id); +        if (iter != mSkinMap.end()) +        { +            return &(iter->second); +        } +        //no skin info known about given mesh, try to fetch it +        if (requesting_obj != nullptr) +        { +            LLMutexLock lock(mMeshMutex); +            //add volume to list of loading meshes +            skin_load_map::iterator iter = mLoadingSkins.find(mesh_id); +            if (iter == mLoadingSkins.end()) +            { //no request pending for this skin info +                mPendingSkinRequests.push(mesh_id); +            } +            mLoadingSkins[mesh_id].insert(requesting_obj->getID()); +        } +    }  	return NULL;  } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index 81e49cb1d8..c0e894fda4 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -27,6 +27,7 @@  #ifndef LL_MESH_REPOSITORY_H  #define LL_MESH_REPOSITORY_H +#include <unordered_map>  #include "llassettype.h"  #include "llmodel.h"  #include "lluuid.h" @@ -585,7 +586,7 @@ public:  	S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);  	static S32 getActualMeshLOD(LLSD& header, S32 lod); -	const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj); +	const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id, const LLVOVolume* requesting_obj = nullptr);  	LLModel::Decomposition* getDecomposition(const LLUUID& mesh_id);  	void fetchPhysicsShape(const LLUUID& mesh_id);  	bool hasPhysicsShape(const LLUUID& mesh_id); @@ -613,7 +614,7 @@ public:  	typedef std::map<LLVolumeParams, std::set<LLUUID> > mesh_load_map;  	mesh_load_map mLoadingMeshes[4]; -	typedef std::map<LLUUID, LLMeshSkinInfo> skin_map; +	typedef std::unordered_map<LLUUID, LLMeshSkinInfo> skin_map;  	skin_map mSkinMap;  	typedef std::map<LLUUID, LLModel::Decomposition*> decomposition_map; diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index a9e80ab5da..01bddd781d 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -591,7 +591,7 @@ void LLModelPreview::rebuildUploadData()                  bool upload_skinweights = fmp && fmp->childGetValue("upload_skin").asBoolean();                  if (upload_skinweights && high_lod_model->mSkinInfo.mJointNames.size() > 0)                  { -                    LLQuaternion bind_rot = LLSkinningUtil::getUnscaledQuaternion(high_lod_model->mSkinInfo.mBindShapeMatrix); +                    LLQuaternion bind_rot = LLSkinningUtil::getUnscaledQuaternion(LLMatrix4(high_lod_model->mSkinInfo.mBindShapeMatrix));                      LLQuaternion identity;                      if (!bind_rot.isEqualEps(identity, 0.01))                      { @@ -3298,7 +3298,7 @@ BOOL LLModelPreview::render()                                  LLJoint *joint = getPreviewAvatar()->getJoint(skin->mJointNums[j]);                                  if (joint)                                  { -                                    const LLVector3& jointPos = skin->mAlternateBindMatrix[j].getTranslation(); +                                    const LLVector3& jointPos = LLVector3(skin->mAlternateBindMatrix[j].getTranslation());                                      if (joint->aboveJointPosThreshold(jointPos))                                      {                                          bool override_changed; @@ -3340,11 +3340,10 @@ BOOL LLModelPreview::render()                              //build matrix palette                              LLMatrix4a mat[LL_MAX_JOINTS_PER_MESH_OBJECT]; -                            LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, joint_count, +                            LLSkinningUtil::initSkinningMatrixPalette(mat, joint_count,                                  skin, getPreviewAvatar()); -                            LLMatrix4a bind_shape_matrix; -                            bind_shape_matrix.loadu(skin->mBindShapeMatrix); +                            const LLMatrix4a& bind_shape_matrix = skin->mBindShapeMatrix;                              U32 max_joints = LLSkinningUtil::getMaxJointCount();                              for (U32 j = 0; j < buffer->getNumVerts(); ++j)                              { diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 112da55682..111b45612e 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -147,6 +147,7 @@ void LLNetMap::setScale( F32 scale )  void LLNetMap::draw()  { +    LL_PROFILE_ZONE_SCOPED;   	static LLFrameTimer map_timer;  	static LLUIColor map_avatar_color = LLUIColorTable::instance().getColor("MapAvatarColor", LLColor4::white);  	static LLUIColor map_avatar_friend_color = LLUIColorTable::instance().getColor("MapAvatarFriendColor", LLColor4::white); diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index a9678b1e93..d9359d20cf 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -166,14 +166,14 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)  /*virtual*/ void LLOfferHandler::onChange(LLNotificationPtr p)  { -	LLToastNotifyPanel* panelp = LLToastNotifyPanel::getInstance(p->getID()); +	auto panelp = LLToastNotifyPanel::getInstance(p->getID());  	if (panelp)  	{  		//  		// HACK: if we're dealing with a notification embedded in IM, update it  		// otherwise remove its toast  		// -		if (dynamic_cast<LLIMToastNotifyPanel*>(panelp)) +		if (dynamic_cast<LLIMToastNotifyPanel*>(panelp.get()))  		{  			panelp->updateNotification();  		} diff --git a/indra/newview/llsecapi.cpp b/indra/newview/llsecapi.cpp index b9259cb18d..aba8ca5a4a 100644 --- a/indra/newview/llsecapi.cpp +++ b/indra/newview/llsecapi.cpp @@ -75,6 +75,12 @@ void initializeSecHandler()  	}  } + +void clearSecHandler() +{ +    gSecAPIHandler = NULL; +    gHandlerMap.clear(); +}  // start using a given security api handler.  If the string is empty  // the default is used  LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type) diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h index 14059f828a..410737b27f 100644 --- a/indra/newview/llsecapi.h +++ b/indra/newview/llsecapi.h @@ -452,7 +452,7 @@ public:  	virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert)=0;  	// instantiate a chain from an X509_STORE_CTX -	virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain)=0; +	virtual LLPointer<LLCertificateChain> getCertificateChain(X509_STORE_CTX* chain)=0;  	// instantiate a cert store given it's id.  if a persisted version  	// exists, it'll be loaded.  If not, one will be created (but not @@ -533,6 +533,8 @@ public:  };  void initializeSecHandler(); + +void clearSecHandler();  // retrieve a security api depending on the api type  LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type); diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp index 19db020a31..b4853d270a 100644 --- a/indra/newview/llsechandler_basic.cpp +++ b/indra/newview/llsechandler_basic.cpp @@ -95,7 +95,7 @@ LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert,  LLBasicCertificate::LLBasicCertificate(X509* pCert,                                         const LLSD* validation_params)   { -	if (!pCert || !pCert->cert_info) +	if (!pCert)  	{  		LLTHROW(LLInvalidCertificate(LLSD::emptyMap()));  	}	 @@ -355,8 +355,8 @@ LLSD cert_name_from_X509_NAME(X509_NAME* name)  		char buffer[32];  		X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index); -		std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)),  -											 M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry))); +		std::string name_value = std::string((const char*)ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)),  +											 ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry)));  		ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry);		  		OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0); @@ -683,29 +683,29 @@ std::string LLBasicCertificateStore::storeId() const  // LLBasicCertificateChain  // This class represents a chain of certs, each cert being signed by the next cert  // in the chain.  Certs must be properly signed by the parent -LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store) +LLBasicCertificateChain::LLBasicCertificateChain(X509_STORE_CTX* store)  {  	// we're passed in a context, which contains a cert, and a blob of untrusted  	// certificates which compose the chain. -	if((store == NULL) || (store->cert == NULL)) +	if((store == NULL) || X509_STORE_CTX_get0_cert(store) == NULL)  	{  		LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL;  		return;  	}  	// grab the child cert -	LLPointer<LLCertificate> current = new LLBasicCertificate(store->cert); +	LLPointer<LLCertificate> current = new LLBasicCertificate(X509_STORE_CTX_get0_cert(store));  	add(current); -	if(store->untrusted != NULL) +	if(X509_STORE_CTX_get0_untrusted(store) != NULL)  	{  		// if there are other certs in the chain, we build up a vector  		// of untrusted certs so we can search for the parents of each  		// consecutive cert.  		LLBasicCertificateVector untrusted_certs; -		for(int i = 0; i < sk_X509_num(store->untrusted); i++) +		for(int i = 0; i < sk_X509_num(X509_STORE_CTX_get0_untrusted(store)); i++)  		{ -			LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i)); +			LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(X509_STORE_CTX_get0_untrusted(store), i));  			untrusted_certs.add(cert);  		}		 @@ -1348,9 +1348,10 @@ void LLSecAPIBasicHandler::_readProtectedData()  		// read in the rest of the file. -		EVP_CIPHER_CTX ctx; -		EVP_CIPHER_CTX_init(&ctx); -		EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL); +		EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new(); +        // todo: ctx error handling + +		EVP_DecryptInit(ctx, EVP_rc4(), salt, NULL);  		// allocate memory:  		std::string decrypted_data;	 @@ -1358,14 +1359,14 @@ void LLSecAPIBasicHandler::_readProtectedData()  			// read data as a block:  			protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE); -			EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length,  +			EVP_DecryptUpdate(ctx, decrypted_buffer, &decrypted_length,   							  buffer, protected_data_stream.gcount());  			decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount());  		}  		// RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is  		// no block padding. -		EVP_CIPHER_CTX_cleanup(&ctx); +        EVP_CIPHER_CTX_free(ctx);  		std::istringstream parse_stream(decrypted_data);  		if (parser->parse(parse_stream, mProtectedDataMap,   						  LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE) @@ -1401,12 +1402,14 @@ void LLSecAPIBasicHandler::_writeProtectedData()  	llofstream protected_data_stream(tmp_filename.c_str(),                                        std::ios_base::binary); +    EVP_CIPHER_CTX *ctx = NULL;  	try  	{ -		EVP_CIPHER_CTX ctx; -		EVP_CIPHER_CTX_init(&ctx); -		EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL); +		ctx = EVP_CIPHER_CTX_new(); +        // todo: ctx error handling + +		EVP_EncryptInit(ctx, EVP_rc4(), salt, NULL);  		unsigned char unique_id[MAC_ADDRESS_BYTES];          LLMachineID::getUniqueID(unique_id, sizeof(unique_id));  		LLXORCipher cipher(unique_id, sizeof(unique_id)); @@ -1421,13 +1424,13 @@ void LLSecAPIBasicHandler::_writeProtectedData()  				break;  			}  			int encrypted_length; -			EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length,  +			EVP_EncryptUpdate(ctx, encrypted_buffer, &encrypted_length,   						  buffer, formatted_data_istream.gcount());  			protected_data_stream.write((const char *)encrypted_buffer, encrypted_length);  		}  		// no EVP_EncrypteFinal, as this is a stream cipher -		EVP_CIPHER_CTX_cleanup(&ctx); +        EVP_CIPHER_CTX_free(ctx);  		protected_data_stream.close();  	} @@ -1439,6 +1442,11 @@ void LLSecAPIBasicHandler::_writeProtectedData()  		// it may be, however.  		LLFile::remove(tmp_filename); +        if (ctx) +        { +            EVP_CIPHER_CTX_free(ctx); +        } +  		// EXP-1825 crash in LLSecAPIBasicHandler::_writeProtectedData()  		// Decided throwing an exception here was overkill until we figure out why this happens  		//LLTHROW(LLProtectedDataException("Error writing Protected Data Store")); @@ -1491,7 +1499,7 @@ LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert  }  // instantiate a chain from an X509_STORE_CTX -LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) +LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain)  {  	LLPointer<LLCertificateChain> result = new LLBasicCertificateChain(chain);  	return result; diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h index 0bc7f5230f..82670f9083 100644 --- a/indra/newview/llsechandler_basic.h +++ b/indra/newview/llsechandler_basic.h @@ -197,7 +197,7 @@ class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public  {  public: -	LLBasicCertificateChain(const X509_STORE_CTX * store); +	LLBasicCertificateChain(X509_STORE_CTX * store);  	virtual ~LLBasicCertificateChain() {} @@ -241,7 +241,7 @@ public:  	virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert);  	// instantiate a chain from an X509_STORE_CTX -	virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain); +	virtual LLPointer<LLCertificateChain> getCertificateChain(X509_STORE_CTX* chain);  	// instantiate a cert store given it's id.  if a persisted version  	// exists, it'll be loaded.  If not, one will be created (but not diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 1e5b893cbc..6a88a8ef2c 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -637,6 +637,7 @@ LLSD LLSettingsVOSky::convertToLegacy(const LLSettingsSky::ptr_t &psky, bool isA  //-------------------------------------------------------------------------  void LLSettingsVOSky::updateSettings()  { +    LL_PROFILE_ZONE_SCOPED;      LLSettingsSky::updateSettings();      LLVector3 sun_direction  = getSunDirection();      LLVector3 moon_direction = getMoonDirection(); @@ -665,55 +666,55 @@ void LLSettingsVOSky::updateSettings()  void LLSettingsVOSky::applySpecial(void *ptarget, bool force)  { -    LLGLSLShader *shader = (LLGLSLShader *)ptarget; -      LLVector4 light_direction = LLEnvironment::instance().getClampedLightNorm(); -    if (shader->mShaderGroup == LLGLSLShader::SG_DEFAULT) +    LLShaderUniforms* shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_DEFAULT];  	{         -    shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV); -	shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, 1, LLViewerCamera::getInstance()->getOrigin().mV); +        shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, light_direction); +        shader->uniform3fv(LLShaderMgr::WL_CAMPOSLOCAL, LLViewerCamera::getInstance()->getOrigin());  	}  -	else if (shader->mShaderGroup == LLGLSLShader::SG_SKY) +     +    shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_SKY];  	{ -    shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV);         +        shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, light_direction); -    // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate") -    LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]); -    LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() ); +        // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate") +        LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]); +        LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() ); -    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll -    // Keep in Sync! -    // * indra\newview\llsettingsvo.cpp -    // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl -    // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl -    cloud_scroll[0] = -cloud_scroll[0]; -    vect_c_p_d1 += cloud_scroll; -    shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, 1, vect_c_p_d1.mV); +        // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll +        // Keep in Sync! +        // * indra\newview\llsettingsvo.cpp +        // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl +        // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl +        cloud_scroll[0] = -cloud_scroll[0]; +        vect_c_p_d1 += cloud_scroll; +        shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, vect_c_p_d1); -    LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); +        LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -    LLColor4 sunDiffuse = psky->getSunlightColor(); -    LLColor4 moonDiffuse = psky->getMoonlightColor(); +        LLVector4 sunDiffuse = LLVector4(psky->getSunlightColor().mV); +        LLVector4 moonDiffuse = LLVector4(psky->getMoonlightColor().mV); -    shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, sunDiffuse.mV); -    shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, moonDiffuse.mV); +        shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, sunDiffuse); +        shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, moonDiffuse); -    LLColor4 cloud_color(psky->getCloudColor(), 1.0); -    shader->uniform4fv(LLShaderMgr::CLOUD_COLOR, 1, cloud_color.mV); +        LLVector4 cloud_color(LLVector3(psky->getCloudColor().mV), 1.0); +        shader->uniform4fv(LLShaderMgr::CLOUD_COLOR, cloud_color);  	} +    shader = &((LLShaderUniforms*)ptarget)[LLGLSLShader::SG_ANY];      shader->uniform1f(LLShaderMgr::SCENE_LIGHT_STRENGTH, mSceneLightStrength);      LLColor4 ambient(getTotalAmbient()); -    shader->uniform4fv(LLShaderMgr::AMBIENT, 1, ambient.mV); +    shader->uniform4fv(LLShaderMgr::AMBIENT, LLVector4(ambient.mV));      shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, getIsSunUp() ? 1 : 0);      shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());      shader->uniform1f(LLShaderMgr::DENSITY_MULTIPLIER, getDensityMultiplier());      shader->uniform1f(LLShaderMgr::DISTANCE_MULTIPLIER, getDistanceMultiplier()); -    F32 g             = getGamma();     +    F32 g             = getGamma();      F32 display_gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");      shader->uniform1f(LLShaderMgr::GAMMA, g); @@ -907,11 +908,11 @@ LLSD LLSettingsVOWater::convertToLegacy(const LLSettingsWater::ptr_t &pwater)  //-------------------------------------------------------------------------  void LLSettingsVOWater::applySpecial(void *ptarget, bool force)  { -    LLGLSLShader *shader = (LLGLSLShader *)ptarget; -      LLEnvironment& env = LLEnvironment::instance(); -    if (force || (shader->mShaderGroup == LLGLSLShader::SG_WATER)) +    auto group = LLGLSLShader::SG_WATER; +    LLShaderUniforms* shader = &((LLShaderUniforms*)ptarget)[group]; +      	{          F32 water_height = env.getWaterHeight(); @@ -935,7 +936,7 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)          LLVector4 waterPlane(enorm.v[0], enorm.v[1], enorm.v[2], -ep.dot(enorm)); -        shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, waterPlane.mV); +        shader->uniform4fv(LLShaderMgr::WATER_WATERPLANE, waterPlane.mV);          LLVector4 light_direction = env.getClampedLightNorm(); @@ -950,18 +951,19 @@ void LLSettingsVOWater::applySpecial(void *ptarget, bool force)          shader->uniform1f(LLShaderMgr::WATER_FOGDENSITY, waterFogDensity);          LLColor4 fog_color(env.getCurrentWater()->getWaterFogColor(), 0.0f); -        shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, 1, fog_color.mV); +        shader->uniform4fv(LLShaderMgr::WATER_FOGCOLOR, fog_color.mV);          F32 blend_factor = env.getCurrentWater()->getBlendFactor();          shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);          // update to normal lightnorm, water shader itself will use rotated lightnorm as necessary -        shader->uniform4fv(LLShaderMgr::LIGHTNORM, 1, light_direction.mV); +        shader->uniform4fv(LLShaderMgr::LIGHTNORM, light_direction.mV);      }  }  void LLSettingsVOWater::updateSettings()  { +    LL_PROFILE_ZONE_SCOPED;      // base class clears dirty flag so as to not trigger recursive update      LLSettingsBase::updateSettings(); diff --git a/indra/newview/llsettingsvo.h b/indra/newview/llsettingsvo.h index 65136ad2f5..caa3ac18d3 100644 --- a/indra/newview/llsettingsvo.h +++ b/indra/newview/llsettingsvo.h @@ -102,8 +102,6 @@ public:      bool isAdvanced() const { return  m_isAdvanced; } -    virtual void updateShader(LLGLSLShader* shader) { applySpecial(shader, true); } -  protected:      LLSettingsVOSky(); @@ -136,8 +134,6 @@ public:      static LLSD     convertToLegacy(const ptr_t &); -    virtual void    updateShader(LLGLSLShader* shader) { applySpecial(shader, true); } -  protected:      LLSettingsVOWater(); diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp index e02b21f036..dc12de29fb 100644 --- a/indra/newview/llskinningutil.cpp +++ b/indra/newview/llskinningutil.cpp @@ -35,7 +35,6 @@  #include "llrigginginfo.h"  #define DEBUG_SKINNING  LL_DEBUG -#define MAT_USE_SSE     1  void dump_avatar_and_skin_state(const std::string& reason, LLVOAvatar *avatar, const LLMeshSkinInfo *skin)  { @@ -120,36 +119,26 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin      skin->mInvalidJointsScrubbed = true;  } -#define MAT_USE_SSE 1 -  void LLSkinningUtil::initSkinningMatrixPalette( -    LLMatrix4* mat, +    LLMatrix4a* mat,      S32 count,       const LLMeshSkinInfo* skin,      LLVOAvatar *avatar)  { +    LL_PROFILE_ZONE_SCOPED; +      initJointNums(const_cast<LLMeshSkinInfo*>(skin), avatar); + +    LLMatrix4a world[LL_CHARACTER_MAX_ANIMATED_JOINTS]; +      for (U32 j = 0; j < count; ++j)      {          S32 joint_num = skin->mJointNums[j]; -        LLJoint *joint = NULL; -        if (joint_num >= 0 && joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS) -        { -            joint = avatar->getJoint(joint_num); -        } -        llassert(joint); +        LLJoint *joint = avatar->getJoint(joint_num); +          if (joint)          { -#ifdef MAT_USE_SSE -            LLMatrix4a bind, world, res; -            bind.loadu(skin->mInvBindMatrix[j]); -            world.loadu(joint->getWorldMatrix()); -            matMul(bind,world,res); -            memcpy(mat[j].mMatrix,res.mMatrix,16*sizeof(float)); -#else -            mat[j] = skin->mInvBindMatrix[j]; -            mat[j] *= joint->getWorldMatrix(); -#endif +            world[j] = joint->getWorldMatrix4a();          }          else          { @@ -159,16 +148,27 @@ void LLSkinningUtil::initSkinningMatrixPalette(              // rendering  should  be disabled  unless  all joints  are              // valid.  In other  cases of  skinned  rendering, invalid              // joints should already have  been removed during scrubInvalidJoints(). -            LL_WARNS_ONCE("Avatar") << avatar->getFullname()  -                                    << " rigged to invalid joint name " << skin->mJointNames[j]  -                                    << " num " << skin->mJointNums[j] << LL_ENDL; -            LL_WARNS_ONCE("Avatar") << avatar->getFullname()  -                                    << " avatar build state: isBuilt() " << avatar->isBuilt()  -                                    << " mInitFlags " << avatar->mInitFlags << LL_ENDL; +            LL_WARNS_ONCE("Avatar") << avatar->getFullname() +                << " rigged to invalid joint name " << skin->mJointNames[j] +                << " num " << skin->mJointNums[j] << LL_ENDL; +            LL_WARNS_ONCE("Avatar") << avatar->getFullname() +                << " avatar build state: isBuilt() " << avatar->isBuilt() +                << " mInitFlags " << avatar->mInitFlags << LL_ENDL;  #endif              dump_avatar_and_skin_state("initSkinningMatrixPalette joint not found", avatar, skin);          }      } + +    //NOTE: pointer striders used here as a micro-optimization over vector/array lookups +    const LLMatrix4a* invBind = &(skin->mInvBindMatrix[0]); +    const LLMatrix4a* w = world; +    LLMatrix4a* m = mat; +    LLMatrix4a* end = m + count; + +    while (m < end) +    { +        matMulUnsafe(*(invBind++), *(w++), *(m++)); +    }  }  void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin) @@ -212,7 +212,7 @@ void LLSkinningUtil::scrubSkinWeights(LLVector4a* weights, U32 num_vertices, con  void LLSkinningUtil::getPerVertexSkinMatrix(      F32* weights, -    LLMatrix4a* mat, +    const LLMatrix4a* mat,      bool handle_bad_scale,      LLMatrix4a& final_mat,      U32 max_joints) @@ -270,6 +270,7 @@ void LLSkinningUtil::initJointNums(LLMeshSkinInfo* skin, LLVOAvatar *avatar)  {      if (!skin->mJointNumsInitialized)      { +        LL_PROFILE_ZONE_SCOPED;          for (U32 j = 0; j < skin->mJointNames.size(); ++j)          {      #if DEBUG_SKINNING      @@ -357,13 +358,11 @@ void LLSkinningUtil::updateRiggingInfo(const LLMeshSkinInfo* skin, LLVOAvatar *a                                  rig_info_tab[joint_num].setIsRiggedTo(true);                                  // FIXME could precompute these matMuls. -                                LLMatrix4a bind_shape; -                                LLMatrix4a inv_bind; +                                const LLMatrix4a& bind_shape = skin->mBindShapeMatrix; +                                const LLMatrix4a& inv_bind = skin->mInvBindMatrix[joint_index];                                  LLMatrix4a mat;                                  LLVector4a pos_joint_space; -                                bind_shape.loadu(skin->mBindShapeMatrix); -                                inv_bind.loadu(skin->mInvBindMatrix[joint_index]);                                  matMul(bind_shape, inv_bind, mat);                                  mat.affineTransform(pos, pos_joint_space); @@ -426,3 +425,4 @@ LLQuaternion LLSkinningUtil::getUnscaledQuaternion(const LLMatrix4& mat4)      bind_rot.normalize();      return bind_rot;  } + diff --git a/indra/newview/llskinningutil.h b/indra/newview/llskinningutil.h index efe7c85997..807418f983 100644 --- a/indra/newview/llskinningutil.h +++ b/indra/newview/llskinningutil.h @@ -42,10 +42,10 @@ namespace LLSkinningUtil      S32 getMaxJointCount();      U32 getMeshJointCount(const LLMeshSkinInfo *skin);      void scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin); -    void initSkinningMatrixPalette(LLMatrix4* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar); +    void initSkinningMatrixPalette(LLMatrix4a* mat, S32 count, const LLMeshSkinInfo* skin, LLVOAvatar *avatar);      void checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin);      void scrubSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin); -    void getPerVertexSkinMatrix(F32* weights, LLMatrix4a* mat, bool handle_bad_scale, LLMatrix4a& final_mat, U32 max_joints); +    void getPerVertexSkinMatrix(F32* weights, const LLMatrix4a* mat, bool handle_bad_scale, LLMatrix4a& final_mat, U32 max_joints);      LL_FORCE_INLINE void getPerVertexSkinMatrixWithIndices(          F32*        weights, diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index efa4a7fd66..253b6b9953 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -503,7 +503,9 @@ LLSpatialGroup* LLSpatialGroup::getParent()  	}  BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree) -	{ +{ +	LL_PROFILE_ZONE_SCOPED +  	if(!drawablep)  	{  		return FALSE; @@ -591,6 +593,8 @@ public:  void LLSpatialGroup::setState(U32 state, S32 mode)   { +	LL_PROFILE_ZONE_SCOPED +  	llassert(state <= LLSpatialGroup::STATE_MASK);  	if (mode > STATE_MODE_SINGLE) @@ -638,6 +642,8 @@ public:  void LLSpatialGroup::clearState(U32 state, S32 mode)  { +	LL_PROFILE_ZONE_SCOPED +  	llassert(state <= LLSpatialGroup::STATE_MASK);  	if (mode > STATE_MODE_SINGLE) @@ -724,6 +730,8 @@ void LLSpatialGroup::updateDistance(LLCamera &camera)  F32 LLSpatialPartition::calcDistance(LLSpatialGroup* group, LLCamera& camera)  { +	LL_PROFILE_ZONE_SCOPED +  	LLVector4a eye;  	LLVector4a origin;  	origin.load3(camera.getOrigin().mV); @@ -815,6 +823,8 @@ F32 LLSpatialGroup::getUpdateUrgency() const  BOOL LLSpatialGroup::changeLOD()  { +	LL_PROFILE_ZONE_SCOPED +  	if (hasState(ALPHA_DIRTY | OBJECT_DIRTY))  	{  		//a rebuild is going to happen, update distance and LoD @@ -907,6 +917,8 @@ void LLSpatialGroup::handleDestruction(const TreeNode* node)  void LLSpatialGroup::handleChildAddition(const OctreeNode* parent, OctreeNode* child)   { +	LL_PROFILE_ZONE_SCOPED +  	if (child->getListenerCount() == 0)  	{  		new LLSpatialGroup(child, getSpatialPartition()); @@ -2700,11 +2712,17 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume)  			glVertexPointer(3, GL_FLOAT, 16, phys_volume->mHullPoints);  			gGL.diffuseColor4fv(line_color.mV);  			gGL.syncMatrices(); -			glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); +			{ +				LL_PROFILER_GPU_ZONEC( "gl.DrawElements", 0x20FF20 ) +				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); +			}  			gGL.diffuseColor4fv(color.mV);  			glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -			glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices);			 +			{ +				LL_PROFILER_GPU_ZONEC( "gl.DrawElements", 0x40FF40 ) +				glDrawElements(GL_TRIANGLES, phys_volume->mNumHullIndices, GL_UNSIGNED_SHORT, phys_volume->mHullIndices); +			}  		}  		else  		{ @@ -3222,6 +3240,7 @@ void renderRaycast(LLDrawable* drawablep)  						gGL.diffuseColor4f(0,1,1,0.5f);  						glVertexPointer(3, GL_FLOAT, sizeof(LLVector4a), face.mPositions);  						gGL.syncMatrices(); +						LL_PROFILER_GPU_ZONEC( "gl.DrawElements", 0x60FF60 );  						glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);  					} diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 919f386d29..6ef82fac9c 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -41,6 +41,7 @@  #include "llviewercamera.h"  #include "llvector4a.h"  #include <queue> +#include <unordered_map>  #define SG_STATE_INHERIT_MASK (OCCLUDED)  #define SG_INITIAL_STATE_MASK (DIRTY | GEOM_DIRTY) @@ -216,10 +217,10 @@ public:  	typedef std::vector<LLPointer<LLSpatialGroup> > sg_vector_t;  	typedef std::vector<LLPointer<LLSpatialBridge> > bridge_list_t;  	typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t;  -	typedef std::map<U32, drawmap_elem_t > draw_map_t;	 +	typedef std::unordered_map<U32, drawmap_elem_t > draw_map_t;	  	typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t; -	typedef std::map<LLFace*, buffer_list_t> buffer_texture_map_t; -	typedef std::map<U32, buffer_texture_map_t> buffer_map_t; +	typedef std::unordered_map<LLFace*, buffer_list_t> buffer_texture_map_t; +	typedef std::unordered_map<U32, buffer_texture_map_t> buffer_map_t;  	struct CompareDistanceGreater  	{ diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 1242131534..57c5074804 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -179,7 +179,6 @@  #include "pipeline.h"  #include "llappviewer.h"  #include "llfasttimerview.h" -#include "lltelemetry.h"  #include "llfloatermap.h"  #include "llweb.h"  #include "llvoiceclient.h" @@ -530,8 +529,6 @@ bool idle_startup()  			}  			#if LL_WINDOWS -                LLPROFILE_STARTUP(); -  				// On the windows dev builds, unpackaged, the message.xml file will   				// be located in indra/build-vc**/newview/<config>/app_settings.  				std::string message_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"message.xml"); diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index cb356726e6..ea36e1d7be 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -1214,6 +1214,7 @@ F32 LLSurface::getWaterHeight() const  BOOL LLSurface::generateWaterTexture(const F32 x, const F32 y,  									 const F32 width, const F32 height)  { +	LL_PROFILE_ZONE_SCOPED  	if (!getWaterTexture())  	{  		return FALSE; diff --git a/indra/newview/llsurfacepatch.cpp b/indra/newview/llsurfacepatch.cpp index 5e056944e9..aeefcd6fb8 100644 --- a/indra/newview/llsurfacepatch.cpp +++ b/indra/newview/llsurfacepatch.cpp @@ -728,6 +728,7 @@ BOOL LLSurfacePatch::updateTexture()  void LLSurfacePatch::updateGL()  { +	LL_PROFILE_ZONE_SCOPED  	F32 meters_per_grid = getSurface()->getMetersPerGrid();  	F32 grids_per_patch_edge = (F32)getSurface()->getGridsPerPatchEdge(); diff --git a/indra/newview/lltelemetry.cpp b/indra/newview/lltelemetry.cpp deleted file mode 100644 index 0c63e2fede..0000000000 --- a/indra/newview/lltelemetry.cpp +++ /dev/null @@ -1,145 +0,0 @@ - /** - * @file lltelemetry.cpp - * @brief Wrapper for Rad Game Tools Telemetry - * - * $LicenseInfo:firstyear=2020&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2020, 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 "lltelemetry.h" - -#if LLPROFILE_USE_RAD_TELEMETRY_PROFILER -    #if LL_WINDOWS -        #include "llwin32headers.h" - -        // build-vc120-64\packages\lib\release -        // build-vc150-64\packages\lib\release -        #ifdef _MSC_VER -            #pragma comment(lib,"rad_tm_win64.lib") -        #else -            #pragma message "NOTE: Rad GameTools Telemetry requested but non-MSVC compiler not yet supported on Windows" -        #endif -    #endif // LL_WINDOWS - -    #if LL_DARWIN -        #pragma message "NOTE: Rad Game Tools Telemetry requested but not yet supported on Darwin" -    #endif - -    #if LL_LINUX -        #pragma message "NOTE: Rad Game Tools Telemetry requested but not yet supported on Linux" -    #endif - -// -// local consts -// -static const tm_int32 TELEMETRY_BUFFER_SIZE  = 8 * 1024 * 1024; - -// -// local globals -// -static char *gTelemetryBufferPtr = NULL; // Telemetry - -static const char *tm_status[ TMERR_INIT_NETWORKING_FAILED + 1 ] = -{ -      "Telemetry pass: connected"                       // TM_OK -    , "Telemetry FAIL: disabled via #define NTELEMETRY" // TMERR_DISABLED -    , "Telemetry FAIL: invalid paramater"               // TMERR_INVALID_PARAM -    , "Telemetry FAIL: DLL not found"                   // TMERR_NULL_API -    , "Telemetry FAIL: out of resources"                // TMERR_OUT_OF_RESOURCES -    , "Telemetry FAIL: tmInitialize() not called"       // TMERR_UNINITIALIZED -    , "Telemetry FAIL: bad hostname"                    // TMERR_BAD_HOSTNAME -    , "Telemetry FAIL: couldn't connect to server"      // TMERR_COULD_NOT_CONNECT -    , "Telemetry FAIL: unknown network error"           // TMERR_UNKNOWN_NETWORK -    , "Telemetry FAIL: tmShutdown() already called"     // TMERR_ALREADY_SHUTDOWN -    , "Telemetry FAIL: memory buffer too small"         // TMERR_ARENA_TOO_SMALL -    , "Telemetry FAIL: server handshake error"          // TMERR_BAD_HANDSHAKE -    , "Telemetry FAIL: unaligned parameters"            // TMERR_UNALIGNED -    , "Telemetry FAIL: network not initialized"         // TMERR_NETWORK_NOT_INITIALIZED -- WSAStartup not called before tmOpen() -    , "Telemetry FAIL: bad version"                     // TMERR_BAD_VERSION -    , "Telemetry FAIL: timer too large"                 // TMERR_BAD_TIMER -    , "Telemetry FAIL: tmOpen() already called"         // TMERR_ALREADY_OPENED -    , "Telemetry FAIL: tmInitialize() already called"   // TMERR_ALREADY_INITIALIZED -    , "Telemetry FAIL: could't open file"               // TMERR_FILE_OPEN_FAILED -    , "Telemetry FAIL: tmOpen() failed networking"      // TMERR_INIT_NETWORKING_FAILED -}; - -// -// exported functionality -// - -void telemetry_shutdown() -{ -    #if LL_WINDOWS -        if (gTelemetryBufferPtr) -        { -            tmClose(0); -            tmShutdown(); - -            delete[] gTelemetryBufferPtr; -            gTelemetryBufferPtr = NULL; -        } -    #endif -} - -void telemetry_startup() -{ -    #if LL_WINDOWS -        tmLoadLibrary(TM_RELEASE); // Loads .dll - -        gTelemetryBufferPtr = new char[ TELEMETRY_BUFFER_SIZE ]; -        tmInitialize(TELEMETRY_BUFFER_SIZE, gTelemetryBufferPtr); - -        tm_error telemetry_status = tmOpen( -            0,                     // unused -            "SecondLife",          // app name -            __DATE__ " " __TIME__, // build identifier -            "localhost",           // server name (or filename) -            TMCT_TCP,              // connection type (or TMCT_FILE) -            4719,                  // port -            TMOF_INIT_NETWORKING,  // open flags -            250 );                 // timeout ms - -        if (telemetry_status == TMERR_UNKNOWN) -        { -            LL_ERRS() << "Telemetry FAIL: unknown error" << LL_ENDL; -        } -        else if (telemetry_status && (telemetry_status <= TMERR_INIT_NETWORKING_FAILED)) -        { -            LL_INFOS() << tm_status[ telemetry_status ] << LL_ENDL; -            free(gTelemetryBufferPtr); -            gTelemetryBufferPtr = NULL; -        } -    #endif // LL_WINDOWS -} - -// Called after we render a frame -void telemetry_update() -{ -    #if LL_WINDOWS -        if (gTelemetryBufferPtr) -        { -            tmTick(0); -        } -    #endif -} -#endif // LLPROFILE_USE_RAD_TELEMETRY_PROFILER diff --git a/indra/newview/lltelemetry.h b/indra/newview/lltelemetry.h deleted file mode 100644 index a73e5fcfa2..0000000000 --- a/indra/newview/lltelemetry.h +++ /dev/null @@ -1,81 +0,0 @@ -/** - * @file lltelemetry.h - * @brief Wrapper for Rad Game Tools Telemetry - * - * $LicenseInfo:firstyear=2020&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2020, 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$ - */ - -/* -To use: - -1. Uncomment #define LLPROFILE_USE_RAD_TELEMETRY_PROFILER below - -2. Include this header file -    #include "lltelemetry.h" - -3. Add zones to the functions you wish to profile -    void onFoo() -    { -        LLPROFILE_ZONE("Foo"); -    } -*/ -//#define LLPROFILE_USE_RAD_TELEMETRY_PROFILER 1 - -// Default NO local telemetry profiling -#ifndef LLPROFILE_USE_RAD_TELEMETRY_PROFILER -    #define LLPROFILE_USE_RAD_TELEMETRY_PROFILER 0 -    #define LLPROFILE_SHUTDOWN( ...) {} -    #define LLPROFILE_STARTUP(  ...) {} -    #define LLPROFILE_UPDATE(   ...) {} - -    #define LLPROFILE_AUTO_CPU_MARKER_COLOR(r, g, b) -    #define LLPROFILE_ENTER(name) -    #define LLPROFILE_ENTER_FORMAT(format, ...) -    #define LLPROFILE_FUNCTION -    #define LLPROFILE_LEAVE() -    #define LLPROFILE_THREAD_NAME(name) -    #define LLPROFILE_ZONE(name) -    #define LLPROFILE_ZONE_FORMAT(format, ...) -#else -    #include <rad_tm.h> - -    #define LLPROFILE_SHUTDOWN                       telemetry_shutdown -    #define LLPROFILE_STARTUP                        telemetry_startup -    #define LLPROFILE_UPDATE                         telemetry_update - -    #define LLPROFILE_AUTO_CPU_MARKER_COLOR(r, g, b) tmZoneColor(r, g, b) -    #define LLPROFILE_ENTER(name)                    tmEnter(0, 0, name) -    #define LLPROFILE_ENTER_FORMAT(format, ...)      tmEnter(0, 0, format, __VA_ARGS__) -    #define LLPROFILE_FUNCTION                       tmFunction(0, 0) -    #define LLPROFILE_LEAVE()                        tmLeave(0) -    #define LLPROFILE_THREAD_NAME(name)              tmThreadName(0, 0, name) -    #define LLPROFILE_ZONE(name)                     tmZone(0, 0, name) -    #define LLPROFILE_ZONE_FORMAT(format, ...)       tmZone(0, 0, format, __VA_ARGS__) -#endif // LLPROFILE_USE_RAD_TELEMETRY_PROFILER - -// -// exported functionality -// - -extern void telemetry_startup(); -extern void telemetry_shutdown(); -extern void telemetry_update(); // called after every frame update diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index 9126360eed..73a25397fd 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -314,6 +314,7 @@ private:  		// Threads:  Ttc  		virtual void completed(bool success)  		{ +            LL_PROFILE_ZONE_SCOPED;  			LLTextureFetchWorker* worker = mFetcher->getWorker(mID);  			if (worker)  			{ @@ -338,6 +339,7 @@ private:  		// Threads:  Ttc  		virtual void completed(bool success)  		{ +            LL_PROFILE_ZONE_SCOPED;  			LLTextureFetchWorker* worker = mFetcher->getWorker(mID);  			if (worker)  			{ @@ -362,6 +364,7 @@ private:  		// Threads:  Tid  		virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)  		{ +            LL_PROFILE_ZONE_SCOPED;  			LLTextureFetchWorker* worker = mFetcher->getWorker(mID);  			if (worker)  			{ @@ -1139,6 +1142,7 @@ void LLTextureFetchWorker::startWork(S32 param)  // Threads:  Ttf  bool LLTextureFetchWorker::doWork(S32 param)  { +    LL_PROFILE_ZONE_SCOPED;  	if (gNonInteractive)  	{  		return true; diff --git a/indra/newview/llviewercontrollistener.cpp b/indra/newview/llviewercontrollistener.cpp index 3443bb644a..8820f9ec56 100644 --- a/indra/newview/llviewercontrollistener.cpp +++ b/indra/newview/llviewercontrollistener.cpp @@ -127,7 +127,7 @@ struct Info  	LLEventAPI::Response response;  	std::string groupname; -	LLControlGroup* group; +	LLControlGroup::ptr_t group;  	std::string key;  	LLControlVariable* control;  }; @@ -187,7 +187,7 @@ void LLViewerControlListener::groups(LLSD const & request)  struct CollectVars: public LLControlGroup::ApplyFunctor  { -	CollectVars(LLControlGroup* g): +	CollectVars(LLControlGroup::ptr_t g):  		mGroup(g)  	{} @@ -200,7 +200,7 @@ struct CollectVars: public LLControlGroup::ApplyFunctor  					("comment", control->getComment()));  	} -	LLControlGroup* mGroup; +	LLControlGroup::ptr_t mGroup;  	LLSD vars;  }; @@ -210,7 +210,7 @@ void LLViewerControlListener::vars(LLSD const & request)  	// control name.  	Response response(LLSD(), request);  	std::string groupname(request["group"]); -	LLControlGroup* group(LLControlGroup::getInstance(groupname)); +	auto group(LLControlGroup::getInstance(groupname));  	if (! group)  	{  		return response.error(STRINGIZE("Unrecognized group '" << groupname << "'")); diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index a2f3554123..1236695e4f 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -209,9 +209,11 @@ void display_update_camera()  // Write some stats to LL_INFOS()  void display_stats()  { +	LL_PROFILE_ZONE_SCOPED  	F32 fps_log_freq = gSavedSettings.getF32("FPSLogFrequency");  	if (fps_log_freq > 0.f && gRecentFPSTime.getElapsedTimeF32() >= fps_log_freq)  	{ +		LL_PROFILE_ZONE_NAMED("DS - FPS");  		F32 fps = gRecentFrameCount / fps_log_freq;  		LL_INFOS() << llformat("FPS: %.02f", fps) << LL_ENDL;  		gRecentFrameCount = 0; @@ -220,6 +222,7 @@ void display_stats()  	F32 mem_log_freq = gSavedSettings.getF32("MemoryLogFrequency");  	if (mem_log_freq > 0.f && gRecentMemoryTime.getElapsedTimeF32() >= mem_log_freq)  	{ +		LL_PROFILE_ZONE_NAMED("DS - Memory");  		gMemoryAllocated = U64Bytes(LLMemory::getCurrentRSS());  		U32Megabytes memory = gMemoryAllocated;  		LL_INFOS() << "MEMORY: " << memory << LL_ENDL; @@ -229,6 +232,7 @@ void display_stats()      F32 asset_storage_log_freq = gSavedSettings.getF32("AssetStorageLogFrequency");      if (asset_storage_log_freq > 0.f && gAssetStorageLogTime.getElapsedTimeF32() >= asset_storage_log_freq)      { +		LL_PROFILE_ZONE_NAMED("DS - Asset Storage");          gAssetStorageLogTime.reset();          gAssetStorage->logAssetStorageInfo();      } @@ -632,6 +636,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  	if (!gDisconnected)  	{ +		LL_PROFILE_ZONE_NAMED("display - 1");  		LLAppViewer::instance()->pingMainloopTimeout("Display:Update");  		if (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_HUD))  		{ //don't draw hud objects in this frame @@ -724,6 +729,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		LLAppViewer::instance()->pingMainloopTimeout("Display:Swap");  		{  +			LL_PROFILE_ZONE_NAMED("display - 2")  			if (gResizeScreenTexture)  			{  				gResizeScreenTexture = FALSE; @@ -779,6 +785,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		//if (!for_snapshot)  		{ +			LL_PROFILE_ZONE_NAMED("display - 3")  			LLAppViewer::instance()->pingMainloopTimeout("Display:Imagery");  			gPipeline.generateWaterReflection(*LLViewerCamera::getInstance());  			gPipeline.generateHighlight(*LLViewerCamera::getInstance()); @@ -827,7 +834,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  				LLImageGL::deleteDeadTextures();  				stop_glerror();  			}*/ -			} +		}  		LLGLState::checkStates();  		LLGLState::checkClientArrays(); @@ -842,6 +849,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		//  		LLAppViewer::instance()->pingMainloopTimeout("Display:StateSort");  		{ +			LL_PROFILE_ZONE_NAMED("display - 3")  			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;  			gPipeline.stateSort(*LLViewerCamera::getInstance(), result);  			stop_glerror(); @@ -950,6 +958,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)  		if (!(LLAppViewer::instance()->logoutRequestSent() && LLAppViewer::instance()->hasSavedFinalSnapshot())  				&& !gRestoreGL)  		{ +			LL_PROFILE_ZONE_NAMED("display - 4")  			LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;  			if (gSavedSettings.getBOOL("RenderDepthPrePass") && LLGLSLShader::sNoFixedFunction) @@ -1261,7 +1270,7 @@ bool setup_hud_matrices(const LLRect& screen_region)  void render_ui(F32 zoom_factor, int subfield)  { -    LL_RECORD_BLOCK_TIME(FTM_RENDER_UI); +	LL_RECORD_BLOCK_TIME(FTM_RENDER_UI);  	LLGLState::checkStates(); @@ -1276,7 +1285,7 @@ void render_ui(F32 zoom_factor, int subfield)  	if(LLSceneMonitor::getInstance()->needsUpdate())  	{ -        LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_SCENE_MON); +		LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_SCENE_MON);  		gGL.pushMatrix();  		gViewerWindow->setup2DRender();  		LLSceneMonitor::getInstance()->compare(); @@ -1284,55 +1293,64 @@ void render_ui(F32 zoom_factor, int subfield)  		gGL.popMatrix();  	} -    // Finalize scene -    gPipeline.renderFinalize(); +	// Finalize scene +	gPipeline.renderFinalize(); -    LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); -    render_hud_elements(); -	render_hud_attachments(); - -	LLGLSDefault gls_default; -	LLGLSUIDefault gls_ui;  	{ -		gPipeline.disableLights(); -	} +		// SL-15709 +		// NOTE: Tracy only allows one ZoneScoped per function. +		// Solutions are: +		// 1. Use a new scope +		// 2. Use named zones +		// 3. Use transient zones +		LL_RECORD_BLOCK_TIME(FTM_RENDER_HUD); +		render_hud_elements(); +		render_hud_attachments(); -	{ -		gGL.color4f(1,1,1,1); -		if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI)) +		LLGLSDefault gls_default; +		LLGLSUIDefault gls_ui;  		{ -			if (!gDisconnected) +			gPipeline.disableLights(); +		} + +		{ +			gGL.color4f(1,1,1,1); +			if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))  			{ -                LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); -				render_ui_3d(); +				if (!gDisconnected) +				{ +					LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D); +					render_ui_3d(); +					LLGLState::checkStates(); +				} +				else +				{ +					render_disconnected_background(); +				} + +				LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); +				render_ui_2d();  				LLGLState::checkStates();  			} -			else +			gGL.flush(); +  			{ -				render_disconnected_background(); +				LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_DEBUG_TEXT); +				gViewerWindow->setup2DRender(); +				gViewerWindow->updateDebugText(); +				gViewerWindow->drawDebugText();  			} -            LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D); -			render_ui_2d(); -			LLGLState::checkStates(); +			LLVertexBuffer::unbind();  		} -		gGL.flush(); +		if (!gSnapshot)  		{ -            LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_DEBUG_TEXT); -			gViewerWindow->setup2DRender(); -			gViewerWindow->updateDebugText(); -			gViewerWindow->drawDebugText(); +			set_current_modelview(saved_view); +			gGL.popMatrix();  		} -		LLVertexBuffer::unbind(); -	} - -	if (!gSnapshot) -	{ -		set_current_modelview(saved_view); -		gGL.popMatrix(); -	} +	} // Tracy integration  }  static LLTrace::BlockTimerStatHandle FTM_SWAP("Swap"); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 517e35d482..5e99d13206 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3982,8 +3982,8 @@ void process_sim_stats(LLMessageSystem *msg, void **user_data)  		F32 stat_value;  		msg->getU32("Stat", "StatID", stat_id, i);  		msg->getF32("Stat", "StatValue", stat_value, i); -		LLStatViewer::SimMeasurementSampler* measurementp = LLStatViewer::SimMeasurementSampler::getInstance((ESimStatID)stat_id); -		 +		auto measurementp = LLStatViewer::SimMeasurementSampler::getInstance((ESimStatID)stat_id); +  		if (measurementp )  		{  			measurementp->sample(stat_value); @@ -4081,11 +4081,6 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)  				gAgent.setFlying(FALSE);  			} -			if (gNonInteractive && animation_id == ANIM_AGENT_RUN) -			{ -				LL_INFOS() << "Noninteractive, got run request for self" << LL_ENDL; -			} -  			if (i < num_source_blocks)  			{  				mesgsys->getUUIDFast(_PREHASH_AnimationSourceList, _PREHASH_ObjectID, object_id, i); diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index fbd44c198b..097b5e3645 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -169,6 +169,8 @@ U64 LLViewerObjectList::getIndex(const U32 local_id,  BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject* objectp)  { +	LL_PROFILE_ZONE_SCOPED +  	if(objectp && objectp->getRegion())  	{  		U32 local_id = objectp->mLocalID;		 @@ -304,6 +306,8 @@ static LLTrace::BlockTimerStatHandle FTM_PROCESS_OBJECTS("Process Objects");  LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry* entry, LLViewerRegion* regionp)  { +	LL_PROFILE_ZONE_SCOPED +  	LLDataPacker *cached_dpp = entry->getDP();  	if (!cached_dpp || gNonInteractive) @@ -849,6 +853,8 @@ static LLTrace::BlockTimerStatHandle FTM_IDLE_COPY("Idle Copy");  void LLViewerObjectList::update(LLAgent &agent)  { +	LL_PROFILE_ZONE_SCOPED +  	// Update globals  	LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") );  	LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") ); @@ -1294,6 +1300,8 @@ void LLViewerObjectList::clearDebugText()  void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)  { +	LL_PROFILE_ZONE_SCOPED +  	bool new_dead_object = true;  	if (mDeadObjects.find(objectp->mID) != mDeadObjects.end())  	{ @@ -1524,6 +1532,8 @@ void LLViewerObjectList::removeFromActiveList(LLViewerObject* objectp)  void LLViewerObjectList::updateActive(LLViewerObject *objectp)  { +	LL_PROFILE_ZONE_SCOPED +  	if (objectp->isDead())  	{  		return; // We don't update dead objects! @@ -1844,6 +1854,8 @@ void LLViewerObjectList::renderObjectBounds(const LLVector3 ¢er)  void LLViewerObjectList::generatePickList(LLCamera &camera)  { +	LL_PROFILE_ZONE_SCOPED +  		LLViewerObject *objectp;  		S32 i;  		// Reset all of the GL names to zero. @@ -2104,6 +2116,8 @@ LLViewerObject *LLViewerObjectList::replaceObject(const LLUUID &id, const LLPCod  S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const  { +	LL_PROFILE_ZONE_SCOPED +  	LLViewerObject *objectp;  	S32 num_refs = 0; @@ -2167,6 +2181,8 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip  void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)  { +	LL_PROFILE_ZONE_SCOPED +  	if (objectp->isDead())  	{  		LL_WARNS() << "Trying to find orphans for dead obj " << objectp->mID  diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp index 7c3dd00e1a..02f7bbeed8 100644 --- a/indra/newview/llviewerparceloverlay.cpp +++ b/indra/newview/llviewerparceloverlay.cpp @@ -847,6 +847,7 @@ void LLViewerParcelOverlay::setDirty()  void LLViewerParcelOverlay::updateGL()  { +	LL_PROFILE_ZONE_SCOPED  	updateOverlayTexture();  } diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index be5c22e7c3..7dcf29eb75 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -384,7 +384,7 @@ void LLViewerShaderMgr::initAttribsAndUniforms(void)  S32 LLViewerShaderMgr::getShaderLevel(S32 type)  { -	return LLPipeline::sDisableShaders ? 0 : mShaderLevel[type]; +	return mShaderLevel[type];  }  //============================================================================ @@ -400,15 +400,6 @@ void LLViewerShaderMgr::setShaders()          return;      } -    if (!gGLManager.mHasShaderObjects -        || !gGLManager.mHasVertexShader -        || !gGLManager.mHasFragmentShader) -    { -        // Viewer will show 'hardware requirements' warning later -        LL_INFOS("ShaderLoading") << "Shaders not supported" << LL_ENDL; -        return; -    } -      static LLCachedControl<U32> max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16);      LLGLSLShader::sIndexedTextureChannels = llmax(llmin(gGLManager.mNumTextureImageUnits, (S32) max_texture_index), 1); diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index ca01bb46aa..949e71a4c9 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -184,6 +184,7 @@ void LLViewerTextureManager::findFetchedTextures(const LLUUID& id, std::vector<L  void  LLViewerTextureManager::findTextures(const LLUUID& id, std::vector<LLViewerTexture*> &output)  { +    LL_PROFILE_ZONE_SCOPED;      std::vector<LLViewerFetchedTexture*> fetched_output;      gTextureList.findTexturesByID(id, fetched_output);      std::vector<LLViewerFetchedTexture*>::iterator iter = fetched_output.begin(); @@ -208,6 +209,7 @@ void  LLViewerTextureManager::findTextures(const LLUUID& id, std::vector<LLViewe  LLViewerFetchedTexture* LLViewerTextureManager::findFetchedTexture(const LLUUID& id, S32 tex_type)  { +    LL_PROFILE_ZONE_SCOPED;      return gTextureList.findImage(id, (ETexListType)tex_type);  } @@ -484,6 +486,7 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_MEMORY_CHECK("Memory Check");  //static   bool LLViewerTexture::isMemoryForTextureLow()  { +    LL_PROFILE_ZONE_SCOPED;      // Note: we need to figure out a better source for 'min' values,      // what is free for low end at minimal settings is 'nothing left'      // for higher end gpus at high settings. @@ -500,6 +503,7 @@ bool LLViewerTexture::isMemoryForTextureLow()  //static  bool LLViewerTexture::isMemoryForTextureSuficientlyFree()  { +    LL_PROFILE_ZONE_SCOPED;      const S32Megabytes DESIRED_FREE_TEXTURE_MEMORY(50);      const S32Megabytes DESIRED_FREE_MAIN_MEMORY(200); @@ -513,6 +517,7 @@ bool LLViewerTexture::isMemoryForTextureSuficientlyFree()  //static  void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &physical)  { +    LL_PROFILE_ZONE_SCOPED;      static LLFrameTimer timer;      static S32Megabytes gpu_res = S32Megabytes(S32_MAX);      static S32Megabytes physical_res = S32Megabytes(S32_MAX); @@ -525,27 +530,29 @@ void LLViewerTexture::getGPUMemoryForTextures(S32Megabytes &gpu, S32Megabytes &p      }      timer.reset(); -    LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); - -    if (gGLManager.mHasATIMemInfo)      { -        S32 meminfo[4]; -        glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); -        gpu_res = (S32Megabytes)meminfo[0]; +        LL_RECORD_BLOCK_TIME(FTM_TEXTURE_MEMORY_CHECK); -        //check main memory, only works for windows. -        LLMemory::updateMemoryInfo(); -        physical_res = LLMemory::getAvailableMemKB(); -    } -    else if (gGLManager.mHasNVXMemInfo) -    { -        S32 free_memory; -        glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); -        gpu_res = (S32Megabytes)(free_memory / 1024); -    } +        if (gGLManager.mHasATIMemInfo) +        { +            S32 meminfo[4]; +            glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo); +            gpu_res = (S32Megabytes)meminfo[0]; -    gpu = gpu_res; -    physical = physical_res; +            //check main memory, only works for windows. +            LLMemory::updateMemoryInfo(); +            physical_res = LLMemory::getAvailableMemKB(); +        } +        else if (gGLManager.mHasNVXMemInfo) +        { +            S32 free_memory; +            glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory); +            gpu_res = (S32Megabytes)(free_memory / 1024); +        } + +        gpu = gpu_res; +        physical = physical_res; +    }  }  static LLTrace::BlockTimerStatHandle FTM_TEXTURE_UPDATE_MEDIA("Media"); @@ -554,6 +561,7 @@ static LLTrace::BlockTimerStatHandle FTM_TEXTURE_UPDATE_TEST("Test");  //static  void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity)  { +    LL_PROFILE_ZONE_SCOPED;  	sCurrentTime = gFrameTimeSeconds;  	LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); @@ -703,6 +711,7 @@ void LLViewerTexture::cleanup()  void LLViewerTexture::notifyAboutCreatingTexture()  { +    LL_PROFILE_ZONE_SCOPED;  	for(U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)  	{  		for(U32 f = 0; f < mNumFaces[ch]; f++) @@ -714,6 +723,7 @@ void LLViewerTexture::notifyAboutCreatingTexture()  void LLViewerTexture::notifyAboutMissingAsset()  { +    LL_PROFILE_ZONE_SCOPED;  	for(U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)  	{  		for(U32 f = 0; f < mNumFaces[ch]; f++) @@ -726,6 +736,7 @@ void LLViewerTexture::notifyAboutMissingAsset()  // virtual  void LLViewerTexture::dump()  { +    LL_PROFILE_ZONE_SCOPED;  	LLGLTexture::dump();  	LL_INFOS() << "LLViewerTexture" @@ -761,6 +772,7 @@ bool LLViewerTexture::isActiveFetching()  bool LLViewerTexture::bindDebugImage(const S32 stage)  { +    LL_PROFILE_ZONE_SCOPED;  	if (stage < 0) return false;  	bool res = true; @@ -779,6 +791,7 @@ bool LLViewerTexture::bindDebugImage(const S32 stage)  bool LLViewerTexture::bindDefaultImage(S32 stage)   { +    LL_PROFILE_ZONE_SCOPED;  	if (stage < 0) return false;  	bool res = true; @@ -821,6 +834,7 @@ void LLViewerTexture::forceImmediateUpdate()  void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const   { +    LL_PROFILE_ZONE_SCOPED;  	if(needs_gltexture)  	{  		mNeedsGLTexture = TRUE; @@ -831,14 +845,14 @@ void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) co  	{  		//flag to reset the values because the old values are used.  		resetMaxVirtualSizeResetCounter(); -		mMaxVirtualSize = virtual_size;		 -		mAdditionalDecodePriority = 0.f;	 +		mMaxVirtualSize = virtual_size; +		mAdditionalDecodePriority = 0.f;  		mNeedsGLTexture = needs_gltexture;  	}  	else if (virtual_size > mMaxVirtualSize)  	{  		mMaxVirtualSize = virtual_size; -	}	 +	}  }  void LLViewerTexture::resetTextureStats() @@ -863,6 +877,7 @@ void LLViewerTexture::setKnownDrawSize(S32 width, S32 height)  //virtual  void LLViewerTexture::addFace(U32 ch, LLFace* facep)   { +    LL_PROFILE_ZONE_SCOPED;  	llassert(ch < LLRender::NUM_TEXTURE_CHANNELS);  	if(mNumFaces[ch] >= mFaceList[ch].size()) @@ -878,6 +893,7 @@ void LLViewerTexture::addFace(U32 ch, LLFace* facep)  //virtual  void LLViewerTexture::removeFace(U32 ch, LLFace* facep)   { +    LL_PROFILE_ZONE_SCOPED;  	llassert(ch < LLRender::NUM_TEXTURE_CHANNELS);  	if(mNumFaces[ch] > 1) @@ -918,6 +934,7 @@ S32 LLViewerTexture::getNumFaces(U32 ch) const  //virtual  void LLViewerTexture::addVolume(U32 ch, LLVOVolume* volumep)  { +    LL_PROFILE_ZONE_SCOPED;  	if (mNumVolumes[ch] >= mVolumeList[ch].size())  	{  		mVolumeList[ch].resize(2 * mNumVolumes[ch] + 1); @@ -931,6 +948,7 @@ void LLViewerTexture::addVolume(U32 ch, LLVOVolume* volumep)  //virtual  void LLViewerTexture::removeVolume(U32 ch, LLVOVolume* volumep)  { +    LL_PROFILE_ZONE_SCOPED;  	if (mNumVolumes[ch] > 1)  	{  		S32 index = volumep->getIndexInTex(ch);  @@ -954,6 +972,7 @@ S32 LLViewerTexture::getNumVolumes(U32 ch) const  void LLViewerTexture::reorganizeFaceList()  { +    LL_PROFILE_ZONE_SCOPED;  	static const F32 MAX_WAIT_TIME = 20.f; // seconds  	static const U32 MAX_EXTRA_BUFFER_SIZE = 4; @@ -977,6 +996,7 @@ void LLViewerTexture::reorganizeFaceList()  void LLViewerTexture::reorganizeVolumeList()  { +    LL_PROFILE_ZONE_SCOPED;  	static const F32 MAX_WAIT_TIME = 20.f; // seconds  	static const U32 MAX_EXTRA_BUFFER_SIZE = 4; @@ -1179,6 +1199,7 @@ FTType LLViewerFetchedTexture::getFTType() const  void LLViewerFetchedTexture::cleanup()  { +    LL_PROFILE_ZONE_SCOPED;  	for(callback_list_t::iterator iter = mLoadedCallbackList.begin();  		iter != mLoadedCallbackList.end(); )  	{ @@ -1204,6 +1225,7 @@ void LLViewerFetchedTexture::cleanup()  //access the fast cache  void LLViewerFetchedTexture::loadFromFastCache()  { +    LL_PROFILE_ZONE_SCOPED;  	if(!mInFastCacheList)  	{  		return; //no need to access the fast cache. @@ -1349,6 +1371,7 @@ void LLViewerFetchedTexture::dump()  // ONLY called from LLViewerFetchedTextureList  void LLViewerFetchedTexture::destroyTexture()   { +    LL_PROFILE_ZONE_SCOPED;  	if(LLImageGL::sGlobalTextureMemory < sMaxDesiredTextureMem * 0.95f)//not ready to release unused memory.  	{  		return ; @@ -1365,6 +1388,7 @@ void LLViewerFetchedTexture::destroyTexture()  void LLViewerFetchedTexture::addToCreateTexture()  { +    LL_PROFILE_ZONE_SCOPED;  	bool force_update = false;  	if (getComponents() != mRawImage->getComponents())  	{ @@ -1406,6 +1430,7 @@ void LLViewerFetchedTexture::addToCreateTexture()  	}  	else  	{	 +        LL_PROFILE_ZONE_SCOPED;  #if 1  		//  		//if mRequestedDiscardLevel > mDesiredDiscardLevel, we assume the required image res keep going up, @@ -1450,99 +1475,100 @@ void LLViewerFetchedTexture::addToCreateTexture()  			}  		}  #endif -		mNeedsCreateTexture = TRUE; -		gTextureList.mCreateTextureList.insert(this); -	}	 +        scheduleCreateTexture(); +	}  	return;  }  // ONLY called from LLViewerTextureList -BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) +BOOL LLViewerFetchedTexture::preCreateTexture(S32 usename/*= 0*/)  { -	if (!mNeedsCreateTexture) -	{ -		destroyRawImage(); -		return FALSE; -	} -	mNeedsCreateTexture = FALSE; -	if (mRawImage.isNull()) -	{ -		LL_ERRS() << "LLViewerTexture trying to create texture with no Raw Image" << LL_ENDL; -	} -	if (mRawImage->isBufferInvalid()) -	{ -		LL_WARNS() << "Can't create a texture: invalid image data" << LL_ENDL; -		destroyRawImage(); -		return FALSE; -	} -// 	LL_INFOS() << llformat("IMAGE Creating (%d) [%d x %d] Bytes: %d ", -// 						mRawDiscardLevel,  -// 						mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) -// 			<< mID.getString() << LL_ENDL; -	BOOL res = TRUE; +    LL_PROFILE_ZONE_SCOPED; +    if (!mNeedsCreateTexture) +    { +        destroyRawImage(); +        return FALSE; +    } +    mNeedsCreateTexture = FALSE; -	// store original size only for locally-sourced images -	if (mUrl.compare(0, 7, "file://") == 0) -	{ -		mOrigWidth = mRawImage->getWidth(); -		mOrigHeight = mRawImage->getHeight(); +    if (mRawImage.isNull()) +    { +        LL_ERRS() << "LLViewerTexture trying to create texture with no Raw Image" << LL_ENDL; +    } +    if (mRawImage->isBufferInvalid()) +    { +        LL_WARNS() << "Can't create a texture: invalid image data" << LL_ENDL; +        destroyRawImage(); +        return FALSE; +    } +    // 	LL_INFOS() << llformat("IMAGE Creating (%d) [%d x %d] Bytes: %d ", +    // 						mRawDiscardLevel,  +    // 						mRawImage->getWidth(), mRawImage->getHeight(),mRawImage->getDataSize()) +    // 			<< mID.getString() << LL_ENDL; +    BOOL res = TRUE; + +    // store original size only for locally-sourced images +    if (mUrl.compare(0, 7, "file://") == 0) +    { +        mOrigWidth = mRawImage->getWidth(); +        mOrigHeight = mRawImage->getHeight();          // This is only safe because it's a local image and fetcher doesn't use raw data          // from local images, but this might become unsafe in case of changes to fetcher -		if (mBoostLevel == BOOST_PREVIEW) -		{  -			mRawImage->biasedScaleToPowerOfTwo(1024); -		} -		else -		{ // leave black border, do not scale image content -			mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); -		} -		 -		mFullWidth = mRawImage->getWidth(); -		mFullHeight = mRawImage->getHeight(); -		setTexelsPerImage(); -	} -	else -	{ -		mOrigWidth = mFullWidth; -		mOrigHeight = mFullHeight; -	} +        if (mBoostLevel == BOOST_PREVIEW) +        { +            mRawImage->biasedScaleToPowerOfTwo(1024); +        } +        else +        { // leave black border, do not scale image content +            mRawImage->expandToPowerOfTwo(MAX_IMAGE_SIZE, FALSE); +        } -	bool size_okay = true; +        mFullWidth = mRawImage->getWidth(); +        mFullHeight = mRawImage->getHeight(); +        setTexelsPerImage(); +    } +    else +    { +        mOrigWidth = mFullWidth; +        mOrigHeight = mFullHeight; +    } -	S32 discard_level = mRawDiscardLevel; -	if (mRawDiscardLevel < 0) -	{ -		LL_DEBUGS() << "Negative raw discard level when creating image: " << mRawDiscardLevel << LL_ENDL; -		discard_level = 0; -	} +    bool size_okay = true; -	U32 raw_width = mRawImage->getWidth() << discard_level; -	U32 raw_height = mRawImage->getHeight() << discard_level; +    S32 discard_level = mRawDiscardLevel; +    if (mRawDiscardLevel < 0) +    { +        LL_DEBUGS() << "Negative raw discard level when creating image: " << mRawDiscardLevel << LL_ENDL; +        discard_level = 0; +    } -	if( raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE ) -	{ -		LL_INFOS() << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << LL_ENDL; -		size_okay = false; -	} -	 -	if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) -	{ -		// A non power-of-two image was uploaded (through a non standard client) -		LL_INFOS() << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << LL_ENDL; -		size_okay = false; -	} -	 -	if( !size_okay ) -	{ -		// An inappropriately-sized image was uploaded (through a non standard client) -		// We treat these images as missing assets which causes them to -		// be renderd as 'missing image' and to stop requesting data -		LL_WARNS() << "!size_ok, setting as missing" << LL_ENDL; -		setIsMissingAsset(); -		destroyRawImage(); -		return FALSE; -	} +    U32 raw_width = mRawImage->getWidth() << discard_level; +    U32 raw_height = mRawImage->getHeight() << discard_level; + +    if (raw_width > MAX_IMAGE_SIZE || raw_height > MAX_IMAGE_SIZE) +    { +        LL_INFOS() << "Width or height is greater than " << MAX_IMAGE_SIZE << ": (" << raw_width << "," << raw_height << ")" << LL_ENDL; +        size_okay = false; +    } + +    if (!LLImageGL::checkSize(mRawImage->getWidth(), mRawImage->getHeight())) +    { +        // A non power-of-two image was uploaded (through a non standard client) +        LL_INFOS() << "Non power of two width or height: (" << mRawImage->getWidth() << "," << mRawImage->getHeight() << ")" << LL_ENDL; +        size_okay = false; +    } + +    if (!size_okay) +    { +        // An inappropriately-sized image was uploaded (through a non standard client) +        // We treat these images as missing assets which causes them to +        // be renderd as 'missing image' and to stop requesting data +        LL_WARNS() << "!size_ok, setting as missing" << LL_ENDL; +        setIsMissingAsset(); +        destroyRawImage(); +        return FALSE; +    }      if (mGLTexturep->getHasExplicitFormat())      { @@ -1564,19 +1590,79 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)          }      } -	res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); +    return res; +} -	notifyAboutCreatingTexture(); +BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/) +{ +    if (!mNeedsCreateTexture) +    { +        return FALSE; +    } -	setActive(); +	BOOL res = mGLTexturep->createGLTexture(mRawDiscardLevel, mRawImage, usename, TRUE, mBoostLevel); +     +	return res; +} -	if (!needsToSaveRawImage()) -	{ -		mNeedsAux = FALSE; -		destroyRawImage(); -	} +void LLViewerFetchedTexture::postCreateTexture() +{ +    if (!mNeedsCreateTexture) +    { +        return; +    } -	return res; +    notifyAboutCreatingTexture(); + +    setActive(); + +    if (!needsToSaveRawImage()) +    { +        mNeedsAux = FALSE; +        destroyRawImage(); +    } + +    mNeedsCreateTexture = FALSE; +} + +void LLViewerFetchedTexture::scheduleCreateTexture() +{ +    ref(); +    mNeedsCreateTexture = TRUE; +    if (preCreateTexture()) +    { +        mNeedsCreateTexture = TRUE; +#if LL_WINDOWS //flip to 0 to revert to single-threaded OpenGL texture uploads +        if (!LLImageGLThread::sInstance->post([this]() +            { +                //actually create the texture on a background thread +                createTexture(); +                { +                    LL_PROFILE_ZONE_NAMED("iglt - sync"); +                    if (gGLManager.mHasSync) +                    { +                        auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); +                        glClientWaitSync(sync, 0, 0); +                        glDeleteSync(sync); +                    } +                    else +                    { +                        glFinish(); +                    } +                } +                LLImageGLThread::sInstance->postCallback([this]() +                    { +                        //finalize on main thread +                        postCreateTexture(); +                        unref(); +                    }); +            })) +#endif +        { +            gTextureList.mCreateTextureList.insert(this); +            unref(); +        } +    }  }  // Call with 0,0 to turn this feature off. @@ -1868,6 +1954,7 @@ void LLViewerFetchedTexture::setAdditionalDecodePriority(F32 priority)  void LLViewerFetchedTexture::updateVirtualSize()   {	 +    LL_PROFILE_ZONE_SCOPED;  	if(!mMaxVirtualSizeResetCounter)  	{  		addTextureStats(0.f, FALSE);//reset @@ -1959,6 +2046,7 @@ bool LLViewerFetchedTexture::isActiveFetching()  bool LLViewerFetchedTexture::updateFetch()  { +    LL_PROFILE_ZONE_SCOPED;  	static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false);  	static LLCachedControl<F32>  sCameraMotionThreshold(gSavedSettings,"TextureCameraMotionThreshold", 0.2);  	static LLCachedControl<S32>  sCameraMotionBoost(gSavedSettings,"TextureCameraMotionBoost", 3); @@ -2061,7 +2149,7 @@ bool LLViewerFetchedTexture::updateFetch()  				}  				else  				{ -					mIsRawImageValid = TRUE;			 +					mIsRawImageValid = TRUE;  					addToCreateTexture();  				} @@ -2889,6 +2977,7 @@ void LLViewerFetchedTexture::destroyRawImage()  //virtual  void LLViewerFetchedTexture::switchToCachedImage()  { +    LL_PROFILE_ZONE_SCOPED;  	if(mCachedRawImage.notNull())  	{  		mRawImage = mCachedRawImage; @@ -2900,12 +2989,12 @@ void LLViewerFetchedTexture::switchToCachedImage()  			mComponents = mRawImage->getComponents();  			mGLTexturep->setComponents(mComponents);  			gTextureList.dirtyImage(this); -		}			 +		}  		mIsRawImageValid = TRUE;  		mRawDiscardLevel = mCachedRawDiscardLevel; -		gTextureList.mCreateTextureList.insert(this); -		mNeedsCreateTexture = TRUE;		 + +        scheduleCreateTexture();  	}  } @@ -3179,6 +3268,7 @@ bool LLViewerLODTexture::isUpdateFrozen()  //virtual  void LLViewerLODTexture::processTextureStats()  { +    LL_PROFILE_ZONE_SCOPED;  	updateVirtualSize();  	static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes", false); diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 69568cc825..a5a1fb2c16 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -321,9 +321,13 @@ public:  	void addToCreateTexture(); - -	 // ONLY call from LLViewerTextureList +    //call to determine if createTexture is necessary +    BOOL preCreateTexture(S32 usename = 0); +	 // ONLY call from LLViewerTextureList or ImageGL background thread  	BOOL createTexture(S32 usename = 0); +    void postCreateTexture(); +    void scheduleCreateTexture(); +  	void destroyTexture() ;  	virtual void processTextureStats() ; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 561319ca5d..db740b69e9 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -114,6 +114,7 @@ void LLViewerTextureList::init()  void LLViewerTextureList::doPreloadImages()  { +    LL_PROFILE_ZONE_SCOPED;  	LL_DEBUGS("ViewerImages") << "Preloading images..." << LL_ENDL;  	llassert_always(mInitialized) ; @@ -205,6 +206,7 @@ static std::string get_texture_list_name()  void LLViewerTextureList::doPrefetchImages()  { +    LL_PROFILE_ZONE_SCOPED;  	if (LLAppViewer::instance()->getPurgeCache())  	{  		// cache was purged, no point @@ -258,6 +260,7 @@ LLViewerTextureList::~LLViewerTextureList()  void LLViewerTextureList::shutdown()  { +    LL_PROFILE_ZONE_SCOPED;  	// clear out preloads  	mImagePreloads.clear(); @@ -333,6 +336,7 @@ void LLViewerTextureList::shutdown()  void LLViewerTextureList::dump()  { +    LL_PROFILE_ZONE_SCOPED;  	LL_INFOS() << "LLViewerTextureList::dump()" << LL_ENDL;  	for (image_priority_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it)  	{ @@ -377,6 +381,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&  												   LLGLenum primary_format,   												   const LLUUID& force_id)  { +    LL_PROFILE_ZONE_SCOPED;  	if(!mInitialized)  	{  		return NULL ; @@ -404,6 +409,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&  												   LLGLenum primary_format,   												   const LLUUID& force_id)  { +    LL_PROFILE_ZONE_SCOPED;  	if(!mInitialized)  	{  		return NULL ; @@ -492,6 +498,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,  												   LLGLenum primary_format,  												   LLHost request_from_host)  { +    LL_PROFILE_ZONE_SCOPED;  	if(!mInitialized)  	{  		return NULL ; @@ -554,6 +561,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,  												   LLGLenum primary_format,  												   LLHost request_from_host)  { +    LL_PROFILE_ZONE_SCOPED;  	static LLCachedControl<bool> fast_cache_fetching_enabled(gSavedSettings, "FastCacheFetchEnabled", true);  	LLPointer<LLViewerFetchedTexture> imagep ; @@ -609,6 +617,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,  void LLViewerTextureList::findTexturesByID(const LLUUID &image_id, std::vector<LLViewerFetchedTexture*> &output)  { +    LL_PROFILE_ZONE_SCOPED;      LLTextureKey search_key(image_id, TEX_LIST_STANDARD);      uuid_map_t::iterator iter = mUUIDMap.lower_bound(search_key);      while (iter != mUUIDMap.end() && iter->first.textureId == image_id) @@ -620,6 +629,7 @@ void LLViewerTextureList::findTexturesByID(const LLUUID &image_id, std::vector<L  LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLTextureKey &search_key)  { +    LL_PROFILE_ZONE_SCOPED;      uuid_map_t::iterator iter = mUUIDMap.find(search_key);      if (iter == mUUIDMap.end())          return NULL; @@ -633,6 +643,7 @@ LLViewerFetchedTexture *LLViewerTextureList::findImage(const LLUUID &image_id, E  void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)  { +    LL_PROFILE_ZONE_SCOPED;  	assert_main_thread();  	llassert_always(mInitialized) ;  	llassert(image); @@ -652,6 +663,7 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)  void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)  { +    LL_PROFILE_ZONE_SCOPED;  	assert_main_thread();  	llassert_always(mInitialized) ;  	llassert(image); @@ -700,6 +712,7 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)  void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image, ETexListType tex_type)  { +    LL_PROFILE_ZONE_SCOPED;  	if (!new_image)  	{  		return; @@ -723,6 +736,7 @@ void LLViewerTextureList::addImage(LLViewerFetchedTexture *new_image, ETexListTy  void LLViewerTextureList::deleteImage(LLViewerFetchedTexture *image)  { +    LL_PROFILE_ZONE_SCOPED;  	if( image)  	{  		if (image->hasCallbacks()) @@ -844,6 +858,7 @@ void LLViewerTextureList::updateImages(F32 max_time)  void LLViewerTextureList::clearFetchingRequests()  { +    LL_PROFILE_ZONE_SCOPED;  	if (LLAppViewer::getTextureFetch()->getNumRequests() == 0)  	{  		return; @@ -861,6 +876,7 @@ void LLViewerTextureList::clearFetchingRequests()  void LLViewerTextureList::updateImagesDecodePriorities()  { +    LL_PROFILE_ZONE_SCOPED;  	// Update the decode priority for N images each frame  	{  		F32 lazy_flush_timeout = 30.f; // stop decoding @@ -976,6 +992,7 @@ void LLViewerTextureList::updateImagesDecodePriorities()  void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debug_level)  { +    LL_PROFILE_ZONE_SCOPED;  	if(!tex->setDebugFetching(debug_level))  	{  		return; @@ -1024,6 +1041,7 @@ void LLViewerTextureList::setDebugFetching(LLViewerFetchedTexture* tex, S32 debu  F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)  { +    LL_PROFILE_ZONE_SCOPED;  	if (gGLManager.mIsDisabled) return 0.0f;  	// @@ -1040,6 +1058,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)  		enditer = iter;  		LLViewerFetchedTexture *imagep = *curiter;  		imagep->createTexture(); +        imagep->postCreateTexture();  		if (create_timer.getElapsedTimeF32() > max_time)  		{  			break; @@ -1051,6 +1070,7 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)  F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time)  { +    LL_PROFILE_ZONE_SCOPED;  	if (gGLManager.mIsDisabled) return 0.0f;  	if(mFastCacheList.empty())  	{ @@ -1081,6 +1101,7 @@ F32 LLViewerTextureList::updateImagesLoadingFastCache(F32 max_time)  void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)  { +    LL_PROFILE_ZONE_SCOPED;  	if(!imagep)  	{  		return ; @@ -1100,6 +1121,7 @@ void LLViewerTextureList::forceImmediateUpdate(LLViewerFetchedTexture* imagep)  F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)  { +    LL_PROFILE_ZONE_SCOPED;  	LLTimer image_op_timer;  	// Update fetch for N images each frame @@ -1175,6 +1197,7 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)  void LLViewerTextureList::updateImagesUpdateStats()  { +    LL_PROFILE_ZONE_SCOPED;  	if (mForceResetTextureStats)  	{  		for (image_priority_list_t::iterator iter = mImageList.begin(); @@ -1189,6 +1212,7 @@ void LLViewerTextureList::updateImagesUpdateStats()  void LLViewerTextureList::decodeAllImages(F32 max_time)  { +    LL_PROFILE_ZONE_SCOPED;  	LLTimer timer;  	//loading from fast cache  @@ -1258,6 +1282,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,  										 const std::string& out_filename,  										 const U8 codec)  {	 +    LL_PROFILE_ZONE_SCOPED;  	// Load the image  	LLPointer<LLImageFormatted> image = LLImageFormatted::createFromType(codec);  	if (image.isNull()) @@ -1311,6 +1336,7 @@ BOOL LLViewerTextureList::createUploadFile(const std::string& filename,  // note: modifies the argument raw_image!!!!  LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImageRaw> raw_image)  { +    LL_PROFILE_ZONE_SCOPED;  	raw_image->biasedScaleToPowerOfTwo(LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);  	LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C(); @@ -1344,6 +1370,7 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage  // Returns min setting for TextureMemory (in MB)  S32Megabytes LLViewerTextureList::getMinVideoRamSetting()  { +    LL_PROFILE_ZONE_SCOPED;  	U32Megabytes system_ram = gSysMemory.getPhysicalMemoryKB();  	//min texture mem sets to 64M if total physical mem is more than 1.5GB  	return (system_ram > U32Megabytes(1500)) ? S32Megabytes(64) : gMinVideoRam ; @@ -1353,6 +1380,7 @@ S32Megabytes LLViewerTextureList::getMinVideoRamSetting()  // Returns max setting for TextureMemory (in MB)  S32Megabytes LLViewerTextureList::getMaxVideoRamSetting(bool get_recommended, float mem_multiplier)  { +    LL_PROFILE_ZONE_SCOPED;  	S32Megabytes max_texmem;  	if (gGLManager.mVRAM != 0)  	{ @@ -1406,6 +1434,7 @@ const S32Megabytes VIDEO_CARD_FRAMEBUFFER_MEM(12);  const S32Megabytes MIN_MEM_FOR_NON_TEXTURE(512);  void LLViewerTextureList::updateMaxResidentTexMem(S32Megabytes mem)  { +    LL_PROFILE_ZONE_SCOPED;  	// Initialize the image pipeline VRAM settings  	S32Megabytes cur_mem(gSavedSettings.getS32("TextureMemory"));  	F32 mem_multiplier = gSavedSettings.getF32("RenderTextureMemoryMultiple"); @@ -1646,6 +1675,7 @@ void LLUIImageList::cleanUp()  LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)  { +    LL_PROFILE_ZONE_SCOPED;  	// use id as image name  	std::string image_name = image_id.asString(); @@ -1664,6 +1694,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)  LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)  { +    LL_PROFILE_ZONE_SCOPED;  	// look for existing image  	uuid_ui_image_map_t::iterator found_it = mUIImages.find(image_name);  	if (found_it != mUIImages.end()) @@ -1681,6 +1712,7 @@ LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std  											  BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority,  											  LLUIImage::EScaleStyle scale_style)  { +    LL_PROFILE_ZONE_SCOPED;  	if (boost_priority == LLGLTexture::BOOST_NONE)  	{  		boost_priority = LLGLTexture::BOOST_UI; @@ -1693,6 +1725,7 @@ LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,  											BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLViewerTexture::EBoostLevel boost_priority,  											LLUIImage::EScaleStyle scale_style)  { +    LL_PROFILE_ZONE_SCOPED;  	if (boost_priority == LLGLTexture::BOOST_NONE)  	{  		boost_priority = LLGLTexture::BOOST_UI; @@ -1704,6 +1737,7 @@ LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,  LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect,  										LLUIImage::EScaleStyle scale_style)  { +    LL_PROFILE_ZONE_SCOPED;  	if (!imagep) return NULL;  	imagep->setAddressMode(LLTexUnit::TAM_CLAMP); @@ -1741,6 +1775,7 @@ LLUIImagePtr LLUIImageList::loadUIImage(LLViewerFetchedTexture* imagep, const st  LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::string& filename, BOOL use_mips, const LLRect& scale_rect, const LLRect& clip_rect, LLUIImage::EScaleStyle scale_style)  { +    LL_PROFILE_ZONE_SCOPED;  	// look for existing image  	uuid_ui_image_map_t::iterator found_it = mUIImages.find(name);  	if (found_it != mUIImages.end()) @@ -1755,6 +1790,7 @@ LLUIImagePtr LLUIImageList::preloadUIImage(const std::string& name, const std::s  //static   void LLUIImageList::onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* user_data )  { +    LL_PROFILE_ZONE_SCOPED;  	if(!success || !user_data)   	{  		return; @@ -1856,6 +1892,7 @@ struct UIImageDeclarations : public LLInitParam::Block<UIImageDeclarations>  bool LLUIImageList::initFromFile()  { +    LL_PROFILE_ZONE_SCOPED;  	// Look for textures.xml in all the right places. Pass  	// constraint=LLDir::ALL_SKINS because we want to overlay textures.xml  	// from all the skins directories. diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 24cb138401..2342b6219c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1970,6 +1970,13 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	}  	LLFontManager::initClass(); +	// Init font system, load default fonts and generate basic glyphs +	// currently it takes aprox. 0.5 sec and we would load these fonts anyway +	// before login screen. +	LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"), +		mDisplayScale.mV[VX], +		mDisplayScale.mV[VY], +		gDirUtilp->getAppRODataDir());  	//  	// We want to set this stuff up BEFORE we initialize the pipeline, so we can turn off @@ -2011,19 +2018,11 @@ LLViewerWindow::LLViewerWindow(const Params& p)  	// Init the image list.  Must happen after GL is initialized and before the images that  	// LLViewerWindow needs are requested. -	LLImageGL::initClass(LLViewerTexture::MAX_GL_IMAGE_CATEGORY) ; +	LLImageGL::initClass(mWindow, LLViewerTexture::MAX_GL_IMAGE_CATEGORY) ;  	gTextureList.init();  	LLViewerTextureManager::init() ;  	gBumpImageList.init(); -	// Init font system, but don't actually load the fonts yet -	// because our window isn't onscreen and they take several -	// seconds to parse. -	LLFontGL::initClass( gSavedSettings.getF32("FontScreenDPI"), -								mDisplayScale.mV[VX], -								mDisplayScale.mV[VY], -								gDirUtilp->getAppRODataDir()); -	  	// Create container for all sub-views  	LLView::Params rvp;  	rvp.name("root"); @@ -2109,6 +2108,8 @@ void LLViewerWindow::initBase()  	LL_DEBUGS("AppInit") << "initializing edit menu" << LL_ENDL;  	initialize_edit_menu(); +    LLFontGL::loadCommonFonts(); +  	// Create the floater view at the start so that other views can add children to it.   	// (But wait to add it as a child of the root view so that it will be in front of the   	// other views.) @@ -5301,6 +5302,7 @@ void LLViewerWindow::setup3DRender()  void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset)  { +	LL_PROFILE_ZONE_SCOPED  	gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset;  	gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset;  	gGLViewport[2] = mWorldViewRectRaw.getWidth(); @@ -5519,8 +5521,6 @@ void LLViewerWindow::initFonts(F32 zoom_factor)  								mDisplayScale.mV[VX] * zoom_factor,  								mDisplayScale.mV[VY] * zoom_factor,  								gDirUtilp->getAppRODataDir()); -	// Force font reloads, which can be very slow -	LLFontGL::loadDefaultFonts();  }  void LLViewerWindow::requestResolutionUpdate() diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp index c63c5f6b23..46beac8255 100644 --- a/indra/newview/llvlcomposition.cpp +++ b/indra/newview/llvlcomposition.cpp @@ -254,6 +254,7 @@ BOOL LLVLComposition::generateComposition()  BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,  									  const F32 width, const F32 height)  { +	LL_PROFILE_ZONE_SCOPED  	llassert(mSurfacep);  	llassert(x >= 0.f);  	llassert(y >= 0.f); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index dad580de70..a588d05ff7 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3136,6 +3136,8 @@ void LLVOAvatar::idleUpdateWindEffect()  void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)  { +    LL_PROFILE_ZONE_SCOPED; +  	// update chat bubble  	//--------------------------------------------------------------------  	// draw text label over character's head @@ -3807,11 +3809,6 @@ LLViewerInventoryItem* recursiveGetObjectInventoryItem(LLViewerObject *vobj, LLU  void LLVOAvatar::updateAnimationDebugText()  { -	if (isSelf() && gNonInteractive) -	{ -		LLVector3 vel = getVelocity(); -		addDebugText(llformat("vel %f %f %f\n",vel[0],vel[1],vel[2])); -	}  	for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();  		 iter != mMotionController.getActiveMotions().end(); ++iter)  	{ @@ -4889,6 +4886,8 @@ bool LLVOAvatar::shouldAlphaMask()  //-----------------------------------------------------------------------------  U32 LLVOAvatar::renderSkinned()  { +    LL_PROFILE_ZONE_SCOPED; +  	U32 num_indices = 0;  	if (!mIsBuilt) @@ -6163,27 +6162,29 @@ LLJoint *LLVOAvatar::getJoint( const std::string &name )  LLJoint *LLVOAvatar::getJoint( S32 joint_num )  {      LLJoint *pJoint = NULL; -    S32 collision_start = mNumBones; -    S32 attachment_start = mNumBones + mNumCollisionVolumes; -    if (joint_num>=attachment_start) +    if (joint_num >= 0)      { -        // Attachment IDs start at 1 -        S32 attachment_id = joint_num - attachment_start + 1; -        attachment_map_t::iterator iter = mAttachmentPoints.find(attachment_id); -        if (iter != mAttachmentPoints.end()) +        if (joint_num < mNumBones)          { -            pJoint = iter->second; +            pJoint = mSkeleton[joint_num]; +        } +        else if (joint_num < mNumBones + mNumCollisionVolumes) +        { +            S32 collision_id = joint_num - mNumBones; +            pJoint = &mCollisionVolumes[collision_id]; +        } +        else +        { +            // Attachment IDs start at 1 +            S32 attachment_id = joint_num - (mNumBones + mNumCollisionVolumes) + 1; +            attachment_map_t::iterator iter = mAttachmentPoints.find(attachment_id); +            if (iter != mAttachmentPoints.end()) +            { +                pJoint = iter->second; +            }          }      } -    else if (joint_num>=collision_start) -    { -        S32 collision_id = joint_num-collision_start; -        pJoint = &mCollisionVolumes[collision_id]; -    } -    else if (joint_num>=0) -    { -        pJoint = mSkeleton[joint_num]; -    } +      	llassert(!pJoint || pJoint->getJointNum() == joint_num);      return pJoint;  } @@ -6518,7 +6519,7 @@ void LLVOAvatar::addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LL  					LLJoint* pJoint = getJoint( lookingForJoint );  					if (pJoint)  					{   									 -						const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();									 +						const LLVector3& jointPos = LLVector3(pSkinData->mAlternateBindMatrix[i].getTranslation());                          if (pJoint->aboveJointPosThreshold(jointPos))                          {                              bool override_changed; @@ -7122,6 +7123,7 @@ void LLVOAvatar::updateGL()  {  	if (mMeshTexturesDirty)  	{ +		LL_PROFILE_ZONE_SCOPED  		updateMeshTextures();  		mMeshTexturesDirty = FALSE;  	} @@ -7867,6 +7869,8 @@ void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color)  // Do rigged mesh attachments display with this av?  bool LLVOAvatar::shouldRenderRigged() const  { +    LL_PROFILE_ZONE_SCOPED; +  	if (getOverallAppearance() == AOA_NORMAL)  	{  		return true; @@ -8358,6 +8362,7 @@ void LLVOAvatar::updateMeshVisibility()  // virtual  void LLVOAvatar::updateMeshTextures()  { +	LL_PROFILE_ZONE_SCOPED  	static S32 update_counter = 0;  	mBakedTextureDebugText.clear(); @@ -10954,6 +10959,7 @@ void LLVOAvatar::updateOverallAppearanceAnimations()  // Based on isVisuallyMuted(), but has 3 possible results.  LLVOAvatar::AvatarOverallAppearance LLVOAvatar::getOverallAppearance() const  { +    LL_PROFILE_ZONE_SCOPED;  	AvatarOverallAppearance result = AOA_NORMAL;  	// Priority order (highest priority first) diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 74ef589ca4..39adaab8ca 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -209,6 +209,11 @@ public:  	virtual LLJoint*		getJoint(const std::string &name);  	LLJoint*		        getJoint(S32 num); +    //if you KNOW joint_num is a valid animated joint index, use getSkeletonJoint for efficiency +    inline LLJoint* getSkeletonJoint(S32 joint_num) { return mSkeleton[joint_num]; } +    inline size_t getSkeletonJointCount() const { return mSkeleton.size(); } + +  	void 					addAttachmentOverridesForObject(LLViewerObject *vo, std::set<LLUUID>* meshes_seen = NULL, bool recursive = true);  	void					removeAttachmentOverridesForObject(const LLUUID& mesh_id);  	void					removeAttachmentOverridesForObject(LLViewerObject *vo); diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index 897bace4e1..b5560d3d79 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -218,6 +218,7 @@ void LLVOSurfacePatch::updateGL()  {  	if (mPatchp)  	{ +		LL_PROFILE_ZONE_SCOPED  		mPatchp->updateGL();  	}  } diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index f063800587..b86935b081 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3555,7 +3555,7 @@ const LLMeshSkinInfo* LLVOVolume::getSkinInfo() const  {      if (getVolume())      { -        return gMeshRepo.getSkinInfo(getVolume()->getParams().getSculptID(), this); +        return gMeshRepo.getSkinInfo(getMeshID(), this);      }      else      { @@ -4807,7 +4807,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  	LLMatrix4a mat[kMaxJoints];  	U32 maxJoints = LLSkinningUtil::getMeshJointCount(skin); -    LLSkinningUtil::initSkinningMatrixPalette((LLMatrix4*)mat, maxJoints, skin, avatar); +    LLSkinningUtil::initSkinningMatrixPalette(mat, maxJoints, skin, avatar);      S32 rigged_vert_count = 0;      S32 rigged_face_count = 0; @@ -4823,8 +4823,7 @@ void LLRiggedVolume::update(const LLMeshSkinInfo* skin, LLVOAvatar* avatar, cons  		if ( weight )  		{              LLSkinningUtil::checkSkinWeights(weight, dst_face.mNumVertices, skin); -			LLMatrix4a bind_shape_matrix; -			bind_shape_matrix.loadu(skin->mBindShapeMatrix); +			const LLMatrix4a& bind_shape_matrix = skin->mBindShapeMatrix;  			LLVector4a* pos = dst_face.mPositions; @@ -6045,123 +6044,130 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)  	if (group && group->hasState(LLSpatialGroup::MESH_DIRTY) && !group->hasState(LLSpatialGroup::GEOM_DIRTY))  	{  		LL_RECORD_BLOCK_TIME(FTM_REBUILD_VOLUME_VB); -		LL_RECORD_BLOCK_TIME(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); //make sure getgeometryvolume shows up in the right place in timers +		{ +			// SL-15709 -- NOTE: Tracy only allows one ZoneScoped per function. +			// Solutions are: +			// 1. Use a new scope +			// 2. Use named zones +			// 3. Use transient zones +			LL_RECORD_BLOCK_TIME(FTM_REBUILD_VOLUME_GEN_DRAW_INFO); //make sure getgeometryvolume shows up in the right place in timers -		group->mBuilt = 1.f; +			group->mBuilt = 1.f; -		S32 num_mapped_vertex_buffer = LLVertexBuffer::sMappedCount ; +			S32 num_mapped_vertex_buffer = LLVertexBuffer::sMappedCount ; -		const U32 MAX_BUFFER_COUNT = 4096; -		LLVertexBuffer* locked_buffer[MAX_BUFFER_COUNT]; -		 -		U32 buffer_count = 0; +			const U32 MAX_BUFFER_COUNT = 4096; +			LLVertexBuffer* locked_buffer[MAX_BUFFER_COUNT]; -		for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) -		{ -			LLDrawable* drawablep = (LLDrawable*)(*drawable_iter)->getDrawable(); +			U32 buffer_count = 0; -			if (drawablep && !drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) && !drawablep->isState(LLDrawable::RIGGED) ) +			for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)  			{ -				LLVOVolume* vobj = drawablep->getVOVolume(); -                if (debugLoggingEnabled("AnimatedObjectsLinkset")) -                { -                    if (vobj->isAnimatedObject() && vobj->isRiggedMesh()) -                    { -                        std::string vobj_name = llformat("Vol%p", vobj); -                        F32 est_tris = vobj->getEstTrianglesMax(); -                        LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " rebuildMesh, tris " << est_tris << LL_ENDL;  -                    } -                } -				if (vobj->isNoLOD()) continue; - -				vobj->preRebuild(); - -				if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) -				{ -					vobj->updateRelativeXform(true); -				} +				LLDrawable* drawablep = (LLDrawable*)(*drawable_iter)->getDrawable(); -				LLVolume* volume = vobj->getVolume(); -				for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +				if (drawablep && !drawablep->isDead() && drawablep->isState(LLDrawable::REBUILD_ALL) && !drawablep->isState(LLDrawable::RIGGED) )  				{ -					LLFace* face = drawablep->getFace(i); -					if (face) +					LLVOVolume* vobj = drawablep->getVOVolume(); +					if (debugLoggingEnabled("AnimatedObjectsLinkset"))  					{ -						LLVertexBuffer* buff = face->getVertexBuffer(); -						if (buff) +						if (vobj->isAnimatedObject() && vobj->isRiggedMesh())  						{ -							llassert(!face->isState(LLFace::RIGGED)); +							std::string vobj_name = llformat("Vol%p", vobj); +							F32 est_tris = vobj->getEstTrianglesMax(); +							LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " rebuildMesh, tris " << est_tris << LL_ENDL; +						} +					} +					if (vobj->isNoLOD()) continue; -							if (!face->getGeometryVolume(*volume, face->getTEOffset(),  -								vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex())) -							{ //something's gone wrong with the vertex buffer accounting, rebuild this group  -								group->dirtyGeom(); -								gPipeline.markRebuild(group, TRUE); -							} +					vobj->preRebuild(); +					if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) +					{ +						vobj->updateRelativeXform(true); +					} -							if (buff->isLocked() && buffer_count < MAX_BUFFER_COUNT) +					LLVolume* volume = vobj->getVolume(); +					for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +					{ +						LLFace* face = drawablep->getFace(i); +						if (face) +						{ +							LLVertexBuffer* buff = face->getVertexBuffer(); +							if (buff)  							{ -								locked_buffer[buffer_count++] = buff; +								llassert(!face->isState(LLFace::RIGGED)); + +								if (!face->getGeometryVolume(*volume, face->getTEOffset(),  +									vobj->getRelativeXform(), vobj->getRelativeXformInvTrans(), face->getGeomIndex())) +								{ //something's gone wrong with the vertex buffer accounting, rebuild this group  +									group->dirtyGeom(); +									gPipeline.markRebuild(group, TRUE); +								} + + +								if (buff->isLocked() && buffer_count < MAX_BUFFER_COUNT) +								{ +									locked_buffer[buffer_count++] = buff; +								}  							}  						}  					} + +					if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) +					{ +						vobj->updateRelativeXform(); +					} + +					drawablep->clearState(LLDrawable::REBUILD_ALL);  				} +			} -				if (drawablep->isState(LLDrawable::ANIMATED_CHILD)) +			{ +				LL_RECORD_BLOCK_TIME(FTM_REBUILD_MESH_FLUSH); +				for (LLVertexBuffer** iter = locked_buffer, ** end_iter = locked_buffer+buffer_count; iter != end_iter; ++iter)  				{ -					vobj->updateRelativeXform(); +					(*iter)->flush();  				} -				 -				drawablep->clearState(LLDrawable::REBUILD_ALL); +				// don't forget alpha +				if(group != NULL && +				   !group->mVertexBuffer.isNull() && +				   group->mVertexBuffer->isLocked()) +				{ +					group->mVertexBuffer->flush(); +				}  			} -		} -		 -		{ -			LL_RECORD_BLOCK_TIME(FTM_REBUILD_MESH_FLUSH); -			for (LLVertexBuffer** iter = locked_buffer, ** end_iter = locked_buffer+buffer_count; iter != end_iter; ++iter) -		{ -			(*iter)->flush(); -		} - -		// don't forget alpha -		if(group != NULL &&  -		   !group->mVertexBuffer.isNull() &&  -		   group->mVertexBuffer->isLocked()) -		{ -			group->mVertexBuffer->flush(); -		} -		} -		//if not all buffers are unmapped -		if(num_mapped_vertex_buffer != LLVertexBuffer::sMappedCount)  -		{ -			LL_WARNS() << "Not all mapped vertex buffers are unmapped!" << LL_ENDL ;  -			for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter) +			//if not all buffers are unmapped +			if(num_mapped_vertex_buffer != LLVertexBuffer::sMappedCount)  			{ -				LLDrawable* drawablep = (LLDrawable*)(*drawable_iter)->getDrawable(); -				if(!drawablep) -				{ -					continue; -				} -				for (S32 i = 0; i < drawablep->getNumFaces(); ++i) +				LL_WARNS() << "Not all mapped vertex buffers are unmapped!" << LL_ENDL ; +				for (LLSpatialGroup::element_iter drawable_iter = group->getDataBegin(); drawable_iter != group->getDataEnd(); ++drawable_iter)  				{ -					LLFace* face = drawablep->getFace(i); -					if (face) +					LLDrawable* drawablep = (LLDrawable*)(*drawable_iter)->getDrawable(); +					if(!drawablep) +					{ +						continue; +					} +					for (S32 i = 0; i < drawablep->getNumFaces(); ++i)  					{ -						LLVertexBuffer* buff = face->getVertexBuffer(); -						if (buff && buff->isLocked()) +						LLFace* face = drawablep->getFace(i); +						if (face)  						{ -							buff->flush(); +							LLVertexBuffer* buff = face->getVertexBuffer(); +							if (buff && buff->isLocked()) +							{ +								buff->flush(); +							}  						}  					}  				} -			}  +			} + +			group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);  		} -		group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO); -	} +	} // Tracy integration  //	llassert(!group || !group->isState(LLSpatialGroup::NEW_DRAWINFO));  } diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h index ce400a3498..b8c6f47bbd 100644 --- a/indra/newview/llvovolume.h +++ b/indra/newview/llvovolume.h @@ -296,6 +296,9 @@ public:  	BOOL setIsFlexible(BOOL is_flexible);      const LLMeshSkinInfo* getSkinInfo() const; + +    //convenience accessor for mesh ID (which is stored in sculpt id for legacy reasons) +    const LLUUID& getMeshID() const { return getVolume()->getParams().getSculptID(); }      // Extended Mesh Properties      U32 getExtendedMeshFlags() const; diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index a1a1db35d6..c7b0a2bfb4 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1284,6 +1284,7 @@ void send_agent_pause()  void send_agent_resume()  { +	LL_PROFILE_ZONE_SCOPED  	// Note: used to check for LLWorld initialization before it became a singleton.  	// Rather than just remove this check I'm changing it to assure that the message   	// system has been initialized. -MG diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index ad401b6db4..7aa05fb22f 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -338,7 +338,6 @@ S32		LLPipeline::sUseOcclusion = 0;  bool	LLPipeline::sDelayVBUpdate = true;  bool	LLPipeline::sAutoMaskAlphaDeferred = true;  bool	LLPipeline::sAutoMaskAlphaNonDeferred = false; -bool	LLPipeline::sDisableShaders = false;  bool	LLPipeline::sRenderTransparentWater = true;  bool	LLPipeline::sRenderBump = true;  bool	LLPipeline::sBakeSunlight = false; @@ -359,7 +358,6 @@ bool	LLPipeline::sRenderAttachedLights = true;  bool	LLPipeline::sRenderAttachedParticles = true;  bool	LLPipeline::sRenderDeferred = false;  S32		LLPipeline::sVisibleLightCount = 0; -F32		LLPipeline::sMinRenderSize = 0.f;  bool	LLPipeline::sRenderingHUDs;  F32     LLPipeline::sDistortionWaterClipPlaneMargin = 1.0125f; @@ -1403,10 +1401,7 @@ void LLPipeline::restoreGL()  bool LLPipeline::canUseVertexShaders()  { -	if (sDisableShaders || -		!gGLManager.mHasVertexShader || -		!gGLManager.mHasFragmentShader || -		(assertInitialized() && mVertexShadersLoaded != 1) ) +	if ((assertInitialized() && mVertexShadersLoaded != 1) )  	{  		return false;  	} @@ -1418,8 +1413,7 @@ bool LLPipeline::canUseVertexShaders()  bool LLPipeline::canUseWindLightShaders() const  { -	return (!LLPipeline::sDisableShaders && -			gWLSkyProgram.mProgramObject != 0 && +	return (gWLSkyProgram.mProgramObject != 0 &&  			LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1);  } @@ -1907,6 +1901,7 @@ void LLPipeline::createObject(LLViewerObject* vobj)  void LLPipeline::resetFrameStats()  { +	LL_PROFILE_ZONE_SCOPED  	assertInitialized();  	sCompiles        = 0; @@ -2135,6 +2130,7 @@ void LLPipeline::grabReferences(LLCullResult& result)  void LLPipeline::clearReferences()  { +	LL_PROFILE_ZONE_SCOPED  	sCull = NULL;  	mGroupSaveQ1.clear();  } @@ -2563,13 +2559,6 @@ void LLPipeline::markNotCulled(LLSpatialGroup* group, LLCamera& camera)  		return;  	} -	const LLVector4a* bounds = group->getBounds(); -	if (sMinRenderSize > 0.f &&  -			llmax(llmax(bounds[1][0], bounds[1][1]), bounds[1][2]) < sMinRenderSize) -	{ -		return; -	} -  	assertInitialized();  	if (!group->getSpatialPartition()->mRenderByGroup) @@ -3493,7 +3482,6 @@ void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)  			group->mLastUpdateDistance = group->mDistance;  		}  	} -  }  void LLPipeline::stateSort(LLSpatialBridge* bridge, LLCamera& camera, BOOL fov_changed) @@ -3800,6 +3788,27 @@ void renderSoundHighlights(LLDrawable* drawablep)  }  } +void LLPipeline::touchTextures(LLDrawInfo* info) +{ +    LL_PROFILE_ZONE_SCOPED; +    for (auto& tex : info->mTextureList) +    { +        if (tex.notNull()) +        { +            LLImageGL* gl_tex = tex->getGLTexture(); +            if (gl_tex && gl_tex->updateBindStats(gl_tex->mTextureMemory)) +            { +                tex->setActive(); +            } +        } +    } + +    if (info->mTexture.notNull()) +    { +        info->mTexture->addTextureStats(info->mVSize); +    } +} +  void LLPipeline::postSort(LLCamera& camera)  {  	LL_RECORD_BLOCK_TIME(FTM_STATESORT_POSTSORT); @@ -3852,20 +3861,14 @@ void LLPipeline::postSort(LLCamera& camera)  			for (LLSpatialGroup::drawmap_elem_t::iterator k = src_vec.begin(); k != src_vec.end(); ++k)  			{ -				if (sMinRenderSize > 0.f) -				{ -					LLVector4a bounds; -					bounds.setSub((*k)->mExtents[1],(*k)->mExtents[0]); - -					if (llmax(llmax(bounds[0], bounds[1]), bounds[2]) > sMinRenderSize) -					{ -						sCull->pushDrawInfo(j->first, *k); -					} -				} -				else -				{ -					sCull->pushDrawInfo(j->first, *k); -				} +                LLDrawInfo* info = *k; +				 +				sCull->pushDrawInfo(j->first, info); +                if (!sShadowRender && !sReflectionRender) +                { +                    touchTextures(info); +                    addTrianglesDrawn(info->mCount, info->mDrawMode); +                }  			}  		} @@ -4577,92 +4580,99 @@ void LLPipeline::renderGeomDeferred(LLCamera& camera)  	LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderGeomDeferred");  	LL_RECORD_BLOCK_TIME(FTM_RENDER_GEOMETRY); +	{ +		// SL-15709 -- NOTE: Tracy only allows one ZoneScoped per function. +		// Solutions are: +		// 1. Use a new scope +		// 2. Use named zones +		// 3. Use transient zones +		LL_RECORD_BLOCK_TIME(FTM_DEFERRED_POOLS); -	LL_RECORD_BLOCK_TIME(FTM_DEFERRED_POOLS); - -	LLGLEnable cull(GL_CULL_FACE); +		LLGLEnable cull(GL_CULL_FACE); -	for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter) -	{ -		LLDrawPool *poolp = *iter; -		if (hasRenderType(poolp->getType())) +		for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter)  		{ -			poolp->prerender(); +			LLDrawPool *poolp = *iter; +			if (hasRenderType(poolp->getType())) +			{ +				poolp->prerender(); +			}  		} -	} -	LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); +		LLGLEnable multisample(RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); -	LLVertexBuffer::unbind(); +		LLVertexBuffer::unbind(); -	LLGLState::checkStates(); -	LLGLState::checkTextureChannels(); -	LLGLState::checkClientArrays(); +		LLGLState::checkStates(); +		LLGLState::checkTextureChannels(); +		LLGLState::checkClientArrays(); -	U32 cur_type = 0; +		U32 cur_type = 0; -	gGL.setColorMask(true, true); +		gGL.setColorMask(true, true); -	pool_set_t::iterator iter1 = mPools.begin(); +		pool_set_t::iterator iter1 = mPools.begin(); -	while ( iter1 != mPools.end() ) -	{ -		LLDrawPool *poolp = *iter1; +		while ( iter1 != mPools.end() ) +		{ +			LLDrawPool *poolp = *iter1; -		cur_type = poolp->getType(); +			cur_type = poolp->getType(); -		pool_set_t::iterator iter2 = iter1; -		if (hasRenderType(poolp->getType()) && poolp->getNumDeferredPasses() > 0) -		{ -			LL_RECORD_BLOCK_TIME(FTM_DEFERRED_POOLRENDER); +			pool_set_t::iterator iter2 = iter1; +			if (hasRenderType(poolp->getType()) && poolp->getNumDeferredPasses() > 0) +			{ +				LL_RECORD_BLOCK_TIME(FTM_DEFERRED_POOLRENDER); -			gGLLastMatrix = NULL; -			gGL.loadMatrix(gGLModelView); +				gGLLastMatrix = NULL; +				gGL.loadMatrix(gGLModelView); -			for( S32 i = 0; i < poolp->getNumDeferredPasses(); i++ ) -			{ -				LLVertexBuffer::unbind(); -				poolp->beginDeferredPass(i); -				for (iter2 = iter1; iter2 != mPools.end(); iter2++) +				for( S32 i = 0; i < poolp->getNumDeferredPasses(); i++ )  				{ -					LLDrawPool *p = *iter2; -					if (p->getType() != cur_type) +					LLVertexBuffer::unbind(); +					poolp->beginDeferredPass(i); +					for (iter2 = iter1; iter2 != mPools.end(); iter2++)  					{ -						break; +						LLDrawPool *p = *iter2; +						if (p->getType() != cur_type) +						{ +							break; +						} + +						if ( !p->getSkipRenderFlag() ) { p->renderDeferred(i); }  					} -										 -					if ( !p->getSkipRenderFlag() ) { p->renderDeferred(i); } -				} -				poolp->endDeferredPass(i); -				LLVertexBuffer::unbind(); +					poolp->endDeferredPass(i); +					LLVertexBuffer::unbind(); -				if (gDebugGL || gDebugPipeline) -				{ -					LLGLState::checkStates(); +					if (gDebugGL || gDebugPipeline) +					{ +						LLGLState::checkStates(); +					}  				}  			} -		} -		else -		{ -			// Skip all pools of this type -			for (iter2 = iter1; iter2 != mPools.end(); iter2++) +			else  			{ -				LLDrawPool *p = *iter2; -				if (p->getType() != cur_type) +				// Skip all pools of this type +				for (iter2 = iter1; iter2 != mPools.end(); iter2++)  				{ -					break; +					LLDrawPool *p = *iter2; +					if (p->getType() != cur_type) +					{ +						break; +					}  				}  			} +			iter1 = iter2; +			stop_glerror();  		} -		iter1 = iter2; -		stop_glerror(); -	} -	gGLLastMatrix = NULL; -    gGL.matrixMode(LLRender::MM_MODELVIEW); -	gGL.loadMatrix(gGLModelView); +		gGLLastMatrix = NULL; +		gGL.matrixMode(LLRender::MM_MODELVIEW); +		gGL.loadMatrix(gGLModelView); -	gGL.setColorMask(true, false); +		gGL.setColorMask(true, false); + +	} // Tracy ZoneScoped  }  void LLPipeline::renderGeomPostDeferred(LLCamera& camera, bool do_occlusion) @@ -8430,8 +8440,6 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_      LLEnvironment& environment = LLEnvironment::instance();      LLSettingsSky::ptr_t sky = environment.getCurrentSky(); - -    static_cast<LLSettingsVOSky*>(sky.get())->updateShader(&shader);  }  LLColor3 pow3f(LLColor3 v, F32 f) @@ -11152,6 +11160,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)  		if (LLPipeline::sRenderDeferred)  		{  			GLuint buff = GL_COLOR_ATTACHMENT0; +			LL_PROFILER_GPU_ZONEC( "gl.DrawBuffersARB", 0x8000FF );  			glDrawBuffersARB(1, &buff);  		} diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 0eaa6b141d..8ffbddca21 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -265,6 +265,8 @@ public:  	void stateSort(LLSpatialBridge* bridge, LLCamera& camera, BOOL fov_changed = FALSE);  	void stateSort(LLDrawable* drawablep, LLCamera& camera);  	void postSort(LLCamera& camera); +    //update stats for textures in given DrawInfo +    void touchTextures(LLDrawInfo* info);  	void forAllVisibleDrawables(void (*func)(LLDrawable*));  	void renderObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false); @@ -574,7 +576,6 @@ public:  	static bool				sDelayVBUpdate;  	static bool				sAutoMaskAlphaDeferred;  	static bool				sAutoMaskAlphaNonDeferred; -	static bool				sDisableShaders; // if true, rendering will be done without shaders  	static bool				sRenderTransparentWater;  	static bool				sRenderBump;  	static bool				sBakeSunlight; @@ -597,7 +598,6 @@ public:  	static bool				sRenderAttachedParticles;  	static bool				sRenderDeferred;  	static S32				sVisibleLightCount; -	static F32				sMinRenderSize;  	static bool				sRenderingHUDs;      static F32              sDistortionWaterClipPlaneMargin; diff --git a/indra/newview/slplugin.entitlements b/indra/newview/slplugin.entitlements new file mode 100644 index 0000000000..a1c430a57a --- /dev/null +++ b/indra/newview/slplugin.entitlements @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +	<key>com.apple.security.cs.allow-unsigned-executable-memory</key> +	<true/> +</dict> +</plist> diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp index caa3016d2e..37fbbb449b 100644 --- a/indra/newview/tests/llsecapi_test.cpp +++ b/indra/newview/tests/llsecapi_test.cpp @@ -57,7 +57,7 @@ void LLSecAPIBasicHandler::init() {}  LLSecAPIBasicHandler::~LLSecAPIBasicHandler() {}  LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert) { return NULL; }  LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert) { return NULL; } -LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain) { return NULL; } +LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(X509_STORE_CTX* chain) { return NULL; }  LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id) { return NULL; }  void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type, const std::string& data_id, const LLSD& data) {}  void LLSecAPIBasicHandler::addToProtectedMap(const std::string& data_type, const std::string& data_id, const std::string& map_elem, const LLSD& data) {} diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp index e5d226a2a4..4c8d6c51b0 100644 --- a/indra/newview/tests/llsechandler_basic_test.cpp +++ b/indra/newview/tests/llsechandler_basic_test.cpp @@ -1217,8 +1217,8 @@ namespace tut  		// Single cert in the chain.  		X509_STORE_CTX *test_store = X509_STORE_CTX_new(); -		test_store->cert = mX509ChildCert;		 -		test_store->untrusted = NULL; +        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); +        X509_STORE_CTX_set0_untrusted(test_store, NULL);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 1);		 @@ -1229,9 +1229,9 @@ namespace tut  		// cert + CA  		test_store = X509_STORE_CTX_new(); -		test_store->cert = mX509ChildCert; -		test_store->untrusted = sk_X509_new_null(); -		sk_X509_push(test_store->untrusted, mX509IntermediateCert); +        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); +        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 2);	 @@ -1245,9 +1245,9 @@ namespace tut  		// cert + nonrelated  		test_store = X509_STORE_CTX_new(); -		test_store->cert = mX509ChildCert; -		test_store->untrusted = sk_X509_new_null(); -		sk_X509_push(test_store->untrusted, mX509TestCert); +        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); +        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 1);	 @@ -1257,10 +1257,10 @@ namespace tut  		// cert + CA + nonrelated  		test_store = X509_STORE_CTX_new(); -		test_store->cert = mX509ChildCert; -		test_store->untrusted = sk_X509_new_null(); -		sk_X509_push(test_store->untrusted, mX509IntermediateCert); -		sk_X509_push(test_store->untrusted, mX509TestCert); +        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); +        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509TestCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("two elements in store", test_chain->size(), 2);	 @@ -1273,10 +1273,10 @@ namespace tut  		// cert + intermediate + CA   		test_store = X509_STORE_CTX_new(); -		test_store->cert = mX509ChildCert; -		test_store->untrusted = sk_X509_new_null(); -		sk_X509_push(test_store->untrusted, mX509IntermediateCert); -		sk_X509_push(test_store->untrusted, mX509RootCert); +        X509_STORE_CTX_set_cert(test_store, mX509ChildCert); +        X509_STORE_CTX_set0_untrusted(test_store, sk_X509_new_null()); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509IntermediateCert); +		sk_X509_push(X509_STORE_CTX_get0_untrusted(test_store), mX509RootCert);  		test_chain = new LLBasicCertificateChain(test_store);  		X509_STORE_CTX_free(test_store);  		ensure_equals("three elements in store", test_chain->size(), 3);	 diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 41da8fa328..b932f43141 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -553,9 +553,13 @@ class WindowsManifest(ViewerManifest):                  self.path("vivoxsdk.dll")                  self.path("ortp.dll") -            # Security -            self.path("ssleay32.dll") -            self.path("libeay32.dll") +            # OpenSSL +            if (self.address_size == 64): +                self.path("libcrypto-1_1-x64.dll") +                self.path("libssl-1_1-x64.dll") +            else: +                self.path("libcrypto-1_1.dll") +                self.path("libssl-1_1.dll")              # HTTP/2              self.path("nghttp2.dll") @@ -1025,7 +1029,6 @@ class DarwinManifest(ViewerManifest):                                  "libapr-1.0.dylib",                                  "libaprutil-1.0.dylib",                                  "libexpat.1.dylib", -                                "libexception_handler.dylib",                                  "libGLOD.dylib",                                  # libnghttp2.dylib is a symlink to                                  # libnghttp2.major.dylib, which is a symlink to @@ -1294,14 +1297,19 @@ class DarwinManifest(ViewerManifest):                      signed=False                      sign_attempts=3                      sign_retry_wait=15 +                    libvlc_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_libvlc.dylib" +                    cef_path = app_in_dmg + "/Contents/Resources/llplugin/media_plugin_cef.dylib" +                    slplugin_path = app_in_dmg + "/Contents/Resources/SLPlugin.app/Contents/MacOS/SLPlugin" +                    greenlet_path = app_in_dmg + "/Contents/Resources/updater/greenlet/_greenlet.so"                      while (not signed) and (sign_attempts > 0):                          try: -                            sign_attempts-=1; -                            self.run_command( -                                # Note: See blurb above about names of keychains -                               ['codesign', '--verbose', '--deep', '--force', -                                '--keychain', viewer_keychain, '--sign', identity, -                                app_in_dmg]) +                            sign_attempts-=1 +                            # Note: See blurb above about names of keychains +                            self.run_command(['codesign', '--force', '--timestamp','--keychain', viewer_keychain, '--sign', identity, libvlc_path]) +                            self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, cef_path]) +                            self.run_command(['codesign', '--force', '--timestamp', '--keychain', viewer_keychain, '--sign', identity, greenlet_path]) +                            self.run_command(['codesign', '--verbose', '--deep', '--force', '--entitlements', self.src_path_of("slplugin.entitlements"), '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, slplugin_path]) +                            self.run_command(['codesign', '--verbose', '--deep', '--force', '--options', 'runtime', '--keychain', viewer_keychain, '--sign', identity, app_in_dmg])                              signed=True # if no exception was raised, the codesign worked                          except ManifestError as err:                              if sign_attempts: @@ -1312,6 +1320,7 @@ class DarwinManifest(ViewerManifest):                                  print >> sys.stderr, "Maximum codesign attempts exceeded; giving up"                                  raise                      self.run_command(['spctl', '-a', '-texec', '-vvvv', app_in_dmg]) +                    self.run_command([self.src_path_of("installers/darwin/apple-notarize.sh"), app_in_dmg])          finally:              # Unmount the image even if exceptions from any of the above  @@ -1364,7 +1373,7 @@ class LinuxManifest(ViewerManifest):          with self.prefix(dst="bin"):              self.path("secondlife-bin","do-not-directly-run-secondlife-bin")              self.path("../linux_crash_logger/linux-crash-logger","linux-crash-logger.bin") -            self.path2basename("../llplugin/slplugin", "SLPlugin")  +            self.path2basename("../llplugin/slplugin", "SLPlugin")              #this copies over the python wrapper script, associated utilities and required libraries, see SL-321, SL-322 and SL-323              with self.prefix(src="../viewer_components/manager", dst=""):                  self.path("*.py") | 
