Well, considering I hit a unbelievable 0 reply with my previous topic, I hope this question will be a little bit easier. We’ll see.
My program needs to transfer large compressed textures to the card in little time. So my original function which was downloading all of a mipmap at one time was taking too long. See the line below
So I though of sending it by pieces. First step is to make sure it still work if I try to send the same information with glCompressedSubTexImage2DARB. Right? That’s what I did (see line below)
I’ve been suprised that juste replace the first line by the second line gives me an invalid operation, and the textures don’t show up any more. Am I doing anything wrong cause I think those 2 lines shoulld behave the exact same way.
In order to use TextureSubImage command, you must first use a TextureImage command to define the whole texture and in your case possibly with a NULL image pointer.
Thinking about it… ok, I have to use glCompressedTexImage2DARB to first create the texture. But if I do so, it will download the texture, so I’m back to square one (to much data to transfer in too little time). If I provide a NULL pointer, is it going to download anything?
You can pass NULL as data to {Compressed}TexImage() to “reserve space” without downloading.
However, I don’t understand why you think uploading the compressed data is too slow. A 1024x1024 texture is 512 KB. Assuming AGP 4x, you have 1 GB/s of bandwidth, so you could theoretically upload 2,000 of those textures per second.
If you’re supplying un-compressed data, and let the driver compress, then you should know that:
the driver doesn’t do as good a job as the Photoshop DDS plug-in does
it still takes forever
you are entirely CPU limited at this point
I highly recommend against it. If you use S3TC compression, you should compress offline. For cards that don’t support compression, you can de-compress from the S3TC data in software on your own (it’s really simple). Box-filter one level and shrink 2x in each direction to get less blockiness in that case (and not be entirely insane on memory usage).
1GB/s on AGP 4x? Cool, I didn’t know that. However, that makes me wonder why I have those results. When I send a 1024x1024 compressed texture (171 Kb), everytime I transfer the first mipmap (131Kb), my frame time jumps over 20 ms. I’m trying to mainting 60Hz, so that’s no good. But your numbers give me a bandwidth of 16666Kb/it, which is a lot larger than what I’m really using. Is there anything I must do to have the 1GB/s bandwidth? Cause for sure I don’t have that. (yes, I have vertex data to transfer, but not that much.). I’m using AGP 4x.
I read something about AGP aperture… what is that?