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 SkFAIL("Unknown shader variable type modifier."); 21 return ""; 22 } 23 24 void GrShaderVar::setImageStorageFormat(GrImageStorageFormat format) { 25 const char* formatStr = nullptr; 26 switch (format) { 27 case GrImageStorageFormat::kRGBA8: 28 formatStr = "rgba8"; 29 break; 30 case GrImageStorageFormat::kRGBA8i: 31 formatStr = "rgba8i"; 32 break; 33 case GrImageStorageFormat::kRGBA16f: 34 formatStr = "rgba16f"; 35 break; 36 case GrImageStorageFormat::kRGBA32f: 37 formatStr = "rgba32f"; 38 break; 39 } 40 this->addLayoutQualifier(formatStr); 41 SkASSERT(formatStr); 42 } 43 44 void GrShaderVar::setMemoryModel(GrSLMemoryModel model) { 45 switch (model) { 46 case GrSLMemoryModel::kNone: 47 return; 48 case GrSLMemoryModel::kCoherent: 49 this->addModifier("coherent"); 50 return; 51 case GrSLMemoryModel::kVolatile: 52 this->addModifier("volatile"); 53 return; 54 } 55 SkFAIL("Unknown memory model."); 56 } 57 58 void GrShaderVar::setRestrict(GrSLRestrict restrict) { 59 switch (restrict) { 60 case GrSLRestrict::kNo: 61 return; 62 case GrSLRestrict::kYes: 63 this->addModifier("restrict"); 64 return; 65 } 66 SkFAIL("Unknown restrict."); 67 } 68 69 void GrShaderVar::setIOType(GrIOType ioType) { 70 switch (ioType) { 71 case kRW_GrIOType: 72 return; 73 case kRead_GrIOType: 74 this->addModifier("readonly"); 75 return; 76 case kWrite_GrIOType: 77 this->addModifier("writeonly"); 78 return; 79 } 80 SkFAIL("Unknown io type."); 81 } 82 83 void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const { 84 SkASSERT(kDefault_GrSLPrecision == fPrecision || GrSLTypeAcceptsPrecision(fType)); 85 SkString layout = fLayoutQualifier; 86 if (!fLayoutQualifier.isEmpty()) { 87 out->appendf("layout(%s) ", fLayoutQualifier.c_str()); 88 } 89 out->append(fExtraModifiers); 90 if (this->getTypeModifier() != kNone_TypeModifier) { 91 out->append(type_modifier_string(this->getTypeModifier())); 92 out->append(" "); 93 } 94 GrSLType effectiveType = this->getType(); 95 if (shaderCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) { 96 // Desktop GLSL has added precision qualifiers but they don't do anything. 97 out->appendf("%s ", GrGLSLPrecisionString(fPrecision)); 98 } 99 if (this->isArray()) { 100 if (this->isUnsizedArray()) { 101 out->appendf("%s %s[]", 102 GrGLSLTypeString(effectiveType), 103 this->getName().c_str()); 104 } else { 105 SkASSERT(this->getArrayCount() > 0); 106 out->appendf("%s %s[%d]", 107 GrGLSLTypeString(effectiveType), 108 this->getName().c_str(), 109 this->getArrayCount()); 110 } 111 } else { 112 out->appendf("%s %s", 113 GrGLSLTypeString(effectiveType), 114 this->getName().c_str()); 115 } 116 } 117