假装异步加载中...
25 Nov 2016

Vulkan 介绍

1. 环境搭建

1.1 Windows环境

  • 下载LunarG® Vulkan™ SDK,链接地址
  • Cmake安装、Python 3安装
  • 更新驱动nvidia, 和安装VulkanRT

1.2 Android环境

  • 下载Android StudioNDK r12+
  • 编译shaderc(可选), APP_STL可以是gnustl_static, gnustl_shared, c++_static,或者c++_shared
    cd <ndk-root>/sources/third_party/shaderc/
    ../../../ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk APP_STL:=c++_shared APP_ABI=all libshaderc_combined
    
  • 下载官方demo git clone https://github.com/googlesamples/vulkan-basic-samples.git
  • 更新gslang
    cd LunarGSamples
    update_external_sources.bat -s -g
    

    这里会从github上下载最新的gslang,并用msbuild.exe编译

  • 生成Android Studio工程
    cd API-samples
    cmake -DANDROID=ON -DANDROID_ABI=[armeabi-v7a|arm64-v8a| x86|x86_64|all(default)]
    

    从github下载下来的工程直接cmake会出错,因为在utils工程的CMakeList.txt有两个变量没有赋值(ANDROID_NDK和UTILS_NAME)

    add_library(native_app_glue STATIC
      ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
    #ANDROID_NDK 没有赋值导致上面的路径无效
    target_include_directories(${UTILS_NAME} PRIVATE
                            ${ANDROID_NDK}/sources/android/native_app_glue
                            ${CMAKE_CURRENT_SOURCE_DIR}/../android/vulkan_wrapper
                            ${CMAKE_CURRENT_SOURCE_DIR}/../data
                            ${ANDROID_NDK}/sources/third_party/shaderc/include)
    #UTILS_NAME 没有赋值导致target_include_directories的语法错误
    

    修改方法,直接在LunarGSamples/API-Samples/utils/CMakeLists.txt,添加一下内容:

    set(UTILS_NAME "utils") #随意命名,不是空字符串就行
    if(WIN32)
      set(ANDROID_NDK "E:/3.1_Android_IDE/android-ndk-r13b")
    else()
      set(ANDROID_NDK "/home/billyzheng/tool/android-ndk-r13b")
    endif()
    
  • 编译Demo 用Android Studio 导入工程LunarGSamples/API-Samples/android(File > Import project) 编译APK(Build> Build APK)

2. LunarG SDK 介绍

  1. Vulkan Loader:
  2. Validation Layers 分析GPU内存、API参数、多线程API调用、纹理和渲染目标格式等等
  3. Vulkan Trace Tools:

3. 工具使用

3.1 SPIR-V

有三种方式生成SPIR-V

  • Shared tools
  • Single tool set for a single ISV
  • Simplicity

4. API

4.1 概念

4.2 接口

4.3 扩展

Khronos-approved Extensions

  • VK_KHR_android_surface
  • VK_KHR_display
  • VK_KHR_display_swapchain
  • VK_KHR_mir_surface
  • VK_KHR_surface
  • VK_KHR_swapchain
  • VK_KHR_wayland_surface
  • VK_KHR_win32_surface
  • VK_KHR_xcb_surface
  • VK_KHR_xlib_surface

    Multivendor Extensions

  • VK_EXT_debug_marker
  • VK_EXT_debug_report
  • VK_EXT_validation_flags

    AMD Vendor Extensions

  • VK_AMD_draw_indirect_count
  • VK_AMD_gcn_shader
  • VK_AMD_gpu_shader_half_float
  • VK_AMD_negative_viewport_height
  • VK_AMD_rasterization_order
  • VK_AMD_shader_ballot
  • VK_AMD_shader_explicit_vertex_parameter
  • VK_AMD_shader_trinary_minmax

    Imagination Vendor Extensions

  • VK_IMG_filter_cubic
  • VK_IMG_format_pvrtc (Registered, but not currently documented)

    NVIDIA Vendor Extensions

  • VK_NV_dedicated_allocation
  • VK_NV_external_memory
  • VK_NV_external_memory_capabilities
  • VK_NV_external_memory_win32
  • VK_NV_glsl_shader
  • VK_NV_win32_keyed_mutex

5. Samples

  1. 【Khronos】 Vulkan-Samples

6. 参考资料

  1. 【Khronos】官方首页
  2. 【Khronos】Vulkan标准
  3. 【Khronos】SPIR-V 语言
  4. Vulkan in 30 minutes
  5. A Brief Overview Of Vulkan API