Merge branch 'DRTVWR-559' of https://bitbucket.org/lindenlab/viewer
# Conflicts: # indra/llrender/llgl.cpp # indra/llrender/llimagegl.cpp # indra/llrender/llrender.cpp # indra/newview/app_settings/settings.xml # indra/newview/lldynamictexture.cpp # indra/newview/llface.cpp # indra/newview/llfloaterpreference.cpp # indra/newview/llviewermenu.cpp # indra/newview/llviewerwindow.cppmaster
commit
9756e0e89e
|
|
@ -2823,7 +2823,7 @@ bool LLVolume::unpackVolumeFacesInternal(const LLSD& mdl)
|
|||
}
|
||||
}
|
||||
|
||||
if (!cacheOptimize())
|
||||
if (!cacheOptimize(true))
|
||||
{
|
||||
// Out of memory?
|
||||
LL_WARNS() << "Failed to optimize!" << LL_ENDL;
|
||||
|
|
@ -2864,11 +2864,11 @@ void LLVolume::copyVolumeFaces(const LLVolume* volume)
|
|||
mSculptLevel = 0;
|
||||
}
|
||||
|
||||
bool LLVolume::cacheOptimize()
|
||||
bool LLVolume::cacheOptimize(bool gen_tangents)
|
||||
{
|
||||
for (S32 i = 0; i < mVolumeFaces.size(); ++i)
|
||||
{
|
||||
if (!mVolumeFaces[i].cacheOptimize())
|
||||
if (!mVolumeFaces[i].cacheOptimize(gen_tangents))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -5547,18 +5547,13 @@ struct MikktData
|
|||
};
|
||||
|
||||
|
||||
bool LLVolumeFace::cacheOptimize()
|
||||
bool LLVolumeFace::cacheOptimize(bool gen_tangents)
|
||||
{ //optimize for vertex cache according to Forsyth method:
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VOLUME;
|
||||
llassert(!mOptimized);
|
||||
mOptimized = TRUE;
|
||||
|
||||
if (!mNormals || !mTexCoords)
|
||||
{ // can't perform this operation without normals and texture coordinates
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mMikktSpaceTangents == nullptr)
|
||||
if (mMikktSpaceTangents == nullptr && gen_tangents && mNormals && mTexCoords)
|
||||
{ // make sure to generate mikkt space tangents for cache optimizing since the index buffer may change
|
||||
allocateTangents(mNumVertices, true);
|
||||
|
||||
|
|
|
|||
|
|
@ -910,7 +910,7 @@ public:
|
|||
void remap();
|
||||
|
||||
void optimize(F32 angle_cutoff = 2.f);
|
||||
bool cacheOptimize();
|
||||
bool cacheOptimize(bool gen_tangents = false);
|
||||
|
||||
void createOctree(F32 scaler = 0.25f, const LLVector4a& center = LLVector4a(0,0,0), const LLVector4a& size = LLVector4a(0.5f,0.5f,0.5f));
|
||||
|
||||
|
|
@ -960,10 +960,6 @@ public:
|
|||
// indexes for mPositions/mNormals/mTexCoords
|
||||
U16* mIndices;
|
||||
|
||||
// vertex buffer filled in by LLFace to cache this volume face geometry in vram
|
||||
// (declared as a LLPointer to LLRefCount to avoid dependency on LLVertexBuffer)
|
||||
mutable LLPointer<LLRefCount> mVertexBuffer;
|
||||
|
||||
std::vector<S32> mEdge;
|
||||
|
||||
//list of skin weights for rigged volumes
|
||||
|
|
@ -1101,7 +1097,10 @@ public:
|
|||
void copyVolumeFaces(const LLVolume* volume);
|
||||
void copyFacesTo(std::vector<LLVolumeFace> &faces) const;
|
||||
void copyFacesFrom(const std::vector<LLVolumeFace> &faces);
|
||||
bool cacheOptimize();
|
||||
|
||||
// use meshoptimizer to optimize index buffer for vertex shader cache
|
||||
// gen_tangents - if true, generate MikkTSpace tangents if needed before optimizing index buffer
|
||||
bool cacheOptimize(bool gen_tangents = false);
|
||||
|
||||
private:
|
||||
void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type);
|
||||
|
|
|
|||
|
|
@ -666,7 +666,6 @@ char const* const _PREHASH_GroupRolesCount = LLMessageStringTable::getInstance()
|
|||
char const* const _PREHASH_SimulatorBlock = LLMessageStringTable::getInstance()->getString("SimulatorBlock");
|
||||
char const* const _PREHASH_GroupID = LLMessageStringTable::getInstance()->getString("GroupID");
|
||||
char const* const _PREHASH_AgentVel = LLMessageStringTable::getInstance()->getString("AgentVel");
|
||||
char const* const _PREHASH_RequestImage = LLMessageStringTable::getInstance()->getString("RequestImage");
|
||||
char const* const _PREHASH_NetStats = LLMessageStringTable::getInstance()->getString("NetStats");
|
||||
char const* const _PREHASH_AgentPos = LLMessageStringTable::getInstance()->getString("AgentPos");
|
||||
char const* const _PREHASH_AgentSit = LLMessageStringTable::getInstance()->getString("AgentSit");
|
||||
|
|
@ -1047,7 +1046,6 @@ char const* const _PREHASH_SortOrder = LLMessageStringTable::getInstance()->getS
|
|||
char const* const _PREHASH_Hunter = LLMessageStringTable::getInstance()->getString("Hunter");
|
||||
char const* const _PREHASH_SunAngVelocity = LLMessageStringTable::getInstance()->getString("SunAngVelocity");
|
||||
char const* const _PREHASH_BinaryBucket = LLMessageStringTable::getInstance()->getString("BinaryBucket");
|
||||
char const* const _PREHASH_ImagePacket = LLMessageStringTable::getInstance()->getString("ImagePacket");
|
||||
char const* const _PREHASH_StartGroupProposal = LLMessageStringTable::getInstance()->getString("StartGroupProposal");
|
||||
char const* const _PREHASH_EnergyLevel = LLMessageStringTable::getInstance()->getString("EnergyLevel");
|
||||
char const* const _PREHASH_PriceForListing = LLMessageStringTable::getInstance()->getString("PriceForListing");
|
||||
|
|
@ -1236,7 +1234,6 @@ char const* const _PREHASH_ForceScriptControlRelease = LLMessageStringTable::get
|
|||
char const* const _PREHASH_ParcelRelease = LLMessageStringTable::getInstance()->getString("ParcelRelease");
|
||||
char const* const _PREHASH_VFileType = LLMessageStringTable::getInstance()->getString("VFileType");
|
||||
char const* const _PREHASH_EjectGroupMemberReply = LLMessageStringTable::getInstance()->getString("EjectGroupMemberReply");
|
||||
char const* const _PREHASH_ImageData = LLMessageStringTable::getInstance()->getString("ImageData");
|
||||
char const* const _PREHASH_SimulatorViewerTimeMessage = LLMessageStringTable::getInstance()->getString("SimulatorViewerTimeMessage");
|
||||
char const* const _PREHASH_Rotation = LLMessageStringTable::getInstance()->getString("Rotation");
|
||||
char const* const _PREHASH_Selection = LLMessageStringTable::getInstance()->getString("Selection");
|
||||
|
|
|
|||
|
|
@ -666,7 +666,6 @@ extern char const* const _PREHASH_GroupRolesCount;
|
|||
extern char const* const _PREHASH_SimulatorBlock;
|
||||
extern char const* const _PREHASH_GroupID;
|
||||
extern char const* const _PREHASH_AgentVel;
|
||||
extern char const* const _PREHASH_RequestImage;
|
||||
extern char const* const _PREHASH_NetStats;
|
||||
extern char const* const _PREHASH_AgentPos;
|
||||
extern char const* const _PREHASH_AgentSit;
|
||||
|
|
@ -1047,7 +1046,6 @@ extern char const* const _PREHASH_SortOrder;
|
|||
extern char const* const _PREHASH_Hunter;
|
||||
extern char const* const _PREHASH_SunAngVelocity;
|
||||
extern char const* const _PREHASH_BinaryBucket;
|
||||
extern char const* const _PREHASH_ImagePacket;
|
||||
extern char const* const _PREHASH_StartGroupProposal;
|
||||
extern char const* const _PREHASH_EnergyLevel;
|
||||
extern char const* const _PREHASH_PriceForListing;
|
||||
|
|
|
|||
|
|
@ -2695,9 +2695,6 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
|
|||
LLVolume::face_list_t remainder;
|
||||
do
|
||||
{
|
||||
// generate tangents and cache optimize before normalizing
|
||||
ret->preprocessVolumeFaces();
|
||||
|
||||
// Insure we do this once with the whole gang and not per-model
|
||||
//
|
||||
if (!normalized && !mNoNormalize)
|
||||
|
|
@ -2709,10 +2706,10 @@ bool LLDAELoader::loadModelsFromDomMesh(domMesh* mesh, std::vector<LLModel*>& mo
|
|||
ret->trimVolumeFacesToSize(LL_SCULPT_MESH_MAX_FACES, &remainder);
|
||||
|
||||
// remove unused/redundant vertices after normalizing
|
||||
//if (!mNoOptimize)
|
||||
//{
|
||||
// ret->remapVolumeFaces();
|
||||
//}
|
||||
if (!mNoOptimize)
|
||||
{
|
||||
ret->remapVolumeFaces();
|
||||
}
|
||||
|
||||
volume_faces = remainder.size();
|
||||
|
||||
|
|
|
|||
|
|
@ -190,15 +190,6 @@ void LLModel::trimVolumeFacesToSize(U32 new_count, LLVolume::face_list_t* remain
|
|||
}
|
||||
}
|
||||
|
||||
// generate mikkt space tangents and cache optimize
|
||||
void LLModel::preprocessVolumeFaces()
|
||||
{
|
||||
for (auto& face : mVolumeFaces)
|
||||
{
|
||||
face.cacheOptimize();
|
||||
}
|
||||
}
|
||||
|
||||
// Shrink the model to fit
|
||||
// on a 1x1x1 cube centered at the origin.
|
||||
// The positions and extents
|
||||
|
|
|
|||
|
|
@ -197,7 +197,6 @@ public:
|
|||
void addFace(const LLVolumeFace& face);
|
||||
|
||||
void sortVolumeFacesByMaterialName();
|
||||
void preprocessVolumeFaces();
|
||||
void normalizeVolumeFaces();
|
||||
void trimVolumeFacesToSize(U32 new_count = LL_SCULPT_MESH_MAX_FACES, LLVolume::face_list_t* remainder = NULL);
|
||||
void remapVolumeFaces();
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ void LLCubeMap::initGL()
|
|||
{
|
||||
llassert(gGLManager.mInited);
|
||||
|
||||
if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
|
||||
if (LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
// Not initialized, do stuff.
|
||||
if (mImages[0].isNull())
|
||||
|
|
@ -252,7 +252,7 @@ void LLCubeMap::enable(S32 stage)
|
|||
void LLCubeMap::enableTexture(S32 stage)
|
||||
{
|
||||
mTextureStage = stage;
|
||||
if (gGLManager.mHasCubeMap && stage >= 0 && LLCubeMap::sUseCubeMaps)
|
||||
if (stage >= 0 && LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
gGL.getTexUnit(stage)->enable(LLTexUnit::TT_CUBE_MAP);
|
||||
}
|
||||
|
|
@ -265,7 +265,7 @@ void LLCubeMap::disable(void)
|
|||
|
||||
void LLCubeMap::disableTexture(void)
|
||||
{
|
||||
if (gGLManager.mHasCubeMap && mTextureStage >= 0 && LLCubeMap::sUseCubeMaps)
|
||||
if (mTextureStage >= 0 && LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
gGL.getTexUnit(mTextureStage)->disable();
|
||||
if (mTextureStage == 0)
|
||||
|
|
|
|||
|
|
@ -86,15 +86,15 @@ void APIENTRY gl_debug_callback(GLenum source,
|
|||
const GLchar* message,
|
||||
GLvoid* userParam)
|
||||
{
|
||||
/*if (severity != GL_DEBUG_SEVERITY_HIGH_ARB // &&
|
||||
severity != GL_DEBUG_SEVERITY_MEDIUM_ARB &&
|
||||
severity != GL_DEBUG_SEVERITY_LOW_ARB
|
||||
/*if (severity != GL_DEBUG_SEVERITY_HIGH // &&
|
||||
severity != GL_DEBUG_SEVERITY_MEDIUM &&
|
||||
severity != GL_DEBUG_SEVERITY_LOW
|
||||
)
|
||||
{ //suppress out-of-spec messages sent by nvidia driver (mostly vertexbuffer hints)
|
||||
return;
|
||||
}*/
|
||||
|
||||
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
|
||||
if (severity == GL_DEBUG_SEVERITY_HIGH)
|
||||
{
|
||||
LL_WARNS() << "----- GL ERROR --------" << LL_ENDL;
|
||||
}
|
||||
|
|
@ -107,7 +107,15 @@ void APIENTRY gl_debug_callback(GLenum source,
|
|||
LL_WARNS() << "Severity: " << std::hex << severity << LL_ENDL;
|
||||
LL_WARNS() << "Message: " << message << LL_ENDL;
|
||||
LL_WARNS() << "-----------------------" << LL_ENDL;
|
||||
if (severity == GL_DEBUG_SEVERITY_HIGH_ARB)
|
||||
|
||||
GLint vao = 0;
|
||||
glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &vao);
|
||||
GLint vbo = 0;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &vbo);
|
||||
GLint ibo = 0;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &ibo);
|
||||
|
||||
if (severity == GL_DEBUG_SEVERITY_HIGH)
|
||||
{
|
||||
LL_ERRS() << "Halting on GL Error" << LL_ENDL;
|
||||
}
|
||||
|
|
@ -931,44 +939,12 @@ LLGLManager gGLManager;
|
|||
LLGLManager::LLGLManager() :
|
||||
mInited(FALSE),
|
||||
mIsDisabled(FALSE),
|
||||
|
||||
mHasMultitexture(FALSE),
|
||||
mHasATIMemInfo(FALSE),
|
||||
mHasAMDAssociations(FALSE),
|
||||
mHasNVXMemInfo(FALSE),
|
||||
mNumTextureUnits(1),
|
||||
mHasMipMapGeneration(FALSE),
|
||||
mHasCompressedTextures(FALSE),
|
||||
mHasFramebufferObject(FALSE),
|
||||
mMaxSamples(0),
|
||||
mHasBlendFuncSeparate(FALSE),
|
||||
mHasSync(FALSE),
|
||||
mHasVertexBufferObject(FALSE),
|
||||
mHasVertexArrayObject(FALSE),
|
||||
mHasMapBufferRange(FALSE),
|
||||
mHasFlushBufferRange(FALSE),
|
||||
mHasPBuffer(FALSE),
|
||||
mNumTextureImageUnits(0),
|
||||
mHasOcclusionQuery(FALSE),
|
||||
mHasTimerQuery(FALSE),
|
||||
mHasOcclusionQuery2(FALSE),
|
||||
mHasPointParameters(FALSE),
|
||||
mHasDrawBuffers(FALSE),
|
||||
mHasTextureRectangle(FALSE),
|
||||
mHasTextureMultisample(FALSE),
|
||||
mHasTransformFeedback(FALSE),
|
||||
mHasUniformBufferObject(FALSE),
|
||||
mNumTextureImageUnits(1),
|
||||
mMaxSampleMaskWords(0),
|
||||
mMaxColorTextureSamples(0),
|
||||
mMaxDepthTextureSamples(0),
|
||||
mMaxIntegerSamples(0),
|
||||
|
||||
mHasAnisotropic(FALSE),
|
||||
mHasARBEnvCombine(FALSE),
|
||||
mHasCubeMap(FALSE),
|
||||
mHasCubeMapArray(FALSE),
|
||||
mHasDebugOutput(FALSE),
|
||||
|
||||
mIsAMD(FALSE),
|
||||
mIsNVIDIA(FALSE),
|
||||
mIsIntel(FALSE),
|
||||
|
|
@ -976,9 +952,6 @@ LLGLManager::LLGLManager() :
|
|||
mIsMobileGF(FALSE),
|
||||
#endif
|
||||
mHasRequirements(TRUE),
|
||||
|
||||
mHasSeparateSpecularColor(FALSE),
|
||||
|
||||
mDriverVersionMajor(1),
|
||||
mDriverVersionMinor(0),
|
||||
mDriverVersionRelease(0),
|
||||
|
|
@ -996,7 +969,6 @@ LLGLManager::LLGLManager() :
|
|||
//---------------------------------------------------------------------
|
||||
void LLGLManager::initWGL()
|
||||
{
|
||||
mHasPBuffer = FALSE;
|
||||
#if LL_WINDOWS && !LL_MESA_HEADLESS
|
||||
if (!glh_init_extensions("WGL_ARB_pixel_format"))
|
||||
{
|
||||
|
|
@ -1035,10 +1007,6 @@ void LLGLManager::initWGL()
|
|||
{
|
||||
LL_WARNS("RenderInit") << "No ARB WGL render texture extensions" << LL_ENDL;
|
||||
}
|
||||
|
||||
mHasPBuffer = ExtensionExists("WGL_ARB_pbuffer", gGLHExts.mSysExts) &&
|
||||
ExtensionExists("WGL_ARB_render_texture", gGLHExts.mSysExts) &&
|
||||
ExtensionExists("WGL_ARB_pixel_format", gGLHExts.mSysExts);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -1052,7 +1020,7 @@ bool LLGLManager::initGL()
|
|||
|
||||
stop_glerror();
|
||||
|
||||
#if LL_WINDOWS
|
||||
#if 0 && LL_WINDOWS
|
||||
if (!glGetStringi)
|
||||
{
|
||||
glGetStringi = (PFNGLGETSTRINGIPROC) GLH_EXT_GET_PROC_ADDRESS("glGetStringi");
|
||||
|
|
@ -1199,23 +1167,6 @@ bool LLGLManager::initGL()
|
|||
}
|
||||
#endif
|
||||
|
||||
if (mHasATIMemInfo && mVRAM == 0)
|
||||
{ //ask the gl how much vram is free at startup and attempt to use no more than half of that
|
||||
S32 meminfo[4];
|
||||
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
|
||||
|
||||
mVRAM = meminfo[0] / 1024;
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (ATIMemInfo):" << mVRAM << LL_ENDL;
|
||||
}
|
||||
|
||||
if (mHasNVXMemInfo && mVRAM == 0)
|
||||
{
|
||||
S32 dedicated_memory;
|
||||
glGetIntegerv(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX, &dedicated_memory);
|
||||
mVRAM = dedicated_memory/1024;
|
||||
LL_WARNS("RenderInit") << "VRAM Detected (NVXMemInfo):" << mVRAM << LL_ENDL;
|
||||
}
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (mVRAM < 256)
|
||||
{
|
||||
|
|
@ -1246,64 +1197,22 @@ bool LLGLManager::initGL()
|
|||
|
||||
stop_glerror();
|
||||
|
||||
GLint num_tex_image_units;
|
||||
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &num_tex_image_units);
|
||||
mNumTextureImageUnits = llmin(num_tex_image_units, 32);
|
||||
|
||||
if (mHasMultitexture)
|
||||
glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &mNumTextureImageUnits);
|
||||
stop_glerror();
|
||||
glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);
|
||||
stop_glerror();
|
||||
glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);
|
||||
stop_glerror();
|
||||
glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
|
||||
stop_glerror();
|
||||
glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
|
||||
stop_glerror();
|
||||
glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
|
||||
stop_glerror();
|
||||
if (mGLVersion >= 4.59f)
|
||||
{
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
mNumTextureUnits = llmin(mNumTextureImageUnits, MAX_GL_TEXTURE_UNITS);
|
||||
}
|
||||
else
|
||||
{
|
||||
GLint num_tex_units;
|
||||
glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &num_tex_units);
|
||||
mNumTextureUnits = llmin(num_tex_units, (GLint)MAX_GL_TEXTURE_UNITS);
|
||||
if (mIsIntel)
|
||||
{
|
||||
mNumTextureUnits = llmin(mNumTextureUnits, 2);
|
||||
}
|
||||
}
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY, &mMaxAnisotropy);
|
||||
}
|
||||
else
|
||||
{
|
||||
mHasRequirements = FALSE;
|
||||
|
||||
// We don't support cards that don't support the GL_ARB_multitexture extension
|
||||
LL_WARNS("RenderInit") << "GL Drivers do not support GL_ARB_multitexture" << LL_ENDL;
|
||||
return false;
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
|
||||
if (mHasTextureMultisample)
|
||||
{
|
||||
glGetIntegerv(GL_MAX_COLOR_TEXTURE_SAMPLES, &mMaxColorTextureSamples);
|
||||
glGetIntegerv(GL_MAX_DEPTH_TEXTURE_SAMPLES, &mMaxDepthTextureSamples);
|
||||
glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &mMaxIntegerSamples);
|
||||
glGetIntegerv(GL_MAX_SAMPLE_MASK_WORDS, &mMaxSampleMaskWords);
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
|
||||
//HACK always disable texture multisample, use FXAA instead
|
||||
mHasTextureMultisample = FALSE;
|
||||
#if LL_WINDOWS
|
||||
// <FS:CR> FIRE-7603: Revert MAINT-804 because FBO's and shadows appear to be working now!
|
||||
//if (mIsIntel && mGLVersion <= 3.f)
|
||||
//{ //never try to use framebuffer objects on older intel drivers (crashy)
|
||||
// mHasFramebufferObject = FALSE;
|
||||
//}
|
||||
// </FS:CR>
|
||||
#endif
|
||||
|
||||
if (mHasFramebufferObject)
|
||||
{
|
||||
glGetIntegerv(GL_MAX_SAMPLES, &mMaxSamples);
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
|
||||
initGLStates();
|
||||
|
|
@ -1411,62 +1320,22 @@ void LLGLManager::asLLSD(LLSD& info)
|
|||
|
||||
info["vram"] = mVRAM;
|
||||
|
||||
// Extensions used by everyone
|
||||
info["has_multitexture"] = mHasMultitexture;
|
||||
info["has_ati_mem_info"] = mHasATIMemInfo;
|
||||
info["has_nvx_mem_info"] = mHasNVXMemInfo;
|
||||
info["num_texture_units"] = mNumTextureUnits;
|
||||
info["has_mip_map_generation"] = mHasMipMapGeneration;
|
||||
info["has_compressed_textures"] = mHasCompressedTextures;
|
||||
info["has_framebuffer_object"] = mHasFramebufferObject;
|
||||
// OpenGL limits
|
||||
info["max_samples"] = mMaxSamples;
|
||||
info["has_blend_func_separate"] = mHasBlendFuncSeparate || LLRender::sGLCoreProfile;
|
||||
|
||||
// ARB Extensions
|
||||
info["has_vertex_buffer_object"] = mHasVertexBufferObject;
|
||||
info["has_vertex_array_object"] = mHasVertexArrayObject;
|
||||
info["has_sync"] = mHasSync;
|
||||
info["has_map_buffer_range"] = mHasMapBufferRange;
|
||||
info["has_flush_buffer_range"] = mHasFlushBufferRange;
|
||||
info["has_pbuffer"] = mHasPBuffer;
|
||||
info["has_shader_objects"] = std::string("Assumed TRUE"); // was mHasShaderObjects;
|
||||
info["has_vertex_shader"] = std::string("Assumed TRUE"); // was mHasVertexShader;
|
||||
info["has_fragment_shader"] = std::string("Assumed TRUE"); // was mHasFragmentShader;
|
||||
info["num_texture_image_units"] = mNumTextureImageUnits;
|
||||
info["has_occlusion_query"] = mHasOcclusionQuery;
|
||||
info["has_timer_query"] = mHasTimerQuery;
|
||||
info["has_occlusion_query2"] = mHasOcclusionQuery2;
|
||||
info["has_point_parameters"] = mHasPointParameters;
|
||||
info["has_draw_buffers"] = mHasDrawBuffers;
|
||||
info["has_depth_clamp"] = mHasDepthClamp;
|
||||
info["has_texture_rectangle"] = mHasTextureRectangle;
|
||||
info["has_texture_multisample"] = mHasTextureMultisample;
|
||||
info["has_transform_feedback"] = mHasTransformFeedback;
|
||||
info["max_sample_mask_words"] = mMaxSampleMaskWords;
|
||||
info["max_color_texture_samples"] = mMaxColorTextureSamples;
|
||||
info["max_depth_texture_samples"] = mMaxDepthTextureSamples;
|
||||
info["max_integer_samples"] = mMaxIntegerSamples;
|
||||
info["max_vertex_range"] = mGLMaxVertexRange;
|
||||
info["max_index_range"] = mGLMaxIndexRange;
|
||||
info["max_texture_size"] = mGLMaxTextureSize;
|
||||
|
||||
// Other extensions.
|
||||
info["has_anisotropic"] = mHasAnisotropic;
|
||||
info["has_arb_env_combine"] = mHasARBEnvCombine;
|
||||
info["has_cube_map"] = mHasCubeMap;
|
||||
info["has_debug_output"] = mHasDebugOutput;
|
||||
info["has_srgb_texture"] = mHassRGBTexture;
|
||||
info["has_srgb_framebuffer"] = mHassRGBFramebuffer;
|
||||
info["has_texture_srgb_decode"] = mHasTexturesRGBDecode;
|
||||
|
||||
// Vendor-specific extensions
|
||||
// Which vendor
|
||||
info["is_ati"] = mIsAMD; // note, do not rename is_ati to is_amd without coordinating with DW
|
||||
info["is_nvidia"] = mIsNVIDIA;
|
||||
info["is_intel"] = mIsIntel;
|
||||
|
||||
// Other fields
|
||||
info["has_requirements"] = mHasRequirements;
|
||||
info["has_separate_specular_color"] = mHasSeparateSpecularColor;
|
||||
info["max_vertex_range"] = mGLMaxVertexRange;
|
||||
info["max_index_range"] = mGLMaxIndexRange;
|
||||
info["max_texture_size"] = mGLMaxTextureSize;
|
||||
info["gl_renderer"] = mGLRenderer;
|
||||
}
|
||||
|
||||
|
|
@ -1485,60 +1354,6 @@ void LLGLManager::shutdownGL()
|
|||
|
||||
void LLGLManager::initExtensions()
|
||||
{
|
||||
#if LL_MESA_HEADLESS
|
||||
# ifdef GL_ARB_multitexture
|
||||
mHasMultitexture = TRUE;
|
||||
# else
|
||||
mHasMultitexture = FALSE;
|
||||
# endif // GL_ARB_multitexture
|
||||
# ifdef GL_ARB_texture_env_combine
|
||||
mHasARBEnvCombine = TRUE;
|
||||
# else
|
||||
mHasARBEnvCombine = FALSE;
|
||||
# endif // GL_ARB_texture_env_combine
|
||||
# ifdef GL_ARB_texture_compression
|
||||
mHasCompressedTextures = TRUE;
|
||||
# else
|
||||
mHasCompressedTextures = FALSE;
|
||||
# endif // GL_ARB_texture_compression
|
||||
# ifdef GL_ARB_vertex_buffer_object
|
||||
mHasVertexBufferObject = TRUE;
|
||||
# else
|
||||
mHasVertexBufferObject = FALSE;
|
||||
# endif // GL_ARB_vertex_buffer_object
|
||||
# ifdef GL_EXT_framebuffer_object
|
||||
mHasFramebufferObject = TRUE;
|
||||
# else
|
||||
mHasFramebufferObject = FALSE;
|
||||
# endif // GL_EXT_framebuffer_object
|
||||
# ifdef GL_ARB_draw_buffers
|
||||
mHasDrawBuffers = TRUE;
|
||||
#else
|
||||
mHasDrawBuffers = FALSE;
|
||||
# endif // GL_ARB_draw_buffers
|
||||
# if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp)
|
||||
mHasDepthClamp = TRUE;
|
||||
#else
|
||||
mHasDepthClamp = FALSE;
|
||||
#endif // defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp)
|
||||
# if GL_EXT_blend_func_separate
|
||||
mHasBlendFuncSeparate = TRUE;
|
||||
#else
|
||||
mHasBlendFuncSeparate = FALSE;
|
||||
# endif // GL_EXT_blend_func_separate
|
||||
mHasMipMapGeneration = FALSE;
|
||||
mHasSeparateSpecularColor = FALSE;
|
||||
mHasAnisotropic = FALSE;
|
||||
mHasCubeMap = FALSE;
|
||||
mHasOcclusionQuery = FALSE;
|
||||
mHasPointParameters = FALSE;
|
||||
mHasTextureRectangle = FALSE;
|
||||
#else // LL_MESA_HEADLESS //important, gGLHExts.mSysExts is uninitialized until after glh_init_extensions is called
|
||||
|
||||
mHasMultitexture = TRUE;
|
||||
mHasCubeMap = TRUE;
|
||||
mHasCompressedTextures = TRUE;
|
||||
|
||||
#if LL_DARWIN
|
||||
GLint num_extensions = 0;
|
||||
std::string all_extensions{""};
|
||||
|
|
@ -1555,173 +1370,12 @@ void LLGLManager::initExtensions()
|
|||
}
|
||||
#endif
|
||||
|
||||
mHasSeparateSpecularColor = ExtensionExists("GL_EXT_separate_specular_color", gGLHExts.mSysExts);
|
||||
mHasAnisotropic = ExtensionExists("GL_EXT_texture_filter_anisotropic", gGLHExts.mSysExts);
|
||||
// OpenGL 4.x capabilities
|
||||
mHasCubeMapArray = mGLVersion >= 3.99f;
|
||||
mHasTransformFeedback = mGLVersion >= 3.99f;
|
||||
mHasDebugOutput = mGLVersion >= 4.29f;
|
||||
|
||||
// In core profile
|
||||
mHasARBEnvCombine = TRUE; //ExtensionExists("GL_ARB_texture_env_combine", gGLHExts.mSysExts);
|
||||
mHasTimerQuery = FALSE; //FIXME //ExtensionExists("GL_ARB_timer_query", gGLHExts.mSysExts);
|
||||
mHasOcclusionQuery = TRUE; //ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts);
|
||||
mHasOcclusionQuery2 = TRUE; // ExtensionExists("GL_ARB_occlusion_query2", gGLHExts.mSysExts);
|
||||
mHasVertexBufferObject = TRUE; //ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts);
|
||||
mHasVertexArrayObject = TRUE; //ExtensionExists("GL_ARB_vertex_array_object", gGLHExts.mSysExts);
|
||||
mHasMapBufferRange = TRUE; ExtensionExists("GL_ARB_map_buffer_range", gGLHExts.mSysExts);
|
||||
mHasFlushBufferRange = ExtensionExists("GL_APPLE_flush_buffer_range", gGLHExts.mSysExts); // Apple has mHasMapBufferRange now
|
||||
mHasSync = TRUE; //ExtensionExists("GL_ARB_sync", gGLHExts.mSysExts);
|
||||
mHasFramebufferObject = TRUE; //ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts);
|
||||
mHassRGBFramebuffer = TRUE; //ExtensionExists("GL_ARB_framebuffer_sRGB", gGLHExts.mSysExts);
|
||||
mHasDrawBuffers = TRUE; //ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts);
|
||||
mHasTextureRectangle = TRUE; //ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts);
|
||||
mHasTextureMultisample = TRUE; //ExtensionExists("GL_ARB_texture_multisample", gGLHExts.mSysExts);
|
||||
mHasUniformBufferObject = TRUE; //ExtensionExists("GL_ARB_uniform_buffer_object", gGLHExts.mSysExts);
|
||||
mHasCubeMapArray = TRUE; //ExtensionExists("GL_ARB_texture_cube_map_array", gGLHExts.mSysExts);
|
||||
mHasPointParameters = TRUE; //ExtensionExists("GL_ARB_point_parameters", gGLHExts.mSysExts);
|
||||
|
||||
mHasATIMemInfo = ExtensionExists("GL_ATI_meminfo", gGLHExts.mSysExts); //Basic AMD method, also see mHasAMDAssociations
|
||||
mHasNVXMemInfo = ExtensionExists("GL_NVX_gpu_memory_info", gGLHExts.mSysExts);
|
||||
// NOTE: Using extensions breaks reflections when Shadows are set to projector. See: SL-16727
|
||||
//mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts);
|
||||
mHasDepthClamp = FALSE;
|
||||
// mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad
|
||||
|
||||
#ifdef GL_EXT_texture_sRGB
|
||||
mHassRGBTexture = ExtensionExists("GL_EXT_texture_sRGB", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef GL_EXT_texture_sRGB_decode
|
||||
mHasTexturesRGBDecode = ExtensionExists("GL_EXT_texture_sRGB_decode", gGLHExts.mSysExts);
|
||||
#else
|
||||
mHasTexturesRGBDecode = ExtensionExists("GL_ARB_texture_sRGB_decode", gGLHExts.mSysExts);
|
||||
#endif
|
||||
|
||||
mHasMipMapGeneration = mHasFramebufferObject || mGLVersion >= 1.4f;
|
||||
|
||||
mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts);
|
||||
mHasDebugOutput = mGLVersion >= 4.3f ? TRUE : FALSE;
|
||||
mHasTransformFeedback = mGLVersion >= 4.f ? TRUE : FALSE;
|
||||
#endif
|
||||
|
||||
#if LL_LINUX
|
||||
LL_INFOS() << "initExtensions() checking shell variables to adjust features..." << LL_ENDL;
|
||||
// Our extension support for the Linux Client is very young with some
|
||||
// potential driver gotchas, so offer a semi-secret way to turn it off.
|
||||
if (getenv("LL_GL_NOEXT"))
|
||||
{
|
||||
//mHasMultitexture = FALSE; // NEEDED!
|
||||
mHasDepthClamp = FALSE;
|
||||
mHasARBEnvCombine = FALSE;
|
||||
mHasCompressedTextures = FALSE;
|
||||
mHasVertexBufferObject = FALSE;
|
||||
mHasFramebufferObject = FALSE;
|
||||
mHasDrawBuffers = FALSE;
|
||||
mHasBlendFuncSeparate = FALSE;
|
||||
mHasMipMapGeneration = FALSE;
|
||||
mHasSeparateSpecularColor = FALSE;
|
||||
mHasAnisotropic = FALSE;
|
||||
mHasCubeMap = FALSE;
|
||||
mHasOcclusionQuery = FALSE;
|
||||
mHasPointParameters = FALSE;
|
||||
LL_WARNS("RenderInit") << "GL extension support DISABLED via LL_GL_NOEXT" << LL_ENDL;
|
||||
}
|
||||
else if (getenv("LL_GL_BASICEXT")) /* Flawfinder: ignore */
|
||||
{
|
||||
// This switch attempts to turn off all support for exotic
|
||||
// extensions which I believe correspond to fatal driver
|
||||
// bug reports. This should be the default until we get a
|
||||
// proper blacklist/whitelist on Linux.
|
||||
mHasMipMapGeneration = FALSE;
|
||||
mHasAnisotropic = FALSE;
|
||||
//mHasCubeMap = FALSE; // apparently fatal on Intel 915 & similar
|
||||
//mHasOcclusionQuery = FALSE; // source of many ATI system hangs
|
||||
mHasBlendFuncSeparate = FALSE;
|
||||
LL_WARNS("RenderInit") << "GL extension support forced to SIMPLE level via LL_GL_BASICEXT" << LL_ENDL;
|
||||
}
|
||||
if (getenv("LL_GL_BLACKLIST")) /* Flawfinder: ignore */
|
||||
{
|
||||
// This lets advanced troubleshooters disable specific
|
||||
// GL extensions to isolate problems with their hardware.
|
||||
// SL-28126
|
||||
const char *const blacklist = getenv("LL_GL_BLACKLIST"); /* Flawfinder: ignore */
|
||||
LL_WARNS("RenderInit") << "GL extension support partially disabled via LL_GL_BLACKLIST: " << blacklist << LL_ENDL;
|
||||
if (strchr(blacklist,'a')) mHasARBEnvCombine = FALSE;
|
||||
if (strchr(blacklist,'b')) mHasCompressedTextures = FALSE;
|
||||
if (strchr(blacklist,'c')) mHasVertexBufferObject = FALSE;
|
||||
if (strchr(blacklist,'d')) mHasMipMapGeneration = FALSE;//S
|
||||
// if (strchr(blacklist,'f')) mHasNVVertexArrayRange = FALSE;//S
|
||||
// if (strchr(blacklist,'g')) mHasNVFence = FALSE;//S
|
||||
if (strchr(blacklist,'h')) mHasSeparateSpecularColor = FALSE;
|
||||
if (strchr(blacklist,'i')) mHasAnisotropic = FALSE;//S
|
||||
if (strchr(blacklist,'j')) mHasCubeMap = FALSE;//S
|
||||
// if (strchr(blacklist,'k')) mHasATIVAO = FALSE;//S
|
||||
if (strchr(blacklist,'l')) mHasOcclusionQuery = FALSE;
|
||||
if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S
|
||||
if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S
|
||||
if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S
|
||||
if (strchr(blacklist,'s')) mHasTextureRectangle = FALSE;
|
||||
if (strchr(blacklist,'t')) mHasBlendFuncSeparate = FALSE;//S
|
||||
if (strchr(blacklist,'u')) mHasDepthClamp = FALSE;
|
||||
|
||||
}
|
||||
#endif // LL_LINUX
|
||||
|
||||
if (!mHasMultitexture)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize multitexturing" << LL_ENDL;
|
||||
}
|
||||
if (!mHasMipMapGeneration)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize mipmap generation" << LL_ENDL;
|
||||
}
|
||||
if (!mHasARBEnvCombine)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_env_combine" << LL_ENDL;
|
||||
}
|
||||
if (!mHasSeparateSpecularColor)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize separate specular color" << LL_ENDL;
|
||||
}
|
||||
if (!mHasAnisotropic)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize anisotropic filtering" << LL_ENDL;
|
||||
}
|
||||
if (!mHasCompressedTextures)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_compression" << LL_ENDL;
|
||||
}
|
||||
if (!mHasOcclusionQuery)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query" << LL_ENDL;
|
||||
}
|
||||
if (!mHasOcclusionQuery2)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_occlusion_query2" << LL_ENDL;
|
||||
}
|
||||
if (!mHasPointParameters)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_point_parameters" << LL_ENDL;
|
||||
}
|
||||
if (!mHasBlendFuncSeparate && !LLRender::sGLCoreProfile)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_EXT_blend_func_separate" << LL_ENDL;
|
||||
}
|
||||
if (!mHasDrawBuffers)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_draw_buffers" << LL_ENDL;
|
||||
}
|
||||
if (!mHasCubeMapArray)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Couldn't initialize GL_ARB_texture_cube_map_array" << LL_ENDL;
|
||||
}
|
||||
|
||||
// Disable certain things due to known bugs
|
||||
if (mIsIntel && mHasMipMapGeneration)
|
||||
{
|
||||
LL_INFOS("RenderInit") << "Disabling mip-map generation for Intel GPUs" << LL_ENDL;
|
||||
mHasMipMapGeneration = FALSE;
|
||||
}
|
||||
|
||||
// Misc
|
||||
// Misc
|
||||
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, (GLint*) &mGLMaxVertexRange);
|
||||
glGetIntegerv(GL_MAX_ELEMENTS_INDICES, (GLint*) &mGLMaxIndexRange);
|
||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, (GLint*) &mGLMaxTextureSize);
|
||||
|
|
@ -2800,7 +2454,7 @@ void LLGLState::checkTextureChannels(const std::string& msg)
|
|||
glh::matrix4f identity;
|
||||
identity.identity();
|
||||
|
||||
for (GLint i = 1; i < gGLManager.mNumTextureUnits; i++)
|
||||
for (GLint i = 1; i < gGLManager.mNumTextureImageUnits; i++)
|
||||
{
|
||||
gGL.getTexUnit(i)->activate();
|
||||
|
||||
|
|
@ -2838,12 +2492,6 @@ void LLGLState::checkTextureChannels(const std::string& msg)
|
|||
for (S32 j = (i == 0 ? 1 : 0);
|
||||
j < 9; j++)
|
||||
{
|
||||
if (j == 8 && !gGLManager.mHasTextureRectangle ||
|
||||
j == 9 && !gGLManager.mHasTextureMultisample)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (glIsEnabled(value[j]))
|
||||
{
|
||||
error = TRUE;
|
||||
|
|
@ -3334,36 +2982,29 @@ LLGLSquashToFarClip::~LLGLSquashToFarClip()
|
|||
|
||||
LLGLSyncFence::LLGLSyncFence()
|
||||
{
|
||||
#ifdef GL_ARB_sync
|
||||
mSync = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
LLGLSyncFence::~LLGLSyncFence()
|
||||
{
|
||||
#ifdef GL_ARB_sync
|
||||
if (mSync)
|
||||
{
|
||||
glDeleteSync(mSync);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLGLSyncFence::placeFence()
|
||||
{
|
||||
#ifdef GL_ARB_sync
|
||||
if (mSync)
|
||||
{
|
||||
glDeleteSync(mSync);
|
||||
}
|
||||
mSync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool LLGLSyncFence::isCompleted()
|
||||
{
|
||||
bool ret = true;
|
||||
#ifdef GL_ARB_sync
|
||||
if (mSync)
|
||||
{
|
||||
GLenum status = glClientWaitSync(mSync, 0, 1);
|
||||
|
|
@ -3372,13 +3013,11 @@ bool LLGLSyncFence::isCompleted()
|
|||
ret = false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
void LLGLSyncFence::wait()
|
||||
{
|
||||
#ifdef GL_ARB_sync
|
||||
if (mSync)
|
||||
{
|
||||
while (glClientWaitSync(mSync, 0, FENCE_WAIT_TIME_NANOSECONDS) == GL_TIMEOUT_EXPIRED)
|
||||
|
|
@ -3387,7 +3026,6 @@ void LLGLSyncFence::wait()
|
|||
waits++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
LLGLSPipelineSkyBox::LLGLSPipelineSkyBox()
|
||||
|
|
|
|||
|
|
@ -86,52 +86,27 @@ public:
|
|||
BOOL mInited;
|
||||
BOOL mIsDisabled;
|
||||
|
||||
// Extensions used by everyone
|
||||
BOOL mHasMultitexture;
|
||||
BOOL mHasATIMemInfo;
|
||||
BOOL mHasAMDAssociations;
|
||||
BOOL mHasNVXMemInfo;
|
||||
S32 mNumTextureUnits;
|
||||
BOOL mHasMipMapGeneration;
|
||||
BOOL mHasCompressedTextures;
|
||||
BOOL mHasFramebufferObject;
|
||||
// OpenGL limits
|
||||
S32 mMaxSamples;
|
||||
BOOL mHasBlendFuncSeparate;
|
||||
|
||||
// ARB Extensions
|
||||
BOOL mHasVertexBufferObject;
|
||||
BOOL mHasVertexArrayObject;
|
||||
BOOL mHasSync;
|
||||
BOOL mHasMapBufferRange;
|
||||
BOOL mHasFlushBufferRange;
|
||||
BOOL mHasPBuffer;
|
||||
S32 mNumTextureImageUnits;
|
||||
BOOL mHasOcclusionQuery;
|
||||
BOOL mHasTimerQuery;
|
||||
BOOL mHasOcclusionQuery2;
|
||||
BOOL mHasPointParameters;
|
||||
BOOL mHasDrawBuffers;
|
||||
BOOL mHasDepthClamp;
|
||||
BOOL mHasTextureRectangle;
|
||||
BOOL mHasTextureMultisample;
|
||||
BOOL mHasTransformFeedback;
|
||||
BOOL mHasUniformBufferObject;
|
||||
S32 mNumTextureImageUnits;
|
||||
S32 mMaxSampleMaskWords;
|
||||
S32 mMaxColorTextureSamples;
|
||||
S32 mMaxDepthTextureSamples;
|
||||
S32 mMaxIntegerSamples;
|
||||
S32 mGLMaxVertexRange;
|
||||
S32 mGLMaxIndexRange;
|
||||
S32 mGLMaxTextureSize;
|
||||
F32 mMaxAnisotropy = 0.f;
|
||||
|
||||
// Other extensions.
|
||||
BOOL mHasAnisotropic;
|
||||
BOOL mHasARBEnvCombine;
|
||||
BOOL mHasCubeMap;
|
||||
BOOL mHasCubeMapArray;
|
||||
BOOL mHasDebugOutput;
|
||||
BOOL mHassRGBTexture;
|
||||
BOOL mHassRGBFramebuffer;
|
||||
BOOL mHasTexturesRGBDecode;
|
||||
|
||||
// GL 4.x capabilities
|
||||
bool mHasCubeMapArray = false;
|
||||
bool mHasDebugOutput = false;
|
||||
bool mHasTransformFeedback = false;
|
||||
bool mHasAnisotropic = false;
|
||||
|
||||
// Vendor-specific extensions
|
||||
bool mHasAMDAssociations = false;
|
||||
|
||||
BOOL mIsAMD;
|
||||
BOOL mIsNVIDIA;
|
||||
BOOL mIsIntel;
|
||||
|
|
@ -144,9 +119,6 @@ public:
|
|||
// Whether this version of GL is good enough for SL to use
|
||||
BOOL mHasRequirements;
|
||||
|
||||
// Misc extensions
|
||||
BOOL mHasSeparateSpecularColor;
|
||||
|
||||
S32 mDriverVersionMajor;
|
||||
S32 mDriverVersionMinor;
|
||||
S32 mDriverVersionRelease;
|
||||
|
|
@ -157,9 +129,6 @@ public:
|
|||
std::string mGLVersionString;
|
||||
|
||||
S32 mVRAM; // VRAM in MB
|
||||
S32 mGLMaxVertexRange;
|
||||
S32 mGLMaxIndexRange;
|
||||
S32 mGLMaxTextureSize;
|
||||
|
||||
void getPixelFormat(); // Get the best pixel format
|
||||
|
||||
|
|
@ -425,9 +394,7 @@ public:
|
|||
class LLGLSyncFence : public LLGLFence
|
||||
{
|
||||
public:
|
||||
#ifdef GL_ARB_sync
|
||||
GLsync mSync;
|
||||
#endif
|
||||
|
||||
LLGLSyncFence();
|
||||
virtual ~LLGLSyncFence();
|
||||
|
|
|
|||
|
|
@ -41,277 +41,6 @@
|
|||
# include "GL/glh_extensions.h"
|
||||
# undef __APPLE__
|
||||
|
||||
#elif LL_LINUX
|
||||
//----------------------------------------------------------------------------
|
||||
// LL_LINUX
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Linux, MESA headers, but not necessarily assuming MESA runtime.
|
||||
// quotes so we get libraries/.../GL/ version
|
||||
#include "GL/gl.h"
|
||||
#include "GL/glext.h"
|
||||
#include "GL/glu.h"
|
||||
|
||||
|
||||
#if LL_LINUX && !LL_MESA_HEADLESS
|
||||
// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly
|
||||
# define __APPLE__
|
||||
# include "GL/glh_extensions.h"
|
||||
# undef __APPLE__
|
||||
|
||||
/* Although SDL very likely ends up calling glXGetProcAddress() itself,
|
||||
if we use SDL_GL_GetProcAddress() then we get bogus addresses back on
|
||||
some systems. Weird. */
|
||||
/*# include "SDL/SDL.h"
|
||||
# define GLH_EXT_GET_PROC_ADDRESS(p) SDL_GL_GetProcAddress(p) */
|
||||
#define GLX_GLXEXT_PROTOTYPES 1
|
||||
# include "GL/glx.h"
|
||||
# include "GL/glxext.h"
|
||||
// Use glXGetProcAddressARB instead of glXGetProcAddress - the ARB symbol
|
||||
// is considered 'legacy' but works on more machines.
|
||||
# define GLH_EXT_GET_PROC_ADDRESS(p) glXGetProcAddress((const GLubyte*)(p))
|
||||
#endif // LL_LINUX && !LL_MESA_HEADLESS
|
||||
|
||||
#if LL_LINUX && defined(WINGDIAPI)
|
||||
// WINGDIAPI gets set if we are using the linux nvidia gl.h header which needs
|
||||
// the functions below setting up.
|
||||
# define LL_LINUX_NV_GL_HEADERS 1
|
||||
#else
|
||||
# define LL_LINUX_NV_GL_HEADERS 0
|
||||
#endif // LL_LINUX && defined(WINGDIAPI)
|
||||
|
||||
|
||||
#if LL_LINUX_NV_GL_HEADERS
|
||||
// Missing functions when using nvidia headers:
|
||||
extern PFNGLACTIVETEXTUREPROC glActiveTexture;
|
||||
extern PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture;
|
||||
extern PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
|
||||
#endif // LL_LINUX_NV_GL_HEADERS
|
||||
|
||||
// GL_ARB_vertex_array_object
|
||||
extern PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
|
||||
extern PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
|
||||
extern PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
|
||||
extern PFNGLISVERTEXARRAYPROC glIsVertexArray;
|
||||
|
||||
// GL_ARB_vertex_buffer_object
|
||||
extern PFNGLBINDBUFFERPROC glBindBuffer;
|
||||
extern PFNGLDELETEBUFFERSPROC glDeleteBuffers;
|
||||
extern PFNGLGENBUFFERSPROC glGenBuffers;
|
||||
extern PFNGLISBUFFERPROC glIsBuffer;
|
||||
extern PFNGLBUFFERDATAPROC glBufferData;
|
||||
extern PFNGLBUFFERSUBDATAPROC glBufferSubData;
|
||||
extern PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData;
|
||||
extern PFNGLMAPBUFFERPROC glMapBuffer;
|
||||
extern PFNGLUNMAPBUFFERPROC glUnmapBuffer;
|
||||
extern PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv;
|
||||
extern PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv;
|
||||
|
||||
// GL_ARB_sync
|
||||
extern PFNGLFENCESYNCPROC glFenceSync;
|
||||
extern PFNGLISSYNCPROC glIsSync;
|
||||
extern PFNGLDELETESYNCPROC glDeleteSync;
|
||||
extern PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
|
||||
extern PFNGLWAITSYNCPROC glWaitSync;
|
||||
extern PFNGLGETINTEGER64VPROC glGetInteger64v;
|
||||
extern PFNGLGETSYNCIVPROC glGetSynciv;
|
||||
|
||||
// GL_APPLE_flush_buffer_range
|
||||
extern PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE;
|
||||
extern PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE;
|
||||
|
||||
// GL_ARB_map_buffer_range
|
||||
extern PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
|
||||
extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
|
||||
|
||||
// GL_ATI_vertex_array_object
|
||||
extern PFNGLNEWOBJECTBUFFERATIPROC glNewObjectBufferATI;
|
||||
extern PFNGLISOBJECTBUFFERATIPROC glIsObjectBufferATI;
|
||||
extern PFNGLUPDATEOBJECTBUFFERATIPROC glUpdateObjectBufferATI;
|
||||
extern PFNGLGETOBJECTBUFFERFVATIPROC glGetObjectBufferfvATI;
|
||||
extern PFNGLGETOBJECTBUFFERIVATIPROC glGetObjectBufferivATI;
|
||||
extern PFNGLFREEOBJECTBUFFERATIPROC glFreeObjectBufferATI;
|
||||
extern PFNGLARRAYOBJECTATIPROC glArrayObjectATI;
|
||||
extern PFNGLVERTEXATTRIBARRAYOBJECTATIPROC glVertexAttribArrayObjectATI;
|
||||
extern PFNGLGETARRAYOBJECTFVATIPROC glGetArrayObjectfvATI;
|
||||
extern PFNGLGETARRAYOBJECTIVATIPROC glGetArrayObjectivATI;
|
||||
extern PFNGLVARIANTARRAYOBJECTATIPROC glVariantObjectArrayATI;
|
||||
extern PFNGLGETVARIANTARRAYOBJECTFVATIPROC glGetVariantArrayObjectfvATI;
|
||||
extern PFNGLGETVARIANTARRAYOBJECTIVATIPROC glGetVariantArrayObjectivATI;
|
||||
|
||||
// GL_ARB_occlusion_query
|
||||
extern PFNGLGENQUERIESPROC glGenQueries;
|
||||
extern PFNGLDELETEQUERIESPROC glDeleteQueries;
|
||||
extern PFNGLISQUERYPROC glIsQuery;
|
||||
extern PFNGLBEGINQUERYPROC glBeginQuery;
|
||||
extern PFNGLENDQUERYPROC glEndQuery;
|
||||
extern PFNGLGETQUERYIVPROC glGetQueryiv;
|
||||
extern PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv;
|
||||
extern PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv;
|
||||
|
||||
// GL_ARB_timer_query
|
||||
extern PFNGLQUERYCOUNTERPROC glQueryCounter;
|
||||
extern PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v;
|
||||
extern PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v;
|
||||
|
||||
// GL_ARB_point_parameters
|
||||
extern PFNGLPOINTPARAMETERFPROC glPointParameterf;
|
||||
extern PFNGLPOINTPARAMETERFVPROC glPointParameterfv;
|
||||
|
||||
// GL_ARB_shader_objects
|
||||
extern PFNGLDELETEOBJECTPROC glDeleteObject;
|
||||
extern PFNGLGETHANDLEPROC glGetHandle;
|
||||
extern PFNGLDETACHOBJECTPROC glDetachObject;
|
||||
extern PFNGLCREATESHADEROBJECTPROC glCreateShaderObject;
|
||||
extern PFNGLSHADERSOURCEPROC glShaderSource;
|
||||
extern PFNGLCOMPILESHADERPROC glCompileShader;
|
||||
extern PFNGLCREATEPROGRAMOBJECTPROC glCreateProgramObject;
|
||||
extern PFNGLATTACHOBJECTPROC glAttachObject;
|
||||
extern PFNGLLINKPROGRAMPROC glLinkProgram;
|
||||
extern PFNGLUSEPROGRAMOBJECTPROC glUseProgramObject;
|
||||
extern PFNGLVALIDATEPROGRAMPROC glValidateProgram;
|
||||
extern PFNGLUNIFORM1FPROC glUniform1f;
|
||||
extern PFNGLUNIFORM2FPROC glUniform2f;
|
||||
extern PFNGLUNIFORM3FPROC glUniform3f;
|
||||
extern PFNGLUNIFORM4FPROC glUniform4f;
|
||||
extern PFNGLUNIFORM1IPROC glUniform1i;
|
||||
extern PFNGLUNIFORM2IPROC glUniform2i;
|
||||
extern PFNGLUNIFORM3IPROC glUniform3i;
|
||||
extern PFNGLUNIFORM4IPROC glUniform4i;
|
||||
extern PFNGLUNIFORM1FVPROC glUniform1fv;
|
||||
extern PFNGLUNIFORM2FVPROC glUniform2fv;
|
||||
extern PFNGLUNIFORM3FVPROC glUniform3fv;
|
||||
extern PFNGLUNIFORM4FVPROC glUniform4fv;
|
||||
extern PFNGLUNIFORM1IVPROC glUniform1iv;
|
||||
extern PFNGLUNIFORM2IVPROC glUniform2iv;
|
||||
extern PFNGLUNIFORM3IVPROC glUniform3iv;
|
||||
extern PFNGLUNIFORM4IVPROC glUniform4iv;
|
||||
extern PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv;
|
||||
extern PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv;
|
||||
extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
|
||||
extern PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
|
||||
extern PFNGLGETOBJECTPARAMETERFVPROC glGetObjectParameterfv;
|
||||
extern PFNGLGETOBJECTPARAMETERIVPROC glGetObjectParameteriv;
|
||||
extern PFNGLGETINFOLOGPROC glGetInfoLog;
|
||||
extern PFNGLGETATTACHEDOBJECTSPROC glGetAttachedObjects;
|
||||
extern PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
|
||||
extern PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform;
|
||||
extern PFNGLGETUNIFORMFVPROC glGetUniformfv;
|
||||
extern PFNGLGETUNIFORMIVPROC glGetUniformiv;
|
||||
extern PFNGLGETSHADERSOURCEPROC glGetShaderSource;
|
||||
|
||||
// GL_ARB_vertex_shader
|
||||
extern PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d;
|
||||
extern PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv;
|
||||
extern PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f;
|
||||
extern PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv;
|
||||
extern PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s;
|
||||
extern PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv;
|
||||
extern PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d;
|
||||
extern PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv;
|
||||
extern PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f;
|
||||
extern PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv;
|
||||
extern PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s;
|
||||
extern PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv;
|
||||
extern PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d;
|
||||
extern PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv;
|
||||
extern PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f;
|
||||
extern PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv;
|
||||
extern PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s;
|
||||
extern PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv;
|
||||
extern PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4nbv;
|
||||
extern PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4niv;
|
||||
extern PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4nsv;
|
||||
extern PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4nub;
|
||||
extern PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4nubv;
|
||||
extern PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4nuiv;
|
||||
extern PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4nusv;
|
||||
extern PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv;
|
||||
extern PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d;
|
||||
extern PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv;
|
||||
extern PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
|
||||
extern PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv;
|
||||
extern PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv;
|
||||
extern PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s;
|
||||
extern PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv;
|
||||
extern PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv;
|
||||
extern PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv;
|
||||
extern PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv;
|
||||
extern PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
|
||||
extern PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
|
||||
extern PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
|
||||
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
|
||||
extern PFNGLPROGRAMSTRINGPROC glProgramString;
|
||||
extern PFNGLBINDPROGRAMPROC glBindProgram;
|
||||
extern PFNGLDELETEPROGRAMSPROC glDeletePrograms;
|
||||
extern PFNGLGENPROGRAMSPROC glGenPrograms;
|
||||
extern PFNGLPROGRAMENVPARAMETER4DPROC glProgramEnvParameter4d;
|
||||
extern PFNGLPROGRAMENVPARAMETER4DVPROC glProgramEnvParameter4dv;
|
||||
extern PFNGLPROGRAMENVPARAMETER4FPROC glProgramEnvParameter4f;
|
||||
extern PFNGLPROGRAMENVPARAMETER4FVPROC glProgramEnvParameter4fv;
|
||||
extern PFNGLPROGRAMLOCALPARAMETER4DPROC glProgramLocalParameter4d;
|
||||
extern PFNGLPROGRAMLOCALPARAMETER4DVPROC glProgramLocalParameter4dv;
|
||||
extern PFNGLPROGRAMLOCALPARAMETER4FPROC glProgramLocalParameter4f;
|
||||
extern PFNGLPROGRAMLOCALPARAMETER4FVPROC glProgramLocalParameter4fv;
|
||||
extern PFNGLGETPROGRAMENVPARAMETERDVPROC glGetProgramEnvParameterdv;
|
||||
extern PFNGLGETPROGRAMENVPARAMETERFVPROC glGetProgramEnvParameterfv;
|
||||
extern PFNGLGETPROGRAMLOCALPARAMETERDVPROC glGetProgramLocalParameterdv;
|
||||
extern PFNGLGETPROGRAMLOCALPARAMETERFVPROC glGetProgramLocalParameterfv;
|
||||
extern PFNGLGETPROGRAMIVPROC glGetProgramiv;
|
||||
extern PFNGLGETPROGRAMSTRINGPROC glGetProgramString;
|
||||
extern PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv;
|
||||
extern PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv;
|
||||
extern PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv;
|
||||
extern PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv;
|
||||
extern PFNGLISPROGRAMPROC glIsProgram;
|
||||
extern PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
|
||||
extern PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib;
|
||||
extern PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation;
|
||||
|
||||
extern PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D;
|
||||
extern PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage;
|
||||
|
||||
//GL_EXT_blend_func_separate
|
||||
extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT;
|
||||
|
||||
//GL_ARB_framebuffer_object
|
||||
extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
|
||||
extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
|
||||
extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
|
||||
extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
|
||||
extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
|
||||
extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
|
||||
extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
|
||||
extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
|
||||
extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
|
||||
extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
|
||||
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
|
||||
extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
|
||||
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
|
||||
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
|
||||
extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
|
||||
extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
|
||||
extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
|
||||
extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
|
||||
|
||||
//GL_ARB_draw_buffers
|
||||
extern PFNGLDRAWBUFFERSPROC glDrawBuffers;
|
||||
|
||||
//GL_ARB_texture_multisample
|
||||
extern PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample;
|
||||
extern PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample;
|
||||
extern PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv;
|
||||
extern PFNGLSAMPLEMASKIPROC glSampleMaski;
|
||||
|
||||
//transform feedback (4.0 core)
|
||||
extern PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback;
|
||||
extern PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback;
|
||||
extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings;
|
||||
extern PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
|
||||
extern PFNGLBINDBUFFERBASEPROC glBindBufferBase;
|
||||
|
||||
#elif LL_WINDOWS
|
||||
//----------------------------------------------------------------------------
|
||||
// LL_WINDOWS
|
||||
|
|
@ -345,12 +74,6 @@ extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
|
|||
// WGL_ARB_create_context
|
||||
extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
|
||||
|
||||
// GL_VERSION_1_2
|
||||
//extern PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
|
||||
//extern PFNGLTEXIMAGE3DPROC glTexImage3D;
|
||||
//extern PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D;
|
||||
//extern PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D;
|
||||
|
||||
// GL_VERSION_1_3
|
||||
extern PFNGLACTIVETEXTUREPROC glActiveTexture;
|
||||
extern PFNGLSAMPLECOVERAGEPROC glSampleCoverage;
|
||||
|
|
|
|||
|
|
@ -352,7 +352,7 @@ void LLImageGL::updateStats(F32 current_time)
|
|||
//static
|
||||
void LLImageGL::destroyGL(BOOL save_state)
|
||||
{
|
||||
for (S32 stage = 0; stage < gGLManager.mNumTextureUnits; stage++)
|
||||
for (S32 stage = 0; stage < gGLManager.mNumTextureImageUnits; stage++)
|
||||
{
|
||||
gGL.getTexUnit(stage)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
}
|
||||
|
|
@ -520,7 +520,6 @@ void LLImageGL::init(BOOL usemipmaps)
|
|||
mPickMaskHeight = 0;
|
||||
mUseMipMaps = usemipmaps;
|
||||
mHasExplicitFormat = FALSE;
|
||||
mAutoGenMips = FALSE;
|
||||
|
||||
mIsMask = FALSE;
|
||||
mNeedsAlphaAndPickMask = TRUE ;
|
||||
|
|
@ -1069,30 +1068,12 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
|
|||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 3:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGB8;
|
||||
}
|
||||
mFormatInternal = GL_RGB8;
|
||||
mFormatPrimary = GL_RGB;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 4:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8_ALPHA8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGBA8;
|
||||
}
|
||||
mFormatInternal = GL_RGBA8;
|
||||
mFormatPrimary = GL_RGBA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
|
|
@ -1540,30 +1521,12 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S
|
|||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 3:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGB8;
|
||||
}
|
||||
mFormatInternal = GL_RGB8;
|
||||
mFormatPrimary = GL_RGB;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 4:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8_ALPHA8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGBA8;
|
||||
}
|
||||
mFormatInternal = GL_RGBA8;
|
||||
mFormatPrimary = GL_RGBA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
|
|
@ -1652,7 +1615,7 @@ BOOL LLImageGL::createGLTexture(S32 discard_level, const U8* data_in, BOOL data_
|
|||
|
||||
if (mUseMipMaps)
|
||||
{
|
||||
mAutoGenMips = gGLManager.mHasMipMapGeneration;
|
||||
mAutoGenMips = true;
|
||||
}
|
||||
|
||||
mCurrentDiscardLevel = discard_level;
|
||||
|
|
@ -1709,44 +1672,37 @@ void LLImageGL::syncToMainThread(LLGLuint new_tex_name)
|
|||
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("cglt - sync");
|
||||
if (gGLManager.mHasSync)
|
||||
if (gGLManager.mIsNVIDIA)
|
||||
{
|
||||
if (gGLManager.mIsNVIDIA)
|
||||
{
|
||||
// wait for texture upload to finish before notifying main thread
|
||||
// upload is complete
|
||||
auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
glFlush();
|
||||
glClientWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
|
||||
glDeleteSync(sync);
|
||||
}
|
||||
else
|
||||
{
|
||||
// post a sync to the main thread (will execute before tex name swap lambda below)
|
||||
// glFlush calls here are partly superstitious and partly backed by observation
|
||||
// on AMD hardware
|
||||
glFlush();
|
||||
auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
glFlush();
|
||||
LL::WorkQueue::postMaybe(
|
||||
mMainQueue,
|
||||
[=]()
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("cglt - wait sync");
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("glWaitSync");
|
||||
glWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
|
||||
}
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("glDeleteSync");
|
||||
glDeleteSync(sync);
|
||||
}
|
||||
});
|
||||
}
|
||||
// wait for texture upload to finish before notifying main thread
|
||||
// upload is complete
|
||||
auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
glFlush();
|
||||
glClientWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
|
||||
glDeleteSync(sync);
|
||||
}
|
||||
else
|
||||
{
|
||||
glFinish();
|
||||
// post a sync to the main thread (will execute before tex name swap lambda below)
|
||||
// glFlush calls here are partly superstitious and partly backed by observation
|
||||
// on AMD hardware
|
||||
glFlush();
|
||||
auto sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||
glFlush();
|
||||
LL::WorkQueue::postMaybe(
|
||||
mMainQueue,
|
||||
[=]()
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("cglt - wait sync");
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("glWaitSync");
|
||||
glWaitSync(sync, 0, GL_TIMEOUT_IGNORED);
|
||||
}
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("glDeleteSync");
|
||||
glDeleteSync(sync);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -222,7 +222,7 @@ private:
|
|||
U16 mPickMaskHeight;
|
||||
S8 mUseMipMaps;
|
||||
BOOL mHasExplicitFormat; // If false (default), GL format is f(mComponents)
|
||||
S8 mAutoGenMips;
|
||||
bool mAutoGenMips = false;
|
||||
|
||||
BOOL mIsMask;
|
||||
BOOL mNeedsAlphaAndPickMask;
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ bool LLTexUnit::bind(LLCubeMap* cubeMap)
|
|||
|
||||
if (mCurrTexture != cubeMap->mImages[0]->getTexName())
|
||||
{
|
||||
if (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
|
||||
if (LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
activate();
|
||||
enable(LLTexUnit::TT_CUBE_MAP);
|
||||
|
|
@ -516,22 +516,15 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
|
|||
}
|
||||
}
|
||||
|
||||
if (gGLManager.mHasAnisotropic)
|
||||
if (gGLManager.mGLVersion >= 4.59f)
|
||||
{
|
||||
if (LLImageGL::sGlobalUseAnisotropic && option == TFO_ANISOTROPIC)
|
||||
{
|
||||
if (gGL.mMaxAnisotropy < 1.f)
|
||||
{
|
||||
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gGL.mMaxAnisotropy);
|
||||
|
||||
LL_INFOS() << "gGL.mMaxAnisotropy: " << gGL.mMaxAnisotropy << LL_ENDL ;
|
||||
gGL.mMaxAnisotropy = llmax(1.f, gGL.mMaxAnisotropy) ;
|
||||
}
|
||||
glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGL.mMaxAnisotropy);
|
||||
glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, gGLManager.mMaxAnisotropy);
|
||||
}
|
||||
else
|
||||
{
|
||||
glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.f);
|
||||
glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY, 1.f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -650,29 +643,6 @@ void LLTexUnit::debugTextureUnit(void)
|
|||
void LLTexUnit::setTextureColorSpace(eTextureColorSpace space)
|
||||
{
|
||||
mTexColorSpace = space;
|
||||
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
if (space == TCS_SRGB)
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
|
||||
}
|
||||
else
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
|
||||
}
|
||||
|
||||
if (gDebugGL)
|
||||
{
|
||||
assert_glerror();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
LLLightState::LLLightState(S32 index)
|
||||
|
|
@ -847,7 +817,6 @@ LLRender::LLRender()
|
|||
//mQuadCycle(0), // <FS:Ansariel> Remove QUADS rendering mode
|
||||
mMode(LLRender::TRIANGLES),
|
||||
mCurrTextureUnitIndex(0),
|
||||
mMaxAnisotropy(0.f),
|
||||
mLineWidth(1.f), // <FS> Line width OGL core profile fix by Rye Mutt
|
||||
// <FS:Ansariel> Don't ignore OpenGL max line width
|
||||
mMaxLineWidthSmooth(1.f),
|
||||
|
|
@ -917,11 +886,9 @@ void LLRender::init(bool needs_vertex_buffer)
|
|||
|
||||
if (sGLCoreProfile && !LLVertexBuffer::sUseVAO)
|
||||
{ //bind a dummy vertex array object so we're core profile compliant
|
||||
#ifdef GL_ARB_vertex_array_object
|
||||
U32 ret;
|
||||
glGenVertexArrays(1, &ret);
|
||||
glBindVertexArray(ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (needs_vertex_buffer)
|
||||
|
|
@ -1525,12 +1492,7 @@ void LLRender::blendFunc(eBlendFactor color_sfactor, eBlendFactor color_dfactor,
|
|||
llassert(color_dfactor < BF_UNDEF);
|
||||
llassert(alpha_sfactor < BF_UNDEF);
|
||||
llassert(alpha_dfactor < BF_UNDEF);
|
||||
if (!LLRender::sGLCoreProfile && !gGLManager.mHasBlendFuncSeparate)
|
||||
{
|
||||
LL_WARNS_ONCE("render") << "no glBlendFuncSeparateEXT(), using color-only blend func" << LL_ENDL;
|
||||
blendFunc(color_sfactor, color_dfactor);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCurrBlendColorSFactor != color_sfactor || mCurrBlendColorDFactor != color_dfactor ||
|
||||
mCurrBlendAlphaSFactor != alpha_sfactor || mCurrBlendAlphaDFactor != alpha_dfactor)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -514,8 +514,6 @@ private:
|
|||
eBlendFactor mCurrBlendAlphaSFactor;
|
||||
eBlendFactor mCurrBlendAlphaDFactor;
|
||||
|
||||
F32 mMaxAnisotropy;
|
||||
|
||||
std::vector<LLVector3> mUIOffset;
|
||||
std::vector<LLVector3> mUIScale;
|
||||
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ bool LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo
|
|||
mUsage = usage;
|
||||
mUseDepth = depth;
|
||||
|
||||
if ((sUseFBO || use_fbo) && gGLManager.mHasFramebufferObject)
|
||||
if ((sUseFBO || use_fbo))
|
||||
{
|
||||
if (depth)
|
||||
{
|
||||
|
|
@ -234,11 +234,9 @@ bool LLRenderTarget::addColorAttachment(U32 color_fmt)
|
|||
llassert( offset < 4 );
|
||||
return false;
|
||||
}
|
||||
if( offset > 0 && (mFBO == 0 || !gGLManager.mHasDrawBuffers) )
|
||||
if( offset > 0 && (mFBO == 0) )
|
||||
{
|
||||
LL_WARNS() << "FBO not used or no drawbuffers available; mFBO=" << (U32)mFBO << " gGLManager.mHasDrawBuffers=" << (U32)gGLManager.mHasDrawBuffers << LL_ENDL;
|
||||
llassert( mFBO != 0 );
|
||||
llassert( gGLManager.mHasDrawBuffers );
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -484,14 +482,12 @@ void LLRenderTarget::bindTarget()
|
|||
sCurFBO = mFBO;
|
||||
|
||||
stop_glerror();
|
||||
if (gGLManager.mHasDrawBuffers)
|
||||
{ //setup multiple render targets
|
||||
GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
|
||||
GL_COLOR_ATTACHMENT1,
|
||||
GL_COLOR_ATTACHMENT2,
|
||||
GL_COLOR_ATTACHMENT3};
|
||||
glDrawBuffers(mTex.size(), drawbuffers);
|
||||
}
|
||||
//setup multiple render targets
|
||||
GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0,
|
||||
GL_COLOR_ATTACHMENT1,
|
||||
GL_COLOR_ATTACHMENT2,
|
||||
GL_COLOR_ATTACHMENT3};
|
||||
glDrawBuffers(mTex.size(), drawbuffers);
|
||||
|
||||
if (mTex.empty())
|
||||
{ //no color buffer to draw to
|
||||
|
|
|
|||
|
|
@ -759,7 +759,7 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
|||
//static
|
||||
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
|
||||
{
|
||||
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject;
|
||||
sEnableVBOs = use_vbo;
|
||||
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping;
|
||||
}
|
||||
|
||||
|
|
@ -768,9 +768,7 @@ void LLVertexBuffer::unbind()
|
|||
{
|
||||
if (sGLRenderArray)
|
||||
{
|
||||
#if GL_ARB_vertex_array_object
|
||||
glBindVertexArray(0);
|
||||
#endif
|
||||
sGLRenderArray = 0;
|
||||
sGLRenderIndices = 0;
|
||||
sIBOActive = false;
|
||||
|
|
@ -938,9 +936,7 @@ LLVertexBuffer::~LLVertexBuffer()
|
|||
|
||||
if (mGLArray)
|
||||
{
|
||||
#if GL_ARB_vertex_array_object
|
||||
releaseVAOName(mGLArray);
|
||||
#endif
|
||||
}
|
||||
|
||||
sCount--;
|
||||
|
|
@ -971,10 +967,7 @@ void LLVertexBuffer::placeFence() const
|
|||
{
|
||||
/*if (!mFence && useVBOs())
|
||||
{
|
||||
if (gGLManager.mHasSync)
|
||||
{
|
||||
mFence = new LLGLSyncFence();
|
||||
}
|
||||
mFence = new LLGLSyncFence();
|
||||
}
|
||||
|
||||
if (mFence)
|
||||
|
|
@ -1249,11 +1242,9 @@ bool LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
|
|||
//actually allocate space for the vertex buffer if using VBO mapping
|
||||
flush(); //unmap
|
||||
|
||||
if (gGLManager.mHasVertexArrayObject && useVBOs() && sUseVAO)
|
||||
if (useVBOs() && sUseVAO)
|
||||
{
|
||||
#if GL_ARB_vertex_array_object
|
||||
mGLArray = getVAOName();
|
||||
#endif
|
||||
setupVertexArray();
|
||||
}
|
||||
}
|
||||
|
|
@ -1269,9 +1260,7 @@ void LLVertexBuffer::setupVertexArray()
|
|||
}
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;
|
||||
#if GL_ARB_vertex_array_object
|
||||
glBindVertexArray(mGLArray);
|
||||
#endif
|
||||
sGLRenderArray = mGLArray;
|
||||
|
||||
static const U32 attrib_size[] =
|
||||
|
|
@ -1458,7 +1447,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
|
|||
|
||||
if (useVBOs())
|
||||
{
|
||||
if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
|
||||
if (!mMappable)
|
||||
{
|
||||
if (count == -1)
|
||||
{
|
||||
|
|
@ -1507,58 +1496,34 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
|
|||
{
|
||||
U8* src = NULL;
|
||||
waitFence();
|
||||
if (gGLManager.mHasMapBufferRange)
|
||||
if (map_range)
|
||||
{
|
||||
if (map_range)
|
||||
{
|
||||
#ifdef GL_ARB_map_buffer_range
|
||||
S32 offset = mOffsets[type] + sTypeSize[type]*index;
|
||||
S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
|
||||
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, offset, length,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT |
|
||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef GL_ARB_map_buffer_range
|
||||
|
||||
if (gDebugGL)
|
||||
{
|
||||
GLint size = 0;
|
||||
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
|
||||
|
||||
if (size < mSize)
|
||||
{
|
||||
LL_ERRS() << "Invalid buffer size." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, 0, mSize,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (gGLManager.mHasFlushBufferRange)
|
||||
{
|
||||
if (map_range)
|
||||
{
|
||||
src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
}
|
||||
else
|
||||
{
|
||||
src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
}
|
||||
S32 offset = mOffsets[type] + sTypeSize[type]*index;
|
||||
S32 length = (sTypeSize[type]*count+0xF) & ~0xF;
|
||||
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, offset, length,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT |
|
||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||
}
|
||||
else
|
||||
{
|
||||
map_range = false;
|
||||
src = (U8*) glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
if (gDebugGL)
|
||||
{
|
||||
GLint size = 0;
|
||||
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
|
||||
|
||||
if (size < mSize)
|
||||
{
|
||||
LL_ERRS() << "Invalid buffer size." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
src = (U8*) glMapBufferRange(GL_ARRAY_BUFFER, 0, mSize,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||
}
|
||||
|
||||
llassert(src != NULL);
|
||||
llassert(src != NULL);
|
||||
|
||||
mMappedData = LL_NEXT_ALIGNED_ADDRESS<U8>(src);
|
||||
mAlignedOffset = mMappedData - src;
|
||||
|
|
@ -1584,7 +1549,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
|
|||
//--------------------
|
||||
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &buff);
|
||||
if ((GLuint)buff != mGLBuffer)
|
||||
{
|
||||
LL_ERRS() << "Invalid GL vertex buffer bound: " << buff << LL_ENDL;
|
||||
|
|
@ -1605,7 +1570,7 @@ U8* LLVertexBuffer::mapVertexBuffer(S32 type, S32 index, S32 count, bool map_ran
|
|||
map_range = false;
|
||||
}
|
||||
|
||||
if (map_range && gGLManager.mHasMapBufferRange && mMappable)
|
||||
if (map_range && mMappable)
|
||||
{
|
||||
return mMappedData;
|
||||
}
|
||||
|
|
@ -1631,7 +1596,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
|
|||
|
||||
if (useVBOs())
|
||||
{
|
||||
if (!mMappable || gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
|
||||
if (!mMappable)
|
||||
{
|
||||
if (count == -1)
|
||||
{
|
||||
|
|
@ -1672,7 +1637,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
|
|||
if (gDebugGL && useVBOs())
|
||||
{
|
||||
GLint elem = 0;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &elem);
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &elem);
|
||||
|
||||
if (elem != mGLIndices)
|
||||
{
|
||||
|
|
@ -1688,48 +1653,24 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
|
|||
{
|
||||
U8* src = NULL;
|
||||
waitFence();
|
||||
if (gGLManager.mHasMapBufferRange)
|
||||
if (map_range)
|
||||
{
|
||||
if (map_range)
|
||||
{
|
||||
#ifdef GL_ARB_map_buffer_range
|
||||
S32 offset = sizeof(U16)*index;
|
||||
S32 length = sizeof(U16)*count;
|
||||
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT |
|
||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef GL_ARB_map_buffer_range
|
||||
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(U16)*mNumIndices,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
else if (gGLManager.mHasFlushBufferRange)
|
||||
{
|
||||
if (map_range)
|
||||
{
|
||||
src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
}
|
||||
else
|
||||
{
|
||||
src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
}
|
||||
S32 offset = sizeof(U16)*index;
|
||||
S32 length = sizeof(U16)*count;
|
||||
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT |
|
||||
GL_MAP_INVALIDATE_RANGE_BIT);
|
||||
}
|
||||
else
|
||||
{
|
||||
map_range = false;
|
||||
src = (U8*) glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
|
||||
src = (U8*) glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(U16)*mNumIndices,
|
||||
GL_MAP_WRITE_BIT |
|
||||
GL_MAP_FLUSH_EXPLICIT_BIT);
|
||||
}
|
||||
|
||||
|
||||
llassert(src != NULL);
|
||||
|
||||
|
||||
mMappedIndexData = src; //LL_NEXT_ALIGNED_ADDRESS<U8>(src);
|
||||
mAlignedIndexOffset = mMappedIndexData - src;
|
||||
stop_glerror();
|
||||
|
|
@ -1744,7 +1685,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
|
|||
if(mMappable)
|
||||
{
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &buff);
|
||||
if ((GLuint)buff != mGLIndices)
|
||||
{
|
||||
LL_ERRS() << "Invalid GL index buffer bound: " << buff << LL_ENDL;
|
||||
|
|
@ -1763,7 +1704,7 @@ U8* LLVertexBuffer::mapIndexBuffer(S32 index, S32 count, bool map_range)
|
|||
map_range = false;
|
||||
}
|
||||
|
||||
if (map_range && gGLManager.mHasMapBufferRange && mMappable)
|
||||
if (map_range && mMappable)
|
||||
{
|
||||
return mMappedIndexData;
|
||||
}
|
||||
|
|
@ -1827,25 +1768,20 @@ void LLVertexBuffer::unmapBuffer()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
|
||||
if (!mMappedVertexRegions.empty())
|
||||
{
|
||||
if (!mMappedVertexRegions.empty())
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush vertex");
|
||||
for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush vertex");
|
||||
for (U32 i = 0; i < mMappedVertexRegions.size(); ++i)
|
||||
{
|
||||
const MappedRegion& region = mMappedVertexRegions[i];
|
||||
S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
|
||||
S32 length = sTypeSize[region.mType]*region.mCount;
|
||||
if (gGLManager.mHasMapBufferRange)
|
||||
{
|
||||
glFlushMappedBufferRange(GL_ARRAY_BUFFER, offset, length);
|
||||
}
|
||||
}
|
||||
|
||||
mMappedVertexRegions.clear();
|
||||
const MappedRegion& region = mMappedVertexRegions[i];
|
||||
S32 offset = region.mIndex >= 0 ? mOffsets[region.mType]+sTypeSize[region.mType]*region.mIndex : 0;
|
||||
S32 length = sTypeSize[region.mType]*region.mCount;
|
||||
glFlushMappedBufferRange(GL_ARRAY_BUFFER, offset, length);
|
||||
}
|
||||
|
||||
mMappedVertexRegions.clear();
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
glUnmapBuffer(GL_ARRAY_BUFFER);
|
||||
stop_glerror();
|
||||
|
|
@ -1899,25 +1835,19 @@ void LLVertexBuffer::unmapBuffer()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange)
|
||||
if (!mMappedIndexRegions.empty())
|
||||
{
|
||||
if (!mMappedIndexRegions.empty())
|
||||
for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
|
||||
{
|
||||
for (U32 i = 0; i < mMappedIndexRegions.size(); ++i)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush index");
|
||||
const MappedRegion& region = mMappedIndexRegions[i];
|
||||
S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
|
||||
S32 length = sizeof(U16)*region.mCount;
|
||||
if (gGLManager.mHasMapBufferRange)
|
||||
{
|
||||
glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length);
|
||||
}
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
mMappedIndexRegions.clear();
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_VERTEX("unmapBuffer - flush index");
|
||||
const MappedRegion& region = mMappedIndexRegions[i];
|
||||
S32 offset = region.mIndex >= 0 ? sizeof(U16)*region.mIndex : 0;
|
||||
S32 length = sizeof(U16)*region.mCount;
|
||||
glFlushMappedBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
mMappedIndexRegions.clear();
|
||||
}
|
||||
|
||||
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
|
||||
|
|
@ -2060,9 +1990,7 @@ bool LLVertexBuffer::bindGLArray()
|
|||
{
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_VERTEX;
|
||||
#if GL_ARB_vertex_array_object
|
||||
glBindVertexArray(mGLArray);
|
||||
#endif
|
||||
sGLRenderArray = mGLArray;
|
||||
}
|
||||
|
||||
|
|
@ -2254,7 +2182,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
|
|||
if (gDebugGL && !mGLArray)
|
||||
{
|
||||
GLint buff;
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &buff);
|
||||
if ((GLuint)buff != mGLBuffer)
|
||||
{
|
||||
if (gDebugSession)
|
||||
|
|
@ -2269,7 +2197,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
|
|||
|
||||
if (mGLIndices)
|
||||
{
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff);
|
||||
glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &buff);
|
||||
if ((GLuint)buff != mGLIndices)
|
||||
{
|
||||
if (gDebugSession)
|
||||
|
|
@ -2290,9 +2218,7 @@ void LLVertexBuffer::setBuffer(U32 data_mask)
|
|||
{
|
||||
if (sGLRenderArray)
|
||||
{
|
||||
#if GL_ARB_vertex_array_object
|
||||
glBindVertexArray(0);
|
||||
#endif
|
||||
sGLRenderArray = 0;
|
||||
sGLRenderIndices = 0;
|
||||
sIBOActive = false;
|
||||
|
|
|
|||
|
|
@ -13914,20 +13914,6 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderUseTransformFeedback</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>[EXPERIMENTAL] Use transform feedback shaders for LoD updates</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
<key>Backup</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderVBOMappingDisable</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ void main()
|
|||
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ uniform sampler2D diffuseMap;
|
|||
VARYING float pos_w;
|
||||
VARYING float target_pos_x;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ void main()
|
|||
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file attachmentShadowV.glsl
|
||||
* @file attachmentAlphaShadowV.glsl
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
|
|
@ -35,7 +35,7 @@ ATTRIBUTE vec2 texcoord0;
|
|||
mat4 getObjectSkinnedTransform();
|
||||
void passTextureIndex();
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
|
@ -61,7 +61,7 @@ void main()
|
|||
|
||||
vertex_color = diffuse_color;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
p.z = max(p.z, -p.w+0.01);
|
||||
post_pos = p;
|
||||
gl_Position = p;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file treeShadowF.glsl
|
||||
* @file avatarAlphaMaskShadowF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
|
|
@ -32,7 +32,7 @@ out vec4 frag_color;
|
|||
uniform float minimum_alpha;
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
|
|
@ -59,7 +59,7 @@ void main()
|
|||
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ uniform float minimum_alpha;
|
|||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
|
||||
|
|
@ -61,7 +61,7 @@ void main()
|
|||
|
||||
frag_color = vec4(1,1,1,1);
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file avatarShadowV.glsl
|
||||
* @file avatarAlphaShadowV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
|
|
@ -34,7 +34,7 @@ ATTRIBUTE vec3 position;
|
|||
ATTRIBUTE vec3 normal;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
VARYING vec4 post_pos;
|
||||
#endif
|
||||
VARYING float pos_w;
|
||||
|
|
@ -66,7 +66,7 @@ void main()
|
|||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
#if !DEPTH_CLAMP
|
||||
#if !defined(DEPTH_CLAMP)
|
||||
post_pos = pos;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
version 36
|
||||
version 37
|
||||
// The version number above should be incremented IF AND ONLY IF some
|
||||
// change has been made that is sufficiently important to justify
|
||||
// resetting the graphics preferences of all users to the recommended
|
||||
|
|
@ -286,14 +286,9 @@ list Intel
|
|||
RenderAnisotropic 1 0
|
||||
RenderFSAASamples 1 0
|
||||
RenderGLMultiThreaded 1 0
|
||||
RenderGLContextCoreProfile 1 0
|
||||
|
||||
// AMD cards generally perform better when not using VBOs for streaming data
|
||||
// AMD cards also prefer an OpenGL Compatibility Profile Context
|
||||
// HACK: Current AMD drivers have bugged cubemap arrays, limit number of reflection probes to 16
|
||||
list AMD
|
||||
RenderUseStreamVBO 1 0
|
||||
RenderGLContextCoreProfile 1 0
|
||||
RenderReflectionProbeCount 1 16
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -177,19 +177,6 @@ void LLDrawPoolTerrain::render(S32 pass)
|
|||
|
||||
LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
|
||||
|
||||
if (!gGLManager.mHasMultitexture)
|
||||
{
|
||||
// No multitexture, render simple land.
|
||||
renderSimple(); // Render without multitexture
|
||||
return;
|
||||
}
|
||||
// Render simplified land if video card can't do sufficient multitexturing
|
||||
if (!gGLManager.mHasARBEnvCombine || (gGLManager.mNumTextureUnits < 2))
|
||||
{
|
||||
renderSimple(); // Render without multitexture
|
||||
return;
|
||||
}
|
||||
|
||||
LLGLSPipeline gls;
|
||||
|
||||
if (mShaderLevel > 1 && sShader->mShaderLevel > 0)
|
||||
|
|
@ -206,10 +193,6 @@ void LLDrawPoolTerrain::render(S32 pass)
|
|||
{
|
||||
renderSimple();
|
||||
}
|
||||
else if (gGLManager.mNumTextureUnits < 4)
|
||||
{
|
||||
renderFull2TU();
|
||||
}
|
||||
else
|
||||
{
|
||||
renderFull4TU();
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ void LLDrawPoolWater::restoreGL()
|
|||
|
||||
void LLDrawPoolWater::prerender()
|
||||
{
|
||||
mShaderLevel = (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) ? LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WATER) : 0;
|
||||
mShaderLevel = LLCubeMap::sUseCubeMaps ? LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WATER) : 0;
|
||||
}
|
||||
|
||||
S32 LLDrawPoolWater::getNumPasses()
|
||||
|
|
@ -192,12 +192,6 @@ void LLDrawPoolWater::render(S32 pass)
|
|||
|
||||
stop_glerror();
|
||||
|
||||
if (!gGLManager.mHasMultitexture)
|
||||
{
|
||||
// Ack! No multitexture! Bail!
|
||||
return;
|
||||
}
|
||||
|
||||
LLFace* refl_face = voskyp->getReflFace();
|
||||
|
||||
gPipeline.disableLights();
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
|
|||
// </FS:Beq>
|
||||
}
|
||||
|
||||
if (gGLManager.mHasFramebufferObject && gPipeline.mBake.isComplete())
|
||||
if (gPipeline.mBake.isComplete())
|
||||
{ //using offscreen render target, just use the bottom left corner
|
||||
mOrigin.set(0, 0);
|
||||
}
|
||||
|
|
@ -216,7 +216,7 @@ BOOL LLViewerDynamicTexture::updateAllInstances()
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
bool use_fbo = gGLManager.mHasFramebufferObject && gPipeline.mBake.isComplete();
|
||||
bool use_fbo = gPipeline.mBake.isComplete();
|
||||
|
||||
if (use_fbo)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1264,59 +1264,6 @@ bool LLFace::canRenderAsMask()
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
void LLFace::cacheFaceInVRAM(const LLVolumeFace& vf)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
|
||||
U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 |
|
||||
LLVertexBuffer::MAP_TANGENT | LLVertexBuffer::MAP_NORMAL;
|
||||
|
||||
if (vf.mWeights)
|
||||
{
|
||||
mask |= LLVertexBuffer::MAP_WEIGHT4;
|
||||
}
|
||||
|
||||
LLVertexBuffer* buff = new LLVertexBuffer(mask, GL_STATIC_DRAW);
|
||||
vf.mVertexBuffer = buff;
|
||||
|
||||
buff->allocateBuffer(vf.mNumVertices, 0, true);
|
||||
|
||||
LLStrider<LLVector4a> f_vert;
|
||||
LLStrider<LLVector4a> f_tangent;
|
||||
LLStrider<LLVector3> f_norm;
|
||||
LLStrider<LLVector2> f_tc;
|
||||
|
||||
buff->getTangentStrider(f_tangent);
|
||||
buff->getVertexStrider(f_vert);
|
||||
buff->getNormalStrider(f_norm);
|
||||
buff->getTexCoord0Strider(f_tc);
|
||||
|
||||
for (U32 i = 0; i < vf.mNumVertices; ++i)
|
||||
{
|
||||
*f_vert++ = vf.mPositions[i];
|
||||
*f_tangent++ = vf.mTangents[i];
|
||||
*f_tc++ = vf.mTexCoords[i];
|
||||
(*f_norm++).set(vf.mNormals[i].getF32ptr());
|
||||
}
|
||||
|
||||
if (vf.mWeights)
|
||||
{
|
||||
// <FS:Ansariel> Vectorized Weight4Strider and ClothWeightStrider by Drake Arconis
|
||||
//LLStrider<LLVector4> f_wght;
|
||||
LLStrider<LLVector4a> f_wght;
|
||||
buff->getWeight4Strider(f_wght);
|
||||
for (U32 i = 0; i < vf.mNumVertices; ++i)
|
||||
{
|
||||
// <FS:Ansariel> Vectorized Weight4Strider and ClothWeightStrider by Drake Arconis
|
||||
//(*f_wght++).set(vf.mWeights[i].getF32ptr());
|
||||
(*f_wght++) = vf.mWeights[i];
|
||||
}
|
||||
}
|
||||
|
||||
buff->flush();
|
||||
}
|
||||
|
||||
//helper function for pushing primitives for transform shaders and cleaning up
|
||||
//uninitialized data on the tail, plus tracking number of expected primitives
|
||||
void push_for_transform(LLVertexBuffer* buff, U32 source_count, U32 dest_count)
|
||||
|
|
@ -1376,7 +1323,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
|
||||
|
||||
//don't use map range (generates many redundant unmap calls)
|
||||
bool map_range = false; //gGLManager.mHasMapBufferRange || gGLManager.mHasFlushBufferRange;
|
||||
bool map_range = false;
|
||||
|
||||
if (mVertexBuffer.notNull())
|
||||
{
|
||||
|
|
@ -1612,155 +1559,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
}
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false);
|
||||
|
||||
#ifdef GL_TRANSFORM_FEEDBACK_BUFFER
|
||||
if (use_transform_feedback &&
|
||||
mVertexBuffer->getUsage() == GL_DYNAMIC_COPY &&
|
||||
gTransformPositionProgram.mProgramObject && //transform shaders are loaded
|
||||
mVertexBuffer->useVBOs() && //target buffer is in VRAM
|
||||
!rebuild_weights && //TODO: add support for weights
|
||||
!volume.isUnique()) //source volume is NOT flexi
|
||||
{ //use transform feedback to pack vertex buffer
|
||||
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - transform feedback");
|
||||
LLGLEnable discard(GL_RASTERIZER_DISCARD);
|
||||
LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
|
||||
|
||||
if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices)
|
||||
{
|
||||
mVObjp->getVolume()->genTangents(f);
|
||||
LLFace::cacheFaceInVRAM(vf);
|
||||
buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
|
||||
}
|
||||
|
||||
LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
||||
gGL.pushMatrix();
|
||||
gGL.loadMatrix((GLfloat*) mat_vert_in.mMatrix);
|
||||
|
||||
if (rebuild_pos)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf position");
|
||||
gTransformPositionProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
|
||||
|
||||
U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
|
||||
|
||||
S32 val = 0;
|
||||
U8* vp = (U8*) &val;
|
||||
vp[0] = index;
|
||||
vp[1] = 0;
|
||||
vp[2] = 0;
|
||||
vp[3] = 0;
|
||||
|
||||
gTransformPositionProgram.uniform1i(sTextureIndexIn, val);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_color)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf color");
|
||||
gTransformColorProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount);
|
||||
|
||||
S32 val = *((S32*) color.mV);
|
||||
|
||||
gTransformColorProgram.uniform1i(sColorIn, val);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_emissive)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf emissive");
|
||||
gTransformColorProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount);
|
||||
|
||||
U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
|
||||
|
||||
S32 glow32 = glow |
|
||||
(glow << 8) |
|
||||
(glow << 16) |
|
||||
(glow << 24);
|
||||
|
||||
gTransformColorProgram.uniform1i(sColorIn, glow32);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_normal)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf normal");
|
||||
gTransformNormalProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_NORMAL);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_tangent)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf tangent");
|
||||
gTransformTangentProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TANGENT, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TANGENT);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_tcoord)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_FACE("getGeometryVolume - tf tcoord");
|
||||
gTransformTexCoordProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
|
||||
bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
|
||||
|
||||
if (do_bump)
|
||||
{
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD1, mGeomIndex, mGeomCount);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
}
|
||||
|
||||
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
|
||||
gGL.popMatrix();
|
||||
|
||||
if (cur_shader)
|
||||
{
|
||||
cur_shader->bind();
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
//if it's not fullbright and has no normals, bake sunlight based on face normal
|
||||
//bool bake_sunlight = !getTextureEntry()->getFullbright() &&
|
||||
|
|
|
|||
|
|
@ -82,8 +82,6 @@ public:
|
|||
PARTICLE = 0x0080,
|
||||
};
|
||||
|
||||
static void cacheFaceInVRAM(const LLVolumeFace& vf);
|
||||
|
||||
public:
|
||||
LLFace(LLDrawable* drawablep, LLViewerObject* objp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -441,41 +441,9 @@ bool LLFeatureManager::loadGPUClass()
|
|||
LL_WARNS("RenderInit") << "Unable to get an accurate benchmark; defaulting to class 3" << LL_ENDL;
|
||||
mGPUClass = GPU_CLASS_3;
|
||||
#else
|
||||
if (gGLManager.mGLVersion <= 2.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_0;
|
||||
}
|
||||
else if (gGLManager.mGLVersion <= 3.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_1;
|
||||
}
|
||||
else if (gGLManager.mGLVersion < 3.3f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_2;
|
||||
}
|
||||
else if (gGLManager.mGLVersion < 4.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_3;
|
||||
}
|
||||
else
|
||||
{
|
||||
mGPUClass = GPU_CLASS_4;
|
||||
}
|
||||
if (gGLManager.mIsIntel && mGPUClass > GPU_CLASS_1)
|
||||
{
|
||||
// Intels are generally weaker then other GPUs despite having advanced features
|
||||
mGPUClass = (EGPUClass)(mGPUClass - 1);
|
||||
}
|
||||
mGPUClass = GPU_CLASS_2;
|
||||
#endif
|
||||
}
|
||||
else if (gGLManager.mGLVersion <= 2.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_0;
|
||||
}
|
||||
else if (gGLManager.mGLVersion <= 3.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_1;
|
||||
}
|
||||
else if (gbps <= 5.f)
|
||||
{
|
||||
mGPUClass = GPU_CLASS_0;
|
||||
|
|
@ -689,10 +657,6 @@ void LLFeatureManager::applyBaseMasks()
|
|||
{
|
||||
maskFeatures("TexUnit8orLess");
|
||||
}
|
||||
if (gGLManager.mHasMapBufferRange)
|
||||
{
|
||||
maskFeatures("MapBufferRange");
|
||||
}
|
||||
if (gGLManager.mVRAM > 512)
|
||||
{
|
||||
maskFeatures("VRAMGT512");
|
||||
|
|
|
|||
|
|
@ -2090,22 +2090,14 @@ void LLFloaterPreference::refreshEnabledState()
|
|||
childSetEnabled("FSRestrictMaxTextureSize", false);
|
||||
#endif
|
||||
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
|
||||
!gGLManager.mHasVertexBufferObject)
|
||||
{
|
||||
getChildView("vbo")->setEnabled(FALSE);
|
||||
getChildView("vbo_stream")->setEnabled(FALSE);
|
||||
}
|
||||
else
|
||||
#if LL_DARWIN
|
||||
getChildView("vbo_stream")->setEnabled(FALSE); //Hardcoded disable on mac
|
||||
getChild<LLUICtrl>("vbo_stream")->setValue((LLSD::Boolean) FALSE);
|
||||
getChildView("vbo_stream")->setEnabled(FALSE); //Hardcoded disable on mac
|
||||
getChild<LLUICtrl>("vbo_stream")->setValue((LLSD::Boolean) FALSE);
|
||||
#else
|
||||
getChildView("vbo_stream")->setEnabled(LLVertexBuffer::sEnableVBOs);
|
||||
getChildView("vbo_stream")->setEnabled(LLVertexBuffer::sEnableVBOs);
|
||||
#endif
|
||||
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures") ||
|
||||
!gGLManager.mHasVertexBufferObject)
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderCompressTextures"))
|
||||
{
|
||||
getChildView("texture compression")->setEnabled(FALSE);
|
||||
}
|
||||
|
|
@ -2129,7 +2121,7 @@ void LLFloaterPreference::refreshEnabledState()
|
|||
LLComboBox* ctrl_reflections = getChild<LLComboBox>("Reflections");
|
||||
|
||||
// Reflections
|
||||
BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps;
|
||||
BOOL reflections = LLCubeMap::sUseCubeMaps;
|
||||
ctrl_reflections->setEnabled(reflections);
|
||||
|
||||
// WindLight
|
||||
|
|
|
|||
|
|
@ -1137,9 +1137,8 @@ private:
|
|||
//-----------------------------------------------------------------------------
|
||||
F32 gpu_benchmark()
|
||||
{
|
||||
if (!gGLManager.mHasTimerQuery)
|
||||
if (gGLManager.mGLVersion < 3.3f)
|
||||
{ // 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;
|
||||
}
|
||||
|
||||
|
|
@ -1265,16 +1264,6 @@ F32 gpu_benchmark()
|
|||
// ensure matched pair of bind() and unbind() calls
|
||||
ShaderBinder binder(gBenchmarkProgram);
|
||||
|
||||
#ifdef GL_ARB_vertex_array_object
|
||||
U32 glarray = 0;
|
||||
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
glGenVertexArrays(1, &glarray);
|
||||
glBindVertexArray(glarray);
|
||||
}
|
||||
#endif
|
||||
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
glFinish();
|
||||
|
||||
|
|
@ -1307,15 +1296,6 @@ F32 gpu_benchmark()
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef GL_ARB_vertex_array_object
|
||||
if (LLRender::sGLCoreProfile)
|
||||
{
|
||||
glBindVertexArray(0);
|
||||
glDeleteVertexArrays(1, &glarray);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
std::sort(results.begin(), results.end());
|
||||
|
||||
F32 gbps = results[results.size()/2];
|
||||
|
|
|
|||
|
|
@ -445,14 +445,14 @@ void LLSceneMonitor::calcDiffAggregate()
|
|||
|
||||
if(mDiffState == EXECUTE_DIFF)
|
||||
{
|
||||
glBeginQuery(GL_SAMPLES_PASSED_ARB, mQueryObject);
|
||||
glBeginQuery(GL_SAMPLES_PASSED, mQueryObject);
|
||||
}
|
||||
|
||||
gl_draw_scaled_target(0, 0, S32(mDiff->getWidth() * mDiffPixelRatio), S32(mDiff->getHeight() * mDiffPixelRatio), mDiff);
|
||||
|
||||
if(mDiffState == EXECUTE_DIFF)
|
||||
{
|
||||
glEndQuery(GL_SAMPLES_PASSED_ARB);
|
||||
glEndQuery(GL_SAMPLES_PASSED);
|
||||
mDiffState = WAIT_ON_RESULT;
|
||||
}
|
||||
|
||||
|
|
@ -483,11 +483,11 @@ void LLSceneMonitor::fetchQueryResult()
|
|||
mDiffState = WAITING_FOR_NEXT_DIFF;
|
||||
|
||||
GLuint available = 0;
|
||||
glGetQueryObjectuiv(mQueryObject, GL_QUERY_RESULT_AVAILABLE_ARB, &available);
|
||||
glGetQueryObjectuiv(mQueryObject, GL_QUERY_RESULT_AVAILABLE, &available);
|
||||
if(available)
|
||||
{
|
||||
GLuint count = 0;
|
||||
glGetQueryObjectuiv(mQueryObject, GL_QUERY_RESULT_ARB, &count);
|
||||
glGetQueryObjectuiv(mQueryObject, GL_QUERY_RESULT, &count);
|
||||
|
||||
mDiffResult = sqrtf(count * 0.5f / (mDiff->getWidth() * mDiff->getHeight() * mDiffPixelRatio * mDiffPixelRatio)); //0.5 -> (front face + back face)
|
||||
|
||||
|
|
|
|||
|
|
@ -3425,8 +3425,6 @@ void use_circuit_callback(void**, S32 result)
|
|||
void register_viewer_callbacks(LLMessageSystem* msg)
|
||||
{
|
||||
msg->setHandlerFuncFast(_PREHASH_LayerData, process_layer_data );
|
||||
msg->setHandlerFuncFast(_PREHASH_ImageData, LLViewerTextureList::receiveImageHeader );
|
||||
msg->setHandlerFuncFast(_PREHASH_ImagePacket, LLViewerTextureList::receiveImagePacket );
|
||||
msg->setHandlerFuncFast(_PREHASH_ObjectUpdate, process_object_update );
|
||||
msg->setHandlerFunc("ObjectUpdateCompressed", process_compressed_object_update );
|
||||
msg->setHandlerFunc("ObjectUpdateCached", process_cached_object_update );
|
||||
|
|
|
|||
|
|
@ -264,7 +264,6 @@ static const char* e_state_name[] =
|
|||
"LOAD_FROM_TEXTURE_CACHE",
|
||||
"CACHE_POST",
|
||||
"LOAD_FROM_NETWORK",
|
||||
"LOAD_FROM_SIMULATOR",
|
||||
"WAIT_HTTP_RESOURCE",
|
||||
"WAIT_HTTP_RESOURCE2",
|
||||
"SEND_HTTP_REQ",
|
||||
|
|
@ -430,7 +429,6 @@ public:
|
|||
LOAD_FROM_TEXTURE_CACHE,
|
||||
CACHE_POST,
|
||||
LOAD_FROM_NETWORK,
|
||||
LOAD_FROM_SIMULATOR,
|
||||
WAIT_HTTP_RESOURCE, // Waiting for HTTP resources
|
||||
WAIT_HTTP_RESOURCE2, // Waiting for HTTP resources
|
||||
SEND_HTTP_REQ, // Commit to sending as HTTP
|
||||
|
|
@ -474,16 +472,10 @@ private:
|
|||
// Locks: Mw
|
||||
void clearPackets();
|
||||
|
||||
// Locks: Mw
|
||||
void setupPacketData();
|
||||
|
||||
// Locks: Mw
|
||||
void removeFromCache();
|
||||
|
||||
// Threads: Ttf
|
||||
// Locks: Mw
|
||||
bool processSimulatorPackets();
|
||||
|
||||
// Threads: Ttf
|
||||
bool writeToCacheComplete();
|
||||
|
||||
|
|
@ -583,8 +575,7 @@ private:
|
|||
BOOL mHaveAllData;
|
||||
BOOL mInLocalCache;
|
||||
BOOL mInCache;
|
||||
bool mCanUseHTTP,
|
||||
mCanUseNET ; //can get from asset server.
|
||||
bool mCanUseHTTP;
|
||||
S32 mRetryAttempt;
|
||||
S32 mActiveCount;
|
||||
LLCore::HttpStatus mGetStatus;
|
||||
|
|
@ -856,7 +847,6 @@ const char* sStateDescs[] = {
|
|||
"LOAD_FROM_TEXTURE_CACHE",
|
||||
"CACHE_POST",
|
||||
"LOAD_FROM_NETWORK",
|
||||
"LOAD_FROM_SIMULATOR",
|
||||
"WAIT_HTTP_RESOURCE",
|
||||
"WAIT_HTTP_RESOURCE2",
|
||||
"SEND_HTTP_REQ",
|
||||
|
|
@ -868,7 +858,7 @@ const char* sStateDescs[] = {
|
|||
"DONE"
|
||||
};
|
||||
|
||||
const std::set<S32> LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK, LLTextureFetchWorker::LOAD_FROM_SIMULATOR,
|
||||
const std::set<S32> LOGGED_STATES = { LLTextureFetchWorker::LOAD_FROM_TEXTURE_CACHE, LLTextureFetchWorker::LOAD_FROM_NETWORK,
|
||||
LLTextureFetchWorker::WAIT_HTTP_REQ, LLTextureFetchWorker::DECODE_IMAGE_UPDATE, LLTextureFetchWorker::WAIT_ON_WRITE };
|
||||
|
||||
// static
|
||||
|
|
@ -942,8 +932,6 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
|
|||
mResourceWaitCount(0U),
|
||||
mFetchRetryPolicy(10.f,3600.f,2.f,10)
|
||||
{
|
||||
mCanUseNET = mUrl.empty() ;
|
||||
|
||||
mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
|
||||
// LL_INFOS(LOG_TXT) << "Create: " << mID << " mHost:" << host << " Discard=" << discard << LL_ENDL;
|
||||
if (!mFetcher->mDebugPause)
|
||||
|
|
@ -1005,39 +993,6 @@ void LLTextureFetchWorker::clearPackets()
|
|||
mFirstPacket = 0;
|
||||
}
|
||||
|
||||
// Locks: Mw
|
||||
void LLTextureFetchWorker::setupPacketData()
|
||||
{
|
||||
S32 data_size = 0;
|
||||
if (mFormattedImage.notNull())
|
||||
{
|
||||
data_size = mFormattedImage->getDataSize();
|
||||
}
|
||||
if (data_size > 0)
|
||||
{
|
||||
// Only used for simulator requests
|
||||
mFirstPacket = (data_size - FIRST_PACKET_SIZE) / MAX_IMG_PACKET_SIZE + 1;
|
||||
if (FIRST_PACKET_SIZE + (mFirstPacket-1) * MAX_IMG_PACKET_SIZE != data_size)
|
||||
{
|
||||
LL_WARNS(LOG_TXT) << "Bad CACHED TEXTURE size: " << data_size << " removing." << LL_ENDL;
|
||||
removeFromCache();
|
||||
resetFormattedData();
|
||||
clearPackets();
|
||||
}
|
||||
else if (mFileSize > 0)
|
||||
{
|
||||
mLastPacket = mFirstPacket-1;
|
||||
mTotalPackets = (mFileSize - FIRST_PACKET_SIZE + MAX_IMG_PACKET_SIZE-1) / MAX_IMG_PACKET_SIZE + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// This file was cached using HTTP so we have to refetch the first packet
|
||||
resetFormattedData();
|
||||
clearPackets();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Locks: Mw (ctor invokes without lock)
|
||||
void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
|
||||
{
|
||||
|
|
@ -1129,14 +1084,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
|
||||
if (mImagePriority < F_ALMOST_ZERO)
|
||||
{
|
||||
if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR)
|
||||
if (mState == INIT || mState == LOAD_FROM_NETWORK)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("tfwdw - priority < 0");
|
||||
LL_DEBUGS(LOG_TXT) << mID << " abort: mImagePriority < F_ALMOST_ZERO" << LL_ENDL;
|
||||
return true; // abort
|
||||
}
|
||||
}
|
||||
if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP)
|
||||
if(mState > CACHE_POST && !mCanUseHTTP)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("tfwdw - state > cache_post");
|
||||
//nowhere to get data, abort.
|
||||
|
|
@ -1378,14 +1333,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
else
|
||||
{
|
||||
mCanUseHTTP = false ;
|
||||
LL_DEBUGS(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << "Texture not available via HTTP: empty URL." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
|
||||
//LL_WARNS(LOG_TXT) << "Region not found for host: " << mHost << LL_ENDL;
|
||||
LL_DEBUGS(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << "Texture not available via HTTP: no region " << mUrl << LL_ENDL;
|
||||
mCanUseHTTP = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -1403,77 +1358,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
}
|
||||
// don't return, fall through to next state
|
||||
}
|
||||
else if (mSentRequest == UNSENT && mCanUseNET)
|
||||
{
|
||||
// Add this to the network queue and sit here.
|
||||
// LLTextureFetch::update() will send off a request which will change our state
|
||||
mWriteToCacheState = CAN_WRITE ;
|
||||
mRequestedSize = mDesiredSize;
|
||||
mRequestedDiscard = mDesiredDiscard;
|
||||
mSentRequest = QUEUED;
|
||||
mFetcher->addToNetworkQueue(this);
|
||||
recordTextureStart(false);
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Shouldn't need to do anything here
|
||||
//llassert(mFetcher->mNetworkQueue.find(mID) != mFetcher->mNetworkQueue.end());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (mState == LOAD_FROM_SIMULATOR)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("tfwdw - LOAD_FROM_SIMULATOR");
|
||||
if (mFormattedImage.isNull())
|
||||
{
|
||||
mFormattedImage = new LLImageJ2C;
|
||||
}
|
||||
if (processSimulatorPackets())
|
||||
{
|
||||
// Capture some measure of total size for metrics
|
||||
F64 byte_count = 0;
|
||||
if (mLastPacket >= mFirstPacket)
|
||||
{
|
||||
for (S32 i=mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
llassert_always((i>=0) && (i<mPackets.size()));
|
||||
if (mPackets[i])
|
||||
{
|
||||
byte_count += mPackets[i]->mSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LL_DEBUGS(LOG_TXT) << mID << ": Loaded from Sim. Bytes: " << mFormattedImage->getDataSize() << LL_ENDL;
|
||||
mFetcher->removeFromNetworkQueue(this, false);
|
||||
if (mFormattedImage.isNull() || !mFormattedImage->getDataSize())
|
||||
{
|
||||
// processSimulatorPackets() failed
|
||||
// LL_WARNS(LOG_TXT) << "processSimulatorPackets() failed to load buffer" << LL_ENDL;
|
||||
LL_WARNS(LOG_TXT) << mID << " processSimulatorPackets() failed to load buffer" << LL_ENDL;
|
||||
return true; // failed
|
||||
}
|
||||
|
||||
if (mLoadedDiscard < 0)
|
||||
{
|
||||
LL_WARNS(LOG_TXT) << mID << " mLoadedDiscard is " << mLoadedDiscard
|
||||
<< ", should be >=0" << LL_ENDL;
|
||||
}
|
||||
setState(DECODE_IMAGE);
|
||||
mWriteToCacheState = SHOULD_WRITE;
|
||||
|
||||
recordTextureDone(false, byte_count);
|
||||
}
|
||||
else
|
||||
{
|
||||
mFetcher->addToNetworkQueue(this); // failsafe
|
||||
recordTextureStart(false);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if (mState == WAIT_HTTP_RESOURCE)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_THREAD("tfwdw - WAIT_HTTP_RESOURCE");
|
||||
|
|
@ -1517,8 +1407,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
LL_WARNS(LOG_TXT) << mID << " abort: SEND_HTTP_REQ but !mCanUseHTTP" << LL_ENDL;
|
||||
return true; // abort
|
||||
}
|
||||
|
||||
mFetcher->removeFromNetworkQueue(this, false);
|
||||
|
||||
S32 cur_size = 0;
|
||||
if (mFormattedImage.notNull())
|
||||
|
|
@ -1663,17 +1551,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// roll back to try UDP
|
||||
if (mCanUseNET)
|
||||
{
|
||||
setState(INIT);
|
||||
mCanUseHTTP = false;
|
||||
mUrl.clear();
|
||||
releaseHttpSemaphore();
|
||||
//return false;
|
||||
return doWork(param);
|
||||
}
|
||||
}
|
||||
else if (http_service_unavail == mGetStatus)
|
||||
{
|
||||
|
|
@ -2239,69 +2116,6 @@ void LLTextureFetchWorker::removeFromCache()
|
|||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Ttf
|
||||
// Locks: Mw
|
||||
bool LLTextureFetchWorker::processSimulatorPackets()
|
||||
{
|
||||
if (mFormattedImage.isNull() || mRequestedSize < 0)
|
||||
{
|
||||
// not sure how we got here, but not a valid state, abort!
|
||||
llassert_always(mDecodeHandle == 0);
|
||||
mFormattedImage = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mLastPacket >= mFirstPacket)
|
||||
{
|
||||
S32 buffer_size = mFormattedImage->getDataSize();
|
||||
for (S32 i = mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
llassert_always((i>=0) && (i<mPackets.size()));
|
||||
llassert_always(mPackets[i]);
|
||||
buffer_size += mPackets[i]->mSize;
|
||||
}
|
||||
bool have_all_data = mLastPacket >= mTotalPackets-1;
|
||||
if (mRequestedSize <= 0)
|
||||
{
|
||||
// We received a packed but haven't requested anything yet (edge case)
|
||||
// Return true (we're "done") since we didn't request anything
|
||||
return true;
|
||||
}
|
||||
if (buffer_size >= mRequestedSize || have_all_data)
|
||||
{
|
||||
/// We have enough (or all) data
|
||||
if (have_all_data)
|
||||
{
|
||||
mHaveAllData = TRUE;
|
||||
}
|
||||
S32 cur_size = mFormattedImage->getDataSize();
|
||||
if (buffer_size > cur_size)
|
||||
{
|
||||
/// We have new data
|
||||
U8* buffer = (U8*)ll_aligned_malloc_16(buffer_size);
|
||||
S32 offset = 0;
|
||||
if (cur_size > 0 && mFirstPacket > 0)
|
||||
{
|
||||
memcpy(buffer, mFormattedImage->getData(), cur_size);
|
||||
offset = cur_size;
|
||||
}
|
||||
for (S32 i=mFirstPacket; i<=mLastPacket; i++)
|
||||
{
|
||||
memcpy(buffer + offset, mPackets[i]->mData, mPackets[i]->mSize);
|
||||
offset += mPackets[i]->mSize;
|
||||
}
|
||||
// NOTE: setData releases current data
|
||||
mFormattedImage->setData(buffer, buffer_size);
|
||||
}
|
||||
mLoadedDiscard = mRequestedDiscard;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Ttf
|
||||
|
|
@ -2760,42 +2574,6 @@ bool LLTextureFetch::createRequest(FTType f_type, const std::string& url, const
|
|||
}
|
||||
|
||||
|
||||
// Threads: T* (but Ttf in practice)
|
||||
|
||||
// protected
|
||||
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
lockQueue(); // +Mfq
|
||||
bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
|
||||
unlockQueue(); // -Mfq
|
||||
|
||||
LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
|
||||
if (in_request_map)
|
||||
{
|
||||
// only add to the queue if in the request map
|
||||
// i.e. a delete has not been requested
|
||||
mNetworkQueue.insert(worker->mID);
|
||||
}
|
||||
for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
|
||||
iter1 != mCancelQueue.end(); ++iter1)
|
||||
{
|
||||
iter1->second.erase(worker->mID);
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
// Threads: T*
|
||||
void LLTextureFetch::removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LLMutexLock lock(&mNetworkQueueMutex); // +Mfnq
|
||||
size_t erased = mNetworkQueue.erase(worker->mID);
|
||||
if (cancel && erased > 0)
|
||||
{
|
||||
mCancelQueue[worker->mHost].insert(worker->mID);
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
// Threads: T*
|
||||
//
|
||||
// protected
|
||||
|
|
@ -2832,7 +2610,6 @@ void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
|
|||
unlockQueue(); // -Mfq
|
||||
|
||||
llassert_always(erased_1 > 0) ;
|
||||
removeFromNetworkQueue(worker, cancel);
|
||||
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
|
||||
|
||||
worker->scheduleDelete();
|
||||
|
|
@ -2861,7 +2638,6 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
|
|||
unlockQueue(); // -Mfq
|
||||
|
||||
llassert_always(erased_1 > 0) ;
|
||||
removeFromNetworkQueue(worker, cancel);
|
||||
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
|
||||
|
||||
worker->scheduleDelete();
|
||||
|
|
@ -3158,17 +2934,6 @@ S32 LLTextureFetch::update(F32 max_time_ms)
|
|||
|
||||
S32 res = LLWorkerThread::update(max_time_ms);
|
||||
|
||||
if (!mDebugPause)
|
||||
{
|
||||
// this is the startup state when send_complete_agent_movement() message is sent.
|
||||
// Before this, the RequestImages message sent by sendRequestListToSimulators
|
||||
// won't work so don't bother trying
|
||||
if (LLStartUp::getStartupState() > STATE_AGENT_SEND)
|
||||
{
|
||||
sendRequestListToSimulators();
|
||||
}
|
||||
}
|
||||
|
||||
if (!mThreaded)
|
||||
{
|
||||
commonUpdate();
|
||||
|
|
@ -3243,203 +3008,6 @@ void LLTextureFetch::threadedUpdate()
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: Tmain
|
||||
void LLTextureFetch::sendRequestListToSimulators()
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
// All requests
|
||||
const F32 REQUEST_DELTA_TIME = 0.10f; // 10 fps
|
||||
|
||||
// Sim requests
|
||||
const S32 IMAGES_PER_REQUEST = 50;
|
||||
const F32 SIM_LAZY_FLUSH_TIMEOUT = 10.0f; // temp
|
||||
const F32 MIN_REQUEST_TIME = 1.0f;
|
||||
const F32 MIN_DELTA_PRIORITY = 1000.f;
|
||||
|
||||
// Periodically, gather the list of textures that need data from the network
|
||||
// And send the requests out to the simulators
|
||||
static LLFrameTimer timer;
|
||||
if (timer.getElapsedTimeF32() < REQUEST_DELTA_TIME)
|
||||
{
|
||||
return;
|
||||
}
|
||||
timer.reset();
|
||||
|
||||
// Send requests
|
||||
typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
|
||||
typedef std::map< LLHost, request_list_t > work_request_map_t;
|
||||
work_request_map_t requests;
|
||||
{
|
||||
LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
|
||||
for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); )
|
||||
{
|
||||
queue_t::iterator curiter = iter++;
|
||||
LLTextureFetchWorker* req = getWorker(*curiter);
|
||||
if (!req)
|
||||
{
|
||||
mNetworkQueue.erase(curiter);
|
||||
continue; // paranoia
|
||||
}
|
||||
if ((req->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK) &&
|
||||
(req->mState != LLTextureFetchWorker::LOAD_FROM_SIMULATOR))
|
||||
{
|
||||
// We already received our URL, remove from the queue
|
||||
LL_WARNS(LOG_TXT) << "Worker: " << req->mID << " in mNetworkQueue but in wrong state: " << req->mState << LL_ENDL;
|
||||
mNetworkQueue.erase(curiter);
|
||||
continue;
|
||||
}
|
||||
if (req->mID == mDebugID)
|
||||
{
|
||||
mDebugCount++; // for setting breakpoints
|
||||
}
|
||||
if (req->mSentRequest == LLTextureFetchWorker::SENT_SIM &&
|
||||
req->mTotalPackets > 0 &&
|
||||
req->mLastPacket >= req->mTotalPackets-1)
|
||||
{
|
||||
// We have all the packets... make sure this is high priority
|
||||
continue;
|
||||
}
|
||||
F32 elapsed = req->mRequestedDeltaTimer.getElapsedTimeF32();
|
||||
{
|
||||
F32 delta_priority = llabs(req->mRequestedPriority - req->mImagePriority);
|
||||
if ((req->mSimRequestedDiscard != req->mDesiredDiscard) ||
|
||||
(delta_priority > MIN_DELTA_PRIORITY && elapsed >= MIN_REQUEST_TIME) ||
|
||||
(elapsed >= SIM_LAZY_FLUSH_TIMEOUT))
|
||||
{
|
||||
requests[req->mHost].insert(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // -Mfnq
|
||||
|
||||
for (work_request_map_t::iterator iter1 = requests.begin();
|
||||
iter1 != requests.end(); ++iter1)
|
||||
{
|
||||
LLHost host = iter1->first;
|
||||
// invalid host = use agent host
|
||||
if (host.isInvalid())
|
||||
{
|
||||
host = gAgent.getRegionHost();
|
||||
}
|
||||
|
||||
S32 sim_request_count = 0;
|
||||
|
||||
for (request_list_t::iterator iter2 = iter1->second.begin();
|
||||
iter2 != iter1->second.end(); ++iter2)
|
||||
{
|
||||
LLTextureFetchWorker* req = *iter2;
|
||||
if (gMessageSystem)
|
||||
{
|
||||
if (req->mSentRequest != LLTextureFetchWorker::SENT_SIM)
|
||||
{
|
||||
// Initialize packet data based on data read from cache
|
||||
req->lockWorkMutex(); // +Mw
|
||||
req->setupPacketData();
|
||||
req->unlockWorkMutex(); // -Mw
|
||||
}
|
||||
if (0 == sim_request_count)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
}
|
||||
S32 packet = req->mLastPacket + 1;
|
||||
LL_INFOS() << req->mID << ": " << req->mImagePriority << LL_ENDL;
|
||||
gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_Image, req->mID);
|
||||
gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, (S8)req->mDesiredDiscard);
|
||||
gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, req->mImagePriority);
|
||||
gMessageSystem->addU32Fast(_PREHASH_Packet, packet);
|
||||
gMessageSystem->addU8Fast(_PREHASH_Type, req->mType);
|
||||
// LL_INFOS(LOG_TXT) << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard
|
||||
// << " Packet: " << packet << " Priority: " << req->mImagePriority << LL_ENDL;
|
||||
|
||||
static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false);
|
||||
static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false);
|
||||
if (log_to_viewer_log || log_to_sim)
|
||||
{
|
||||
mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime());
|
||||
mTextureInfo.setRequestOffset(req->mID, 0);
|
||||
mTextureInfo.setRequestSize(req->mID, 0);
|
||||
mTextureInfo.setRequestType(req->mID, LLTextureInfoDetails::REQUEST_TYPE_UDP);
|
||||
}
|
||||
|
||||
req->lockWorkMutex(); // +Mw
|
||||
req->mSentRequest = LLTextureFetchWorker::SENT_SIM;
|
||||
req->mSimRequestedDiscard = req->mDesiredDiscard;
|
||||
req->mRequestedPriority = req->mImagePriority;
|
||||
req->mRequestedDeltaTimer.reset();
|
||||
req->unlockWorkMutex(); // -Mw
|
||||
sim_request_count++;
|
||||
if (sim_request_count >= IMAGES_PER_REQUEST)
|
||||
{
|
||||
// LL_INFOS(LOG_TXT) << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << LL_ENDL;
|
||||
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
sim_request_count = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gMessageSystem && sim_request_count > 0 && sim_request_count < IMAGES_PER_REQUEST)
|
||||
{
|
||||
// LL_INFOS(LOG_TXT) << "REQUESTING " << sim_request_count << " IMAGES FROM HOST: " << host.getIPString() << LL_ENDL;
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
sim_request_count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Send cancelations
|
||||
{
|
||||
LLMutexLock lock2(&mNetworkQueueMutex); // +Mfnq
|
||||
if (gMessageSystem && !mCancelQueue.empty())
|
||||
{
|
||||
for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
|
||||
iter1 != mCancelQueue.end(); ++iter1)
|
||||
{
|
||||
LLHost host = iter1->first;
|
||||
if (host.isInvalid())
|
||||
{
|
||||
host = gAgent.getRegionHost();
|
||||
}
|
||||
S32 request_count = 0;
|
||||
for (queue_t::iterator iter2 = iter1->second.begin();
|
||||
iter2 != iter1->second.end(); ++iter2)
|
||||
{
|
||||
if (0 == request_count)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->nextBlockFast(_PREHASH_AgentData);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
|
||||
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
|
||||
}
|
||||
gMessageSystem->nextBlockFast(_PREHASH_RequestImage);
|
||||
gMessageSystem->addUUIDFast(_PREHASH_Image, *iter2);
|
||||
gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, -1);
|
||||
gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, 0);
|
||||
gMessageSystem->addU32Fast(_PREHASH_Packet, 0);
|
||||
gMessageSystem->addU8Fast(_PREHASH_Type, 0);
|
||||
// LL_INFOS(LOG_TXT) << "CANCELING IMAGE REQUEST: " << (*iter2) << LL_ENDL;
|
||||
|
||||
request_count++;
|
||||
if (request_count >= IMAGES_PER_REQUEST)
|
||||
{
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
request_count = 0;
|
||||
}
|
||||
}
|
||||
if (request_count > 0 && request_count < IMAGES_PER_REQUEST)
|
||||
{
|
||||
gMessageSystem->sendSemiReliable(host, NULL, NULL);
|
||||
}
|
||||
}
|
||||
mCancelQueue.clear();
|
||||
}
|
||||
} // -Mfnq
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: T*
|
||||
// Locks: Mw
|
||||
bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
|
||||
|
|
@ -3504,138 +3072,6 @@ void LLTextureFetchWorker::setState(e_state new_state)
|
|||
mState = new_state;
|
||||
}
|
||||
|
||||
// Threads: T*
|
||||
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
|
||||
U16 data_size, U8* data)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LLTextureFetchWorker* worker = getWorker(id);
|
||||
bool res = true;
|
||||
|
||||
++mPacketCount;
|
||||
|
||||
if (!worker)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received header for non active worker: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK ||
|
||||
worker->mSentRequest != LLTextureFetchWorker::SENT_SIM)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "receiveImageHeader for worker: " << id
|
||||
// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState]
|
||||
// << " sent: " << worker->mSentRequest << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mLastPacket != -1)
|
||||
{
|
||||
// check to see if we've gotten this packet before
|
||||
// LL_WARNS(LOG_TXT) << "Received duplicate header for: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (!data_size)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Img: " << id << ":" << " Empty Image Header" << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
mNetworkQueueMutex.lock(); // +Mfnq
|
||||
++mBadPacketCount;
|
||||
mCancelQueue[host].insert(id);
|
||||
mNetworkQueueMutex.unlock(); // -Mfnq
|
||||
return false;
|
||||
}
|
||||
|
||||
LLViewerStatsRecorder::instance().textureFetch(data_size);
|
||||
LLViewerStatsRecorder::instance().log(0.1f);
|
||||
|
||||
worker->lockWorkMutex();
|
||||
|
||||
|
||||
// Copy header data into image object
|
||||
worker->mImageCodec = codec;
|
||||
worker->mTotalPackets = packets;
|
||||
worker->mFileSize = (S32)totalbytes;
|
||||
llassert_always(totalbytes > 0);
|
||||
llassert_always(data_size == FIRST_PACKET_SIZE || data_size == worker->mFileSize);
|
||||
res = worker->insertPacket(0, data, data_size);
|
||||
worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR);
|
||||
worker->unlockWorkMutex(); // -Mw
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
// Threads: T*
|
||||
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
LLTextureFetchWorker* worker = getWorker(id);
|
||||
bool res = true;
|
||||
|
||||
++mPacketCount;
|
||||
|
||||
if (!worker)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received packet " << packet_num << " for non active worker: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (worker->mLastPacket == -1)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Received packet " << packet_num << " before header for: " << id << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
else if (!data_size)
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "Img: " << id << ":" << " Empty Image Header" << LL_ENDL;
|
||||
res = false;
|
||||
}
|
||||
if (!res)
|
||||
{
|
||||
mNetworkQueueMutex.lock(); // +Mfnq
|
||||
++mBadPacketCount;
|
||||
mCancelQueue[host].insert(id);
|
||||
mNetworkQueueMutex.unlock(); // -Mfnq
|
||||
return false;
|
||||
}
|
||||
|
||||
LLViewerStatsRecorder::instance().textureFetch(data_size);
|
||||
LLViewerStatsRecorder::instance().log(0.1f);
|
||||
|
||||
worker->lockWorkMutex();
|
||||
|
||||
|
||||
res = worker->insertPacket(packet_num, data, data_size);
|
||||
|
||||
if ((worker->mState == LLTextureFetchWorker::LOAD_FROM_SIMULATOR) ||
|
||||
(worker->mState == LLTextureFetchWorker::LOAD_FROM_NETWORK))
|
||||
{
|
||||
worker->setState(LLTextureFetchWorker::LOAD_FROM_SIMULATOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
// LL_WARNS(LOG_TXT) << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id
|
||||
// << " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << LL_ENDL;
|
||||
removeFromNetworkQueue(worker, true); // failsafe
|
||||
}
|
||||
|
||||
if (packet_num >= (worker->mTotalPackets - 1))
|
||||
{
|
||||
static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog", false);
|
||||
static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator", false);
|
||||
|
||||
if (log_to_viewer_log || log_to_sim)
|
||||
{
|
||||
U64Microseconds timeNow = LLTimer::getTotalTime();
|
||||
mTextureInfoMainThread.setRequestSize(id, worker->mFileSize);
|
||||
mTextureInfoMainThread.setRequestCompleteTimeAndLog(id, timeNow);
|
||||
}
|
||||
}
|
||||
worker->unlockWorkMutex(); // -Mw
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Threads: T*
|
||||
|
|
@ -3687,13 +3123,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
|
|||
request_dtime = worker->mRequestedDeltaTimer.getElapsedTimeF32();
|
||||
if (worker->mFileSize > 0)
|
||||
{
|
||||
if (state == LLTextureFetchWorker::LOAD_FROM_SIMULATOR)
|
||||
{
|
||||
S32 data_size = FIRST_PACKET_SIZE + (worker->mLastPacket-1) * MAX_IMG_PACKET_SIZE;
|
||||
data_size = llmax(data_size, 0);
|
||||
data_progress = (F32)data_size / (F32)worker->mFileSize;
|
||||
}
|
||||
else if (worker->mFormattedImage.notNull())
|
||||
if (worker->mFormattedImage.notNull())
|
||||
{
|
||||
data_progress = (F32)worker->mFormattedImage->getDataSize() / (F32)worker->mFileSize;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,12 +102,6 @@ public:
|
|||
// Threads: T*
|
||||
bool updateRequestPriority(const LLUUID& id, F32 priority);
|
||||
|
||||
// Threads: T*
|
||||
bool receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes, U16 data_size, U8* data);
|
||||
|
||||
// Threads: T*
|
||||
bool receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data);
|
||||
|
||||
// Threads: T* (but not safe)
|
||||
void setTextureBandwidth(F32 bandwidth) { mTextureBandwidth = bandwidth; }
|
||||
|
||||
|
|
@ -229,12 +223,6 @@ public:
|
|||
// ----------------------------------
|
||||
|
||||
protected:
|
||||
// Threads: T* (but Ttf in practice)
|
||||
void addToNetworkQueue(LLTextureFetchWorker* worker);
|
||||
|
||||
// Threads: T*
|
||||
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
|
||||
|
||||
// Threads: T*
|
||||
void addToHTTPQueue(const LLUUID& id);
|
||||
|
||||
|
|
@ -253,9 +241,6 @@ protected:
|
|||
bool runCondition();
|
||||
|
||||
private:
|
||||
// Threads: Tmain
|
||||
void sendRequestListToSimulators();
|
||||
|
||||
// Threads: Ttf
|
||||
/*virtual*/ void startThread(void);
|
||||
|
||||
|
|
@ -321,7 +306,7 @@ public:
|
|||
|
||||
private:
|
||||
LLMutex mQueueMutex; //to protect mRequestMap and mCommands only
|
||||
LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
|
||||
LLMutex mNetworkQueueMutex; //to protect mHTTPTextureQueue
|
||||
|
||||
LLTextureCache* mTextureCache;
|
||||
|
||||
|
|
@ -331,10 +316,8 @@ private:
|
|||
|
||||
// Set of requests that require network data
|
||||
typedef std::set<LLUUID> queue_t;
|
||||
queue_t mNetworkQueue; // Mfnq
|
||||
queue_t mHTTPTextureQueue; // Mfnq
|
||||
typedef std::map<LLHost,std::set<LLUUID> > cancel_queue_t;
|
||||
cancel_queue_t mCancelQueue; // Mfnq
|
||||
F32 mTextureBandwidth; // <none>
|
||||
F32 mMaxBandwidth; // Mfnq
|
||||
LLTextureInfo mTextureInfo;
|
||||
|
|
|
|||
|
|
@ -225,7 +225,6 @@ void LLTextureBar::draw()
|
|||
{ "CCH", LLColor4::cyan }, // LOAD_FROM_TEXTURE_CACHE
|
||||
{ "DSK", LLColor4::blue }, // CACHE_POST
|
||||
{ "NET", LLColor4::green }, // LOAD_FROM_NETWORK
|
||||
{ "SIM", LLColor4::green }, // LOAD_FROM_SIMULATOR
|
||||
{ "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE
|
||||
// <FS:Ansariel> Unique state codes
|
||||
//{ "HTW", LLColor4::green }, // WAIT_HTTP_RESOURCE2
|
||||
|
|
|
|||
|
|
@ -477,7 +477,7 @@ static bool handleJoystickChanged(const LLSD& newvalue)
|
|||
|
||||
static bool handleUseOcclusionChanged(const LLSD& newvalue)
|
||||
{
|
||||
LLPipeline::sUseOcclusion = (newvalue.asBoolean() && gGLManager.mHasOcclusionQuery
|
||||
LLPipeline::sUseOcclusion = (newvalue.asBoolean()
|
||||
&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion") && !gUseWireframe) ? 2 : 0;
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2623,44 +2623,6 @@ class LLAdvancedCheckViewAdminOptions : public view_listener_t
|
|||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////
|
||||
// Enable Object Object Occlusion ///
|
||||
/////////////////////////////////////
|
||||
class LLAdvancedEnableObjectObjectOcclusion: public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
|
||||
bool new_value = gGLManager.mHasOcclusionQuery; // && LLFeatureManager::getInstance()->isFeatureAvailable(userdata.asString());
|
||||
return new_value;
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////
|
||||
// Enable Framebuffer Objects ///
|
||||
/////////////////////////////////////
|
||||
class LLAdvancedEnableRenderFBO: public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
bool new_value = gGLManager.mHasFramebufferObject;
|
||||
return new_value;
|
||||
}
|
||||
};
|
||||
|
||||
/////////////////////////////////////
|
||||
// Enable Advanced Lighting Model ///
|
||||
/////////////////////////////////////
|
||||
class LLAdvancedEnableRenderDeferred: public view_listener_t
|
||||
{
|
||||
bool handleEvent(const LLSD& userdata)
|
||||
{
|
||||
bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT) > 1 &&
|
||||
LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0;
|
||||
return new_value;
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////
|
||||
// ADMIN STATUS //
|
||||
//////////////////
|
||||
|
|
@ -12130,8 +12092,6 @@ void initialize_menus()
|
|||
view_listener_t::addMenu(new LLAdvancedToggleWireframe(), "Advanced.ToggleWireframe");
|
||||
view_listener_t::addMenu(new LLAdvancedCheckWireframe(), "Advanced.CheckWireframe");
|
||||
// Develop > Render
|
||||
view_listener_t::addMenu(new LLAdvancedEnableObjectObjectOcclusion(), "Advanced.EnableObjectObjectOcclusion");
|
||||
|
||||
view_listener_t::addMenu(new LLAdvancedToggleRandomizeFramerate(), "Advanced.ToggleRandomizeFramerate");
|
||||
view_listener_t::addMenu(new LLAdvancedCheckRandomizeFramerate(), "Advanced.CheckRandomizeFramerate");
|
||||
view_listener_t::addMenu(new LLAdvancedTogglePeriodicSlowFrame(), "Advanced.TogglePeriodicSlowFrame");
|
||||
|
|
|
|||
|
|
@ -917,15 +917,12 @@ void LLOcclusionCullingGroup::handleChildAddition(const OctreeNode* parent, Octr
|
|||
|
||||
void LLOcclusionCullingGroup::releaseOcclusionQueryObjectNames()
|
||||
{
|
||||
if (gGLManager.mHasOcclusionQuery)
|
||||
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; ++i)
|
||||
{
|
||||
for (U32 i = 0; i < LLViewerCamera::NUM_CAMERAS; ++i)
|
||||
if (mOcclusionQuery[i])
|
||||
{
|
||||
if (mOcclusionQuery[i])
|
||||
{
|
||||
releaseOcclusionQueryObjectName(mOcclusionQuery[i]);
|
||||
mOcclusionQuery[i] = 0;
|
||||
}
|
||||
releaseOcclusionQueryObjectName(mOcclusionQuery[i]);
|
||||
mOcclusionQuery[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1129,7 +1126,7 @@ void LLOcclusionCullingGroup::checkOcclusion()
|
|||
GLuint available;
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query available");
|
||||
glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE_ARB, &available);
|
||||
glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_AVAILABLE, &available);
|
||||
}
|
||||
|
||||
if (available)
|
||||
|
|
@ -1137,7 +1134,7 @@ void LLOcclusionCullingGroup::checkOcclusion()
|
|||
GLuint query_result; // Will be # samples drawn, or a boolean depending on mHasOcclusionQuery2 (both are type GLuint)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("co - query result");
|
||||
glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT_ARB, &query_result);
|
||||
glGetQueryObjectuiv(mOcclusionQuery[LLViewerCamera::sCurCameraID], GL_QUERY_RESULT, &query_result);
|
||||
}
|
||||
#if LL_TRACK_PENDING_OCCLUSION_QUERIES
|
||||
sPendingQueries.erase(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
|
||||
|
|
@ -1197,7 +1194,6 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
OCCLUSION_FUDGE_Z = 1.;
|
||||
}
|
||||
|
||||
// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
|
||||
if (earlyFail(camera, bounds))
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_OCTREE("doOcclusion - early fail");
|
||||
|
|
@ -1221,17 +1217,12 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector4a* sh
|
|||
// Depth clamp all water to avoid it being culled as a result of being
|
||||
// behind the far clip plane, and in the case of edge water to avoid
|
||||
// it being culled while still visible.
|
||||
bool const use_depth_clamp = gGLManager.mHasDepthClamp &&
|
||||
(mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_WATER ||
|
||||
bool const use_depth_clamp = (mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_WATER ||
|
||||
mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_VOIDWATER);
|
||||
|
||||
LLGLEnable clamp(use_depth_clamp ? GL_DEPTH_CLAMP : 0);
|
||||
LLGLEnable clamp(use_depth_clamp ? GL_DEPTH_CLAMP : 0);
|
||||
|
||||
#if !LL_DARWIN
|
||||
U32 mode = gGLManager.mHasOcclusionQuery2 ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED_ARB;
|
||||
#else
|
||||
U32 mode = GL_SAMPLES_PASSED_ARB;
|
||||
#endif
|
||||
U32 mode = gGLManager.mGLVersion >= 3.3f ? GL_ANY_SAMPLES_PASSED : GL_SAMPLES_PASSED;
|
||||
|
||||
#if LL_TRACK_PENDING_OCCLUSION_QUERIES
|
||||
sPendingQueries.insert(mOcclusionQuery[LLViewerCamera::sCurCameraID]);
|
||||
|
|
|
|||
|
|
@ -70,13 +70,6 @@ bool LLViewerShaderMgr::sSkipReload = false;
|
|||
|
||||
LLVector4 gShinyOrigin;
|
||||
|
||||
//transform shaders
|
||||
LLGLSLShader gTransformPositionProgram;
|
||||
LLGLSLShader gTransformTexCoordProgram;
|
||||
LLGLSLShader gTransformNormalProgram;
|
||||
LLGLSLShader gTransformColorProgram;
|
||||
LLGLSLShader gTransformTangentProgram;
|
||||
|
||||
//utility shaders
|
||||
LLGLSLShader gOcclusionProgram;
|
||||
LLGLSLShader gSkinnedOcclusionProgram;
|
||||
|
|
@ -476,7 +469,7 @@ void LLViewerShaderMgr::setShaders()
|
|||
initAttribsAndUniforms();
|
||||
gPipeline.releaseGLBuffers();
|
||||
|
||||
LLPipeline::sWaterReflections = gGLManager.mHasCubeMap && LLPipeline::sRenderTransparentWater;
|
||||
LLPipeline::sWaterReflections = LLPipeline::sRenderTransparentWater;
|
||||
LLPipeline::sRenderGlow = gSavedSettings.getBOOL("RenderGlow");
|
||||
LLPipeline::updateRenderDeferred();
|
||||
|
||||
|
|
@ -520,13 +513,6 @@ void LLViewerShaderMgr::setShaders()
|
|||
S32 wl_class = 1;
|
||||
S32 water_class = 2;
|
||||
S32 deferred_class = 0;
|
||||
S32 transform_class = gGLManager.mHasTransformFeedback ? 1 : 0;
|
||||
|
||||
static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false);
|
||||
if (!use_transform_feedback)
|
||||
{
|
||||
transform_class = 0;
|
||||
}
|
||||
|
||||
if (useRenderDeferred)
|
||||
{
|
||||
|
|
@ -579,7 +565,6 @@ void LLViewerShaderMgr::setShaders()
|
|||
mShaderLevel[SHADER_EFFECT] = effect_class;
|
||||
mShaderLevel[SHADER_WINDLIGHT] = wl_class;
|
||||
mShaderLevel[SHADER_DEFERRED] = deferred_class;
|
||||
mShaderLevel[SHADER_TRANSFORM] = transform_class;
|
||||
|
||||
std::string shader_name = loadBasicShaders();
|
||||
if (shader_name.empty())
|
||||
|
|
@ -664,20 +649,6 @@ void LLViewerShaderMgr::setShaders()
|
|||
}
|
||||
}
|
||||
|
||||
if (loaded)
|
||||
{
|
||||
loaded = loadTransformShaders();
|
||||
if (loaded)
|
||||
{
|
||||
LL_INFOS() << "Loaded transform shaders." << LL_ENDL;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to load transform shaders." << LL_ENDL;
|
||||
llassert(loaded);
|
||||
}
|
||||
}
|
||||
|
||||
if (loaded)
|
||||
{
|
||||
// Load max avatar shaders to set the max level
|
||||
|
|
@ -824,12 +795,6 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
gDeferredSkinnedDiffuseProgram.unload();
|
||||
gDeferredSkinnedBumpProgram.unload();
|
||||
|
||||
gTransformPositionProgram.unload();
|
||||
gTransformTexCoordProgram.unload();
|
||||
gTransformNormalProgram.unload();
|
||||
gTransformColorProgram.unload();
|
||||
gTransformTangentProgram.unload();
|
||||
|
||||
mShaderLevel[SHADER_LIGHTING] = 0;
|
||||
mShaderLevel[SHADER_OBJECT] = 0;
|
||||
mShaderLevel[SHADER_AVATAR] = 0;
|
||||
|
|
@ -838,7 +803,6 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
mShaderLevel[SHADER_INTERFACE] = 0;
|
||||
mShaderLevel[SHADER_EFFECT] = 0;
|
||||
mShaderLevel[SHADER_WINDLIGHT] = 0;
|
||||
mShaderLevel[SHADER_TRANSFORM] = 0;
|
||||
|
||||
gPipeline.mShadersLoaded = false;
|
||||
}
|
||||
|
|
@ -2458,10 +2422,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredShadowProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
// gDeferredShadowProgram.addPermutation("DEPTH_CLAMP", "1"); // disable depth clamp for now
|
||||
gDeferredShadowProgram.mRiggedVariant = &gDeferredSkinnedShadowProgram;
|
||||
success = gDeferredShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2477,10 +2438,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSkinnedShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowSkinnedV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredSkinnedShadowProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredSkinnedShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredSkinnedShadowProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
// gDeferredSkinnedShadowProgram.addPermutation("DEPTH_CLAMP", "1"); // disable depth clamp for now
|
||||
success = gDeferredSkinnedShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
}
|
||||
|
|
@ -2493,10 +2451,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowCubeProgram.mShaderFiles.clear();
|
||||
gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowCubeV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredShadowCubeProgram.mShaderFiles.push_back(make_pair("deferred/shadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredShadowCubeProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
// gDeferredShadowCubeProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
gDeferredShadowCubeProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredShadowCubeProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2512,10 +2467,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.clearPermutations();
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.addPermutation("IS_FULLBRIGHT", "1");
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredShadowFullbrightAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowFullbrightAlphaMaskProgram;
|
||||
|
|
@ -2533,10 +2485,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.clearPermutations();
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.addPermutation("IS_FULLBRIGHT", "1");
|
||||
gDeferredSkinnedShadowFullbrightAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredSkinnedShadowFullbrightAlphaMaskProgram.createShader(NULL, NULL);
|
||||
|
|
@ -2551,10 +2500,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredShadowAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredShadowAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredShadowAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
gDeferredShadowAlphaMaskProgram.mRiggedVariant = &gDeferredSkinnedShadowAlphaMaskProgram;
|
||||
success = gDeferredShadowAlphaMaskProgram.createShader(NULL, NULL);
|
||||
|
|
@ -2569,10 +2514,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.clear();
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskSkinnedV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderFiles.push_back(make_pair("deferred/shadowAlphaMaskF.glsl", GL_FRAGMENT_SHADER));
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredSkinnedShadowAlphaMaskProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredSkinnedShadowAlphaMaskProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2586,10 +2527,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAvatarShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredAvatarShadowProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredAvatarShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAvatarShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2602,7 +2539,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarAlphaShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAvatarAlphaShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAvatarAlphaShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredAvatarAlphaShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0");
|
||||
gDeferredAvatarAlphaShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAvatarAlphaShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2615,7 +2551,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarAlphaMaskShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAvatarAlphaMaskShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAvatarAlphaMaskShadowProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaMaskShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredAvatarAlphaMaskShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0");
|
||||
gDeferredAvatarAlphaMaskShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAvatarAlphaMaskShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2629,10 +2564,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAttachmentShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAttachmentShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
if (gGLManager.mHasDepthClamp)
|
||||
{
|
||||
gDeferredAttachmentShadowProgram.addPermutation("DEPTH_CLAMP", "1");
|
||||
}
|
||||
gDeferredAttachmentShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAttachmentShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2645,7 +2576,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAttachmentAlphaShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAttachmentAlphaShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentAlphaShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAttachmentAlphaShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentAlphaShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredAttachmentAlphaShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0");
|
||||
gDeferredAttachmentAlphaShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAttachmentAlphaShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -2658,7 +2588,6 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAttachmentAlphaMaskShadowProgram.mShaderFiles.clear();
|
||||
gDeferredAttachmentAlphaMaskShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentAlphaShadowV.glsl", GL_VERTEX_SHADER));
|
||||
gDeferredAttachmentAlphaMaskShadowProgram.mShaderFiles.push_back(make_pair("deferred/attachmentAlphaMaskShadowF.glsl", GL_FRAGMENT_SHADER));
|
||||
gDeferredAttachmentAlphaMaskShadowProgram.addPermutation("DEPTH_CLAMP", gGLManager.mHasDepthClamp ? "1" : "0");
|
||||
gDeferredAttachmentAlphaMaskShadowProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAttachmentAlphaMaskShadowProgram.createShader(NULL, NULL);
|
||||
llassert(success);
|
||||
|
|
@ -4016,95 +3945,6 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
|
|||
return success;
|
||||
}
|
||||
|
||||
BOOL LLViewerShaderMgr::loadTransformShaders()
|
||||
{
|
||||
BOOL success = TRUE;
|
||||
|
||||
if (mShaderLevel[SHADER_TRANSFORM] < 1)
|
||||
{
|
||||
gTransformPositionProgram.unload();
|
||||
gTransformTexCoordProgram.unload();
|
||||
gTransformNormalProgram.unload();
|
||||
gTransformColorProgram.unload();
|
||||
gTransformTangentProgram.unload();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTransformPositionProgram.mName = "Position Transform Shader";
|
||||
gTransformPositionProgram.mShaderFiles.clear();
|
||||
gTransformPositionProgram.mShaderFiles.push_back(make_pair("transform/positionV.glsl", GL_VERTEX_SHADER));
|
||||
gTransformPositionProgram.mShaderLevel = mShaderLevel[SHADER_TRANSFORM];
|
||||
|
||||
const char* varyings[] = {
|
||||
"position_out",
|
||||
"texture_index_out",
|
||||
};
|
||||
|
||||
success = gTransformPositionProgram.createShader(NULL, NULL, 2, varyings);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTransformTexCoordProgram.mName = "TexCoord Transform Shader";
|
||||
gTransformTexCoordProgram.mShaderFiles.clear();
|
||||
gTransformTexCoordProgram.mShaderFiles.push_back(make_pair("transform/texcoordV.glsl", GL_VERTEX_SHADER));
|
||||
gTransformTexCoordProgram.mShaderLevel = mShaderLevel[SHADER_TRANSFORM];
|
||||
|
||||
const char* varyings[] = {
|
||||
"texcoord_out",
|
||||
};
|
||||
|
||||
success = gTransformTexCoordProgram.createShader(NULL, NULL, 1, varyings);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTransformNormalProgram.mName = "Normal Transform Shader";
|
||||
gTransformNormalProgram.mShaderFiles.clear();
|
||||
gTransformNormalProgram.mShaderFiles.push_back(make_pair("transform/normalV.glsl", GL_VERTEX_SHADER));
|
||||
gTransformNormalProgram.mShaderLevel = mShaderLevel[SHADER_TRANSFORM];
|
||||
|
||||
const char* varyings[] = {
|
||||
"normal_out",
|
||||
};
|
||||
|
||||
success = gTransformNormalProgram.createShader(NULL, NULL, 1, varyings);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTransformColorProgram.mName = "Color Transform Shader";
|
||||
gTransformColorProgram.mShaderFiles.clear();
|
||||
gTransformColorProgram.mShaderFiles.push_back(make_pair("transform/colorV.glsl", GL_VERTEX_SHADER));
|
||||
gTransformColorProgram.mShaderLevel = mShaderLevel[SHADER_TRANSFORM];
|
||||
|
||||
const char* varyings[] = {
|
||||
"color_out",
|
||||
};
|
||||
|
||||
success = gTransformColorProgram.createShader(NULL, NULL, 1, varyings);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gTransformTangentProgram.mName = "Binormal Transform Shader";
|
||||
gTransformTangentProgram.mShaderFiles.clear();
|
||||
gTransformTangentProgram.mShaderFiles.push_back(make_pair("transform/binormalV.glsl", GL_VERTEX_SHADER));
|
||||
gTransformTangentProgram.mShaderLevel = mShaderLevel[SHADER_TRANSFORM];
|
||||
|
||||
const char* varyings[] = {
|
||||
"tangent_out",
|
||||
};
|
||||
|
||||
success = gTransformTangentProgram.createShader(NULL, NULL, 1, varyings);
|
||||
}
|
||||
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
std::string LLViewerShaderMgr::getShaderDirPrefix(void)
|
||||
{
|
||||
return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class");
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ public:
|
|||
BOOL loadShadersWater();
|
||||
BOOL loadShadersInterface();
|
||||
BOOL loadShadersWindLight();
|
||||
BOOL loadTransformShaders();
|
||||
|
||||
std::vector<S32> mShaderLevel;
|
||||
S32 mMaxAvatarShaderLevel;
|
||||
|
|
@ -78,7 +77,6 @@ public:
|
|||
SHADER_WINDLIGHT,
|
||||
SHADER_WATER,
|
||||
SHADER_DEFERRED,
|
||||
SHADER_TRANSFORM,
|
||||
SHADER_COUNT
|
||||
};
|
||||
|
||||
|
|
@ -150,15 +148,6 @@ inline bool operator != (LLViewerShaderMgr::shader_iter const & a, LLViewerShade
|
|||
|
||||
extern LLVector4 gShinyOrigin;
|
||||
|
||||
//transform shaders
|
||||
extern LLGLSLShader gTransformPositionProgram;
|
||||
extern LLGLSLShader gTransformTexCoordProgram;
|
||||
extern LLGLSLShader gTransformNormalProgram;
|
||||
extern LLGLSLShader gTransformColorProgram;
|
||||
extern LLGLSLShader gTransformTangentProgram;
|
||||
|
||||
|
||||
|
||||
//utility shaders
|
||||
extern LLGLSLShader gOcclusionProgram;
|
||||
extern LLGLSLShader gOcclusionCubeProgram;
|
||||
|
|
|
|||
|
|
@ -2152,7 +2152,7 @@ bool LLViewerFetchedTexture::updateFetch()
|
|||
|
||||
if (!mIsFetching)
|
||||
{
|
||||
if ((decode_priority > 0) && (mRawDiscardLevel < 0))
|
||||
if ((decode_priority > 0) && (mRawDiscardLevel < 0 || mRawDiscardLevel == INVALID_DISCARD_LEVEL))
|
||||
{
|
||||
// We finished but received no data
|
||||
if (getDiscardLevel() < 0)
|
||||
|
|
@ -2207,7 +2207,7 @@ bool LLViewerFetchedTexture::updateFetch()
|
|||
desired_discard = llmin(desired_discard, getMaxDiscardLevel());
|
||||
|
||||
bool make_request = true;
|
||||
/*if (decode_priority <= 0)
|
||||
if (decode_priority <= 0)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - priority <= 0");
|
||||
make_request = false;
|
||||
|
|
@ -2217,7 +2217,7 @@ bool LLViewerFetchedTexture::updateFetch()
|
|||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - desired > max");
|
||||
make_request = false;
|
||||
}
|
||||
else */ if (mNeedsCreateTexture || mIsMissingAsset)
|
||||
else if (mNeedsCreateTexture || mIsMissingAsset)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_TEXTURE("vftuf - create or missing");
|
||||
make_request = false;
|
||||
|
|
|
|||
|
|
@ -1274,152 +1274,6 @@ LLPointer<LLImageJ2C> LLViewerTextureList::convertToUploadFile(LLPointer<LLImage
|
|||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// static
|
||||
void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_data)
|
||||
{
|
||||
static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ;
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
|
||||
// Receive image header, copy into image object and decompresses
|
||||
// if this is a one-packet image.
|
||||
|
||||
LLUUID id;
|
||||
|
||||
char ip_string[256];
|
||||
u32_to_ip_string(msg->getSenderIP(),ip_string);
|
||||
|
||||
U32Bytes received_size ;
|
||||
if (msg->getReceiveCompressedSize())
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveCompressedSize() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveSize() ;
|
||||
}
|
||||
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, received_size);
|
||||
add(LLStatViewer::TEXTURE_PACKETS, 1);
|
||||
|
||||
U8 codec;
|
||||
U16 packets;
|
||||
U32 totalbytes;
|
||||
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
|
||||
msg->getU8Fast(_PREHASH_ImageID, _PREHASH_Codec, codec);
|
||||
msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets);
|
||||
msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes);
|
||||
|
||||
S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
|
||||
if (!data_size)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (data_size < 0)
|
||||
{
|
||||
// msg->getSizeFast() is probably trying to tell us there
|
||||
// was an error.
|
||||
LL_ERRS() << "image header chunk size was negative: "
|
||||
<< data_size << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
// this buffer gets saved off in the packet list
|
||||
U8 *data = new U8[data_size];
|
||||
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
|
||||
|
||||
LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
|
||||
if (!image)
|
||||
{
|
||||
delete [] data;
|
||||
return;
|
||||
}
|
||||
if(log_texture_traffic)
|
||||
{
|
||||
gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ;
|
||||
}
|
||||
|
||||
//image->getLastPacketTimer()->reset();
|
||||
bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);
|
||||
if (!res)
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_data)
|
||||
{
|
||||
static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic", false) ;
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
|
||||
// Receives image packet, copy into image object,
|
||||
// checks if all packets received, decompresses if so.
|
||||
|
||||
LLUUID id;
|
||||
U16 packet_num;
|
||||
|
||||
char ip_string[256];
|
||||
u32_to_ip_string(msg->getSenderIP(),ip_string);
|
||||
|
||||
U32Bytes received_size ;
|
||||
if (msg->getReceiveCompressedSize())
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveCompressedSize() ;
|
||||
}
|
||||
else
|
||||
{
|
||||
received_size = (U32Bytes)msg->getReceiveSize() ;
|
||||
}
|
||||
|
||||
add(LLStatViewer::TEXTURE_NETWORK_DATA_RECEIVED, F64Bytes(received_size));
|
||||
add(LLStatViewer::TEXTURE_PACKETS, 1);
|
||||
|
||||
//llprintline("Start decode, image header...");
|
||||
msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
|
||||
msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packet, packet_num);
|
||||
S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
|
||||
|
||||
if (!data_size)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (data_size < 0)
|
||||
{
|
||||
// msg->getSizeFast() is probably trying to tell us there
|
||||
// was an error.
|
||||
LL_ERRS() << "image data chunk size was negative: "
|
||||
<< data_size << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
if (data_size > MTUBYTES)
|
||||
{
|
||||
LL_ERRS() << "image data chunk too large: " << data_size << " bytes" << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
U8 *data = new U8[data_size];
|
||||
msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
|
||||
|
||||
LLViewerFetchedTexture *image = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
|
||||
if (!image)
|
||||
{
|
||||
delete [] data;
|
||||
return;
|
||||
}
|
||||
if(log_texture_traffic)
|
||||
{
|
||||
gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ;
|
||||
}
|
||||
|
||||
//image->getLastPacketTimer()->reset();
|
||||
bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data);
|
||||
if (!res)
|
||||
{
|
||||
delete[] data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// We've been that the asset server does not contain the requested image id.
|
||||
// static
|
||||
void LLViewerTextureList::processImageNotInDatabase(LLMessageSystem *msg,void **user_data)
|
||||
|
|
|
|||
|
|
@ -98,8 +98,6 @@ public:
|
|||
const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT);
|
||||
static LLPointer<LLImageJ2C> convertToUploadFile(LLPointer<LLImageRaw> raw_image, const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT, bool force_lossless = false);
|
||||
static void processImageNotInDatabase( LLMessageSystem *msg, void **user_data );
|
||||
static void receiveImageHeader(LLMessageSystem *msg, void **user_data);
|
||||
static void receiveImagePacket(LLMessageSystem *msg, void **user_data);
|
||||
|
||||
public:
|
||||
LLViewerTextureList();
|
||||
|
|
|
|||
|
|
@ -648,29 +648,6 @@ public:
|
|||
{
|
||||
LLTrace::Recording& last_frame_recording = LLTrace::get_frame_recording().getLastRecording();
|
||||
|
||||
if (gGLManager.mHasATIMemInfo)
|
||||
{
|
||||
S32 meminfo[4];
|
||||
glGetIntegerv(GL_TEXTURE_FREE_MEMORY_ATI, meminfo);
|
||||
|
||||
addText(xpos, ypos, llformat("%.2f MB Texture Memory Free", meminfo[0]/1024.f));
|
||||
ypos += y_inc;
|
||||
|
||||
if (gGLManager.mHasVertexBufferObject)
|
||||
{
|
||||
glGetIntegerv(GL_VBO_FREE_MEMORY_ATI, meminfo);
|
||||
addText(xpos, ypos, llformat("%.2f MB VBO Memory Free", meminfo[0]/1024.f));
|
||||
ypos += y_inc;
|
||||
}
|
||||
}
|
||||
else if (gGLManager.mHasNVXMemInfo)
|
||||
{
|
||||
S32 free_memory;
|
||||
glGetIntegerv(GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX, &free_memory);
|
||||
addText(xpos, ypos, llformat("%.2f MB Video Memory Free", free_memory/1024.f));
|
||||
ypos += y_inc;
|
||||
}
|
||||
|
||||
//show streaming cost/triangle count of known prims in current region OR selection
|
||||
{
|
||||
F32 cost = 0.f;
|
||||
|
|
@ -2101,11 +2078,6 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
LL_DEBUGS("Window") << "Loading feature tables." << LL_ENDL;
|
||||
|
||||
// Initialize OpenGL Renderer
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderVBOEnable") ||
|
||||
!gGLManager.mHasVertexBufferObject)
|
||||
{
|
||||
gSavedSettings.setBOOL("RenderVBOEnable", FALSE);
|
||||
}
|
||||
LLVertexBuffer::initClass(gSavedSettings.getBOOL("RenderVBOEnable"), gSavedSettings.getBOOL("RenderVBOMappingDisable"));
|
||||
LL_INFOS("RenderInit") << "LLVertexBuffer initialization done." << LL_ENDL ;
|
||||
gGL.init(true);
|
||||
|
|
@ -2120,7 +2092,7 @@ LLViewerWindow::LLViewerWindow(const Params& p)
|
|||
LLFeatureManager::getInstance()->applyRecommendedSettings();
|
||||
gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE);
|
||||
}
|
||||
|
||||
|
||||
// If we crashed while initializng GL stuff last time, disable certain features
|
||||
if (gSavedSettings.getBOOL("RenderInitError"))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -535,7 +535,7 @@ void LLVOSky::initCubeMap()
|
|||
images.push_back(mShinyTex[side].getImageRaw());
|
||||
}
|
||||
|
||||
if (!mCubeMap && gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
|
||||
if (!mCubeMap && gSavedSettings.getBOOL("RenderWater") && LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
mCubeMap = new LLCubeMap(false);
|
||||
}
|
||||
|
|
@ -580,7 +580,7 @@ void LLVOSky::restoreGL()
|
|||
|
||||
updateDirections(psky);
|
||||
|
||||
if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps)
|
||||
if (gSavedSettings.getBOOL("RenderWater") && LLCubeMap::sUseCubeMaps)
|
||||
{
|
||||
initCubeMap();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1280,27 +1280,7 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams ¶ms_in, const S32 detail, bo
|
|||
}
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false);
|
||||
|
||||
bool cache_in_vram = use_transform_feedback && gTransformPositionProgram.mProgramObject &&
|
||||
(!mVolumeImpl || !mVolumeImpl->isVolumeUnique());
|
||||
|
||||
if (cache_in_vram)
|
||||
{ //this volume might be used as source data for a transform object, put it in vram
|
||||
LLVolume* volume = getVolume();
|
||||
for (S32 i = 0; i < volume->getNumFaces(); ++i)
|
||||
{
|
||||
const LLVolumeFace& face = volume->getVolumeFace(i);
|
||||
if (face.mVertexBuffer.notNull())
|
||||
{ //already cached
|
||||
break;
|
||||
}
|
||||
volume->genTangents(i);
|
||||
LLFace::cacheFaceInVRAM(face);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else if (NO_LOD == lod)
|
||||
{
|
||||
|
|
@ -6770,16 +6750,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace
|
|||
U32 geometryBytes = 0;
|
||||
U32 buffer_usage = group->mBufferUsage;
|
||||
|
||||
static LLCachedControl<bool> use_transform_feedback(gSavedSettings, "RenderUseTransformFeedback", false);
|
||||
|
||||
if (use_transform_feedback &&
|
||||
gTransformPositionProgram.mProgramObject && //transform shaders are loaded
|
||||
buffer_usage == GL_DYNAMIC_DRAW && //target buffer is in VRAM
|
||||
!(mask & LLVertexBuffer::MAP_WEIGHT4)) //TODO: add support for weights
|
||||
{
|
||||
buffer_usage = GL_DYNAMIC_COPY;
|
||||
}
|
||||
|
||||
#if LL_DARWIN
|
||||
// HACK from Leslie:
|
||||
// Disable VBO usage for alpha on Mac OS X because it kills the framerate
|
||||
|
|
|
|||
|
|
@ -999,15 +999,6 @@ bool LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 samples)
|
|||
if (!addDeferredAttachments(mRT->deferredScreen)) return false;
|
||||
|
||||
GLuint screenFormat = GL_RGBA16;
|
||||
if (gGLManager.mIsAMD)
|
||||
{
|
||||
screenFormat = GL_RGBA12;
|
||||
}
|
||||
|
||||
if (gGLManager.mGLVersion < 4.f && gGLManager.mIsNVIDIA)
|
||||
{
|
||||
screenFormat = GL_RGBA16F_ARB;
|
||||
}
|
||||
|
||||
if (!mRT->screen.allocate(resX, resY, screenFormat, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE, samples)) return false;
|
||||
if (samples > 0)
|
||||
|
|
@ -1203,8 +1194,7 @@ void LLPipeline::refreshCachedSettings()
|
|||
LLPipeline::sUseOcclusion =
|
||||
(!gUseWireframe
|
||||
&& LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
|
||||
&& gSavedSettings.getBOOL("UseOcclusion")
|
||||
&& gGLManager.mHasOcclusionQuery) ? 2 : 0;
|
||||
&& gSavedSettings.getBOOL("UseOcclusion")) ? 2 : 0;
|
||||
|
||||
WindLightUseAtmosShaders = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("WindLightUseAtmosShaders");
|
||||
RenderDeferred = TRUE; // DEPRECATED -- gSavedSettings.getBOOL("RenderDeferred");
|
||||
|
|
@ -2517,8 +2507,7 @@ static LLTrace::BlockTimerStatHandle FTM_CULL("Object Culling");
|
|||
void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, LLPlane* planep, bool hud_attachments)
|
||||
{
|
||||
static LLCachedControl<bool> use_occlusion(gSavedSettings,"UseOcclusion");
|
||||
static bool can_use_occlusion = LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion")
|
||||
&& gGLManager.mHasOcclusionQuery;
|
||||
static bool can_use_occlusion = LLFeatureManager::getInstance()->isFeatureAvailable("UseOcclusion");
|
||||
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_PIPELINE; //LL_RECORD_BLOCK_TIME(FTM_CULL);
|
||||
|
||||
|
|
@ -10114,7 +10103,7 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
LLGLEnable cull(GL_CULL_FACE);
|
||||
|
||||
//enable depth clamping if available
|
||||
LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0);
|
||||
//LLGLEnable depth_clamp(GL_DEPTH_CLAMP);
|
||||
|
||||
if (use_shader)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1044,7 +1044,7 @@ void FloaterQuickPrefs::setSelectedDayCycle(const std::string& preset_name)
|
|||
// Phototools additions
|
||||
void FloaterQuickPrefs::refreshSettings()
|
||||
{
|
||||
BOOL reflections = gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps;
|
||||
BOOL reflections = LLCubeMap::sUseCubeMaps;
|
||||
mCtrlReflectionDetail->setEnabled(reflections);
|
||||
|
||||
LLTextBox* sky_label = getChild<LLTextBox>("T_Sky_Detail");
|
||||
|
|
@ -1066,38 +1066,6 @@ void FloaterQuickPrefs::refreshSettings()
|
|||
|
||||
mCtrlShadowDetail->setEnabled(enabled);
|
||||
|
||||
// disabled windlight
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("WindLightUseAtmosShaders"))
|
||||
{
|
||||
sky_label->setEnabled(FALSE);
|
||||
sky_slider->setEnabled(FALSE);
|
||||
sky_spinner->setEnabled(FALSE);
|
||||
sky_default_button->setEnabled(FALSE);
|
||||
|
||||
mCtrlShadowDetail->setEnabled(FALSE);
|
||||
mCtrlShadowDetail->setValue(0);
|
||||
|
||||
mCtrlUseSSAO->setEnabled(FALSE);
|
||||
mCtrlUseSSAO->setValue(FALSE);
|
||||
|
||||
mCtrlUseDoF->setEnabled(FALSE);
|
||||
mCtrlUseDoF->setValue(FALSE);
|
||||
}
|
||||
|
||||
// disabled deferred
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") ||
|
||||
!gGLManager.mHasFramebufferObject)
|
||||
{
|
||||
mCtrlShadowDetail->setEnabled(FALSE);
|
||||
mCtrlShadowDetail->setValue(0);
|
||||
|
||||
mCtrlUseSSAO->setEnabled(FALSE);
|
||||
mCtrlUseSSAO->setValue(FALSE);
|
||||
|
||||
mCtrlUseDoF->setEnabled(FALSE);
|
||||
mCtrlUseDoF->setValue(FALSE);
|
||||
}
|
||||
|
||||
// disabled deferred SSAO
|
||||
if (!LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferredSSAO"))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -4395,8 +4395,6 @@
|
|||
<menu_item_check.on_click
|
||||
function="ToggleControl"
|
||||
parameter="UseOcclusion" />
|
||||
<menu_item_check.on_enable
|
||||
function="Advanced.EnableObjectObjectOcclusion" />
|
||||
</menu_item_check>
|
||||
<menu_item_separator />
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue