Well, I wrote some code, based on QT’s QTime:
QTime time, total_begin, total_end;
total_begin = time = QTime::currentTime(Qt::LocalTime);
printf("
Preparing from %2d:%2d:%2d ", time.minute(), time.second(), time.msec());
matrix_reset();
glTexImage2D(GL_TEXTURE_2D, 0, 4, realW, realH, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba);
time = QTime::currentTime(Qt::LocalTime);
printf(" to %-2d:%-2d:%-2d
", time.minute(), time.second(), time.msec());
for(i = 0;i < finfo->h;i++)
{
printf("Run #%-3d ", i);
time = QTime::currentTime(Qt::LocalTime);
printf("Reading %2d:%2d:%-3d ", time.minute(), time.second(), time.msec());
lib->fmt_read_scanline(finfo, scan);
time = QTime::currentTime(Qt::LocalTime);
printf("%2d:%2d:%-3d ", time.minute(), time.second(), time.msec());
time = QTime::currentTime(Qt::LocalTime);
printf(" Binding %2d:%2d:%-3d ", time.minute(), time.second(), time.msec());
glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY+i, finfo->w, 1, GL_RGBA, GL_UNSIGNED_BYTE, scan);
time = QTime::currentTime(Qt::LocalTime);
printf("%2d:%2d:%-3d ", time.minute(), time.second(), time.msec());
time = QTime::currentTime(Qt::LocalTime);
printf(" Updating %2d:%2d:%-3d ", time.minute(), time.second(), time.msec());
updateGL();
total_end = time = QTime::currentTime(Qt::LocalTime);
printf("%2d:%2d:%-3d
", time.minute(), time.second(), time.msec());
}
printf("
Cycle takes: %2d:%2d:%-3d %2d:%2d:%-3d
", total_begin.minute(), total_begin.second(), total_begin.msec(),total_end.minute(), total_end.second(), total_end.msec());
****************** I got (with image 300x301):
Preparing from 14:57:489 to 14:57:502
Run #0 Reading 14:57:503 14:57:503 Binding 14:57:503 14:57:503 Updating 14:57:503 14:57:529
Run #1 Reading 14:57:530 14:57:530 Binding 14:57:530 14:57:536 Updating 14:57:537 14:57:537
Run #2 Reading 14:57:537 14:57:537 Binding 14:57:537 14:57:543 Updating 14:57:543 14:57:543
Run #3 Reading 14:57:544 14:57:544 Binding 14:57:544 14:57:550 Updating 14:57:550 14:57:550
Run #4 Reading 14:57:551 14:57:573 Binding 14:57:573 14:57:579 Updating 14:57:580 14:57:580
Run #5 Reading 14:57:580 14:57:581 Binding 14:57:581 14:57:586 Updating 14:57:586 14:57:586
Run #6 Reading 14:57:587 14:57:587 Binding 14:57:587 14:57:594 Updating 14:57:595 14:57:595
Run #7 Reading 14:57:595 14:57:596 Binding 14:57:596 14:57:601 Updating 14:57:601 14:57:601
Run #8 Reading 14:57:602 14:57:602 Binding 14:57:602 14:57:607 Updating 14:57:607 14:57:608
Run #9 Reading 14:57:608 14:57:609 Binding 14:57:609 14:57:616 Updating 14:57:616 14:57:616
Run #10 Reading 14:57:617 14:57:617 Binding 14:57:617 14:57:622 Updating 14:57:622 14:57:623
Run #11 Reading 14:57:633 14:57:633 Binding 14:57:633 14:57:640 Updating 14:57:640 14:57:640
Run #12 Reading 14:57:641 14:57:641 Binding 14:57:641 14:57:646 Updating 14:57:646 14:57:646
Run #13 Reading 14:57:647 14:57:647 Binding 14:57:647 14:57:653 Updating 14:57:653 14:57:653
Run #14 Reading 14:57:654 14:57:654 Binding 14:57:654 14:57:660 Updating 14:57:660 14:57:660
Run #15 Reading 14:57:661 14:57:661 Binding 14:57:661 14:57:667 Updating 14:57:667 14:57:667
Run #16 Reading 14:57:667 14:57:668 Binding 14:57:668 14:57:675 Updating 14:57:675 14:57:676
Run #17 Reading 14:57:676 14:57:677 Binding 14:57:677 14:57:682 Updating 14:57:682 14:57:682
Run #18 Reading 14:57:691 14:57:693 Binding 14:57:693 14:57:698 Updating 14:57:698 14:57:698
…
Run #286 Reading 14:59:933 14:59:933 Binding 14:59:933 14:59:939 Updating 14:59:939 14:59:939
Run #287 Reading 14:59:947 14:59:947 Binding 14:59:947 14:59:955 Updating 14:59:955 14:59:955
Run #288 Reading 14:59:956 14:59:956 Binding 14:59:956 14:59:962 Updating 14:59:962 14:59:962
Run #289 Reading 14:59:962 14:59:963 Binding 14:59:963 14:59:968 Updating 14:59:968 14:59:968
Run #290 Reading 14:59:969 14:59:969 Binding 14:59:969 14:59:974 Updating 14:59:974 14:59:975
Run #291 Reading 14:59:975 14:59:975 Binding 14:59:975 14:59:981 Updating 14:59:981 14:59:981
Run #292 Reading 14:59:982 14:59:982 Binding 14:59:982 14:59:987 Updating 14:59:987 14:59:987
Run #293 Reading 14:59:988 14:59:988 Binding 14:59:988 14:59:996 Updating 14:59:996 14:59:996
Run #294 Reading 15: 0:4 15: 0:4 Binding 15: 0:4 15: 0:10 Updating 15: 0:10 15: 0:10
Run #295 Reading 15: 0:11 15: 0:11 Binding 15: 0:11 15: 0:16 Updating 15: 0:16 15: 0:16
Run #296 Reading 15: 0:17 15: 0:17 Binding 15: 0:17 15: 0:23 Updating 15: 0:23 15: 0:23
Run #297 Reading 15: 0:23 15: 0:24 Binding 15: 0:24 15: 0:29 Updating 15: 0:29 15: 0:29
Run #298 Reading 15: 0:31 15: 0:31 Binding 15: 0:31 15: 0:37 Updating 15: 0:37 15: 0:38
Run #299 Reading 15: 0:38 15: 0:39 Binding 15: 0:39 15: 0:44 Updating 15: 0:44 15: 0:44
Run #300 Reading 15: 0:45 15: 0:46 Binding 15: 0:46 15: 0:52 Updating 15: 0:52 15: 0:52
Cycle takes: 22:41:868 22:44:417
As you can see, in every iteration reading takes 0-1 ms, glTexSubImage2D() takes 5-6 ms, updating takes 0-1 ms. In general:
3001 + 6300 + 1*300 == 2400 msec, and total (total_end - total_begin) == 2549 msec.
P.S. my video driver is NVIDIA-Linux-x86-1.0-4496-pkg2.run, maybe it is driver’s fault ? Theoretically, glTexSubImage2D with height==1 behaves like memcpy, which is very fast ?