blob: 4801c73487cc655eec061abcd450f227fb75782a [file] [log] [blame]
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06001// VK tests
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -06002//
3// Copyright (C) 2014 LunarG, Inc.
4//
5// Permission is hereby granted, free of charge, to any person obtaining a
6// copy of this software and associated documentation files (the "Software"),
7// to deal in the Software without restriction, including without limitation
8// the rights to use, copy, modify, merge, publish, distribute, sublicense,
9// and/or sell copies of the Software, and to permit persons to whom the
10// Software is furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included
13// in all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE.
22
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060023#ifndef VKTESTFRAMEWORK_H
24#define VKTESTFRAMEWORK_H
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060025
26#include "gtest-1.7.0/include/gtest/gtest.h"
Cody Northrop5a95b472015-06-03 13:01:54 -060027#include "glslang/Public/ShaderLang.h"
28#include "SPIRV/GLSL450Lib.h"
Cody Northrop054a4702015-03-17 14:54:35 -060029#include "icd-spv.h"
Chia-I Wua6bc0ce2014-12-29 14:38:28 +080030#include "test_common.h"
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -060031#include "vktestbinding.h"
Tony Barbour96db8822015-02-25 12:28:39 -070032#include "test_environment.h"
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060033
34#include <stdlib.h>
35#include <stdio.h>
36#include <stdbool.h>
37#include <string.h>
38#include <iostream>
39#include <fstream>
40#include <list>
Courtney Goeltzenleuchterc5e00a12014-10-27 13:04:37 -060041
Tony Barbour3d69c9e2015-05-20 16:53:31 -060042#ifdef _WIN32
43#define WIN32_LEAN_AND_MEAN
44#include <windows.h>
45#endif
46
Tony Barbourf20f87b2015-04-22 09:02:32 -060047#if defined(NDEBUG) && defined(__GNUC__)
48#define U_ASSERT_ONLY __attribute__((unused))
49#else
50#define U_ASSERT_ONLY
51#endif
52
Courtney Goeltzenleuchterc5e00a12014-10-27 13:04:37 -060053// Can be used by tests to record additional details / description of test
54#define TEST_DESCRIPTION(desc) RecordProperty("description", desc)
55
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060056using namespace std;
57
Tony Barbour6918cd52015-04-09 12:58:51 -060058class VkImageObj;
Chia-I Wua6bc0ce2014-12-29 14:38:28 +080059
Tony Barbour96db8822015-02-25 12:28:39 -070060
Tony Barbour6918cd52015-04-09 12:58:51 -060061class VkTestImageRecord
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060062{
63public:
Tony Barbour6918cd52015-04-09 12:58:51 -060064 VkTestImageRecord();
65 VkTestImageRecord(const VkTestImageRecord &);
66 ~VkTestImageRecord();
67 VkTestImageRecord &operator=(const VkTestImageRecord &rhs);
68 int operator==(const VkTestImageRecord &rhs) const;
69 int operator<(const VkTestImageRecord &rhs) const;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060070
Tony Barbour96db8822015-02-25 12:28:39 -070071 string m_title;
72 int m_width;
73 int m_height;
74 void *m_data;
Tony Barbour96db8822015-02-25 12:28:39 -070075 unsigned m_data_size;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060076};
77
Tony Barbour6918cd52015-04-09 12:58:51 -060078class VkTestFramework : public ::testing::Test
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060079{
80public:
Tony Barbour6918cd52015-04-09 12:58:51 -060081 VkTestFramework();
82 ~VkTestFramework();
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060083
Cody Northrop50a2a4b2015-06-03 16:49:20 -060084 static bool optionMatch(const char* option, char* optionLine);
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060085 static void InitArgs(int *argc, char *argv[]);
Tony Barbour3d69c9e2015-05-20 16:53:31 -060086 static void InitWindow();
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -060087 static void Finish();
88
Tony Barbour6918cd52015-04-09 12:58:51 -060089 void WritePPM( const char *basename, VkImageObj *image );
90 void Show(const char *comment, VkImageObj *image);
91 void Compare(const char *comment, VkImageObj *image);
92 void RecordImage(VkImageObj * image);
93 void RecordImages(vector<VkImageObj *> image);
Tony Barbourd1c35722015-04-16 15:59:00 -060094 bool GLSLtoSPV(const VkShaderStage shader_type,
Courtney Goeltzenleuchter9818f782014-10-03 09:53:32 -060095 const char *pshader,
Cody Northrop3bfd27c2015-03-17 15:55:58 -060096 std::vector<unsigned int> &spv);
Cody Northrop50a2a4b2015-06-03 16:49:20 -060097 static bool m_use_glsl;
Cody Northrop5a95b472015-06-03 13:01:54 -060098 static bool m_canonicalize_spv;
99 static bool m_strip_spv;
100 static bool m_do_everything_spv;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600101
Courtney Goeltzenleuchter8bc46f42014-10-21 15:24:51 -0600102 char** ReadFileData(const char* fileName);
103 void FreeFileData(char** data);
104
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600105private:
Courtney Goeltzenleuchter9818f782014-10-03 09:53:32 -0600106 int m_compile_options;
107 int m_num_shader_strings;
108 TBuiltInResource Resources;
Courtney Goeltzenleuchter9818f782014-10-03 09:53:32 -0600109 void SetMessageOptions(EShMessages& messages);
110 void ProcessConfigFile();
Courtney Goeltzenleuchter9818f782014-10-03 09:53:32 -0600111 EShLanguage FindLanguage(const std::string& name);
Tony Barbourd1c35722015-04-16 15:59:00 -0600112 EShLanguage FindLanguage(const VkShaderStage shader_type);
Courtney Goeltzenleuchter9818f782014-10-03 09:53:32 -0600113 std::string ConfigFile;
114 bool SetConfigFile(const std::string& name);
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600115
Tony Barbour96db8822015-02-25 12:28:39 -0700116 static bool m_show_images;
117 static bool m_save_images;
118 static bool m_compare_images;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600119
Courtney Goeltzenleuchterd6079ec2015-04-22 10:09:35 -0600120 static std::list<VkTestImageRecord> m_images;
Tony Barbour6918cd52015-04-09 12:58:51 -0600121 static std::list<VkTestImageRecord>::iterator m_display_image;
Tony Barbour96db8822015-02-25 12:28:39 -0700122 static int m_display_image_idx;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600123
Tony Barbour96db8822015-02-25 12:28:39 -0700124 static int m_width; // Window width
125 static int m_height; // Window height
Tony Barbour247bf372014-10-30 14:29:04 -0600126
Tony Barbour96db8822015-02-25 12:28:39 -0700127 int m_frameNum;
128 string m_testName;
Courtney Goeltzenleuchter30e9dc42014-09-04 16:24:19 -0600129};
130
Cody Northrop50a2a4b2015-06-03 16:49:20 -0600131class ScopedUseGlsl
Chris Forbes969c6ee2015-05-25 11:13:04 +1200132{
133 bool saved_value;
134public:
Cody Northrop50a2a4b2015-06-03 16:49:20 -0600135 ScopedUseGlsl(bool value)
136 : saved_value(VkTestFramework::m_use_glsl)
Chris Forbes969c6ee2015-05-25 11:13:04 +1200137 {
Cody Northrop50a2a4b2015-06-03 16:49:20 -0600138 VkTestFramework::m_use_glsl = value;
Chris Forbes969c6ee2015-05-25 11:13:04 +1200139 }
140
Cody Northrop50a2a4b2015-06-03 16:49:20 -0600141 ~ScopedUseGlsl() {
142 VkTestFramework::m_use_glsl = saved_value;
Chris Forbes969c6ee2015-05-25 11:13:04 +1200143 }
144};
145
Courtney Goeltzenleuchtera0f74c52014-10-08 08:46:51 -0600146class TestEnvironment : public ::testing::Environment
147{
148 public:
149 void SetUp();
150
151 void TearDown();
152};
153
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600154#endif // VKTESTFRAMEWORK_H