| /*------------------------------------------------------------------------- |
| * Vulkan CTS Framework |
| * -------------------- |
| * |
| * Copyright (c) 2015 Google 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 Program utilities. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "vkPrograms.hpp" |
| #include "vkGlslToSpirV.hpp" |
| #include "vkSpirVAsm.hpp" |
| #include "vkRefUtil.hpp" |
| |
| #include "tcuTestLog.hpp" |
| |
| #include "deArrayUtil.hpp" |
| #include "deMemory.h" |
| |
| namespace vk |
| { |
| |
| using std::string; |
| using std::vector; |
| using tcu::TestLog; |
| |
| // ProgramBinary |
| |
| ProgramBinary::ProgramBinary (ProgramFormat format, size_t binarySize, const deUint8* binary) |
| : m_format (format) |
| , m_binary (binary, binary+binarySize) |
| { |
| } |
| |
| // Utils |
| |
| ProgramBinary* buildProgram (const glu::ProgramSources& program, ProgramFormat binaryFormat, glu::ShaderProgramInfo* buildInfo) |
| { |
| if (binaryFormat == PROGRAM_FORMAT_SPIRV) |
| { |
| vector<deUint8> binary; |
| glslToSpirV(program, &binary, buildInfo); |
| return new ProgramBinary(binaryFormat, binary.size(), &binary[0]); |
| } |
| else |
| TCU_THROW(NotSupportedError, "Unsupported program format"); |
| } |
| |
| ProgramBinary* assembleProgram (const SpirVAsmSource& program, SpirVProgramInfo* buildInfo) |
| { |
| vector<deUint8> binary; |
| assembleSpirV(&program, &binary, buildInfo); |
| return new ProgramBinary(PROGRAM_FORMAT_SPIRV, binary.size(), &binary[0]); |
| } |
| |
| Move<VkShaderModule> createShaderModule (const DeviceInterface& deviceInterface, VkDevice device, const ProgramBinary& binary, VkShaderModuleCreateFlags flags) |
| { |
| if (binary.getFormat() == PROGRAM_FORMAT_SPIRV) |
| { |
| const struct VkShaderModuleCreateInfo shaderModuleInfo = |
| { |
| VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, |
| DE_NULL, |
| flags, |
| (deUintptr)binary.getSize(), |
| (const deUint32*)binary.getBinary(), |
| }; |
| |
| return createShaderModule(deviceInterface, device, &shaderModuleInfo); |
| } |
| else |
| TCU_THROW(NotSupportedError, "Unsupported program format"); |
| } |
| |
| glu::ShaderType getGluShaderType (VkShaderStageFlagBits shaderStage) |
| { |
| switch (shaderStage) |
| { |
| case VK_SHADER_STAGE_VERTEX_BIT: return glu::SHADERTYPE_VERTEX; |
| case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: return glu::SHADERTYPE_TESSELLATION_CONTROL; |
| case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: return glu::SHADERTYPE_TESSELLATION_EVALUATION; |
| case VK_SHADER_STAGE_GEOMETRY_BIT: return glu::SHADERTYPE_GEOMETRY; |
| case VK_SHADER_STAGE_FRAGMENT_BIT: return glu::SHADERTYPE_FRAGMENT; |
| case VK_SHADER_STAGE_COMPUTE_BIT: return glu::SHADERTYPE_COMPUTE; |
| default: |
| DE_FATAL("Unknown shader stage"); |
| return glu::SHADERTYPE_LAST; |
| } |
| } |
| |
| VkShaderStageFlagBits getVkShaderStage (glu::ShaderType shaderType) |
| { |
| static const VkShaderStageFlagBits s_shaderStages[] = |
| { |
| VK_SHADER_STAGE_VERTEX_BIT, |
| VK_SHADER_STAGE_FRAGMENT_BIT, |
| VK_SHADER_STAGE_GEOMETRY_BIT, |
| VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, |
| VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, |
| VK_SHADER_STAGE_COMPUTE_BIT |
| }; |
| |
| return de::getSizedArrayElement<glu::SHADERTYPE_LAST>(s_shaderStages, shaderType); |
| } |
| |
| } // vk |