From: <jo...@hr...> - 2000-09-28 10:40:23
|
Hi All, I detected a problem in near_persp_textured_triangle defined in triangle.c. Below I reprinted the INNER_LOOP to show what goes wrong: The INNER_LOOP is started for one case with ss=dsdx=0 tt=vv and thus dx_tex=dy_tex=0.0. For these values the path leads to the point where I inserted the print of "test4". Than it crashes while it tries to divide by dx_tex which is zero. What is intended here for this special case? Jouk excerpt from triangle.c (procedure near_persp_textured_triangle): #define INNER_LOOP( LEFT, RIGHT, Y ) \ { \ GLint i = 0; \ const GLint n = RIGHT-LEFT; \ GLdepth zspan[MAX_WIDTH]; \ GLubyte rgba[MAX_WIDTH][4]; \ (void)uu; /* please GCC */ \ if (n > 0) { /* called with ss=dsdx=0 , tt=vv */ \ GLfloat SS = ss * sscale; \ GLfloat TT = tt * tscale; \ GLfloat dSdx = dsdx * sscale; \ GLfloat dTdx = dtdx * tscale; \ GLfloat x_tex = SS / vv; \ GLfloat y_tex = TT / vv; \ GLfloat dx_tex = (SS + n * dSdx) / (vv + n * dvdx) - x_tex; \ GLfloat dy_tex = (TT + n * dTdx) / (vv + n * dvdx) - y_tex; \ GLubyte *dest = rgba[0]; \ x_tex += BIAS; \ y_tex += BIAS; \ printf( "dx_tex , dy_tex , n : %f %f %d\n" , dx_tex , dy_tex , n );\ if (FABSF(dx_tex) < n && FABSF(dy_tex) < n) { \ if (FABSF(dx_tex) > FABSF(dy_tex)) { \ GLfloat nominator = - SS - vv * BIAS; \ GLfloat denominator = dvdx * BIAS + dSdx; \ GLfloat dy_dx = dy_tex / dx_tex; \ GLfloat dx_dy; \ printf( "test1\n" );\ if (dy_dx != 0.0f) \ dx_dy= 1.0f/dy_dx; \ if (dx_tex > 0.0f) { \ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN1(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN1(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN1(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN2(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN2(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN2(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ } \ else { /* dx_tex < 0.0f */ \ printf( "test2\n" );\ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN3(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN3(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN3(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test3\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN4(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGB;ADD,3, Y_X_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN4(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN4(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ } \ } \ } \ } \ else { \ GLfloat swap; \ GLfloat dy_dx; \ GLfloat dx_dy; \ GLfloat nominator, denominator; \ /* swap some x-values and y-values */ \ SS = TT; \ dSdx = dTdx; \ swap = x_tex, x_tex = y_tex, y_tex = swap; \ swap = dx_tex, dx_tex = dy_tex, dy_tex = swap; \ printf( "test4\n" ); /*and BANG on the next statement */ \ dy_dx = dy_tex / dx_tex; \ nominator = - SS - vv * BIAS; \ denominator = dvdx * BIAS + dSdx; \ if (dy_dx != 0.0f) \ dx_dy= 1.0f/dy_dx; \ if (dx_tex > 0.0f) { \ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN1(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: /* unexpected env mode */ \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN1(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN1(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN1(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN1(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN1(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test5\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN2(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN2(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN2(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN2(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN2(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN2(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ } \ else { /* dx_tex < 0.0f */ \ printf( "test6\n" );\ if (dy_tex > 0.0f) { \ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN3(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN3(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN3(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN3(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN3(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN3(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ else { /* dy_tex <= 0.0f */ \ printf( "test7\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ case GL_REPLACE: \ SPAN4(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGB;ADD,3, X_Y_TEX_COORD); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ SPAN4(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\ break; \ case GL_DECAL: \ SPAN4(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD); \ break; \ case GL_BLEND: \ SPAN4(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD); \ break; \ case GL_ADD: \ SPAN4(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD); \ break; \ case GL_REPLACE: \ SPAN4(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\ break; \ default: \ abort(); \ } \ break; \ } \ } \ } \ } \ } \ else { \ printf( "test8\n" );\ switch (format) { \ case GL_RGB: \ switch (envmode) { \ case GL_MODULATE: \ OLD_SPAN(NEAREST_RGB;MODULATE,3); \ break; \ case GL_DECAL: \ case GL_REPLACE: \ OLD_SPAN(NEAREST_RGB_REPLACE,3); \ break; \ case GL_BLEND: \ OLD_SPAN(NEAREST_RGB;BLEND,3); \ break; \ case GL_ADD: \ OLD_SPAN(NEAREST_RGB;ADD,3); \ break; \ default: \ abort(); \ } \ break; \ case GL_RGBA: \ switch(envmode) { \ case GL_MODULATE: \ OLD_SPAN(NEAREST_RGBA;MODULATE,4); \ break; \ case GL_DECAL: \ OLD_SPAN(NEAREST_RGBA;DECAL,4); \ break; \ case GL_BLEND: \ OLD_SPAN(NEAREST_RGBA;BLEND,4); \ break; \ case GL_ADD: \ OLD_SPAN(NEAREST_RGBA;ADD,4); \ break; \ case GL_REPLACE: \ OLD_SPAN(NEAREST_RGBA_REPLACE,4); \ break; \ default: \ abort(); \ } \ break; \ } \ } \ gl_write_rgba_span( ctx, n, LEFT, Y, zspan, rgba, GL_POLYGON );\ ffr = ffg = ffb = ffa = 0; \ } \ } \ #include "tritemp.h" #undef OLD_SPAN #undef SPAN1 #undef SPAN2 #undef SPAN3 #undef SPAN4 #undef X_Y_TEX_COORD #undef Y_X_TEX_COORD #undef DRAW_LINE #undef BIAS } Ceterum censeo tertium millennium post Christum natum anno MMI incepturum esse >------------------------------------------------------------------------------< Jouk Jansen jo...@hr... Technische Universiteit Delft tttttttttt uu uu ddddddd Nationaal centrum voor HREM tttttttttt uu uu dd dd Rotterdamseweg 137 tt uu uu dd dd 2628 AL Delft tt uu uu dd dd Nederland tt uu uu dd dd tel. 31-15-2781536 tt uuuuuuu ddddddd >------------------------------------------------------------------------------< |
From: Klaus N. <kl...@ma...> - 2000-09-28 16:13:13
|
Hi, On monday and tuesday I have two free days, so I will fix the error then (at least I hope). The fix should be pretty easy, if dx_tex == dy_tex == 0.0f, then the program does not move over the texture, so one can fill the whole array rgba[n] with the corresponding (constant) texel, indeed if only dy_tex == 0.0f one can simplify the fill-code a lot, but I don't know if this case is generic enough to be worked into the code. By the way: Three questions. 1. When this bug happens, what is the value of dTdx, dvdx? 2. I usually test my code-changes by typing "LD_PRELOAD=~/Mesa/src/.libs/libGL.so demoprog". How can I tell "gdb" that I want to use this library when debugging? 3. This is a suggestions. I believe that the MIPMAPPING-code calculates which texture-level to use for every pixel it draws. Since the level of detail should be a monotone function over the array rgba[n], wouldn't it be possible (in the case GL_NEAREST_MIPMAP_NEAREST and GL_LINEAR_MIPMAP_NEAREST) to calculate the lod at the beginning of the array and at the end of the array and if lod is equal at these points, to just fill the whole array with a constant level of detail? O.k. I will have to go back to work now... Bye Klaus |
From: Brian P. <br...@va...> - 2000-09-28 17:18:49
|
Klaus Niederkrueger wrote: > > Hi, > > On monday and tuesday I have two free days, so I will fix the error then (at least I hope). > The fix should be pretty easy, if dx_tex == dy_tex == 0.0f, then the program does not move over the texture, so one can fill the whole array rgba[n] with the corresponding (constant) texel, indeed if only dy_tex == 0.0f one can simplify the fill-code a lot, but I don't know if this case is generic enough to be worked into the code. > > By the way: Three questions. > > 1. When this bug happens, what is the value of dTdx, dvdx? > > 2. I usually test my code-changes by typing "LD_PRELOAD=~/Mesa/src/.libs/libGL.so demoprog". How can I tell "gdb" that I want to use this library when debugging? I use LD_LIBRARY_PATH to point to my libGL.so and gdb (version=19991004) seems to find it just fine. I can't set breakpoints in Mesa code until the library has actually been loaded so I'll first break in main() and then set my Mesa breakpoints when I've stopped in main(). Hope this helps. > 3. This is a suggestions. I believe that the MIPMAPPING-code calculates which texture-level to use for every pixel it draws. Since the level of detail should be a monotone function over the array rgba[n], wouldn't it be possible (in the case GL_NEAREST_MIPMAP_NEAREST and GL_LINEAR_MIPMAP_NEAREST) to calculate the lod at the beginning of the array and at the end of the array and if lod is equal at these points, to just fill the whole array with a constant level of detail? Yes, I believe that's true. -Brian |
From: Brian P. <br...@va...> - 2000-09-28 15:15:35
|
"Jacob (=Jouk) Jansen" wrote: > > Hi All, > > I detected a problem in near_persp_textured_triangle defined in triangle.c. > Below I reprinted the INNER_LOOP to show what goes wrong: > The INNER_LOOP is started for one case with > ss=dsdx=0 > tt=vv > and thus dx_tex=dy_tex=0.0. > For these values the path leads to the point where I inserted the print > of "test4". Than it crashes while it tries to divide by dx_tex which is > zero. > > What is intended here for this special case? > > Jouk I'm forwarding this report to Klaus Niederkrueger <kl...@ma...> since he wrote the function and I'm not sure that he's on this mailing list. If the bug can't be fixed this optimized triangle function will have to be disabled. -Brian |