blob: c7911c5e6a9a6fe3ddfbc0f916663f32d242af0a [file] [log] [blame]
/*-------------------------------------------------------------------------
* Vulkan CTS Framework
* --------------------
*
* Copyright (c) 2022 NVIDIA CORPORATION, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*//*!
* \file
* \brief Vulkan SC utilities
*//*--------------------------------------------------------------------*/
#include "vkAppParamsUtil.hpp"
#include <fstream>
#include <string>
#include <sstream>
#ifdef CTS_USES_VULKANSC
namespace vk
{
std::string trim (const std::string& original)
{
static const std::string whiteSigns = " \t";
const auto beg = original.find_first_not_of(whiteSigns);
if (beg == std::string::npos)
return std::string();
const auto end = original.find_last_not_of(whiteSigns);
return original.substr(beg, end - beg + 1);
}
bool readApplicationParameters (std::vector<VkApplicationParametersEXT>& appParams, const tcu::CommandLine& cmdLine, const bool readInstanceAppParams)
{
const char* appParamsInputFilePath = cmdLine.getAppParamsInputFilePath();
if (appParamsInputFilePath == DE_NULL)
return false;
std::ifstream file(appParamsInputFilePath);
std::vector<std::string> lines;
std::vector<VkApplicationParametersEXT> tmpAppParams;
if (file.is_open())
{
std::string line;
while (std::getline(file, line))
lines.push_back(line);
file.close();
}
else
{
TCU_THROW(InternalError, "Application parameters input file not found from --deqp-app-params-input-file");
return false;
}
for (const std::string& line : lines)
{
if (line.empty())
continue;
std::stringstream sstream(line);
std::string token;
std::vector<std::string> tokens;
while (std::getline(sstream, token, ','))
tokens.push_back(trim(token));
if (tokens[0] != "instance" && tokens[0] != "device")
{
TCU_THROW(InternalError, "Invalid create type from --deqp-app-params-input-file");
return false;
}
if ((tokens[0] == "instance" && readInstanceAppParams) || (tokens[0] == "device" && !readInstanceAppParams))
{
if (tokens.size() == 5)
{
const VkApplicationParametersEXT appParam =
{
VK_STRUCTURE_TYPE_APPLICATION_PARAMETERS_EXT, // sType
DE_NULL, // pNext
static_cast<deUint32>(std::stoul(tokens[1], nullptr, 16)), // vendorID
static_cast<deUint32>(std::stoul(tokens[2], nullptr, 16)), // deviceID
static_cast<deUint32>(std::stoul(tokens[3], nullptr, 16)), // key
static_cast<deUint64>(std::stoul(tokens[4], nullptr, 16)) // value
};
tmpAppParams.push_back(appParam);
}
else
{
TCU_THROW(InternalError, "Invalid input format from --deqp-app-params-input-file");
return false;
}
}
}
if (tmpAppParams.empty())
return false;
appParams = tmpAppParams;
for (size_t ndx = 0; ndx < appParams.size(); ++ndx)
{
if (ndx != appParams.size() - 1)
appParams[ndx].pNext = &appParams[ndx + 1];
}
return true;
}
} // vk
#endif // CTS_USES_VULKANSC