blob: 94f2a98a03ed20b2eb14c1bba3123dc51e91dd1a [file] [log] [blame]
Michael Lentine83ab3412015-11-03 16:20:30 -08001// VK tests
2//
Nathaniel Cesario022e7b22021-04-06 00:06:17 -06003// Copyright (c) 2015-2021 The Khronos Group Inc.
4// Copyright (c) 2015-2021 Valve Corporation
5// Copyright (c) 2015-2021 LunarG, Inc.
6// Copyright (c) 2015-2021 Google, Inc.
Michael Lentine83ab3412015-11-03 16:20:30 -08007//
Jon Ashburn3ebf1252016-04-19 11:30:31 -06008// Licensed under the Apache License, Version 2.0 (the "License");
9// you may not use this file except in compliance with the License.
10// You may obtain a copy of the License at
Michael Lentine83ab3412015-11-03 16:20:30 -080011//
Jon Ashburn3ebf1252016-04-19 11:30:31 -060012// http://www.apache.org/licenses/LICENSE-2.0
Michael Lentine83ab3412015-11-03 16:20:30 -080013//
Jon Ashburn3ebf1252016-04-19 11:30:31 -060014// Unless required by applicable law or agreed to in writing, software
15// distributed under the License is distributed on an "AS IS" BASIS,
16// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17// See the License for the specific language governing permissions and
18// limitations under the License.
Michael Lentine83ab3412015-11-03 16:20:30 -080019
20#include "vktestframeworkandroid.h"
Cody Northrop8e54a402016-03-08 22:25:52 -070021#include "shaderc/shaderc.hpp"
22#include <android/log.h>
Michael Lentine83ab3412015-11-03 16:20:30 -080023
24VkTestFramework::VkTestFramework() {}
25VkTestFramework::~VkTestFramework() {}
26
Tobin Ehlis72888642017-11-15 09:43:56 -070027// Define static elements
28bool VkTestFramework::m_devsim_layer = false;
Nathaniel Cesario022e7b22021-04-06 00:06:17 -060029int VkTestFramework::m_phys_device_index = -1;
Locke5ddafd92019-03-20 10:11:33 -060030ANativeWindow *VkTestFramework::window = nullptr;
Tobin Ehlis72888642017-11-15 09:43:56 -070031
Mark Lobodzinskic6a62142016-09-07 16:35:55 -060032VkFormat VkTestFramework::GetFormat(VkInstance instance, vk_testing::Device *device) {
Michael Lentineb62cc052015-12-09 08:44:25 -080033 VkFormatProperties format_props;
Mark Lobodzinski1ad400e2019-09-27 13:53:29 -060034 vk::GetPhysicalDeviceFormatProperties(device->phy().handle(), VK_FORMAT_B8G8R8A8_UNORM, &format_props);
Michael Lentineb62cc052015-12-09 08:44:25 -080035 if (format_props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT ||
Mark Lobodzinskic6a62142016-09-07 16:35:55 -060036 format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Michael Lentineb62cc052015-12-09 08:44:25 -080037 return VK_FORMAT_B8G8R8A8_UNORM;
38 }
Mark Lobodzinski1ad400e2019-09-27 13:53:29 -060039 vk::GetPhysicalDeviceFormatProperties(device->phy().handle(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
Michael Lentineb62cc052015-12-09 08:44:25 -080040 if (format_props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT ||
Mark Lobodzinskic6a62142016-09-07 16:35:55 -060041 format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
Michael Lentineb62cc052015-12-09 08:44:25 -080042 return VK_FORMAT_R8G8B8A8_UNORM;
43 }
44 printf("Error - device does not support VK_FORMAT_B8G8R8A8_UNORM nor VK_FORMAT_R8G8B8A8_UNORM - exiting\n");
45 exit(0);
46}
47
Michael Lentine83ab3412015-11-03 16:20:30 -080048void VkTestFramework::InitArgs(int *argc, char *argv[]) {}
49void VkTestFramework::Finish() {}
50
Mark Lobodzinski91ee16c2019-09-27 11:44:52 -060051void TestEnvironment::SetUp() {
52 vk_testing::set_error_callback(test_error_callback);
53
54 vk::InitDispatchTable();
55}
Michael Lentine83ab3412015-11-03 16:20:30 -080056
57void TestEnvironment::TearDown() {}
Cody Northrop8e54a402016-03-08 22:25:52 -070058
Cody Northrop8e54a402016-03-08 22:25:52 -070059// Android specific helper functions for shaderc.
60struct shader_type_mapping {
61 VkShaderStageFlagBits vkshader_type;
62 shaderc_shader_kind shaderc_type;
63};
64
65static const shader_type_mapping shader_map_table[] = {
Mark Lobodzinskic6a62142016-09-07 16:35:55 -060066 {VK_SHADER_STAGE_VERTEX_BIT, shaderc_glsl_vertex_shader},
67 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, shaderc_glsl_tess_control_shader},
68 {VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, shaderc_glsl_tess_evaluation_shader},
69 {VK_SHADER_STAGE_GEOMETRY_BIT, shaderc_glsl_geometry_shader},
70 {VK_SHADER_STAGE_FRAGMENT_BIT, shaderc_glsl_fragment_shader},
71 {VK_SHADER_STAGE_COMPUTE_BIT, shaderc_glsl_compute_shader},
Cody Northrop8e54a402016-03-08 22:25:52 -070072};
73
74shaderc_shader_kind MapShadercType(VkShaderStageFlagBits vkShader) {
75 for (auto shader : shader_map_table) {
76 if (shader.vkshader_type == vkShader) {
77 return shader.shaderc_type;
78 }
79 }
80 assert(false);
81 return shaderc_glsl_infer_from_source;
82}
83
84// Compile a given string containing GLSL into SPIR-V
85// Return value of false means an error was encountered
Mark Lobodzinskif0003442019-10-28 16:05:32 -060086bool VkTestFramework::GLSLtoSPV(VkPhysicalDeviceLimits const *const device_limits, const VkShaderStageFlagBits shader_type,
87 const char *pshader, std::vector<unsigned int> &spirv, bool debug, uint32_t spirv_minor_version) {
Cody Northrop8e54a402016-03-08 22:25:52 -070088 // On Android, use shaderc instead.
89 shaderc::Compiler compiler;
Karl Schultz6c009e52019-01-14 19:21:05 -070090 shaderc::CompileOptions options;
91 if (debug) {
92 options.SetOptimizationLevel(shaderc_optimization_level_zero);
93 options.SetGenerateDebugInfo();
94 }
Jeff Bolz49d64982019-09-18 13:18:14 -050095
96 switch (spirv_minor_version) {
97 default:
98 case 0:
99 options.SetTargetSpirv(shaderc_spirv_version_1_0);
100 break;
101 case 1:
102 options.SetTargetSpirv(shaderc_spirv_version_1_1);
103 break;
104 case 2:
105 options.SetTargetSpirv(shaderc_spirv_version_1_2);
106 break;
107 case 3:
108 options.SetTargetSpirv(shaderc_spirv_version_1_3);
109 break;
110 case 4:
111 options.SetTargetSpirv(shaderc_spirv_version_1_4);
112 break;
113 }
114
Mark Lobodzinskif0003442019-10-28 16:05:32 -0600115 // Override glslang built-in GL settings with actual hardware values
116 options.SetLimit(shaderc_limit_max_clip_distances, device_limits->maxClipDistances);
117 options.SetLimit(shaderc_limit_max_compute_work_group_count_x, device_limits->maxComputeWorkGroupCount[0]);
118 options.SetLimit(shaderc_limit_max_compute_work_group_count_y, device_limits->maxComputeWorkGroupCount[1]);
119 options.SetLimit(shaderc_limit_max_compute_work_group_count_z, device_limits->maxComputeWorkGroupCount[2]);
120 options.SetLimit(shaderc_limit_max_compute_work_group_size_x, device_limits->maxComputeWorkGroupSize[0]);
121 options.SetLimit(shaderc_limit_max_compute_work_group_size_y, device_limits->maxComputeWorkGroupSize[1]);
122 options.SetLimit(shaderc_limit_max_compute_work_group_size_z, device_limits->maxComputeWorkGroupSize[2]);
123 options.SetLimit(shaderc_limit_max_cull_distances, device_limits->maxCullDistances);
124 options.SetLimit(shaderc_limit_max_fragment_input_components, device_limits->maxFragmentInputComponents);
125 options.SetLimit(shaderc_limit_max_geometry_input_components, device_limits->maxGeometryInputComponents);
126 options.SetLimit(shaderc_limit_max_geometry_output_components, device_limits->maxGeometryOutputComponents);
127 options.SetLimit(shaderc_limit_max_geometry_output_vertices, device_limits->maxGeometryOutputVertices);
128 options.SetLimit(shaderc_limit_max_geometry_total_output_components, device_limits->maxGeometryTotalOutputComponents);
129 options.SetLimit(shaderc_limit_max_vertex_output_components, device_limits->maxVertexOutputComponents);
130 options.SetLimit(shaderc_limit_max_viewports, device_limits->maxViewports);
131
Mark Lobodzinskic6a62142016-09-07 16:35:55 -0600132 shaderc::SpvCompilationResult result =
Karl Schultz6c009e52019-01-14 19:21:05 -0700133 compiler.CompileGlslToSpv(pshader, strlen(pshader), MapShadercType(shader_type), "shader", options);
Cody Northrop8e54a402016-03-08 22:25:52 -0700134 if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
Mark Lobodzinski4e1a2f32019-10-23 11:17:41 -0600135 __android_log_print(ANDROID_LOG_ERROR, "VulkanLayerValidationTests", "GLSLtoSPV compilation failed: %s",
Cody Northrop10133102018-09-25 09:02:03 -0600136 result.GetErrorMessage().c_str());
Cody Northrop8e54a402016-03-08 22:25:52 -0700137 return false;
138 }
139
140 for (auto iter = result.begin(); iter != result.end(); iter++) {
141 spirv.push_back(*iter);
142 }
143
144 return true;
145}
Karl Schultz23707622018-08-22 10:20:33 -0600146
147//
148// Compile a given string containing SPIR-V assembly into SPV for use by VK
149// Return value of false means an error was encountered.
150//
151bool VkTestFramework::ASMtoSPV(const spv_target_env target_env, const uint32_t options, const char *pasm,
152 std::vector<unsigned int> &spv) {
153 spv_binary binary;
154 spv_diagnostic diagnostic = nullptr;
155 spv_context context = spvContextCreate(target_env);
156 spv_result_t error = spvTextToBinaryWithOptions(context, pasm, strlen(pasm), options, &binary, &diagnostic);
157 spvContextDestroy(context);
158 if (error) {
159 __android_log_print(ANDROID_LOG_ERROR, "VkLayerValidationTest", "ASMtoSPV compilation failed");
160 spvDiagnosticDestroy(diagnostic);
161 return false;
162 }
163 spv.insert(spv.end(), binary->code, binary->code + binary->wordCount);
164 spvBinaryDestroy(binary);
165
166 return true;
167}