Add an AssertOnShaderCompileFailure GrContextOption
Part of a multi-step plan:
1) Add this option (which is *not* GL specific).
2) Disable this in Chromium at context-creation.
3) Finish adding the shader error handler, with default
behavior controlled via this flag, and remove Chromium
driver checks from the corresponding code at the same time.
Change-Id: I7e50c8404a05c1f291f187cf48481d0cbb34066a
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/211646
Reviewed-by: Robert Phillips <robertphillips@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index d90a91e..5efd09e 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -19,6 +19,7 @@
#include "src/core/SkMakeUnique.h"
#include "src/core/SkMipMap.h"
#include "src/core/SkTraceEvent.h"
+#include "src/gpu/GrContextPriv.h"
#include "src/gpu/GrCpuBuffer.h"
#include "src/gpu/GrFixedClip.h"
#include "src/gpu/GrGpuResourcePriv.h"
@@ -3443,16 +3444,20 @@
SkSL::Program::Settings settings;
settings.fCaps = shaderCaps;
SkSL::String glsl;
+ bool assertOnCompileFailure =
+ this->getContext()->priv().options().fAssertOnShaderCompileFailure;
std::unique_ptr<SkSL::Program> program = GrSkSLtoGLSL(*fGLContext, SkSL::Program::kVertex_Kind,
sksl, settings, &glsl);
GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms[progIdx].fProgram,
- GR_GL_VERTEX_SHADER, glsl, &fStats);
+ GR_GL_VERTEX_SHADER, glsl, &fStats,
+ assertOnCompileFailure);
SkASSERT(program->fInputs.isEmpty());
sksl.assign(fshaderTxt.c_str(), fshaderTxt.size());
program = GrSkSLtoGLSL(*fGLContext, SkSL::Program::kFragment_Kind, sksl, settings, &glsl);
GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fCopyPrograms[progIdx].fProgram,
- GR_GL_FRAGMENT_SHADER, glsl, &fStats);
+ GR_GL_FRAGMENT_SHADER, glsl, &fStats,
+ assertOnCompileFailure);
SkASSERT(program->fInputs.isEmpty());
GL_CALL(LinkProgram(fCopyPrograms[progIdx].fProgram));
@@ -3595,16 +3600,20 @@
SkSL::Program::Settings settings;
settings.fCaps = shaderCaps;
SkSL::String glsl;
+ bool assertOnCompileFailure =
+ this->getContext()->priv().options().fAssertOnShaderCompileFailure;
std::unique_ptr<SkSL::Program> program = GrSkSLtoGLSL(*fGLContext, SkSL::Program::kVertex_Kind,
sksl, settings, &glsl);
GrGLuint vshader = GrGLCompileAndAttachShader(*fGLContext, fMipmapPrograms[progIdx].fProgram,
- GR_GL_VERTEX_SHADER, glsl, &fStats);
+ GR_GL_VERTEX_SHADER, glsl, &fStats,
+ assertOnCompileFailure);
SkASSERT(program->fInputs.isEmpty());
sksl.assign(fshaderTxt.c_str(), fshaderTxt.size());
program = GrSkSLtoGLSL(*fGLContext, SkSL::Program::kFragment_Kind, sksl, settings, &glsl);
GrGLuint fshader = GrGLCompileAndAttachShader(*fGLContext, fMipmapPrograms[progIdx].fProgram,
- GR_GL_FRAGMENT_SHADER, glsl, &fStats);
+ GR_GL_FRAGMENT_SHADER, glsl, &fStats,
+ assertOnCompileFailure);
SkASSERT(program->fInputs.isEmpty());
GL_CALL(LinkProgram(fMipmapPrograms[progIdx].fProgram));
diff --git a/src/gpu/gl/builders/GrGLProgramBuilder.cpp b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
index ddd3525..d7ac7e4 100644
--- a/src/gpu/gl/builders/GrGLProgramBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLProgramBuilder.cpp
@@ -91,11 +91,13 @@
SkTDArray<GrGLuint>* shaderIds,
const SkSL::Program::Inputs& inputs) {
GrGLGpu* gpu = this->gpu();
+ bool assertOnCompileFailure = gpu->getContext()->priv().options().fAssertOnShaderCompileFailure;
GrGLuint shaderId = GrGLCompileAndAttachShader(gpu->glContext(),
programId,
type,
glsl,
- gpu->stats());
+ gpu->stats(),
+ assertOnCompileFailure);
if (!shaderId) {
return false;
}
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
index 0d7a29b..473414e 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
@@ -61,7 +61,8 @@
GrGLuint programId,
GrGLenum type,
const SkSL::String& glsl,
- GrGpu::Stats* stats) {
+ GrGpu::Stats* stats,
+ bool assertOnFailure) {
const GrGLInterface* gli = glCtx.interface();
// Specify GLSL source to the driver.
@@ -101,7 +102,7 @@
}
// In Chrome we may have failed due to context-loss. So we should just continue along
// wihthout asserting until the GrContext gets abandoned.
- if (kChromium_GrGLDriver != glCtx.driver()) {
+ if (assertOnFailure && kChromium_GrGLDriver != glCtx.driver()) {
SkDEBUGFAIL("GLSL compilation failed!");
}
GR_GL_CALL(gli, DeleteShader(shaderId));
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.h b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
index bb861c3..e65d995 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
@@ -24,7 +24,8 @@
GrGLuint programId,
GrGLenum type,
const SkSL::String& glsl,
- GrGpu::Stats*);
+ GrGpu::Stats*,
+ bool assertOnFailure);
void GrGLPrintShader(const GrGLContext&, SkSL::Program::Kind programKind, const SkSL::String& sksl,
const SkSL::Program::Settings&);