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 "SkSLType.h"
9 #include "SkSLContext.h"
10
11 namespace SkSL {
12
determineCoercionCost(const Type & other,int * outCost) const13 bool Type::determineCoercionCost(const Type& other, int* outCost) const {
14 if (*this == other) {
15 *outCost = 0;
16 return true;
17 }
18 if (this->kind() == kVector_Kind && other.kind() == kVector_Kind) {
19 if (this->columns() == other.columns()) {
20 return this->componentType().determineCoercionCost(other.componentType(), outCost);
21 }
22 return false;
23 }
24 if (this->kind() == kMatrix_Kind) {
25 if (this->columns() == other.columns() &&
26 this->rows() == other.rows()) {
27 return this->componentType().determineCoercionCost(other.componentType(), outCost);
28 }
29 return false;
30 }
31 for (size_t i = 0; i < fCoercibleTypes.size(); i++) {
32 if (*fCoercibleTypes[i] == other) {
33 *outCost = (int) i + 1;
34 return true;
35 }
36 }
37 return false;
38 }
39
toCompound(const Context & context,int columns,int rows) const40 const Type& Type::toCompound(const Context& context, int columns, int rows) const {
41 ASSERT(this->kind() == Type::kScalar_Kind);
42 if (columns == 1 && rows == 1) {
43 return *this;
44 }
45 if (*this == *context.fFloat_Type) {
46 switch (rows) {
47 case 1:
48 switch (columns) {
49 case 2: return *context.fVec2_Type;
50 case 3: return *context.fVec3_Type;
51 case 4: return *context.fVec4_Type;
52 default: ABORT("unsupported vector column count (%d)", columns);
53 }
54 case 2:
55 switch (columns) {
56 case 2: return *context.fMat2x2_Type;
57 case 3: return *context.fMat3x2_Type;
58 case 4: return *context.fMat4x2_Type;
59 default: ABORT("unsupported matrix column count (%d)", columns);
60 }
61 case 3:
62 switch (columns) {
63 case 2: return *context.fMat2x3_Type;
64 case 3: return *context.fMat3x3_Type;
65 case 4: return *context.fMat4x3_Type;
66 default: ABORT("unsupported matrix column count (%d)", columns);
67 }
68 case 4:
69 switch (columns) {
70 case 2: return *context.fMat2x4_Type;
71 case 3: return *context.fMat3x4_Type;
72 case 4: return *context.fMat4x4_Type;
73 default: ABORT("unsupported matrix column count (%d)", columns);
74 }
75 default: ABORT("unsupported row count (%d)", rows);
76 }
77 } else if (*this == *context.fDouble_Type) {
78 switch (rows) {
79 case 1:
80 switch (columns) {
81 case 2: return *context.fDVec2_Type;
82 case 3: return *context.fDVec3_Type;
83 case 4: return *context.fDVec4_Type;
84 default: ABORT("unsupported vector column count (%d)", columns);
85 }
86 case 2:
87 switch (columns) {
88 case 2: return *context.fDMat2x2_Type;
89 case 3: return *context.fDMat3x2_Type;
90 case 4: return *context.fDMat4x2_Type;
91 default: ABORT("unsupported matrix column count (%d)", columns);
92 }
93 case 3:
94 switch (columns) {
95 case 2: return *context.fDMat2x3_Type;
96 case 3: return *context.fDMat3x3_Type;
97 case 4: return *context.fDMat4x3_Type;
98 default: ABORT("unsupported matrix column count (%d)", columns);
99 }
100 case 4:
101 switch (columns) {
102 case 2: return *context.fDMat2x4_Type;
103 case 3: return *context.fDMat3x4_Type;
104 case 4: return *context.fDMat4x4_Type;
105 default: ABORT("unsupported matrix column count (%d)", columns);
106 }
107 default: ABORT("unsupported row count (%d)", rows);
108 }
109 } else if (*this == *context.fInt_Type) {
110 switch (rows) {
111 case 1:
112 switch (columns) {
113 case 2: return *context.fIVec2_Type;
114 case 3: return *context.fIVec3_Type;
115 case 4: return *context.fIVec4_Type;
116 default: ABORT("unsupported vector column count (%d)", columns);
117 }
118 default: ABORT("unsupported row count (%d)", rows);
119 }
120 } else if (*this == *context.fUInt_Type) {
121 switch (rows) {
122 case 1:
123 switch (columns) {
124 case 2: return *context.fUVec2_Type;
125 case 3: return *context.fUVec3_Type;
126 case 4: return *context.fUVec4_Type;
127 default: ABORT("unsupported vector column count (%d)", columns);
128 }
129 default: ABORT("unsupported row count (%d)", rows);
130 }
131 }
132 ABORT("unsupported scalar_to_compound type %s", this->description().c_str());
133 }
134
135 } // namespace
136