]> git.sesse.net Git - casparcg/commitdiff
Improved performance in flash producer
authorHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 18:11:24 +0000 (19:11 +0100)
committerHelge Norberg <helge.norberg@svt.se>
Mon, 23 Nov 2015 18:11:24 +0000 (19:11 +0100)
common/CMakeLists.txt
common/memcpy.h [new file with mode: 0644]
common/memset.h [new file with mode: 0644]
modules/flash/producer/flash_producer.cpp

index 3705885c259516ab12d2e3c0e30d782f52ee5115..a4bc89b88dc0f5501da29bfbff57399e779aef38 100644 (file)
@@ -74,6 +74,8 @@ set(HEADERS
                lock.h
                log.h
                memory.h
+               memcpy.h
+               memset.h
                memshfl.h
                param.h
                polling_filesystem_monitor.h
@@ -91,6 +93,7 @@ add_library(common ${SOURCES} ${HEADERS} ${OS_SPECIFIC_SOURCES})
 add_precompiled_header(common stdafx.h FORCEINCLUDE)
 
 include_directories(..)
+include_directories(${ASMLIB_INCLUDE_PATH})
 include_directories(${BOOST_INCLUDE_PATH})
 include_directories(${RXCPP_INCLUDE_PATH})
 include_directories(${TBB_INCLUDE_PATH})
diff --git a/common/memcpy.h b/common/memcpy.h
new file mode 100644 (file)
index 0000000..530f617
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
+*
+* This file is part of CasparCG (www.casparcg.com).
+*
+* CasparCG is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* CasparCG is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
+*
+* Author: Helge Norberg, helge.norberg@svt.se
+*/
+
+#pragma once
+
+#include <asmlib.h>
+
+#include <tbb/parallel_for.h>
+
+namespace caspar {
+
+static void fast_memcpy(void* dest, const void* src, std::size_t size)
+{
+       tbb::affinity_partitioner partitioner;
+       tbb::parallel_for(tbb::blocked_range<std::size_t>(0, size, size / 128), [&](const tbb::blocked_range<size_t>& range)
+       {
+               A_memcpy(
+                               reinterpret_cast<std::uint8_t*>(dest) + range.begin(),
+                               reinterpret_cast<const std::uint8_t*>(src) + range.begin(),
+                               range.size());
+       }, partitioner);
+}
+
+}
diff --git a/common/memset.h b/common/memset.h
new file mode 100644 (file)
index 0000000..a53b0b2
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+* Copyright (c) 2011 Sveriges Television AB <info@casparcg.com>
+*
+* This file is part of CasparCG (www.casparcg.com).
+*
+* CasparCG is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* CasparCG is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with CasparCG. If not, see <http://www.gnu.org/licenses/>.
+*
+* Author: Helge Norberg, helge.norberg@svt.se
+*/
+
+#pragma once
+
+#include <asmlib.h>
+
+#include <tbb/parallel_for.h>
+
+namespace caspar {
+
+static void fast_memset(void* dest, int c, std::size_t size)
+{
+       tbb::affinity_partitioner partitioner;
+       tbb::parallel_for(tbb::blocked_range<std::size_t>(0, size, size / 128), [&](const tbb::blocked_range<size_t>& range)
+       {
+               A_memset(
+                               reinterpret_cast<std::uint8_t*>(dest) + range.begin(),
+                               c,
+                               range.size());
+       }, partitioner);
+}
+
+}
index 4066ecea92e353359d9149432aa83473e13647c4..8cefe4d4cb633bef78e53d4813b1ea9874cddd21 100644 (file)
@@ -49,6 +49,8 @@
 #include <common/diagnostics/graph.h>
 #include <common/prec_timer.h>
 #include <common/array.h>
+#include <common/memset.h>
+#include <common/memcpy.h>
 
 #include <boost/filesystem.hpp>
 #include <boost/property_tree/ptree.hpp>
@@ -58,8 +60,6 @@
 
 #include <tbb/spin_mutex.h>
 
-#include <asmlib.h>
-
 #include <functional>
 
 namespace caspar { namespace flash {
@@ -299,10 +299,10 @@ public:
                        desc.planes.push_back(core::pixel_format_desc::plane(width_, height_, 4));
                        auto frame = frame_factory_->create_frame(this, desc, core::audio_channel_layout::invalid());
 
-                       A_memset(bmp_.data(), 0, width_ * height_ * 4);
+                       fast_memset(bmp_.data(), 0, width_ * height_ * 4);
                        ax_->DrawControl(bmp_);
                
-                       A_memcpy(frame.image_data(0).begin(), bmp_.data(), width_*height_*4);
+                       fast_memcpy(frame.image_data(0).begin(), bmp_.data(), width_*height_*4);
                        head_ = core::draw_frame(std::move(frame));     
                }