Postshader: Improve error reporting.

This commit is contained in:
Henrik Rydgård committed 2021-01-03 19:15:05 +01:00
1 parent 63424fb5be
commit f0bb504bb1
5 files changed
+28 -25

No files matched your search

+11
View File
@@ -6,6 +6,17 @@
#include "ext/glslang/SPIRV/GlslangToSpv.h"
const char *ShaderLanguageAsString(ShaderLanguage lang) {
switch (lang) {
case GLSL_1xx: return "GLSL 1.x";
case GLSL_3xx: return "GLSL 3.x";
case GLSL_VULKAN: return "GLSL-VK";
case HLSL_D3D9: return "HLSL-D3D9";
case HLSL_D3D11: return "HLSL-D3D11";
default: return "(combination)";
}
}
ShaderLanguageDesc::ShaderLanguageDesc(ShaderLanguage lang) {
Init(lang);
}
+2
View File
@@ -19,6 +19,8 @@ inline bool ShaderLanguageIsOpenGL(ShaderLanguage lang) {
return lang == GLSL_1xx || lang == GLSL_3xx;
}
const char *ShaderLanguageAsString(ShaderLanguage lang);
enum class ShaderStage {
Vertex,
Fragment,
+11 -23
View File
@@ -75,11 +75,6 @@ void ShaderTranslationShutdown() {
#endif
}
std::string Preprocess(std::string code, ShaderLanguage lang, ShaderStage stage) {
// This takes GL up to the version we need.
return code;
}
struct Builtin {
const char *needle;
const char *replacement;
@@ -218,7 +213,10 @@ bool ConvertToVulkanGLSL(std::string *dest, TranslatedShaderMetadata *destMetada
}
bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLanguageDesc &desc, TranslatedShaderMetadata *destMetadata, std::string src, ShaderLanguage srcLang, ShaderStage stage, std::string *errorMessage) {
_assert_(errorMessage != nullptr);
if (srcLang != GLSL_3xx && srcLang != GLSL_1xx) {
*errorMessage = StringFromFormat("Bad src shader language: %s", ShaderLanguageAsString(srcLang));
return false;
}
@@ -227,14 +225,14 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan
bool result = ConvertToVulkanGLSL(dest, destMetadata, src, stage, errorMessage);
return result;
}
if (errorMessage) {
*errorMessage = "";
}
#if PPSSPP_PLATFORM(UWP)
*errorMessage = "No shader translation available (UWP)";
return false;
#endif
*errorMessage = "";
glslang::TProgram program;
const char *shaderStrings[1];
@@ -247,17 +245,12 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan
EShLanguage shaderStage = GetLanguage(stage);
glslang::TShader shader(shaderStage);
std::string preprocessed = Preprocess(src, srcLang, stage);
shaderStrings[0] = src.c_str();
shader.setStrings(shaderStrings, 1);
// TODO: Should set settings here based on srcLang.
if (!shader.parse(&Resources, 100, EProfile::ECompatibilityProfile, false, false, messages)) {
ERROR_LOG(G3D, "%s", shader.getInfoLog());
ERROR_LOG(G3D, "%s", shader.getInfoDebugLog());
if (errorMessage) {
*errorMessage = shader.getInfoLog();
(*errorMessage) += shader.getInfoDebugLog();
}
*errorMessage = std::string("GLSL parser failure: ") + shader.getInfoLog() + shader.getInfoDebugLog();
return false; // something didn't work
}
@@ -265,12 +258,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan
program.addShader(&shader);
if (!program.link(messages)) {
ERROR_LOG(G3D, "%s", shader.getInfoLog());
ERROR_LOG(G3D, "%s", shader.getInfoDebugLog());
if (errorMessage) {
*errorMessage = shader.getInfoLog();
(*errorMessage) += shader.getInfoDebugLog();
}
*errorMessage = std::string("Linker failure: ") + shader.getInfoLog() + shader.getInfoDebugLog();
return false;
}
@@ -286,7 +274,6 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan
// Patch it up so spirv-cross accepts it.
spirv[1] = glslang::EShTargetSpv_1_0;
// Alright, step 1 done. Now let's take this SPIR-V shader and output in our desired format.
switch (destLang) {
@@ -369,6 +356,7 @@ bool TranslateShader(std::string *dest, ShaderLanguage destLang, const ShaderLan
return true;
}
default:
*errorMessage = StringFromFormat("Unsupported destination language: %s", ShaderLanguageAsString(destLang));
return false;
}
}
+3 -1
View File
@@ -240,6 +240,8 @@ bool PresentationCommon::BuildPostShader(const ShaderInfo *shaderInfo, const Sha
}
std::string vsError, fsError;
// All post shaders are written in GLSL 1.0 so that's what we pass in here as a "from" language.
Draw::ShaderModule *vs = CompileShaderModule(ShaderStage::Vertex, GLSL_1xx, vsSourceGLSL, &vsError);
Draw::ShaderModule *fs = CompileShaderModule(ShaderStage::Fragment, GLSL_1xx, fsSourceGLSL, &fsError);
@@ -471,7 +473,7 @@ Draw::ShaderModule *PresentationCommon::CompileShaderModule(ShaderStage stage, S
if (lang != lang_) {
// Gonna have to upconvert the shader.
if (!TranslateShader(&translated, lang_, draw_->GetShaderLanguageDesc(), nullptr, src, lang, stage, errorString)) {
ERROR_LOG(FRAMEBUF, "Failed to translate post-shader: %s", errorString->c_str());
ERROR_LOG(FRAMEBUF, "Failed to translate post-shader. Error string: '%s'\nSource code:\n%s\n", errorString->c_str(), src.c_str());
return nullptr;
}
}