1 /* 2 * Copyright (c) 2015-2016 The Khronos Group Inc. 3 * Copyright (c) 2015-2016 Valve Corporation 4 * Copyright (c) 2015-2016 LunarG, Inc. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 * Author: Chia-I Wu <olvaffe (at) gmail.com> 19 * Author: Chris Forbes <chrisf (at) ijw.co.nz> 20 * Author: Courtney Goeltzenleuchter <courtney (at) LunarG.com> 21 * Author: Mark Lobodzinski <mark (at) lunarg.com> 22 * Author: Mike Stroyan <mike (at) LunarG.com> 23 * Author: Tobin Ehlis <tobine (at) google.com> 24 * Author: Tony Barbour <tony (at) LunarG.com> 25 */ 26 27 #ifndef TEST_COMMON_H 28 #define TEST_COMMON_H 29 30 #include <assert.h> 31 #include <stdbool.h> 32 #include <stdio.h> 33 #include <stdlib.h> 34 #include <string.h> 35 36 #ifdef _WIN32 37 #define NOMINMAX 38 // WinSock2.h must be included *BEFORE* windows.h 39 #include <winsock2.h> 40 #endif 41 42 #include <vulkan/vk_sdk_platform.h> 43 #include <vulkan/vulkan.h> 44 45 #ifdef _WIN32 46 #pragma warning(push) 47 /* 48 warnings 4251 and 4275 have to do with potential dll-interface mismatch 49 between library (gtest) and users. Since we build the gtest library 50 as part of the test build we know that the dll-interface will match and 51 can disable these warnings. 52 */ 53 #pragma warning(disable : 4251) 54 #pragma warning(disable : 4275) 55 #endif 56 #include "gtest-1.7.0/include/gtest/gtest.h" 57 #include "gtest/gtest.h" 58 #ifdef _WIN32 59 #pragma warning(pop) 60 #endif 61 #include "vktestbinding.h" 62 63 #define ASSERT_VK_SUCCESS(err) ASSERT_EQ(VK_SUCCESS, err) << vk_result_string(err) 64 65 static inline const char *vk_result_string(VkResult err) { 66 switch (err) { 67 #define STR(r) \ 68 case r: \ 69 return #r 70 STR(VK_SUCCESS); 71 STR(VK_NOT_READY); 72 STR(VK_TIMEOUT); 73 STR(VK_EVENT_SET); 74 STR(VK_EVENT_RESET); 75 STR(VK_ERROR_INITIALIZATION_FAILED); 76 STR(VK_ERROR_OUT_OF_HOST_MEMORY); 77 STR(VK_ERROR_OUT_OF_DEVICE_MEMORY); 78 STR(VK_ERROR_DEVICE_LOST); 79 STR(VK_ERROR_EXTENSION_NOT_PRESENT); 80 STR(VK_ERROR_LAYER_NOT_PRESENT); 81 STR(VK_ERROR_MEMORY_MAP_FAILED); 82 STR(VK_ERROR_INCOMPATIBLE_DRIVER); 83 #undef STR 84 default: 85 return "UNKNOWN_RESULT"; 86 } 87 } 88 89 static inline void test_error_callback(const char *expr, const char *file, unsigned int line, const char *function) { 90 ADD_FAILURE_AT(file, line) << "Assertion: `" << expr << "'"; 91 } 92 93 #if defined(__linux__) 94 /* Linux-specific common code: */ 95 96 #include <pthread.h> 97 98 // Threads: 99 typedef pthread_t test_platform_thread; 100 101 static inline int test_platform_thread_create(test_platform_thread *thread, void *(*func)(void *), void *data) { 102 pthread_attr_t thread_attr; 103 pthread_attr_init(&thread_attr); 104 return pthread_create(thread, &thread_attr, func, data); 105 } 106 static inline int test_platform_thread_join(test_platform_thread thread, void **retval) { return pthread_join(thread, retval); } 107 108 // Thread IDs: 109 typedef pthread_t test_platform_thread_id; 110 static inline test_platform_thread_id test_platform_get_thread_id() { return pthread_self(); } 111 112 // Thread mutex: 113 typedef pthread_mutex_t test_platform_thread_mutex; 114 static inline void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_init(pMutex, NULL); } 115 static inline void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_lock(pMutex); } 116 static inline void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_unlock(pMutex); } 117 static inline void test_platform_thread_delete_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_destroy(pMutex); } 118 typedef pthread_cond_t test_platform_thread_cond; 119 static inline void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { pthread_cond_init(pCond, NULL); } 120 static inline void test_platform_thread_cond_wait(test_platform_thread_cond *pCond, test_platform_thread_mutex *pMutex) { 121 pthread_cond_wait(pCond, pMutex); 122 } 123 static inline void test_platform_thread_cond_broadcast(test_platform_thread_cond *pCond) { pthread_cond_broadcast(pCond); } 124 125 #elif defined(_WIN32) // defined(__linux__) 126 // Threads: 127 typedef HANDLE test_platform_thread; 128 static inline int test_platform_thread_create(test_platform_thread *thread, void *(*func)(void *), void *data) { 129 DWORD threadID; 130 *thread = CreateThread(NULL, // default security attributes 131 0, // use default stack size 132 (LPTHREAD_START_ROUTINE)func, 133 data, // thread function argument 134 0, // use default creation flags 135 &threadID); // returns thread identifier 136 return (*thread != NULL); 137 } 138 static inline int test_platform_thread_join(test_platform_thread thread, void **retval) { 139 return WaitForSingleObject(thread, INFINITE); 140 } 141 142 // Thread IDs: 143 typedef DWORD test_platform_thread_id; 144 static test_platform_thread_id test_platform_get_thread_id() { return GetCurrentThreadId(); } 145 146 // Thread mutex: 147 typedef CRITICAL_SECTION test_platform_thread_mutex; 148 static void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { InitializeCriticalSection(pMutex); } 149 static void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { EnterCriticalSection(pMutex); } 150 static void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { LeaveCriticalSection(pMutex); } 151 static void test_platform_thread_delete_mutex(test_platform_thread_mutex *pMutex) { DeleteCriticalSection(pMutex); } 152 typedef CONDITION_VARIABLE test_platform_thread_cond; 153 static void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { InitializeConditionVariable(pCond); } 154 static void test_platform_thread_cond_wait(test_platform_thread_cond *pCond, test_platform_thread_mutex *pMutex) { 155 SleepConditionVariableCS(pCond, pMutex, INFINITE); 156 } 157 static void test_platform_thread_cond_broadcast(test_platform_thread_cond *pCond) { WakeAllConditionVariable(pCond); } 158 #else // defined(_WIN32) 159 160 #error The "test_common.h" file must be modified for this OS. 161 162 // NOTE: In order to support another OS, an #elif needs to be added (above the 163 // "#else // defined(_WIN32)") for that OS, and OS-specific versions of the 164 // contents of this file must be created. 165 166 // NOTE: Other OS-specific changes are also needed for this OS. Search for 167 // files with "WIN32" in it, as a quick way to find files that must be changed. 168 169 #endif // defined(_WIN32) 170 171 #endif // TEST_COMMON_H 172