blob: 818f1cea7763a2b9fd14faa11d1fe5a5c1d04d0d [file] [log] [blame]
// VK tests
//
// Copyright (c) 2015-2016 The Khronos Group Inc.
// Copyright (c) 2015-2016 Valve Corporation
// Copyright (c) 2015-2016 LunarG, Inc.
// Copyright (c) 2015-2016 Google, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and/or associated documentation files (the "Materials"), to
// deal in the Materials without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Materials, and to permit persons to whom the Materials are
// furnished to do so, subject to the following conditions:
//
// The above copyright notice(s) and this permission notice shall be included in
// all copies or substantial portions of the Materials.
//
// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
//
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
// USE OR OTHER DEALINGS IN THE MATERIALS.
#include "vktestframeworkandroid.h"
#include "shaderc/shaderc.hpp"
#include <android/log.h>
VkTestFramework::VkTestFramework() {}
VkTestFramework::~VkTestFramework() {}
bool VkTestFramework::m_use_glsl = false;
VkFormat VkTestFramework::GetFormat(VkInstance instance, vk_testing::Device *device)
{
VkFormatProperties format_props;
vkGetPhysicalDeviceFormatProperties(device->phy().handle(), VK_FORMAT_B8G8R8A8_UNORM, &format_props);
if (format_props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT ||
format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
{
return VK_FORMAT_B8G8R8A8_UNORM;
}
vkGetPhysicalDeviceFormatProperties(device->phy().handle(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
if (format_props.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT ||
format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)
{
return VK_FORMAT_R8G8B8A8_UNORM;
}
printf("Error - device does not support VK_FORMAT_B8G8R8A8_UNORM nor VK_FORMAT_R8G8B8A8_UNORM - exiting\n");
exit(0);
}
void VkTestFramework::InitArgs(int *argc, char *argv[]) {}
void VkTestFramework::Finish() {}
void TestEnvironment::SetUp()
{
vk_testing::set_error_callback(test_error_callback);
}
void TestEnvironment::TearDown() {}
// Android specific helper functions for shaderc.
struct shader_type_mapping {
VkShaderStageFlagBits vkshader_type;
shaderc_shader_kind shaderc_type;
};
static const shader_type_mapping shader_map_table[] = {
{
VK_SHADER_STAGE_VERTEX_BIT,
shaderc_glsl_vertex_shader
},
{
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
shaderc_glsl_tess_control_shader
},
{
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
shaderc_glsl_tess_evaluation_shader
},
{
VK_SHADER_STAGE_GEOMETRY_BIT,
shaderc_glsl_geometry_shader
},
{
VK_SHADER_STAGE_FRAGMENT_BIT,
shaderc_glsl_fragment_shader
},
{
VK_SHADER_STAGE_COMPUTE_BIT,
shaderc_glsl_compute_shader
},
};
shaderc_shader_kind MapShadercType(VkShaderStageFlagBits vkShader) {
for (auto shader : shader_map_table) {
if (shader.vkshader_type == vkShader) {
return shader.shaderc_type;
}
}
assert(false);
return shaderc_glsl_infer_from_source;
}
// Compile a given string containing GLSL into SPIR-V
// Return value of false means an error was encountered
bool VkTestFramework::GLSLtoSPV(const VkShaderStageFlagBits shader_type,
const char *pshader,
std::vector<unsigned int> &spirv) {
// On Android, use shaderc instead.
shaderc::Compiler compiler;
shaderc::SpvCompilationResult result = compiler.CompileGlslToSpv(pshader, strlen(pshader),
MapShadercType(shader_type),
"shader");
if (result.GetCompilationStatus() != shaderc_compilation_status_success) {
__android_log_print(ANDROID_LOG_ERROR,
"VkLayerValidationTest",
"GLSLtoSPV compilation failed");
return false;
}
for (auto iter = result.begin(); iter != result.end(); iter++) {
spirv.push_back(*iter);
}
return true;
}