Add ShaderErrorHandler to GrContextOptions
Allows clients to customize behavior when shaders fail to compile.
Added nicer shader error handling to viewer.
Change-Id: If82b48e40d64fd786f37e88c564fd623b53c7f9d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/211361
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp
index 89f436d..89f89b2 100644
--- a/tools/viewer/Viewer.cpp
+++ b/tools/viewer/Viewer.cpp
@@ -56,6 +56,24 @@
#include "tools/viewer/NIMASlide.h"
#endif
+class CapturingShaderErrorHandler : public GrContextOptions::ShaderErrorHandler {
+public:
+ void compileError(const char* shader, const char* errors) override {
+ fShaders.push_back(SkString(shader));
+ fErrors.push_back(SkString(errors));
+ }
+
+ void reset() {
+ fShaders.reset();
+ fErrors.reset();
+ }
+
+ SkTArray<SkString> fShaders;
+ SkTArray<SkString> fErrors;
+};
+
+static CapturingShaderErrorHandler gShaderErrorHandler;
+
using namespace sk_app;
static std::map<GpuPathRenderers, std::string> gPathRendererNames;
@@ -281,6 +299,8 @@
SetCtxOptionsFromCommonFlags(&displayParams.fGrContextOptions);
displayParams.fGrContextOptions.fPersistentCache = &fPersistentCache;
displayParams.fGrContextOptions.fDisallowGLSLBinaryCaching = true;
+ displayParams.fGrContextOptions.fShaderErrorHandler = &gShaderErrorHandler;
+ displayParams.fGrContextOptions.fSuppressPrints = true;
fWindow->setRequestedDisplayParams(displayParams);
// Configure timers
@@ -2062,6 +2082,17 @@
ImGui::End();
}
+ if (gShaderErrorHandler.fErrors.count()) {
+ ImGui::SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver);
+ ImGui::Begin("Shader Errors");
+ for (int i = 0; i < gShaderErrorHandler.fErrors.count(); ++i) {
+ ImGui::TextWrapped("%s", gShaderErrorHandler.fErrors[i].c_str());
+ ImGui::TextWrapped("%s", gShaderErrorHandler.fShaders[i].c_str());
+ }
+ ImGui::End();
+ gShaderErrorHandler.reset();
+ }
+
if (fShowZoomWindow && fLastImage) {
ImGui::SetNextWindowSize(ImVec2(200, 200), ImGuiCond_FirstUseEver);
if (ImGui::Begin("Zoom", &fShowZoomWindow)) {