rx00: fix off by one error in tempreg check
authorHans de Goede <j.w..r..degoede@hhs.nl>
Tue, 1 Jan 2008 15:29:51 +0000 (01:29 +1000)
committerDave Airlie <airlied@linux.ie>
Tue, 1 Jan 2008 15:29:51 +0000 (01:29 +1000)
src/mesa/drivers/dri/r200/r200_vertprog.c
src/mesa/drivers/dri/r300/r300_vertprog.c

index 604b9c6caec70bcb67cf18ad0937610b51d46e1d..7fba6c750d725923d323d6017ca9fda151ce47e4 100644 (file)
@@ -408,6 +408,7 @@ static GLboolean r200_translate_vertex_program(GLcontext *ctx, struct r200_verte
    int fog_temp_i = 0;
    int free_inputs;
    int array_count = 0;
+   int u_temp_used;
 
    vp->native = GL_FALSE;
    vp->translated = GL_TRUE;
@@ -1051,14 +1052,15 @@ else {
          dofogfix = 0;
       }
 
+      u_temp_used = (R200_VSF_MAX_TEMPS - 1) - u_temp_i;
       if (mesa_vp->Base.NumNativeTemporaries <
-        (mesa_vp->Base.NumTemporaries + (R200_VSF_MAX_TEMPS - 1 - u_temp_i))) {
+        (mesa_vp->Base.NumTemporaries + u_temp_used)) {
         mesa_vp->Base.NumNativeTemporaries =
-           mesa_vp->Base.NumTemporaries + (R200_VSF_MAX_TEMPS - 1 - u_temp_i);
+           mesa_vp->Base.NumTemporaries + u_temp_used;
       }
-      if (u_temp_i < mesa_vp->Base.NumTemporaries) {
+      if ((mesa_vp->Base.NumTemporaries + u_temp_used) > R200_VSF_MAX_TEMPS) {
         if (R200_DEBUG & DEBUG_FALLBACKS) {
-           fprintf(stderr, "Ran out of temps, num temps %d, us %d\n", mesa_vp->Base.NumTemporaries, u_temp_i);
+           fprintf(stderr, "Ran out of temps, num temps %d, us %d\n", mesa_vp->Base.NumTemporaries, u_temp_used);
         }
         return GL_FALSE;
       }
index 4dd3fd6a673ed0f2e1cd509ae3c16bbd26d42e1d..e6f216e4031a096e59d225e53d0dede8ef5241c2 100644 (file)
@@ -101,8 +101,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define FREE_TEMPS() \
        do { \
-               if(u_temp_i < vp->num_temporaries) { \
-                       WARN_ONCE("Ran out of temps, num temps %d, us %d\n", vp->num_temporaries, u_temp_i); \
+               int u_temp_used = (VSF_MAX_FRAGMENT_TEMPS - 1) - u_temp_i; \
+               if((vp->num_temporaries + u_temp_used) > VSF_MAX_FRAGMENT_TEMPS) { \
+                       WARN_ONCE("Ran out of temps, num temps %d, us %d\n", vp->num_temporaries, u_temp_used); \
                        vp->native = GL_FALSE; \
                } \
                u_temp_i=VSF_MAX_FRAGMENT_TEMPS-1; \