Fixed shader-varying-packing-restrictions.html
Return an error instead of asserting when exceeding
the number of available varying variables.
Change-Id: Ia4d76897b4b214a5b3bdd37cd420c0437faa216a
Reviewed-on: https://swiftshader-review.googlesource.com/1451
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index 2ffc576..e8aa3f3 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -1943,8 +1943,14 @@
int componentCount = varying->getNominalSize();
int registerCount = varying->totalRegisterCount();
- if(pixelShader && (var + registerCount) <= sw::PixelShader::MAX_INPUT_VARYINGS)
+ if(pixelShader)
{
+ if((var + registerCount) > sw::PixelShader::MAX_INPUT_VARYINGS)
+ {
+ mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "fragment shader");
+ return 0;
+ }
+
if(varying->getQualifier() == EvqPointCoord)
{
ASSERT(varying->isRegister());
@@ -1964,8 +1970,14 @@
}
}
}
- else if(vertexShader && (var + registerCount) <= sw::VertexShader::MAX_OUTPUT_VARYINGS)
+ else if(vertexShader)
{
+ if((var + registerCount) > sw::VertexShader::MAX_OUTPUT_VARYINGS)
+ {
+ mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "vertex shader");
+ return 0;
+ }
+
if(varying->getQualifier() == EvqPosition)
{
ASSERT(varying->isRegister());
diff --git a/src/Radiance/compiler/OutputASM.cpp b/src/Radiance/compiler/OutputASM.cpp
index 57af4a3..b85edf6 100644
--- a/src/Radiance/compiler/OutputASM.cpp
+++ b/src/Radiance/compiler/OutputASM.cpp
@@ -1943,8 +1943,14 @@
int componentCount = varying->getNominalSize();
int registerCount = varying->totalRegisterCount();
- if(pixelShader && (var + registerCount) <= sw::PixelShader::MAX_INPUT_VARYINGS)
+ if(pixelShader)
{
+ if((var + registerCount) > sw::PixelShader::MAX_INPUT_VARYINGS)
+ {
+ mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "fragment shader");
+ return 0;
+ }
+
if(varying->getQualifier() == EvqPointCoord)
{
ASSERT(varying->isRegister());
@@ -1964,8 +1970,14 @@
}
}
}
- else if(vertexShader && (var + registerCount) <= sw::VertexShader::MAX_OUTPUT_VARYINGS)
+ else if(vertexShader)
{
+ if((var + registerCount) > sw::VertexShader::MAX_OUTPUT_VARYINGS)
+ {
+ mContext.error(varying->getLine(), "Varyings packing failed: Too many varyings", "vertex shader");
+ return 0;
+ }
+
if(varying->getQualifier() == EvqPosition)
{
ASSERT(varying->isRegister());