Skip to content

Commit cbca178

Browse files
committed
Add Contrast Adaptive Sharpening post process effect(#2399)
1 parent 45b2d69 commit cbca178

File tree

11 files changed

+2732
-5
lines changed

11 files changed

+2732
-5
lines changed

indra/llrender/llglslshader.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,6 +1552,34 @@ void LLGLSLShader::uniform4fv(U32 index, U32 count, const GLfloat* v)
15521552
}
15531553
}
15541554

1555+
void LLGLSLShader::uniform4uiv(U32 index, U32 count, const GLuint* v)
1556+
{
1557+
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
1558+
llassert(sCurBoundShaderPtr == this);
1559+
1560+
if (mProgramObject)
1561+
{
1562+
if (mUniform.size() <= index)
1563+
{
1564+
LL_WARNS_ONCE("Shader") << "Uniform index out of bounds. Size: " << (S32)mUniform.size() << " index: " << index << LL_ENDL;
1565+
llassert(false);
1566+
return;
1567+
}
1568+
1569+
if (mUniform[index] >= 0)
1570+
{
1571+
const auto& iter = mValue.find(mUniform[index]);
1572+
LLVector4 vec((F32)v[0], (F32)v[1], (F32)v[2], (F32)v[3]);
1573+
if (iter == mValue.end() || shouldChange(iter->second, vec) || count != 1)
1574+
{
1575+
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
1576+
glUniform4uiv(mUniform[index], count, v);
1577+
mValue[mUniform[index]] = vec;
1578+
}
1579+
}
1580+
}
1581+
}
1582+
15551583
void LLGLSLShader::uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v)
15561584
{
15571585
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
@@ -1886,6 +1914,24 @@ void LLGLSLShader::uniform4fv(const LLStaticHashedString& uniform, U32 count, co
18861914
}
18871915
}
18881916

1917+
void LLGLSLShader::uniform4uiv(const LLStaticHashedString& uniform, U32 count, const GLuint* v)
1918+
{
1919+
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
1920+
GLint location = getUniformLocation(uniform);
1921+
1922+
if (location >= 0)
1923+
{
1924+
LLVector4 vec((F32)v[0], (F32)v[1], (F32)v[2], (F32)v[3]);
1925+
const auto& iter = mValue.find(location);
1926+
if (iter == mValue.end() || shouldChange(iter->second, vec) || count != 1)
1927+
{
1928+
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;
1929+
glUniform4uiv(location, count, v);
1930+
mValue[location] = vec;
1931+
}
1932+
}
1933+
}
1934+
18891935
void LLGLSLShader::uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat* v)
18901936
{
18911937
LL_PROFILE_ZONE_SCOPED_CATEGORY_SHADER;

indra/llrender/llglslshader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ class LLGLSLShader
208208
void uniform2fv(U32 index, U32 count, const GLfloat* v);
209209
void uniform3fv(U32 index, U32 count, const GLfloat* v);
210210
void uniform4fv(U32 index, U32 count, const GLfloat* v);
211+
void uniform4uiv(U32 index, U32 count, const GLuint* v);
211212
void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
212213
void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v);
213214
void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat* v);
@@ -223,6 +224,7 @@ class LLGLSLShader
223224
void uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
224225
void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
225226
void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
227+
void uniform4uiv(const LLStaticHashedString& uniform, U32 count, const GLuint* v);
226228
void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat* v);
227229

228230
void setMinimumAlpha(F32 minimum);

indra/newview/app_settings/settings.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9810,6 +9810,17 @@
98109810
<key>Value</key>
98119811
<string>00000000-0000-0000-0000-000000000000</string>
98129812
</map>
9813+
<key>RenderCASSharpness</key>
9814+
<map>
9815+
<key>Comment</key>
9816+
<string>Level of sharpening to apply via Contrast Adaptive Sharpening (0.0(off) - 1.0)</string>
9817+
<key>Persist</key>
9818+
<integer>1</integer>
9819+
<key>Type</key>
9820+
<string>F32</string>
9821+
<key>Value</key>
9822+
<real>0.4</real>
9823+
</map>
98139824
<key>ReplaySession</key>
98149825
<map>
98159826
<key>Comment</key>

indra/newview/app_settings/shaders/class1/deferred/CASF.glsl

Lines changed: 2558 additions & 0 deletions
Large diffs are not rendered by default.

indra/newview/featuretable.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ RenderHeroProbeDistance 1 16
7979
RenderHeroProbeUpdateRate 1 4
8080
RenderHeroProbeConservativeUpdateMultiplier 1 16
8181
RenderDownScaleMethod 1 1
82+
RenderCASSharpness 1 1
8283

8384

