| 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
|
|
|