mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Postshader: Improve error reporting.
This commit is contained in:
1 parent
63424fb5be
commit
f0bb504bb1
5 files changed
+28
-25
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
Submodule pspautotests updated: 879e7959eb...7e4a1e7509.
Reference in new issue
Block a user