]> git.sesse.net Git - casparcg/blobdiff - modules/ogl/consumer/ogl_consumer.cpp
ogl_consumer: Add "FULLSCREEN" option to ADD SCREEN.
[casparcg] / modules / ogl / consumer / ogl_consumer.cpp
index 7d0acb226235b3a9a8abd3daf34ac7585558ffa5..56629197da28d30580a43a17afd928ea33a91cf9 100644 (file)
@@ -68,6 +68,8 @@ extern "C"
 #pragma warning (pop)\r
 #endif\r
 \r
+typedef int (*PFNWGLEXTGETSWAPINTERVALPROC) (void);\r
\r
 namespace caspar { namespace ogl {\r
                \r
 enum stretch\r
@@ -94,6 +96,7 @@ struct configuration
        bool                    auto_deinterlace;\r
        bool                    key_only;\r
        aspect_ratio    aspect; \r
+       bool                    vsync;\r
 \r
        configuration()\r
                : name(L"ogl")\r
@@ -103,6 +106,7 @@ struct configuration
                , auto_deinterlace(true)\r
                , key_only(false)\r
                , aspect(aspect_invalid)\r
+               , vsync(false)\r
        {\r
        }\r
 };\r
@@ -186,7 +190,7 @@ public:
                screen_y_               = devmode.dmPosition.y;\r
                screen_width_   = config_.windowed ? square_width_ : devmode.dmPelsWidth;\r
                screen_height_  = config_.windowed ? square_height_ : devmode.dmPelsHeight;\r
-               \r
+\r
                is_running_ = true;\r
                thread_ = boost::thread([this]{run();});\r
        }\r
@@ -232,6 +236,18 @@ public:
                glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbos_[1]);\r
                glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, format_desc_.size, 0, GL_STREAM_DRAW_ARB);\r
                glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);\r
+                               \r
+               if(config_.vsync)\r
+               {\r
+                       auto wglSwapIntervalEXT = reinterpret_cast<void(APIENTRY*)(int)>(wglGetProcAddress("wglSwapIntervalEXT"));\r
+                       if(wglSwapIntervalEXT)\r
+                       {\r
+                               wglSwapIntervalEXT(1);\r
+                               CASPAR_LOG(info) << print() << " Successfully enabled vsync.";\r
+                       }\r
+                       else\r
+                               CASPAR_LOG(info) << print() << " Failed to enable vsync.";\r
+               }\r
 \r
                CASPAR_LOG(info) << print() << " Successfully Initialized.";\r
        }\r
@@ -523,7 +539,7 @@ safe_ptr<core::frame_consumer> create_consumer(const std::vector<std::wstring>&
        if(device_it != params.end() && ++device_it != params.end())\r
                config.screen_index = boost::lexical_cast<int>(*device_it);\r
                \r
-       config.key_only = std::find(params.begin(), params.end(), L"WINDOWED") != params.end();\r
+       config.windowed = std::find(params.begin(), params.end(), L"FULLSCREEN") == params.end();\r
        config.key_only = std::find(params.begin(), params.end(), L"KEY_ONLY") != params.end();\r
 \r
        auto name_it    = std::find(params.begin(), params.end(), L"NAME");\r
@@ -541,7 +557,8 @@ safe_ptr<core::frame_consumer> create_consumer(const boost::property_tree::wptre
        config.windowed                 = ptree.get(L"windowed", config.windowed);\r
        config.key_only                 = ptree.get(L"key-only", config.key_only);\r
        config.auto_deinterlace = ptree.get(L"auto-deinterlace", config.auto_deinterlace);\r
-       \r
+       config.vsync                    = ptree.get(L"vsync", config.vsync);\r
+\r
        auto stretch_str = ptree.get(L"stretch", L"default");\r
        if(stretch_str == L"uniform")\r
                config.stretch = stretch::uniform;\r