8485
//
@@ -115,6 +116,7 @@ RenderHeroProbeResolution 1 256
115116
RenderHeroProbeDistance 1 4
116117
RenderHeroProbeUpdateRate 1 6
117118
RenderHeroProbeConservativeUpdateMultiplier 1 16
119+
RenderCASSharpness 1 0
118120

119121
//
120122
// Medium Low Graphics Settings
@@ -150,6 +152,7 @@ RenderHeroProbeResolution 1 256
150152
RenderHeroProbeDistance 1 6
151153
RenderHeroProbeUpdateRate 1 3
152154
RenderHeroProbeConservativeUpdateMultiplier 1 16
155+
RenderCASSharpness 1 0
153156

154157
//
155158
// Medium Graphics Settings (standard)
@@ -185,6 +188,7 @@ RenderHeroProbeResolution 1 512
185188
RenderHeroProbeDistance 1 6
186189
RenderHeroProbeUpdateRate 1 3
187190
RenderHeroProbeConservativeUpdateMultiplier 1 16
191+
RenderCASSharpness 1 0
188192

189193
//
190194
// Medium High Graphics Settings
@@ -220,6 +224,7 @@ RenderHeroProbeResolution 1 512
220224
RenderHeroProbeDistance 1 6
221225
RenderHeroProbeUpdateRate 1 2
222226
RenderHeroProbeConservativeUpdateMultiplier 1 8
227+
RenderCASSharpness 1 0
223228

224229
//
225230
// High Graphics Settings (SSAO + sun shadows)
@@ -255,6 +260,7 @@ RenderHeroProbeResolution 1 512
255260
RenderHeroProbeDistance 1 8
256261
RenderHeroProbeUpdateRate 1 2
257262
RenderHeroProbeConservativeUpdateMultiplier 1 8
263+
RenderCASSharpness 1 0.4
258264

259265
//
260266
// High Ultra Graphics Settings (deferred + SSAO + all shadows)
@@ -290,6 +296,7 @@ RenderHeroProbeResolution 1 1024
290296
RenderHeroProbeDistance 1 16
291297
RenderHeroProbeUpdateRate 1 1
292298
RenderHeroProbeConservativeUpdateMultiplier 1 4
299+
RenderCASSharpness 1 0.4
293300

294301
//
295302
// Ultra graphics (REALLY PURTY!)
@@ -325,6 +332,7 @@ RenderHeroProbeResolution 1 2048
325332
RenderHeroProbeDistance 1 16
326333
RenderHeroProbeUpdateRate 1 1
327334
RenderHeroProbeConservativeUpdateMultiplier 1 4
335+
RenderCASSharpness 1 0.4
328336

329337
//
330338
// Class Unknown Hardware (unknown)

indra/newview/featuretable_mac.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ RenderHeroProbeResolution 1 2048
7777
RenderHeroProbeDistance 1 16
7878
RenderHeroProbeUpdateRate 1 4
7979
RenderHeroProbeConservativeUpdateMultiplier 1 16
80+
RenderCASSharpness 1 1
8081

8182
//
8283
// Low Graphics Settings
@@ -112,6 +113,7 @@ RenderHeroProbeResolution 1 256
112113
RenderHeroProbeDistance 1 4
113114
RenderHeroProbeUpdateRate 1 6
114115
RenderHeroProbeConservativeUpdateMultiplier 1 16
116+
RenderCASSharpness 1 0
115117

116118
//
117119
// Medium Low Graphics Settings
@@ -147,6 +149,7 @@ RenderHeroProbeResolution 1 256
147149
RenderHeroProbeDistance 1 6
148150
RenderHeroProbeUpdateRate 1 3
149151
RenderHeroProbeConservativeUpdateMultiplier 1 16
152+
RenderCASSharpness 1 0
150153

151154
//
152155
// Medium Graphics Settings (standard)
@@ -182,6 +185,7 @@ RenderHeroProbeResolution 1 512
182185
RenderHeroProbeDistance 1 6
183186
RenderHeroProbeUpdateRate 1 3
184187
RenderHeroProbeConservativeUpdateMultiplier 1 16
188+
RenderCASSharpness 1 0
185189

186190
//
187191
// Medium High Graphics Settings
@@ -217,6 +221,7 @@ RenderHeroProbeResolution 1 512
217221
RenderHeroProbeDistance 1 6
218222
RenderHeroProbeUpdateRate 1 2
219223
RenderHeroProbeConservativeUpdateMultiplier 1 8
224+
RenderCASSharpness 1 0
220225

221226
//
222227
// High Graphics Settings (SSAO + sun shadows)
@@ -252,6 +257,7 @@ RenderHeroProbeResolution 1 512
252257
RenderHeroProbeDistance 1 8
253258
RenderHeroProbeUpdateRate 1 2
254259
RenderHeroProbeConservativeUpdateMultiplier 1 8
260+
RenderCASSharpness 1 0
255261

