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