Huge renderer update (WIP). Still plenty to do, especially pertaining to UI.
-Nametag bubble visbility is oddly inconsistent. May vanish with future planned UI merges... -VBOs are PAINFULLY slow on ATI hardware. This repos self-compiled davep/shining-fixes branch, so I'll leave the ball in LL's court for now regarding that.
This commit is contained in:
@@ -89,7 +89,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
||||
// NOTE order of shader object attaching is VERY IMPORTANT!!!
|
||||
if (features->calculatesAtmospherics)
|
||||
{
|
||||
if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
|
||||
if (features->hasWaterFog)
|
||||
{
|
||||
if (!shader->attachObject("windlight/atmosphericsVarsWaterV.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -155,7 +162,6 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
||||
}
|
||||
}
|
||||
|
||||
#if MESH_ENABLED
|
||||
if (features->hasObjectSkinning)
|
||||
{
|
||||
if (!shader->attachObject("avatar/objectSkinV.glsl"))
|
||||
@@ -163,7 +169,6 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
#endif //MESH_ENABLED
|
||||
|
||||
///////////////////////////////////////
|
||||
// Attach Fragment Shader Features Next
|
||||
@@ -171,7 +176,14 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
||||
|
||||
if(features->calculatesAtmospherics)
|
||||
{
|
||||
if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
|
||||
if (features->hasWaterFog)
|
||||
{
|
||||
if (!shader->attachObject("windlight/atmosphericsVarsWaterF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
@@ -453,6 +465,22 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (features->mIndexedTextureChannels <= 1)
|
||||
{
|
||||
if (!shader->attachObject("objects/nonindexedTextureV.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!shader->attachObject("objects/indexedTextureV.glsl"))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -548,6 +576,12 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
||||
GLuint count = 0;
|
||||
|
||||
F32 version = gGLManager.mGLVersion;
|
||||
|
||||
//hack to never use GLSL > 1.20 on OSX
|
||||
#if LL_DARWIN
|
||||
version = llmin(version, 2.9f);
|
||||
#endif
|
||||
|
||||
if (version < 2.1f)
|
||||
{
|
||||
text[count++] = strdup("#version 110\n");
|
||||
@@ -558,12 +592,26 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
||||
{
|
||||
//set version to 1.20
|
||||
text[count++] = strdup("#version 120\n");
|
||||
text[count++] = strdup("#define FXAA_GLSL_120 1\n");
|
||||
text[count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n");
|
||||
text[count++] = strdup("#define ATTRIBUTE attribute\n");
|
||||
text[count++] = strdup("#define VARYING varying\n");
|
||||
}
|
||||
else
|
||||
{ //set version to 1.30
|
||||
text[count++] = strdup("#version 130\n");
|
||||
{
|
||||
if (version < 4.f)
|
||||
{
|
||||
//set version to 1.30
|
||||
text[count++] = strdup("#version 130\n");
|
||||
}
|
||||
else
|
||||
{ //set version to 400
|
||||
text[count++] = strdup("#version 400\n");
|
||||
}
|
||||
|
||||
text[count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n");
|
||||
text[count++] = strdup("#define FXAA_GLSL_130 1\n");
|
||||
|
||||
text[count++] = strdup("#define ATTRIBUTE in\n");
|
||||
|
||||
if (type == GL_VERTEX_SHADER_ARB)
|
||||
@@ -585,10 +633,6 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
|
||||
text[count++] = strdup("#define texture2D texture\n");
|
||||
text[count++] = strdup("#define texture2DRect texture\n");
|
||||
text[count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n");
|
||||
|
||||
//Will go away soon:
|
||||
text[count++] = strdup("#define ftransform() gl_ModelViewProjectionMatrix * gl_Vertex\n");
|
||||
|
||||
}
|
||||
|
||||
//copy preprocessor definitions into buffer
|
||||
@@ -853,28 +897,42 @@ BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors)
|
||||
LL_WARNS("ShaderLoading") << "GLSL Linker Error:" << LL_ENDL;
|
||||
}
|
||||
|
||||
// NOTE: Removing LL_DARWIN block as it doesn't seem to actually give the correct answer,
|
||||
// but want it for reference once I move it.
|
||||
#if 0
|
||||
// Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
|
||||
// per Apple's suggestion
|
||||
glBegin(gGL.mMode);
|
||||
glEnd();
|
||||
#if LL_DARWIN
|
||||
|
||||
// Query whether the shader can or cannot run in hardware
|
||||
// http://developer.apple.com/qa/qa2007/qa1502.html
|
||||
long vertexGPUProcessing;
|
||||
CGLContextObj ctx = CGLGetCurrentContext();
|
||||
CGLGetParameter (ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
|
||||
long fragmentGPUProcessing;
|
||||
CGLGetParameter (ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
|
||||
if (!fragmentGPUProcessing || !vertexGPUProcessing)
|
||||
// For some reason this absolutely kills the frame rate when VBO's are enabled
|
||||
if (0)
|
||||
{
|
||||
LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
|
||||
success = GL_FALSE;
|
||||
suppress_errors = FALSE;
|
||||
// Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
|
||||
// per Apple's suggestion
|
||||
LLGLSLShader::sNoFixedFunction = false;
|
||||
|
||||
glUseProgramObjectARB(obj);
|
||||
|
||||
gGL.begin(LLRender::TRIANGLES);
|
||||
gGL.vertex3f(0.0f, 0.0f, 0.0f);
|
||||
gGL.vertex3f(0.0f, 0.0f, 0.0f);
|
||||
gGL.vertex3f(0.0f, 0.0f, 0.0f);
|
||||
gGL.end();
|
||||
gGL.flush();
|
||||
|
||||
glUseProgramObjectARB(0);
|
||||
|
||||
LLGLSLShader::sNoFixedFunction = true;
|
||||
|
||||
// Query whether the shader can or cannot run in hardware
|
||||
// http://developer.apple.com/qa/qa2007/qa1502.html
|
||||
GLint vertexGPUProcessing, fragmentGPUProcessing;
|
||||
CGLContextObj ctx = CGLGetCurrentContext();
|
||||
CGLGetParameter(ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);
|
||||
CGLGetParameter(ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
|
||||
if (!fragmentGPUProcessing || !vertexGPUProcessing)
|
||||
{
|
||||
LL_WARNS("ShaderLoading") << "GLSL Linker: Running in Software:" << LL_ENDL;
|
||||
success = GL_FALSE;
|
||||
suppress_errors = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#else
|
||||
std::string log = get_object_log(obj);
|
||||
LLStringUtil::toLower(log);
|
||||
@@ -912,3 +970,181 @@ BOOL LLShaderMgr::validateProgramObject(GLhandleARB obj)
|
||||
return success;
|
||||
}
|
||||
|
||||
//virtual
|
||||
void LLShaderMgr::initAttribsAndUniforms()
|
||||
{
|
||||
//MUST match order of enum in LLVertexBuffer.h
|
||||
mReservedAttribs.push_back("position");
|
||||
mReservedAttribs.push_back("normal");
|
||||
mReservedAttribs.push_back("texcoord0");
|
||||
mReservedAttribs.push_back("texcoord1");
|
||||
mReservedAttribs.push_back("texcoord2");
|
||||
mReservedAttribs.push_back("texcoord3");
|
||||
mReservedAttribs.push_back("diffuse_color");
|
||||
mReservedAttribs.push_back("emissive");
|
||||
mReservedAttribs.push_back("binormal");
|
||||
mReservedAttribs.push_back("weight");
|
||||
mReservedAttribs.push_back("weight4");
|
||||
mReservedAttribs.push_back("clothing");
|
||||
mReservedAttribs.push_back("texture_index");
|
||||
|
||||
//matrix state
|
||||
mReservedUniforms.push_back("modelview_matrix");
|
||||
mReservedUniforms.push_back("projection_matrix");
|
||||
mReservedUniforms.push_back("inv_proj");
|
||||
mReservedUniforms.push_back("modelview_projection_matrix");
|
||||
mReservedUniforms.push_back("normal_matrix");
|
||||
mReservedUniforms.push_back("texture_matrix0");
|
||||
mReservedUniforms.push_back("texture_matrix1");
|
||||
mReservedUniforms.push_back("texture_matrix2");
|
||||
mReservedUniforms.push_back("texture_matrix3");
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_MATRIX3+1);
|
||||
|
||||
mReservedUniforms.push_back("viewport");
|
||||
|
||||
mReservedUniforms.push_back("light_position");
|
||||
mReservedUniforms.push_back("light_direction");
|
||||
mReservedUniforms.push_back("light_attenuation");
|
||||
mReservedUniforms.push_back("light_diffuse");
|
||||
mReservedUniforms.push_back("light_ambient");
|
||||
mReservedUniforms.push_back("light_count");
|
||||
mReservedUniforms.push_back("light");
|
||||
mReservedUniforms.push_back("light_col");
|
||||
mReservedUniforms.push_back("far_z");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
|
||||
|
||||
|
||||
mReservedUniforms.push_back("proj_mat");
|
||||
mReservedUniforms.push_back("proj_near");
|
||||
mReservedUniforms.push_back("proj_p");
|
||||
mReservedUniforms.push_back("proj_n");
|
||||
mReservedUniforms.push_back("proj_origin");
|
||||
mReservedUniforms.push_back("proj_range");
|
||||
mReservedUniforms.push_back("proj_ambiance");
|
||||
mReservedUniforms.push_back("proj_shadow_idx");
|
||||
mReservedUniforms.push_back("shadow_fade");
|
||||
mReservedUniforms.push_back("proj_focus");
|
||||
mReservedUniforms.push_back("proj_lod");
|
||||
mReservedUniforms.push_back("proj_ambient_lod");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::PROJECTOR_AMBIENT_LOD+1);
|
||||
|
||||
mReservedUniforms.push_back("color");
|
||||
|
||||
mReservedUniforms.push_back("diffuseMap");
|
||||
mReservedUniforms.push_back("specularMap");
|
||||
mReservedUniforms.push_back("bumpMap");
|
||||
mReservedUniforms.push_back("environmentMap");
|
||||
mReservedUniforms.push_back("cloude_noise_texture");
|
||||
mReservedUniforms.push_back("fullbright");
|
||||
mReservedUniforms.push_back("lightnorm");
|
||||
mReservedUniforms.push_back("sunlight_color_copy");
|
||||
mReservedUniforms.push_back("ambient");
|
||||
mReservedUniforms.push_back("blue_horizon");
|
||||
mReservedUniforms.push_back("blue_density");
|
||||
mReservedUniforms.push_back("haze_horizon");
|
||||
mReservedUniforms.push_back("haze_density");
|
||||
mReservedUniforms.push_back("cloud_shadow");
|
||||
mReservedUniforms.push_back("density_multiplier");
|
||||
mReservedUniforms.push_back("distance_multiplier");
|
||||
mReservedUniforms.push_back("max_y");
|
||||
mReservedUniforms.push_back("glow");
|
||||
mReservedUniforms.push_back("cloud_color");
|
||||
mReservedUniforms.push_back("cloud_pos_density1");
|
||||
mReservedUniforms.push_back("cloud_pos_density2");
|
||||
mReservedUniforms.push_back("cloud_scale");
|
||||
mReservedUniforms.push_back("gamma");
|
||||
mReservedUniforms.push_back("scene_light_strength");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::SCENE_LIGHT_STRENGTH+1);
|
||||
|
||||
mReservedUniforms.push_back("center");
|
||||
mReservedUniforms.push_back("size");
|
||||
mReservedUniforms.push_back("falloff");
|
||||
|
||||
|
||||
mReservedUniforms.push_back("minLuminance");
|
||||
mReservedUniforms.push_back("maxExtractAlpha");
|
||||
mReservedUniforms.push_back("lumWeights");
|
||||
mReservedUniforms.push_back("warmthWeights");
|
||||
mReservedUniforms.push_back("warmthAmount");
|
||||
mReservedUniforms.push_back("glowStrength");
|
||||
mReservedUniforms.push_back("glowDelta");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
|
||||
|
||||
|
||||
mReservedUniforms.push_back("minimum_alpha");
|
||||
|
||||
mReservedUniforms.push_back("shadow_matrix");
|
||||
mReservedUniforms.push_back("env_mat");
|
||||
mReservedUniforms.push_back("shadow_clip");
|
||||
mReservedUniforms.push_back("sun_wash");
|
||||
mReservedUniforms.push_back("shadow_noise");
|
||||
mReservedUniforms.push_back("blur_size");
|
||||
mReservedUniforms.push_back("ssao_radius");
|
||||
mReservedUniforms.push_back("ssao_max_radius");
|
||||
mReservedUniforms.push_back("ssao_factor");
|
||||
mReservedUniforms.push_back("ssao_factor_inv");
|
||||
mReservedUniforms.push_back("ssao_effect_mat");
|
||||
mReservedUniforms.push_back("screen_res");
|
||||
mReservedUniforms.push_back("near_clip");
|
||||
mReservedUniforms.push_back("shadow_offset");
|
||||
mReservedUniforms.push_back("shadow_bias");
|
||||
mReservedUniforms.push_back("spot_shadow_bias");
|
||||
mReservedUniforms.push_back("spot_shadow_offset");
|
||||
mReservedUniforms.push_back("sun_dir");
|
||||
mReservedUniforms.push_back("shadow_res");
|
||||
mReservedUniforms.push_back("proj_shadow_res");
|
||||
mReservedUniforms.push_back("depth_cutoff");
|
||||
mReservedUniforms.push_back("norm_cutoff");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_NORM_CUTOFF+1);
|
||||
|
||||
mReservedUniforms.push_back("tc_scale");
|
||||
mReservedUniforms.push_back("rcp_screen_res");
|
||||
mReservedUniforms.push_back("rcp_frame_opt");
|
||||
mReservedUniforms.push_back("rcp_frame_opt2");
|
||||
|
||||
mReservedUniforms.push_back("focal_distance");
|
||||
mReservedUniforms.push_back("blur_constant");
|
||||
mReservedUniforms.push_back("tan_pixel_angle");
|
||||
mReservedUniforms.push_back("magnification");
|
||||
mReservedUniforms.push_back("max_cof");
|
||||
mReservedUniforms.push_back("res_scale");
|
||||
|
||||
mReservedUniforms.push_back("depthMap");
|
||||
mReservedUniforms.push_back("shadowMap0");
|
||||
mReservedUniforms.push_back("shadowMap1");
|
||||
mReservedUniforms.push_back("shadowMap2");
|
||||
mReservedUniforms.push_back("shadowMap3");
|
||||
mReservedUniforms.push_back("shadowMap4");
|
||||
mReservedUniforms.push_back("shadowMap5");
|
||||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW5+1);
|
||||
|
||||
mReservedUniforms.push_back("normalMap");
|
||||
mReservedUniforms.push_back("positionMap");
|
||||
mReservedUniforms.push_back("diffuseRect");
|
||||
mReservedUniforms.push_back("specularRect");
|
||||
mReservedUniforms.push_back("noiseMap");
|
||||
mReservedUniforms.push_back("lightFunc");
|
||||
mReservedUniforms.push_back("lightMap");
|
||||
mReservedUniforms.push_back("bloomMap");
|
||||
mReservedUniforms.push_back("projectionMap");
|
||||
|
||||
llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
|
||||
|
||||
std::set<std::string> dupe_check;
|
||||
|
||||
for (U32 i = 0; i < mReservedUniforms.size(); ++i)
|
||||
{
|
||||
if (dupe_check.find(mReservedUniforms[i]) != dupe_check.end())
|
||||
{
|
||||
llerrs << "Duplicate reserved uniform name found: " << mReservedUniforms[i] << llendl;
|
||||
}
|
||||
dupe_check.insert(mReservedUniforms[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user