\r
#include "device_buffer.h"\r
\r
-#include "host_buffer.h"\r
#include "fence.h"\r
\r
#include <common/exception/exceptions.h>\r
\r
#include <gl/glew.h>\r
\r
+#include <tbb/atomic.h>\r
+\r
namespace caspar { namespace core {\r
\r
static GLenum FORMAT[] = {0, GL_RED, GL_RG, GL_BGR, GL_BGRA};\r
return FORMAT[stride];\r
}\r
\r
+static tbb::atomic<int> g_total_count;\r
+\r
struct device_buffer::implementation : boost::noncopyable\r
{\r
GLuint id_;\r
GL(glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));\r
GL(glTexImage2D(GL_TEXTURE_2D, 0, INTERNAL_FORMAT[stride_], width_, height_, 0, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));\r
GL(glBindTexture(GL_TEXTURE_2D, 0));\r
- CASPAR_LOG(debug) << "[device_buffer] allocated size:" << width*height*stride; \r
- clear();\r
+ CASPAR_LOG(trace) << "[device_buffer] [" << ++g_total_count << L"] allocated size:" << width*height*stride; \r
} \r
\r
~implementation()\r
try\r
{\r
GL(glDeleteTextures(1, &id_));\r
+ //CASPAR_LOG(trace) << "[device_buffer] [" << --g_total_count << L"] deallocated size:" << width_*height_*stride_;\r
}\r
catch(...)\r
{\r
GL(glBindTexture(GL_TEXTURE_2D, 0));\r
}\r
\r
- void begin_read(host_buffer& source)\r
+ void begin_read()\r
{\r
bind();\r
- source.unmap();\r
- source.bind();\r
GL(glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, FORMAT[stride_], GL_UNSIGNED_BYTE, NULL));\r
- source.unbind();\r
unbind();\r
fence_.set();\r
- //GL(glFlush());\r
}\r
\r
- void attach(int index)\r
- {\r
- GL(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + index, GL_TEXTURE_2D, id_, 0));\r
- }\r
-\r
- void clear()\r
- {\r
- attach(0);\r
- GL(glClear(GL_COLOR_BUFFER_BIT));\r
- }\r
-\r
bool ready() const\r
{\r
return fence_.ready();\r
size_t device_buffer::stride() const { return impl_->stride_; }\r
size_t device_buffer::width() const { return impl_->width_; }\r
size_t device_buffer::height() const { return impl_->height_; }\r
-void device_buffer::attach(int index){impl_->attach(index);}\r
-void device_buffer::bind(){impl_->bind();}\r
void device_buffer::bind(int index){impl_->bind(index);}\r
void device_buffer::unbind(){impl_->unbind();}\r
-void device_buffer::begin_read(host_buffer& source){impl_->begin_read(source);}\r
-void device_buffer::clear(){impl_->clear();}\r
+void device_buffer::begin_read(){impl_->begin_read();}\r
bool device_buffer::ready() const{return impl_->ready();}\r
+int device_buffer::id() const{ return impl_->id_;}\r
\r
\r
}}
\ No newline at end of file