gobj: Fix TextureReloadRequest not reloading in certain situations

This prevented async texture loading from working unless mipmapping was enabled
This commit is contained in:
rdb 2021-11-28 14:01:33 +01:00
parent 5eaa67fbc9
commit c0a9123dde

View File

@ -22,28 +22,34 @@ TypeHandle TextureReloadRequest::_type_handle;
AsyncTask::DoneStatus TextureReloadRequest:: AsyncTask::DoneStatus TextureReloadRequest::
do_task() { do_task() {
// Don't reload the texture if it doesn't need it. // Don't reload the texture if it doesn't need it.
if (_texture->was_image_modified(_pgo)) { if (!_texture->was_image_modified(_pgo) &&
double delay = async_load_delay; (_allow_compressed ? _texture->has_ram_image() : _texture->has_uncompressed_ram_image())) {
if (delay != 0.0) { return DS_done;
Thread::sleep(delay); }
}
if (_texture->was_image_modified(_pgo)) { double delay = async_load_delay;
if (_allow_compressed) { if (delay != 0.0) {
_texture->get_ram_image(); Thread::sleep(delay);
} else {
_texture->get_uncompressed_ram_image();
}
// Now that we've loaded the texture, we should ensure it actually gets if (!_texture->was_image_modified(_pgo) &&
// prepared--even if it's no longer visible in the frame--or it may (_allow_compressed ? _texture->has_ram_image() : _texture->has_uncompressed_ram_image())) {
// become a kind of a leak (if the texture is never rendered again on return DS_done;
// this GSG, we'll just end up carrying the texture memory in RAM
// forever, instead of dumping it as soon as it gets prepared).
_pgo->enqueue_texture(_texture);
} }
} }
if (_allow_compressed) {
_texture->get_ram_image();
} else {
_texture->get_uncompressed_ram_image();
}
// Now that we've loaded the texture, we should ensure it actually gets
// prepared--even if it's no longer visible in the frame--or it may become a
// kind of a leak (if the texture is never rendered again on this GSG, we'll
// just end up carrying the texture memory in RAM forever, instead of dumping
// it as soon as it gets prepared).
_pgo->enqueue_texture(_texture);
// Don't continue the task; we're done. // Don't continue the task; we're done.
return DS_done; return DS_done;
} }