1 /* 2 * Copyright 2013 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 #ifndef GrTypesPriv_DEFINED 9 #define GrTypesPriv_DEFINED 10 11 #include "GrTypes.h" 12 #include "SkTArray.h" 13 14 /** 15 * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars, 16 * but should be applicable to other shader languages.) 17 */ 18 enum GrSLType { 19 kVoid_GrSLType, 20 kFloat_GrSLType, 21 kVec2f_GrSLType, 22 kVec3f_GrSLType, 23 kVec4f_GrSLType, 24 kMat33f_GrSLType, 25 kMat44f_GrSLType, 26 kSampler2D_GrSLType, 27 28 kLast_GrSLType = kSampler2D_GrSLType 29 }; 30 static const int kGrSLTypeCount = kLast_GrSLType + 1; 31 32 /** 33 * Gets the vector size of the SLType. Returns -1 for void, matrices, and samplers. 34 */ 35 static inline int GrSLTypeVectorCount(GrSLType type) { 36 GrAssert(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount)); 37 static const int kCounts[] = { -1, 1, 2, 3, 4, -1, -1, -1 }; 38 return kCounts[type]; 39 40 GR_STATIC_ASSERT(0 == kVoid_GrSLType); 41 GR_STATIC_ASSERT(1 == kFloat_GrSLType); 42 GR_STATIC_ASSERT(2 == kVec2f_GrSLType); 43 GR_STATIC_ASSERT(3 == kVec3f_GrSLType); 44 GR_STATIC_ASSERT(4 == kVec4f_GrSLType); 45 GR_STATIC_ASSERT(5 == kMat33f_GrSLType); 46 GR_STATIC_ASSERT(6 == kMat44f_GrSLType); 47 GR_STATIC_ASSERT(7 == kSampler2D_GrSLType); 48 GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrSLTypeCount); 49 } 50 51 /** Return the type enum for a vector of floats of length n (1..4), 52 e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */ 53 static inline GrSLType GrSLFloatVectorType(int count) { 54 GrAssert(count > 0 && count <= 4); 55 return (GrSLType)(count); 56 57 GR_STATIC_ASSERT(kFloat_GrSLType == 1); 58 GR_STATIC_ASSERT(kVec2f_GrSLType == 2); 59 GR_STATIC_ASSERT(kVec3f_GrSLType == 3); 60 GR_STATIC_ASSERT(kVec4f_GrSLType == 4); 61 } 62 63 /** 64 * Types used to describe format of vertices in arrays. 65 */ 66 enum GrVertexAttribType { 67 kFloat_GrVertexAttribType = 0, 68 kVec2f_GrVertexAttribType, 69 kVec3f_GrVertexAttribType, 70 kVec4f_GrVertexAttribType, 71 kVec4ub_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors 72 73 kLast_GrVertexAttribType = kVec4ub_GrVertexAttribType 74 }; 75 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1; 76 77 /** 78 * Returns the vector size of the type. 79 */ 80 static inline int GrVertexAttribTypeVectorCount(GrVertexAttribType type) { 81 GrAssert(type >= 0 && type < kGrVertexAttribTypeCount); 82 static const int kCounts[] = { 1, 2, 3, 4, 4 }; 83 return kCounts[type]; 84 85 GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); 86 GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); 87 GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); 88 GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); 89 GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); 90 GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrVertexAttribTypeCount); 91 } 92 93 /** 94 * Returns the size of the attrib type in bytes. 95 */ 96 static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) { 97 GrAssert(type >= 0 && type < kGrVertexAttribTypeCount); 98 static const size_t kSizes[] = { 99 sizeof(float), // kFloat_GrVertexAttribType 100 2*sizeof(float), // kVec2f_GrVertexAttribType 101 3*sizeof(float), // kVec3f_GrVertexAttribType 102 4*sizeof(float), // kVec4f_GrVertexAttribType 103 4*sizeof(char) // kVec4ub_GrVertexAttribType 104 }; 105 return kSizes[type]; 106 107 GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); 108 GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); 109 GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); 110 GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); 111 GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); 112 GR_STATIC_ASSERT(GR_ARRAY_COUNT(kSizes) == kGrVertexAttribTypeCount); 113 } 114 115 /** 116 * Semantic bindings for vertex attributes. kEffect means that the attribute is input to a GrEffect. 117 * Each binding other than kEffect may not appear more than once in the current set of attributes. 118 * kPosition must be appear for exactly one attribute. 119 */ 120 enum GrVertexAttribBinding { 121 kPosition_GrVertexAttribBinding, // required, must have vector count of 2 122 kLocalCoord_GrVertexAttribBinding, // must have vector count of 2 123 kColor_GrVertexAttribBinding, // must have vector count of 4 124 kCoverage_GrVertexAttribBinding, // must have vector count of 4 125 126 kLastFixedFunction_GrVertexAttribBinding = kCoverage_GrVertexAttribBinding, 127 128 kEffect_GrVertexAttribBinding, // vector length must agree with 129 // GrEffect::vertexAttribType() for each effect input to 130 // which the attribute is mapped by GrDrawState::setEffect() 131 kLast_GrVertexAttribBinding = kEffect_GrVertexAttribBinding 132 }; 133 134 static const int kGrVertexAttribBindingCnt = kLast_GrVertexAttribBinding + 1; 135 static const int kGrFixedFunctionVertexAttribBindingCnt = 136 kLastFixedFunction_GrVertexAttribBinding + 1; 137 138 static inline int GrFixedFunctionVertexAttribVectorCount(GrVertexAttribBinding binding) { 139 GrAssert(binding >= 0 && binding < kGrFixedFunctionVertexAttribBindingCnt); 140 static const int kVecCounts[] = { 2, 2, 4, 4 }; 141 142 return kVecCounts[binding]; 143 144 GR_STATIC_ASSERT(0 == kPosition_GrVertexAttribBinding); 145 GR_STATIC_ASSERT(1 == kLocalCoord_GrVertexAttribBinding); 146 GR_STATIC_ASSERT(2 == kColor_GrVertexAttribBinding); 147 GR_STATIC_ASSERT(3 == kCoverage_GrVertexAttribBinding); 148 GR_STATIC_ASSERT(kGrFixedFunctionVertexAttribBindingCnt == SK_ARRAY_COUNT(kVecCounts)); 149 } 150 151 struct GrVertexAttrib { 152 inline void set(GrVertexAttribType type, size_t offset, GrVertexAttribBinding binding) { 153 fType = type; 154 fOffset = offset; 155 fBinding = binding; 156 } 157 bool operator==(const GrVertexAttrib& other) const { 158 return fType == other.fType && fOffset == other.fOffset && fBinding == other.fBinding; 159 }; 160 bool operator!=(const GrVertexAttrib& other) const { return !(*this == other); } 161 162 GrVertexAttribType fType; 163 size_t fOffset; 164 GrVertexAttribBinding fBinding; 165 }; 166 167 template <int N> class GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {}; 168 169 #endif 170