Merge branch 'release/2025.07' of https://github.com/secondlife/viewer
# Conflicts: # indra/llwindow/llopenglview-objc.mmmaster
commit
a7fe0c1d78
|
|
@ -2656,11 +2656,11 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>c578c2a7f4355197d0ce8544310bc5e785531018</string>
|
||||
<string>e51fb1d24836d897ce90b8a72010635915b959d6</string>
|
||||
<key>hash_algorithm</key>
|
||||
<string>sha1</string>
|
||||
<key>url</key>
|
||||
<string>https://github.com/secondlife/3p-sse2neon/releases/download/v1.7.0-r2/sse2neon-1.7.0-dev0.gc8ad5f1.d20241212-common-12287325635.tar.zst</string>
|
||||
<string>https://github.com/secondlife/3p-sse2neon/releases/download/v1.8.0/sse2neon-1.8.0-common-17657389472.tar.zst</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
|
|
@ -2673,7 +2673,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<key>copyright</key>
|
||||
<string>Copyright (c) 2015-2024 SSE2NEON Contributors.</string>
|
||||
<key>version</key>
|
||||
<string>1.7.0-dev0.gc8ad5f1.d20241212</string>
|
||||
<string>1.8.0</string>
|
||||
<key>name</key>
|
||||
<string>sse2neon</string>
|
||||
<key>canonical_repo</key>
|
||||
|
|
|
|||
|
|
@ -34,7 +34,10 @@ add_compile_definitions(BOOST_BIND_GLOBAL_PLACEHOLDERS)
|
|||
|
||||
# Force enable SSE2 instructions in GLM per the manual
|
||||
# https://github.com/g-truc/glm/blob/master/manual.md#section2_10
|
||||
add_compile_definitions(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES=1 GLM_FORCE_SSE2=1 GLM_ENABLE_EXPERIMENTAL=1)
|
||||
add_compile_definitions(GLM_FORCE_DEFAULT_ALIGNED_GENTYPES=1 GLM_ENABLE_EXPERIMENTAL=1)
|
||||
|
||||
# SSE2NEON throws a pointless warning when compiler optimizations are enabled
|
||||
add_compile_definitions(SSE2NEON_SUPPRESS_WARNINGS=1)
|
||||
|
||||
# Configure crash reporting
|
||||
set(RELEASE_CRASH_REPORTING OFF CACHE BOOL "Enable use of crash reporting in release builds")
|
||||
|
|
|
|||
|
|
@ -154,19 +154,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|||
set(CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL "${CMAKE_MATCH_1}")
|
||||
message(STATUS "CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL = '${CMAKE_XCODE_ATTRIBUTE_GCC_OPTIMIZATION_LEVEL}'")
|
||||
|
||||
# allow disabling this check by setting LL_SKIP_REQUIRE_SYSROOT either ON as cmake cache var or non-empty as environment var
|
||||
# set(LL_SKIP_REQUIRE_SYSROOT OFF CACHE BOOL "Skip requirement to set toolchain sysroot ahead of time. Not skipped by default for consistency, but skipping can be useful for selecting alternative xcode versions side by side")
|
||||
# if("$ENV{LL_SKIP_REQUIRE_SYSROOT}" STREQUAL "" AND NOT ${LL_SKIP_REQUIRE_SYSROOT})
|
||||
# string(REGEX MATCHALL "[^ ]+" LL_BUILD_LIST "$ENV{LL_BUILD}")
|
||||
# list(FIND LL_BUILD_LIST "-iwithsysroot" sysroot_idx)
|
||||
# if ("${sysroot_idx}" LESS 0)
|
||||
# message(FATAL_ERROR "Environment variable LL_BUILD must contain '-iwithsysroot'")
|
||||
# endif ()
|
||||
# math(EXPR sysroot_idx "${sysroot_idx} + 1")
|
||||
# list(GET LL_BUILD_LIST "${sysroot_idx}" CMAKE_OSX_SYSROOT)
|
||||
# endif()
|
||||
# message(STATUS "CMAKE_OSX_SYSROOT = '${CMAKE_OSX_SYSROOT}'")
|
||||
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_STRICT_ALIASING NO)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_GCC_FAST_MATH NO)
|
||||
set(CMAKE_XCODE_ATTRIBUTE_CLANG_X86_VECTOR_INSTRUCTIONS sse4.2)
|
||||
|
|
|
|||
|
|
@ -279,7 +279,7 @@ void LLMD5::hex_digest(char* s) const
|
|||
}
|
||||
|
||||
#if LL_DARWIN
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
std::ostream& operator<<(std::ostream& stream, const LLMD5& context)
|
||||
|
|
|
|||
|
|
@ -320,7 +320,7 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECod
|
|||
// *TODO: This seems to be wrong. The base class should have no idea of
|
||||
// how j2c compression works so no good way of computing what's the byte
|
||||
// range to be used.
|
||||
mCodeStreamp->set_max_bytes(max_bytes);
|
||||
mCodeStreamp->set_max_bytes(max_bytes);
|
||||
|
||||
// If you want to flip or rotate the image for some reason, change
|
||||
// the resolution, or identify a restricted region of interest, this is
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
#import "llwindowmacosx-objc.h"
|
||||
#import "llappdelegate-objc.h"
|
||||
|
||||
#import <Carbon/Carbon.h>
|
||||
#import <Carbon/Carbon.h>
|
||||
|
||||
extern BOOL gHiDPISupport;
|
||||
|
||||
|
|
@ -66,16 +66,16 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
segment_standouts seg_standouts;
|
||||
NSRange effectiveRange;
|
||||
NSRange limitRange = NSMakeRange(0, [str length]);
|
||||
|
||||
|
||||
while (limitRange.length > 0) {
|
||||
NSNumber *attr = [str attribute:NSUnderlineStyleAttributeName atIndex:limitRange.location longestEffectiveRange:&effectiveRange inRange:limitRange];
|
||||
limitRange = NSMakeRange(NSMaxRange(effectiveRange), NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
|
||||
|
||||
|
||||
if (effectiveRange.length <= 0)
|
||||
{
|
||||
effectiveRange.length = 1;
|
||||
}
|
||||
|
||||
|
||||
if ([attr integerValue] == 2)
|
||||
{
|
||||
seg_lengths.push_back(effectiveRange.length);
|
||||
|
|
@ -98,12 +98,12 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
+ (NSScreen *)currentScreenForMouseLocation
|
||||
{
|
||||
NSPoint mouseLocation = [NSEvent mouseLocation];
|
||||
|
||||
|
||||
NSEnumerator *screenEnumerator = [[NSScreen screens] objectEnumerator];
|
||||
NSScreen *screen;
|
||||
while ((screen = [screenEnumerator nextObject]) && !NSMouseInRect(mouseLocation, screen.frame, NO))
|
||||
;
|
||||
|
||||
|
||||
return screen;
|
||||
}
|
||||
|
||||
|
|
@ -131,7 +131,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
{
|
||||
vram_megabytes = 256;
|
||||
}
|
||||
|
||||
|
||||
return (unsigned long)vram_megabytes; // return value is in megabytes.
|
||||
}
|
||||
|
||||
|
|
@ -140,15 +140,15 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(windowResized:) name:NSWindowDidResizeNotification
|
||||
object:[self window]];
|
||||
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(windowWillMiniaturize:) name:NSWindowWillMiniaturizeNotification
|
||||
object:[self window]];
|
||||
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(windowDidDeminiaturize:) name:NSWindowDidDeminiaturizeNotification
|
||||
object:[self window]];
|
||||
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||
selector:@selector(windowDidBecomeKey:) name:NSWindowDidBecomeKeyNotification
|
||||
object:[self window]];
|
||||
|
|
@ -226,7 +226,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
// <F/S>
|
||||
[self registerForDraggedTypes:[NSArray arrayWithObject:NSPasteboardTypeURL]];
|
||||
//[self initWithFrame:frame]; <FS> Fix some bad refcount code and squash some potential leakiness; by Cinder Roxley
|
||||
|
||||
|
||||
// Initialize with a default "safe" pixel format that will work with versions dating back to OS X 10.6.
|
||||
// Any specialized pixel formats, i.e. a core profile pixel format, should be initialized through rebuildContextWithFormat.
|
||||
// 10.7 and 10.8 don't really care if we're defining a profile or not. If we don't explicitly request a core or legacy profile, it'll always assume a legacy profile (for compatibility reasons).
|
||||
|
|
@ -244,37 +244,37 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core,
|
||||
0
|
||||
};
|
||||
|
||||
|
||||
NSOpenGLPixelFormat *pixelFormat = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attrs] autorelease];
|
||||
|
||||
|
||||
if (pixelFormat == nil)
|
||||
{
|
||||
NSLog(@"Failed to create pixel format!", nil);
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
// <FS> Fix some bad refcount code and squash some potential leakiness; by Cinder Roxley
|
||||
//NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
|
||||
NSOpenGLContext *glContext = [[[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil] autorelease];
|
||||
// </FS>
|
||||
|
||||
|
||||
if (glContext == nil)
|
||||
{
|
||||
NSLog(@"Failed to create OpenGL context!", nil);
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
[self setPixelFormat:pixelFormat];
|
||||
|
||||
//for retina support
|
||||
[self setWantsBestResolutionOpenGLSurface:gHiDPISupport];
|
||||
|
||||
[self setOpenGLContext:glContext];
|
||||
|
||||
|
||||
[glContext setView:self];
|
||||
|
||||
|
||||
[glContext makeCurrentContext];
|
||||
|
||||
|
||||
if (vsync)
|
||||
{
|
||||
GLint value = 1;
|
||||
|
|
@ -298,19 +298,19 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
- (BOOL) rebuildContextWithFormat:(NSOpenGLPixelFormat *)format
|
||||
{
|
||||
NSOpenGLContext *ctx = [self openGLContext];
|
||||
|
||||
|
||||
[ctx clearDrawable];
|
||||
// <FS> Fix some bad refcount code and squash some potential leakiness; by Cinder Roxley
|
||||
//[ctx initWithFormat:format shareContext:nil];
|
||||
ctx = [[[NSOpenGLContext alloc] initWithFormat:format shareContext:nil] autorelease];
|
||||
// </FS>
|
||||
|
||||
|
||||
if (ctx == nil)
|
||||
{
|
||||
NSLog(@"Failed to create OpenGL context!", nil);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
[self setOpenGLContext:ctx];
|
||||
[ctx setView:self];
|
||||
[ctx makeCurrentContext];
|
||||
|
|
@ -415,9 +415,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
float(dev_delta.x),
|
||||
float(dev_delta.y)
|
||||
};
|
||||
|
||||
|
||||
callDeltaUpdate(mouseDeltas, 0);
|
||||
|
||||
|
||||
NSPoint mPoint = [self convertPointToBacking:[theEvent locationInWindow]];
|
||||
mMousePos[0] = mPoint.x;
|
||||
mMousePos[1] = mPoint.y;
|
||||
|
|
@ -441,7 +441,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
|
||||
- (void) otherMouseDragged:(NSEvent *)theEvent
|
||||
{
|
||||
[self mouseDragged:theEvent];
|
||||
[self mouseDragged:theEvent];
|
||||
}
|
||||
|
||||
- (void) scrollWheel:(NSEvent *)theEvent
|
||||
|
|
@ -465,7 +465,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
{
|
||||
NativeKeyEventData eventData = extractKeyDataFromKeyEvent(theEvent);
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
|
||||
|
||||
|
||||
uint keycode = [theEvent keyCode];
|
||||
// We must not depend on flagsChange event to detect modifier flags changed,
|
||||
// must depend on the modifire flags in the event parameter.
|
||||
|
|
@ -499,13 +499,13 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
- (void)flagsChanged:(NSEvent *)theEvent
|
||||
{
|
||||
NativeKeyEventData eventData = extractKeyDataFromModifierEvent(theEvent);
|
||||
|
||||
|
||||
mModifiers = [theEvent modifierFlags];
|
||||
callModifier([theEvent modifierFlags]);
|
||||
|
||||
|
||||
NSInteger mask = 0;
|
||||
switch([theEvent keyCode])
|
||||
{
|
||||
{
|
||||
case kVK_Shift:
|
||||
mask = NSEventModifierFlagShift;
|
||||
break;
|
||||
|
|
@ -516,9 +516,9 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
mask = NSEventModifierFlagControl;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (mModifiers & mask)
|
||||
{
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYDOWN;
|
||||
|
|
@ -537,7 +537,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
{
|
||||
eventData.mKeyEvent = NativeKeyEventData::KEYUP;
|
||||
callKeyUp(&eventData, [theEvent keyCode], 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL) acceptsFirstResponder
|
||||
|
|
@ -549,11 +549,11 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
{
|
||||
NSPasteboard *pboard;
|
||||
NSDragOperation sourceDragMask;
|
||||
|
||||
|
||||
sourceDragMask = [sender draggingSourceOperationMask];
|
||||
|
||||
|
||||
pboard = [sender draggingPasteboard];
|
||||
|
||||
|
||||
if ([[pboard types] containsObject:NSPasteboardTypeURL])
|
||||
{
|
||||
if (sourceDragMask & NSDragOperationLink) {
|
||||
|
|
@ -568,7 +568,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender
|
||||
{
|
||||
callHandleDragUpdated(mLastDraggedUrl);
|
||||
|
||||
|
||||
return NSDragOperationLink;
|
||||
}
|
||||
|
||||
|
|
@ -622,12 +622,12 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
unsigned(selectedRange.location),
|
||||
unsigned(selectedRange.length)
|
||||
};
|
||||
|
||||
|
||||
unsigned int replacement[2] = {
|
||||
unsigned(replacementRange.location),
|
||||
unsigned(replacementRange.length)
|
||||
};
|
||||
|
||||
|
||||
int string_length = [aString length];
|
||||
unichar *text = new unichar[string_length];
|
||||
attributedStringInfo segments;
|
||||
|
|
@ -738,7 +738,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@try
|
||||
{
|
||||
if (!mHasMarkedText)
|
||||
|
|
@ -751,7 +751,7 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
resetPreedit();
|
||||
// We may never get this point since unmarkText may be called before insertText ever gets called once we submit our text.
|
||||
// But just in case...
|
||||
|
||||
|
||||
for (NSInteger i = 0; i < [aString length]; i++)
|
||||
{
|
||||
handleUnicodeCharacter([aString characterAtIndex:i]);
|
||||
|
|
|
|||
|
|
@ -2545,12 +2545,31 @@ A_STATIC void CasSetup(
|
|||
#endif
|
||||
|
||||
#ifdef A_GPU
|
||||
|
||||
#ifdef LEGACY_GAMMA
|
||||
uniform float gamma;
|
||||
|
||||
vec3 legacyGamma(vec3 color)
|
||||
{
|
||||
vec3 c = 1. - clamp(color, vec3(0.), vec3(1.));
|
||||
c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side
|
||||
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 diff = vec4(0.f);
|
||||
uvec2 point = uvec2(vary_fragcoord * out_screen_res.xy);
|
||||
CasFilter(diff.r, diff.g, diff.b, point, cas_param_0, cas_param_1, true);
|
||||
diff.a = texture(diffuseRect, vary_fragcoord).a;
|
||||
diff.rgb = linear_to_srgb(diff.rgb);
|
||||
|
||||
#ifdef LEGACY_GAMMA
|
||||
diff.rgb = legacyGamma(diff.rgb);
|
||||
#endif
|
||||
|
||||
frag_color = diff;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@ vec3 legacyGamma(vec3 color)
|
|||
return c;
|
||||
}
|
||||
|
||||
vec3 clampHDRRange(vec3 color);
|
||||
|
||||
void main()
|
||||
{
|
||||
//this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)
|
||||
|
|
@ -55,7 +53,7 @@ void main()
|
|||
diff.rgb = legacyGamma(diff.rgb);
|
||||
#endif
|
||||
|
||||
diff.rgb = clampHDRRange(diff.rgb);
|
||||
diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0));
|
||||
frag_color = diff;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,11 +31,25 @@ uniform sampler2D diffuseRect;
|
|||
|
||||
in vec2 vary_fragcoord;
|
||||
|
||||
#ifdef GAMMA_CORRECT
|
||||
uniform float gamma;
|
||||
#endif
|
||||
|
||||
vec3 linear_to_srgb(vec3 cl);
|
||||
vec3 toneMap(vec3 color);
|
||||
|
||||
vec3 clampHDRRange(vec3 color);
|
||||
|
||||
#ifdef GAMMA_CORRECT
|
||||
vec3 legacyGamma(vec3 color)
|
||||
{
|
||||
vec3 c = 1. - clamp(color, vec3(0.), vec3(1.));
|
||||
c = 1. - pow(c, vec3(gamma)); // s/b inverted already CPU-side
|
||||
|
||||
return c;
|
||||
}
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
//this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)
|
||||
|
|
@ -47,8 +61,18 @@ void main()
|
|||
diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0));
|
||||
#endif
|
||||
|
||||
diff.rgb = clampHDRRange(diff.rgb);
|
||||
#ifdef GAMMA_CORRECT
|
||||
diff.rgb = linear_to_srgb(diff.rgb);
|
||||
|
||||
#ifdef LEGACY_GAMMA
|
||||
diff.rgb = legacyGamma(diff.rgb);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
diff.rgb = clamp(diff.rgb, vec3(0.0), vec3(1.0)); // We should always be 0-1 past this point
|
||||
|
||||
//debugExposure(diff.rgb);
|
||||
frag_color = max(diff, vec4(0));
|
||||
frag_color = diff;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6592,6 +6592,8 @@ void LLAppViewer::forceErrorBreakpoint()
|
|||
#else
|
||||
#if defined(LL_X86) || defined(LL_X86_64)
|
||||
asm ("int $3");
|
||||
#else
|
||||
__builtin_trap();
|
||||
#endif
|
||||
#endif
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -198,6 +198,10 @@ LLGLSLShader gDeferredCoFProgram;
|
|||
LLGLSLShader gDeferredDoFCombineProgram;
|
||||
LLGLSLShader gDeferredPostTonemapProgram;
|
||||
LLGLSLShader gNoPostTonemapProgram;
|
||||
LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
|
||||
LLGLSLShader gNoPostTonemapGammaCorrectProgram;
|
||||
LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
|
||||
LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
|
||||
LLGLSLShader gDeferredPostGammaCorrectProgram;
|
||||
LLGLSLShader gLegacyPostGammaCorrectProgram;
|
||||
LLGLSLShader gExposureProgram;
|
||||
|
|
@ -208,6 +212,7 @@ LLGLSLShader gSMAAEdgeDetectProgram[4];
|
|||
LLGLSLShader gSMAABlendWeightsProgram[4];
|
||||
LLGLSLShader gSMAANeighborhoodBlendProgram[4];
|
||||
LLGLSLShader gCASProgram;
|
||||
LLGLSLShader gCASLegacyGammaProgram;
|
||||
LLGLSLShader gDeferredPostNoDoFProgram;
|
||||
LLGLSLShader gDeferredPostNoDoFNoiseProgram;
|
||||
LLGLSLShader gDeferredWLSkyProgram;
|
||||
|
|
@ -448,6 +453,11 @@ void LLViewerShaderMgr::finalizeShaderList()
|
|||
mShaderList.push_back(&gHUDPBRAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredPostTonemapProgram);
|
||||
mShaderList.push_back(&gNoPostTonemapProgram);
|
||||
mShaderList.push_back(&gDeferredPostTonemapGammaCorrectProgram);
|
||||
mShaderList.push_back(&gNoPostTonemapGammaCorrectProgram);
|
||||
mShaderList.push_back(&gDeferredPostTonemapLegacyGammaCorrectProgram);
|
||||
mShaderList.push_back(&gNoPostTonemapLegacyGammaCorrectProgram);
|
||||
mShaderList.push_back(&gCASLegacyGammaProgram);
|
||||
mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma
|
||||
mShaderList.push_back(&gLegacyPostGammaCorrectProgram);
|
||||
mShaderList.push_back(&gDeferredDiffuseProgram);
|
||||
|
|
@ -1146,6 +1156,11 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gLegacyPostGammaCorrectProgram.unload();
|
||||
gDeferredPostTonemapProgram.unload();
|
||||
gNoPostTonemapProgram.unload();
|
||||
gDeferredPostTonemapGammaCorrectProgram.unload();
|
||||
gNoPostTonemapGammaCorrectProgram.unload();
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.unload();
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.unload();
|
||||
|
||||
for (auto i = 0; i < 4; ++i)
|
||||
{
|
||||
gFXAAProgram[i].unload();
|
||||
|
|
@ -1154,6 +1169,7 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
gSMAANeighborhoodBlendProgram[i].unload();
|
||||
}
|
||||
gCASProgram.unload();
|
||||
gCASLegacyGammaProgram.unload();
|
||||
gEnvironmentMapProgram.unload();
|
||||
gDeferredWLSkyProgram.unload();
|
||||
gDeferredWLCloudProgram.unload();
|
||||
|
|
@ -2519,6 +2535,74 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredPostTonemapGammaCorrectProgram.mName = "Deferred Tonemap Gamma Post Process";
|
||||
gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
|
||||
gDeferredPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
|
||||
gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.clear();
|
||||
gDeferredPostTonemapGammaCorrectProgram.clearPermutations();
|
||||
gDeferredPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
|
||||
gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredPostTonemapGammaCorrectProgram.createShader();
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gNoPostTonemapGammaCorrectProgram.mName = "No Post Tonemap Gamma Post Process";
|
||||
gNoPostTonemapGammaCorrectProgram.mFeatures.hasSrgb = true;
|
||||
gNoPostTonemapGammaCorrectProgram.mFeatures.isDeferred = true;
|
||||
gNoPostTonemapGammaCorrectProgram.mFeatures.hasTonemap = true;
|
||||
gNoPostTonemapGammaCorrectProgram.mShaderFiles.clear();
|
||||
gNoPostTonemapGammaCorrectProgram.clearPermutations();
|
||||
gNoPostTonemapGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
|
||||
gNoPostTonemapGammaCorrectProgram.addPermutation("NO_POST", "1");
|
||||
gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gNoPostTonemapGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
|
||||
gNoPostTonemapGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gNoPostTonemapGammaCorrectProgram.createShader();
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mName = "Deferred Tonemap Legacy Gamma Post Process";
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
|
||||
gDeferredPostTonemapProgram.mFeatures.isDeferred = true;
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.clearPermutations();
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredPostTonemapLegacyGammaCorrectProgram.createShader();
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mName = "No Post Tonemap Legacy Gamma Post Process";
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasSrgb = true;
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.isDeferred = true;
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mFeatures.hasTonemap = true;
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.clear();
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.clearPermutations();
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("NO_POST", "1");
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("GAMMA_CORRECT", "1");
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.addPermutation("LEGACY_GAMMA", "1");
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredTonemap.glsl", GL_FRAGMENT_SHADER));
|
||||
gNoPostTonemapLegacyGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gNoPostTonemapLegacyGammaCorrectProgram.createShader();
|
||||
llassert(success);
|
||||
}
|
||||
|
||||
if (success && gGLManager.mGLVersion > 3.9f)
|
||||
{
|
||||
std::vector<std::pair<std::string, std::string>> quality_levels = { {"12", "Low"},
|
||||
|
|
@ -2702,6 +2786,27 @@ bool LLViewerShaderMgr::loadShadersDeferred()
|
|||
}
|
||||
}
|
||||
|
||||
if (success && gGLManager.mGLVersion > 4.05f)
|
||||
{
|
||||
gCASLegacyGammaProgram.mName = "Contrast Adaptive Sharpening Legacy Gamma Shader";
|
||||
gCASLegacyGammaProgram.mFeatures.hasSrgb = true;
|
||||
gCASLegacyGammaProgram.mShaderFiles.clear();
|
||||
gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
|
||||
gCASLegacyGammaProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER));
|
||||
gCASLegacyGammaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gCASLegacyGammaProgram.clearPermutations();
|
||||
gCASLegacyGammaProgram.addPermutation("GAMMA_CORRECT", "1");
|
||||
gCASLegacyGammaProgram.addPermutation("LEGACY_GAMMA", "1");
|
||||
success = gCASLegacyGammaProgram.createShader();
|
||||
// llassert(success);
|
||||
if (!success)
|
||||
{
|
||||
LL_WARNS() << "Failed to create shader '" << gCASProgram.mName << "', disabling!" << LL_ENDL;
|
||||
// continue as if this shader never happened
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredPostProgram.mName = "Deferred Post Shader";
|
||||
|
|
|
|||
|
|
@ -252,12 +252,17 @@ extern LLGLSLShader gSMAAEdgeDetectProgram[4];
|
|||
extern LLGLSLShader gSMAABlendWeightsProgram[4];
|
||||
extern LLGLSLShader gSMAANeighborhoodBlendProgram[4];
|
||||
extern LLGLSLShader gCASProgram;
|
||||
extern LLGLSLShader gCASLegacyGammaProgram;
|
||||
extern LLGLSLShader gDeferredPostNoDoFProgram;
|
||||
extern LLGLSLShader gDeferredPostNoDoFNoiseProgram;
|
||||
extern LLGLSLShader gDeferredPostGammaCorrectProgram;
|
||||
extern LLGLSLShader gLegacyPostGammaCorrectProgram;
|
||||
extern LLGLSLShader gDeferredPostTonemapProgram;
|
||||
extern LLGLSLShader gNoPostTonemapProgram;
|
||||
extern LLGLSLShader gDeferredPostTonemapGammaCorrectProgram;
|
||||
extern LLGLSLShader gNoPostTonemapGammaCorrectProgram;
|
||||
extern LLGLSLShader gDeferredPostTonemapLegacyGammaCorrectProgram;
|
||||
extern LLGLSLShader gNoPostTonemapLegacyGammaCorrectProgram;
|
||||
extern LLGLSLShader gExposureProgram;
|
||||
extern LLGLSLShader gExposureProgramNoFade;
|
||||
extern LLGLSLShader gLuminanceProgram;
|
||||
|
|
|
|||
|
|
@ -292,9 +292,6 @@ static const F32 MIN_DISPLAY_SCALE = 0.75f;
|
|||
// <FS:Ansariel> FIRE-31852: Now it aggressively executes gestures within focussed floaters...
|
||||
//static const char KEY_MOUSELOOK = 'M';
|
||||
|
||||
static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
|
||||
static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
|
||||
|
||||
LLTrace::SampleStatHandle<> LLViewerWindow::sMouseVelocityStat("Mouse Velocity");
|
||||
|
||||
class RecordToChatConsoleRecorder : public LLError::Recorder
|
||||
|
|
@ -2155,6 +2152,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
|
||||
std::string LLViewerWindow::getLastSnapshotDir()
|
||||
{
|
||||
static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
|
||||
return sSnapshotDir;
|
||||
}
|
||||
|
||||
|
|
@ -5861,6 +5859,7 @@ void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picke
|
|||
// Get a base file location if needed.
|
||||
if (force_picker || !isSnapshotLocSet())
|
||||
{
|
||||
static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
|
||||
std::string proposed_name(sSnapshotBaseName);
|
||||
|
||||
// getSaveFile will append an appropriate extension to the proposed name, based on the ESaveFilter constant passed in.
|
||||
|
|
@ -5959,6 +5958,9 @@ void LLViewerWindow::saveImageLocal(LLImageFormatted *image, const snapshot_save
|
|||
// Shouldn't there be a return here?
|
||||
}
|
||||
|
||||
static LLCachedControl<std::string> sSnapshotBaseName(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseName", "Snapshot"));
|
||||
static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
|
||||
|
||||
// Look for an unused file name
|
||||
auto is_snapshot_name_loc_set = isSnapshotLocSet();
|
||||
std::string filepath;
|
||||
|
|
@ -6095,8 +6097,8 @@ void LLViewerWindow::playSnapshotAnimAndSound()
|
|||
|
||||
bool LLViewerWindow::isSnapshotLocSet() const
|
||||
{
|
||||
std::string snapshot_dir = sSnapshotDir;
|
||||
return !snapshot_dir.empty();
|
||||
static LLCachedControl<std::string> sSnapshotDir(LLCachedControl<std::string>(gSavedPerAccountSettings, "SnapshotBaseDir", ""));
|
||||
return !sSnapshotDir().empty();
|
||||
}
|
||||
|
||||
void LLViewerWindow::resetSnapshotLoc() const
|
||||
|
|
|
|||
|
|
@ -7419,7 +7419,7 @@ void LLPipeline::generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool
|
|||
|
||||
extern LLPointer<LLImageGL> gEXRImage;
|
||||
|
||||
void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
|
||||
void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct)
|
||||
{
|
||||
LL_PROFILE_GPU_ZONE("tonemap");
|
||||
|
||||
|
|
@ -7437,17 +7437,33 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
|
|||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
|
||||
bool no_post = gSnapshotNoPost || psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f || (buildNoPost && gFloaterTools && gFloaterTools->isAvailable());
|
||||
LLGLSLShader& shader = no_post ? gNoPostTonemapProgram : gDeferredPostTonemapProgram;
|
||||
LLGLSLShader* shader = nullptr;
|
||||
if(gamma_correct)
|
||||
{
|
||||
bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f;
|
||||
if(legacy_gamma)
|
||||
{
|
||||
shader = no_post ? &gNoPostTonemapLegacyGammaCorrectProgram : &gDeferredPostTonemapLegacyGammaCorrectProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
shader = no_post ? &gNoPostTonemapGammaCorrectProgram : &gDeferredPostTonemapGammaCorrectProgram;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
shader = no_post ? &gNoPostTonemapProgram : &gDeferredPostTonemapProgram;
|
||||
}
|
||||
|
||||
shader.bind();
|
||||
shader->bind();
|
||||
|
||||
S32 channel = 0;
|
||||
|
||||
shader.bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
|
||||
shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
|
||||
|
||||
shader.bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap);
|
||||
shader->bindTexture(LLShaderMgr::EXPOSURE_MAP, &mExposureMap);
|
||||
|
||||
shader.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
|
||||
shader->uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, (GLfloat)src->getWidth(), (GLfloat)src->getHeight());
|
||||
|
||||
static LLCachedControl<F32> exposure(gSavedSettings, "RenderExposure", 1.f);
|
||||
|
||||
|
|
@ -7457,17 +7473,17 @@ void LLPipeline::tonemap(LLRenderTarget* src, LLRenderTarget* dst)
|
|||
static LLStaticHashedString tonemap_mix("tonemap_mix");
|
||||
static LLStaticHashedString tonemap_type("tonemap_type");
|
||||
|
||||
shader.uniform1f(s_exposure, e);
|
||||
shader->uniform1f(s_exposure, e);
|
||||
|
||||
static LLCachedControl<U32> tonemap_type_setting(gSavedSettings, "RenderTonemapType", 0U);
|
||||
shader.uniform1i(tonemap_type, tonemap_type_setting);
|
||||
shader.uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
|
||||
shader->uniform1i(tonemap_type, tonemap_type_setting);
|
||||
shader->uniform1f(tonemap_mix, psky->getTonemapMix(should_auto_adjust()));
|
||||
|
||||
mScreenTriangleVB->setBuffer();
|
||||
mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
|
||||
gGL.getTexUnit(channel)->unbind(src->getUsage());
|
||||
shader.unbind();
|
||||
shader->unbind();
|
||||
}
|
||||
dst->flush();
|
||||
}
|
||||
|
|
@ -7641,13 +7657,21 @@ void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
|
|||
{
|
||||
static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
|
||||
LL_PROFILE_GPU_ZONE("cas");
|
||||
if (cas_sharpness == 0.0f || !gCASProgram.isComplete())
|
||||
if (cas_sharpness == 0.0f || !gCASProgram.isComplete() || !gCASLegacyGammaProgram.isComplete())
|
||||
{
|
||||
gPipeline.copyRenderTarget(src, dst);
|
||||
return;
|
||||
}
|
||||
|
||||
LLGLSLShader* sharpen_shader = &gCASProgram;
|
||||
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", false);
|
||||
|
||||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
bool legacy_gamma = psky->getReflectionProbeAmbiance(should_auto_adjust) == 0.f;
|
||||
if(legacy_gamma)
|
||||
{
|
||||
sharpen_shader = &gCASLegacyGammaProgram;
|
||||
}
|
||||
|
||||
// Bind setup:
|
||||
dst->bindTarget();
|
||||
|
|
@ -8443,7 +8467,6 @@ void LLPipeline::renderFinalize()
|
|||
|
||||
static LLCachedControl<bool> has_hdr(gSavedSettings, "RenderHDREnabled", true);
|
||||
bool hdr = gGLManager.mGLVersion > 4.05f && has_hdr();
|
||||
LLRenderTarget* postHDRBuffer = &mRT->screen;
|
||||
if (hdr)
|
||||
{
|
||||
copyScreenSpaceReflections(&mRT->screen, &mSceneMap);
|
||||
|
|
@ -8452,21 +8475,21 @@ void LLPipeline::renderFinalize()
|
|||
|
||||
generateExposure(&mLuminanceMap, &mExposureMap);
|
||||
|
||||
tonemap(&mRT->screen, &mRT->deferredLight);
|
||||
|
||||
static LLCachedControl<F32> cas_sharpness(gSavedSettings, "RenderCASSharpness", 0.4f);
|
||||
if (cas_sharpness != 0.0f && gCASProgram.isComplete())
|
||||
bool apply_cas = cas_sharpness != 0.0f && gCASProgram.isComplete() && gCASLegacyGammaProgram.isComplete();
|
||||
|
||||
tonemap(&mRT->screen, apply_cas ? &mRT->deferredLight : &mPostPingMap, !apply_cas);
|
||||
|
||||
if (apply_cas)
|
||||
{
|
||||
applyCAS(&mRT->deferredLight, &mRT->screen);
|
||||
postHDRBuffer = &mRT->screen;
|
||||
}
|
||||
else
|
||||
{
|
||||
postHDRBuffer = &mRT->deferredLight;
|
||||
// Gamma Corrects
|
||||
applyCAS(&mRT->deferredLight, &mPostPingMap);
|
||||
}
|
||||
}
|
||||
|
||||
gammaCorrect(postHDRBuffer, &mPostPingMap);
|
||||
else
|
||||
{
|
||||
gammaCorrect(&mRT->screen, &mPostPingMap);
|
||||
}
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ public:
|
|||
void copyScreenSpaceReflections(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void generateLuminance(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);
|
||||
void tonemap(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void tonemap(LLRenderTarget* src, LLRenderTarget* dst, bool gamma_correct);
|
||||
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
void generateGlow(LLRenderTarget* src);
|
||||
void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
|
||||
|
|
|
|||
Loading…
Reference in New Issue