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