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