1 #include "../stdafx.h"
\r
3 #include "device_buffer.h"
\r
5 #include <common/gl/gl_check.h>
\r
7 namespace caspar { namespace core {
\r
9 GLenum FORMAT[] = {0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGR, GL_BGRA};
\r
10 GLenum INTERNAL_FORMAT[] = {0, GL_LUMINANCE8, GL_LUMINANCE8_ALPHA8, GL_RGB8, GL_RGBA8};
\r
12 struct device_buffer::implementation : boost::noncopyable
\r
16 const size_t width_;
\r
17 const size_t height_;
\r
18 const size_t stride_;
\r
21 implementation(size_t width, size_t height, size_t stride)
\r
26 GL(glGenTextures(1, &id_));
\r
27 GL(glBindTexture(GL_TEXTURE_2D, id_));
\r
28 GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
\r
29 GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
\r
30 GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
\r
31 GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
\r
32 GL(glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT[stride_], width_, height_, 0, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));
\r
33 GL(glBindTexture(GL_TEXTURE_2D, 0));
\r
38 GL(glDeleteTextures(1, &id_));
\r
43 GL(glBindTexture(GL_TEXTURE_2D, id_));
\r
48 GL(glBindTexture(GL_TEXTURE_2D, 0));
\r
51 void read(host_buffer& source)
\r
53 GL(glBindTexture(GL_TEXTURE_2D, id_));
\r
56 GL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));
\r
58 GL(glBindTexture(GL_TEXTURE_2D, 0));
\r
61 void write(host_buffer& target)
\r
63 GL(glBindTexture(GL_TEXTURE_2D, id_));
\r
66 GL(glReadPixels(0, 0, width_, height_, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));
\r
68 GL(glBindTexture(GL_TEXTURE_2D, 0));
\r
71 void attach(int index)
\r
73 GL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_2D, id_, 0));
\r
77 device_buffer::device_buffer(size_t width, size_t height, size_t stride) : impl_(new implementation(width, height, stride)){}
\r
78 size_t device_buffer::stride() const { return impl_->stride_; }
\r
79 size_t device_buffer::width() const { return impl_->width_; }
\r
80 size_t device_buffer::height() const { return impl_->height_; }
\r
81 void device_buffer::attach(int index){impl_->attach(index);}
\r
82 void device_buffer::bind(){impl_->bind();}
\r
83 void device_buffer::unbind(){impl_->unbind();}
\r
84 void device_buffer::read(host_buffer& source){impl_->read(source);}
\r
85 void device_buffer::write(host_buffer& target){impl_->write(target);}
\r