Home | History | Annotate | Download | only in runtime
      1 /*M///////////////////////////////////////////////////////////////////////////////////////
      2 //
      3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      4 //
      5 //  By downloading, copying, installing or using the software you agree to this license.
      6 //  If you do not agree to this license, do not download, install,
      7 //  copy or use the software.
      8 //
      9 //
     10 //                           License Agreement
     11 //                For Open Source Computer Vision Library
     12 //
     13 // Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
     14 // Third party copyrights are property of their respective owners.
     15 //
     16 // Redistribution and use in source and binary forms, with or without modification,
     17 // are permitted provided that the following conditions are met:
     18 //
     19 //   * Redistribution's of source code must retain the above copyright notice,
     20 //     this list of conditions and the following disclaimer.
     21 //
     22 //   * Redistribution's in binary form must reproduce the above copyright notice,
     23 //     this list of conditions and the following disclaimer in the documentation
     24 //     and/or other materials provided with the distribution.
     25 //
     26 //   * The name of the copyright holders may not be used to endorse or promote products
     27 //     derived from this software without specific prior written permission.
     28 //
     29 // This software is provided by the copyright holders and contributors "as is" and
     30 // any express or implied warranties, including, but not limited to, the implied
     31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
     32 // In no event shall the OpenCV Foundation or contributors be liable for any direct,
     33 // indirect, incidental, special, exemplary, or consequential damages
     34 // (including, but not limited to, procurement of substitute goods or services;
     35 // loss of use, data, or profits; or business interruption) however caused
     36 // and on any theory of liability, whether in contract, strict liability,
     37 // or tort (including negligence or otherwise) arising in any way out of
     38 // the use of this software, even if advised of the possibility of such damage.
     39 //
     40 //M*/
     41 
     42 #include "../../precomp.hpp"
     43 
     44 #ifdef HAVE_CLAMDBLAS
     45 
     46 #include "opencv2/core/opencl/runtime/opencl_core.hpp"
     47 #include "opencv2/core/opencl/runtime/opencl_clamdblas.hpp"
     48 
     49 #if defined(_WIN32)
     50 #include <windows.h>
     51 
     52     static void* WinGetProcAddress(const char* name)
     53     {
     54         static HMODULE opencl_module = NULL;
     55         if (!opencl_module)
     56         {
     57             opencl_module = GetModuleHandleA("clAmdBlas.dll");
     58             if (!opencl_module)
     59             {
     60                 opencl_module = LoadLibraryA("clAmdBlas.dll");
     61                 if (!opencl_module)
     62                     return NULL;
     63             }
     64         }
     65         return (void*)GetProcAddress(opencl_module, name);
     66     }
     67     #define CV_CL_GET_PROC_ADDRESS(name) WinGetProcAddress(name)
     68 #endif // _WIN32
     69 
     70 #if defined(__linux__)
     71     #include <dlfcn.h>
     72     #include <stdio.h>
     73 
     74     static void* GetProcAddress (const char* name)
     75     {
     76         static void* h = NULL;
     77         if (!h)
     78         {
     79             h = dlopen("libclAmdBlas.so", RTLD_LAZY | RTLD_GLOBAL);
     80             if (!h)
     81                 return NULL;
     82         }
     83 
     84         return dlsym(h, name);
     85     }
     86     #define CV_CL_GET_PROC_ADDRESS(name) GetProcAddress(name)
     87 #endif
     88 
     89 #ifndef CV_CL_GET_PROC_ADDRESS
     90 #ifdef __GNUC__
     91 #warning("OPENCV: OpenCL BLAS dynamic library loader: check configuration")
     92 #else
     93 #pragma message("WARNING: OPENCV: OpenCL BLAS dynamic library loader: check configuration")
     94 #endif
     95 #define CV_CL_GET_PROC_ADDRESS(name) NULL
     96 #endif
     97 
     98 static void* openclamdblas_check_fn(int ID);
     99 
    100 #include "runtime_common.hpp"
    101 
    102 //
    103 // BEGIN OF CUSTOM FUNCTIONS
    104 //
    105 
    106 #define CUSTOM_FUNCTION_ID 1000
    107 
    108 //
    109 // END OF CUSTOM FUNCTIONS HERE
    110 //
    111 
    112 #include "autogenerated/opencl_clamdblas_impl.hpp"
    113 
    114 static void* openclamdblas_check_fn(int ID)
    115 {
    116     assert(ID >= 0 && ID < (int)(sizeof(openclamdblas_fn)/sizeof(openclamdblas_fn[0])));
    117     const struct DynamicFnEntry* e = openclamdblas_fn[ID];
    118     void* func = CV_CL_GET_PROC_ADDRESS(e->fnName);
    119     if (!func)
    120     {
    121         throw cv::Exception(cv::Error::OpenCLApiCallError,
    122                 cv::format("OpenCL AMD BLAS function is not available: [%s]", e->fnName),
    123                 CV_Func, __FILE__, __LINE__);
    124     }
    125     *(e->ppFn) = func;
    126     return func;
    127 }
    128 
    129 #endif
    130