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