Index: include/gpu/GrTypesPriv.h |
=================================================================== |
--- include/gpu/GrTypesPriv.h (revision 8462) |
+++ include/gpu/GrTypesPriv.h (working copy) |
@@ -8,12 +8,12 @@ |
#ifndef GrTypesPriv_DEFINED |
#define GrTypesPriv_DEFINED |
+#include "GrTypes.h" |
#include "SkTArray.h" |
/** |
- * Types of shader-language-specific boxed variables we can create. |
- * (Currently only GrGLShaderVars, but should be applicable to other shader |
- * languages.) |
+ * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars, |
+ * but should be applicable to other shader languages.) |
*/ |
enum GrSLType { |
kVoid_GrSLType, |
@@ -23,11 +23,43 @@ |
kVec4f_GrSLType, |
kMat33f_GrSLType, |
kMat44f_GrSLType, |
- kSampler2D_GrSLType |
+ kSampler2D_GrSLType, |
+ |
+ kLast_GrSLType = kSampler2D_GrSLType |
}; |
+static const int kGrSLTypeCount = kLast_GrSLType + 1; |
/** |
- * Types used to describe format of vertices in arrays |
+ * Gets the vector size of the SLType. Returns -1 for void, matrices, and samplers. |
+ */ |
+static inline int GrSLTypeVectorCount(GrSLType type) { |
+ GrAssert(type >= 0 && type < kGrSLTypeCount); |
+ static const int kCounts[] = { -1, 1, 2, 3, 4, -1, -1, -1 }; |
+ return kCounts[type]; |
+ |
+ GR_STATIC_ASSERT(0 == kVoid_GrSLType); |
+ GR_STATIC_ASSERT(1 == kFloat_GrSLType); |
+ GR_STATIC_ASSERT(2 == kVec2f_GrSLType); |
+ GR_STATIC_ASSERT(3 == kVec3f_GrSLType); |
+ GR_STATIC_ASSERT(4 == kVec4f_GrSLType); |
+ GR_STATIC_ASSERT(5 == kMat33f_GrSLType); |
+ GR_STATIC_ASSERT(6 == kMat44f_GrSLType); |
+ GR_STATIC_ASSERT(7 == kSampler2D_GrSLType); |
+ GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrSLTypeCount); |
+} |
+ |
+static inline GrSLType GrSLFloatVectorType(int count) { |
+ GrAssert(count > 0 && count <= 4); |
+ return (GrSLType)(count); |
+ |
+ GR_STATIC_ASSERT(kFloat_GrSLType == 1); |
+ GR_STATIC_ASSERT(kVec2f_GrSLType == 2); |
+ GR_STATIC_ASSERT(kVec3f_GrSLType == 3); |
+ GR_STATIC_ASSERT(kVec4f_GrSLType == 4); |
+} |
+ |
+/** |
+ * Types used to describe format of vertices in arrays. |
*/ |
enum GrVertexAttribType { |
kFloat_GrVertexAttribType = 0, |
@@ -40,20 +72,96 @@ |
}; |
static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1; |
+/** |
+ * Returns the vector size of the type. |
+ */ |
+static inline int GrVertexAttribTypeVectorCount(GrVertexAttribType type) { |
+ GrAssert(type >= 0 && type < kGrVertexAttribTypeCount); |
+ static const int kCounts[] = { 1, 2, 3, 4, 4 }; |
+ return kCounts[type]; |
+ |
+ GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); |
+ GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); |
+ GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrVertexAttribTypeCount); |
+} |
+ |
+/** |
+ * Returns the size of the attrib type in bytes. |
+ */ |
+static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) { |
+ GrAssert(type >= 0 && type < kGrVertexAttribTypeCount); |
+ static const size_t kSizes[] = { |
+ sizeof(float), // kFloat_GrVertexAttribType |
+ 2*sizeof(float), // kVec2f_GrVertexAttribType |
+ 3*sizeof(float), // kVec3f_GrVertexAttribType |
+ 4*sizeof(float), // kVec4f_GrVertexAttribType |
+ 4*sizeof(char) // kVec4ub_GrVertexAttribType |
+ }; |
+ return kSizes[type]; |
+ |
+ GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); |
+ GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); |
+ GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); |
+ GR_STATIC_ASSERT(GR_ARRAY_COUNT(kSizes) == kGrVertexAttribTypeCount); |
+} |
+ |
+/** |
+ * Semantic bindings for vertex attributes. kEffect means that the attribute is input to a GrEffect. |
+ * Each binding other than kEffect may not appear more than once in the current set of attributes. |
+ * kPosition must be appear for exactly one attribute. |
+ */ |
+enum GrVertexAttribBinding { |
+ kPosition_GrVertexAttribBinding, // required, must have vector count of 2 |
+ kLocalCoord_GrVertexAttribBinding, // must have vector count of 2 |
+ kColor_GrVertexAttribBinding, // must have vector count of 4 |
+ kCoverage_GrVertexAttribBinding, // must have vector count of 4 |
+ |
+ kLastFixedFunction_GrVertexAttribBinding = kCoverage_GrVertexAttribBinding, |
+ |
+ kEffect_GrVertexAttribBinding, // vector length must agree with |
+ // GrEffect::vertexAttribType() for each effect input to |
+ // which the attribute is mapped by GrDrawState::setEffect() |
+ kLast_GrVertexAttribBinding = kEffect_GrVertexAttribBinding |
+}; |
+ |
+static const int kGrVertexAttribBindingCnt = kLast_GrVertexAttribBinding + 1; |
+static const int kGrFixedFunctionVertexAttribBindingCnt = |
+ kLastFixedFunction_GrVertexAttribBinding + 1; |
+ |
+static const int GrFixedFunctionVertexAttribVectorCount(GrVertexAttribBinding binding) { |
+ GrAssert(binding >= 0 && binding < kGrFixedFunctionVertexAttribBindingCnt); |
+ static const int kVecCounts[] = { 2, 2, 4, 4 }; |
+ |
+ return kVecCounts[binding]; |
+ |
+ GR_STATIC_ASSERT(0 == kPosition_GrVertexAttribBinding); |
+ GR_STATIC_ASSERT(1 == kLocalCoord_GrVertexAttribBinding); |
+ GR_STATIC_ASSERT(2 == kColor_GrVertexAttribBinding); |
+ GR_STATIC_ASSERT(3 == kCoverage_GrVertexAttribBinding); |
+ GR_STATIC_ASSERT(kGrFixedFunctionVertexAttribBindingCnt == SK_ARRAY_COUNT(kVecCounts)); |
+} |
+ |
struct GrVertexAttrib { |
- inline void set(GrVertexAttribType type, size_t offset) { |
- fType = type; fOffset = offset; |
+ inline void set(GrVertexAttribType type, size_t offset, GrVertexAttribBinding binding) { |
+ fType = type; |
+ fOffset = offset; |
+ fBinding = binding; |
} |
bool operator==(const GrVertexAttrib& other) const { |
- return fType == other.fType && fOffset == other.fOffset; |
+ return fType == other.fType && fOffset == other.fOffset && fBinding == other.fBinding; |
}; |
bool operator!=(const GrVertexAttrib& other) const { return !(*this == other); } |
- GrVertexAttribType fType; |
- size_t fOffset; |
+ GrVertexAttribType fType; |
+ size_t fOffset; |
+ GrVertexAttribBinding fBinding; |
}; |
-template <int N> |
-class GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {}; |
+template <int N> class GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {}; |
#endif |