├── .gitignore
├── .travis.yml
├── CMakeLists.txt
├── LICENSE
├── Readme.md
├── application
├── CMakeLists.txt
├── SpvCompiler.cpp
├── SpvCompiler.h
├── VApp.cpp
└── VApp.h
├── cmake
├── attach_fg.cmake
├── compilers.cmake
├── download_spirvcross.cmake
└── find_devenv.cmake
├── converter
├── CMakeLists.txt
├── Common.h
├── Generated
│ ├── BuildRawVulkanCalls.h
│ ├── IVulkanListener.h
│ ├── ParseChunk.h
│ ├── ParseChunkImpl.h
│ ├── ParseChunkMap.h
│ ├── ParseValue.h
│ ├── ParseValueImpl.h
│ ├── VkEnumToString.h
│ ├── VkEnumToStringImpl.h
│ ├── VkStructToString.h
│ └── VkStructToStringImpl.h
├── RdCaptureReader.cpp
├── RdCaptureReader.h
├── Utils
│ ├── BasicTypesConverter.h
│ ├── NameSerializer.cpp
│ └── NameSerializer.h
├── Vulkan
│ ├── ResRemapper.cpp
│ ├── ResRemapper.h
│ ├── VulkanConverter.cpp
│ ├── VulkanConverter.h
│ └── VulkanFnToCpp.h
└── main.cpp
├── external
├── CMakeLists.txt
├── FrameGraph
│ ├── .gitignore
│ ├── CMakeLists.txt
│ ├── LICENSE
│ ├── README.md
│ ├── cmake
│ │ ├── compiler_tests.cmake
│ │ ├── compilers.cmake
│ │ ├── download_glfw.cmake
│ │ ├── download_glslang.cmake
│ │ ├── download_sdl2.cmake
│ │ ├── download_stdoptional.cmake
│ │ ├── download_stdstringview.cmake
│ │ ├── download_stdvariant.cmake
│ │ ├── download_vk.cmake
│ │ ├── download_vma.cmake
│ │ ├── main.cpp
│ │ └── project_template.cmake
│ ├── extensions
│ │ ├── framework
│ │ │ ├── CMakeLists.txt
│ │ │ ├── Vulkan
│ │ │ │ ├── VulkanDevice.cpp
│ │ │ │ ├── VulkanDevice.h
│ │ │ │ ├── VulkanDeviceExt.cpp
│ │ │ │ ├── VulkanDeviceExt.h
│ │ │ │ ├── VulkanSurface.cpp
│ │ │ │ ├── VulkanSurface.h
│ │ │ │ ├── VulkanSwapchain.cpp
│ │ │ │ └── VulkanSwapchain.h
│ │ │ └── Window
│ │ │ │ ├── IWindow.h
│ │ │ │ ├── WindowGLFW.cpp
│ │ │ │ ├── WindowGLFW.h
│ │ │ │ ├── WindowSDL2.cpp
│ │ │ │ ├── WindowSDL2.h
│ │ │ │ ├── WindowSFML.cpp
│ │ │ │ └── WindowSFML.h
│ │ └── vulkan_loader
│ │ │ ├── CMakeLists.txt
│ │ │ ├── VulkanCheckError.cpp
│ │ │ ├── VulkanCheckError.h
│ │ │ ├── VulkanLoader.cpp
│ │ │ ├── VulkanLoader.h
│ │ │ ├── fn_vulkan_dev.h
│ │ │ ├── fn_vulkan_inst.h
│ │ │ └── fn_vulkan_lib.h
│ ├── external
│ │ └── CMakeLists.txt
│ └── stl
│ │ ├── Algorithms
│ │ ├── ArrayUtils.h
│ │ ├── Cast.h
│ │ ├── EnumUtils.h
│ │ ├── Hash.h
│ │ ├── StringParser.cpp
│ │ ├── StringParser.h
│ │ └── StringUtils.h
│ │ ├── CMakeLists.txt
│ │ ├── Common.h
│ │ ├── CompileTime
│ │ ├── DefaultType.h
│ │ ├── Hash.h
│ │ ├── Math.h
│ │ ├── TypeList.h
│ │ ├── TypeTraits.h
│ │ └── UMax.h
│ │ ├── Config.h
│ │ ├── Containers
│ │ ├── ArrayView.h
│ │ ├── FixedArray.h
│ │ ├── FixedMap.h
│ │ ├── Iterators.h
│ │ ├── NtStringView.h
│ │ ├── Optional.h
│ │ ├── Ptr.h
│ │ ├── Singleton.h
│ │ ├── StaticString.h
│ │ ├── StringView.h
│ │ ├── StringViewFwd.h
│ │ ├── StructView.h
│ │ └── Union.h
│ │ ├── Defines.h
│ │ ├── Log
│ │ ├── Log.cpp
│ │ └── Log.h
│ │ ├── Math
│ │ ├── BitMath.h
│ │ ├── Bytes.h
│ │ ├── Color.h
│ │ ├── Math.h
│ │ └── Vec.h
│ │ ├── Memory
│ │ ├── LinearAllocator.h
│ │ ├── MemUtils.h
│ │ └── UntypedAllocator.h
│ │ ├── Platforms
│ │ └── WindowsHeader.h
│ │ └── Stream
│ │ ├── FileStream.cpp
│ │ ├── FileStream.h
│ │ ├── Stream.cpp
│ │ └── Stream.h
├── RenderDoc
│ ├── LICENSE.md
│ ├── vk_common.h
│ └── vk_resources.h
├── miniz
│ ├── CMakeLists.txt
│ ├── LICENSE
│ ├── miniz.c
│ ├── miniz.h
│ ├── miniz_common.h
│ ├── miniz_tdef.c
│ ├── miniz_tdef.h
│ ├── miniz_tinfl.c
│ ├── miniz_tinfl.h
│ ├── miniz_zip.c
│ ├── miniz_zip.h
│ └── readme.md
└── rapidxml
│ ├── license.txt
│ ├── manual.html
│ ├── rapidxml.hpp
│ ├── rapidxml_iterators.hpp
│ ├── rapidxml_print.hpp
│ └── rapidxml_utils.hpp
├── generator
├── CMakeLists.txt
├── GenChunkParser.cpp
├── GenEnumToString.cpp
├── GenFormatHelpers.cpp
├── GenListenerInterface.cpp
├── GenRawVulkanCalls.cpp
├── GenStructToString.cpp
├── GenStructTypeHelpers.cpp
├── Generator.cpp
├── Generator.h
├── HeaderParser.cpp
├── MarkRequiredTypes.cpp
├── StringParser.cpp
└── StringParser.h
└── tests
└── application
├── CMakeLists.txt
└── main.cpp
/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /external/SPIRV-Cross
3 | /_output
4 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | matrix:
2 | include:
3 |
4 | # Windows MSVC x64
5 | - os: windows
6 | name: Win64 VC2017
7 | language: cpp
8 | before_install:
9 | - choco install python2
10 | - export PATH="/c/Python27:/c/Python27/Scripts:$PATH"
11 | script:
12 | - mkdir -p build
13 | - cd build
14 | - cmake -G "Visual Studio 15 2017 Win64" -T v141 ..
15 | - cmake --build . --config Release
16 |
17 | # Windows MSVC x64 Debug
18 | - os: windows
19 | name: Win64 VC2017 Debug
20 | language: cpp
21 | before_install:
22 | - choco install python2
23 | - export PATH="/c/Python27:/c/Python27/Scripts:$PATH"
24 | script:
25 | - mkdir -p build
26 | - cd build
27 | - cmake -G "Visual Studio 15 2017 Win64" -T v141 ..
28 | - cmake --build . --config Debug
29 |
--------------------------------------------------------------------------------
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10.0 )
2 |
3 | message( STATUS "==========================================================================\n" )
4 | message( STATUS "project 'RDCtoVkCpp' generation started" )
5 |
6 | project( "RDCtoVkCpp" LANGUAGES C CXX )
7 | set_property( GLOBAL PROPERTY USE_FOLDERS ON )
8 | message( STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} (${CMAKE_CXX_COMPILER_VERSION})" )
9 | message( STATUS "Compiler name: ${DETECTED_COMPILER}" )
10 | message( STATUS "target system: ${CMAKE_SYSTEM_NAME} (${CMAKE_SYSTEM_VERSION})" )
11 | message( STATUS "host system: ${CMAKE_HOST_SYSTEM_NAME} (${CMAKE_HOST_SYSTEM_VERSION})" )
12 |
13 | set( RDE_ENABLE_SPIRVCROSS ON CACHE BOOL "" )
14 | set( RDE_ENABLE_SPIRVREFLECT OFF CACHE BOOL "" )
15 |
16 | include( "cmake/compilers.cmake" )
17 | add_subdirectory( "external" "external" )
18 | add_subdirectory( "generator" )
19 | add_subdirectory( "converter" )
20 | add_subdirectory( "application" )
21 | add_subdirectory( "tests/application" )
22 |
23 | message( STATUS "project 'RDCtoVkCpp' generation ended" )
24 | message( STATUS "\n==========================================================================" )
25 |
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018-2020 Zhirnov Andrey
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | [](https://travis-ci.com/azhirnov/RDCtoVkCpp)
2 |
3 | Converts RenderDoc Vulkan capture to compilable and executable C++ code.
4 | Work in progress.
5 |
6 |
7 | ## How to use
8 | 1. Export RenderDoc capture to XML + ZIP.
9 | 2. Build RDCtoVkCpp or use prebuild binaries.
10 | 3. Run console application `RdConverter.exe` with ```-i path/to/exported/rdc.zip -o folder/name/for/cpp/code```
11 |
12 | Other command line arguments:
13 | ```
14 | -h, --help - show help
15 | --build - build project
16 | --configure - generate project
17 | --clean - clean output folder before converting
18 | --div-by-cmdbuf [bool] - group api calls by command buffers, default = true
19 | -i, --input [filename] - open RenderDoc capture, must be *.zip or *.zip.xml file
20 | -o, --output [folder] - save c++ code into output directory
21 | ```
22 | Warning: console application and converted sources from capture is not portable!
23 | You should rebuild and run converter again on new environment or fix pathes to files.
24 |
25 |
26 | ## Features
27 | * Produces readable C++ code.
28 | * Code validation to fix unsignaled fences/semaphores/events and reset they before next frame.
29 | * Frame played in infinite loop.
30 | * Used resource debug name if possible.
31 | * SPIR-V decompiled to GLSL.
32 | * Resizable window.
33 |
34 |
35 | ## Tested on
36 | * [x] Doom (2016)
37 | * [ ] Wolfenstein 2 - incorrect rendering
38 | * [ ] X4 - incorrect rendering
39 | * [x] Dota 2
40 | * [ ] Rage 2 - incorrect rendering
41 | * [ ] RDR 2 - incorrect rendering
42 | * [ ] 3DMark api overhead test
43 | * [ ] No Man's Sky
44 |
45 |
46 | ## TODO
47 | * Immutable samplers
48 | * Measure frame time
49 | * Portability (remap queue family and memory types)
50 | * Upload multisampled image
51 | * Sparse memory
52 | * 2nd plane formats
53 | * Fix validation errors.
54 |
55 |
56 | ## Building
57 | Requires C++17 and CMake 3.10+
58 |
59 | Dependencies:
60 | [FrameGraph](https://github.com/azhirnov/FrameGraph) - only stl and vulkan helpers.
61 | [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator) - required.
62 | [glfw](https://github.com/glfw/glfw) or [SDL2](https://www.libsdl.org) - required.
63 | [glslang](https://github.com/KhronosGroup/glslang) - compile glsl to spirv.
64 | [SPIRV-Cross](https://github.com/KhronosGroup/SPIRV-Cross) - converts spirv to glsl.
65 | [rapidxml](https://github.com/dwd/rapidxml) - for RDC parsing.
66 | [miniz](https://github.com/richgel999/miniz) - for RDC content loading.
67 | [RenderDoc](https://github.com/baldurk/renderdoc) - some code to generate parser.
68 |
--------------------------------------------------------------------------------
/application/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | file( GLOB_RECURSE SOURCES "*.*" )
4 | add_library( "Application" STATIC ${SOURCES} )
5 | source_group( TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} )
6 |
7 | target_link_libraries( "Application" PUBLIC "GLSLang-lib" )
8 | target_link_libraries( "Application" PRIVATE "VMA-lib" )
9 | target_link_libraries( "Application" PRIVATE "MiniZ" )
10 | target_link_libraries( "Application" PUBLIC "STL" "VulkanLoader" "Framework" )
11 | target_include_directories( "Application" PRIVATE "../external/RenderDoc" )
12 | target_include_directories( "Application" PUBLIC "." )
13 |
--------------------------------------------------------------------------------
/application/SpvCompiler.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "SpvCompiler.h"
4 | #include "stl/Algorithms/StringUtils.h"
5 |
6 | // glslang includes
7 | #include "glslang/Include/revision.h"
8 | #include "glslang/MachineIndependent/localintermediate.h"
9 | #include "glslang/Include/intermediate.h"
10 | #include "SPIRV/doc.h"
11 | #include "SPIRV/disassemble.h"
12 | #include "SPIRV/GlslangToSpv.h"
13 | #include "SPIRV/GLSL.std.450.h"
14 | #include "StandAlone/ResourceLimits.cpp"
15 |
16 | using namespace glslang;
17 |
18 | namespace AppDetail
19 | {
20 |
21 | SpvCompiler::SpvCompiler ()
22 | {
23 | glslang::InitializeProcess();
24 | }
25 |
26 | SpvCompiler::~SpvCompiler ()
27 | {
28 | glslang::FinalizeProcess();
29 | }
30 |
31 | bool SpvCompiler::Compile (OUT Array& spirvData,
32 | const char * source,
33 | EShLanguage shaderType,
34 | EShTargetLanguageVersion spvVersion) const
35 | {
36 | EShMessages messages = EShMsgDefault;
37 | TProgram program;
38 | TShader shader { shaderType };
39 | EshTargetClientVersion client_version = EShTargetVulkan_1_1;
40 | TBuiltInResource builtin_res = DefaultTBuiltInResource;
41 | char const* shader_src[] = { source };
42 |
43 | shader.setStrings( shader_src, int(CountOf(shader_src)) );
44 | shader.setEntryPoint( "main" );
45 | shader.setEnvInput( EShSourceGlsl, shaderType, EShClientVulkan, 110 );
46 | shader.setEnvClient( EShClientVulkan, client_version );
47 | shader.setEnvTarget( EshTargetSpv, spvVersion );
48 |
49 | shader.setAutoMapLocations( false );
50 | shader.setAutoMapBindings( false );
51 |
52 | if ( not shader.parse( &builtin_res, 460, ECoreProfile, false, true, messages ) )
53 | {
54 | FG_LOGI( shader.getInfoLog() );
55 | return false;
56 | }
57 |
58 | program.addShader( &shader );
59 |
60 | if ( not program.link( messages ) )
61 | {
62 | FG_LOGI( program.getInfoLog() );
63 | return false;
64 | }
65 |
66 | const TIntermediate* intermediate = program.getIntermediate( shader.getStage() );
67 | if ( not intermediate )
68 | return false;
69 |
70 | SpvOptions spv_options;
71 | spv::SpvBuildLogger logger;
72 |
73 | spv_options.generateDebugInfo = true;
74 | spv_options.disableOptimizer = true;
75 | spv_options.optimizeSize = false;
76 |
77 | spirvData.clear();
78 | GlslangToSpv( *intermediate, OUT spirvData, &logger, &spv_options );
79 |
80 | if ( spirvData.empty() )
81 | return false;
82 |
83 | return true;
84 | }
85 |
86 | } // AppDetail
87 |
--------------------------------------------------------------------------------
/application/SpvCompiler.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "framework/Vulkan/VulkanDevice.h"
6 | #include "stl/Algorithms/ArrayUtils.h"
7 |
8 | // glslang includes
9 | #include "glslang/Public/ShaderLang.h"
10 |
11 | namespace AppDetail
12 | {
13 | using namespace FGC;
14 |
15 |
16 | class SpvCompiler
17 | {
18 | public:
19 | SpvCompiler ();
20 | ~SpvCompiler ();
21 |
22 | bool Compile (OUT Array& spirvData,
23 | const char * source,
24 | EShLanguage shaderType,
25 | glslang::EShTargetLanguageVersion spvVersion = glslang::EShTargetSpv_1_3) const;
26 | };
27 |
28 | } // AppDetail
29 |
--------------------------------------------------------------------------------
/cmake/attach_fg.cmake:
--------------------------------------------------------------------------------
1 | # find and attach FrameGraph
2 |
3 | set( RDE_FRAMEGRAPH_PATH "${RDE_EXTERNALS_PATH}/FrameGraph" CACHE PATH "Path to FrameGraph library" )
4 | message( STATUS "RDE_FRAMEGRAPH_PATH: ${RDE_FRAMEGRAPH_PATH}" )
5 |
6 | if (NOT EXISTS "${RDE_FRAMEGRAPH_PATH}/CMakeLists.txt")
7 | message( FATAL_ERROR "RDE_FRAMEGRAPH_PATH with \"${RDE_FRAMEGRAPH_PATH}\" doesn't contains correct path to FrameGraph source!" )
8 | endif ()
9 |
10 | add_subdirectory( "${RDE_FRAMEGRAPH_PATH}" "build-FrameGraph" )
11 |
12 | set_property( TARGET "STL" PROPERTY FOLDER "External" )
13 | set_property( TARGET "VulkanLoader" PROPERTY FOLDER "External" )
14 | set_property( TARGET "Framework" PROPERTY FOLDER "External" )
15 |
16 | if (${FG_ENABLE_GLFW})
17 | set_property( TARGET "uninstall" PROPERTY FOLDER "External" )
18 | endif ()
19 |
20 | set( RDE_CONVERTER_LIBRARIES "${RDE_CONVERTER_LIBRARIES}" "STL" "VulkanLoader" )
21 | set( RDE_ENGINE_LIBRARIES "${RDE_ENGINE_LIBRARIES}" "STL" "VulkanLoader" "Framework" )
22 |
23 |
24 | set( RDE_ENGINE_DEFINES "${RDE_ENGINE_DEFINES}" "RDE_FRAMEGRAPH_PATH=\"${RDE_FRAMEGRAPH_PATH}\"" "RDE_FRAMEGRAPH_EXTERNAL_PATH=\"${RDE_FRAMEGRAPH_PATH}/extensions\"" )
25 |
--------------------------------------------------------------------------------
/cmake/download_spirvcross.cmake:
--------------------------------------------------------------------------------
1 | # download and install SPIRV-Cross
2 |
3 | if (${RDE_ENABLE_SPIRVCROSS})
4 | set( RDE_EXTERNAL_SPIRVCROSS_PATH "" CACHE PATH "path to SPIRV-Cross source" )
5 | set( SPIRVCROSS_INSTALL_DIR "${RDE_EXTERNAL_INSTALL_DIR}/SPIRV-Cross" CACHE INTERNAL "" FORCE )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${RDE_EXTERNAL_SPIRVCROSS_PATH}/include/spirv_cross")
9 | message( STATUS "SPIRV-Cross is not found in \"${RDE_EXTERNAL_SPIRVCROSS_PATH}\"" )
10 | set( RDE_EXTERNAL_SPIRVCROSS_PATH "${RDE_EXTERNALS_PATH}/SPIRV-Cross" CACHE PATH "" FORCE )
11 | set( RDE_SPIRVCROSS_REPOSITORY "https://github.com/KhronosGroup/SPIRV-Cross.git" )
12 | else ()
13 | set( RDE_SPIRVCROSS_REPOSITORY "" )
14 | endif ()
15 |
16 |
17 | ExternalProject_Add( "External.SPIRV-Cross"
18 | LIST_SEPARATOR "${RDE_LIST_SEPARATOR}"
19 | # download
20 | GIT_REPOSITORY ${RDE_SPIRVCROSS_REPOSITORY}
21 | GIT_TAG master
22 | EXCLUDE_FROM_ALL 1
23 | LOG_DOWNLOAD 1
24 | # update
25 | PATCH_COMMAND ""
26 | UPDATE_DISCONNECTED 1
27 | # configure
28 | SOURCE_DIR "${RDE_EXTERNAL_SPIRVCROSS_PATH}"
29 | CMAKE_GENERATOR "${CMAKE_GENERATOR}"
30 | CMAKE_GENERATOR_PLATFORM "${CMAKE_GENERATOR_PLATFORM}"
31 | CMAKE_GENERATOR_TOOLSET "${CMAKE_GENERATOR_TOOLSET}"
32 | CMAKE_ARGS "-DCMAKE_CONFIGURATION_TYPES=${RDE_EXTERNAL_CONFIGURATION_TYPES}"
33 | "-DCMAKE_SYSTEM_VERSION=${CMAKE_SYSTEM_VERSION}"
34 | "-DCMAKE_DEBUG_POSTFIX=d"
35 | "-DCMAKE_RELEASE_POSTFIX="
36 | "-DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS=ON"
37 | "-DCMAKE_INSTALL_PREFIX=${SPIRVCROSS_INSTALL_DIR}"
38 | ${RDE_BUILD_TARGET_FLAGS}
39 | LOG_CONFIGURE 1
40 | # build
41 | BINARY_DIR "${CMAKE_BINARY_DIR}/build2-SPIRV-Cross"
42 | BUILD_COMMAND "${CMAKE_COMMAND}"
43 | --build .
44 | --target ALL_BUILD
45 | --config $
46 | LOG_BUILD 1
47 | # install
48 | INSTALL_DIR "${SPIRVCROSS_INSTALL_DIR}"
49 | LOG_INSTALL 1
50 | # test
51 | TEST_COMMAND ""
52 | )
53 |
54 | set_property( TARGET "External.SPIRV-Cross" PROPERTY FOLDER "External" )
55 |
56 |
57 | add_library( "SPIRV-Cross-lib" INTERFACE )
58 | set_property( TARGET "SPIRV-Cross-lib" PROPERTY INTERFACE_LINK_LIBRARIES
59 | $<$: "${SPIRVCROSS_INSTALL_DIR}/lib/spirv-cross-core${CMAKE_STATIC_LIBRARY_SUFFIX}" >
60 | $<$: "${SPIRVCROSS_INSTALL_DIR}/lib/spirv-cross-glsl${CMAKE_STATIC_LIBRARY_SUFFIX}" >
61 | $<$: "${SPIRVCROSS_INSTALL_DIR}/lib/spirv-cross-cored${CMAKE_STATIC_LIBRARY_SUFFIX}" >
62 | $<$: "${SPIRVCROSS_INSTALL_DIR}/lib/spirv-cross-glsld${CMAKE_STATIC_LIBRARY_SUFFIX}" >)
63 | target_include_directories( "SPIRV-Cross-lib" INTERFACE "${SPIRVCROSS_INSTALL_DIR}/include" )
64 | target_compile_definitions( "SPIRV-Cross-lib" INTERFACE "RDE_ENABLE_SPIRVCROSS" )
65 | add_dependencies( "SPIRV-Cross-lib" "External.SPIRV-Cross" )
66 |
67 | endif ()
68 |
--------------------------------------------------------------------------------
/cmake/find_devenv.cmake:
--------------------------------------------------------------------------------
1 | # search for visual studio devenv.exe
2 |
3 | if (WIN32)
4 | set( VS_VERSIONS "2019/Community" "2019/Professional" "2019/Enterprise"
5 | "2017/Community" "2017/Professional" "2017/Enterprise"
6 | "2015/Community" "2015/Professional" "2015/Enterprise" )
7 |
8 | foreach( VER ${VS_VERSIONS} )
9 | if (EXISTS "C:/Program Files (x86)/Microsoft Visual Studio/${VER}/Common7/IDE/devenv.exe")
10 | set( RDE_VS_DEVENV_EXE "C:/Program Files (x86)/Microsoft Visual Studio/${VER}/Common7/IDE/devenv.exe" CACHE INTERNAL "" FORCE )
11 | break()
12 | endif ()
13 | endforeach ()
14 |
15 | if (RDE_VS_DEVENV_EXE)
16 | message( STATUS "Found VS compiler in '${RDE_VS_DEVENV_EXE}'" )
17 | endif ()
18 | endif ()
19 |
--------------------------------------------------------------------------------
/converter/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | file( GLOB_RECURSE SOURCES "*.*" )
4 | add_executable( "RdConverter" ${SOURCES} )
5 | source_group( TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} )
6 | target_link_libraries( "RdConverter" PUBLIC "ProjectTemplate" )
7 | target_include_directories( "RdConverter" PUBLIC ".." )
8 | set_property( TARGET "RdConverter" PROPERTY FOLDER "" )
9 |
10 | target_include_directories( "RdConverter" PUBLIC "${RDE_FRAMEGRAPH_PATH}/external/Vulkan-Headers/include" )
11 | target_include_directories( "RdConverter" PUBLIC "${RDE_EXTERNALS_PATH}/rapidxml" )
12 | target_include_directories( "RdConverter" PUBLIC ".." "." )
13 | target_link_libraries( "RdConverter" PUBLIC "STL" )
14 | target_link_libraries( "RdConverter" PUBLIC "SPIRV-Cross-lib" )
15 | target_link_libraries( "RdConverter" PUBLIC "MiniZ" )
16 |
17 | target_compile_definitions( "RdConverter" PUBLIC "RDE_SOURCE_PATH=\"${CMAKE_CURRENT_SOURCE_DIR}/..\"" )
18 | target_compile_definitions( "RdConverter" PUBLIC "RDE_FRAMEGRAPH_PATH=\"${RDE_FRAMEGRAPH_PATH}\"" )
19 | target_compile_definitions( "RdConverter" PUBLIC "RDE_VS_DEVENV_EXE=\"${RDE_VS_DEVENV_EXE}\"" )
20 |
21 | if (MSVC)
22 | set_property( DIRECTORY PROPERTY VS_STARTUP_PROJECT "RdConverter" )
23 | target_compile_options( "RdConverter" PUBLIC $<$: /bigobj > )
24 | endif ()
25 |
--------------------------------------------------------------------------------
/converter/Common.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 | #include "stl/Stream/FileStream.h"
7 | #include "stl/Algorithms/StringUtils.h"
8 |
9 | #define VK_NO_PROTOTYPES
10 | #include "vulkan/vulkan.h"
11 |
12 | #include
13 |
14 | namespace RDE
15 | {
16 | using namespace FGC;
17 | namespace FS = std::filesystem;
18 |
19 | using EResourceType = VkObjectType;
20 | using VkResourceID = uint64_t;
21 | //enum VkResourceID : uint64_t {}; // TODO
22 |
23 | enum class ContentID : uint
24 | {
25 | Unknown = ~0u
26 | };
27 |
28 |
29 | struct ImageLayouts
30 | {
31 | struct ImageRegionState
32 | {
33 | uint dstQueueFamilyIndex;
34 | VkImageSubresourceRange subresourceRange;
35 | VkImageLayout oldLayout;
36 | VkImageLayout newLayout;
37 | };
38 |
39 | VkResourceID imageId;
40 | uint queueFamilyIndex;
41 | Array subresourceStates;
42 | uint layerCount;
43 | uint levelCount;
44 | uint sampleCount;
45 | VkExtent3D extent;
46 | VkFormat format;
47 | };
48 |
49 |
50 | } // RDE
51 |
--------------------------------------------------------------------------------
/converter/Utils/BasicTypesConverter.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "Common.h"
6 | #include
7 |
8 | namespace RDE
9 | {
10 |
11 | //
12 | // Float/Int Value
13 | //
14 |
15 | struct FIValue
16 | {
17 | union {
18 | float f;
19 | int i;
20 | uint u;
21 | };
22 |
23 | FIValue () : i{0} {}
24 | FIValue (float val) : f{val} {}
25 | FIValue (int val) : i{val} {}
26 | FIValue (uint val) : u{val} {}
27 | };
28 |
29 |
30 | /*
31 | =================================================
32 | BoolToString
33 | =================================================
34 | */
35 | ND_ inline String BoolToString (VkBool32 value)
36 | {
37 | return value ? "true" : "false";
38 | }
39 |
40 | /*
41 | =================================================
42 | HexToString
43 | =================================================
44 | */
45 | template
46 | ND_ inline String HexToString (const T &value)
47 | {
48 | auto ivalue = BitCast< NearUInt >( value );
49 |
50 | std::stringstream str;
51 | str << "0x" << std::hex << ivalue;
52 |
53 | if constexpr ( IsSameTypes< T, uint32_t > or (IsPointer and sizeof(T) == sizeof(uint32_t)) )
54 | str << 'u';
55 | else if constexpr ( IsSameTypes< T, uint64_t > or (IsPointer and sizeof(T) == sizeof(uint64_t)) )
56 | str << "ull";
57 | else if constexpr ( IsSameTypes< T, int64_t > )
58 | str << "ll";
59 |
60 | return str.str();
61 | }
62 |
63 | /*
64 | =================================================
65 | IntToString
66 | =================================================
67 | */
68 | template
69 | ND_ inline EnableIf, String> IntToString (const T &value)
70 | {
71 | String str = ToString( value );
72 |
73 | if constexpr ( IsSameTypes< T, uint32_t > )
74 | str << 'u';
75 | else if constexpr ( IsSameTypes< T, uint64_t > )
76 | str << "ull";
77 | else if constexpr ( IsSameTypes< T, int64_t > )
78 | str << "ll";
79 |
80 | return str;
81 | }
82 |
83 | /*
84 | =================================================
85 | FloatToString
86 | =================================================
87 | */
88 | ND_ inline String FloatToString (float value)
89 | {
90 | if ( std::isnan( value ))
91 | FG_LOGD( "Converting NaN to string" );
92 |
93 | return ToString( value ) << 'f';
94 | }
95 |
96 | ND_ inline String DoubleToString (double value)
97 | {
98 | if ( std::isnan( value ))
99 | FG_LOGD( "Converting NaN to string" );
100 |
101 | return ToString( value );
102 | }
103 |
104 | /*
105 | =================================================
106 | WCharToString
107 | =================================================
108 | */
109 | # ifdef VULKAN_WIN32_H_
110 | ND_ inline String WCharToString (LPCWSTR str)
111 | {
112 | STATIC_ASSERT( sizeof(str[0]) == 2 ); // 2 bytes in wchar
113 |
114 | std::wstring_view ws{str};
115 | String result = "L\"";
116 | char buf[] = "\\x0000";
117 |
118 | for (auto& w : ws)
119 | {
120 | buf[2] = char((w >> 12) & 0xF);
121 | buf[3] = char((w >> 8) & 0xF);
122 | buf[4] = char((w >> 4) & 0xF);
123 | buf[5] = char((w) & 0xF);
124 |
125 | result << buf;
126 | }
127 | result << "\"";
128 |
129 | return result;
130 | }
131 | # endif
132 |
133 | /*
134 | =================================================
135 | EnumToString
136 | =================================================
137 | */
138 | template
139 | ND_ inline String EnumToString (const T &value)
140 | {
141 | return ToString( BitCast>( value ));
142 | }
143 |
144 | /*
145 | =================================================
146 | VoidToFIValueString
147 | =================================================
148 | */
149 | ND_ inline String VoidToFIValueString (const void *data, size_t offset)
150 | {
151 | FIValue value;
152 | memcpy( &value, static_cast(data) + offset, sizeof(value) );
153 |
154 | String fstr = FloatToString( value.f );
155 | String ustr = HexToString( value.u );
156 |
157 | if ( not std::isfinite( value.f ) or fstr.length() > ustr.length()+4 )
158 | return ustr;
159 | else
160 | return fstr;
161 | }
162 |
163 | /*
164 | =================================================
165 | ConvertToCStyleString
166 | =================================================
167 | */
168 | ND_ inline String ConvertToCStyleString (StringView str)
169 | {
170 | String result;
171 | result.reserve( str.length() + 10 );
172 |
173 | for (const char c : str)
174 | {
175 | switch ( c ) {
176 | case '\\' : result << '\\' << '\\'; break;
177 | case '"' : result << '\\' << '\"'; break;
178 | default : result << c; break;
179 | }
180 | }
181 |
182 | return result;
183 | }
184 |
185 |
186 | } // RDE
187 |
--------------------------------------------------------------------------------
/converter/Utils/NameSerializer.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "NameSerializer.h"
4 |
5 | namespace RDE
6 | {
7 |
8 | /*
9 | =================================================
10 | Get
11 | =================================================
12 | */
13 | String NameSerializer::Get (const void *ptr) const
14 | {
15 | if ( ptr == null )
16 | return "null";
17 |
18 | auto iter = _usedNames.find( ptr );
19 | if ( iter != _usedNames.end() )
20 | return iter->second;
21 |
22 | //ASSERT(false);
23 | return "null";
24 | }
25 |
26 | /*
27 | =================================================
28 | GetPtr
29 | =================================================
30 | */
31 | String NameSerializer::GetPtr (const void *ptr) const
32 | {
33 | if ( ptr == null )
34 | return "null";
35 |
36 | auto iter = _usedNames.find( ptr );
37 | if ( iter != _usedNames.end() )
38 | return "&"s << iter->second;
39 |
40 | //ASSERT(false);
41 | return "null";
42 | }
43 |
44 | /*
45 | =================================================
46 | MakeUnique
47 | =================================================
48 | */
49 | String NameSerializer::MakeUnique (const void *ptr, String &&var0, String &&var1, String &&var2)
50 | {
51 | ASSERT( _usedNames.count(ptr) == 0 );
52 | ASSERT( ptr );
53 | ASSERT( not var0.empty() );
54 | //ASSERT( var0.length() > var1.length() );
55 | ASSERT( var1.length() >= var2.length() );
56 |
57 | uint matches = 0;
58 |
59 | _MakeUnique( INOUT var0, OUT matches );
60 |
61 | // TODO
62 | //_MakeUnique( INOUT var1, OUT matches );
63 | //_MakeUnique( INOUT var2, OUT matches );
64 |
65 | _usedNames.insert({ ptr, var0 });
66 | _unique.insert( var0 );
67 |
68 | return var0;
69 | }
70 |
71 | /*
72 | =================================================
73 | ReserveName
74 | =================================================
75 | */
76 | bool NameSerializer::ReserveName (String &&name)
77 | {
78 | CHECK_ERR( _unique.insert( std::move(name) ).second );
79 | return true;
80 | }
81 |
82 | /*
83 | =================================================
84 | _MakeUnique
85 | =================================================
86 | */
87 | inline void NameSerializer::_MakeUnique (INOUT String &name, OUT uint &matches) const
88 | {
89 | matches = 0;
90 |
91 | if ( _unique.find( name ) == _unique.end() )
92 | return;
93 |
94 | // validate name
95 | DEBUG_ONLY(
96 | for (auto& c : name) {
97 | ASSERT( (c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z') or (c == '_') or (&c != name.data() and c >= '0' and c <= '9') );
98 | })
99 |
100 | const size_t len = name.length();
101 |
102 | for (matches = 1; matches < 1000; ++matches)
103 | {
104 | name.resize( len );
105 | name << "_" << ToString(matches);
106 |
107 | if ( _unique.find( name ) == _unique.end() )
108 | return;
109 | }
110 | }
111 |
112 | /*
113 | =================================================
114 | Clear
115 | =================================================
116 | */
117 | void NameSerializer::Clear ()
118 | {
119 | _usedNames.clear();
120 | _unique.clear();
121 | }
122 |
123 |
124 | } // RDE
125 |
--------------------------------------------------------------------------------
/converter/Utils/NameSerializer.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "Common.h"
6 |
7 | namespace RDE
8 | {
9 |
10 | //
11 | // Name Serializer
12 | //
13 |
14 | class NameSerializer
15 | {
16 | // types
17 | private:
18 | using NameMap_t = HashMap< const void*, String >;
19 | using UniqueNames_t = HashSet< String >;
20 |
21 |
22 | // variables
23 | private:
24 | NameMap_t _usedNames;
25 | UniqueNames_t _unique;
26 |
27 |
28 | // methods
29 | public:
30 | NameSerializer () {}
31 | NameSerializer (NameSerializer &&) = default;
32 | NameSerializer (const NameSerializer &) = delete;
33 |
34 | ND_ String Get (const void *ptr) const;
35 | ND_ String GetPtr (const void *ptr) const;
36 |
37 | ND_ String MakeUnique (const void *ptr, String &&var0, String &&var1 = Default, String &&var2 = Default);
38 |
39 | void Clear ();
40 |
41 | bool ReserveName (String &&name);
42 |
43 |
44 | private:
45 | void _MakeUnique (INOUT String &name, OUT uint &matches) const;
46 | };
47 |
48 |
49 | } // RDE
50 |
--------------------------------------------------------------------------------
/converter/Vulkan/ResRemapper.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "Common.h"
6 |
7 | namespace RDE
8 | {
9 |
10 | //
11 | // Resource Remapper
12 | //
13 |
14 | struct ResRemapper
15 | {
16 | // types
17 | private:
18 | struct ResInfo
19 | {
20 | String name;
21 | String dbgName;
22 | uint firstChunk = UMax;
23 | mutable uint lastChunk = 0;
24 | uint64_t uniqueIndex = UMax;
25 | bool destroyed = true;
26 | };
27 | using ResourceMap_t = HashMap< VkResourceID, Deque >;
28 |
29 | struct ResType
30 | {
31 | ResourceMap_t map;
32 | uint counter = 0;
33 | };
34 | using Resources_t = HashMap< EResourceType, ResType >;
35 |
36 | using UniqueNames_t = HashSet< String >;
37 |
38 |
39 | // variables
40 | private:
41 | Resources_t _resources;
42 | uint _currentChunkIndex;
43 | UniqueNames_t _uniqueDbgNames;
44 |
45 |
46 | // methods
47 | public:
48 | ResRemapper ();
49 |
50 | bool CreateResource (EResourceType type, VkResourceID id, uint chunkIndex);
51 | bool DestroyResource (EResourceType type, VkResourceID id, uint chunkIndex);
52 | bool SetDebugName (EResourceType type, VkResourceID id, uint chunkIndex, StringView name);
53 | bool SetDebugName (VkResourceID id, uint chunkIndex, StringView name);
54 |
55 | ND_ uint64_t GetResourceUID (EResourceType type, VkResourceID id, uint chunkIndex) const;
56 | ND_ String GetResource (EResourceType type, VkResourceID id, bool edit = false) const;
57 | ND_ String GetResourceName (EResourceType type, VkResourceID id) const;
58 |
59 | ND_ bool IsResourceAlive (EResourceType type, VkResourceID id, uint chunkIndex) const;
60 | ND_ uint64_t GetAliveResourceUID (EResourceType type, VkResourceID id) const;
61 | ND_ String GetAliveResource (EResourceType type, VkResourceID id, bool edit = false) const;
62 | ND_ uint2 GetResourceLiveRange (EResourceType type, VkResourceID id, uint chunkIndex) const;
63 |
64 | void SetCurrentPos (uint chunkIndex)
65 | {
66 | _currentChunkIndex = chunkIndex;
67 | }
68 |
69 | template
70 | ND_ String operator () (EResourceType type, const T &resourceId, bool edit = false) const
71 | {
72 | STATIC_ASSERT( IsPointer or IsSameTypes );
73 |
74 | return GetResource( type, VkResourceID(resourceId), edit );
75 | }
76 |
77 | void ReplaceNames (INOUT String &str) const;
78 | void GetResourceIDs (StringView indent, OUT String &str) const;
79 |
80 | ND_ String GetResourceCount () const;
81 | };
82 |
83 |
84 | } // RDE
85 |
--------------------------------------------------------------------------------
/converter/Vulkan/VulkanConverter.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "Common.h"
6 | #include "Generated/IVulkanListener.h"
7 |
8 | namespace RDE
9 | {
10 | struct ConverterConfig
11 | {
12 | bool divideByCmdBuffers = true;
13 | bool compile = false;
14 | bool configure = false;
15 | bool cleanOutputFolder = false;
16 | };
17 |
18 |
19 | //
20 | // Vulkan Converter
21 | //
22 |
23 | class VulkanConverter
24 | {
25 | // variables
26 | private:
27 | SharedPtr< IVulkanListener > _listener;
28 |
29 | const FS::path _outFolder;
30 |
31 |
32 | // methods
33 | public:
34 | explicit VulkanConverter (const FS::path &folder, const ConverterConfig &cfg);
35 |
36 | void Flush ();
37 |
38 | ND_ SharedPtr GetListener () const { return _listener; }
39 | };
40 |
41 |
42 | } // RDE
43 |
--------------------------------------------------------------------------------
/converter/Vulkan/VulkanFnToCpp.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "Common.h"
6 | #include "Generated/IVulkanListener.h"
7 |
8 | namespace RDE
9 | {
10 |
11 | //
12 | // Convert to Raw Vulkan API
13 | //
14 |
15 | class VulkanFnToCpp : public IVulkanListener
16 | {
17 | // variables
18 | protected:
19 | const StringView indent = "\t\t";
20 | String result;
21 | String before;
22 | NameSerializer nameSer;
23 | ResRemapper remapper;
24 |
25 |
26 | // methods
27 | protected:
28 | VulkanFnToCpp () {}
29 |
30 | virtual void FlushCommandBuffer (VkCommandBuffer) = 0;
31 | virtual void FlushQueue (VkQueue) = 0;
32 | virtual void FlushGlobal () = 0;
33 |
34 | # include "Generated/BuildRawVulkanCalls.h"
35 | };
36 |
37 |
38 | } // RDE
39 |
--------------------------------------------------------------------------------
/converter/main.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "RdCaptureReader.h"
4 | #include "Vulkan/VulkanConverter.h"
5 | #include
6 |
7 |
8 | using namespace RDE;
9 |
10 | static const char s_Help[] = R"#(
11 | -i [filename] - open RenderDoc capture, must be *.zip or *.zip.xml file
12 | --input [filename]
13 |
14 | -o [folder] - save c++ code into output directory
15 | --output [folder]
16 |
17 | --div-by-cmdbuf [bool] - (optional) group api calls by command buffers, default = true
18 |
19 | --build - (optional) generate project and build, default = false
20 |
21 | --configure - (optional) generate project without building, default = false
22 |
23 | --clean - (optional) clean output folder before converting
24 | )#";
25 |
26 | int main (int argc, const char** argv)
27 | {
28 | String input;
29 | String output;
30 | ConverterConfig cfg;
31 |
32 | // parse arguments
33 | for (int i = 1; i < argc; ++i)
34 | {
35 | StringView curr = argv[i];
36 |
37 | // 'open RDC' command
38 | if ( curr == "-i" or curr == "--input" )
39 | {
40 | if ( i+1 >= argc )
41 | {
42 | std::cout << "'--input' requires file or folder name" << std::endl;
43 | return -1;
44 | }
45 |
46 | input = argv[++i];
47 | continue;
48 | }
49 |
50 | // 'set output directory' command
51 | if ( curr == "-o" or curr == "--output" )
52 | {
53 | if ( i+1 >= argc )
54 | {
55 | std::cout << "'--output' requires folder name" << std::endl;
56 | return -1;
57 | }
58 |
59 | output = argv[++i];
60 | continue;
61 | }
62 |
63 | // show help
64 | if ( curr == "-h" or curr == "--help" )
65 | {
66 | std::cout << s_Help << std::endl;
67 | return 0;
68 | }
69 |
70 | if ( curr == "--div-by-cmdbuf" )
71 | {
72 | if ( i+1 >= argc )
73 | {
74 | std::cout << "--div-by-cmdbuf requires bool parameter" << std::endl;
75 | return -1;
76 | }
77 |
78 | ++i;
79 | cfg.divideByCmdBuffers = (argv[i] == "true"s or argv[i] == "TRUE"s);
80 | continue;
81 | }
82 |
83 | if ( curr == "--build" )
84 | {
85 | cfg.compile = true;
86 | continue;
87 | }
88 |
89 | if ( curr == "--configure" )
90 | {
91 | cfg.configure = true;
92 | continue;
93 | }
94 |
95 | if ( curr == "--clean" )
96 | {
97 | cfg.cleanOutputFolder = true;
98 | continue;
99 | }
100 |
101 | std::cout << "unknown command: '" << curr << "', see help with command -h or --help" << std::endl;
102 | return -1;
103 | }
104 |
105 | // validate
106 | FS::path input_p {input};
107 | FS::path output_p {output};
108 |
109 | if ( not FS::exists( input_p ))
110 | {
111 | if ( not input_p.extension().empty() )
112 | {
113 | std::cout << "can't open input: '" << input << "'" << std::endl;
114 | return -1;
115 | }
116 |
117 | // try use extension .zip / .zip.xml
118 | if ( not FS::exists( input_p.replace_extension( "zip" )) )
119 | {
120 | if ( not FS::exists( input_p.replace_extension( "zip.xml" )) )
121 | {
122 | std::cout << "can't open input: '" << input << "'" << std::endl;
123 | return -1;
124 | }
125 | }
126 | }
127 |
128 | if ( FS::exists( output_p ))
129 | {
130 | if ( not FS::is_directory( output_p ))
131 | {
132 | std::cout << "output: '" << output << "' must be directory name" << std::endl;
133 | return -1;
134 | }
135 | }
136 | else
137 | {
138 | if ( not FS::create_directories( output_p ))
139 | {
140 | std::cout << "can't create directory: '" << output << "'" << std::endl;
141 | return -1;
142 | }
143 |
144 | std::cout << "created directoty: '" << output << "'" << std::endl;
145 | }
146 |
147 | if ( cfg.compile and cfg.configure )
148 | {
149 | std::cout << "'configure' command ignored because used 'build' command" << std::endl;
150 | cfg.configure = false;
151 | }
152 |
153 |
154 | VulkanConverter vk_conv{ output_p, cfg };
155 | RdCaptureReader reader;
156 |
157 | reader.AddListener( vk_conv.GetListener() );
158 |
159 | CHECK_ERR( reader.OpenCapture( input_p.replace_extension("") ), -1 );
160 |
161 | return 0;
162 | }
163 |
--------------------------------------------------------------------------------
/external/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # download and install all external dependencies
2 |
3 | cmake_policy( SET CMP0022 NEW )
4 | cmake_minimum_required (VERSION 3.6.0)
5 |
6 | include( ExternalProject )
7 |
8 | set( RDE_EXTERNALS_PATH "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Path to external projects sources" )
9 | set( RDE_EXTERNAL_INSTALL_DIR "${CMAKE_BINARY_DIR}/install" )
10 | message( STATUS "RDE_EXTERNALS_PATH: ${RDE_EXTERNALS_PATH}" )
11 |
12 | # configure
13 | set( RDE_LIST_SEPARATOR "|" )
14 | string( REPLACE ";" "${RDE_LIST_SEPARATOR}" RDE_EXTERNAL_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" )
15 | set( RDE_BUILD_TARGET_FLAGS "" )
16 |
17 | foreach ( CONFIG ${CMAKE_CONFIGURATION_TYPES} )
18 | string( TOUPPER ${CONFIG} OUT_CONFIG )
19 |
20 | set( RDE_BUILD_TARGET_FLAGS
21 | "${RDE_BUILD_TARGET_FLAGS}"
22 | "-DCMAKE_C_FLAGS_${OUT_CONFIG}=${CMAKE_C_FLAGS_${OUT_CONFIG}}"
23 | "-DCMAKE_CXX_FLAGS_${OUT_CONFIG}=${CMAKE_CXX_FLAGS_${OUT_CONFIG}}"
24 | "-DCMAKE_EXE_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_EXE_LINKER_FLAGS_${OUT_CONFIG}}"
25 | "-DCMAKE_STATIC_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_STATIC_LINKER_FLAGS_${OUT_CONFIG}}"
26 | "-DCMAKE_SHARED_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_SHARED_LINKER_FLAGS_${OUT_CONFIG}}"
27 | )
28 | endforeach ()
29 |
30 | include( "${CMAKE_SOURCE_DIR}/cmake/attach_fg.cmake" )
31 | include( "${CMAKE_SOURCE_DIR}/cmake/find_devenv.cmake" )
32 | include( "${CMAKE_SOURCE_DIR}/cmake/download_spirvcross.cmake" )
33 |
34 | add_subdirectory( "miniz" "miniz" )
35 |
--------------------------------------------------------------------------------
/external/FrameGraph/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /external/glfw
3 | /external/glslang
4 | /external/lodepng
5 | /external/SDL2
6 | /external/Vulkan-Headers
7 | /external/VulkanMemoryAllocator
8 | /external/SFML
9 | /external/assimp
10 | /external/foonathan_memory
11 | /external/imgui
12 | /external/glm
13 | /external/DevIL
14 | /external/FreeImage
15 | /external/AngelScript
16 | /external/optional
17 | /external/variant
18 | /tests/framegraph/Graphs
19 | /samples/_data
20 | *.user
21 | *.glsl_dbg
22 |
--------------------------------------------------------------------------------
/external/FrameGraph/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | message( STATUS "==========================================================================\n" )
4 | message( STATUS "project 'FrameGraph' generation started" )
5 |
6 | project( "FrameGraph" LANGUAGES C CXX )
7 | set_property( GLOBAL PROPERTY USE_FOLDERS ON )
8 | message( STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} (${CMAKE_CXX_COMPILER_VERSION})" )
9 | message( STATUS "target system: ${CMAKE_SYSTEM_NAME} (${CMAKE_SYSTEM_VERSION})" )
10 | message( STATUS "host system: ${CMAKE_HOST_SYSTEM_NAME} (${CMAKE_HOST_SYSTEM_VERSION})" )
11 |
12 | set( FG_ENABLE_SIMPLE_COMPILER_OPTIONS OFF CACHE BOOL "use simplified compiler settings if you have problem with it" )
13 | set( FG_EXTERNALS_USE_STABLE_VERSIONS ON CACHE BOOL "use last stable version instead of master branch" )
14 |
15 | set( FG_ENABLE_GLFW ON CACHE BOOL "use glfw (optional, required for tests)" )
16 | set( FG_ENABLE_SDL2 OFF CACHE BOOL "use SDL2 (optional, required for tests)" )
17 | set( FG_ENABLE_GLSLANG ON CACHE BOOL "use glslang (optional, required for glsl compilation)" )
18 | set( FG_ENABLE_VMA ON CACHE BOOL "use Vulkan Memory Allocator (required)" )
19 |
20 | set( CMAKE_DEBUG_POSTFIX "d" )
21 | set( CMAKE_RELEASE_POSTFIX "" )
22 | set( CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "installation directory" )
23 | set( MAIN_BINARY_DIR "${CMAKE_BINARY_DIR}/bin" CACHE INTERNAL "" FORCE )
24 | set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${MAIN_BINARY_DIR}" )
25 | set( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${MAIN_BINARY_DIR}" )
26 | set( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${MAIN_BINARY_DIR}" )
27 |
28 | if (${FG_ENABLE_SIMPLE_COMPILER_OPTIONS})
29 | include( "cmake/compilers_minimal.cmake" )
30 | else()
31 | include( "cmake/compilers.cmake" )
32 | endif()
33 | include( "cmake/compiler_tests.cmake" )
34 |
35 | add_subdirectory( "external" )
36 | include( "cmake/project_template.cmake" )
37 | add_subdirectory( "stl" )
38 | add_subdirectory( "extensions/vulkan_loader" )
39 | add_subdirectory( "extensions/framework" )
40 |
41 | message( STATUS "project 'FrameGraph' generation ended" )
42 | message( STATUS "\n==========================================================================" )
43 |
--------------------------------------------------------------------------------
/external/FrameGraph/LICENSE:
--------------------------------------------------------------------------------
1 | BSD 2-Clause License
2 |
3 | Copyright (c) 2018-2019, Zhirnov Andrey
4 | All rights reserved.
5 |
6 | Redistribution and use in source and binary forms, with or without
7 | modification, are permitted provided that the following conditions are met:
8 |
9 | * Redistributions of source code must retain the above copyright notice, this
10 | list of conditions and the following disclaimer.
11 |
12 | * Redistributions in binary form must reproduce the above copyright notice,
13 | this list of conditions and the following disclaimer in the documentation
14 | and/or other materials provided with the distribution.
15 |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 |
--------------------------------------------------------------------------------
/external/FrameGraph/README.md:
--------------------------------------------------------------------------------
1 | # FrameGraph
2 |
3 | FrameGraph simplifies prototyping on Vulkan and can be used as a base layer for the graphics engine.
4 | FrameGraph designed for maximum performance but not at the expense of usability. API developed as simple as possible, it hides all synchronizations, memory allocations and all this boilerplate code that is needed to get Vulkan work. Builtin validations together with Vulkan validation layers allow you to quickly find and fix errors.
5 |
6 | ## Features
7 | * multithreaded command buffer building and submission.
8 | * simple API, hides memory allocation, host<->device transfers, synchronizations.
9 | * glsl debugging.
10 | * supports RTX extensions.
11 | * supports async compute and async transfer queues.
12 |
13 |
14 | ## Documentation
15 | * [Introduction](docs/Introduction.md)
16 | * [Multithreading](docs/Multithreading.md)
17 | * [Performance](docs/Performance.md)
18 | * [Ray tracing](docs/RayTracing.md)
19 | * [Porting from OpenGL](docs/Porting-from-OpenGL.md)
20 | * [Porting from Vulkan](docs/Porting-from-Vulkan.md)
21 | * [Extensions overview](extensions/Readme.md)
22 | * [Shader debugging](docs/Shader-debugging.md)
23 | * [Graph visualization](docs/Graph-visualization.md)
24 | * [Roadmap](docs/Roadmap.md)
25 |
26 |
27 | ## Suported Platforms
28 | * Windows (with MSVC 2017)
29 | * Linux (with GCC 8.2)
30 |
31 |
32 | ## Building
33 | Generate project with CMake and build.
34 | Required C++17 standard support.
35 |
36 | CMake version 3.11 and greater will download all dependencies during configuration time.
37 | If it didn't, manualy download dependencies into 'external' directory or in cmake specify `FG_EXTERNAL_***` pathes for each dependency.
38 |
39 | Dependencies:
40 | [Vulkan-headers](https://github.com/KhronosGroup/Vulkan-Headers) or [Vulkan SDK](https://www.lunarg.com/vulkan-sdk/) - required.
41 | [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator) - required.
42 | [glfw](https://github.com/glfw/glfw) or [SDL2](https://www.libsdl.org) or [SFML](https://github.com/SFML/SFML) - required for framework and some tests.
43 | [glslang](https://github.com/KhronosGroup/glslang) - required for glsl compiler.
44 | [SPIRV-Tools](https://github.com/KhronosGroup/SPIRV-Tools), [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) and Python - optional, for spirv optimization.
45 | [lodepng](https://github.com/lvandeve/lodepng) - optional.
46 | [graphviz](https://www.graphviz.org/) - (optional) for graph visualization.
47 | [Assimp](https://github.com/assimp/assimp) - (optional) for Scene extension.
48 | [DevIL](http://openil.sourceforge.net/) - (optional) for Scene extension.
49 | [FreeImage](http://freeimage.sourceforge.net/) - (optional) for Scene extension.
50 | [imgui](https://github.com/ocornut/imgui) - (optional) for UI extension.
51 |
52 |
53 | ## References
54 | 1. [FrameGraph in Frostbite](https://www.gdcvault.com/play/1024612/FrameGraph-Extensible-Rendering-Architecture-in).
55 | 2. [Handles vs pointers](https://floooh.github.io/2018/06/17/handles-vs-pointers.html)
56 | 3. [Porting engine to vulkan](https://gpuopen.com/presentation-porting-engine-to-vulkan-dx12/).
57 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/compiler_tests.cmake:
--------------------------------------------------------------------------------
1 | include( CheckCXXSourceCompiles )
2 |
3 | if ( ${COMPILER_MSVC} )
4 | set( CMAKE_REQUIRED_FLAGS "/std:c++latest" )
5 | else()
6 | set( CMAKE_REQUIRED_FLAGS "-std=c++17" )
7 | endif ()
8 |
9 | message( STATUS "Run compiler tests with flags: ${CMAKE_REQUIRED_FLAGS}" )
10 |
11 | set( FG_COMPILER_DEFINITIONS "" )
12 | set( FG_LINK_LIBRARIES "" )
13 |
14 | #------------------------------------------------------------------------------
15 | check_cxx_source_compiles(
16 | "#include
17 | int main () {
18 | std::string_view str{\"1234\"};
19 | return 0;
20 | }"
21 | STD_STRINGVIEW_SUPPORTED )
22 |
23 | if (STD_STRINGVIEW_SUPPORTED)
24 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_STD_STRINGVIEW" )
25 | set( STD_STRINGVIEW_SUPPORTED ON CACHE INTERNAL "" FORCE )
26 | else()
27 | set( STD_STRINGVIEW_SUPPORTED OFF CACHE INTERNAL "" FORCE )
28 | endif ()
29 |
30 | #------------------------------------------------------------------------------
31 | check_cxx_source_compiles(
32 | "#include
33 | int main () {
34 | std::optional opt;
35 | return opt.has_value() ? 0 : 1;
36 | }"
37 | STD_OPTIONAL_SUPPORTED )
38 |
39 | if (STD_OPTIONAL_SUPPORTED)
40 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_STD_OPTIONAL" )
41 | set( STD_OPTIONAL_SUPPORTED ON CACHE INTERNAL "" FORCE )
42 | else()
43 | set( STD_OPTIONAL_SUPPORTED OFF CACHE INTERNAL "" FORCE )
44 | endif ()
45 |
46 | #------------------------------------------------------------------------------
47 | check_cxx_source_compiles(
48 | "#include
49 | int main () {
50 | std::variant var;
51 | var = 1.0f;
52 | return 0;
53 | }"
54 | STD_VARIANT_SUPPORTED )
55 |
56 | if (STD_VARIANT_SUPPORTED)
57 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_STD_VARIANT" )
58 | set( STD_VARIANT_SUPPORTED ON CACHE INTERNAL "" FORCE )
59 | else()
60 | set( STD_VARIANT_SUPPORTED OFF CACHE INTERNAL "" FORCE )
61 | endif ()
62 |
63 | #------------------------------------------------------------------------------
64 | check_cxx_source_compiles(
65 | "#include
66 | namespace fs = std::filesystem;
67 | int main () {
68 | return 0;
69 | }"
70 | STD_FILESYSTEM_SUPPORTED )
71 |
72 | if (STD_FILESYSTEM_SUPPORTED)
73 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_STD_FILESYSTEM" )
74 |
75 | if (${COMPILER_CLANG} OR ${COMPILER_CLANG_APPLE} OR ${COMPILER_CLANG_ANDROID} OR ${COMPILER_GCC})
76 | set( FG_LINK_LIBRARIES "${FG_LINK_LIBRARIES}" "stdc++fs" )
77 | endif()
78 | set( STD_FILESYSTEM_SUPPORTED ON CACHE INTERNAL "" FORCE )
79 | else()
80 | set( STD_FILESYSTEM_SUPPORTED OFF CACHE INTERNAL "" FORCE )
81 | endif ()
82 |
83 | #------------------------------------------------------------------------------
84 | check_cxx_source_compiles(
85 | "#include
86 | static constexpr size_t Align = std::hardware_destructive_interference_size;
87 | int main () {
88 | return 0;
89 | }"
90 | STD_CACHELINESIZE_SUPPORTED )
91 |
92 | if (STD_CACHELINESIZE_SUPPORTED)
93 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_CACHE_LINE=std::hardware_destructive_interference_size" )
94 | else ()
95 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_CACHE_LINE=64" ) # TODO
96 | endif ()
97 |
98 | #------------------------------------------------------------------------------
99 | check_cxx_source_compiles(
100 | "#include
101 | int main () {
102 | std::barrier temp;
103 | return 0;
104 | }"
105 | STD_BARRIER_SUPPORTED )
106 |
107 | if (STD_BARRIER_SUPPORTED)
108 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_STD_BARRIER" )
109 | endif ()
110 |
111 | #------------------------------------------------------------------------------
112 | check_cxx_source_compiles(
113 | "#include
114 | int main () {
115 | char buffer[128] = {};
116 | (void)(std::_Hash_array_representation( reinterpret_cast(buffer), std::size(buffer) ));
117 | return 0;
118 | }"
119 | HAS_HASHFN_HashArrayRepresentation )
120 |
121 | if (HAS_HASHFN_HashArrayRepresentation)
122 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_HAS_HASHFN_HashArrayRepresentation" )
123 | endif ()
124 |
125 | #------------------------------------------------------------------------------
126 | check_cxx_source_compiles(
127 | "#include
128 | int main () {
129 | char buffer[128] = {};
130 | (void)(std::__murmur2_or_cityhash()( buffer, std::size(buffer) ));
131 | return 0;
132 | }"
133 | HAS_HASHFN_Murmur2OrCityhash )
134 |
135 | if (HAS_HASHFN_Murmur2OrCityhash)
136 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_HAS_HASHFN_Murmur2OrCityhash" )
137 | endif ()
138 |
139 | #------------------------------------------------------------------------------
140 | check_cxx_source_compiles(
141 | "#include
142 | int main () {
143 | char buffer[128] = {};
144 | (void)(std::_Hash_bytes( buffer, std::size(buffer), 0 ));
145 | return 0;
146 | }"
147 | HAS_HASHFN_HashBytes )
148 |
149 | if (HAS_HASHFN_HashBytes)
150 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" "FG_HAS_HASHFN_HashBytes" )
151 | endif ()
152 |
153 | #------------------------------------------------------------------------------
154 |
155 | set( CMAKE_REQUIRED_FLAGS "" )
156 | set( FG_COMPILER_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" CACHE INTERNAL "" FORCE )
157 | set( FG_LINK_LIBRARIES "${FG_LINK_LIBRARIES}" CACHE INTERNAL "" FORCE )
158 |
159 | #message( STATUS "Supported features = ${CMAKE_CXX_COMPILE_FEATURES}" )
160 |
161 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_glfw.cmake:
--------------------------------------------------------------------------------
1 | # find or download GLFW
2 |
3 | if (${FG_ENABLE_GLFW})
4 | set( FG_EXTERNAL_GLFW_PATH "" CACHE PATH "path to glfw source" )
5 | mark_as_advanced( FG_EXTERNAL_GLFW_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_GLFW_PATH}/include/GLFW/glfw3.h" )
9 | message( STATUS "glfw is not found in \"${FG_EXTERNAL_GLFW_PATH}\"" )
10 | set( FG_EXTERNAL_GLFW_PATH "${FG_EXTERNALS_PATH}/glfw" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "glfw found in \"${FG_EXTERNAL_GLFW_PATH}\"" )
13 | endif ()
14 |
15 | # select version
16 | if (${FG_EXTERNALS_USE_STABLE_VERSIONS})
17 | set( GLWF_TAG "3.2.1" )
18 | else ()
19 | set( GLWF_TAG "master" )
20 | endif ()
21 |
22 | # download
23 | if (NOT EXISTS "${FG_EXTERNAL_GLFW_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
24 | FetchContent_Declare( ExternalGLFW
25 | GIT_REPOSITORY https://github.com/glfw/glfw.git
26 | GIT_TAG ${GLWF_TAG}
27 | SOURCE_DIR "${FG_EXTERNAL_GLFW_PATH}"
28 | )
29 |
30 | FetchContent_GetProperties( ExternalGLFW )
31 | if (NOT ExternalGLFW_POPULATED)
32 | message( STATUS "downloading glfw" )
33 | FetchContent_Populate( ExternalGLFW )
34 | endif ()
35 | endif ()
36 |
37 | set( GLFW_INSTALL ON CACHE BOOL "glfw option" )
38 | set( GLFW_BUILD_TESTS OFF CACHE BOOL "glfw option" )
39 | set( GLFW_BUILD_EXAMPLES OFF CACHE BOOL "glfw option" )
40 | set( GLFW_BUILD_DOCS OFF CACHE BOOL "glfw option" )
41 | set( USE_MSVC_RUNTIME_LIBRARY_DLL OFF CACHE BOOL "glfw option" )
42 |
43 | add_subdirectory( "${FG_EXTERNAL_GLFW_PATH}" "glfw" )
44 | set_property( TARGET "glfw" PROPERTY FOLDER "External" )
45 |
46 | if (TARGET uninstall)
47 | set_property( TARGET "uninstall" PROPERTY FOLDER "External" )
48 | endif ()
49 |
50 | mark_as_advanced( GLFW_INSTALL GLFW_BUILD_TESTS GLFW_BUILD_EXAMPLES GLFW_BUILD_DOCS GLFW_DOCUMENT_INTERNALS )
51 | mark_as_advanced( GLFW_USE_HYBRID_HPG GLFW_VULKAN_STATIC USE_MSVC_RUNTIME_LIBRARY_DLL )
52 |
53 | add_library( "GLFW-lib" INTERFACE )
54 | set_property( TARGET "GLFW-lib" PROPERTY INTERFACE_LINK_LIBRARIES "glfw" )
55 | target_include_directories( "GLFW-lib" INTERFACE "${FG_EXTERNAL_GLFW_PATH}/include" )
56 | target_compile_definitions( "GLFW-lib" INTERFACE "FG_ENABLE_GLFW" )
57 | endif ()
58 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_sdl2.cmake:
--------------------------------------------------------------------------------
1 | # find or download SDL2
2 |
3 | if (${FG_ENABLE_SDL2})
4 | set( FG_EXTERNAL_SDL2_PATH "" CACHE PATH "path to SDL2 source" )
5 | mark_as_advanced( FG_EXTERNAL_SDL2_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_SDL2_PATH}/include/SDL.h")
9 | message( STATUS "SDL2 is not found in \"${FG_EXTERNAL_SDL2_PATH}\"" )
10 | set( FG_EXTERNAL_SDL2_PATH "${FG_EXTERNALS_PATH}/SDL2" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "SDL2 found in \"${FG_EXTERNAL_SDL2_PATH}\"" )
13 | endif ()
14 |
15 | # download
16 | if (NOT EXISTS "${FG_EXTERNAL_SDL2_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
17 | FetchContent_Declare( ExternalSDL2
18 | URL https://www.libsdl.org/release/SDL2-2.0.8.zip
19 | SOURCE_DIR "${FG_EXTERNAL_SDL2_PATH}"
20 | )
21 |
22 | FetchContent_GetProperties( ExternalSDL2 )
23 | if (NOT ExternalSDL2_POPULATED)
24 | message( STATUS "downloading SDL2" )
25 | FetchContent_Populate( ExternalSDL2 )
26 | endif ()
27 | endif ()
28 |
29 | set( SDL_SHARED OFF CACHE BOOL "SDL2 option" FORCE )
30 | set( SDL_STATIC ON CACHE BOOL "SDL2 option" FORCE )
31 | set( SDL_AUDIO OFF CACHE BOOL "SDL2 option" FORCE )
32 | set( SDL_RENDER OFF CACHE BOOL "SDL2 option" FORCE )
33 | set( SDL_TEST OFF CACHE BOOL "SDL2 option" FORCE )
34 | set( DIRECTX OFF CACHE BOOL "SDL2 option" FORCE )
35 | set( RENDER_D3D OFF CACHE BOOL "SDL2 option" FORCE )
36 |
37 | add_subdirectory( "${FG_EXTERNAL_SDL2_PATH}" "SDL2" )
38 |
39 | if (TARGET SDL2main)
40 | set_property( TARGET "SDL2main" PROPERTY FOLDER "External" )
41 | endif ()
42 |
43 | if (TARGET uninstall)
44 | set_property( TARGET "uninstall" PROPERTY FOLDER "External" )
45 | endif ()
46 |
47 | mark_as_advanced( 3DNOW ALSA ALTIVEC ARTS ASSEMBLY ASSERTIONS CLOCK_GETTIME DIRECTX
48 | DISKAUDIO DUMMYAUDIO ESD FORCE_STATIC_VCRT FUSIONSOUND GCC_ATOMICS
49 | INPUT_TSLIB JACK LIBC LIBSAMPLERATE MMX NAS NAS_SHARED OSS PTHREADS
50 | PULSEAUDIO RENDER_D3D RPATH SNDIO SSE SSE2 SSE3 SSEMATH WINDRES
51 | VIDEO_COCOA VIDEO_DIRECTFB VIDEO_DUMMY VIDEO_KMSDRM VIDEO_MIR VIDEO_OPENGL
52 | VIDEO_OPENGLES VIDEO_RPI VIDEO_VIVANTE VIDEO_VULKAN VIDEO_WAYLAND VIDEO_X11 )
53 | mark_as_advanced( SDL_ATOMIC SDL_AUDIO SDL_CPUINFO SDL_DLOPEN SDL_EVENTS SDL_FILE
54 | SDL_FILESYSTEM SDL_HAPTIC SDL_JOYSTICK SDL_LOADSO SDL_POWER SDL_RENDER
55 | SDL_SHARED SDL_STATIC SDL_STATIC_PIC SDL_TEST SDL_THREADS SDL_TIMERS SDL_VIDEO )
56 |
57 | add_library( "SDL2-lib" INTERFACE )
58 |
59 | if (${SDL_SHARED})
60 | set_property( TARGET "SDL2" PROPERTY FOLDER "External" )
61 | set_property( TARGET "SDL2-lib" PROPERTY INTERFACE_LINK_LIBRARIES "SDL2" )
62 | endif ()
63 |
64 | if (${SDL_STATIC})
65 | set_property( TARGET "SDL2-static" PROPERTY FOLDER "External" )
66 | set_property( TARGET "SDL2-lib" PROPERTY INTERFACE_LINK_LIBRARIES "SDL2-static" )
67 | endif ()
68 |
69 | target_include_directories( "SDL2-lib" INTERFACE "${FG_EXTERNAL_SDL2_PATH}/include" )
70 | target_compile_definitions( "SDL2-lib" INTERFACE "FG_ENABLE_SDL2" )
71 | endif ()
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_stdoptional.cmake:
--------------------------------------------------------------------------------
1 | # find or download std::optional implementation
2 |
3 | if (NOT ${STD_OPTIONAL_SUPPORTED})
4 | set( FG_EXTERNAL_STDOPTIONAL_PATH "" CACHE PATH "path to std::optional source" )
5 | mark_as_advanced( FG_EXTERNAL_STDOPTIONAL_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_STDOPTIONAL_PATH}/optional.hpp")
9 | message( STATUS "std::optional is not found in \"${FG_EXTERNAL_STDOPTIONAL_PATH}\"" )
10 | set( FG_EXTERNAL_STDOPTIONAL_PATH "${FG_EXTERNALS_PATH}/optional" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "std::optional found in \"${FG_EXTERNAL_STDOPTIONAL_PATH}\"" )
13 | endif ()
14 |
15 | # download
16 | if (NOT EXISTS "${FG_EXTERNAL_STDOPTIONAL_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
17 | FetchContent_Declare( ExternalStdOpt
18 | GIT_REPOSITORY https://github.com/akrzemi1/Optional.git
19 | SOURCE_DIR "${FG_EXTERNAL_STDOPTIONAL_PATH}"
20 | GIT_TAG master
21 | )
22 |
23 | FetchContent_GetProperties( ExternalStdOpt )
24 | if (NOT ExternalStdOpt_POPULATED)
25 | message( STATUS "downloading std::optional" )
26 | FetchContent_Populate( ExternalStdOpt )
27 | endif ()
28 | endif ()
29 |
30 | add_library( "StdOptional-lib" INTERFACE )
31 | target_include_directories( "StdOptional-lib" INTERFACE "${FG_EXTERNAL_STDOPTIONAL_PATH}" )
32 | target_compile_definitions( "StdOptional-lib" INTERFACE "FG_ENABLE_OPTIONAL" )
33 | endif ()
34 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_stdstringview.cmake:
--------------------------------------------------------------------------------
1 | # find or download std::string_view implementation
2 |
3 | if (NOT ${STD_STRINGVIEW_SUPPORTED})
4 | set( FG_EXTERNAL_STDSTRINGVIEW_PATH "" CACHE PATH "path to std::string_view source" )
5 | mark_as_advanced( FG_EXTERNAL_STDSTRINGVIEW_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_STDSTRINGVIEW_PATH}/include/nonstd/string_view.hpp")
9 | message( STATUS "std::string_view is not found in \"${FG_EXTERNAL_STDSTRINGVIEW_PATH}\"" )
10 | set( FG_EXTERNAL_STDSTRINGVIEW_PATH "${FG_EXTERNALS_PATH}/string_view" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "std::string_view found in \"${FG_EXTERNAL_STDSTRINGVIEW_PATH}\"" )
13 | endif ()
14 |
15 | # download
16 | if (NOT EXISTS "${FG_EXTERNAL_STDSTRINGVIEW_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
17 | FetchContent_Declare( ExternalStdStrView
18 | GIT_REPOSITORY https://github.com/martinmoene/string-view-lite.git
19 | SOURCE_DIR "${FG_EXTERNAL_STDSTRINGVIEW_PATH}"
20 | GIT_TAG master
21 | )
22 |
23 | FetchContent_GetProperties( ExternalStdStrView )
24 | if (NOT ExternalStdStrView_POPULATED)
25 | message( STATUS "downloading std::string_view" )
26 | FetchContent_Populate( ExternalStdStrView )
27 | endif ()
28 | endif ()
29 |
30 | add_library( "StdStringView-lib" INTERFACE )
31 | target_include_directories( "StdStringView-lib" INTERFACE "${FG_EXTERNAL_STDSTRINGVIEW_PATH}/include" )
32 | target_compile_definitions( "StdStringView-lib" INTERFACE "FG_ENABLE_STRINGVIEW" )
33 | endif ()
34 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_stdvariant.cmake:
--------------------------------------------------------------------------------
1 | # find or download std::variant implementation
2 |
3 | if (NOT ${STD_VARIANT_SUPPORTED})
4 | set( FG_EXTERNAL_STDVARIANT_PATH "" CACHE PATH "path to std::variant source" )
5 | mark_as_advanced( FG_EXTERNAL_STDVARIANT_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_STDVARIANT_PATH}/include/mpark/variant.hpp")
9 | message( STATUS "std::variant is not found in \"${FG_EXTERNAL_STDVARIANT_PATH}\"" )
10 | set( FG_EXTERNAL_STDVARIANT_PATH "${FG_EXTERNALS_PATH}/variant" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "std::variant found in \"${FG_EXTERNAL_STDVARIANT_PATH}\"" )
13 | endif ()
14 |
15 | # download
16 | if (NOT EXISTS "${FG_EXTERNAL_STDVARIANT_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
17 | FetchContent_Declare( ExternalStdVar
18 | GIT_REPOSITORY https://github.com/mpark/variant.git
19 | SOURCE_DIR "${FG_EXTERNAL_STDVARIANT_PATH}"
20 | GIT_TAG master
21 | )
22 |
23 | FetchContent_GetProperties( ExternalStdVar )
24 | if (NOT ExternalStdVar_POPULATED)
25 | message( STATUS "downloading std::variant" )
26 | FetchContent_Populate( ExternalStdVar )
27 | endif ()
28 | endif ()
29 |
30 | add_library( "StdVariant-lib" INTERFACE )
31 | target_include_directories( "StdVariant-lib" INTERFACE "${FG_EXTERNAL_STDVARIANT_PATH}/include" )
32 | target_compile_definitions( "StdVariant-lib" INTERFACE "FG_ENABLE_VARIANT" )
33 | endif ()
34 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_vk.cmake:
--------------------------------------------------------------------------------
1 | # Find or download Vulkan headers
2 |
3 | if (NOT CMAKE_VERSION VERSION_LESS 3.7.0)
4 | # find_package( Vulkan )
5 | endif ()
6 |
7 |
8 | if (NOT Vulkan_FOUND)
9 | if (EXISTS "${FG_EXTERNALS_PATH}/vulkan/vulkan_core.h")
10 | set( Vulkan_INCLUDE_DIRS "${FG_EXTERNALS_PATH}" )
11 | set( Vulkan_FOUND TRUE )
12 |
13 | elseif (EXISTS "${FG_EXTERNALS_PATH}/vulkan/include/vulkan/vulkan_core.h")
14 | set( Vulkan_INCLUDE_DIRS "${FG_EXTERNALS_PATH}/vulkan/include" )
15 | set( Vulkan_FOUND TRUE )
16 |
17 | elseif (EXISTS "${FG_EXTERNALS_PATH}/Vulkan-Headers/include/vulkan/vulkan_core.h")
18 | set( Vulkan_INCLUDE_DIRS "${FG_EXTERNALS_PATH}/Vulkan-Headers/include" )
19 | set( Vulkan_FOUND TRUE )
20 | endif ()
21 | endif ()
22 |
23 | # select version
24 | if (${FG_EXTERNALS_USE_STABLE_VERSIONS})
25 | set( VULKAN_HEADERS_TAG "v1.1.121" )
26 | else ()
27 | set( VULKAN_HEADERS_TAG "master" )
28 | endif ()
29 |
30 | # download
31 | if (NOT Vulkan_FOUND AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
32 | FetchContent_Declare( ExternalVulkanHeaders
33 | GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git
34 | GIT_TAG ${VULKAN_HEADERS_TAG}
35 | SOURCE_DIR "${FG_EXTERNALS_PATH}/Vulkan-Headers"
36 | )
37 |
38 | FetchContent_GetProperties( ExternalVulkanHeaders )
39 | if (NOT ExternalVulkanHeaders_POPULATED)
40 | message( STATUS "downloading Vulkan-Headers" )
41 | FetchContent_Populate( ExternalVulkanHeaders )
42 | endif ()
43 |
44 | set( Vulkan_INCLUDE_DIRS "${FG_EXTERNALS_PATH}/Vulkan-Headers/include" )
45 | set( Vulkan_FOUND TRUE )
46 | endif ()
47 |
48 |
49 | if (NOT Vulkan_FOUND)
50 | message( FATAL_ERROR "Vulkan headers is not found! Install VulkanSDK or download from https://github.com/KhronosGroup/Vulkan-Headers" )
51 | endif ()
52 |
53 | set( FG_VULKAN_DEFINITIONS "FG_ENABLE_VULKAN" )
54 |
55 | if (FALSE)
56 | if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
57 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "VK_USE_PLATFORM_XCB_KHR=1" "VK_USE_PLATFORM_XLIB_KHR=1" ) # TODO
58 |
59 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Android")
60 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "-VK_USE_PLATFORM_ANDROID_KHR=1" )
61 |
62 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
63 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "VK_USE_PLATFORM_MACOS_MVK=1" )
64 |
65 | elseif (${CMAKE_SYSTEM_NAME} STREQUAL "iOS")
66 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "VK_USE_PLATFORM_IOS_MVK=1" )
67 |
68 | elseif (WIN32 OR ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
69 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "VK_USE_PLATFORM_WIN32_KHR=1" )
70 | set( FG_VULKAN_DEFINITIONS "${FG_VULKAN_DEFINITIONS}" "NOMINMAX" "NOMCX" "NOIME" "NOSERVICE" "WIN32_LEAN_AND_MEAN" )
71 | endif ()
72 | endif ()
73 |
74 |
75 | add_library( "Vulkan-lib" INTERFACE )
76 | target_include_directories( "Vulkan-lib" INTERFACE "${Vulkan_INCLUDE_DIRS}" )
77 | target_compile_definitions( "Vulkan-lib" INTERFACE "${FG_VULKAN_DEFINITIONS}" )
78 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/download_vma.cmake:
--------------------------------------------------------------------------------
1 | # find or download Vulkan Memory Allocator
2 |
3 | if (${FG_ENABLE_VMA})
4 | set( FG_EXTERNAL_VMA_PATH "" CACHE PATH "path to VulkanMemoryAllocator source" )
5 | mark_as_advanced( FG_EXTERNAL_VMA_PATH )
6 |
7 | # reset to default
8 | if (NOT EXISTS "${FG_EXTERNAL_VMA_PATH}/src/vk_mem_alloc.h")
9 | message( STATUS "VulkanMemoryAllocator is not found in \"${FG_EXTERNAL_VMA_PATH}\"" )
10 | set( FG_EXTERNAL_VMA_PATH "${FG_EXTERNALS_PATH}/VulkanMemoryAllocator" CACHE PATH "" FORCE )
11 | else ()
12 | message( STATUS "VulkanMemoryAllocator found in \"${FG_EXTERNAL_VMA_PATH}\"" )
13 | endif ()
14 |
15 | # select version
16 | if (${FG_EXTERNALS_USE_STABLE_VERSIONS})
17 | set( VMA_TAG "v2.2.0" )
18 | else ()
19 | set( VMA_TAG "master" )
20 | endif ()
21 |
22 | # download
23 | if (NOT EXISTS "${FG_EXTERNAL_VMA_PATH}" AND NOT CMAKE_VERSION VERSION_LESS 3.11.0)
24 | FetchContent_Declare( ExternalVMA
25 | GIT_REPOSITORY https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
26 | SOURCE_DIR "${FG_EXTERNAL_VMA_PATH}"
27 | GIT_TAG ${VMA_TAG}
28 | )
29 |
30 | FetchContent_GetProperties( ExternalVMA )
31 | if (NOT ExternalVMA_POPULATED)
32 | message( STATUS "downloading VulkanMemoryAllocator" )
33 | FetchContent_Populate( ExternalVMA )
34 | endif ()
35 | endif ()
36 |
37 | add_library( "VMA-lib" INTERFACE )
38 | target_include_directories( "VMA-lib" INTERFACE "${FG_EXTERNAL_VMA_PATH}/src" )
39 | target_compile_definitions( "VMA-lib" INTERFACE "FG_ENABLE_VULKAN_MEMORY_ALLOCATOR" )
40 | endif ()
41 |
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/main.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/azhirnov/RDCtoVkCpp/4470fa7e2a9dba42beaf7a5317339257ec38e9ae/external/FrameGraph/cmake/main.cpp
--------------------------------------------------------------------------------
/external/FrameGraph/cmake/project_template.cmake:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | set( CMAKE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/cmake" )
4 | file( GLOB_RECURSE CMAKE_SOURCES "${CMAKE_FOLDER}/*.*" )
5 |
6 | add_library( "ProjectTemplate" STATIC EXCLUDE_FROM_ALL ${CMAKE_SOURCES} )
7 | set_property( TARGET "ProjectTemplate" PROPERTY FOLDER "Utils" )
8 | source_group( TREE "${CMAKE_FOLDER}/.." FILES ${CMAKE_SOURCES} )
9 |
10 | target_compile_definitions( "ProjectTemplate" PUBLIC ${FG_COMPILER_DEFINITIONS} )
11 | target_link_libraries( "ProjectTemplate" PUBLIC "${FG_LINK_LIBRARIES}" )
12 |
13 | # Debug
14 | if (PROJECTS_SHARED_CXX_FLAGS_DEBUG)
15 | target_compile_options( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_CXX_FLAGS_DEBUG}> )
16 | endif()
17 | if (PROJECTS_SHARED_DEFINES_DEBUG)
18 | target_compile_definitions( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_DEFINES_DEBUG}> )
19 | endif()
20 | if (PROJECTS_SHARED_LINKER_FLAGS_DEBUG)
21 | set_target_properties( "ProjectTemplate" PROPERTIES LINK_FLAGS_DEBUG ${PROJECTS_SHARED_LINKER_FLAGS_DEBUG} )
22 | endif()
23 |
24 | # Release
25 | if (PROJECTS_SHARED_CXX_FLAGS_RELEASE)
26 | target_compile_options( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_CXX_FLAGS_RELEASE}> )
27 | endif()
28 | if (PROJECTS_SHARED_DEFINES_RELEASE)
29 | target_compile_definitions( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_DEFINES_RELEASE}> )
30 | endif()
31 | if (PROJECTS_SHARED_LINKER_FLAGS_RELEASE)
32 | set_target_properties( "ProjectTemplate" PROPERTIES LINK_FLAGS_RELEASE ${PROJECTS_SHARED_LINKER_FLAGS_RELEASE} )
33 | endif()
34 |
35 | # Profile
36 | if (PROJECTS_SHARED_DEFINES_PROFILE)
37 | target_compile_definitions( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_DEFINES_PROFILE}> )
38 | endif()
39 | if (PROJECTS_SHARED_LINKER_FLAGS_PROFILE)
40 | set_target_properties( "ProjectTemplate" PROPERTIES LINK_FLAGS_PROFILE ${PROJECTS_SHARED_LINKER_FLAGS_PROFILE} )
41 | endif()
42 | if (PROJECTS_SHARED_CXX_FLAGS_PROFILE)
43 | target_compile_options( "ProjectTemplate" PUBLIC $<$: ${PROJECTS_SHARED_CXX_FLAGS_PROFILE}> )
44 | endif()
45 |
46 | set_target_properties( "ProjectTemplate" PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED YES )
47 | target_compile_features( "ProjectTemplate" PUBLIC cxx_std_17 )
48 |
49 | if (FG_CI_BUILD)
50 | target_compile_definitions( "ProjectTemplate" PUBLIC "FG_CI_BUILD" )
51 | endif()
52 |
53 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | file( GLOB_RECURSE SOURCES "*.*" )
4 | add_library( "Framework" STATIC ${SOURCES} )
5 | source_group( TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} )
6 | target_include_directories( "Framework" PUBLIC ".." )
7 | set_property( TARGET "Framework" PROPERTY FOLDER "Extensions" )
8 |
9 | target_link_libraries( "Framework" PUBLIC "VulkanLoader" )
10 |
11 | if (${FG_ENABLE_GLFW})
12 | target_link_libraries( "Framework" PUBLIC "GLFW-lib" )
13 | endif()
14 | if (${FG_ENABLE_SDL2})
15 | target_link_libraries( "Framework" PUBLIC "SDL2-lib" )
16 | endif()
17 |
18 | install( TARGETS "Framework" ARCHIVE DESTINATION "lib" )
19 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Vulkan/VulkanSurface.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "VulkanSurface.h"
4 | #include "stl/Algorithms/Cast.h"
5 |
6 | #if defined(PLATFORM_WINDOWS) && !defined(VK_USE_PLATFORM_WIN32_KHR)
7 | # include "stl/Platforms/WindowsHeader.h"
8 | # define VK_USE_PLATFORM_WIN32_KHR 1
9 | # include
10 | #endif
11 |
12 | namespace FGC
13 | {
14 |
15 | /*
16 | =================================================
17 | GetRequiredExtensions
18 | =================================================
19 | */
20 | Array VulkanSurface::GetRequiredExtensions ()
21 | {
22 | Array ext;
23 |
24 | # if defined(VK_USE_PLATFORM_ANDROID_KHR) and VK_USE_PLATFORM_ANDROID_KHR
25 | ext.push_back( VK_KHR_ANDROID_SURFACE_EXTENSION_NAME );
26 | # endif
27 |
28 | # if defined(VK_USE_PLATFORM_IOS_MVK) and VK_USE_PLATFORM_IOS_MVK
29 | ext.push_back( VK_MVK_IOS_SURFACE_EXTENSION_NAME );
30 | # endif
31 |
32 | # if defined(VK_USE_PLATFORM_MACOS_MVK) and VK_USE_PLATFORM_MACOS_MVK
33 | ext.push_back( VK_MVK_MACOS_SURFACE_EXTENSION_NAME );
34 | # endif
35 |
36 | # if defined(VK_USE_PLATFORM_WIN32_KHR) and VK_USE_PLATFORM_WIN32_KHR
37 | ext.push_back( VK_KHR_WIN32_SURFACE_EXTENSION_NAME );
38 | # endif
39 |
40 | # if defined(VK_USE_PLATFORM_MIR_KHR) and VK_USE_PLATFORM_MIR_KHR
41 | ext.push_back( VK_KHR_MIR_SURFACE_EXTENSION_NAME );
42 | # endif
43 |
44 | # if defined(VK_USE_PLATFORM_XCB_KHR) and VK_USE_PLATFORM_XCB_KHR
45 | ext.push_back( VK_KHR_XCB_SURFACE_EXTENSION_NAME );
46 | # endif
47 |
48 | # if defined(VK_USE_PLATFORM_XLIB_KHR) and VK_USE_PLATFORM_XLIB_KHR
49 | ext.push_back( VK_KHR_XLIB_SURFACE_EXTENSION_NAME );
50 | # endif
51 |
52 | # if defined(VK_USE_PLATFORM_XLIB_XRANDR_EXT) and VK_USE_PLATFORM_XLIB_XRANDR_EXT
53 | ext.push_back( VK_EXT_ACQUIRE_XLIB_DISPLAY_EXTENSION_NAME );
54 | # endif
55 |
56 | # if defined(VK_USE_PLATFORM_WAYLAND_KHR) and VK_USE_PLATFORM_WAYLAND_KHR
57 | ext.push_back( VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME );
58 | # endif
59 |
60 | return ext;
61 | }
62 |
63 |
64 | # if defined(VK_USE_PLATFORM_WIN32_KHR) and VK_USE_PLATFORM_WIN32_KHR
65 | /*
66 | =================================================
67 | CreateWin32Surface
68 | =================================================
69 | */
70 | VkSurfaceKHR VulkanSurface::CreateWin32Surface (VkInstance instance, void* hinstance, void* hwnd)
71 | {
72 | CHECK_ERR( instance and hinstance and hwnd );
73 |
74 | VkSurfaceKHR surface;
75 | VkWin32SurfaceCreateInfoKHR surface_info = {};
76 |
77 | surface_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
78 | surface_info.hinstance = HINSTANCE(hinstance);
79 | surface_info.hwnd = HWND(hwnd);
80 |
81 | PFN_vkCreateWin32SurfaceKHR fpCreateWin32SurfaceKHR = BitCast( vkGetInstanceProcAddr( instance, "vkCreateWin32SurfaceKHR" ));
82 | CHECK_ERR( fpCreateWin32SurfaceKHR );
83 |
84 | VK_CHECK( fpCreateWin32SurfaceKHR( instance, &surface_info, null, OUT &surface ));
85 | return surface;
86 | }
87 | # endif
88 |
89 |
90 | # if defined(VK_USE_PLATFORM_ANDROID_KHR) and VK_USE_PLATFORM_ANDROID_KHR
91 | /*
92 | =================================================
93 | CreateAndroidSurface
94 | =================================================
95 | */
96 | VkSurfaceKHR VulkanSurface::CreateAndroidSurface (VkInstance instance, void* window)
97 | {
98 | CHECK_ERR( instance and window );
99 |
100 | VkSurfaceKHR surface;
101 | VkAndroidSurfaceCreateInfoKHR surface_info = {};
102 |
103 | surface_info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
104 | surface_info.flags = 0;
105 | surface_info.window = Cast(window);
106 |
107 | PFN_vkCreateAndroidSurfaceKHR fpCreateAndroidSurfaceKHR = BitCast( vkGetInstanceProcAddr( instance, "vkCreateAndroidSurfaceKHR" ));
108 | CHECK_ERR( fpCreateAndroidSurfaceKHR );
109 |
110 | VK_CHECK( fpCreateAndroidSurfaceKHR( instance, &surface_info, null, OUT &surface ));
111 | return surface;
112 | }
113 | # endif
114 |
115 | } // FGC
116 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Vulkan/VulkanSurface.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "framework/Vulkan/VulkanDevice.h"
6 |
7 | namespace FGC
8 | {
9 |
10 | //
11 | // Vulkan Surface Helper
12 | //
13 |
14 | class VulkanSurface final
15 | {
16 | public:
17 | VulkanSurface () = delete;
18 | ~VulkanSurface () = delete;
19 |
20 | ND_ static Array GetRequiredExtensions ();
21 |
22 | // Windows
23 | # if defined(PLATFORM_WINDOWS)
24 | ND_ static VkSurfaceKHR CreateWin32Surface (VkInstance instance, void* hinstance, void* hwnd);
25 | # endif
26 |
27 | // Android
28 | # if defined(PLATFORM_ANDROID)
29 | ND_ static VkSurfaceKHR CreateAndroidSurface (VkInstance instance, void* window);
30 | # endif
31 | };
32 |
33 | } // FGC
34 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Window/IWindow.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Math/Vec.h"
6 | #include "stl/Containers/FixedArray.h"
7 | #include "stl/Containers/NtStringView.h"
8 | #include "stl/Memory/MemUtils.h"
9 | #include "vulkan_loader/VulkanLoader.h"
10 | #include "vulkan_loader/VulkanCheckError.h"
11 |
12 | namespace FGC
13 | {
14 |
15 | //
16 | // Window Event Listener interface
17 | //
18 |
19 | class IWindowEventListener
20 | {
21 | // types
22 | public:
23 | enum class EKeyAction {
24 | Up, // signle event when key up
25 | Down, // single event when key down
26 | Pressed, // continiously event until key is pressed
27 | };
28 |
29 | // interface
30 | public:
31 | virtual void OnResize (const uint2 &size) = 0;
32 | virtual void OnRefresh () = 0;
33 | virtual void OnDestroy () = 0;
34 | virtual void OnUpdate () = 0;
35 | virtual void OnKey (StringView key, EKeyAction action) = 0;
36 | virtual void OnMouseMove (const float2 &pos) = 0;
37 | };
38 |
39 |
40 |
41 | //
42 | // Vulkan Surface interface
43 | //
44 |
45 | class IVulkanSurface
46 | {
47 | public:
48 | virtual ~IVulkanSurface () {}
49 | ND_ virtual ArrayView GetRequiredExtensions () const = 0;
50 | ND_ virtual VkSurfaceKHR Create (VkInstance inst) const = 0;
51 | };
52 |
53 |
54 |
55 | //
56 | // Window interface
57 | //
58 |
59 | class IWindow
60 | {
61 | // types
62 | protected:
63 | using EKeyAction = IWindowEventListener::EKeyAction;
64 |
65 | // interface
66 | public:
67 | virtual ~IWindow () {}
68 | virtual bool Create (uint2 size, NtStringView title) = 0;
69 | virtual void AddListener (IWindowEventListener *listener) = 0;
70 | virtual void RemoveListener (IWindowEventListener *listener) = 0;
71 | virtual bool Update () = 0;
72 | virtual void Quit () = 0;
73 | virtual void Destroy () = 0;
74 | virtual void SetTitle (NtStringView value) = 0;
75 | virtual void SetSize (const uint2 &value) = 0;
76 | virtual void SetPosition (const int2 &value) = 0;
77 |
78 | ND_ virtual uint2 GetSize () const = 0;
79 |
80 | ND_ virtual UniquePtr GetVulkanSurface () const = 0;
81 | };
82 |
83 |
84 | using WindowPtr = UniquePtr< IWindow >;
85 |
86 | } // FGC
87 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Window/WindowGLFW.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "framework/Window/IWindow.h"
6 |
7 | #ifdef FG_ENABLE_GLFW
8 | # include "GLFW/glfw3.h"
9 |
10 | namespace FGC
11 | {
12 |
13 | //
14 | // GLFW Window
15 | //
16 |
17 | class WindowGLFW final : public IWindow
18 | {
19 | // types
20 | private:
21 | struct VulkanSurface final : public IVulkanSurface
22 | {
23 | private:
24 | GLFWwindow * _window;
25 |
26 | public:
27 | explicit VulkanSurface (GLFWwindow *wnd) : _window{wnd} {}
28 |
29 | ND_ ArrayView GetRequiredExtensions () const override;
30 | ND_ VkSurfaceKHR Create (VkInstance inst) const override;
31 | };
32 |
33 | using Listeners_t = HashSet< IWindowEventListener *>;
34 |
35 | using ActiveKeys_t = Array>;
36 |
37 |
38 | // variables
39 | private:
40 | GLFWwindow * _window;
41 | Listeners_t _listeners;
42 | ActiveKeys_t _activeKeys;
43 |
44 |
45 | // methods
46 | public:
47 | WindowGLFW ();
48 | ~WindowGLFW () override;
49 |
50 | bool Create (uint2 size, NtStringView title) override;
51 | void AddListener (IWindowEventListener *listener) override;
52 | void RemoveListener (IWindowEventListener *listener) override;
53 | bool Update () override;
54 | void Quit () override;
55 | void Destroy () override;
56 |
57 | void SetTitle (NtStringView value) override;
58 | void SetSize (const uint2 &value) override;
59 | void SetPosition (const int2 &value) override;
60 |
61 | uint2 GetSize () const override;
62 |
63 | UniquePtr GetVulkanSurface () const override;
64 |
65 |
66 | private:
67 | static void _GLFW_ErrorCallback (int code, const char* msg);
68 | static void _GLFW_RefreshCallback (GLFWwindow* wnd);
69 | static void _GLFW_ResizeCallback (GLFWwindow* wnd, int w, int h);
70 | static void _GLFW_KeyCallback (GLFWwindow* wnd, int key, int, int, int);
71 | static void _GLFW_MouseButtonCallback (GLFWwindow* wnd, int button, int action, int mods);
72 | static void _GLFW_CursorPosCallback (GLFWwindow* wnd, double xpos, double ypos);
73 | static void _GLFW_MouseWheelCallback (GLFWwindow* wnd, double dx, double dy);
74 |
75 | void _OnKeyEvent (int key, int action);
76 |
77 | ND_ static StringView _MapKey (int key);
78 | };
79 |
80 |
81 | } // FGC
82 |
83 | #endif // FG_ENABLE_GLFW
84 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Window/WindowSDL2.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "framework/Window/IWindow.h"
6 |
7 | #ifdef FG_ENABLE_SDL2
8 | # ifdef COMPILER_MSVC
9 | # pragma warning (push)
10 | # pragma warning (disable: 4005) // macros redefinition
11 | # pragma warning (disable: 4668) // '...' is not defined as a preprocessor macro
12 | # endif
13 |
14 | # define SDL_MAIN_HANDLED
15 | # include "SDL.h"
16 |
17 | # ifdef COMPILER_MSVC
18 | # pragma warning (pop)
19 | # endif
20 |
21 |
22 | namespace FGC
23 | {
24 |
25 | //
26 | // SDL2 Window
27 | //
28 |
29 | class WindowSDL2 final : public IWindow
30 | {
31 | // types
32 | private:
33 | struct VulkanSurface final : public IVulkanSurface
34 | {
35 | private:
36 | SDL_Window * _window;
37 | Array _extensions;
38 |
39 | public:
40 | explicit VulkanSurface (SDL_Window *wnd);
41 |
42 | ND_ ArrayView GetRequiredExtensions () const override { return _extensions; }
43 | ND_ VkSurfaceKHR Create (VkInstance inst) const override;
44 | };
45 |
46 | using Listeners_t = HashSet< IWindowEventListener *>;
47 | using KeyStates_t = StaticArray< EKeyAction, SDL_NUM_SCANCODES+10 >;
48 |
49 | using ActiveKeys_t = Array>;
50 |
51 |
52 | // variables
53 | private:
54 | SDL_Window * _window;
55 | uint _wndID;
56 | Listeners_t _listeners;
57 | KeyStates_t _keyStates;
58 | ActiveKeys_t _activeKeys;
59 |
60 |
61 | // methods
62 | public:
63 | WindowSDL2 ();
64 | ~WindowSDL2 () override;
65 |
66 | bool Create (uint2 size, NtStringView title) override;
67 | void AddListener (IWindowEventListener *listener) override;
68 | void RemoveListener (IWindowEventListener *listener) override;
69 | bool Update () override;
70 | void Quit () override;
71 | void Destroy () override;
72 |
73 | void SetTitle (NtStringView value) override;
74 | void SetSize (const uint2 &value) override;
75 | void SetPosition (const int2 &value) override;
76 |
77 | uint2 GetSize () const override;
78 |
79 | UniquePtr GetVulkanSurface () const override;
80 |
81 | private:
82 | static StringView _MapKey (SDL_Scancode code);
83 | };
84 |
85 |
86 | } // FGC
87 |
88 | #endif // FG_ENABLE_SDL2
89 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Window/WindowSFML.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "WindowSFML.h"
4 | #include "framework/Vulkan/VulkanSurface.h"
5 |
6 | #ifdef FG_ENABLE_SFML
7 |
8 | namespace FGC
9 | {
10 |
11 | /*
12 | =================================================
13 | constructor
14 | =================================================
15 | */
16 | WindowSFML::WindowSFML ()
17 | {
18 | }
19 |
20 | /*
21 | =================================================
22 | destructor
23 | =================================================
24 | */
25 | WindowSFML::~WindowSFML ()
26 | {
27 | Destroy();
28 | }
29 |
30 | /*
31 | =================================================
32 | Create
33 | =================================================
34 | */
35 | bool WindowSFML::Create (uint2 size, StringView title)
36 | {
37 | CHECK_ERR( not _window.isOpen() );
38 |
39 | _window.create( sf::VideoMode(size.x, size.y), String(title), sf::Style::Titlebar | sf::Style::Resize | sf::Style::Close );
40 | CHECK_ERR( _window.isOpen() );
41 |
42 | return true;
43 | }
44 |
45 | /*
46 | =================================================
47 | AddListener
48 | =================================================
49 | */
50 | void WindowSFML::AddListener (IWindowEventListener *listener)
51 | {
52 | ASSERT( listener );
53 | _listeners.insert( listener );
54 | }
55 |
56 | /*
57 | =================================================
58 | RemoveListener
59 | =================================================
60 | */
61 | void WindowSFML::RemoveListener (IWindowEventListener *listener)
62 | {
63 | ASSERT( listener );
64 | _listeners.erase( listener );
65 | }
66 |
67 | /*
68 | =================================================
69 | Update
70 | =================================================
71 | */
72 | bool WindowSFML::Update ()
73 | {
74 | if ( not _window.isOpen() )
75 | return false;
76 |
77 | sf::Event event;
78 | while ( _window.pollEvent( OUT event ) )
79 | {
80 | if ( event.type == sf::Event::Closed ) {
81 | Quit();
82 | }
83 | }
84 |
85 | for (auto& listener : _listeners) {
86 | listener->OnUpdate();
87 | }
88 | return true;
89 | }
90 |
91 | /*
92 | =================================================
93 | Quit
94 | =================================================
95 | */
96 | void WindowSFML::Quit ()
97 | {
98 | Destroy();
99 | }
100 |
101 | /*
102 | =================================================
103 | Destroy
104 | =================================================
105 | */
106 | void WindowSFML::Destroy ()
107 | {
108 | Listeners_t listeners;
109 | std::swap( listeners, _listeners );
110 |
111 | for (auto& listener : listeners) {
112 | listener->OnDestroy();
113 | }
114 |
115 | _window.close();
116 | }
117 |
118 | /*
119 | =================================================
120 | SetTitle
121 | =================================================
122 | */
123 | void WindowSFML::SetTitle (StringView value)
124 | {
125 | CHECK_ERR( _window.isOpen(), void() );
126 |
127 | _window.setTitle( String(value) );
128 | }
129 |
130 | /*
131 | =================================================
132 | SetSize
133 | =================================================
134 | */
135 | void WindowSFML::SetSize (const uint2 &value)
136 | {
137 | CHECK_ERR( _window.isOpen(), void() );
138 |
139 | _window.setSize({ int(value.x), int(value.y) });
140 | }
141 |
142 | /*
143 | =================================================
144 | SetPosition
145 | =================================================
146 | */
147 | void WindowSFML::SetPosition (const int2 &value)
148 | {
149 | CHECK_ERR( _window.isOpen(), void() );
150 |
151 | _window.setPosition({ value.x, value.y });
152 | }
153 |
154 | /*
155 | =================================================
156 | GetSize
157 | =================================================
158 | */
159 | uint2 WindowSFML::GetSize () const
160 | {
161 | CHECK_ERR( _window.isOpen() );
162 |
163 | auto size = _window.getSize();
164 | return uint2{ size.x, size.y };
165 | }
166 |
167 | /*
168 | =================================================
169 | GetVulkanSurface
170 | =================================================
171 | */
172 | UniquePtr WindowSFML::GetVulkanSurface () const
173 | {
174 | return UniquePtr{new VulkanSurface( &_window )};
175 | }
176 |
177 | } // FGC
178 | //-----------------------------------------------------------------------------
179 |
180 |
181 | # if defined(PLATFORM_WINDOWS) or defined(VK_USE_PLATFORM_WIN32_KHR)
182 | # include "stl/Platforms/WindowsHeader.h"
183 | # endif
184 |
185 | namespace FGC
186 | {
187 | /*
188 | =================================================
189 | VulkanSurface
190 | =================================================
191 | */
192 | WindowSFML::VulkanSurface::VulkanSurface (const sf::Window *wnd) :
193 | _window{wnd}, _extensions{FGC::VulkanSurface::GetRequiredExtensions()}
194 | {}
195 |
196 | /*
197 | =================================================
198 | Create
199 | =================================================
200 | */
201 | VkSurfaceKHR WindowSFML::VulkanSurface::Create (VkInstance instance) const
202 | {
203 | # if defined(PLATFORM_WINDOWS) or defined(VK_USE_PLATFORM_WIN32_KHR)
204 | return FGC::VulkanSurface::CreateWin32Surface( instance, ::GetModuleHandle(LPCSTR(null)), _window->getSystemHandle() );
205 | # endif
206 | }
207 |
208 |
209 | } // FGC
210 |
211 | #endif // FG_ENABLE_SFML
212 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/framework/Window/WindowSFML.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "framework/Window/IWindow.h"
6 |
7 | #ifdef FG_ENABLE_SFML
8 | # include
9 |
10 | namespace FGC
11 | {
12 |
13 | //
14 | // Window SFML
15 | //
16 |
17 | class WindowSFML final : public IWindow
18 | {
19 | // types
20 | private:
21 | struct VulkanSurface final : public IVulkanSurface
22 | {
23 | private:
24 | const sf::Window * _window;
25 | Array _extensions;
26 |
27 | public:
28 | explicit VulkanSurface (const sf::Window *wnd);
29 |
30 | ND_ ArrayView GetRequiredExtensions () const override { return _extensions; }
31 | ND_ VkSurfaceKHR Create (VkInstance inst) const override;
32 | };
33 |
34 | using Listeners_t = HashSet< IWindowEventListener *>;
35 |
36 |
37 | // variables
38 | private:
39 | sf::Window _window;
40 | Listeners_t _listeners;
41 |
42 |
43 | // methods
44 | public:
45 | WindowSFML ();
46 | ~WindowSFML ();
47 |
48 | bool Create (uint2 size, StringView title) override;
49 | void AddListener (IWindowEventListener *listener) override;
50 | void RemoveListener (IWindowEventListener *listener) override;
51 | bool Update () override;
52 | void Quit () override;
53 | void Destroy () override;
54 |
55 | void SetTitle (StringView value) override;
56 | void SetSize (const uint2 &value) override;
57 | void SetPosition (const int2 &value) override;
58 |
59 | uint2 GetSize () const override;
60 |
61 | UniquePtr GetVulkanSurface () const override;
62 | };
63 |
64 |
65 | } // FGC
66 |
67 | #endif // FG_ENABLE_SFML
68 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/vulkan_loader/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | file( GLOB_RECURSE SOURCES "*.*" )
4 | add_library( "VulkanLoader" STATIC ${SOURCES} )
5 | source_group( TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} )
6 | target_include_directories( "VulkanLoader" PUBLIC ".." )
7 | set_property( TARGET "VulkanLoader" PROPERTY FOLDER "Extensions" )
8 | target_link_libraries( "VulkanLoader" PUBLIC "STL" )
9 | target_link_libraries( "VulkanLoader" PUBLIC "Vulkan-lib" )
10 | install( TARGETS "VulkanLoader" ARCHIVE DESTINATION "lib" )
11 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/vulkan_loader/VulkanCheckError.cpp:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #include "stl/Algorithms/StringUtils.h"
4 |
5 | # define VK_NO_PROTOTYPES
6 | # include
7 |
8 | namespace FGC
9 | {
10 |
11 | /*
12 | =================================================
13 | __vk_CheckErrors
14 | =================================================
15 | */
16 | bool __vk_CheckErrors (VkResult errCode, const char *vkcall, const char *func, const char *file, int line)
17 | {
18 | if ( errCode == VK_SUCCESS )
19 | return true;
20 |
21 | #define VK1_CASE_ERR( _code_ ) \
22 | case _code_ : msg += FG_PRIVATE_TOSTRING( _code_ ); break;
23 |
24 | String msg( "Vulkan error: " );
25 |
26 | BEGIN_ENUM_CHECKS();
27 | switch ( errCode )
28 | {
29 | VK1_CASE_ERR( VK_NOT_READY )
30 | VK1_CASE_ERR( VK_TIMEOUT )
31 | VK1_CASE_ERR( VK_EVENT_SET )
32 | VK1_CASE_ERR( VK_EVENT_RESET )
33 | VK1_CASE_ERR( VK_INCOMPLETE )
34 | VK1_CASE_ERR( VK_ERROR_OUT_OF_HOST_MEMORY )
35 | VK1_CASE_ERR( VK_ERROR_OUT_OF_DEVICE_MEMORY )
36 | VK1_CASE_ERR( VK_ERROR_INITIALIZATION_FAILED )
37 | VK1_CASE_ERR( VK_ERROR_DEVICE_LOST )
38 | VK1_CASE_ERR( VK_ERROR_MEMORY_MAP_FAILED )
39 | VK1_CASE_ERR( VK_ERROR_LAYER_NOT_PRESENT )
40 | VK1_CASE_ERR( VK_ERROR_EXTENSION_NOT_PRESENT )
41 | VK1_CASE_ERR( VK_ERROR_FEATURE_NOT_PRESENT )
42 | VK1_CASE_ERR( VK_ERROR_INCOMPATIBLE_DRIVER )
43 | VK1_CASE_ERR( VK_ERROR_TOO_MANY_OBJECTS )
44 | VK1_CASE_ERR( VK_ERROR_FORMAT_NOT_SUPPORTED )
45 | VK1_CASE_ERR( VK_ERROR_FRAGMENTED_POOL )
46 | VK1_CASE_ERR( VK_ERROR_SURFACE_LOST_KHR )
47 | VK1_CASE_ERR( VK_ERROR_NATIVE_WINDOW_IN_USE_KHR )
48 | VK1_CASE_ERR( VK_SUBOPTIMAL_KHR )
49 | VK1_CASE_ERR( VK_ERROR_OUT_OF_DATE_KHR )
50 | VK1_CASE_ERR( VK_ERROR_INCOMPATIBLE_DISPLAY_KHR )
51 | VK1_CASE_ERR( VK_ERROR_VALIDATION_FAILED_EXT )
52 | VK1_CASE_ERR( VK_ERROR_INVALID_SHADER_NV )
53 | VK1_CASE_ERR( VK_ERROR_OUT_OF_POOL_MEMORY )
54 | VK1_CASE_ERR( VK_ERROR_INVALID_EXTERNAL_HANDLE )
55 | VK1_CASE_ERR( VK_ERROR_FRAGMENTATION_EXT )
56 | VK1_CASE_ERR( VK_ERROR_NOT_PERMITTED_EXT )
57 | VK1_CASE_ERR( VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT )
58 | VK1_CASE_ERR( VK_ERROR_INVALID_DEVICE_ADDRESS_EXT )
59 | VK1_CASE_ERR( VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT )
60 | case VK_SUCCESS :
61 | case VK_RESULT_RANGE_SIZE :
62 | case VK_RESULT_MAX_ENUM :
63 | default : msg = msg + "unknown (" + ToString(int(errCode)) + ')'; break;
64 | }
65 | END_ENUM_CHECKS();
66 | #undef VK1_CASE_ERR
67 |
68 | msg = msg + ", in " + vkcall + ", function: " + func;
69 |
70 | FG_LOGE( msg, file, line );
71 | return false;
72 | }
73 |
74 | } // FGC
75 |
--------------------------------------------------------------------------------
/external/FrameGraph/extensions/vulkan_loader/VulkanCheckError.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 |
6 | #if 0 //ndef FG_DEBUG
7 | # define VK_CALL( ... ) { (void)(__VA_ARGS__); }
8 | # define VK_CHECK( ... ) { if ((__VA_ARGS__) != VK_SUCCESS) return false; }
9 |
10 | #else
11 | # define VK_CALL( ... ) \
12 | { \
13 | const ::VkResult __vk_err__ = (__VA_ARGS__); \
14 | ::FGC::__vk_CheckErrors( __vk_err__, FG_PRIVATE_TOSTRING( __VA_ARGS__ ), FG_FUNCTION_NAME, __FILE__, __LINE__ ); \
15 | }
16 |
17 | # define FG_PRIVATE_VK_CALL_R( _func_, _ret_, ... ) \
18 | { \
19 | const ::VkResult __vk_err__ = (_func_); \
20 | if ( not ::FGC::__vk_CheckErrors( __vk_err__, FG_PRIVATE_TOSTRING( _func_ ), FG_FUNCTION_NAME, __FILE__, __LINE__ ) ) \
21 | return _ret_; \
22 | }
23 |
24 | # define VK_CHECK( ... ) \
25 | FG_PRIVATE_VK_CALL_R( FG_PRIVATE_GETARG_0( __VA_ARGS__ ), FG_PRIVATE_GETARG_1( __VA_ARGS__, ::FGC::Default ) )
26 | #endif
27 |
28 |
29 | namespace FGC
30 | {
31 |
32 | bool __vk_CheckErrors (VkResult errCode, const char *vkcall, const char *func, const char *file, int line);
33 |
34 | } // FGC
35 |
--------------------------------------------------------------------------------
/external/FrameGraph/external/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required (VERSION 3.6.0)
2 |
3 | set( FG_GLOBAL_DEFINITIONS "${FG_COMPILER_DEFINITIONS}" )
4 | set( FG_EXTERNALS_PATH "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Path to external projects sources" )
5 | set( FG_EXTERNALS_INSTALL_PATH "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Path to install external projects libraries" )
6 | #message( STATUS "FG_EXTERNALS_PATH: ${FG_EXTERNALS_PATH}" )
7 | #message( STATUS "FG_EXTERNALS_INSTALL_PATH: ${FG_EXTERNALS_INSTALL_PATH}" )
8 |
9 |
10 | # prepare for FetchContent
11 | if (NOT CMAKE_VERSION VERSION_LESS 3.11.0)
12 | include(FetchContent)
13 | #set( FETCHCONTENT_FULLY_DISCONNECTED ON CACHE BOOL "don't download externals" )
14 | set( FETCHCONTENT_UPDATES_DISCONNECTED ON CACHE BOOL "don't update externals" )
15 | endif ()
16 |
17 |
18 | # prepare for external projects
19 | if (TRUE)
20 | include( ExternalProject )
21 |
22 | set( FG_LIST_SEPARATOR "|" )
23 | string( REPLACE ";" "${FG_LIST_SEPARATOR}" FG_EXTERNAL_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" )
24 | set( FG_BUILD_TARGET_FLAGS "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
25 | "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}" )
26 |
27 | foreach ( CONFIG ${CMAKE_CONFIGURATION_TYPES} )
28 | string( TOUPPER ${CONFIG} OUT_CONFIG )
29 |
30 | set( FG_BUILD_TARGET_FLAGS
31 | "${FG_BUILD_TARGET_FLAGS}"
32 | "-DCMAKE_C_FLAGS_${OUT_CONFIG}=${CMAKE_C_FLAGS_${OUT_CONFIG}}"
33 | "-DCMAKE_CXX_FLAGS_${OUT_CONFIG}=${CMAKE_CXX_FLAGS_${OUT_CONFIG}}"
34 | "-DCMAKE_EXE_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_EXE_LINKER_FLAGS_${OUT_CONFIG}}"
35 | "-DCMAKE_STATIC_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_STATIC_LINKER_FLAGS_${OUT_CONFIG}}"
36 | "-DCMAKE_SHARED_LINKER_FLAGS_${OUT_CONFIG}=${CMAKE_SHARED_LINKER_FLAGS_${OUT_CONFIG}}"
37 | )
38 | endforeach ()
39 | endif ()
40 |
41 |
42 | set( CMAKE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/../cmake" )
43 |
44 | include( "${CMAKE_FOLDER}/download_stdoptional.cmake" )
45 | include( "${CMAKE_FOLDER}/download_stdvariant.cmake" )
46 | include( "${CMAKE_FOLDER}/download_vk.cmake" )
47 | include( "${CMAKE_FOLDER}/download_sdl2.cmake" )
48 | include( "${CMAKE_FOLDER}/download_glfw.cmake" )
49 | include( "${CMAKE_FOLDER}/download_glslang.cmake" )
50 | include( "${CMAKE_FOLDER}/download_vma.cmake" )
51 |
52 |
53 | set( FG_GLOBAL_DEFINITIONS "${FG_GLOBAL_DEFINITIONS}" CACHE INTERNAL "" FORCE )
54 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/Algorithms/Cast.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 | #include "stl/Containers/Ptr.h"
7 | #include "stl/Math/BitMath.h"
8 |
9 | namespace FGC
10 | {
11 |
12 | /*
13 | =================================================
14 | Cast
15 | =================================================
16 | */
17 | template
18 | ND_ forceinline SharedPtr Cast (const SharedPtr &other)
19 | {
20 | return std::static_pointer_cast( other );
21 | }
22 |
23 | /*
24 | =================================================
25 | DynCast
26 | =================================================
27 | */
28 | template
29 | ND_ forceinline SharedPtr DynCast (const SharedPtr &other)
30 | {
31 | return std::dynamic_pointer_cast( other );
32 | }
33 |
34 | /*
35 | =================================================
36 | CheckPointerAlignment
37 | =================================================
38 | */
39 | template
40 | ND_ forceinline bool CheckPointerAlignment (T const* ptr)
41 | {
42 | if constexpr( not std::is_void_v )
43 | {
44 | constexpr size_t align = alignof(R);
45 |
46 | STATIC_ASSERT( IsPowerOfTwo( align ), "Align must be power of 2" );
47 |
48 | return (sizeof(R) < align) or not (size_t(ptr) & (align-1));
49 | }
50 | else
51 | {
52 | FG_UNUSED( ptr );
53 | return true;
54 | }
55 | }
56 |
57 | /*
58 | =================================================
59 | Cast
60 | =================================================
61 | */
62 | template
63 | ND_ forceinline constexpr R const volatile* Cast (T const volatile* value)
64 | {
65 | ASSERT( CheckPointerAlignment( value ));
66 | return static_cast< R const volatile *>( static_cast< void const volatile *>(value) );
67 | }
68 |
69 | template
70 | ND_ forceinline constexpr R volatile* Cast (T volatile* value)
71 | {
72 | ASSERT( CheckPointerAlignment( value ));
73 | return static_cast< R volatile *>( static_cast< void volatile *>(value) );
74 | }
75 |
76 | template
77 | ND_ forceinline constexpr R const* Cast (T const* value)
78 | {
79 | ASSERT( CheckPointerAlignment( value ));
80 | return static_cast< R const *>( static_cast< void const *>(value) );
81 | }
82 |
83 | template
84 | ND_ forceinline constexpr R* Cast (T* value)
85 | {
86 | ASSERT( CheckPointerAlignment( value ));
87 | return static_cast< R *>( static_cast< void *>(value) );
88 | }
89 |
90 | template
91 | ND_ forceinline constexpr Ptr Cast (Ptr value)
92 | {
93 | return Cast( value.operator->() );
94 | }
95 |
96 | template
97 | ND_ forceinline constexpr Ptr Cast (Ptr value)
98 | {
99 | return Cast( value.operator->() );
100 | }
101 |
102 | /*
103 | =================================================
104 | DynCast
105 | =================================================
106 | */
107 | template
108 | ND_ forceinline constexpr R const* DynCast (T const* value)
109 | {
110 | return dynamic_cast< R const *>( value );
111 | }
112 |
113 | template
114 | ND_ forceinline constexpr R* DynCast (T* value)
115 | {
116 | return dynamic_cast< R *>( value );
117 | }
118 |
119 | template
120 | ND_ forceinline constexpr Ptr DynCast (Ptr value)
121 | {
122 | return DynCast( value.operator->() );
123 | }
124 |
125 | template
126 | ND_ forceinline constexpr Ptr DynCast (Ptr value)
127 | {
128 | return DynCast( value.operator->() );
129 | }
130 |
131 | /*
132 | =================================================
133 | MakeShared
134 | =================================================
135 | */
136 | template
137 | ND_ forceinline SharedPtr MakeShared (Types&&... args)
138 | {
139 | return std::make_shared( std::forward( args )... );
140 | }
141 |
142 | /*
143 | =================================================
144 | MakeUnique
145 | =================================================
146 | */
147 | template
148 | ND_ forceinline UniquePtr MakeUnique (Types&&... args)
149 | {
150 | return std::make_unique( std::forward( args )... );
151 | }
152 |
153 | /*
154 | =================================================
155 | BitCast
156 | =================================================
157 | */
158 | template
159 | ND_ inline constexpr To BitCast (const From& src)
160 | {
161 | STATIC_ASSERT( sizeof(To) == sizeof(From), "must be same size!" );
162 | STATIC_ASSERT( alignof(To) == alignof(From), "must be same align!" );
163 | //STATIC_ASSERT( std::is_trivially_copyable::value and std::is_trivial::value, "must be trivial types!" );
164 |
165 | To dst;
166 | std::memcpy( OUT &dst, &src, sizeof(To) );
167 | return dst;
168 | }
169 |
170 |
171 | } // FGC
172 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/Algorithms/EnumUtils.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 |
7 | namespace FGC
8 | {
9 |
10 | template
11 | using NearInt = Conditional< (sizeof(T) <= sizeof(int32_t)), int32_t, int64_t >;
12 |
13 | template
14 | using NearUInt = Conditional< (sizeof(T) <= sizeof(uint32_t)), uint32_t, uint64_t >;
15 |
16 | /*
17 | =================================================
18 | EnumToUInt
19 | =================================================
20 | */
21 | template
22 | ND_ forceinline constexpr NearUInt EnumToUInt (const T &value)
23 | {
24 | STATIC_ASSERT( IsScalarOrEnum );
25 | STATIC_ASSERT( sizeof(value) <= sizeof(NearUInt) );
26 |
27 | return NearUInt( value );
28 | }
29 |
30 | /*
31 | =================================================
32 | EnumToInt
33 | =================================================
34 | */
35 | template
36 | ND_ forceinline constexpr NearInt EnumToInt (const T &value)
37 | {
38 | STATIC_ASSERT( IsScalarOrEnum );
39 | STATIC_ASSERT( sizeof(value) <= sizeof(NearInt) );
40 |
41 | return NearInt( value );
42 | }
43 |
44 | /*
45 | =================================================
46 | EnumEq
47 | ----
48 | returns 'true' if 'lhs' has ALL bits that presented in 'rhs'
49 | =================================================
50 | */
51 | template
52 | ND_ forceinline constexpr bool EnumEq (const T1& lhs, const T2& rhs)
53 | {
54 | STATIC_ASSERT( IsScalarOrEnum< T1 > );
55 | STATIC_ASSERT( IsScalarOrEnum< T2 > );
56 | ASSERT( rhs != T2(0) );
57 |
58 | return ( EnumToUInt(lhs) & EnumToUInt(rhs) ) == EnumToUInt(rhs);
59 | }
60 |
61 | /*
62 | =================================================
63 | EnumAny
64 | ----
65 | returns 'true' if 'lhs' has ANY bit that presented in 'rhs'
66 | =================================================
67 | */
68 | template
69 | ND_ forceinline constexpr bool EnumAny (const T1& lhs, const T2& rhs)
70 | {
71 | STATIC_ASSERT( IsScalarOrEnum< T1 > );
72 | STATIC_ASSERT( IsScalarOrEnum< T2 > );
73 | ASSERT( rhs != T2(0) );
74 |
75 | return !!( EnumToUInt(lhs) & EnumToUInt(rhs) );
76 | }
77 |
78 | } // FGC
79 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/Algorithms/Hash.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include
6 | #include "stl/Log/Log.h"
7 | #include "stl/CompileTime/TypeTraits.h"
8 |
9 | namespace FGC
10 | {
11 |
12 | //
13 | // Hash Value
14 | //
15 |
16 | struct HashVal
17 | {
18 | // variables
19 | private:
20 | size_t _value = 0;
21 |
22 | // methods
23 | public:
24 | constexpr HashVal () {}
25 | explicit constexpr HashVal (size_t val) : _value{val} {}
26 |
27 | ND_ constexpr bool operator == (const HashVal &rhs) const { return _value == rhs._value; }
28 | ND_ constexpr bool operator != (const HashVal &rhs) const { return not (*this == rhs); }
29 | ND_ constexpr bool operator > (const HashVal &rhs) const { return _value > rhs._value; }
30 | ND_ constexpr bool operator < (const HashVal &rhs) const { return _value < rhs._value; }
31 |
32 | constexpr HashVal& operator << (const HashVal &rhs)
33 | {
34 | const size_t mask = (sizeof(_value)*8 - 1);
35 | size_t val = rhs._value;
36 | size_t shift = 8;
37 |
38 | shift &= mask;
39 | _value ^= (val << shift) | (val >> ( ~(shift-1) & mask )); // TODO: add constant
40 |
41 | return *this;
42 | }
43 |
44 | ND_ constexpr const HashVal operator + (const HashVal &rhs) const
45 | {
46 | return HashVal(*this) << rhs;
47 | }
48 |
49 | ND_ explicit constexpr operator size_t () const { return _value; }
50 | };
51 | //-----------------------------------------------------------------------------
52 |
53 |
54 |
55 | /*
56 | =================================================
57 | HashOf
58 | =================================================
59 | */
60 | template
61 | ND_ forceinline EnableIf, HashVal> HashOf (const T &value)
62 | {
63 | return HashVal( std::hash()( value ));
64 | }
65 |
66 | /*
67 | =================================================
68 | HashOf (float)
69 | =================================================
70 | */
71 | ND_ forceinline HashVal HashOf (const float &value, uint32_t ignoreMantissaBits = (23-10))
72 | {
73 | ASSERT( ignoreMantissaBits < 23 );
74 | uint32_t dst;
75 | std::memcpy( OUT &dst, &value, sizeof(dst) );
76 | dst &= ~((1 << ignoreMantissaBits)-1);
77 | return HashVal( std::hash()( dst ));
78 | }
79 |
80 | /*
81 | =================================================
82 | HashOf (double)
83 | =================================================
84 | */
85 | ND_ forceinline HashVal HashOf (const double &value, uint32_t ignoreMantissaBits = (52-10))
86 | {
87 | ASSERT( ignoreMantissaBits < 52 );
88 | uint64_t dst;
89 | std::memcpy( OUT &dst, &value, sizeof(dst) );
90 | dst &= ~((1 << ignoreMantissaBits)-1);
91 | return HashVal( std::hash()( dst ));
92 | }
93 |
94 | /*
95 | =================================================
96 | HashOf (buffer)
97 | ----
98 | use private api to calculate hash of buffer
99 | =================================================
100 | */
101 | ND_ forceinline HashVal HashOf (const void *ptr, size_t sizeInBytes)
102 | {
103 | ASSERT( ptr and sizeInBytes );
104 |
105 | # if defined(FG_HAS_HASHFN_HashArrayRepresentation)
106 | return HashVal{std::_Hash_array_representation( static_cast(ptr), sizeInBytes )};
107 |
108 | #elif defined(FG_HAS_HASHFN_Murmur2OrCityhash)
109 | return HashVal{std::__murmur2_or_cityhash()( ptr, sizeInBytes )};
110 |
111 | #elif defined(FG_HAS_HASHFN_HashBytes)
112 | return HashVal{std::_Hash_bytes( ptr, sizeInBytes, 0 )};
113 |
114 | #else
115 | FG_COMPILATION_MESSAGE( "used fallback hash function" )
116 | const uint8_t* buf = static_cast(ptr);
117 | HashVal result;
118 | for (size_t i = 0; i < sizeInBytes; ++i) {
119 | result << HashVal{buf[i]};
120 | }
121 | return result;
122 | #endif
123 | }
124 |
125 | } // FGC
126 |
127 |
128 | namespace std
129 | {
130 | template
131 | struct hash< std::pair >
132 | {
133 | ND_ size_t operator () (const std::pair &value) const
134 | {
135 | return size_t(FGC::HashOf( value.first ) + FGC::HashOf( value.second ));
136 | }
137 | };
138 |
139 | } // std
140 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/Algorithms/StringParser.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Algorithms/StringUtils.h"
6 |
7 | namespace FGC
8 | {
9 |
10 | //
11 | // String Parser
12 | //
13 |
14 | struct StringParser final
15 | {
16 | public:
17 | static void ToEndOfLine (StringView str, INOUT size_t &pos);
18 | static void ToBeginOfLine (StringView str, INOUT size_t &pos);
19 | static void ToNextLine (StringView str, INOUT size_t &pos);
20 | static void ToPrevLine (StringView str, INOUT size_t &pos);
21 |
22 | ND_ static bool IsBeginOfLine (StringView str, size_t pos);
23 | ND_ static bool IsEndOfLine (StringView str, size_t pos);
24 |
25 | ND_ static size_t CalculateNumberOfLines (StringView str);
26 |
27 | static bool MoveToLine (StringView str, INOUT size_t &pos, size_t lineNumber);
28 |
29 | static void ReadCurrLine (StringView str, INOUT size_t &pos, OUT StringView &result);
30 | static void ReadLineToEnd (StringView str, INOUT size_t &pos, OUT StringView &result);
31 |
32 | static bool ReadTo (StringView str, StringView endSymbol, INOUT size_t &pos, OUT StringView &result);
33 |
34 | static bool ReadString (StringView str, INOUT size_t &pos, OUT StringView &result);
35 | };
36 |
37 |
38 | } // FGC
39 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required( VERSION 3.10 FATAL_ERROR )
2 |
3 | file( GLOB_RECURSE SOURCES "*.*" )
4 | add_library( "STL" STATIC ${SOURCES} )
5 | source_group( TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCES} )
6 | target_link_libraries( "STL" "ProjectTemplate" )
7 | target_include_directories( "STL" PUBLIC ".." )
8 | set_property( TARGET "STL" PROPERTY FOLDER "" )
9 |
10 | if (UNIX)
11 | target_link_libraries( "STL" "dl;pthread" )
12 | target_compile_definitions( "STL" PUBLIC _LARGEFILE_SOURCE )
13 | target_compile_definitions( "STL" PUBLIC _LARGE_FILES )
14 | target_compile_definitions( "STL" PUBLIC _FILE_OFFSET_BITS=64 )
15 | endif()
16 |
17 | install( TARGETS "STL" ARCHIVE DESTINATION "lib" )
18 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/Common.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 | /*
3 | Frame Graph Core library
4 | */
5 |
6 | #pragma once
7 |
8 | #include "stl/Defines.h"
9 |
10 | #include
11 | #include
12 | #include
13 | #include // shared_ptr, weak_ptr, unique_ptr
14 | #include
15 | #include
16 | #include
17 | #include
18 | #include
19 | #include
20 | #include
21 | #include
22 |
23 | #include "stl/Log/Log.h"
24 | #include "stl/Algorithms/Hash.h"
25 | #include "stl/CompileTime/TypeTraits.h"
26 | #include "stl/CompileTime/UMax.h"
27 | #include "stl/CompileTime/DefaultType.h"
28 |
29 |
30 | namespace FGC
31 | {
32 | using uint = uint32_t;
33 |
34 | using String = std::string;
35 | template using BasicString = std::basic_string< T >;
36 |
37 | template using Array = std::vector< T >;
38 |
39 | template using UniquePtr = std::unique_ptr< T >;
40 |
41 | template using SharedPtr = std::shared_ptr< T >;
42 | template using WeakPtr = std::weak_ptr< T >;
43 |
44 | template using Deque = std::deque< T >;
45 |
46 | template using BitSet = std::bitset< N >;
47 |
48 | template using Tuple = std::tuple< T... >;
49 |
50 |
51 | template
53 | using StaticArray = std::array< T, ArraySize >;
54 |
55 |
56 | template
58 | using Pair = std::pair< FirstT, SecondT >;
59 |
60 |
61 | template >
63 | using HashSet = std::unordered_set< T, Hasher >;
64 |
65 |
66 | template >
69 | using HashMap = std::unordered_map< Key, Value, Hasher >;
70 |
71 |
72 | # ifdef FG_OPTIMAL_MEMORY_ORDER
73 | static constexpr std::memory_order memory_order_acquire = std::memory_order_acquire;
74 | static constexpr std::memory_order memory_order_release = std::memory_order_release;
75 | static constexpr std::memory_order memory_order_acq_rel = std::memory_order_acq_rel;
76 | static constexpr std::memory_order memory_order_relaxed = std::memory_order_relaxed;
77 | # else
78 | static constexpr std::memory_order memory_order_acquire = std::memory_order_seq_cst;
79 | static constexpr std::memory_order memory_order_release = std::memory_order_seq_cst;
80 | static constexpr std::memory_order memory_order_acq_rel = std::memory_order_seq_cst;
81 | static constexpr std::memory_order memory_order_relaxed = std::memory_order_seq_cst;
82 | # endif // FG_OPTIMAL_MEMORY_ORDER
83 |
84 |
85 | } // FGC
86 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CompileTime/DefaultType.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 |
6 | namespace FGC
7 | {
8 | namespace _fgc_hidden_
9 | {
10 | template
11 | struct _IsEnumWithUnknown2 {
12 | static const bool value = false;
13 | };
14 |
15 | template
16 | struct _IsEnumWithUnknown2< T, true > {
17 | static const bool value = true; //Detect_Unknown::value;
18 | };
19 |
20 | template
21 | static constexpr bool _IsEnumWithUnknown = _IsEnumWithUnknown2< T, IsEnum >::value;
22 |
23 |
24 | template
25 | struct _GetDefaultValueForUninitialized2 {};
26 |
27 | template
28 | struct _GetDefaultValueForUninitialized2< T, 0 > {
29 | static T Get () { return T(); }
30 | };
31 |
32 | template
33 | struct _GetDefaultValueForUninitialized2< T, /*int, float, pointer*/2 > {
34 | static T Get () { return T(0); }
35 | };
36 |
37 | template
38 | struct _GetDefaultValueForUninitialized2< T, /*enum*/1 > {
39 | static T Get () { return T::Unknown; }
40 | };
41 |
42 |
43 | template
44 | struct _GetDefaultValueForUninitialized
45 | {
46 | static constexpr int GetIndex ()
47 | {
48 | return _IsEnumWithUnknown ? 1 :
49 | std::is_floating_point::value or
50 | std::is_integral::value or
51 | std::is_pointer::value or
52 | std::is_enum::value ? 2 :
53 | 0;
54 | }
55 |
56 | static constexpr T GetDefault ()
57 | {
58 | return _GetDefaultValueForUninitialized2< T, GetIndex() >::Get();
59 | }
60 | };
61 |
62 |
63 | struct DefaultType final
64 | {
65 | constexpr DefaultType ()
66 | {}
67 |
68 | template
69 | ND_ constexpr operator T () const
70 | {
71 | return _GetDefaultValueForUninitialized::GetDefault();
72 | }
73 |
74 | template
75 | ND_ friend constexpr bool operator == (const T& lhs, const DefaultType &)
76 | {
77 | return lhs == _GetDefaultValueForUninitialized::GetDefault();
78 | }
79 |
80 | template
81 | ND_ friend constexpr bool operator != (const T& lhs, const DefaultType &rhs)
82 | {
83 | return not (lhs == rhs);
84 | }
85 | };
86 |
87 | } // _fgc_hidden_
88 |
89 |
90 | static constexpr _fgc_hidden_::DefaultType Default = {};
91 |
92 | } // FGC
93 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CompileTime/Hash.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 |
7 | namespace FGC
8 | {
9 | namespace _fgc_hidden_
10 | {
11 | // from https://stackoverflow.com/questions/2111667/compile-time-string-hashing
12 | static constexpr uint crc_table[256] = {
13 | 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
14 | 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
15 | 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
16 | 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
17 | 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
18 | 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
19 | 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
20 | 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
21 | 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
22 | 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
23 | 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
24 | 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
25 | 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
26 | 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
27 | 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
28 | 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
29 | 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
30 | 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
31 | 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
32 | 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
33 | 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
34 | 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
35 | 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
36 | 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
37 | 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
38 | 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
39 | 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
40 | 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
41 | 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
42 | 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
43 | 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
44 | 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
45 | 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
46 | 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
47 | 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
48 | 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
49 | 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
50 | 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
51 | 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
52 | 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
53 | 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
54 | 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
55 | 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
56 | };
57 |
58 | ND_ forceinline constexpr uint crc32_hash (char const *str, size_t len, uint prev_crc)
59 | {
60 | return (*str and len) ?
61 | crc32_hash( str+1, len-1, (prev_crc >> 8) ^ crc_table[(prev_crc ^ *str) & 0xFF] ) :
62 | (prev_crc ^ 0xFFFFFFFF);
63 | }
64 |
65 | } // _fgc_hidden_
66 |
67 |
68 | /*
69 | =================================================
70 | CT_Hash (string)
71 | =================================================
72 | */
73 | ND_ inline constexpr HashVal CT_Hash (const char *str, size_t len, uint seed)
74 | {
75 | return HashVal{_fgc_hidden_::crc32_hash( str, len, seed )};
76 | }
77 |
78 |
79 | } // FGC
80 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CompileTime/Math.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 | #include "stl/CompileTime/TypeTraits.h"
7 |
8 | namespace FGC
9 | {
10 |
11 | /*
12 | =================================================
13 | CT_IntLog2
14 | =================================================
15 | */
16 | namespace _fgc_hidden_
17 | {
18 | template
19 | struct _IntLog2 {
20 | static const int value = int((X >> Bit) != 0) + _IntLog2::value;
21 | };
22 |
23 | template
24 | struct _IntLog2< T, X, 0 > {
25 | static const int value = 0;
26 | };
27 |
28 | } // _fgc_hidden_
29 |
30 | template
31 | static constexpr int CT_IntLog2 = (X ? _fgc_hidden_::_IntLog2< decltype(X), X, sizeof(X)*8-1 >::value : -1);
32 |
33 |
34 | /*
35 | =================================================
36 | CT_Pow
37 | =================================================
38 | */
39 | template
40 | inline constexpr T CT_Pow (const T &base)
41 | {
42 | STATIC_ASSERT( IsInteger and IsInteger and Power >= 0 );
43 |
44 | if constexpr( Power == 0 )
45 | {
46 | FG_UNUSED( base );
47 | return 1;
48 | }
49 | else
50 | return CT_Pow( base ) * base;
51 | }
52 |
53 |
54 | } // FGC
55 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CompileTime/TypeList.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include "stl/Common.h"
6 |
7 | namespace FGC
8 | {
9 | namespace _fgc_hidden_
10 | {
11 |
12 | template
13 | struct TL_GetIndex;
14 |
15 | template
16 | struct TL_GetIndex< Type, I, std::tuple<> >
17 | {
18 | inline static constexpr size_t value = UMax;
19 | };
20 |
21 | template
22 | struct TL_GetIndex< Type, I, std::tuple >
23 | {
24 | inline static constexpr size_t value = Conditional< IsSameTypes,
25 | std::integral_constant, TL_GetIndex< Type, I+1, std::tuple > >::value;
26 | };
27 |
28 | } // _fgc_hidden_
29 |
30 |
31 | //
32 | // Type List
33 | //
34 |
35 | template
36 | struct TypeList
37 | {
38 | public:
39 | template
40 | inline static constexpr size_t Index = _fgc_hidden_::TL_GetIndex< T, 0, std::tuple >::value;
41 |
42 | inline static constexpr size_t Count = std::tuple_size< std::tuple >::value;
43 |
44 | template
45 | inline static constexpr bool HasType = (Index != UMax);
46 |
47 | template
48 | using Get = typename std::tuple_element>::type;
49 |
50 | template
51 | using GetT = std::tuple_element>;
52 |
53 | struct Front { using type = Get<0>; };
54 | struct Back { using type = Get; };
55 |
56 | template
57 | static constexpr void Visit (FN&& fn) { return _Visit<0>( std::forward(fn) ); }
58 |
59 | private:
60 | template
61 | static constexpr void _Visit (FN&& fn)
62 | {
63 | if constexpr( I < Count )
64 | {
65 | using T = Get;
66 | fn.template operator()();
67 | _Visit< I+1 >( std::forward(fn) );
68 | }
69 | FG_UNUSED( fn );
70 | }
71 | };
72 |
73 |
74 | template
75 | struct TypeList< std::tuple > final : TypeList< Types... >
76 | {};
77 |
78 |
79 | } // FGC
80 |
--------------------------------------------------------------------------------
/external/FrameGraph/stl/CompileTime/TypeTraits.h:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018-2020, Zhirnov Andrey. For more information see 'LICENSE'
2 |
3 | #pragma once
4 |
5 | #include
6 | #include
7 |
8 | namespace FGC
9 | {
10 |
11 | template
12 | static constexpr bool IsFloatPoint = std::is_floating_point::value;
13 |
14 | template
15 | static constexpr bool IsInteger = std::is_integral::value;
16 |
17 | template
18 | static constexpr bool IsSignedInteger = std::is_integral::value && std::is_signed::value;
19 |
20 | template
21 | static constexpr bool IsUnsignedInteger = std::is_integral::value && std::is_unsigned::value;
22 |
23 | template
24 | static constexpr bool IsStaticArray = std::is_array::value;
25 |
26 | template
27 | static constexpr bool IsScalar = std::is_scalar::value;
28 |
29 | template
30 | static constexpr bool IsEnum = std::is_enum::value;
31 |
32 | template
33 | static constexpr bool IsScalarOrEnum = std::is_scalar::value or std::is_enum::value;
34 |
35 | template
36 | static constexpr bool IsPOD = std::is_pod::value;
37 |
38 | template
39 | static constexpr bool IsPointer = std::is_pointer::value;
40 |
41 | template
42 | static constexpr bool IsClass = std::is_class::value;
43 |
44 | template
45 | static constexpr bool IsUnion = std::is_union::value;
46 |
47 | template
48 | static constexpr bool IsConst = std::is_const::value;
49 |
50 | template
51 | static constexpr bool IsSameTypes = std::is_same::value;
52 |
53 |
54 | template
55 | using EnableIf = std::enable_if_t< Test, Type >;
56 |
57 | template
58 | using DisableIf = std::enable_if_t< !Test, Type >;
59 |
60 |
61 | template
62 | using Conditional = std::conditional_t< Test, IfTrue, IfFalse >;
63 |
64 |
65 | template