]> git.sesse.net Git - casparcg/blob - common/gl/frame_buffer_object.cpp
2.0.0.2:
[casparcg] / common / gl / frame_buffer_object.cpp
1 #include "../StdAfx.h"\r
2 \r
3 #include "frame_buffer_object.h"\r
4 \r
5 #include "../../common/gl/gl_check.h"\r
6 \r
7 #include <Glee.h>\r
8 \r
9 #include <memory>\r
10 \r
11 namespace caspar { namespace common { namespace gl {\r
12 \r
13 struct frame_buffer_object::implementation\r
14 {\r
15 public:\r
16         implementation(size_t width, size_t height, GLenum mode) : mode_(mode)\r
17         {\r
18                 GL(glGenTextures(1, &texture_));        \r
19                 GL(glBindTexture(GL_TEXTURE_2D, texture_));                     \r
20                 GL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, \r
21                                                         GL_UNSIGNED_BYTE, NULL));\r
22                 GL(glGenFramebuffersEXT(1, &fbo_));             \r
23                 GL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo_));\r
24                 GL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, mode_, GL_TEXTURE_2D, \r
25                                                                                 texture_, 0));\r
26         }\r
27         \r
28         ~implementation()\r
29         {\r
30                 glDeleteFramebuffersEXT(1, &fbo_);\r
31                 glDeleteTextures(1, &texture_);\r
32         }\r
33 \r
34         void bind_pixel_source()\r
35         {\r
36                 GL(glReadBuffer(mode_));\r
37         }\r
38 \r
39         GLuint texture_;\r
40         GLuint fbo_;\r
41         GLenum mode_;\r
42         size_t width_;\r
43         size_t height_;\r
44 };\r
45 \r
46 frame_buffer_object::frame_buffer_object(){}\r
47 frame_buffer_object::frame_buffer_object(size_t width, size_t height, GLenum mode)\r
48         : impl_(new implementation(width, height, mode)){}\r
49 void frame_buffer_object::create(size_t width, size_t height, GLenum mode)\r
50 {\r
51         impl_.reset(new implementation(width, height, mode));\r
52 }\r
53 void frame_buffer_object::bind_pixel_source() {impl_->bind_pixel_source();}\r
54 }}}