199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz/*
299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 The Khronos Group Inc.
399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 Valve Corporation
499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Copyright (c) 2015-2016 LunarG, Inc.
599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Licensed under the Apache License, Version 2.0 (the "License");
743b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * you may not use this file except in compliance with the License.
843b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * You may obtain a copy of the License at
999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
1043b53e83705f02245da6ae61e31273866a35b833Jon Ashburn *     http://www.apache.org/licenses/LICENSE-2.0
1199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
1243b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * Unless required by applicable law or agreed to in writing, software
1343b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * distributed under the License is distributed on an "AS IS" BASIS,
1443b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1543b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * See the License for the specific language governing permissions and
1643b53e83705f02245da6ae61e31273866a35b833Jon Ashburn * limitations under the License.
1799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz *
1899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
1999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz * Author: Tony Barbour <tony@LunarG.com>
2099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz */
21d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
229cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#ifndef VKTESTFRAMEWORK_H
239cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#define VKTESTFRAMEWORK_H
24d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
250abdb66fa4e8e68904545af6df15cbe2116b6c43Courtney Goeltzenleuchter//#include "gtest-1.7.0/include/gtest/gtest.h"
26f4b83ed12f844daf00a29ceb003538c9c8ffbb11GregF#include "SPIRV/GLSL.std.450.h"
27af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include "glslang/Public/ShaderLang.h"
28d4e020aa1921643b14a3a546f6807afbafa7629eCody Northrop#include "icd-spv.h"
2913ecdcd44b370d5f16c5977e902bed90b27f3669Chia-I Wu#include "test_common.h"
30ef20d32f44141f8bcee9a77a03100f2c33e7a71fTony Barbour#include "test_environment.h"
31af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include "vktestbinding.h"
32d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
33d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter#include <fstream>
34af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include <iostream>
35d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter#include <list>
36af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include <stdbool.h>
37af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include <stdio.h>
38af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include <stdlib.h>
39af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter#include <string.h>
4028d3396d74d859bed93a17b423514e1041148824Courtney Goeltzenleuchter
4125e3b839ae203c18a71ff950711137d9e753b2eeTony Barbour#ifdef _WIN32
423068b35b8b4fa868d049dee23a287eff7c059e28Courtney Goeltzenleuchter#ifndef WIN32_LEAN_AND_MEAN
4325e3b839ae203c18a71ff950711137d9e753b2eeTony Barbour#define WIN32_LEAN_AND_MEAN
443068b35b8b4fa868d049dee23a287eff7c059e28Courtney Goeltzenleuchter#endif
4525e3b839ae203c18a71ff950711137d9e753b2eeTony Barbour#include <windows.h>
4625e3b839ae203c18a71ff950711137d9e753b2eeTony Barbour#endif
4725e3b839ae203c18a71ff950711137d9e753b2eeTony Barbour
4822a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#if defined(NDEBUG) && defined(__GNUC__)
4922a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY __attribute__((unused))
5022a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#else
5122a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#define U_ASSERT_ONLY
5222a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour#endif
5322a30866de6210d780995dfaaae39f1a73115aa0Tony Barbour
5428d3396d74d859bed93a17b423514e1041148824Courtney Goeltzenleuchter// Can be used by tests to record additional details / description of test
5528d3396d74d859bed93a17b423514e1041148824Courtney Goeltzenleuchter#define TEST_DESCRIPTION(desc) RecordProperty("description", desc)
5628d3396d74d859bed93a17b423514e1041148824Courtney Goeltzenleuchter
57d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchterusing namespace std;
58d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
590199918cdd982ea192f737dc8660be1c33883e68Tony Barbourclass VkImageObj;
6013ecdcd44b370d5f16c5977e902bed90b27f3669Chia-I Wu
6199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzclass VkTestFramework : public ::testing::Test {
6299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
630199918cdd982ea192f737dc8660be1c33883e68Tony Barbour    VkTestFramework();
640199918cdd982ea192f737dc8660be1c33883e68Tony Barbour    ~VkTestFramework();
65d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
6655e270ba35534b24f3fd60930f129c18ec9e430fTony Barbour    VkFormat GetFormat(VkInstance instance, vk_testing::Device *device);
6799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static bool optionMatch(const char *option, char *optionLine);
68d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter    static void InitArgs(int *argc, char *argv[]);
69d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter    static void Finish();
70d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
71af4d398afbd91e28926089c5b8b4423d7a740ad5Courtney Goeltzenleuchter    bool GLSLtoSPV(const VkShaderStageFlagBits shader_type, const char *pshader, std::vector<unsigned int> &spv);
7299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static bool m_use_glsl;
7399e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static bool m_canonicalize_spv;
7499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static bool m_strip_spv;
7599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static bool m_do_everything_spv;
76d0d7ccc3f23046c7610a561e3eb99bb71eb5bd60Courtney Goeltzenleuchter
7799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    char **ReadFileData(const char *fileName);
7899e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void FreeFileData(char **data);
795c25faa269dc9187e7a82bcb08f93d87e13a1c52Courtney Goeltzenleuchter
8099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  private:
81941920311fa71077ea5b2c2a3b3a05bc579f219bCourtney Goeltzenleuchter    int m_compile_options;
82941920311fa71077ea5b2c2a3b3a05bc579f219bCourtney Goeltzenleuchter    int m_num_shader_strings;
83941920311fa71077ea5b2c2a3b3a05bc579f219bCourtney Goeltzenleuchter    TBuiltInResource Resources;
8499e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void SetMessageOptions(EShMessages &messages);
85941920311fa71077ea5b2c2a3b3a05bc579f219bCourtney Goeltzenleuchter    void ProcessConfigFile();
8699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    EShLanguage FindLanguage(const std::string &name);
878e2f097c013646e6688ecd7041c6ebdd4372e5c2Courtney Goeltzenleuchter    EShLanguage FindLanguage(const VkShaderStageFlagBits shader_type);
88941920311fa71077ea5b2c2a3b3a05bc579f219bCourtney Goeltzenleuchter    std::string ConfigFile;
8999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    bool SetConfigFile(const std::string &name);
9099e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static int m_width;
9199e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    static int m_height;
9299e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    string m_testName;
93ef20d32f44141f8bcee9a77a03100f2c33e7a71fTony Barbour};
94ef20d32f44141f8bcee9a77a03100f2c33e7a71fTony Barbour
9599e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultzclass TestEnvironment : public ::testing::Environment {
9699e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz  public:
9799e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void SetUp();
98f12c776b6a2a9d8b314e38a1dfab1b2441e32867Courtney Goeltzenleuchter
9999e9d1d74ff89ad3a0563b4ce8fc55de8734d0ecKarl Schultz    void TearDown();
100f12c776b6a2a9d8b314e38a1dfab1b2441e32867Courtney Goeltzenleuchter};
101f12c776b6a2a9d8b314e38a1dfab1b2441e32867Courtney Goeltzenleuchter
1029cc421eb545767e22fd723dc573a7a3225261b1cCourtney Goeltzenleuchter#endif // VKTESTFRAMEWORK_H
103