forked from opencv/opencv
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request opencv#12703 from wzw-intel:vkcom
* dnn: Add a Vulkan based backend This commit adds a new backend "DNN_BACKEND_VKCOM" and a new target "DNN_TARGET_VULKAN". VKCOM means vulkan based computation library. This backend uses Vulkan API and SPIR-V shaders to do the inference computation for layers. The layer types that implemented in DNN_BACKEND_VKCOM include: Conv, Concat, ReLU, LRN, PriorBox, Softmax, MaxPooling, AvePooling, Permute This is just a beginning work for Vulkan in OpenCV DNN, more layer types will be supported and performance tuning is on the way. Signed-off-by: Wu Zhiwen <[email protected]> * dnn/vulkan: Add FindVulkan.cmake to detect Vulkan SDK In order to build dnn with Vulkan support, need installing Vulkan SDK and setting environment variable "VULKAN_SDK" and add "-DWITH_VULKAN=ON" to cmake command. You can download Vulkan SDK from: https://vulkan.lunarg.com/sdk/home#linux For how to install, see https://vulkan.lunarg.com/doc/sdk/latest/linux/getting_started.html https://vulkan.lunarg.com/doc/sdk/latest/windows/getting_started.html https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html respectively for linux, windows and mac. To run the vulkan backend, also need installing mesa driver. On Ubuntu, use this command 'sudo apt-get install mesa-vulkan-drivers' To test, use command '$BUILD_DIR/bin/opencv_test_dnn --gtest_filter=*VkCom*' Signed-off-by: Wu Zhiwen <[email protected]> * dnn/Vulkan: dynamically load Vulkan runtime No compile-time dependency on Vulkan library. If Vulkan runtime is unavailable, fallback to CPU path. Use environment "OPENCL_VULKAN_RUNTIME" to specify path to your own vulkan runtime library. Signed-off-by: Wu Zhiwen <[email protected]> * dnn/Vulkan: Add a python script to compile GLSL shaders to SPIR-V shaders The SPIR-V shaders are in format of text-based 32-bit hexadecimal numbers, and inserted into .cpp files as unsigned int32 array. * dnn/Vulkan: Put Vulkan headers into 3rdparty directory and some other fixes Vulkan header files are copied from https://github.com/KhronosGroup/Vulkan-Docs/tree/master/include/vulkan to 3rdparty/include Fix the Copyright declaration issue. Refine OpenCVDetectVulkan.cmake * dnn/Vulkan: Add vulkan backend tests into existing ones. Also fixed some test failures. - Don't use bool variable as uniform for shader - Fix dispathed group number beyond max issue - Bypass "group > 1" convolution. This should be support in future. * dnn/Vulkan: Fix multiple initialization in one thread.
- Loading branch information
Showing
89 changed files
with
16,275 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
// | ||
// File: vk_platform.h | ||
// | ||
/* | ||
** Copyright (c) 2014-2017 The Khronos Group Inc. | ||
** | ||
** Licensed under the Apache License, Version 2.0 (the "License"); | ||
** you may not use this file except in compliance with the License. | ||
** You may obtain a copy of the License at | ||
** | ||
** http://www.apache.org/licenses/LICENSE-2.0 | ||
** | ||
** Unless required by applicable law or agreed to in writing, software | ||
** distributed under the License is distributed on an "AS IS" BASIS, | ||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
** See the License for the specific language governing permissions and | ||
** limitations under the License. | ||
*/ | ||
|
||
|
||
#ifndef VK_PLATFORM_H_ | ||
#define VK_PLATFORM_H_ | ||
|
||
#ifdef __cplusplus | ||
extern "C" | ||
{ | ||
#endif // __cplusplus | ||
|
||
/* | ||
*************************************************************************************************** | ||
* Platform-specific directives and type declarations | ||
*************************************************************************************************** | ||
*/ | ||
|
||
/* Platform-specific calling convention macros. | ||
* | ||
* Platforms should define these so that Vulkan clients call Vulkan commands | ||
* with the same calling conventions that the Vulkan implementation expects. | ||
* | ||
* VKAPI_ATTR - Placed before the return type in function declarations. | ||
* Useful for C++11 and GCC/Clang-style function attribute syntax. | ||
* VKAPI_CALL - Placed after the return type in function declarations. | ||
* Useful for MSVC-style calling convention syntax. | ||
* VKAPI_PTR - Placed between the '(' and '*' in function pointer types. | ||
* | ||
* Function declaration: VKAPI_ATTR void VKAPI_CALL vkCommand(void); | ||
* Function pointer type: typedef void (VKAPI_PTR *PFN_vkCommand)(void); | ||
*/ | ||
#if defined(_WIN32) | ||
// On Windows, Vulkan commands use the stdcall convention | ||
#define VKAPI_ATTR | ||
#define VKAPI_CALL __stdcall | ||
#define VKAPI_PTR VKAPI_CALL | ||
#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH < 7 | ||
#error "Vulkan isn't supported for the 'armeabi' NDK ABI" | ||
#elif defined(__ANDROID__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7 && defined(__ARM_32BIT_STATE) | ||
// On Android 32-bit ARM targets, Vulkan functions use the "hardfloat" | ||
// calling convention, i.e. float parameters are passed in registers. This | ||
// is true even if the rest of the application passes floats on the stack, | ||
// as it does by default when compiling for the armeabi-v7a NDK ABI. | ||
#define VKAPI_ATTR __attribute__((pcs("aapcs-vfp"))) | ||
#define VKAPI_CALL | ||
#define VKAPI_PTR VKAPI_ATTR | ||
#else | ||
// On other platforms, use the default calling convention | ||
#define VKAPI_ATTR | ||
#define VKAPI_CALL | ||
#define VKAPI_PTR | ||
#endif | ||
|
||
#include <stddef.h> | ||
|
||
#if !defined(VK_NO_STDINT_H) | ||
#if defined(_MSC_VER) && (_MSC_VER < 1600) | ||
typedef signed __int8 int8_t; | ||
typedef unsigned __int8 uint8_t; | ||
typedef signed __int16 int16_t; | ||
typedef unsigned __int16 uint16_t; | ||
typedef signed __int32 int32_t; | ||
typedef unsigned __int32 uint32_t; | ||
typedef signed __int64 int64_t; | ||
typedef unsigned __int64 uint64_t; | ||
#else | ||
#include <stdint.h> | ||
#endif | ||
#endif // !defined(VK_NO_STDINT_H) | ||
|
||
#ifdef __cplusplus | ||
} // extern "C" | ||
#endif // __cplusplus | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
#ifndef VULKAN_H_ | ||
#define VULKAN_H_ 1 | ||
|
||
/* | ||
** Copyright (c) 2015-2018 The Khronos Group Inc. | ||
** | ||
** Licensed under the Apache License, Version 2.0 (the "License"); | ||
** you may not use this file except in compliance with the License. | ||
** You may obtain a copy of the License at | ||
** | ||
** http://www.apache.org/licenses/LICENSE-2.0 | ||
** | ||
** Unless required by applicable law or agreed to in writing, software | ||
** distributed under the License is distributed on an "AS IS" BASIS, | ||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
** See the License for the specific language governing permissions and | ||
** limitations under the License. | ||
*/ | ||
|
||
#include "vk_platform.h" | ||
#include "vulkan_core.h" | ||
|
||
#ifdef VK_USE_PLATFORM_ANDROID_KHR | ||
#include "vulkan_android.h" | ||
#endif | ||
|
||
#ifdef VK_USE_PLATFORM_FUCHSIA | ||
#include <zircon/types.h> | ||
#include "vulkan_fuchsia.h" | ||
#endif | ||
|
||
#ifdef VK_USE_PLATFORM_IOS_MVK | ||
#include "vulkan_ios.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_MACOS_MVK | ||
#include "vulkan_macos.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_MIR_KHR | ||
#include <mir_toolkit/client_types.h> | ||
#include "vulkan_mir.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_VI_NN | ||
#include "vulkan_vi.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_WAYLAND_KHR | ||
#include <wayland-client.h> | ||
#include "vulkan_wayland.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_WIN32_KHR | ||
#include <windows.h> | ||
#include "vulkan_win32.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_XCB_KHR | ||
#include <xcb/xcb.h> | ||
#include "vulkan_xcb.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_XLIB_KHR | ||
#include <X11/Xlib.h> | ||
#include "vulkan_xlib.h" | ||
#endif | ||
|
||
|
||
#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT | ||
#include <X11/Xlib.h> | ||
#include <X11/extensions/Xrandr.h> | ||
#include "vulkan_xlib_xrandr.h" | ||
#endif | ||
|
||
#endif // VULKAN_H_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
#ifndef VULKAN_ANDROID_H_ | ||
#define VULKAN_ANDROID_H_ 1 | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/* | ||
** Copyright (c) 2015-2018 The Khronos Group Inc. | ||
** | ||
** Licensed under the Apache License, Version 2.0 (the "License"); | ||
** you may not use this file except in compliance with the License. | ||
** You may obtain a copy of the License at | ||
** | ||
** http://www.apache.org/licenses/LICENSE-2.0 | ||
** | ||
** Unless required by applicable law or agreed to in writing, software | ||
** distributed under the License is distributed on an "AS IS" BASIS, | ||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
** See the License for the specific language governing permissions and | ||
** limitations under the License. | ||
*/ | ||
|
||
/* | ||
** This header is generated from the Khronos Vulkan XML API Registry. | ||
** | ||
*/ | ||
|
||
|
||
#define VK_KHR_android_surface 1 | ||
struct ANativeWindow; | ||
|
||
#define VK_KHR_ANDROID_SURFACE_SPEC_VERSION 6 | ||
#define VK_KHR_ANDROID_SURFACE_EXTENSION_NAME "VK_KHR_android_surface" | ||
|
||
typedef VkFlags VkAndroidSurfaceCreateFlagsKHR; | ||
|
||
typedef struct VkAndroidSurfaceCreateInfoKHR { | ||
VkStructureType sType; | ||
const void* pNext; | ||
VkAndroidSurfaceCreateFlagsKHR flags; | ||
struct ANativeWindow* window; | ||
} VkAndroidSurfaceCreateInfoKHR; | ||
|
||
|
||
typedef VkResult (VKAPI_PTR *PFN_vkCreateAndroidSurfaceKHR)(VkInstance instance, const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); | ||
|
||
#ifndef VK_NO_PROTOTYPES | ||
VKAPI_ATTR VkResult VKAPI_CALL vkCreateAndroidSurfaceKHR( | ||
VkInstance instance, | ||
const VkAndroidSurfaceCreateInfoKHR* pCreateInfo, | ||
const VkAllocationCallbacks* pAllocator, | ||
VkSurfaceKHR* pSurface); | ||
#endif | ||
|
||
#define VK_ANDROID_external_memory_android_hardware_buffer 1 | ||
struct AHardwareBuffer; | ||
|
||
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_SPEC_VERSION 3 | ||
#define VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME "VK_ANDROID_external_memory_android_hardware_buffer" | ||
|
||
typedef struct VkAndroidHardwareBufferUsageANDROID { | ||
VkStructureType sType; | ||
void* pNext; | ||
uint64_t androidHardwareBufferUsage; | ||
} VkAndroidHardwareBufferUsageANDROID; | ||
|
||
typedef struct VkAndroidHardwareBufferPropertiesANDROID { | ||
VkStructureType sType; | ||
void* pNext; | ||
VkDeviceSize allocationSize; | ||
uint32_t memoryTypeBits; | ||
} VkAndroidHardwareBufferPropertiesANDROID; | ||
|
||
typedef struct VkAndroidHardwareBufferFormatPropertiesANDROID { | ||
VkStructureType sType; | ||
void* pNext; | ||
VkFormat format; | ||
uint64_t externalFormat; | ||
VkFormatFeatureFlags formatFeatures; | ||
VkComponentMapping samplerYcbcrConversionComponents; | ||
VkSamplerYcbcrModelConversion suggestedYcbcrModel; | ||
VkSamplerYcbcrRange suggestedYcbcrRange; | ||
VkChromaLocation suggestedXChromaOffset; | ||
VkChromaLocation suggestedYChromaOffset; | ||
} VkAndroidHardwareBufferFormatPropertiesANDROID; | ||
|
||
typedef struct VkImportAndroidHardwareBufferInfoANDROID { | ||
VkStructureType sType; | ||
const void* pNext; | ||
struct AHardwareBuffer* buffer; | ||
} VkImportAndroidHardwareBufferInfoANDROID; | ||
|
||
typedef struct VkMemoryGetAndroidHardwareBufferInfoANDROID { | ||
VkStructureType sType; | ||
const void* pNext; | ||
VkDeviceMemory memory; | ||
} VkMemoryGetAndroidHardwareBufferInfoANDROID; | ||
|
||
typedef struct VkExternalFormatANDROID { | ||
VkStructureType sType; | ||
void* pNext; | ||
uint64_t externalFormat; | ||
} VkExternalFormatANDROID; | ||
|
||
|
||
typedef VkResult (VKAPI_PTR *PFN_vkGetAndroidHardwareBufferPropertiesANDROID)(VkDevice device, const struct AHardwareBuffer* buffer, VkAndroidHardwareBufferPropertiesANDROID* pProperties); | ||
typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryAndroidHardwareBufferANDROID)(VkDevice device, const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, struct AHardwareBuffer** pBuffer); | ||
|
||
#ifndef VK_NO_PROTOTYPES | ||
VKAPI_ATTR VkResult VKAPI_CALL vkGetAndroidHardwareBufferPropertiesANDROID( | ||
VkDevice device, | ||
const struct AHardwareBuffer* buffer, | ||
VkAndroidHardwareBufferPropertiesANDROID* pProperties); | ||
|
||
VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryAndroidHardwareBufferANDROID( | ||
VkDevice device, | ||
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo, | ||
struct AHardwareBuffer** pBuffer); | ||
#endif | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif |
Oops, something went wrong.