Browse Source

Vulkan: Adding windows support

Panagiotis Christopoulos Charitos 9 years ago
parent
commit
28388ff7b0

+ 9 - 4
CMakeLists.txt

@@ -220,7 +220,7 @@ if(SDL)
 		DOWNLOAD_COMMAND ""
 		PREFIX "${CMAKE_CURRENT_BINARY_DIR}/sdl2_build"
 		SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/SDL2"
-		CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/sdl2_build -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_BUILD_TYPE=Release -DDIRECTX=OFF -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DVIDEO_MIR=OFF -DSNDIO=OFF)
+		CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/sdl2_build -DSDL_SHARED=OFF -DSDL_STATIC=ON -DCMAKE_BUILD_TYPE=Release -DDIRECTX=OFF -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DVIDEO_MIR=OFF -DSNDIO=OFF -DVIDEO_OPENGLES=OFF)
 
 	ExternalProject_Get_Property(SDL2_PROJECT install_dir)
 	set(SDL2_INSTALL_DIR ${install_dir})
@@ -261,7 +261,7 @@ if(VULKAN)
 
 	ExternalProject_Get_Property(GLSLANG_PROJECT install_dir)
 	set(GLSLANG_INSTALL_DIR ${install_dir})
-	
+
 	add_library(GLSLANG_LIB STATIC IMPORTED)
 	set_property(TARGET GLSLANG_LIB PROPERTY IMPORTED_LOCATION ${GLSLANG_INSTALL_DIR}/lib/libglslang.a)
 	add_dependencies(GLSLANG_LIB GLSLANG_PROJECT)
@@ -352,7 +352,7 @@ if(LINUX)
 	else()
 		set(_SYS vulkan)
 		if(SDL)
-			set(_SYS ${_SYS} X11-xcb)	
+			set(_SYS ${_SYS} X11-xcb)
 		else()
 			message(FATAL_ERROR "Unhandled case")
 		endif()
@@ -367,8 +367,13 @@ elseif(ANDROID)
 	include_directories("${ANDROID_NDK}/sources/android/native_app_glue")
 	set(_SYS_SRC "${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c")
 elseif(WINDOWS)
-	set(_SYS ankiglew opengl32 version Imm32 Winmm)
+	if(GL)
+		set(_SYS ankiglew opengl32)
+	else()
+		set(_SYS vulkan-1)
+	endif()
 
+	set(_SYS ${_SYS} version Imm32 Winmm)
 	add_definitions(-DGLEW_STATIC -D_NEWTON_STATIC_LIB)
 else()
 	message(FATAL_ERROR "Unhandled case")

+ 0 - 1
shaders/Is.frag.glsl

@@ -43,7 +43,6 @@ vec3 getFragPosVSpace()
 }
 
 // Common code for lighting
-
 #define LIGHTING_COMMON_BRDF()                                                                                         \
 	vec3 frag2Light = light.posRadius.xyz - fragPos;                                                                   \
 	vec3 l = normalize(frag2Light);                                                                                    \

+ 3 - 4
src/anki/core/Trace.cpp

@@ -64,8 +64,7 @@ thread_local I g_traceEventsInFlight = 0;
 
 TraceManager::~TraceManager()
 {
-	// No need to close the json (no need to add ']'). Chrome will take care
-	// of that
+	// No need to close the json (no need to add ']'). Chrome will take care of that
 }
 
 Error TraceManager::create(HeapAllocator<U8> alloc, const CString& cacheDir)
@@ -80,13 +79,13 @@ Error TraceManager::create(HeapAllocator<U8> alloc, const CString& cacheDir)
 	StringAuto fname(alloc);
 	fname.sprintf("%s/trace.json", &cacheDir[0]);
 
-	ANKI_CHECK(m_traceFile.open(fname.toCString(), File::OpenFlag::WRITE));
+	ANKI_CHECK(m_traceFile.open(fname.toCString(), FileOpenFlag::WRITE));
 	ANKI_CHECK(m_traceFile.writeText("["));
 
 	// Create per frame file
 	StringAuto perFrameFname(alloc);
 	perFrameFname.sprintf("%s/per_frame.csv", &cacheDir[0]);
-	ANKI_CHECK(m_perFrameFile.open(perFrameFname.toCString(), File::OpenFlag::WRITE));
+	ANKI_CHECK(m_perFrameFile.open(perFrameFname.toCString(), FileOpenFlag::WRITE));
 
 	ANKI_CHECK(m_perFrameFile.writeText("FPS, "));
 	for(U i = 0; i < U(TraceCounterType::COUNT); ++i)

+ 11 - 0
src/anki/gr/vulkan/Common.h

@@ -9,9 +9,20 @@
 
 #if ANKI_OS == ANKI_OS_LINUX
 #define VK_USE_PLATFORM_XCB_KHR 1
+#elif ANKI_OS == ANKI_OS_WINDOWS
+#define VK_USE_PLATFORM_WIN32_KHR 1
+#else
+#error TODO
 #endif
 #include <vulkan/vulkan.h>
 
