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@gmail.com>
19 * Author: Chris Forbes <chrisf@ijw.co.nz>
20 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
21 * Author: Mark Lobodzinski <mark@lunarg.com>
22 * Author: Mike Stroyan <mike@LunarG.com>
23 * Author: Tobin Ehlis <tobine@google.com>
24 * Author: Tony Barbour <tony@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
vk_result_string(VkResult err)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
test_error_callback(const char * expr,const char * file,unsigned int line,const char * function)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
test_platform_thread_create(test_platform_thread * thread,void * (* func)(void *),void * data)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 }
test_platform_thread_join(test_platform_thread thread,void ** retval)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;
test_platform_get_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;
test_platform_thread_create_mutex(test_platform_thread_mutex * pMutex)114 static inline void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_init(pMutex, NULL); }
test_platform_thread_lock_mutex(test_platform_thread_mutex * pMutex)115 static inline void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_lock(pMutex); }
test_platform_thread_unlock_mutex(test_platform_thread_mutex * pMutex)116 static inline void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_unlock(pMutex); }
test_platform_thread_delete_mutex(test_platform_thread_mutex * 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;
test_platform_thread_init_cond(test_platform_thread_cond * pCond)119 static inline void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { pthread_cond_init(pCond, NULL); }
test_platform_thread_cond_wait(test_platform_thread_cond * pCond,test_platform_thread_mutex * pMutex)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 }
test_platform_thread_cond_broadcast(test_platform_thread_cond * pCond)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;
test_platform_thread_create(test_platform_thread * thread,void * (* func)(void *),void * data)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 }
test_platform_thread_join(test_platform_thread thread,void ** retval)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;
test_platform_get_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;
test_platform_thread_create_mutex(test_platform_thread_mutex * pMutex)148 static void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { InitializeCriticalSection(pMutex); }
test_platform_thread_lock_mutex(test_platform_thread_mutex * pMutex)149 static void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { EnterCriticalSection(pMutex); }
test_platform_thread_unlock_mutex(test_platform_thread_mutex * pMutex)150 static void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { LeaveCriticalSection(pMutex); }
test_platform_thread_delete_mutex(test_platform_thread_mutex * pMutex)151 static void test_platform_thread_delete_mutex(test_platform_thread_mutex *pMutex) { DeleteCriticalSection(pMutex); }
152 typedef CONDITION_VARIABLE test_platform_thread_cond;
test_platform_thread_init_cond(test_platform_thread_cond * pCond)153 static void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { InitializeConditionVariable(pCond); }
test_platform_thread_cond_wait(test_platform_thread_cond * pCond,test_platform_thread_mutex * pMutex)154 static void test_platform_thread_cond_wait(test_platform_thread_cond *pCond, test_platform_thread_mutex *pMutex) {
155 SleepConditionVariableCS(pCond, pMutex, INFINITE);
156 }
test_platform_thread_cond_broadcast(test_platform_thread_cond * pCond)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