126bb4440a2d34fe0218bdb960de2a1f8abfdaeb
[platform/upstream/VK-GL-CTS.git] / external / vulkancts / modules / vulkan / shaderexecutor / vktShaderExecutor.hpp
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
31 #include <vector>
32 #include <string>
33
34 namespace vkt
35 {
36 namespace shaderexecutor
37 {
38
39 //! Shader input / output variable declaration.
40 struct Symbol
41 {
42         std::string                             name;           //!< Symbol name.
43         glu::VarType                    varType;        //!< Symbol type.
44
45         Symbol (void) {}
46         Symbol (const std::string& name_, const glu::VarType& varType_) : name(name_), varType(varType_) {}
47 };
48
49 //! Complete shader specification.
50 struct ShaderSpec
51 {
52         std::vector<Symbol>             inputs;
53         std::vector<Symbol>             outputs;
54         std::string                             globalDeclarations;     //!< These are placed into global scope. Can contain uniform declarations for example.
55         std::string                             source;                         //!< Source snippet to be executed.
56
57         ShaderSpec (void) {}
58 };
59
60 enum
61 {
62         //!< Descriptor set index for additional resources
63         EXTRA_RESOURCES_DESCRIPTOR_SET_INDEX            = 1,
64 };
65
66 //! Base class for shader executor.
67 class ShaderExecutor
68 {
69 public:
70         virtual                                 ~ShaderExecutor         (void);
71
72         //! Execute
73         virtual void                    execute                         (int numValues, const void* const* inputs, void* const* outputs, vk::VkDescriptorSet extraResources = (vk::VkDescriptorSet)0) = 0;
74
75 protected:
76                                                         ShaderExecutor          (Context& context, const ShaderSpec& shaderSpec)
77                                                                 : m_context             (context)
78                                                                 , m_shaderSpec  (shaderSpec)
79                                                         {}
80
81         Context&                                m_context;
82         const ShaderSpec                m_shaderSpec;
83
84 private:
85                                                         ShaderExecutor          (const ShaderExecutor&);
86         ShaderExecutor&                 operator=                       (const ShaderExecutor&);
87 };
88
89 void                            generateSources         (glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::SourceCollections& dst);
90 ShaderExecutor*         createExecutor          (Context& context, glu::ShaderType shaderType, const ShaderSpec& shaderSpec, vk::VkDescriptorSetLayout extraResourcesLayout = (vk::VkDescriptorSetLayout)0);
91
92 } // shaderexecutor
93 } // vkt
94
95 #endif // _VKTSHADEREXECUTOR_HPP