256262
//
257263
// High Ultra Graphics Settings (SSAO + all shadows)
@@ -287,6 +293,7 @@ RenderHeroProbeResolution 1 512
287293
RenderHeroProbeDistance 1 16
288294
RenderHeroProbeUpdateRate 1 1
289295
RenderHeroProbeConservativeUpdateMultiplier 1 4
296+
RenderCASSharpness 1 0.4
290297

291298
//
292299
// Ultra graphics (REALLY PURTY!)
@@ -322,6 +329,7 @@ RenderHeroProbeResolution 1 1024
322329
RenderHeroProbeDistance 1 16
323330
RenderHeroProbeUpdateRate 1 1
324331
RenderHeroProbeConservativeUpdateMultiplier 1 4
332+
RenderCASSharpness 1 0.4
325333

326334
//
327335
// Class Unknown Hardware (unknown)

indra/newview/llviewershadermgr.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ LLGLSLShader gExposureProgram;
201201
LLGLSLShader gExposureProgramNoFade;
202202
LLGLSLShader gLuminanceProgram;
203203
LLGLSLShader gFXAAProgram;
204+
LLGLSLShader gCASProgram;
204205
LLGLSLShader gDeferredPostNoDoFProgram;
205206
LLGLSLShader gDeferredWLSkyProgram;
206207
LLGLSLShader gEnvironmentMapProgram;
@@ -2349,6 +2350,17 @@ bool LLViewerShaderMgr::loadShadersDeferred()
23492350
llassert(success);
23502351
}
23512352

2353+
if (success)
2354+
{
2355+
gCASProgram.mName = "Contrast Adaptive Sharpening Shader";
2356+
gCASProgram.mFeatures.hasSrgb = true;
2357+
gCASProgram.mShaderFiles.clear();
2358+
gCASProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));
2359+
gCASProgram.mShaderFiles.push_back(make_pair("deferred/CASF.glsl", GL_FRAGMENT_SHADER));
2360+
gCASProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
2361+
gCASProgram.createShader();
2362+
}
2363+
23522364
if (success)
23532365
{
23542366
gDeferredPostProgram.mName = "Deferred Post Shader";

indra/newview/llviewershadermgr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ extern LLGLSLShader gDeferredPostProgram;
246246
extern LLGLSLShader gDeferredCoFProgram;
247247
extern LLGLSLShader gDeferredDoFCombineProgram;
248248
extern LLGLSLShader gFXAAProgram;
249+
extern LLGLSLShader gCASProgram;
249250
extern LLGLSLShader gDeferredPostNoDoFProgram;
250251
extern LLGLSLShader gDeferredPostGammaCorrectProgram;
251252
extern LLGLSLShader gNoPostGammaCorrectProgram;

indra/newview/pipeline.cpp

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,17 @@
117117
#include "llenvironment.h"
118118
#include "llsettingsvo.h"
119119

120+
#ifndef LL_WINDOWS
121+
#define A_GCC 1
122+
#pragma GCC diagnostic ignored "-Wunused-function"
123+
#pragma GCC diagnostic ignored "-Wunused-variable"
124+
#if LL_LINUX
125+
#pragma GCC diagnostic ignored "-Wrestrict"
126+
#endif
127+
#endif
128+
#define A_CPU 1
129+
#include "app_settings/shaders/class1/deferred/CASF.glsl" // This is also C++
130+
120131
extern bool gSnapshot;
121132
bool gShiftFrame = false;
122133

@@ -202,6 +213,7 @@ S32 LLPipeline::RenderBufferVisualization;
202213
bool LLPipeline::RenderMirrors;
203214
S32 LLPipeline::RenderHeroProbeUpdateRate;
204215
S32 LLPipeline::RenderHeroProbeConservativeUpdateMultiplier;
216+
F32 LLPipeline::RenderCASSharpness;
205217
LLTrace::EventStatHandle<S64> LLPipeline::sStatBatchSize("renderbatchsize");
206218

207219
const U32 LLPipeline::MAX_BAKE_WIDTH = 512;
@@ -564,6 +576,7 @@ void LLPipeline::init()
564576
connectRefreshCachedSettingsSafe("RenderMirrors");
565577
connectRefreshCachedSettingsSafe("RenderHeroProbeUpdateRate");
566578
connectRefreshCachedSettingsSafe("RenderHeroProbeConservativeUpdateMultiplier");
579+
connectRefreshCachedSettingsSafe("RenderCASSharpness");
567580
gSavedSettings.getControl("RenderAutoHideSurfaceAreaLimit")->getCommitSignal()->connect(boost::bind(&LLPipeline::refreshCachedSettings));
568581
}
569582

