I've been tracking down a performance problem with an appliction running under the mga-glx driver. The application took a large performance hit (3-4x) between November 9th and 10th, about the time that vertex arrays had a large number of changes made. The top of the profile output looks like this: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls us/call us/call name 87.11 31.15 31.15 309540 100.63 100.63 shade_fast_rgba_one_sided 2.10 31.90 0.75 2653200 0.28 0.28 triangle 0.92 32.23 0.33 309540 1.07 1.11 rs_wg 0.81 32.52 0.29 309540 0.94 109.09 gl_DrawArrays 0.56 32.72 0.20 309540 0.65 0.65 trans_3_GLfloat_4f_raw 0.56 32.92 0.20 221100 0.90 3.73 render_vb_tri_strip_raw As you can see, shading seems to be taking an incredibly long amount of time. I've knocked the application down to a trivial example (attached below) and instrumented TAG(shade_fast_rgba) to spit out messages when it enters the outer (flags&VERT_END_VB) and inner (flags&interesting) loops. The output from that experiment is also attached. While I'm far from an expert in Mesa's pipeline, it appears that the shade routine is somehow finding 480 vertices in a list of 74 to shade. Shouldn't it only be shading the <count> vertices requested of glDrawArrays()? All testing done in the 3.2 branch. -tor ===================================== shade start shade outer 0 shade inner 0 shade inner 1 shade inner 2 shade inner 3 shade inner 4 shade inner 5 shade inner 6 shade inner 7 shade inner 8 shade inner 9 shade inner 10 shade inner 11 shade inner 12 shade inner 13 shade inner 14 shade inner 15 shade inner 16 shade inner 17 shade inner 18 shade inner 19 shade inner 20 shade inner 21 shade inner 22 shade inner 23 shade inner 24 shade inner 25 shade inner 26 shade inner 27 shade inner 28 shade inner 29 shade inner 30 shade inner 31 shade inner 32 shade inner 33 shade inner 34 shade inner 35 shade inner 36 shade inner 37 shade inner 38 shade inner 39 shade inner 40 shade inner 41 shade inner 42 shade inner 43 shade inner 44 shade inner 45 shade inner 46 shade inner 47 shade inner 48 shade inner 49 shade inner 50 shade inner 51 shade inner 52 shade inner 53 shade inner 54 shade inner 55 shade inner 56 shade inner 57 shade inner 58 shade inner 59 shade inner 60 shade inner 61 shade inner 62 shade inner 63 shade inner 64 shade inner 65 shade inner 66 shade inner 67 shade inner 68 shade inner 69 shade inner 70 shade inner 71 shade inner 72 shade inner 73 shade inner 74 shade inner 75 shade inner 76 shade inner 77 shade inner 78 shade inner 79 shade inner 80 shade inner 81 shade inner 82 shade inner 83 shade inner 84 shade inner 85 shade inner 86 shade inner 87 shade inner 88 shade inner 89 shade inner 90 shade inner 91 shade inner 92 shade inner 93 shade inner 94 shade inner 95 shade inner 96 shade inner 97 shade inner 98 shade inner 99 shade inner 100 shade inner 101 shade inner 102 shade inner 103 shade inner 104 shade inner 105 shade inner 106 shade inner 107 shade inner 108 shade inner 109 shade inner 110 shade inner 111 shade inner 112 shade inner 113 shade inner 114 shade inner 115 shade inner 116 shade inner 117 shade inner 118 shade inner 119 shade inner 120 shade inner 121 shade inner 122 shade inner 123 shade inner 124 shade inner 125 shade inner 126 shade inner 127 shade inner 128 shade inner 129 shade inner 130 shade inner 131 shade inner 132 shade inner 133 shade inner 134 shade inner 135 shade inner 136 shade inner 137 shade inner 138 shade inner 139 shade inner 140 shade inner 141 shade inner 142 shade inner 143 shade inner 144 shade inner 145 shade inner 146 shade inner 147 shade inner 148 shade inner 149 shade inner 150 shade inner 151 shade inner 152 shade inner 153 shade inner 154 shade inner 155 shade inner 156 shade inner 157 shade inner 158 shade inner 159 shade inner 160 shade inner 161 shade inner 162 shade inner 163 shade inner 164 shade inner 165 shade inner 166 shade inner 167 shade inner 168 shade inner 169 shade inner 170 shade inner 171 shade inner 172 shade inner 173 shade inner 174 shade inner 175 shade inner 176 shade inner 177 shade inner 178 shade inner 179 shade inner 180 shade inner 181 shade inner 182 shade inner 183 shade inner 184 shade inner 185 shade inner 186 shade inner 187 shade inner 188 shade inner 189 shade inner 190 shade inner 191 shade inner 192 shade inner 193 shade inner 194 shade inner 195 shade inner 196 shade inner 197 shade inner 198 shade inner 199 shade inner 200 shade inner 201 shade inner 202 shade inner 203 shade inner 204 shade inner 205 shade inner 206 shade inner 207 shade inner 208 shade inner 209 shade inner 210 shade inner 211 shade inner 212 shade inner 213 shade inner 214 shade inner 215 shade inner 216 shade inner 217 shade inner 218 shade inner 219 shade inner 220 shade inner 221 shade inner 222 shade inner 223 shade inner 224 shade inner 225 shade inner 226 shade inner 227 shade inner 228 shade inner 229 shade inner 230 shade inner 231 shade inner 232 shade inner 233 shade inner 234 shade inner 235 shade inner 236 shade inner 237 shade inner 238 shade inner 239 shade inner 240 shade inner 241 shade inner 242 shade inner 243 shade inner 244 shade inner 245 shade inner 246 shade inner 247 shade inner 248 shade inner 249 shade inner 250 shade inner 251 shade inner 252 shade inner 253 shade inner 254 shade inner 255 shade inner 256 shade inner 257 shade inner 258 shade inner 259 shade inner 260 shade inner 261 shade inner 262 shade inner 263 shade inner 264 shade inner 265 shade inner 266 shade inner 267 shade inner 268 shade inner 269 shade inner 270 shade inner 271 shade inner 272 shade inner 273 shade inner 274 shade inner 275 shade inner 276 shade inner 277 shade inner 278 shade inner 279 shade inner 280 shade inner 281 shade inner 282 shade inner 283 shade inner 284 shade inner 285 shade inner 286 shade inner 287 shade inner 288 shade inner 289 shade inner 290 shade inner 291 shade inner 292 shade inner 293 shade inner 294 shade inner 295 shade inner 296 shade inner 297 shade inner 298 shade inner 299 shade inner 300 shade inner 301 shade inner 302 shade inner 303 shade inner 304 shade inner 305 shade inner 306 shade inner 307 shade inner 308 shade inner 309 shade inner 310 shade inner 311 shade inner 312 shade inner 313 shade inner 314 shade inner 315 shade inner 316 shade inner 317 shade inner 318 shade inner 319 shade inner 320 shade inner 321 shade inner 322 shade inner 323 shade inner 324 shade inner 325 shade inner 326 shade inner 327 shade inner 328 shade inner 329 shade inner 330 shade inner 331 shade inner 332 shade inner 333 shade inner 334 shade inner 335 shade inner 336 shade inner 337 shade inner 338 shade inner 339 shade inner 340 shade inner 341 shade inner 342 shade inner 343 shade inner 344 shade inner 345 shade inner 346 shade inner 347 shade inner 348 shade inner 349 shade inner 350 shade inner 351 shade inner 352 shade inner 353 shade inner 354 shade inner 355 shade inner 356 shade inner 357 shade inner 358 shade inner 359 shade inner 360 shade inner 361 shade inner 362 shade inner 363 shade inner 364 shade inner 365 shade inner 366 shade inner 367 shade inner 368 shade inner 369 shade inner 370 shade inner 371 shade inner 372 shade inner 373 shade inner 374 shade inner 375 shade inner 376 shade inner 377 shade inner 378 shade inner 379 shade inner 380 shade inner 381 shade inner 382 shade inner 383 shade inner 384 shade inner 385 shade inner 386 shade inner 387 shade inner 388 shade inner 389 shade inner 390 shade inner 391 shade inner 392 shade inner 393 shade inner 394 shade inner 395 shade inner 396 shade inner 397 shade inner 398 shade inner 399 shade inner 400 shade inner 401 shade inner 402 shade inner 403 shade inner 404 shade inner 405 shade inner 406 shade inner 407 shade inner 408 shade inner 409 shade inner 410 shade inner 411 shade inner 412 shade inner 413 shade inner 414 shade inner 415 shade inner 416 shade inner 417 shade inner 418 shade inner 419 shade inner 420 shade inner 421 shade inner 422 shade inner 423 shade inner 424 shade inner 425 shade inner 426 shade inner 427 shade inner 428 shade inner 429 shade inner 430 shade inner 431 shade inner 432 shade inner 433 shade inner 434 shade inner 435 shade inner 436 shade inner 437 shade inner 438 shade inner 439 shade inner 440 shade inner 441 shade inner 442 shade inner 443 shade inner 444 shade inner 445 shade inner 446 shade inner 447 shade inner 448 shade inner 449 shade inner 450 shade inner 451 shade inner 452 shade inner 453 shade inner 454 shade inner 455 shade inner 456 shade inner 457 shade inner 458 shade inner 459 shade inner 460 shade inner 461 shade inner 462 shade inner 463 shade inner 464 shade inner 465 shade inner 466 shade inner 467 shade inner 468 shade inner 469 shade inner 470 shade inner 471 shade inner 472 shade inner 473 shade inner 474 shade inner 475 shade inner 476 shade inner 477 shade inner 478 shade inner 479 shade outer 1 shade inner 0 shade outer 2 shade inner 0 shade outer 3 shade inner 0 shade outer 4 shade inner 0 shade outer 5 shade inner 0 shade outer 6 shade inner 0 shade outer 7 shade inner 0 shade outer 8 shade inner 0 shade outer 9 shade inner 0 shade outer 10 shade inner 0 shade outer 11 shade inner 0 shade outer 12 shade inner 0 shade outer 13 shade inner 0 shade outer 14 shade inner 0 shade outer 15 shade inner 0 shade outer 16 shade inner 0 shade outer 17 shade inner 0 shade outer 18 shade inner 0 shade outer 19 shade inner 0 shade outer 20 shade inner 0 shade outer 21 shade inner 0 shade outer 22 shade inner 0 shade outer 23 shade inner 0 shade outer 24 shade inner 0 shade inner 1 shade inner 2 shade inner 3 shade outer 25 shade inner 0 shade outer 26 shade inner 0 shade outer 27 shade inner 0 shade outer 28 shade inner 0 shade outer 29 shade inner 0 shade outer 30 shade inner 0 shade outer 31 shade inner 0 shade outer 32 shade inner 0 shade outer 33 shade inner 0 shade outer 34 shade inner 0 shade outer 35 shade inner 0 shade outer 36 shade inner 0 shade outer 37 shade inner 0 shade outer 38 shade inner 0 shade outer 39 shade inner 0 shade outer 40 shade inner 0 ------- // Sun: // CC dodec.C -o dodec -I/usr/openwin/include -I/cs/include/glut -L/usr/openwin/lib -R/usr/openwin/lib -L/cs/lib -lglut -lGLU -lGL -lXmu -lX11 -lm // Linux: // g++ dodec.C -o dodec -I/usr/X11R6/include -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lX11 -lXext -lXi -lm #include <GL/glut.h> #include <stdlib.h> #include <math.h> class PentakisDodecahedron { private: PentakisDodecahedron() {} static int initter; static int init(); static float normals_and_verts[74][6]; public: static void Draw() { glInterleavedArrays(GL_N3F_V3F, 0, normals_and_verts); glDrawArrays(GL_TRIANGLE_FAN, 0, 7); glDrawArrays(GL_TRIANGLE_FAN, 7, 7); glDrawArrays(GL_TRIANGLE_STRIP, 14, 12); glDrawArrays(GL_TRIANGLE_STRIP, 26, 12); glDrawArrays(GL_TRIANGLE_STRIP, 38, 12); glDrawArrays(GL_TRIANGLE_STRIP, 50, 12); glDrawArrays(GL_TRIANGLE_STRIP, 62, 12); } }; int PentakisDodecahedron::initter = PentakisDodecahedron::init(); float PentakisDodecahedron::normals_and_verts[74][6]; static void assign(float f[6], double d[3]) { f[0] = f[3] = (float)d[0]; f[1] = f[4] = (float)d[1]; f[2] = f[5] = (float)d[2]; } /* pentakis dodecahedron */ int PentakisDodecahedron::init() { double sqrt5 = sqrt(5.0), phi = 0.5 * sqrt5 + 0.5; double diam = sqrt(phi + 2.0); double scale = 1.0 / (diam * sqrt(3.0)); double pts[3][2] = {{2.0 * scale, (phi + 1.0) * scale}, {2.0 * phi * scale, (phi - 1.0) * scale}, {0.4 * sqrt5, -0.2 * sqrt5}}; double verts[5][6][3]; double top[3] = { 0, 0, 1 }; double bot[3] = { 0, 0,-1 }; int i, j, k; for (j=0; j<3; j++) { verts[0][j][0] = pts[j][0]; verts[0][j][1] = 0.0; verts[4][j][0] = verts[1][j][0] = 0.5 * (phi - 1.0) * pts[j][0]; verts[4][j][1] = -(verts[1][j][1] = 0.5 * diam * pts[j][0]); verts[3][j][0] = verts[2][j][0] = -0.5 * phi * pts[j][0]; verts[3][j][1] = -(verts[2][j][1] = 0.5 * (phi - 1.0) * diam * pts[j][0]); verts[4][j][2] = verts[3][j][2] = verts[2][j][2] = verts[1][j][2] = verts[0][j][2] = pts[j][1]; } for (k=0; k<5; k++) for (j=0; j<3; j++) for (i=0; i<3; i++) verts[k][j+3][i] = -verts[k][j][i]; assign(normals_and_verts[0], top); assign(normals_and_verts[1], verts[0][0]); assign(normals_and_verts[2], verts[1][0]); assign(normals_and_verts[3], verts[2][0]); assign(normals_and_verts[4], verts[3][0]); assign(normals_and_verts[5], verts[4][0]); assign(normals_and_verts[6], verts[0][0]); assign(normals_and_verts[7], bot); assign(normals_and_verts[8], verts[0][3]); assign(normals_and_verts[9], verts[4][3]); assign(normals_and_verts[10], verts[3][3]); assign(normals_and_verts[11], verts[2][3]); assign(normals_and_verts[12], verts[1][3]); assign(normals_and_verts[13], verts[0][3]); for (k=0; k<5; k++) { assign(normals_and_verts[k*12+14], verts[(k+4)%5][0]); assign(normals_and_verts[k*12+15], verts[(k+2)%5][5]); assign(normals_and_verts[k*12+16], verts[k%5][0]); assign(normals_and_verts[k*12+17], verts[k%5][1]); assign(normals_and_verts[k*12+18], verts[(k+3)%5][5]); assign(normals_and_verts[k*12+19], verts[(k+3)%5][4]); assign(normals_and_verts[k*12+20], verts[(k+1)%5][1]); assign(normals_and_verts[k*12+21], verts[(k+1)%5][2]); assign(normals_and_verts[k*12+22], verts[(k+4)%5][4]); assign(normals_and_verts[k*12+23], verts[(k+4)%5][3]); assign(normals_and_verts[k*12+24], verts[(k+2)%5][2]); assign(normals_and_verts[k*12+25], verts[k%5][3]); } return 0; } void init(void) { static GLfloat pos[4] = {0.0, 1.0, 5.0, 0.0}; static GLfloat zeros[4] = {0, 0, 0, 1}; static GLfloat ones[4] = {1, 1, 1, 1}; glClearColor(0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_DIFFUSE, ones); glLightfv(GL_LIGHT0, GL_AMBIENT, zeros); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glColorMaterial(GL_FRONT, GL_DIFFUSE); glEnable(GL_COLOR_MATERIAL); glMaterialfv(GL_FRONT, GL_AMBIENT, zeros); glMaterialfv(GL_FRONT, GL_DIFFUSE, ones); glEnable(GL_NORMALIZE); } void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glLoadIdentity (); gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); PentakisDodecahedron::Draw(); glutSwapBuffers(); } void reshape (int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 5, 10.0); glMatrixMode(GL_MODELVIEW); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } _______________________________________________ Mesa-bug maillist - [EMAIL PROTECTED] http://lists.mesa3d.org/mailman/listinfo/mesa-bug _______________________________________________ Mesa-dev maillist - [EMAIL PROTECTED] http://lists.mesa3d.org/mailman/listinfo/mesa-dev