summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
afd3391)
This would cause odd stuttering, as old and new frames would share
userdata briefly, causing chaos.
default:
assert(false);
}
default:
assert(false);
}
+
+ if (ud->generation != generation) {
+ auto it = lingering_generations.find(ud->generation);
+ assert(it != lingering_generations.end());
+ if (--it->second.num_frames_left == 0) {
+ lingering_generations.erase(it); // Deallocates the userdata block.
+ }
+ }
}
//static int sumsum = 0;
}
//static int sumsum = 0;
+ size_t old_num_queued_frames = this->num_queued_frames;
+
this->pixel_format = pixel_format;
this->frame_size = frame_size;
this->width = width;
this->pixel_format = pixel_format;
this->frame_size = frame_size;
this->width = width;
this->map_bits = map_bits;
lock_guard<mutex> lock(freelist_mutex);
this->map_bits = map_bits;
lock_guard<mutex> lock(freelist_mutex);
+ lingering_generations[generation] = LingeringGeneration{ move(userdata), old_num_queued_frames };
+ ++generation;
+
while (!freelist.empty()) {
Frame frame = freelist.front();
freelist.pop();
destroy_frame(&frame);
}
while (!freelist.empty()) {
Frame frame = freelist.front();
freelist.pop();
destroy_frame(&frame);
}
+
+ userdata.reset(new Userdata[num_queued_frames]);
for (size_t i = 0; i < num_queued_frames; ++i) {
init_frame(i, frame_size, width, height, permissions, map_bits, generation);
}
for (size_t i = 0; i < num_queued_frames; ++i) {
init_frame(i, frame_size, width, height, permissions, map_bits, generation);
}
GLenum permissions;
GLenum map_bits;
int generation = 0; // Under freelist_mutex.
GLenum permissions;
GLenum map_bits;
int generation = 0; // Under freelist_mutex.
+
+ struct LingeringGeneration {
+ std::unique_ptr<Userdata[]> userdata;
+ size_t num_frames_left;
+ };
+ std::map<int, LingeringGeneration> lingering_generations;
};
#endif // !defined(_PBO_FRAME_ALLOCATOR)
};
#endif // !defined(_PBO_FRAME_ALLOCATOR)