@@ -1081,6 +1094,7 @@ void LLPipeline::refreshCachedSettings()
10811094
RenderMirrors = gSavedSettings.getBOOL("RenderMirrors");
10821095
RenderHeroProbeUpdateRate = gSavedSettings.getS32("RenderHeroProbeUpdateRate");
10831096
RenderHeroProbeConservativeUpdateMultiplier = gSavedSettings.getS32("RenderHeroProbeConservativeUpdateMultiplier");
1097+
RenderCASSharpness = gSavedSettings.getF32("RenderCASSharpness");
10841098

10851099
sReflectionProbesEnabled = LLFeatureManager::getInstance()->isFeatureAvailable("RenderReflectionsEnabled") && gSavedSettings.getBOOL("RenderReflectionsEnabled");
10861100
RenderSpotLight = nullptr;
@@ -7133,6 +7147,50 @@ void LLPipeline::generateGlow(LLRenderTarget* src)
71337147
}
71347148
}
71357149

7150+
void LLPipeline::applyCAS(LLRenderTarget* src, LLRenderTarget* dst)
7151+
{
7152+
if (RenderCASSharpness == 0.0)
7153+
{
7154+
gPipeline.copyRenderTarget(src, dst);
7155+
return;
7156+
}
7157+
7158+
LLGLSLShader* sharpen_shader = &gCASProgram;
7159+
7160+
// Bind setup:
7161+
dst->bindTarget();
7162+
7163+
sharpen_shader->bind();
7164+
7165+
{
7166+
static LLStaticHashedString cas_param_0("cas_param_0");
7167+
static LLStaticHashedString cas_param_1("cas_param_1");
7168+
static LLStaticHashedString out_screen_res("out_screen_res");
7169+
7170+
varAU4(const0);
7171+
varAU4(const1);
7172+
CasSetup(const0, const1,
7173+
RenderCASSharpness, // Sharpness tuning knob (0.0 to 1.0).
7174+
(AF1)src->getWidth(), (AF1)src->getHeight(), // Input size.
7175+
(AF1)dst->getWidth(), (AF1)dst->getHeight()); // Output size.
7176+
7177+
sharpen_shader->uniform4uiv(cas_param_0, 1, const0);
7178+
sharpen_shader->uniform4uiv(cas_param_1, 1, const1);
7179+
7180+
sharpen_shader->uniform2f(out_screen_res, (AF1)dst->getWidth(), (AF1)dst->getHeight());
7181+
}
7182+
7183+
sharpen_shader->bindTexture(LLShaderMgr::DEFERRED_DIFFUSE, src, false, LLTexUnit::TFO_POINT);
7184+
7185+
// Draw
7186+
gPipeline.mScreenTriangleVB->setBuffer();
7187+
gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3);
7188+
7189+
sharpen_shader->unbind();
7190+
7191+
dst->flush();
7192+
}
7193+
71367194
void LLPipeline::applyFXAA(LLRenderTarget* src, LLRenderTarget* dst)
71377195
{
71387196
{
@@ -7502,13 +7560,15 @@ void LLPipeline::renderFinalize()
75027560
gGLViewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
75037561
glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]);
75047562

7505-
renderDoF(&mRT->screen, &mPostMap);
7563+
applyCAS(&mRT->screen, &mPostMap);
7564+
7565+
renderDoF(&mPostMap, &mRT->screen);
75067566

7507-
applyFXAA(&mPostMap, &mRT->screen);
7508-
LLRenderTarget* finalBuffer = &mRT->screen;
7567+
applyFXAA(&mRT->screen, &mPostMap);
7568+
LLRenderTarget* finalBuffer = &mPostMap;
75097569
if (RenderBufferVisualization > -1)
75107570
{
7511-
finalBuffer = &mPostMap;
7571+
finalBuffer = &mRT->screen;
75127572
switch (RenderBufferVisualization)
75137573
{
75147574
case 0:

indra/newview/pipeline.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ class LLPipeline
157157
void generateExposure(LLRenderTarget* src, LLRenderTarget* dst, bool use_history = true);
158158
void gammaCorrect(LLRenderTarget* src, LLRenderTarget* dst);
159159
void generateGlow(LLRenderTarget* src);
160+
void applyCAS(LLRenderTarget* src, LLRenderTarget* dst);
160161
void applyFXAA(LLRenderTarget* src, LLRenderTarget* dst);
161162
void renderDoF(LLRenderTarget* src, LLRenderTarget* dst);
162163
void copyRenderTarget(LLRenderTarget* src, LLRenderTarget* dst);
@@ -1067,6 +1068,7 @@ class LLPipeline
10671068
static bool RenderMirrors;
10681069
static S32 RenderHeroProbeUpdateRate;
10691070
static S32 RenderHeroProbeConservativeUpdateMultiplier;
1071+
static F32 RenderCASSharpness;
10701072
};
10711073

10721074
void render_bbox(const LLVector3 &min, const LLVector3 &max);

0 commit comments

Comments
 (0)