1 // Copyright (c) 2019 Google LLC. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "test/val/val_code_generator.h" 16 17 #include <sstream> 18 19 namespace spvtools { 20 namespace val { 21 namespace { 22 GetDefaultShaderCapabilities()23std::string GetDefaultShaderCapabilities() { 24 return R"( 25 OpCapability Shader 26 OpCapability Geometry 27 OpCapability Tessellation 28 OpCapability Float64 29 OpCapability Int64 30 OpCapability MultiViewport 31 OpCapability SampleRateShading 32 )"; 33 } 34 GetDefaultShaderTypes()35std::string GetDefaultShaderTypes() { 36 return R"( 37 %void = OpTypeVoid 38 %func = OpTypeFunction %void 39 %bool = OpTypeBool 40 %f32 = OpTypeFloat 32 41 %f64 = OpTypeFloat 64 42 %i32 = OpTypeInt 32 1 43 %i64 = OpTypeInt 64 1 44 %u32 = OpTypeInt 32 0 45 %u64 = OpTypeInt 64 0 46 %f32vec2 = OpTypeVector %f32 2 47 %f32vec3 = OpTypeVector %f32 3 48 %f32vec4 = OpTypeVector %f32 4 49 %f64vec2 = OpTypeVector %f64 2 50 %f64vec3 = OpTypeVector %f64 3 51 %f64vec4 = OpTypeVector %f64 4 52 %u32vec2 = OpTypeVector %u32 2 53 %u32vec3 = OpTypeVector %u32 3 54 %u64vec3 = OpTypeVector %u64 3 55 %u32vec4 = OpTypeVector %u32 4 56 %u64vec2 = OpTypeVector %u64 2 57 58 %f32_0 = OpConstant %f32 0 59 %f32_1 = OpConstant %f32 1 60 %f32_2 = OpConstant %f32 2 61 %f32_3 = OpConstant %f32 3 62 %f32_4 = OpConstant %f32 4 63 %f32_h = OpConstant %f32 0.5 64 %f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1 65 %f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2 66 %f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2 67 %f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3 68 %f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3 69 %f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4 70 71 %f64_0 = OpConstant %f64 0 72 %f64_1 = OpConstant %f64 1 73 %f64_2 = OpConstant %f64 2 74 %f64_3 = OpConstant %f64 3 75 %f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1 76 %f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2 77 %f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3 78 79 %u32_0 = OpConstant %u32 0 80 %u32_1 = OpConstant %u32 1 81 %u32_2 = OpConstant %u32 2 82 %u32_3 = OpConstant %u32 3 83 %u32_4 = OpConstant %u32 4 84 85 %u64_0 = OpConstant %u64 0 86 %u64_1 = OpConstant %u64 1 87 %u64_2 = OpConstant %u64 2 88 %u64_3 = OpConstant %u64 3 89 90 %u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1 91 %u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2 92 %u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3 93 %u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1 94 95 %u32arr2 = OpTypeArray %u32 %u32_2 96 %u32arr3 = OpTypeArray %u32 %u32_3 97 %u32arr4 = OpTypeArray %u32 %u32_4 98 %u64arr2 = OpTypeArray %u64 %u32_2 99 %u64arr3 = OpTypeArray %u64 %u32_3 100 %u64arr4 = OpTypeArray %u64 %u32_4 101 %f32arr2 = OpTypeArray %f32 %u32_2 102 %f32arr3 = OpTypeArray %f32 %u32_3 103 %f32arr4 = OpTypeArray %f32 %u32_4 104 %f64arr2 = OpTypeArray %f64 %u32_2 105 %f64arr3 = OpTypeArray %f64 %u32_3 106 %f64arr4 = OpTypeArray %f64 %u32_4 107 108 %f32vec3arr3 = OpTypeArray %f32vec3 %u32_3 109 %f32vec4arr3 = OpTypeArray %f32vec4 %u32_3 110 %f64vec4arr3 = OpTypeArray %f64vec4 %u32_3 111 112 %f32mat22 = OpTypeMatrix %f32vec2 2 113 %f32mat23 = OpTypeMatrix %f32vec2 3 114 %f32mat32 = OpTypeMatrix %f32vec3 2 115 %f32mat33 = OpTypeMatrix %f32vec3 3 116 %f64mat22 = OpTypeMatrix %f64vec2 2 117 %f32mat34 = OpTypeMatrix %f32vec3 4 118 %f32mat43 = OpTypeMatrix %f32vec4 3 119 %f32mat44 = OpTypeMatrix %f32vec4 4 120 )"; 121 } 122 123 } // namespace 124 GetDefaultShaderCodeGenerator()125CodeGenerator CodeGenerator::GetDefaultShaderCodeGenerator() { 126 CodeGenerator generator; 127 generator.capabilities_ = GetDefaultShaderCapabilities(); 128 generator.memory_model_ = "OpMemoryModel Logical GLSL450\n"; 129 generator.types_ = GetDefaultShaderTypes(); 130 return generator; 131 } 132 Build() const133std::string CodeGenerator::Build() const { 134 std::ostringstream ss; 135 136 ss << capabilities_; 137 ss << extensions_; 138 ss << memory_model_; 139 140 for (const EntryPoint& entry_point : entry_points_) { 141 ss << "OpEntryPoint " << entry_point.execution_model << " %" 142 << entry_point.name << " \"" << entry_point.name << "\" " 143 << entry_point.interfaces << "\n"; 144 } 145 146 for (const EntryPoint& entry_point : entry_points_) { 147 ss << entry_point.execution_modes << "\n"; 148 } 149 150 ss << before_types_; 151 ss << types_; 152 ss << after_types_; 153 154 for (const EntryPoint& entry_point : entry_points_) { 155 ss << "\n"; 156 ss << "%" << entry_point.name << " = OpFunction %void None %func\n"; 157 ss << "%" << entry_point.name << "_entry = OpLabel\n"; 158 ss << entry_point.body; 159 ss << "\nOpReturn\nOpFunctionEnd\n"; 160 } 161 162 ss << add_at_the_end_; 163 164 return ss.str(); 165 } 166 167 } // namespace val 168 } // namespace spvtools 169