Home | History | Annotate | Download | only in gpu
      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