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
12static 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
24void 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
38void 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