blob: 61cd3c920756068342c392779037e400448579bb [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 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040020 SK_ABORT("Unknown shader variable type modifier.");
Brian Salomonf9f45122016-11-29 11:59:17 -050021 return "";
22}
23
Brian Salomonf9f45122016-11-29 11:59:17 -050024void 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 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040035 SK_ABORT("Unknown io type.");
Brian Salomonf9f45122016-11-29 11:59:17 -050036}
37
Brian Salomon23c55b62018-06-19 16:28:41 -040038// Converts a GrSLPrecision to its corresponding GLSL precision qualifier. TODO: Remove this as we
39// shouldn't need it with SkSL.
40static inline const char* glsl_precision_string(GrSLPrecision p) {
41 switch (p) {
42 case kLow_GrSLPrecision:
43 return "lowp";
44 case kMedium_GrSLPrecision:
45 return "mediump";
46 case kHigh_GrSLPrecision:
47 return "highp";
48 case kDefault_GrSLPrecision:
49 return "";
50 }
51 SK_ABORT("Unexpected precision type.");
52 return "";
53}
54
Brian Salomon1edc5b92016-11-29 13:43:46 -050055void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const {
Ethan Nicholasf7b88202017-09-18 14:10:39 -040056 SkASSERT(kDefault_GrSLPrecision == fPrecision || GrSLTypeTemporarilyAcceptsPrecision(fType));
Brian Salomonf9f45122016-11-29 11:59:17 -050057 SkString layout = fLayoutQualifier;
Brian Salomon99938a82016-11-21 13:41:08 -050058 if (!fLayoutQualifier.isEmpty()) {
59 out->appendf("layout(%s) ", fLayoutQualifier.c_str());
60 }
61 out->append(fExtraModifiers);
62 if (this->getTypeModifier() != kNone_TypeModifier) {
Brian Salomonf9f45122016-11-29 11:59:17 -050063 out->append(type_modifier_string(this->getTypeModifier()));
Brian Salomon99938a82016-11-21 13:41:08 -050064 out->append(" ");
65 }
66 GrSLType effectiveType = this->getType();
Brian Salomon1edc5b92016-11-29 13:43:46 -050067 if (shaderCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) {
Brian Salomon99938a82016-11-21 13:41:08 -050068 // Desktop GLSL has added precision qualifiers but they don't do anything.
Brian Salomon23c55b62018-06-19 16:28:41 -040069 out->appendf("%s ", glsl_precision_string(fPrecision));
Brian Salomon99938a82016-11-21 13:41:08 -050070 }
71 if (this->isArray()) {
72 if (this->isUnsizedArray()) {
73 out->appendf("%s %s[]",
Robert Phillips8296e752017-08-25 08:45:21 -040074 GrGLSLTypeString(shaderCaps, effectiveType),
Brian Salomon99938a82016-11-21 13:41:08 -050075 this->getName().c_str());
76 } else {
77 SkASSERT(this->getArrayCount() > 0);
78 out->appendf("%s %s[%d]",
Robert Phillips8296e752017-08-25 08:45:21 -040079 GrGLSLTypeString(shaderCaps, effectiveType),
Brian Salomon99938a82016-11-21 13:41:08 -050080 this->getName().c_str(),
81 this->getArrayCount());
82 }
83 } else {
84 out->appendf("%s %s",
Robert Phillips8296e752017-08-25 08:45:21 -040085 GrGLSLTypeString(shaderCaps, effectiveType),
Brian Salomon99938a82016-11-21 13:41:08 -050086 this->getName().c_str());
87 }
88}