diff --git a/example/Vulkan/CMakeLists.txt b/example/Vulkan/CMakeLists.txt index 511c0547..ff047118 100644 --- a/example/Vulkan/CMakeLists.txt +++ b/example/Vulkan/CMakeLists.txt @@ -1,7 +1,19 @@ -add_executable(VulkanTest main.cpp +IF(UNIX) + SET(RENDER_WINDOW_SOURCE XCBWindow.cpp) + SET(RENDER_WINDOW_LIBRARY xcb) +ENDIF() +if(WIN32) + SET(RENDER_WINDOW_SOURCE Win32Window.cpp) +ENDIF() +if(APPLE) +ENDIF() + + +add_executable(VulkanTest main.cpp + ${RENDER_WINDOW_SOURCE} VKInstance.cpp VKPhysicalDevice.cpp VKDevice.cpp VKCommandBuffer.cpp) -target_link_libraries(VulkanTest PRIVATE ${ULRE} ${VULKAN_LIB}) +target_link_libraries(VulkanTest PRIVATE ${ULRE} ${VULKAN_LIB} ${RENDER_WINDOW_LIBRARY}) diff --git a/example/Vulkan/VKInstance.cpp b/example/Vulkan/VKInstance.cpp index d3571a4c..6c10e4b0 100644 --- a/example/Vulkan/VKInstance.cpp +++ b/example/Vulkan/VKInstance.cpp @@ -3,8 +3,9 @@ VK_NAMESPACE_BEGIN -Instance::Instance(const UTF8String &an) +Instance::Instance(const UTF8String &an,Window *w) { + win=w; app_name=an; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; @@ -15,12 +16,15 @@ Instance::Instance(const UTF8String &an) app_info.engineVersion = 1; app_info.apiVersion = VK_API_VERSION_1_0; + ext_list.Add(VK_KHR_SURFACE_EXTENSION_NAME); + ext_list.Add(win->GetVulkanSurfaceExtname()); + inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; inst_info.pNext = nullptr; inst_info.flags = 0; inst_info.pApplicationInfo = &app_info; - inst_info.enabledExtensionCount = 0; - inst_info.ppEnabledExtensionNames = nullptr; + inst_info.enabledExtensionCount = ext_list.GetCount(); + inst_info.ppEnabledExtensionNames = ext_list.GetData(); inst_info.enabledLayerCount = 0; inst_info.ppEnabledLayerNames = nullptr; diff --git a/example/Vulkan/VKInstance.h b/example/Vulkan/VKInstance.h index 1041df3e..138cbe5b 100644 --- a/example/Vulkan/VKInstance.h +++ b/example/Vulkan/VKInstance.h @@ -3,12 +3,17 @@ #include #include +#include"Window.h" #include"VK.h" #include"VKPhysicalDevice.h" VK_NAMESPACE_BEGIN class Instance { + Window *win; + + List ext_list; + VkApplicationInfo app_info; VkInstanceCreateInfo inst_info; @@ -22,7 +27,7 @@ VK_NAMESPACE_BEGIN public: - Instance(const UTF8String &an); + Instance(const UTF8String &,Window *); virtual ~Instance(); virtual bool Init(); diff --git a/example/Vulkan/VKPhysicalDevice.cpp b/example/Vulkan/VKPhysicalDevice.cpp index 36875a38..654f1f16 100644 --- a/example/Vulkan/VKPhysicalDevice.cpp +++ b/example/Vulkan/VKPhysicalDevice.cpp @@ -61,12 +61,13 @@ Device *PhysicalDevice::CreateGraphicsDevice() const queue_info.pQueuePriorities = queue_priorities; VkDeviceCreateInfo create_info = {}; + const char *ext_list[1]={VK_KHR_SWAPCHAIN_EXTENSION_NAME}; create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; create_info.pNext = nullptr; create_info.queueCreateInfoCount = 1; create_info.pQueueCreateInfos = &queue_info; - create_info.enabledExtensionCount = 0; - create_info.ppEnabledExtensionNames = nullptr; + create_info.enabledExtensionCount = 1; + create_info.ppEnabledExtensionNames = ext_list; create_info.enabledLayerCount = 0; create_info.ppEnabledLayerNames = nullptr; create_info.pEnabledFeatures = nullptr; diff --git a/example/Vulkan/Window.h b/example/Vulkan/Window.h new file mode 100644 index 00000000..89dc30f2 --- /dev/null +++ b/example/Vulkan/Window.h @@ -0,0 +1,44 @@ +#ifndef HGL_GRAPH_WINDOW_INCLUDE +#define HGL_GRAPH_WINDOW_INCLUDE + +#include +namespace hgl +{ + namespace graph + { + class Window + { + protected: + + uint width,height; + + OSString win_name; + + public: + + uint GetWidth()const{return width;} + uint GetHeight()const{return height;} + + public: + + Window(const OSString &wn) + { + width=height=0; + win_name=wn; + } + virtual ~Window()=default; + + virtual const char *GetVulkanSurfaceExtname()const=0; + + virtual bool CreateWindow(uint,uint)=0; + virtual bool CreateFullscreen(uint,uint,uint)=0; + virtual void CloseWindow()=0; + + virtual void Show()=0; + virtual void Hide()=0; + };//class Window + + Window *CreateRenderWindow(const OSString &win_name); + }//namespace graph +}//namespace hgl +#endif//HGL_GRAPH_WINDOW_INCLUDE diff --git a/example/Vulkan/XCBWindow.cpp b/example/Vulkan/XCBWindow.cpp new file mode 100644 index 00000000..569717c9 --- /dev/null +++ b/example/Vulkan/XCBWindow.cpp @@ -0,0 +1,59 @@ +#include"Window.h" +#include +#include +#include +#include +namespace hgl +{ + namespace graph + { + class XCBWindow:public Window + { + xcb_connection_t *connection; + xcb_screen_t *screen; + xcb_window_t window; + xcb_intern_atom_reply_t *atom_wm_delete_window; + + xcb_screen_iterator_t iter; + int scr; + + public: + + XCBWindow(const UTF8String &wn):Window(wn) + { + connection=nullptr; + screen=nullptr; + atom_wm_delete_window=nullptr; + + scr=-1; + } + + ~XCBWindow() + { + } + + const char *GetVulkanSurfaceExtname()const + { + return VK_KHR_XCB_SURFACE_EXTENSION_NAME; + } + + bool CreateWindow(uint w,uint h) override + { + if(w<=0||h<=0)return(false); + + xcb_connect(nullptr,&scr); + } + + bool CreateFullscreen(uint,uint,uint)override{} + void CloseWindow()override{} + + void Show()override{} + void Hide()override{} + };//class XCBWindow:public Window + + Window *CreateRenderWindow(const UTF8String &win_name) + { + return(new XCBWindow(win_name)); + } + }//namespace graph +}//namespace hgl diff --git a/example/Vulkan/main.cpp b/example/Vulkan/main.cpp index b34ff73c..c4fc8da6 100644 --- a/example/Vulkan/main.cpp +++ b/example/Vulkan/main.cpp @@ -2,16 +2,22 @@ #include"VKInstance.h" #include"VKDevice.h" #include"VKCommandBuffer.h" +#include"Window.h" + +using namespace hgl; +using namespace hgl::graph; int main(int,char **) { - using namespace hgl; - using namespace hgl::graph; + Window *win=CreateRenderWindow(OS_TEXT("VulkanTest")); - vulkan::Instance inst("Test"); + vulkan::Instance inst(U8_TEXT("VulkanTest"),win); if(!inst.Init()) + { + delete win; return(-1); + } const ObjectList &device_list=inst.GetDeviceList(); @@ -23,6 +29,7 @@ int main(int,char **) delete cmd_buf; delete dev; + delete win; return 0; }