1
1
#include < cassert>
2
2
3
+ #include < algorithm>
3
4
#include < list>
5
+ #include < vector>
4
6
5
7
#include " file.hpp"
6
8
#include " gfx.hpp"
@@ -363,22 +365,32 @@ struct render_command_t
363
365
float uniform3f0[3 ];
364
366
};
365
367
368
+ int cnt_render_commands = 0 ;
369
+ int cnt_use_program = 0 ;
370
+ int cnt_bind_tex0 = 0 ;
371
+ int cnt_bind_tex1 = 0 ;
372
+ int cnt_glbegin = 0 ;
373
+ int cnt_glend = 0 ;
374
+
366
375
int bound_program = 0 ;
367
376
int bound_tex0 = 0 ;
368
377
int bound_tex1 = 0 ;
369
378
bool did_begin = false ;
370
379
371
380
static void render_command (render_command_t *cmd)
372
381
{
382
+ cnt_render_commands += 1 ;
373
383
if (cmd->program != bound_program)
374
384
{
375
385
if (did_begin)
376
386
{
377
387
glEnd ();
378
388
did_begin = false ;
389
+ cnt_glend += 1 ;
379
390
}
380
391
glUseProgram (cmd->program );
381
392
bound_program = cmd->program ;
393
+ cnt_use_program += 1 ;
382
394
}
383
395
384
396
if (cmd->program != 0 )
@@ -387,6 +399,7 @@ static void render_command(render_command_t *cmd)
387
399
{
388
400
glEnd ();
389
401
did_begin = false ;
402
+ cnt_glend += 1 ;
390
403
}
391
404
if (cmd->uniform1i0_loc != -1 )
392
405
{
@@ -407,21 +420,25 @@ static void render_command(render_command_t *cmd)
407
420
{
408
421
glEnd ();
409
422
did_begin = false ;
423
+ cnt_glend += 1 ;
410
424
}
411
425
glBindTexture (GL_TEXTURE_2D, cmd->tex0 );
412
426
bound_tex0 = cmd->tex0 ;
427
+ cnt_bind_tex0 += 1 ;
413
428
}
414
429
if (cmd->tex1 != bound_tex1)
415
430
{
416
431
if (did_begin)
417
432
{
418
433
glEnd ();
419
434
did_begin = false ;
435
+ cnt_glend += 1 ;
420
436
}
421
437
glActiveTexture (GL_TEXTURE1);
422
438
glBindTexture (GL_TEXTURE_2D, cmd->tex1 );
423
439
glActiveTexture (GL_TEXTURE0);
424
440
bound_tex1 = cmd->tex1 ;
441
+ cnt_bind_tex1 += 1 ;
425
442
}
426
443
427
444
// check_gl_error(__LINE__);
@@ -430,6 +447,7 @@ static void render_command(render_command_t *cmd)
430
447
{
431
448
glBegin (GL_QUADS);
432
449
did_begin = true ;
450
+ cnt_glbegin += 1 ;
433
451
}
434
452
for (int i = 0 ; i < 4 ; i++)
435
453
{
@@ -438,10 +456,34 @@ static void render_command(render_command_t *cmd)
438
456
}
439
457
}
440
458
441
- std::list<render_command_t > cmds;
459
+ std::vector<render_command_t > cmds;
460
+
461
+ bool compare_program (const render_command_t &a, const render_command_t &b)
462
+ {
463
+ return a.program < b.program ;
464
+ }
465
+
466
+ bool compare_tex0 (const render_command_t &a, const render_command_t &b)
467
+ {
468
+ return a.tex0 < b.tex0 ;
469
+ }
470
+
471
+ /* bool myfunction (int i,int j) { return (i<j); }
472
+
473
+ struct myclass {
474
+ bool operator() (int i,int j) { return (i<j);}
475
+ } myobject;
476
+ */
477
+
478
+ struct myclass {
479
+ bool operator () (const render_command_t &a, const render_command_t &b) { return a.tex0 < b.tex1 ; }
480
+ } mysorter;
442
481
443
482
void gfx_flush ()
444
483
{
484
+ std::sort (cmds.begin (), cmds.end (), compare_tex0);
485
+ // std::sort(cmds.begin(), cmds.end(), compare_program);
486
+
445
487
// prepare a good state
446
488
{
447
489
glMatrixMode (GL_PROJECTION);
@@ -458,8 +500,9 @@ void gfx_flush()
458
500
}
459
501
// check_gl_error(__LINE__);
460
502
503
+
461
504
// execute all render commands
462
- for (std::list <render_command_t >::iterator it = cmds.begin (); it != cmds.end (); ++it)
505
+ for (std::vector <render_command_t >::iterator it = cmds.begin (); it != cmds.end (); ++it)
463
506
{
464
507
render_command_t *cmd = &(*it);
465
508
render_command (cmd);
@@ -472,6 +515,7 @@ void gfx_flush()
472
515
{
473
516
glEnd ();
474
517
did_begin = false ;
518
+ cnt_glend += 1 ;
475
519
}
476
520
477
521
// clean up state
0 commit comments