I’ve fiddled around a bit with mapped VBOs and can’t manage to exceed ~185MB/s write speed. Is that normal?
Yes, I have an AGP GART driver installed and everything’s working fine.
Benchmarking loop:
GLuint vbo=0; glGenBuffersARB(1,&vbo); glBindBufferARB(GL_ARRAY_BUFFER_ARB,vbo); glBufferDataARB(GL_ARRAY_BUFFER_ARB,1<<20,NULL,GL_STREAM_DRAW_ARB); void* mapped_vbo=glMapBufferARB(GL_ARRAY_BUFFER_ARB,GL_WRITE_ONLY_ARB); int megs=0; double total_time=0.0; t.reset(); do { MMX_write_one_meg(mapped_vbo); ++megs; total_time=t.elapsed_seconds(); } while ((total_time<0.5)&&(megs<2048)); if (!glUnmapBufferARB(GL_ARRAY_BUFFER_ARB)) { bw_vbo_write=0.0; } else { bw_vbo_write=double(megs)*double(1<<20)/total_time; } glBindBufferARB(GL_ARRAY_BUFFER_ARB,0); glDeleteBuffersARB(1,&vbo);
The timer is working okay, so don’t ask
Here’s the code I use to write:
;write one meg of junk (to uncached memory) with minimum cpu overhead ;prototype: ;void MMX_write_one_meg(void* target) _MMX_write_one_meg: PUSH EAX PUSH EDI XOR EAX,EAX INC EAX SHL EAX,17 PXOR mm0,mm0 PXOR mm1,mm1 PXOR mm2,mm2 PXOR mm3,mm3 MOV EDI,[ESP+12] LEA EDI,[EDI+8*EAX] NEG EAX .loop_128: MOVNTQ [EDI+8*EAX],mm0 MOVNTQ [EDI+8*EAX+8],mm1 MOVNTQ [EDI+8*EAX+16],mm2 MOVNTQ [EDI+8*EAX+24],mm3 MOVNTQ [EDI+8*EAX+32],mm0 MOVNTQ [EDI+8*EAX+40],mm1 MOVNTQ [EDI+8*EAX+48],mm2 MOVNTQ [EDI+8*EAX+56],mm3 MOVNTQ [EDI+8*EAX+64],mm0 MOVNTQ [EDI+8*EAX+72],mm1 MOVNTQ [EDI+8*EAX+80],mm2 MOVNTQ [EDI+8*EAX+88],mm3 MOVNTQ [EDI+8*EAX+96],mm0 MOVNTQ [EDI+8*EAX+104],mm1 MOVNTQ [EDI+8*EAX+112],mm2 MOVNTQ [EDI+8*EAX+120],mm3 ADD EAX,16 JNZ .loop_128 SFENCE EMMS POP EDI POP EAX RETN
Radeon 9500Pro, Cat 3.6, Athlon XP2400+, KT266A, up-to-date VIA Hyperion, lots of RAM, yadda, yadda.