blob: e938c36d010fd917156ffd4eab9e64fc8a1ce39c [file] [log] [blame]
Brian Salomon99938a82016-11-21 13:41:08 -05001/*
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"
Brian Salomon94efbf52016-11-29 13:43:05 -050010#include "GrShaderCaps.h"
Brian Salomon99938a82016-11-21 13:41:08 -050011
Brian Salomonf9f45122016-11-29 11:59:17 -050012static 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
24void 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
44void 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
58void 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
69void 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
Brian Salomon1edc5b92016-11-29 13:43:46 -050083void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const {
Brian Salomon99938a82016-11-21 13:41:08 -050084 SkASSERT(kDefault_GrSLPrecision == fPrecision || GrSLTypeAcceptsPrecision(fType));
Brian Salomonf9f45122016-11-29 11:59:17 -050085 SkString layout = fLayoutQualifier;
Brian Salomon99938a82016-11-21 13:41:08 -050086 if (!fLayoutQualifier.isEmpty()) {
87 out->appendf("layout(%s) ", fLayoutQualifier.c_str());
88 }
89 out->append(fExtraModifiers);
90 if (this->getTypeModifier() != kNone_TypeModifier) {
Brian Salomonf9f45122016-11-29 11:59:17 -050091 out->append(type_modifier_string(this->getTypeModifier()));
Brian Salomon99938a82016-11-21 13:41:08 -050092 out->append(" ");
93 }
94 GrSLType effectiveType = this->getType();
Brian Salomon1edc5b92016-11-29 13:43:46 -050095 if (shaderCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) {
Brian Salomon99938a82016-11-21 13:41:08 -050096 // 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}