#include "pbo.h" void gl::pbo::request_read(int x, int y, int lx, int ly, int pixsize, GLenum format, GLenum type) { int s = lx * ly * pixsize; if (s != size) allocate(PIXEL_PACK_BUFFER, s, GL_STREAM_DRAW); size = s; data_ready = false; sync.reset(); bind(PIXEL_PACK_BUFFER); glReadPixels(x, y, lx, ly, format, type, 0); unbind(PIXEL_PACK_BUFFER); sync.emplace(); } bool gl::pbo::read_data(int lx, int ly, void *data, int pixsize) { is_busy(); if (!data_ready) return false; int s = lx * ly * pixsize; if (s != size) return false; download(PIXEL_PACK_BUFFER, data, 0, s); unbind(PIXEL_PACK_BUFFER); data_ready = false; return true; } bool gl::pbo::is_busy() { if (!sync) return false; if (sync->is_signalled()) { data_ready = true; sync.reset(); return false; } return true; }