1 #ifndef _VKTSHADEREXECUTOR_HPP 2 #define _VKTSHADEREXECUTOR_HPP 3 /*------------------------------------------------------------------------ 4 * Vulkan Conformance Tests 5 * ------------------------ 6 * 7 * Copyright (c) 2015 The Khronos Group Inc. 8 * Copyright (c) 2015 Samsung Electronics Co., Ltd. 9 * 10 * Licensed under the Apache License, Version 2.0 (the "License"); 11 * you may not use this file except in compliance with the License. 12 * You may obtain a copy of the License at 13 * 14 * http://www.apache.org/licenses/LICENSE-2.0 15 * 16 * Unless required by applicable law or agreed to in writing, software 17 * distributed under the License is distributed on an "AS IS" BASIS, 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 19 * See the License for the specific language governing permissions and 20 * limitations under the License. 21 * 22 *//*! 23 * \file 24 * \brief Vulkan ShaderExecutor 25 *//*--------------------------------------------------------------------*/ 26 27 #include "tcuDefs.hpp" 28 #include "vktTestCase.hpp" 29 #include "gluVarType.hpp" 30 #include "vkGlslProgram.hpp" 31 32 #include <vector> 33 #include <string> 34 35 namespace vkt 36 { 37 namespace shaderexecutor 38 { 39 40 //! Shader input / output variable declaration. 41 struct Symbol 42 { 43 std::string name; //!< Symbol name. 44 glu::VarType varType; //!< Symbol type. 45 Symbolvkt::shaderexecutor::Symbol46 Symbol (void) {} Symbolvkt::shaderexecutor::Symbol47 Symbol (const std::string& name_, const glu::VarType& varType_) : name(name_), varType(varType_) {} 48 }; 49 50 //! Complete shader specification. 51 struct ShaderSpec 52 { 53 glu::GLSLVersion glslVersion; 54 std::vector<Symbol> inputs; 55 std::vector<Symbol> outputs; 56 std::string globalDeclarations; //!< These are placed into global scope. Can contain uniform declarations for example. 57 std::string source; //!< Source snippet to be executed. 58 vk::GlslBuildOptions buildOptions; 59 ShaderSpecvkt::shaderexecutor::ShaderSpec60 ShaderSpec (void) 61 : glslVersion(glu::GLSL_VERSION_310_ES) 62 {} 63 }; 64 65 enum 66 { 67 //!< Descriptor set index for additional resources 68 EXTRA_RESOURCES_DESCRIPTOR_SET_INDEX = 1, 69 }; 70 71 //! Base class for shader executor. 72 class ShaderExecutor 73 { 74 public: 75 virtual ~ShaderExecutor (void); 76 77 //! Execute 78 virtual void execute (int numValues, const void* const* inputs, void* const* outputs, vk::VkDescriptorSet extraResources = (vk::VkDescriptorSet)0) = 0; 79 80 protected: ShaderExecutor(Context & context,const ShaderSpec & shaderSpec)81 ShaderExecutor (Context& context, const ShaderSpec& shaderSpec) 82 : m_context (context) 83 , m_shaderSpec (shaderSpec) 84 {} 85 86 Context& m_context; 87 const ShaderSpec m_shaderSpec; 88 89 private: 90 ShaderExecutor (const ShaderExecutor&); 91 ShaderExecutor& operator= (const ShaderExecutor&); 92 }; 93 94 void generateSources (glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::SourceCollections& dst); 95 ShaderExecutor* createExecutor (Context& context, glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::VkDescriptorSetLayout extraResourcesLayout = (vk::VkDescriptorSetLayout)0); 96 97 } // shaderexecutor 98 } // vkt 99 100 #endif // _VKTSHADEREXECUTOR_HPP 101