vktestframework.h revision f4b83ed12f844daf00a29ceb003538c9c8ffbb11
1b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// VK tests 2b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 3b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Copyright (C) 2014 LunarG, Inc. 4b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 5b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Permission is hereby granted, free of charge, to any person obtaining a 6b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// copy of this software and associated documentation files (the "Software"), 7b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// to deal in the Software without restriction, including without limitation 8b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// the rights to use, copy, modify, merge, publish, distribute, sublicense, 9b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// and/or sell copies of the Software, and to permit persons to whom the 10b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Software is furnished to do so, subject to the following conditions: 11b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 12b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// The above copyright notice and this permission notice shall be included 13b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// in all copies or substantial portions of the Software. 14b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// 15b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// DEALINGS IN THE SOFTWARE. 22b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 23b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#ifndef VKTESTFRAMEWORK_H 24b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define VKTESTFRAMEWORK_H 25b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 26b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "gtest-1.7.0/include/gtest/gtest.h" 27b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "glslang/Public/ShaderLang.h" 28b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "SPIRV/GLSL.std.450.h" 29b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "icd-spv.h" 30b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "test_common.h" 31b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "vktestbinding.h" 32b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include "test_environment.h" 33b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 34b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <stdlib.h> 35b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <stdio.h> 36b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <stdbool.h> 37b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <string.h> 38b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <iostream> 39b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <fstream> 40b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <list> 41b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 42b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#ifdef _WIN32 43b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define WIN32_LEAN_AND_MEAN 44b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#include <windows.h> 45b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif 46b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 47b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#if defined(NDEBUG) && defined(__GNUC__) 48b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define U_ASSERT_ONLY __attribute__((unused)) 49b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#else 50b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define U_ASSERT_ONLY 51b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif 52b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 53b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG// Can be used by tests to record additional details / description of test 54b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#define TEST_DESCRIPTION(desc) RecordProperty("description", desc) 55b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 56b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGusing namespace std; 57b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 58b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGclass VkImageObj; 59b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 60b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 61b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGclass VkTestImageRecord 62b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{ 63b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGpublic: 64b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG VkTestImageRecord(); 65b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG VkTestImageRecord(const VkTestImageRecord &); 66b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG ~VkTestImageRecord(); 67b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG VkTestImageRecord &operator=(const VkTestImageRecord &rhs); 68b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int operator==(const VkTestImageRecord &rhs) const; 69b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int operator<(const VkTestImageRecord &rhs) const; 70b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 71b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG string m_title; 72b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int m_width; 73b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int m_height; 74b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void *m_data; 75b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG unsigned m_data_size; 76b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}; 77b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 78b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGclass VkTestFramework : public ::testing::Test 79b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{ 80b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGpublic: 81b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG VkTestFramework(); 82b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG ~VkTestFramework(); 83b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 84b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool optionMatch(const char* option, char* optionLine); 85b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static void InitArgs(int *argc, char *argv[]); 86b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static void InitWindow(); 87b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static void Finish(); 88b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 89b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void WritePPM( const char *basename, VkImageObj *image ); 90b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void Show(const char *comment, VkImageObj *image); 91b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void Compare(const char *comment, VkImageObj *image); 92b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void RecordImage(VkImageObj * image); 93b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void RecordImages(vector<VkImageObj *> image); 94b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG bool GLSLtoSPV(const VkShaderStage shader_type, 95b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG const char *pshader, 96b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG std::vector<unsigned int> &spv); 97b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_use_glsl; 98b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_canonicalize_spv; 99b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_strip_spv; 100b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_do_everything_spv; 101b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 102b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG char** ReadFileData(const char* fileName); 103b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void FreeFileData(char** data); 104b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 105b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGprivate: 106b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int m_compile_options; 107b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int m_num_shader_strings; 108b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG TBuiltInResource Resources; 109b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void SetMessageOptions(EShMessages& messages); 110b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void ProcessConfigFile(); 111b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG EShLanguage FindLanguage(const std::string& name); 112b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG EShLanguage FindLanguage(const VkShaderStage shader_type); 113b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG std::string ConfigFile; 114b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG bool SetConfigFile(const std::string& name); 115b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 116b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_show_images; 117b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_save_images; 118b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static bool m_compare_images; 119b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 120b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static std::list<VkTestImageRecord> m_images; 121b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static std::list<VkTestImageRecord>::iterator m_display_image; 122b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static int m_display_image_idx; 123b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 124b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static int m_width; // Window width 125b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG static int m_height; // Window height 126b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 127b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG int m_frameNum; 128b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG string m_testName; 129b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}; 130b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 131b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarGclass TestEnvironment : public ::testing::Environment 132b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG{ 133b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG public: 134b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void SetUp(); 135b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 136b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG void TearDown(); 137b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG}; 138b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG 139b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG#endif // VKTESTFRAMEWORK_H 140b0b195df6c4343219e339ccb37978e8432a5f871Tony-LunarG