From 684e814eb7db718a311fe1fb0b7578d94b946705 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 18 Sep 2018 12:46:23 +0100 Subject: [PATCH] Protect access to TextureViewer from custom shader editor * This means we don't crash if the custom shader editor is kept open even when the texture viewer is closed. --- qrenderdoc/Windows/TextureViewer.cpp | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 03d87dff2..d1317f32f 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -3871,13 +3871,16 @@ void TextureViewer::on_customEdit_clicked() rdcstrpairs files; files.push_back(make_rdcpair(filename, src)); + QPointer thisPointer(this); + IShaderViewer *s = m_Ctx.EditShader( true, ShaderStage::Fragment, lit("main"), files, IsD3D(m_Ctx.APIProps().localRenderer) ? ShaderEncoding::HLSL : ShaderEncoding::GLSL, ShaderCompileFlags(), // Save Callback - [this, key, filename, path](ICaptureContext *ctx, IShaderViewer *viewer, ShaderEncoding encoding, - ShaderCompileFlags flags, rdcstr entryFunc, bytebuf bytes) { + [thisPointer, key, filename, path](ICaptureContext *ctx, IShaderViewer *viewer, + ShaderEncoding encoding, ShaderCompileFlags flags, + rdcstr entryFunc, bytebuf bytes) { { QFile fileHandle(path); if(fileHandle.open(QFile::WriteOnly | QIODevice::Truncate | QIODevice::Text)) @@ -3886,18 +3889,25 @@ void TextureViewer::on_customEdit_clicked() fileHandle.close(); // watcher doesn't trigger on internal modifications - reloadCustomShaders(filename); + if(thisPointer) + thisPointer->reloadCustomShaders(filename); } else { - RDDialog::critical( - this, tr("Cannot save shader"), - tr("Couldn't save file for shader %1\n%2").arg(filename).arg(fileHandle.errorString())); + if(thisPointer) + { + RDDialog::critical( + thisPointer, tr("Cannot save shader"), + tr("Couldn't save file for shader %1\n%2").arg(filename).arg(fileHandle.errorString())); + } } } }, - [this, key](ICaptureContext *ctx) { m_CustomShaderEditor.remove(key); }); + [thisPointer, key](ICaptureContext *ctx) { + if(thisPointer) + thisPointer->m_CustomShaderEditor.remove(key); + }); m_CustomShaderEditor[key] = s;