1 /* 2 * Copyright 2016 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 9 #include "GrShaderVar.h" 10 #include "GrShaderCaps.h" 11 12 static const char* type_modifier_string(GrShaderVar::TypeModifier t) { 13 switch (t) { 14 case GrShaderVar::kNone_TypeModifier: return ""; 15 case GrShaderVar::kIn_TypeModifier: return "in"; 16 case GrShaderVar::kInOut_TypeModifier: return "inout"; 17 case GrShaderVar::kOut_TypeModifier: return "out"; 18 case GrShaderVar::kUniform_TypeModifier: return "uniform"; 19 } 20 SK_ABORT("Unknown shader variable type modifier."); 21 return ""; 22 } 23 24 void GrShaderVar::setIOType(GrIOType ioType) { 25 switch (ioType) { 26 case kRW_GrIOType: 27 return; 28 case kRead_GrIOType: 29 this->addModifier("readonly"); 30 return; 31 case kWrite_GrIOType: 32 this->addModifier("writeonly"); 33 return; 34 } 35 SK_ABORT("Unknown io type."); 36 } 37 38 void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const { 39 SkASSERT(kDefault_GrSLPrecision == fPrecision || GrSLTypeTemporarilyAcceptsPrecision(fType)); 40 SkString layout = fLayoutQualifier; 41 if (!fLayoutQualifier.isEmpty()) { 42 out->appendf("layout(%s) ", fLayoutQualifier.c_str()); 43 } 44 out->append(fExtraModifiers); 45 if (this->getTypeModifier() != kNone_TypeModifier) { 46 out->append(type_modifier_string(this->getTypeModifier())); 47 out->append(" "); 48 } 49 GrSLType effectiveType = this->getType(); 50 if (shaderCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) { 51 // Desktop GLSL has added precision qualifiers but they don't do anything. 52 out->appendf("%s ", GrGLSLPrecisionString(fPrecision)); 53 } 54 if (this->isArray()) { 55 if (this->isUnsizedArray()) { 56 out->appendf("%s %s[]", 57 GrGLSLTypeString(shaderCaps, effectiveType), 58 this->getName().c_str()); 59 } else { 60 SkASSERT(this->getArrayCount() > 0); 61 out->appendf("%s %s[%d]", 62 GrGLSLTypeString(shaderCaps, effectiveType), 63 this->getName().c_str(), 64 this->getArrayCount()); 65 } 66 } else { 67 out->appendf("%s %s", 68 GrGLSLTypeString(shaderCaps, effectiveType), 69 this->getName().c_str()); 70 } 71 } 72