1096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/* 2096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Copyright 2013 Google Inc. 3096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * 4096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger * found in the LICENSE file. 6096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 7096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 8096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#ifndef GrTypesPriv_DEFINED 9096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define GrTypesPriv_DEFINED 10096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "GrTypes.h" 127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkTArray.h" 137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 14096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger/** 157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Types of shader-language-specific boxed variables we can create. (Currently only GrGLShaderVars, 167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * but should be applicable to other shader languages.) 17096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger */ 18096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenbergerenum GrSLType { 19096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kVoid_GrSLType, 20096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kFloat_GrSLType, 21096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kVec2f_GrSLType, 22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kVec3f_GrSLType, 23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kVec4f_GrSLType, 24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kMat33f_GrSLType, 25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger kMat44f_GrSLType, 267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kSampler2D_GrSLType, 277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLast_GrSLType = kSampler2D_GrSLType 297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}; 307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic const int kGrSLTypeCount = kLast_GrSLType + 1; 317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 327839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** 337839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Gets the vector size of the SLType. Returns -1 for void, matrices, and samplers. 347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic inline int GrSLTypeVectorCount(GrSLType type) { 360a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount)); 377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kCounts[] = { -1, 1, 2, 3, 4, -1, -1, -1 }; 387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return kCounts[type]; 397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(0 == kVoid_GrSLType); 417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(1 == kFloat_GrSLType); 427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(2 == kVec2f_GrSLType); 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(3 == kVec3f_GrSLType); 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(4 == kVec4f_GrSLType); 457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(5 == kMat33f_GrSLType); 467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(6 == kMat44f_GrSLType); 477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(7 == kSampler2D_GrSLType); 487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrSLTypeCount); 497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** Return the type enum for a vector of floats of length n (1..4), 527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */ 537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic inline GrSLType GrSLFloatVectorType(int count) { 540a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(count > 0 && count <= 4); 557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return (GrSLType)(count); 567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(kFloat_GrSLType == 1); 587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(kVec2f_GrSLType == 2); 597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(kVec3f_GrSLType == 3); 607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(kVec4f_GrSLType == 4); 617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Types used to describe format of vertices in arrays. 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerenum GrVertexAttribType { 677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kFloat_GrVertexAttribType = 0, 687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kVec2f_GrVertexAttribType, 697839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kVec3f_GrVertexAttribType, 707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kVec4f_GrVertexAttribType, 717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kVec4ub_GrVertexAttribType, // vector of 4 unsigned bytes, e.g. colors 727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLast_GrVertexAttribType = kVec4ub_GrVertexAttribType 747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}; 757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1; 767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 777839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** 787839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Returns the vector size of the type. 797839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 807839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic inline int GrVertexAttribTypeVectorCount(GrVertexAttribType type) { 810a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount); 827839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kCounts[] = { 1, 2, 3, 4, 4 }; 837839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return kCounts[type]; 847839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 857839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); 867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); 877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); 887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); 897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); 907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(GR_ARRAY_COUNT(kCounts) == kGrVertexAttribTypeCount); 917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** 947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Returns the size of the attrib type in bytes. 957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) { 970a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount); 987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const size_t kSizes[] = { 997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger sizeof(float), // kFloat_GrVertexAttribType 1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 2*sizeof(float), // kVec2f_GrVertexAttribType 1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 3*sizeof(float), // kVec3f_GrVertexAttribType 1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 4*sizeof(float), // kVec4f_GrVertexAttribType 1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 4*sizeof(char) // kVec4ub_GrVertexAttribType 1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return kSizes[type]; 1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType); 1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType); 1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType); 1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType); 1117839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(4 == kVec4ub_GrVertexAttribType); 1127839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(GR_ARRAY_COUNT(kSizes) == kGrVertexAttribTypeCount); 1137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 1147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1157839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger/** 1167839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Semantic bindings for vertex attributes. kEffect means that the attribute is input to a GrEffect. 1177839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * Each binding other than kEffect may not appear more than once in the current set of attributes. 1187839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger * kPosition must be appear for exactly one attribute. 1197839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger */ 1207839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerenum GrVertexAttribBinding { 1217839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kPosition_GrVertexAttribBinding, // required, must have vector count of 2 1227839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLocalCoord_GrVertexAttribBinding, // must have vector count of 2 1237839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kColor_GrVertexAttribBinding, // must have vector count of 4 1247839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kCoverage_GrVertexAttribBinding, // must have vector count of 4 1257839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1267839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLastFixedFunction_GrVertexAttribBinding = kCoverage_GrVertexAttribBinding, 1277839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1287839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kEffect_GrVertexAttribBinding, // vector length must agree with 1297839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // GrEffect::vertexAttribType() for each effect input to 1307839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger // which the attribute is mapped by GrDrawState::setEffect() 1317839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLast_GrVertexAttribBinding = kEffect_GrVertexAttribBinding 132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger}; 133096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger 1347839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic const int kGrVertexAttribBindingCnt = kLast_GrVertexAttribBinding + 1; 1357839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic const int kGrFixedFunctionVertexAttribBindingCnt = 1367839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger kLastFixedFunction_GrVertexAttribBinding + 1; 1377839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1387839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstatic inline int GrFixedFunctionVertexAttribVectorCount(GrVertexAttribBinding binding) { 1390a657bbc2c6fc9daf699942e023050536d5ec95fDerek Sollenberger SkASSERT(binding >= 0 && binding < kGrFixedFunctionVertexAttribBindingCnt); 1407839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger static const int kVecCounts[] = { 2, 2, 4, 4 }; 1417839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1427839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return kVecCounts[binding]; 1437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(0 == kPosition_GrVertexAttribBinding); 1457839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(1 == kLocalCoord_GrVertexAttribBinding); 1467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(2 == kColor_GrVertexAttribBinding); 1477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(3 == kCoverage_GrVertexAttribBinding); 1487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GR_STATIC_ASSERT(kGrFixedFunctionVertexAttribBindingCnt == SK_ARRAY_COUNT(kVecCounts)); 1497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger} 1507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergerstruct GrVertexAttrib { 1527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger inline void set(GrVertexAttribType type, size_t offset, GrVertexAttribBinding binding) { 1537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fType = type; 1547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fOffset = offset; 1557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger fBinding = binding; 1567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger } 1577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool operator==(const GrVertexAttrib& other) const { 1587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger return fType == other.fType && fOffset == other.fOffset && fBinding == other.fBinding; 1597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger }; 1607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool operator!=(const GrVertexAttrib& other) const { return !(*this == other); } 1617839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1627839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrVertexAttribType fType; 1637839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger size_t fOffset; 1647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrVertexAttribBinding fBinding; 1657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger}; 1667839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenbergertemplate <int N> class GrVertexAttribArray : public SkSTArray<N, GrVertexAttrib, true> {}; 1687839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 169096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#endif 170