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
type_modifier_string(GrShaderVar::TypeModifier t)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
setIOType(GrIOType ioType)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
appendDecl(const GrShaderCaps * shaderCaps,SkString * out) const38 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