aboutsummaryrefslogtreecommitdiff
path: root/graphics/waifu2x-converter-cpp
diff options
context:
space:
mode:
authorJan Beich <jbeich@FreeBSD.org>2015-09-23 11:53:22 +0000
committerJan Beich <jbeich@FreeBSD.org>2015-09-23 11:53:22 +0000
commitf91ee5731b3c7ce11d0510b8f7f8ed4fa798904f (patch)
treef4562f91f3558099cf2736985be09fbe62cc6554 /graphics/waifu2x-converter-cpp
parent45e76ba7c50c588bc36b12f94ccadcc566e0a98f (diff)
downloadports-f91ee5731b3c7ce11d0510b8f7f8ed4fa798904f.tar.gz
ports-f91ee5731b3c7ce11d0510b8f7f8ed4fa798904f.zip
Notes
Diffstat (limited to 'graphics/waifu2x-converter-cpp')
-rw-r--r--graphics/waifu2x-converter-cpp/Makefile63
-rw-r--r--graphics/waifu2x-converter-cpp/distinfo2
-rw-r--r--graphics/waifu2x-converter-cpp/files/patch-freebsd92
-rw-r--r--graphics/waifu2x-converter-cpp/files/patch-no-sse370
-rw-r--r--graphics/waifu2x-converter-cpp/files/patch-non-x86168
-rw-r--r--graphics/waifu2x-converter-cpp/pkg-descr5
6 files changed, 400 insertions, 0 deletions
diff --git a/graphics/waifu2x-converter-cpp/Makefile b/graphics/waifu2x-converter-cpp/Makefile
new file mode 100644
index 000000000000..d338be29dcce
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/Makefile
@@ -0,0 +1,63 @@
+# $FreeBSD$
+
+PORTNAME= waifu2x-converter-cpp
+DISTVERSION= 1.0.0-237
+DISTVERSIONSUFFIX= -gca65c93
+CATEGORIES= graphics
+
+MAINTAINER= jbeich@FreeBSD.org
+COMMENT= Scale and denoise images using convolutional neural networks
+
+LICENSE= BSD2CLAUSE MIT
+LICENSE_COMB= multi
+LICENSE_FILE_BSD2CLAUSE=${WRKSRC}/LICENSE
+LICENSE_FILE_MIT= ${WRKSRC}/LICENSE
+
+BUILD_DEPENDS= ${LOCALBASE}/include/CL/opencl.h:${PORTSDIR}/devel/opencl
+LIB_DEPENDS= libopencv_highgui.so:${PORTSDIR}/graphics/opencv \
+ libopencv_imgproc.so:${PORTSDIR}/graphics/opencv-core
+
+USE_GITHUB= yes
+GH_ACCOUNT= tanakamura
+
+USES= cmake compiler:c++11-lib dos2unix
+CMAKE_ARGS= -DOPENCV_PREFIX="${LOCALBASE}" \
+ -DOpenCL_LIBRARY="${LOCALBASE}/lib/libOpenCL.so"
+CFLAGS+= -D_GLIBCXX_USE_C99 -D_GLIBCXX_USE_C99_MATH_TR1 \
+ -D_DECLARE_C99_LDBL_MATH # XXX ports/193528
+LDFLAGS+= -Wl,--as-needed # avoid overlinking (opencv deps)
+USE_LDCONFIG= yes
+PLIST_FILES= bin/${PORTNAME} \
+ include/w2xconv.h \
+ lib/libw2xc.so
+PORTDATA= models_rgb
+PORTDOCS= *
+
+OPTIONS_DEFINE= DOCS SIMD
+OPTIONS_DEFAULT=SIMD
+
+SIMD_CMAKE_OFF= -DX86OPT=off
+
+post-patch:
+ @${REINPLACE_CMD} -e 's,-O2,,; /SYMBOL/s,-s,,' \
+ ${WRKSRC}/CMakeLists.txt
+ @${REINPLACE_CMD} -e '/"models/s,","${DATADIR}/,' \
+ ${WRKSRC}/src/main.cpp
+
+pre-install:
+# XXX Fails on 9.x with error code 10
+ -(cd ${WRKSRC} && ./runtest)
+
+do-install:
+ ${INSTALL_PROGRAM} ${WRKSRC}/${PORTNAME} ${STAGEDIR}${PREFIX}/bin
+ ${INSTALL_LIB} ${WRKSRC}/libw2xc.so ${STAGEDIR}${PREFIX}/lib
+ ${INSTALL_DATA} ${WRKSRC}/src/w2xconv.h ${STAGEDIR}${PREFIX}/include
+ (cd ${WRKSRC} && ${COPYTREE_SHARE} \
+ "${PORTDATA}" ${STAGEDIR}${DATADIR})
+
+post-install-DOCS-on:
+ (cd ${WRKSRC} && ${COPYTREE_SHARE} "appendix" ${STAGEDIR}${DOCSDIR})
+ (cd ${WRKSRC}/docs && ${COPYTREE_SHARE} \
+ "internals" ${STAGEDIR}${DOCSDIR})
+
+.include <bsd.port.mk>
diff --git a/graphics/waifu2x-converter-cpp/distinfo b/graphics/waifu2x-converter-cpp/distinfo
new file mode 100644
index 000000000000..170a8e1c4c96
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/distinfo
@@ -0,0 +1,2 @@
+SHA256 (tanakamura-waifu2x-converter-cpp-1.0.0-237-gca65c93_GH0.tar.gz) = 5b34ecc43a9c9f976ab92c72b1ba6f45b8470ea05bb976738e732c3c01290c8e
+SIZE (tanakamura-waifu2x-converter-cpp-1.0.0-237-gca65c93_GH0.tar.gz) = 14848013
diff --git a/graphics/waifu2x-converter-cpp/files/patch-freebsd b/graphics/waifu2x-converter-cpp/files/patch-freebsd
new file mode 100644
index 000000000000..702469bff855
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/files/patch-freebsd
@@ -0,0 +1,92 @@
+https://github.com/tanakamura/waifu2x-converter-cpp/pull/3
+
+diff --git src/Buffer.hpp src/Buffer.hpp
+index 2152cf3..e69d10b 100644
+--- src/Buffer.hpp
++++ src/Buffer.hpp
+@@ -1,8 +1,10 @@
+ #ifndef BUFFER_HPP
+ #define BUFFER_HPP
+
+-#ifndef __APPLE__
++#if defined(_MSC_VER)
+ #include <malloc.h>
++#elif defined(__GNUC__)
++#include <mm_malloc.h>
+ #endif
+
+ #include <stdlib.h>
+diff --git src/Env.hpp src/Env.hpp
+index 8087431..7003c80 100644
+--- src/Env.hpp
++++ src/Env.hpp
+@@ -26,7 +26,7 @@ struct ComputeEnv {
+
+ struct W2XConvProcessor target_processor;
+
+-#ifndef __APPLE__
++#if defined(_WIN32) || defined(__linux)
+ w2xc::ThreadPool *tpool;
+ #endif
+ ComputeEnv();
+diff --git src/modelHandler_avx_func.hpp src/modelHandler_avx_func.hpp
+index 2459792..27514e5 100644
+--- src/modelHandler_avx_func.hpp
++++ src/modelHandler_avx_func.hpp
+@@ -699,7 +699,7 @@ filter_AVX_impl0(ComputeEnv *env,
+ }
+ };
+
+-#ifdef __APPLE__
++#if !defined(_WIN32) && !defined(__linux)
+ std::vector<std::thread> workerThreads;
+ for (int ji=0; ji<nJob; ji++) {
+ workerThreads.emplace_back(std::thread(func));
+diff --git src/threadPool.cpp src/threadPool.cpp
+index 6c10f12..3b32f07 100644
+--- src/threadPool.cpp
++++ src/threadPool.cpp
+@@ -2,7 +2,7 @@
+ #include <atomic>
+ #include "threadPool.hpp"
+
+-#ifndef __APPLE__
++#if defined(_WIN32) || defined(__linux)
+
+ namespace w2xc {
+
+diff --git src/threadPool.hpp src/threadPool.hpp
+index 2a905ea..34f6586 100644
+--- src/threadPool.hpp
++++ src/threadPool.hpp
+@@ -1,7 +1,7 @@
+ #ifndef THREAD_POOL_HPP
+ #define THREAD_POOL_HPP
+
+-#ifndef __APPLE__
++#if defined(_WIN32) || defined(__linux)
+
+ #include <thread>
+ #include <atomic>
+diff --git src/w2xconv.cpp src/w2xconv.cpp
+index 5ed00bd..de78ad8 100644
+--- src/w2xconv.cpp
++++ src/w2xconv.cpp
+@@ -36,7 +36,7 @@ w2xconv_init(enum W2XConvGPUMode gpu,
+ nJob = std::thread::hardware_concurrency();
+ }
+
+-#ifndef __APPLE__
++#if defined(_WIN32) || defined(__linux)
+ impl->env.tpool = w2xc::initThreadPool(nJob);
+ #endif
+
+@@ -248,7 +248,7 @@ w2xconv_fini(struct W2XConv *conv)
+
+ w2xc::finiCUDA(&impl->env);
+ w2xc::finiOpenCL(&impl->env);
+-#ifndef __APPLE__
++#if defined(_WIN32) || defined(__linux)
+ w2xc::finiThreadPool(impl->env.tpool);
+ #endif
+
diff --git a/graphics/waifu2x-converter-cpp/files/patch-no-sse3 b/graphics/waifu2x-converter-cpp/files/patch-no-sse3
new file mode 100644
index 000000000000..480665615779
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/files/patch-no-sse3
@@ -0,0 +1,70 @@
+https://github.com/tanakamura/waifu2x-converter-cpp/pull/5
+
+diff --git src/Env.cpp src/Env.cpp
+index 76c1859..9ad0a3c 100644
+--- src/Env.cpp
++++ src/Env.cpp
+@@ -28,6 +28,10 @@ ComputeEnv::ComputeEnv()
+ #endif
+ this->flags = 0;
+
++ if (ecx & (1<<0)) {
++ this->flags |= ComputeEnv::HAVE_CPU_SSE3;
++ }
++
+ if ((ecx & 0x18000000) == 0x18000000) {
+ this->flags |= ComputeEnv::HAVE_CPU_AVX;
+ }
+diff --git src/Env.hpp src/Env.hpp
+index 8087431..0c2e22a 100644
+--- src/Env.hpp
++++ src/Env.hpp
+@@ -19,6 +19,7 @@ struct ComputeEnv {
+
+ static const int HAVE_CPU_FMA = 1<<0;
+ static const int HAVE_CPU_AVX = 1<<1;
++ static const int HAVE_CPU_SSE3 = 1<<2;
+
+ int flags;
+
+diff --git src/modelHandler.cpp src/modelHandler.cpp
+index 2f72442..1e74ba0 100644
+--- src/modelHandler.cpp
++++ src/modelHandler.cpp
+@@ -100,6 +100,7 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+
+ bool have_fma = env->flags & ComputeEnv::HAVE_CPU_FMA;
+ bool have_avx = env->flags & ComputeEnv::HAVE_CPU_AVX;
++ bool have_sse3 = env->flags & ComputeEnv::HAVE_CPU_SSE3;
+
+ bool gpu = (rt == RUN_OPENCL) || (rt == RUN_CUDA);
+
+@@ -317,10 +318,12 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ filter_AVX_impl(env, packed_input, packed_output,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
+- } else {
++ } else if (have_sse3) {
+ filter_SSE_impl(env, packed_input, packed_output,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
++ } else {
++ filter_CV(env, packed_input_buf, packed_output_buf, size);
+ }
+ }
+
+@@ -379,11 +382,12 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ const float *packed_input = (float*)packed_input_buf->get_read_ptr_host(env, in_size);
+ float *packed_output = (float*)packed_output_buf->get_write_ptr_host(env);
+
+- if (!have_avx) {
++ if (!have_sse3) {
++ filter_CV(env, packed_input_buf, packed_output_buf, size);
++ } else if (!have_avx) {
+ filter_SSE_impl(env, packed_input, packed_output,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
+- //filter_CV(env, packed_input_buf, packed_output_buf, size);
+ } else {
+ if (have_fma) {
+ filter_FMA_impl(env, packed_input, packed_output,
diff --git a/graphics/waifu2x-converter-cpp/files/patch-non-x86 b/graphics/waifu2x-converter-cpp/files/patch-non-x86
new file mode 100644
index 000000000000..54c56d3c2a12
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/files/patch-non-x86
@@ -0,0 +1,168 @@
+https://github.com/tanakamura/waifu2x-converter-cpp/pull/6
+
+diff --git CMakeLists.txt CMakeLists.txt
+index bcb0338..899ee7b 100644
+--- CMakeLists.txt
++++ CMakeLists.txt
+@@ -58,10 +58,24 @@ endif()
+ find_library(IMGCODECS_LIBRARY NAMES opencv_imgcodecs opencv_highgui
+ HINTS ${OPENCV_PREFIX}/lib)
+
++if(CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" OR
++ CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR
++ CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
++ set(X86_TRUE true)
++else()
++ set(X86_TRUE false)
++endif()
++
++option(X86OPT "Enable X86 SIMD optimizations" ${X86_TRUE})
++if(X86OPT)
++ add_definitions(-DX86OPT)
++ set(X86OPT_SOURCES src/modelHandler_avx.cpp src/modelHandler_fma.cpp src/modelHandler_sse.cpp)
++endif()
++
+ add_executable(waifu2x-converter-cpp
+ src/main.cpp)
+ add_library(w2xc SHARED
+- src/modelHandler.cpp src/modelHandler_avx.cpp src/modelHandler_fma.cpp src/modelHandler_sse.cpp
++ src/modelHandler.cpp ${X86OPT_SOURCES}
+ src/modelHandler_OpenCL.cpp src/convertRoutine.cpp src/threadPool.cpp
+ src/modelHandler_CUDA.cpp src/w2xconv.cpp src/common.cpp
+ src/Env.cpp
+diff --git src/Env.cpp src/Env.cpp
+index 76c1859..2c1069d 100644
+--- src/Env.cpp
++++ src/Env.cpp
+@@ -1,11 +1,13 @@
+ #include "Env.hpp"
+ #include "Buffer.hpp"
+
++#ifdef X86OPT
+ #ifdef __GNUC__
+ #include <cpuid.h>
+ #else
+ #include <intrin.h>
+ #endif
++#endif // X86OPT
+
+ ComputeEnv::ComputeEnv()
+ :num_cl_dev(0),
+@@ -14,6 +16,9 @@ ComputeEnv::ComputeEnv()
+ cuda_dev_list(nullptr),
+ transfer_wait(0)
+ {
++ this->flags = 0;
++
++#ifdef X86OPT
+ unsigned int eax=0, ebx=0, ecx=0, edx=0;
+
+ #ifdef __GNUC__
+@@ -26,8 +31,6 @@ ComputeEnv::ComputeEnv()
+ ecx = cpuInfo[2];
+ edx = cpuInfo[3];
+ #endif
+- this->flags = 0;
+-
+ if (ecx & (1<<0)) {
+ this->flags |= ComputeEnv::HAVE_CPU_SSE3;
+ }
+@@ -35,6 +38,7 @@ ComputeEnv::ComputeEnv()
+ if (ecx & (1<<12)) {
+ this->flags |= ComputeEnv::HAVE_CPU_FMA;
+ }
++#endif // X86OPT
+
+ this->pref_block_size = 512;
+ }
+diff --git src/modelHandler.cpp src/modelHandler.cpp
+index 2f72442..1a3d87e 100644
+--- src/modelHandler.cpp
++++ src/modelHandler.cpp
+@@ -306,6 +306,7 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
+ } else {
++#ifdef X86OPT
+ const float *packed_input = (float*)packed_input_buf->get_read_ptr_host(env, in_size);
+ float *packed_output = (float*)packed_output_buf->get_write_ptr_host(env);
+
+@@ -322,6 +323,9 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
+ }
++#else
++ filter_CV(env, packed_input_buf, packed_output_buf, size);
++#endif
+ }
+
+ double t2 = getsec();
+@@ -376,6 +380,7 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ nInputPlanes, nOutputPlanes, fbiases_flat, weight_flat,
+ size.width, size.height, nJob);
+ } else {
++#ifdef X86OPT
+ const float *packed_input = (float*)packed_input_buf->get_read_ptr_host(env, in_size);
+ float *packed_output = (float*)packed_output_buf->get_write_ptr_host(env);
+
+@@ -395,6 +400,9 @@ bool Model::filter_AVX_OpenCL(ComputeEnv *env,
+ size.width, size.height, nJob);
+ }
+ }
++#else
++ filter_CV(env, packed_input_buf, packed_output_buf, size);
++#endif
+ }
+ }
+
+diff --git src/modelHandler_OpenCL.cpp src/modelHandler_OpenCL.cpp
+index ea4fd9b..13da2a2 100644
+--- src/modelHandler_OpenCL.cpp
++++ src/modelHandler_OpenCL.cpp
+@@ -16,13 +16,6 @@
+ #include "CLlib.h"
+ #include "params.h"
+
+-#ifdef __GNUC__
+-#include <cpuid.h>
+-#else
+-#include <intrin.h>
+-#endif
+-
+-
+ static const char prog[] =
+ #include "modelHandler_OpenCL.cl.h"
+ ;
+diff --git src/w2xconv.cpp src/w2xconv.cpp
+index 5ed00bd..94b08c4 100644
+--- src/w2xconv.cpp
++++ src/w2xconv.cpp
+@@ -1,10 +1,12 @@
+ #define W2XCONV_IMPL
+
+ #include <thread>
++#ifdef X86OPT
+ //#if (defined __GNUC__) || (defined __clang__)
+ #ifndef _WIN32
+ #include <cpuid.h>
+ #endif
++#endif // X86OPT
+ #include "w2xconv.h"
+ #include "sec.hpp"
+ #include "Buffer.hpp"
+@@ -63,6 +65,7 @@ w2xconv_init(enum W2XConvGPUMode gpu,
+ c->target_processor.devid = 0;
+ impl->dev_name = impl->env.cl_dev_list[0].name.c_str();
+ } else {
++#ifdef X86OPT
+ {
+
+ #ifdef _WIN32
+@@ -91,6 +94,7 @@ w2xconv_init(enum W2XConvGPUMode gpu,
+
+ c->target_processor.type = W2XCONV_PROC_HOST;
+ }
++#endif // X86OPT
+ }
+
+ c->target_processor.dev_name = impl->dev_name.c_str();
diff --git a/graphics/waifu2x-converter-cpp/pkg-descr b/graphics/waifu2x-converter-cpp/pkg-descr
new file mode 100644
index 000000000000..57af22eef547
--- /dev/null
+++ b/graphics/waifu2x-converter-cpp/pkg-descr
@@ -0,0 +1,5 @@
+waifu2x achieves image superresolution for anime-style art using deep
+convolutional neural networks from Torch. waifu2x-converter-cpp
+reimplements its converter function in C++ using OpenCV.
+
+WWW: https://github.com/tanakamura/waifu2x-converter-cpp