blob: 2ba2db89ba06db5ae6e607ea60fb08891ae5da5f [file] [log] [blame]
Karl Schultz929a1002016-02-04 11:33:21 -07001/*
Mark Lobodzinski103c58a2020-01-29 13:20:00 -07002 * Copyright (c) 2015-2020 The Khronos Group Inc.
3 * Copyright (c) 2015-2020 Valve Corporation
4 * Copyright (c) 2015-2020 LunarG, Inc.
Karl Schultz929a1002016-02-04 11:33:21 -07005 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06006 * 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
Karl Schultz929a1002016-02-04 11:33:21 -07009 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060010 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz929a1002016-02-04 11:33:21 -070011 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012 * 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.
Karl Schultz929a1002016-02-04 11:33:21 -070017 *
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
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060027#ifndef TEST_COMMON_H
28#define TEST_COMMON_H
29
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060030#include <assert.h>
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060031#include <stdbool.h>
32#include <stdio.h>
33#include <stdlib.h>
34#include <string.h>
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060035
Ian Elliottc11750d2015-10-30 13:24:12 -060036#ifdef _WIN32
Mark Lobodzinski450e4632015-11-24 12:04:15 -070037// WinSock2.h must be included *BEFORE* windows.h
38#include <winsock2.h>
Ian Elliottc11750d2015-10-30 13:24:12 -060039#endif
Mark Lobodzinskifaa90812015-11-25 13:26:15 -070040
Mark Lobodzinski103c58a2020-01-29 13:20:00 -070041// sdk_platform header redefines NOMINMAX
42#undef NOMINMAX
David Pinedo9316d3b2015-11-06 12:54:48 -070043#include <vulkan/vk_sdk_platform.h>
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060044#include <vulkan/vulkan.h>
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060045
Ian Elliottc11750d2015-10-30 13:24:12 -060046#ifdef _WIN32
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060047#pragma warning(push)
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060048/*
49 warnings 4251 and 4275 have to do with potential dll-interface mismatch
50 between library (gtest) and users. Since we build the gtest library
51 as part of the test build we know that the dll-interface will match and
52 can disable these warnings.
53 */
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060054#pragma warning(disable : 4251)
55#pragma warning(disable : 4275)
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060056#endif
Cody Northrop40354b82018-03-27 12:22:53 -060057
Mark Lobodzinski8bdb1f32018-03-27 17:14:34 -060058// GTest and Xlib collide due to redefinitions of "None" and "Bool"
59#ifdef VK_USE_PLATFORM_XLIB_KHR
60#pragma push_macro("None")
61#pragma push_macro("Bool")
62#undef None
63#undef Bool
64#endif
65
Cody Northrop40354b82018-03-27 12:22:53 -060066// Use the NDK's header on Android
67#ifndef __ANDROID__
Mark Lobodzinski42f743f2018-05-31 09:58:13 -060068#include "gtest/gtest.h"
Mark Lobodzinski8bdb1f32018-03-27 17:14:34 -060069#else
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060070#include "gtest/gtest.h"
Mark Lobodzinski8bdb1f32018-03-27 17:14:34 -060071#endif
72
73// Redefine Xlib definitions
74#ifdef VK_USE_PLATFORM_XLIB_KHR
75#pragma pop_macro("Bool")
76#pragma pop_macro("None")
77#endif
Cody Northrop40354b82018-03-27 12:22:53 -060078
Ian Elliottc11750d2015-10-30 13:24:12 -060079#ifdef _WIN32
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060080#pragma warning(pop)
Courtney Goeltzenleuchter58f3eff2015-10-07 13:28:58 -060081#endif
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060082#include "vktestbinding.h"
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060083
Petr Kraus6bb16b42019-09-09 22:05:50 +020084#define ASSERT_VK_SUCCESS(err) \
85 { \
86 const VkResult resolved_err = err; \
87 ASSERT_EQ(VK_SUCCESS, resolved_err) << vk_result_string(resolved_err); \
88 }
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060089
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060090static inline const char *vk_result_string(VkResult err) {
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -060091 switch (err) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070092#define STR(r) \
93 case r: \
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -060094 return #r
95 STR(VK_SUCCESS);
96 STR(VK_NOT_READY);
97 STR(VK_TIMEOUT);
98 STR(VK_EVENT_SET);
99 STR(VK_EVENT_RESET);
100 STR(VK_ERROR_INITIALIZATION_FAILED);
101 STR(VK_ERROR_OUT_OF_HOST_MEMORY);
102 STR(VK_ERROR_OUT_OF_DEVICE_MEMORY);
103 STR(VK_ERROR_DEVICE_LOST);
104 STR(VK_ERROR_EXTENSION_NOT_PRESENT);
105 STR(VK_ERROR_LAYER_NOT_PRESENT);
106 STR(VK_ERROR_MEMORY_MAP_FAILED);
107 STR(VK_ERROR_INCOMPATIBLE_DRIVER);
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -0600108#undef STR
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700109 default:
110 return "UNKNOWN_RESULT";
Courtney Goeltzenleuchterb7f50502014-08-12 14:09:50 -0600111 }
112}
113
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600114static inline void test_error_callback(const char *expr, const char *file, unsigned int line, const char *function) {
Chia-I Wua9a506a2014-12-27 22:04:00 +0800115 ADD_FAILURE_AT(file, line) << "Assertion: `" << expr << "'";
116}
117
Karl Schultz2e5ed332017-12-12 10:33:01 -0500118#if defined(__linux__) || defined(__APPLE__)
Petr Kraus6bb16b42019-09-09 22:05:50 +0200119/* Linux-specific common code: */
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600120
121#include <pthread.h>
122
123// Threads:
124typedef pthread_t test_platform_thread;
125
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600126static inline int test_platform_thread_create(test_platform_thread *thread, void *(*func)(void *), void *data) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600127 pthread_attr_t thread_attr;
128 pthread_attr_init(&thread_attr);
129 return pthread_create(thread, &thread_attr, func, data);
130}
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600131static inline int test_platform_thread_join(test_platform_thread thread, void **retval) { return pthread_join(thread, retval); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600132
133// Thread IDs:
134typedef pthread_t test_platform_thread_id;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600135static inline test_platform_thread_id test_platform_get_thread_id() { return pthread_self(); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600136
137// Thread mutex:
138typedef pthread_mutex_t test_platform_thread_mutex;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600139static inline void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_init(pMutex, NULL); }
140static inline void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_lock(pMutex); }
141static inline void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_unlock(pMutex); }
142static inline void test_platform_thread_delete_mutex(test_platform_thread_mutex *pMutex) { pthread_mutex_destroy(pMutex); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600143typedef pthread_cond_t test_platform_thread_cond;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600144static inline void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { pthread_cond_init(pCond, NULL); }
145static inline void test_platform_thread_cond_wait(test_platform_thread_cond *pCond, test_platform_thread_mutex *pMutex) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600146 pthread_cond_wait(pCond, pMutex);
147}
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600148static inline void test_platform_thread_cond_broadcast(test_platform_thread_cond *pCond) { pthread_cond_broadcast(pCond); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600149
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700150#elif defined(_WIN32) // defined(__linux__)
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600151// Threads:
152typedef HANDLE test_platform_thread;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600153static inline int test_platform_thread_create(test_platform_thread *thread, void *(*func)(void *), void *data) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600154 DWORD threadID;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700155 *thread = CreateThread(NULL, // default security attributes
156 0, // use default stack size
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600157 (LPTHREAD_START_ROUTINE)func,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700158 data, // thread function argument
159 0, // use default creation flags
160 &threadID); // returns thread identifier
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600161 return (*thread != NULL);
162}
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600163static inline int test_platform_thread_join(test_platform_thread thread, void **retval) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600164 return WaitForSingleObject(thread, INFINITE);
165}
166
167// Thread IDs:
168typedef DWORD test_platform_thread_id;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600169static test_platform_thread_id test_platform_get_thread_id() { return GetCurrentThreadId(); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600170
171// Thread mutex:
172typedef CRITICAL_SECTION test_platform_thread_mutex;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600173static void test_platform_thread_create_mutex(test_platform_thread_mutex *pMutex) { InitializeCriticalSection(pMutex); }
174static void test_platform_thread_lock_mutex(test_platform_thread_mutex *pMutex) { EnterCriticalSection(pMutex); }
175static void test_platform_thread_unlock_mutex(test_platform_thread_mutex *pMutex) { LeaveCriticalSection(pMutex); }
176static void test_platform_thread_delete_mutex(test_platform_thread_mutex *pMutex) { DeleteCriticalSection(pMutex); }
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600177typedef CONDITION_VARIABLE test_platform_thread_cond;
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600178static void test_platform_thread_init_cond(test_platform_thread_cond *pCond) { InitializeConditionVariable(pCond); }
179static void test_platform_thread_cond_wait(test_platform_thread_cond *pCond, test_platform_thread_mutex *pMutex) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600180 SleepConditionVariableCS(pCond, pMutex, INFINITE);
181}
Mark Lobodzinski6d4a6d92016-09-07 16:27:38 -0600182static void test_platform_thread_cond_broadcast(test_platform_thread_cond *pCond) { WakeAllConditionVariable(pCond); }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700183#else // defined(_WIN32)
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600184
185#error The "test_common.h" file must be modified for this OS.
186
Petr Kraus6bb16b42019-09-09 22:05:50 +0200187// NOTE: In order to support another OS, an #elif needs to be added (above the
188// "#else // defined(_WIN32)") for that OS, and OS-specific versions of the
189// contents of this file must be created.
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600190
Petr Kraus6bb16b42019-09-09 22:05:50 +0200191// NOTE: Other OS-specific changes are also needed for this OS. Search for
192// files with "WIN32" in it, as a quick way to find files that must be changed.
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600193
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700194#endif // defined(_WIN32)
Mike Stroyan4268d1f2015-07-13 14:45:35 -0600195
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700196#endif // TEST_COMMON_H