/*
|
* Copyright 2016 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
|
#include "GrShaderVar.h"
|
#include "GrShaderCaps.h"
|
|
static const char* type_modifier_string(GrShaderVar::TypeModifier t) {
|
switch (t) {
|
case GrShaderVar::kNone_TypeModifier: return "";
|
case GrShaderVar::kIn_TypeModifier: return "in";
|
case GrShaderVar::kInOut_TypeModifier: return "inout";
|
case GrShaderVar::kOut_TypeModifier: return "out";
|
case GrShaderVar::kUniform_TypeModifier: return "uniform";
|
}
|
SK_ABORT("Unknown shader variable type modifier.");
|
return "";
|
}
|
|
void GrShaderVar::setIOType(GrIOType ioType) {
|
switch (ioType) {
|
case kRW_GrIOType:
|
return;
|
case kRead_GrIOType:
|
this->addModifier("readonly");
|
return;
|
case kWrite_GrIOType:
|
this->addModifier("writeonly");
|
return;
|
}
|
SK_ABORT("Unknown io type.");
|
}
|
|
// Converts a GrSLPrecision to its corresponding GLSL precision qualifier. TODO: Remove this as we
|
// shouldn't need it with SkSL.
|
static inline const char* glsl_precision_string(GrSLPrecision p) {
|
switch (p) {
|
case kLow_GrSLPrecision:
|
return "lowp";
|
case kMedium_GrSLPrecision:
|
return "mediump";
|
case kHigh_GrSLPrecision:
|
return "highp";
|
case kDefault_GrSLPrecision:
|
return "";
|
}
|
SK_ABORT("Unexpected precision type.");
|
return "";
|
}
|
|
void GrShaderVar::appendDecl(const GrShaderCaps* shaderCaps, SkString* out) const {
|
SkASSERT(kDefault_GrSLPrecision == fPrecision || GrSLTypeTemporarilyAcceptsPrecision(fType));
|
SkString layout = fLayoutQualifier;
|
if (!fLayoutQualifier.isEmpty()) {
|
out->appendf("layout(%s) ", fLayoutQualifier.c_str());
|
}
|
out->append(fExtraModifiers);
|
if (this->getTypeModifier() != kNone_TypeModifier) {
|
out->append(type_modifier_string(this->getTypeModifier()));
|
out->append(" ");
|
}
|
GrSLType effectiveType = this->getType();
|
if (shaderCaps->usesPrecisionModifiers() && GrSLTypeAcceptsPrecision(effectiveType)) {
|
// Desktop GLSL has added precision qualifiers but they don't do anything.
|
out->appendf("%s ", glsl_precision_string(fPrecision));
|
}
|
if (this->isArray()) {
|
if (this->isUnsizedArray()) {
|
out->appendf("%s %s[]",
|
GrGLSLTypeString(shaderCaps, effectiveType),
|
this->getName().c_str());
|
} else {
|
SkASSERT(this->getArrayCount() > 0);
|
out->appendf("%s %s[%d]",
|
GrGLSLTypeString(shaderCaps, effectiveType),
|
this->getName().c_str(),
|
this->getArrayCount());
|
}
|
} else {
|
out->appendf("%s %s",
|
GrGLSLTypeString(shaderCaps, effectiveType),
|
this->getName().c_str());
|
}
|
}
|