4 #include "caffe2/core/logging.h" 8 gl_log(GL_LOG,
"deleting PBO buffer %d\n", pboId);
9 glDeleteBuffers(1, &pboId);
12 if (pboFrameBuffer != 0) {
13 gl_log(GL_LOG,
"deleting PBO frame buffer %d\n", pboFrameBuffer);
14 glDeleteFramebuffers(1, &pboFrameBuffer);
19 GLPBO* GLPBO::pboContext = NULL;
21 GLPBO* GLPBO::getContext() {
22 if (pboContext == NULL) {
23 pboContext =
new GLPBO();
28 void GLPBO::mapTextureData(GLuint _textureId,
34 std::function<
void(
const void* buffer,
40 GLint defaultFramebuffer = 0;
41 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFramebuffer);
43 if (pboFrameBuffer == 0) {
44 glGenFramebuffers(1, &pboFrameBuffer);
45 gl_log(GL_VERBOSE,
"created PBO frame buffer %d\n", pboFrameBuffer);
48 glBindFramebuffer(GL_FRAMEBUFFER, pboFrameBuffer);
50 glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, _textureId, 0);
52 int fbs = glCheckFramebufferStatus(GL_FRAMEBUFFER);
53 if (fbs != GL_FRAMEBUFFER_COMPLETE) {
54 std::stringstream errmsg;
55 errmsg <<
": Frame buffer incomplete: " << fbs;
56 throw std::runtime_error(errmsg.str());
60 glGenBuffers(1, &pboId);
61 gl_log(GL_VERBOSE,
"created PBO buffer %d\n", pboId);
63 glBindBuffer(GL_PIXEL_PACK_BUFFER, pboId);
65 size_t buffer_size = _stride * _height * _channels * _type.dataSize();
67 if (buffer_size > pboSize) {
68 LOG(INFO) <<
"Allocating PBO of capacity " << buffer_size;
70 glBufferData(GL_PIXEL_PACK_BUFFER, buffer_size, NULL, GL_DYNAMIC_READ);
71 pboSize = buffer_size;
74 glReadBuffer(GL_COLOR_ATTACHMENT0);
75 glReadPixels(0, 0, _stride, _height, _type.format, _type.type, 0);
77 GLhalf* ptr = (GLhalf*)glMapBufferRange(GL_PIXEL_PACK_BUFFER, 0, buffer_size, GL_MAP_READ_BIT);
80 process(ptr, _width, _height, _stride, _channels, _type);
82 std::stringstream errmsg;
83 errmsg <<
": glMapBufferRange using PBO incomplete";
84 throw std::runtime_error(errmsg.str());
88 glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
89 glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
92 glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer);