OSDN Git Service

Added check for temporary register overflow
authorAlexis Hetu <sugoi@google.com>
Mon, 9 Apr 2018 17:47:34 +0000 (13:47 -0400)
committerAlexis Hétu <sugoi@google.com>
Fri, 13 Apr 2018 12:07:22 +0000 (12:07 +0000)
Currently, when overflowing the number of temporary registers
allowed, SwiftShader will crash somewhere in the generated
code. This cl adds an early check to prevent the crash and
instead output an error message to the user.

Bug chromium:814987

Change-Id: Idadda21ee14298662763d986ee1283a5114c1c01
Reviewed-on: https://swiftshader-review.googlesource.com/18388
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
src/Main/Config.hpp
src/OpenGL/compiler/OutputASM.cpp
src/Shader/PixelProgram.hpp
src/Shader/VertexProgram.hpp

index ff8bb7e..764bfed 100644 (file)
@@ -96,6 +96,7 @@ namespace sw
                MAX_PROGRAM_TEXEL_OFFSET = 7,
                MAX_TEXTURE_LOD = MIPMAP_LEVELS - 2,   // Trilinear accesses lod+1
                RENDERTARGETS = 8,
+               NUM_TEMPORARY_REGISTERS = 4096,
        };
 }
 
index b3385c2..8477af2 100644 (file)
@@ -3031,7 +3031,14 @@ namespace glsl
 
        int OutputASM::temporaryRegister(TIntermTyped *temporary)
        {
-               return allocate(temporaries, temporary);
+               int index = allocate(temporaries, temporary);
+               if(index >= sw::NUM_TEMPORARY_REGISTERS)
+               {
+                       mContext.error(temporary->getLine(),
+                               "Too many temporary registers required to compile shader",
+                               pixelShader ? "pixel shader" : "vertex shader");
+               }
+               return index;
        }
 
        void OutputASM::setPixelShaderInputs(const TType& type, int var, bool flat)
index 951e147..1f60bde 100644 (file)
@@ -55,7 +55,7 @@ namespace sw
 
        private:
                // Temporary registers
-               RegisterArray<4096> r;
+               RegisterArray<NUM_TEMPORARY_REGISTERS> r;
 
                // Color outputs
                Vector4f c[RENDERTARGETS];
index c42ab71..fcd2a93 100644 (file)
@@ -37,7 +37,7 @@ namespace sw
        private:
                const VertexShader *const shader;
 
-               RegisterArray<4096> r;   // Temporary registers
+               RegisterArray<NUM_TEMPORARY_REGISTERS> r;   // Temporary registers
                Vector4f a0;
                Array<Int, 4> aL;
                Vector4f p0;