Add debug setting and code to allow nVidia nSight graphics debugging to capture SL frames.
These changes are only enabled if RenderNsightDebugSupport is true and eliminate use of some OpenGL legacy functionality which is incompatible with nSight capture (mostly glReadPixels and other fixed-function pipe rendering calls).meow-7.2.2
parent
86935443eb
commit
06bce2ddd0
|
|
@ -1577,7 +1577,12 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
|||
}
|
||||
alpha_data = new U8[width * height];
|
||||
mAlphaCache[cache_index] = alpha_data;
|
||||
glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
|
||||
|
||||
// nSight doesn't support use of glReadPixels
|
||||
if (!LLRender::sNsightDebugSupport)
|
||||
{
|
||||
glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
|
||||
}
|
||||
}
|
||||
|
||||
getTexLayerSet()->getAvatarAppearance()->dirtyMesh();
|
||||
|
|
|
|||
|
|
@ -1348,8 +1348,19 @@ void LLGLManager::initExtensions()
|
|||
if (mHasVertexShader)
|
||||
{
|
||||
LL_INFOS() << "initExtensions() VertexShader-related procs..." << LL_ENDL;
|
||||
|
||||
// nSight doesn't support use of ARB funcs that have been normalized in the API
|
||||
if (!LLRender::sNsightDebugSupport)
|
||||
{
|
||||
glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocationARB");
|
||||
glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC) GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocationARB");
|
||||
}
|
||||
else
|
||||
{
|
||||
glGetAttribLocationARB = (PFNGLGETATTRIBLOCATIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("glGetAttribLocation");
|
||||
glBindAttribLocationARB = (PFNGLBINDATTRIBLOCATIONARBPROC)GLH_EXT_GET_PROC_ADDRESS("glBindAttribLocation");
|
||||
}
|
||||
|
||||
glGetActiveAttribARB = (PFNGLGETACTIVEATTRIBARBPROC) GLH_EXT_GET_PROC_ADDRESS("glGetActiveAttribARB");
|
||||
glVertexAttrib1dARB = (PFNGLVERTEXATTRIB1DARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dARB");
|
||||
glVertexAttrib1dvARB = (PFNGLVERTEXATTRIB1DVARBPROC) GLH_EXT_GET_PROC_ADDRESS("glVertexAttrib1dvARB");
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ U32 LLRender::sUICalls = 0;
|
|||
U32 LLRender::sUIVerts = 0;
|
||||
U32 LLTexUnit::sWhiteTexture = 0;
|
||||
bool LLRender::sGLCoreProfile = false;
|
||||
bool LLRender::sNsightDebugSupport = false;
|
||||
|
||||
static const U32 LL_NUM_TEXTURE_LAYERS = 32;
|
||||
static const U32 LL_NUM_LIGHT_UNITS = 8;
|
||||
|
|
|
|||
|
|
@ -438,7 +438,8 @@ public:
|
|||
static U32 sUICalls;
|
||||
static U32 sUIVerts;
|
||||
static bool sGLCoreProfile;
|
||||
|
||||
static bool sNsightDebugSupport;
|
||||
|
||||
private:
|
||||
friend class LLLightState;
|
||||
|
||||
|
|
|
|||
|
|
@ -1549,7 +1549,10 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen &size, BO
|
|||
(LLRender::sGLCoreProfile ? " core" : " compatibility") << " context." << LL_ENDL;
|
||||
done = true;
|
||||
|
||||
if (LLRender::sGLCoreProfile)
|
||||
// force sNoFixedFunction iff we're trying to use nsight debugging which does not support many legacy API uses
|
||||
|
||||
// nSight doesn't support use of legacy API funcs in the fixed function pipe
|
||||
if (LLRender::sGLCoreProfile || LLRender::sNsightDebugSupport)
|
||||
{
|
||||
LLGLSLShader::sNoFixedFunction = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8631,7 +8631,19 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
|
||||
<key>RenderNsightDebugSupport</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>
|
||||
Disable features which prevent nVidia nSight from being usable with SL
|
||||
</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>RenderLocalLights</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -583,6 +583,7 @@ static void settings_to_globals()
|
|||
LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize"));
|
||||
|
||||
LLRender::sGLCoreProfile = gSavedSettings.getBOOL("RenderGLCoreProfile");
|
||||
LLRender::sNsightDebugSupport = gSavedSettings.getBOOL("RenderNsightDebugSupport");
|
||||
LLVertexBuffer::sUseVAO = gSavedSettings.getBOOL("RenderUseVAO");
|
||||
LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic");
|
||||
LLImageGL::sCompressTextures = gSavedSettings.getBOOL("RenderCompressTextures");
|
||||
|
|
@ -1100,6 +1101,7 @@ bool LLAppViewer::init()
|
|||
}
|
||||
}
|
||||
|
||||
#if LL_RELEASE_FOR_DOWNLOAD
|
||||
char* PARENT = getenv("PARENT");
|
||||
if (! (PARENT && std::string(PARENT) == "SL_Launcher"))
|
||||
{
|
||||
|
|
@ -1112,6 +1114,7 @@ bool LLAppViewer::init()
|
|||
// him/herself in the foot.
|
||||
LLNotificationsUtil::add("RunLauncher");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if LL_WINDOWS
|
||||
if (gGLManager.mGLVersion < LLFeatureManager::getInstance()->getExpectedGLVersion())
|
||||
|
|
|
|||
|
|
@ -435,18 +435,22 @@ void LLFastTimerView::onClose(bool app_quitting)
|
|||
|
||||
void saveChart(const std::string& label, const char* suffix, LLImageRaw* scratch)
|
||||
{
|
||||
//read result back into raw image
|
||||
glReadPixels(0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, scratch->getData());
|
||||
// disable use of glReadPixels which messes up nVidia nSight graphics debugging
|
||||
if (!LLRender::sNsightDebugSupport)
|
||||
{
|
||||
//read result back into raw image
|
||||
glReadPixels(0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, scratch->getData());
|
||||
|
||||
//write results to disk
|
||||
LLPointer<LLImagePNG> result = new LLImagePNG();
|
||||
result->encode(scratch, 0.f);
|
||||
//write results to disk
|
||||
LLPointer<LLImagePNG> result = new LLImagePNG();
|
||||
result->encode(scratch, 0.f);
|
||||
|
||||
std::string ext = result->getExtension();
|
||||
std::string filename = llformat("%s_%s.%s", label.c_str(), suffix, ext.c_str());
|
||||
std::string ext = result->getExtension();
|
||||
std::string filename = llformat("%s_%s.%s", label.c_str(), suffix, ext.c_str());
|
||||
|
||||
std::string out_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename);
|
||||
result->save(out_file);
|
||||
std::string out_file = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename);
|
||||
result->save(out_file);
|
||||
}
|
||||
}
|
||||
|
||||
//static
|
||||
|
|
|
|||
|
|
@ -731,7 +731,8 @@ public:
|
|||
addText(xpos, ypos, "View Matrix");
|
||||
ypos += y_inc;
|
||||
}
|
||||
if (gSavedSettings.getBOOL("DebugShowColor"))
|
||||
// disable use of glReadPixels which messes up nVidia nSight graphics debugging
|
||||
if (gSavedSettings.getBOOL("DebugShowColor") && !LLRender::sNsightDebugSupport)
|
||||
{
|
||||
U8 color[4];
|
||||
LLCoordGL coord = gViewerWindow->getCurrentMouse();
|
||||
|
|
@ -4717,36 +4718,39 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
|
|||
{
|
||||
LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot");
|
||||
}
|
||||
|
||||
if (type == LLSnapshotModel::SNAPSHOT_TYPE_COLOR)
|
||||
// disable use of glReadPixels when doing nVidia nSight graphics debugging
|
||||
if (!LLRender::sNsightDebugSupport)
|
||||
{
|
||||
glReadPixels(
|
||||
if (type == LLSnapshotModel::SNAPSHOT_TYPE_COLOR)
|
||||
{
|
||||
glReadPixels(
|
||||
subimage_x_offset, out_y + subimage_y_offset,
|
||||
read_width, 1,
|
||||
GL_RGB, GL_UNSIGNED_BYTE,
|
||||
raw->getData() + output_buffer_offset
|
||||
);
|
||||
}
|
||||
else // LLSnapshotModel::SNAPSHOT_TYPE_DEPTH
|
||||
{
|
||||
LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
|
||||
glReadPixels(
|
||||
subimage_x_offset, out_y + subimage_y_offset,
|
||||
read_width, 1,
|
||||
GL_DEPTH_COMPONENT, GL_FLOAT,
|
||||
depth_line_buffer->getData()// current output pixel is beginning of buffer...
|
||||
);
|
||||
|
||||
for (S32 i = 0; i < (S32)read_width; i++)
|
||||
}
|
||||
else // LLSnapshotModel::SNAPSHOT_TYPE_DEPTH
|
||||
{
|
||||
F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
|
||||
|
||||
F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
|
||||
U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
|
||||
// write converted scanline out to result image
|
||||
for (S32 j = 0; j < raw->getComponents(); j++)
|
||||
LLPointer<LLImageRaw> depth_line_buffer = new LLImageRaw(read_width, 1, sizeof(GL_FLOAT)); // need to store floating point values
|
||||
glReadPixels(
|
||||
subimage_x_offset, out_y + subimage_y_offset,
|
||||
read_width, 1,
|
||||
GL_DEPTH_COMPONENT, GL_FLOAT,
|
||||
depth_line_buffer->getData()// current output pixel is beginning of buffer...
|
||||
);
|
||||
|
||||
for (S32 i = 0; i < (S32)read_width; i++)
|
||||
{
|
||||
*(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
|
||||
F32 depth_float = *(F32*)(depth_line_buffer->getData() + (i * sizeof(F32)));
|
||||
|
||||
F32 linear_depth_float = 1.f / (depth_conversion_factor_1 - (depth_float * depth_conversion_factor_2));
|
||||
U8 depth_byte = F32_to_U8(linear_depth_float, LLViewerCamera::getInstance()->getNear(), LLViewerCamera::getInstance()->getFar());
|
||||
// write converted scanline out to result image
|
||||
for (S32 j = 0; j < raw->getComponents(); j++)
|
||||
{
|
||||
*(raw->getData() + output_buffer_offset + (i * raw->getComponents()) + j) = depth_byte;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue