From fb2ac3a67e9dbe6e67375f241e335219baedb334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 25 Oct 2020 08:33:01 +0100 Subject: [PATCH] Additional fixes --- GPU/Directx9/VertexShaderGeneratorHLSL.cpp | 5 +++++ GPU/GLES/VertexShaderGeneratorGLES.cpp | 9 +++++++-- GPU/Vulkan/VertexShaderGeneratorVulkan.cpp | 7 +++++++ unittest/TestShaderGenerators.cpp | 6 +++--- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp index 9b88902800..4279290ed0 100644 --- a/GPU/Directx9/VertexShaderGeneratorHLSL.cpp +++ b/GPU/Directx9/VertexShaderGeneratorHLSL.cpp @@ -72,6 +72,11 @@ bool GenerateVertexShaderHLSL(const VShaderID &id, char *buffer, ShaderLanguage bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/GLES/VertexShaderGeneratorGLES.cpp b/GPU/GLES/VertexShaderGeneratorGLES.cpp index 66b0b90f23..c5d0bf8623 100644 --- a/GPU/GLES/VertexShaderGeneratorGLES.cpp +++ b/GPU/GLES/VertexShaderGeneratorGLES.cpp @@ -163,8 +163,13 @@ bool GenerateVertexShaderGLSL(const VShaderID &id, char *buffer, const GLSLShade int matUpdate = id.Bits(VS_BIT_MATERIAL_UPDATE, 3); // Apparently we don't support bezier/spline together with bones. - bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones; - bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones; + bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; + bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp index 9f0135b896..03b9ade092 100644 --- a/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp +++ b/GPU/Vulkan/VertexShaderGeneratorVulkan.cpp @@ -123,6 +123,13 @@ bool GenerateVertexShaderVulkanGLSL(const VShaderID &id, char *buffer, std::stri bool doBezier = id.Bit(VS_BIT_BEZIER) && !enableBones && useHWTransform; bool doSpline = id.Bit(VS_BIT_SPLINE) && !enableBones && useHWTransform; + + if ((doBezier || doSpline) && !hasNormal) { + // Bad usage. + *errorString = "Invalid flags - tess requires normal."; + return false; + } + bool hasColorTess = id.Bit(VS_BIT_HAS_COLOR_TESS); bool hasTexcoordTess = id.Bit(VS_BIT_HAS_TEXCOORD_TESS); bool hasNormalTess = id.Bit(VS_BIT_HAS_NORMAL_TESS); diff --git a/unittest/TestShaderGenerators.cpp b/unittest/TestShaderGenerators.cpp index 98af754f21..6693dc01ac 100644 --- a/unittest/TestShaderGenerators.cpp +++ b/unittest/TestShaderGenerators.cpp @@ -173,15 +173,15 @@ bool TestShaderGenerators() { } if (generateSuccess[0] != generateSuccess[1]) { - printf("mismatching success! %s %s\n", genErrorString[0].c_str(), genErrorString[1].c_str()); + printf("mismatching success! '%s' '%s'\n", genErrorString[0].c_str(), genErrorString[1].c_str()); printf("%s\n", buffer[0]); printf("%s\n", buffer[1]); - return 1; + return false; } if (generateSuccess[0] && strcmp(buffer[0], buffer[1])) { printf("mismatching shaders! a=glsl b=vulkan\n"); PrintDiff(buffer[0], buffer[1]); - return 1; + return false; } // Now that we have the strings ready for easy comparison (buffer,4 in the watch window),