1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "src/sksl/SkSLContext.h" 9 #include "src/sksl/SkSLMemoryLayout.h" 10 11 #include "tests/Test.h" 12 DEF_TEST(SkSLMemoryLayout140Test,r)13 DEF_TEST(SkSLMemoryLayout140Test, r) { 14 SkSL::Context context; 15 SkSL::MemoryLayout layout(SkSL::MemoryLayout::k140_Standard); 16 17 // basic types 18 REPORTER_ASSERT(r, 4 == layout.size(*context.fFloat_Type)); 19 REPORTER_ASSERT(r, 8 == layout.size(*context.fFloat2_Type)); 20 REPORTER_ASSERT(r, 12 == layout.size(*context.fFloat3_Type)); 21 REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat4_Type)); 22 REPORTER_ASSERT(r, 4 == layout.size(*context.fInt_Type)); 23 REPORTER_ASSERT(r, 8 == layout.size(*context.fInt2_Type)); 24 REPORTER_ASSERT(r, 12 == layout.size(*context.fInt3_Type)); 25 REPORTER_ASSERT(r, 16 == layout.size(*context.fInt4_Type)); 26 REPORTER_ASSERT(r, 1 == layout.size(*context.fBool_Type)); 27 REPORTER_ASSERT(r, 2 == layout.size(*context.fBool2_Type)); 28 REPORTER_ASSERT(r, 3 == layout.size(*context.fBool3_Type)); 29 REPORTER_ASSERT(r, 4 == layout.size(*context.fBool4_Type)); 30 REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x2_Type)); 31 REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x4_Type)); 32 REPORTER_ASSERT(r, 48 == layout.size(*context.fFloat3x3_Type)); 33 REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x2_Type)); 34 REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x4_Type)); 35 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fFloat_Type)); 36 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fFloat2_Type)); 37 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3_Type)); 38 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4_Type)); 39 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fInt_Type)); 40 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fInt2_Type)); 41 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt3_Type)); 42 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt4_Type)); 43 REPORTER_ASSERT(r, 1 == layout.alignment(*context.fBool_Type)); 44 REPORTER_ASSERT(r, 2 == layout.alignment(*context.fBool2_Type)); 45 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fBool3_Type)); 46 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fBool4_Type)); 47 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x2_Type)); 48 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x4_Type)); 49 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3x3_Type)); 50 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x2_Type)); 51 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x4_Type)); 52 53 // struct 1 54 std::vector<SkSL::Type::Field> fields1; 55 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fFloat3_Type.get()); 56 SkSL::Type s1(-1, SkSL::String("s1"), fields1); 57 REPORTER_ASSERT(r, 16 == layout.size(s1)); 58 REPORTER_ASSERT(r, 16 == layout.alignment(s1)); 59 60 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat_Type.get()); 61 SkSL::Type s2(-1, SkSL::String("s2"), fields1); 62 REPORTER_ASSERT(r, 16 == layout.size(s2)); 63 REPORTER_ASSERT(r, 16 == layout.alignment(s2)); 64 65 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("c"), context.fBool_Type.get()); 66 SkSL::Type s3(-1, SkSL::String("s3"), fields1); 67 REPORTER_ASSERT(r, 32 == layout.size(s3)); 68 REPORTER_ASSERT(r, 16 == layout.alignment(s3)); 69 70 // struct 2 71 std::vector<SkSL::Type::Field> fields2; 72 fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fInt_Type.get()); 73 SkSL::Type s4(-1, SkSL::String("s4"), fields2); 74 REPORTER_ASSERT(r, 16 == layout.size(s4)); 75 REPORTER_ASSERT(r, 16 == layout.alignment(s4)); 76 77 fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat3_Type.get()); 78 SkSL::Type s5(-1, SkSL::String("s5"), fields2); 79 REPORTER_ASSERT(r, 32 == layout.size(s5)); 80 REPORTER_ASSERT(r, 16 == layout.alignment(s5)); 81 82 // arrays 83 SkSL::Type array1(SkSL::String("float[4]"), SkSL::Type::kArray_Kind, *context.fFloat_Type, 4); 84 REPORTER_ASSERT(r, 64 == layout.size(array1)); 85 REPORTER_ASSERT(r, 16 == layout.alignment(array1)); 86 REPORTER_ASSERT(r, 16 == layout.stride(array1)); 87 88 SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::kArray_Kind, *context.fFloat4_Type, 4); 89 REPORTER_ASSERT(r, 64 == layout.size(array2)); 90 REPORTER_ASSERT(r, 16 == layout.alignment(array2)); 91 REPORTER_ASSERT(r, 16 == layout.stride(array2)); 92 } 93 DEF_TEST(SkSLMemoryLayout430Test,r)94 DEF_TEST(SkSLMemoryLayout430Test, r) { 95 SkSL::Context context; 96 SkSL::MemoryLayout layout(SkSL::MemoryLayout::k430_Standard); 97 98 // basic types 99 REPORTER_ASSERT(r, 4 == layout.size(*context.fFloat_Type)); 100 REPORTER_ASSERT(r, 8 == layout.size(*context.fFloat2_Type)); 101 REPORTER_ASSERT(r, 12 == layout.size(*context.fFloat3_Type)); 102 REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat4_Type)); 103 REPORTER_ASSERT(r, 4 == layout.size(*context.fInt_Type)); 104 REPORTER_ASSERT(r, 8 == layout.size(*context.fInt2_Type)); 105 REPORTER_ASSERT(r, 12 == layout.size(*context.fInt3_Type)); 106 REPORTER_ASSERT(r, 16 == layout.size(*context.fInt4_Type)); 107 REPORTER_ASSERT(r, 1 == layout.size(*context.fBool_Type)); 108 REPORTER_ASSERT(r, 2 == layout.size(*context.fBool2_Type)); 109 REPORTER_ASSERT(r, 3 == layout.size(*context.fBool3_Type)); 110 REPORTER_ASSERT(r, 4 == layout.size(*context.fBool4_Type)); 111 REPORTER_ASSERT(r, 16 == layout.size(*context.fFloat2x2_Type)); 112 REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat2x4_Type)); 113 REPORTER_ASSERT(r, 48 == layout.size(*context.fFloat3x3_Type)); 114 REPORTER_ASSERT(r, 32 == layout.size(*context.fFloat4x2_Type)); 115 REPORTER_ASSERT(r, 64 == layout.size(*context.fFloat4x4_Type)); 116 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fFloat_Type)); 117 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fFloat2_Type)); 118 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3_Type)); 119 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4_Type)); 120 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fInt_Type)); 121 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fInt2_Type)); 122 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt3_Type)); 123 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fInt4_Type)); 124 REPORTER_ASSERT(r, 1 == layout.alignment(*context.fBool_Type)); 125 REPORTER_ASSERT(r, 2 == layout.alignment(*context.fBool2_Type)); 126 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fBool3_Type)); 127 REPORTER_ASSERT(r, 4 == layout.alignment(*context.fBool4_Type)); 128 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fFloat2x2_Type)); 129 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat2x4_Type)); 130 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat3x3_Type)); 131 REPORTER_ASSERT(r, 8 == layout.alignment(*context.fFloat4x2_Type)); 132 REPORTER_ASSERT(r, 16 == layout.alignment(*context.fFloat4x4_Type)); 133 134 // struct 1 135 std::vector<SkSL::Type::Field> fields1; 136 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fFloat3_Type.get()); 137 SkSL::Type s1(-1, SkSL::String("s1"), fields1); 138 REPORTER_ASSERT(r, 16 == layout.size(s1)); 139 REPORTER_ASSERT(r, 16 == layout.alignment(s1)); 140 141 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat_Type.get()); 142 SkSL::Type s2(-1, SkSL::String("s2"), fields1); 143 REPORTER_ASSERT(r, 16 == layout.size(s2)); 144 REPORTER_ASSERT(r, 16 == layout.alignment(s2)); 145 146 fields1.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("c"), context.fBool_Type.get()); 147 SkSL::Type s3(-1, SkSL::String("s3"), fields1); 148 REPORTER_ASSERT(r, 32 == layout.size(s3)); 149 REPORTER_ASSERT(r, 16 == layout.alignment(s3)); 150 151 // struct 2 152 std::vector<SkSL::Type::Field> fields2; 153 fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("a"), context.fInt_Type.get()); 154 SkSL::Type s4(-1, SkSL::String("s4"), fields2); 155 REPORTER_ASSERT(r, 4 == layout.size(s4)); 156 REPORTER_ASSERT(r, 4 == layout.alignment(s4)); 157 158 fields2.emplace_back(SkSL::Modifiers(), SkSL::StringFragment("b"), context.fFloat3_Type.get()); 159 SkSL::Type s5(-1, SkSL::String("s5"), fields2); 160 REPORTER_ASSERT(r, 32 == layout.size(s5)); 161 REPORTER_ASSERT(r, 16 == layout.alignment(s5)); 162 163 // arrays 164 SkSL::Type array1(SkSL::String("float[4]"), SkSL::Type::kArray_Kind, *context.fFloat_Type, 4); 165 REPORTER_ASSERT(r, 16 == layout.size(array1)); 166 REPORTER_ASSERT(r, 4 == layout.alignment(array1)); 167 REPORTER_ASSERT(r, 4 == layout.stride(array1)); 168 169 SkSL::Type array2(SkSL::String("float4[4]"), SkSL::Type::kArray_Kind, *context.fFloat4_Type, 4); 170 REPORTER_ASSERT(r, 64 == layout.size(array2)); 171 REPORTER_ASSERT(r, 16 == layout.alignment(array2)); 172 REPORTER_ASSERT(r, 16 == layout.stride(array2)); 173 } 174