-\r
- void render(const safe_ptr<core::read_frame>& frame)\r
- { \r
- glBindTexture(GL_TEXTURE_2D, texture_);\r
-\r
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbos_[0]);\r
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, format_desc_.width, format_desc_.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);\r
-\r
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbos_[1]);\r
- glBufferData(GL_PIXEL_UNPACK_BUFFER, format_desc_.size, 0, GL_STREAM_DRAW);\r
-\r
- auto ptr = glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);\r
- if(ptr)\r
- {\r
- fast_memcpy(reinterpret_cast<char*>(ptr), frame->image_data().begin(), frame->image_data().size());\r
- glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); // release the mapped buffer\r
- }\r
-\r
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);\r
- \r
- GL(glClear(GL_COLOR_BUFFER_BIT)); \r
- glBegin(GL_QUADS);\r
- glTexCoord2f(0.0f, 1.0f); glVertex2f(-width_, -height_);\r
- glTexCoord2f(1.0f, 1.0f); glVertex2f( width_, -height_);\r
- glTexCoord2f(1.0f, 0.0f); glVertex2f( width_, height_);\r
- glTexCoord2f(0.0f, 0.0f); glVertex2f(-width_, height_);\r
- glEnd();\r
- \r
- glBindTexture(GL_TEXTURE_2D, 0);\r
-\r
- std::rotate(pbos_.begin(), pbos_.begin() + 1, pbos_.end());\r
- }\r
-\r
- void send(const safe_ptr<core::read_frame>& frame)\r
- {\r
- input_buffer_.push_back(frame);\r
-\r
- if(input_buffer_.full())\r
- {\r
- if(!frame_buffer_.try_push(input_buffer_.front()))\r
- graph_->add_tag("dropped-frame");\r
- }\r
- }\r
- \r
- std::wstring print() const\r
- { \r
- return L"ogl[" + boost::lexical_cast<std::wstring>(screen_index_) + L"|" + format_desc_.name + L"]";\r
- }\r
-\r
- void tick()\r
- {\r
- try\r
- {\r
- perf_timer_.restart();\r
- sf::Event e;\r
- \r
- safe_ptr<core::read_frame> frame;\r
-\r
- while(window_.GetEvent(e))\r
- {\r
- if(e.Type == sf::Event::Resized)\r
- calculate_aspect();\r
- }\r
-\r
- frame_buffer_.pop(frame);\r
-\r
- if(!frame->image_data().empty())\r
- render(frame);\r
-\r
- window_.Display();\r
- graph_->update_value("frame-time", static_cast<float>(perf_timer_.elapsed()*format_desc_.fps*0.5)); \r
- }\r
- catch(...)\r
- {\r
- CASPAR_LOG_CURRENT_EXCEPTION();\r
- }\r
- executor_.begin_invoke([=]{tick();});\r
- }\r