Commit: 8e437578342193832d8f66f9d8c81d6be723e927 Author: Jeroen Bakker Date: Tue Nov 9 12:31:34 2021 +0100 Branches: tmp-vulkan https://developer.blender.org/rB8e437578342193832d8f66f9d8c81d6be723e927
GHOST: Vulkan Backend. This adds a vulkan backend to GHOST. Still WIP, we should decide what would be the minimum requirement to land in master. Differential Revision: https://developer.blender.org/D13155 =================================================================== M CMakeLists.txt M build_files/cmake/platform/platform_unix.cmake M build_files/cmake/platform/platform_win32.cmake M intern/ghost/CMakeLists.txt M intern/ghost/GHOST_C-api.h M intern/ghost/GHOST_IContext.h M intern/ghost/GHOST_ISystem.h M intern/ghost/GHOST_IWindow.h M intern/ghost/GHOST_Types.h M intern/ghost/intern/GHOST_C-api.cpp M intern/ghost/intern/GHOST_Context.h A intern/ghost/intern/GHOST_ContextVK.cpp A intern/ghost/intern/GHOST_ContextVK.h M intern/ghost/intern/GHOST_System.h M intern/ghost/intern/GHOST_SystemCocoa.h M intern/ghost/intern/GHOST_SystemCocoa.mm M intern/ghost/intern/GHOST_SystemNULL.h M intern/ghost/intern/GHOST_SystemSDL.cpp M intern/ghost/intern/GHOST_SystemSDL.h M intern/ghost/intern/GHOST_SystemWayland.cpp M intern/ghost/intern/GHOST_SystemWayland.h M intern/ghost/intern/GHOST_SystemWin32.cpp M intern/ghost/intern/GHOST_SystemWin32.h M intern/ghost/intern/GHOST_SystemX11.cpp M intern/ghost/intern/GHOST_SystemX11.h M intern/ghost/intern/GHOST_Window.h M intern/ghost/intern/GHOST_WindowCocoa.mm M intern/ghost/intern/GHOST_WindowWayland.cpp M intern/ghost/intern/GHOST_WindowWin32.cpp M intern/ghost/intern/GHOST_WindowX11.cpp M intern/ghost/intern/GHOST_WindowX11.h M intern/ghost/test/multitest/MultiTest.c M source/blender/windowmanager/intern/wm_window.c =================================================================== diff --git a/CMakeLists.txt b/CMakeLists.txt index d2e2d02dcde..6527c82c0fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -513,9 +513,12 @@ if(UNIX AND NOT APPLE) endif() +# Vulkan +option(WITH_VULKAN "Enable Vulkan GHOST backend (for development purposes)" OFF) + # OpenGL -option(WITH_OPENGL "When off limits visibility of the opengl headers to just bf_gpu and gawain (temporary option for development purposes)" ON) +option(WITH_OPENGL "When off limits visibility of the opengl headers to just bf_gpu (temporary option for development purposes)" ON) option(WITH_GLEW_ES "Switches to experimental copy of GLEW that has support for OpenGL ES. (temporary option for development purposes)" OFF) option(WITH_GL_EGL "Use the EGL OpenGL system library instead of the platform specific OpenGL system library (CGL, glX, or WGL)" OFF) option(WITH_GL_PROFILE_ES20 "Support using OpenGL ES 2.0. (through either EGL or the AGL/WGL/XGL 'es20' profile)" OFF) @@ -525,6 +528,7 @@ mark_as_advanced( WITH_GLEW_ES WITH_GL_EGL WITH_GL_PROFILE_ES20 + WITH_VULKAN ) if(WIN32) @@ -1125,6 +1129,15 @@ if(WITH_OPENVDB) list(APPEND OPENVDB_LIBRARIES ${BOOST_LIBRARIES} ${TBB_LIBRARIES}) endif() +#----------------------------------------------------------------------------- +# Configure Vulkan. + +if(WITH_VULKAN) + list(APPEND BLENDER_GL_LIBRARIES ${Vulkan_LIBRARY}) + + add_definitions(-DWITH_VULKAN) +endif() + #----------------------------------------------------------------------------- # Configure OpenGL. diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index fc0c37e4c8b..7f0e53b141d 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -102,6 +102,10 @@ find_package_wrapper(ZLIB REQUIRED) find_package_wrapper(Zstd REQUIRED) find_package_wrapper(Freetype REQUIRED) +if(WITH_VULKAN) + find_package_wrapper(Vulkan REQUIRED) +endif() + if(WITH_PYTHON) # No way to set py35, remove for now. # find_package(PythonLibs) diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index e83eba74fc0..e837f14433e 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -874,5 +874,19 @@ if(WITH_HARU) endif() endif() +if(WITH_VULKAN) + if(EXISTS ${LIBDIR}/vulkan) + set(Vulkan_FOUND On) + set(Vulkan_ROOT_DIR ${LIBDIR}/vulkan) + set(Vulkan_INCLUDE_DIR ${Vulkan_ROOT_DIR}/include) + set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR}) + set(Vulkan_LIBRARY ${Vulkan_ROOT_DIR}/lib/vulkan-1.lib) + set(Vulkan_LIBRARIES ${Vulkan_LIBRARY}) + else() + message(WARNING "vulkan was not found, disabling WITH_VULKAN") + set(WITH_VULKAN OFF) + endif() +endif() + set(ZSTD_INCLUDE_DIRS ${LIBDIR}/zstd/include) set(ZSTD_LIBRARIES ${LIBDIR}/zstd/lib/zstd_static.lib) diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt index 41642311185..1404b3489ec 100644 --- a/intern/ghost/CMakeLists.txt +++ b/intern/ghost/CMakeLists.txt @@ -89,6 +89,18 @@ set(LIB ${GLEW_LIBRARY} ) +if(WITH_VULKAN) + list(APPEND SRC + intern/GHOST_ContextVK.cpp + + intern/GHOST_ContextVK.h + ) + + list(APPEND INC_SYS + ${Vulkan_INCLUDE_DIRS} + ) +endif() + if(WITH_GHOST_DEBUG) list(APPEND SRC intern/GHOST_EventPrinter.cpp diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h index 784febe8581..48f104776d1 100644 --- a/intern/ghost/GHOST_C-api.h +++ b/intern/ghost/GHOST_C-api.h @@ -195,6 +195,7 @@ extern GHOST_WindowHandle GHOST_CreateWindow(GHOST_SystemHandle systemhandle, * \return A handle to the new context ( == NULL if creation failed). */ extern GHOST_ContextHandle GHOST_CreateOpenGLContext(GHOST_SystemHandle systemhandle, + GHOST_TDrawingContextType type, GHOST_GLSettings glSettings); /** @@ -542,6 +543,13 @@ extern int GHOST_GetValid(GHOST_WindowHandle windowhandle); */ extern GHOST_TDrawingContextType GHOST_GetDrawingContextType(GHOST_WindowHandle windowhandle); +/** + * Returns the drawing context used in this window. + * \param windowhandle: The handle to the window. + * \return The window drawing context. + */ +extern GHOST_ContextHandle GHOST_GetDrawingContext(GHOST_WindowHandle windowhandle); + /** * Tries to install a rendering context in this window. * \param windowhandle: The handle to the window. @@ -1166,6 +1174,30 @@ int GHOST_XrGetControllerModelData(GHOST_XrContextHandle xr_context, #endif /* WITH_XR_OPENXR */ +#ifdef WITH_VULKAN + +/** + * Return vulkan handles for the given context. + */ +void GHOST_GetVulkanHandles(GHOST_ContextHandle context, + void *r_instance, + void *r_physical_device, + void *r_device, + uint32_t *r_graphic_queue_familly); + +/** + * Return vulkan backbuffer resources handles for the given window. + */ +void GHOST_GetVulkanBackbuffer(GHOST_WindowHandle windowhandle, + void *image, + void *framebuffer, + void *command_buffer, + void *render_pass, + void *extent, + uint32_t *fb_id); + +#endif + #ifdef __cplusplus } diff --git a/intern/ghost/GHOST_IContext.h b/intern/ghost/GHOST_IContext.h index 1b5f996cb54..4b8e6c0e567 100644 --- a/intern/ghost/GHOST_IContext.h +++ b/intern/ghost/GHOST_IContext.h @@ -56,6 +56,11 @@ class GHOST_IContext { virtual unsigned int getDefaultFramebuffer() = 0; + virtual GHOST_TSuccess getVulkanHandles(void *, void *, void *, uint32_t *) = 0; + + virtual GHOST_TSuccess getVulkanBackbuffer( + void *, void *, void *, void *, void *, uint32_t *) = 0; + virtual GHOST_TSuccess swapBuffers() = 0; #ifdef WITH_CXX_GUARDEDALLOC diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h index 05c6c9d907f..0e95971795b 100644 --- a/intern/ghost/GHOST_ISystem.h +++ b/intern/ghost/GHOST_ISystem.h @@ -265,7 +265,8 @@ class GHOST_ISystem { * Never explicitly delete the context, use #disposeContext() instead. * \return The new context (or 0 if creation failed). */ - virtual GHOST_IContext *createOffscreenContext(GHOST_GLSettings glSettings) = 0; + virtual GHOST_IContext *createOffscreenContext(GHOST_TDrawingContextType type, + GHOST_GLSettings glSettings) = 0; /** * Dispose of a context. diff --git a/intern/ghost/GHOST_IWindow.h b/intern/ghost/GHOST_IWindow.h index 91f576ca304..4642241845e 100644 --- a/intern/ghost/GHOST_IWindow.h +++ b/intern/ghost/GHOST_IWindow.h @@ -30,6 +30,8 @@ #include <stdlib.h> #include <string> +class GHOST_IContext; + /** * Interface for GHOST windows. * @@ -71,6 +73,12 @@ class GHOST_IWindow { */ virtual GHOST_TDrawingContextType getDrawingContextType() = 0; + /** + * Returns the type of drawing context used in this window. + * \return The current type of drawing context. + */ + virtual GHOST_IContext *getDrawingContext() = 0; + /** * Tries to install a rendering context in this window. * \param type: The type of rendering context installed. @@ -218,6 +226,18 @@ class GHOST_IWindow { */ virtual unsigned int getDefaultFramebuffer() = 0; + /** + * Gets the Vulkan framebuffer related resource handles associated with the Vulkan context. + * Needs to be called after each swap events as the framebuffer will change. + * \return A boolean success indicator. + */ + virtual GHOST_TSuccess getVulkanBackbuffer(void * /*image*/, + void * /*framebuffer*/, + void * /*command_buffer*/, + void * /*render_pass*/, + void * /*extent*/, + uint32_t * /*fb_id*/) = 0; + /** * Invalidates the contents of this window. * \return Indication of success. diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h index 2c8014a08cc..ef222e4e70a 100644 --- a/intern/ghost/GHOST_Types.h +++ b/intern/ghost/GHOST_Types.h @@ -145,6 +145,9 @@ typedef enum { GHOST_kWindowOrderTop = 0, GHOST_kWindowOrderBottom } GHOST_TWind typedef enum { GHOST_kDrawingContextTypeNone = 0, GHOST_kDrawingContextTypeOpenGL, +#ifdef WITH_VULKAN + GHOST_kDrawingContextTypeVulkan, +#endif #ifdef WIN32 GHOST_kDrawingContextTypeD3D, #endif diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp index a21c3a90c06..5a19123f044 100644 --- a/intern/ghost/intern/GHOST_C-api.cpp +++ b/intern/ghost/intern/GHOST_C-api.cpp @@ -137,11 +137,12 @@ void GHOST_GetAllDisplayDimensions(GHOST_SystemHandle systemhandle, } GHOST_ContextHandle GHOST_CreateOpenGLContext(GHOST_SystemHandle systemhandle, + GHOST_TDrawingContextType type, GHOST_GLSettings glSettings) { GHOST_ISystem *system = (GHOST_ISystem *)systemhandle; - return (GHOST_ContextHandle)system->createOffscreenContext(glSettings); + return (GHOST_ContextHandle)system->createOffscreenContext(type, glSettings); } GHOST_TSuccess GHOST_DisposeOpenGLContext(GHOST_SystemHandle systemhandle, @@ -493,6 +494,13 @@ GHOST_TDrawingContextType GHOST_GetDrawingContextType(GHOST_WindowHandle windowh return window->getDrawingContextType(); } +GHOST_ContextHandle GHOST_GetDrawingContext(GHOST_WindowHandle windowhandle) +{ + GHOST_IWindow *window = (GHOST_IWindow *)windowhandle; + + return (GHOST_ContextHandle)window->getDrawingContext(); +} + GHOST_TSuccess GHOST_SetDrawingContextType(GHOST_WindowHandle windowhandle, GHOST_TDrawin @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