+// I wonder whose stupid idea was to pollute the global namespace with defines like ERROR, near and far
+#if ANKI_OS == ANKI_OS_WINDOWS
+#undef ERROR
+#undef near
+#undef far
+#endif
+
 namespace anki
 {
 

+ 9 - 1
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -182,7 +182,15 @@ Error GrManagerImpl::initInstance(const GrManagerInitInfo& init)
 		"VK_LAYER_LUNARG_object_tracker",
 		"VK_LAYER_LUNARG_standard_validation"}};
 
-	static Array<const char*, 2> EXTENSIONS = {{VK_KHR_SURFACE_EXTENSION_NAME, VK_KHR_XCB_SURFACE_EXTENSION_NAME}};
+	static Array<const char*, 2> EXTENSIONS = {{VK_KHR_SURFACE_EXTENSION_NAME,
+#if ANKI_OS == ANKI_OS_LINUX
+		VK_KHR_XCB_SURFACE_EXTENSION_NAME
+#elif ANKI_OS == ANKI_OS_WINDOWS
+		VK_KHR_WIN32_SURFACE_EXTENSION_NAME
+#else
+#error TODO
+#endif
+	}};
 
 	VkApplicationInfo app = {};
 	app.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;

+ 16 - 1
src/anki/gr/vulkan/GrManagerImplSdl.cpp

@@ -10,6 +10,8 @@
 #include <SDL_syswm.h>
 #if ANKI_OS == ANKI_OS_LINUX
 #include <X11/Xlib-xcb.h>
+#elif ANKI_OS == ANKI_OS_WINDOWS
+#include <Winuser.h>
 #else
 #error TODO
 #endif
@@ -34,6 +36,19 @@ Error GrManagerImpl::initSurface(const GrManagerInitInfo& init)
 	ci.window = wminfo.info.x11.window;
 
 	ANKI_VK_CHECK(vkCreateXcbSurfaceKHR(m_instance, &ci, nullptr, &m_surface));
+#elif ANKI_OS == ANKI_OS_WINDOWS
+	Array<TCHAR, 512> className;
+	GetClassName(wminfo.info.win.window, &className[0], className.getSize());
+
+	WNDCLASS wce = {};
+	GetClassInfo(GetModuleHandle(NULL), &className[0], &wce);
+
+	VkWin32SurfaceCreateInfoKHR ci = {};
+	ci.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
+	ci.hinstance = wce.hInstance;
+	ci.hwnd = wminfo.info.win.window;
+
+	ANKI_VK_CHECK(vkCreateWin32SurfaceKHR(m_instance, &ci, nullptr, &m_surface));
 #else
 #error TODO
 #endif
@@ -41,4 +56,4 @@ Error GrManagerImpl::initSurface(const GrManagerInitInfo& init)
 	return ErrorCode::NONE;
 }
 
-} // end namespace anki
+} // end namespace anki

+ 3 - 3
src/anki/util/ThreadWindows.cpp

@@ -28,7 +28,7 @@ static DWORD WINAPI threadCallback(LPVOID ud)
 	}
 
 	// Call the callback
-	Thread::Info info;
+	ThreadCallbackInfo info;
 	info.m_userData = thread->getUserData();
 	info.m_threadName = thread->getName();
 
@@ -60,7 +60,7 @@ Thread::~Thread()
 	m_impl = nullptr;
 }
 
-void Thread::start(void* userData, Callback callback, I pinToCore)
+void Thread::start(void* userData, ThreadCallback callback, I pinToCore)
 {
 	ANKI_ASSERT(!m_started);
 	ANKI_ASSERT(callback != nullptr);
@@ -112,7 +112,7 @@ Error Thread::join()
 	return static_cast<ErrorCode>(exitCode);
 }
 
-Thread::Id Thread::getCurrentThreadId()
+ThreadId Thread::getCurrentThreadId()
 {
 	HANDLE x = GetCurrentThread();
 	return reinterpret_cast<PtrSize>(x);

+ 3 - 4
tests/util/ThreadHive.cpp

@@ -5,8 +5,7 @@
 
 #include <tests/framework/Framework.h>
 #include <anki/util/ThreadHive.h>
-#include <chrono>
-#include <thread>
+#include <anki/util/HighRezTimer.h>
 
 namespace anki
 {
@@ -46,9 +45,9 @@ static void incNumber(void* arg, U32, ThreadHive& hive)
 static void taskToWaitOn(void* arg, U32, ThreadHive& hive)
 {
 	ThreadHiveTestContext* ctx = static_cast<ThreadHiveTestContext*>(arg);
-	std::this_thread::sleep_for(std::chrono::seconds(1));
+	HighRezTimer::sleep(1.0);
 	ctx->m_count = 10;
-	std::this_thread::sleep_for(std::chrono::milliseconds(100));
+	HighRezTimer::sleep(0.1);
 }
 
 static void taskToWait(void* arg, U32 threadId, ThreadHive& hive)