blob: f67a03aa9320e1d1f33f2e69a03ae14d59fb6380 [file] [log] [blame]
alokp@chromium.org8b851c62012-06-15 16:25:11 +00001//
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +00002// Copyright (c) 2012-2013 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org8b851c62012-06-15 16:25:11 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/DirectiveHandler.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +00008
9#include <sstream>
10
Geoff Lang17732822013-08-29 13:46:49 -040011#include "compiler/translator/compilerdebug.h"
12#include "compiler/translator/Diagnostics.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +000013
14static TBehavior getBehavior(const std::string& str)
15{
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070016 const char kRequire[] = "require";
17 const char kEnable[] = "enable";
18 const char kDisable[] = "disable";
19 const char kWarn[] = "warn";
alokp@chromium.org8b851c62012-06-15 16:25:11 +000020
21 if (str == kRequire) return EBhRequire;
22 else if (str == kEnable) return EBhEnable;
23 else if (str == kDisable) return EBhDisable;
24 else if (str == kWarn) return EBhWarn;
25 return EBhUndefined;
26}
27
28TDirectiveHandler::TDirectiveHandler(TExtensionBehavior& extBehavior,
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +000029 TDiagnostics& diagnostics,
30 int& shaderVersion)
alokp@chromium.org73bc2982012-06-19 18:48:05 +000031 : mExtensionBehavior(extBehavior),
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +000032 mDiagnostics(diagnostics),
33 mShaderVersion(shaderVersion)
alokp@chromium.org8b851c62012-06-15 16:25:11 +000034{
35}
36
37TDirectiveHandler::~TDirectiveHandler()
38{
39}
40
41void TDirectiveHandler::handleError(const pp::SourceLocation& loc,
42 const std::string& msg)
43{
Shannon Woods7f2d7942013-11-19 15:07:58 -050044 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc, msg, "", "");
alokp@chromium.org8b851c62012-06-15 16:25:11 +000045}
46
47void TDirectiveHandler::handlePragma(const pp::SourceLocation& loc,
48 const std::string& name,
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070049 const std::string& value,
50 bool stdgl)
alokp@chromium.org8b851c62012-06-15 16:25:11 +000051{
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070052 if (stdgl)
53 {
54 const char kInvariant[] = "invariant";
55 const char kAll[] = "all";
alokp@chromium.org8b851c62012-06-15 16:25:11 +000056
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070057 if (name == kInvariant && value == kAll)
58 mPragma.stdgl.invariantAll = true;
alokp@chromium.org8b851c62012-06-15 16:25:11 +000059 // The STDGL pragma is used to reserve pragmas for use by future
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070060 // revisions of GLSL. Do not generate an error on unexpected
61 // name and value.
alokp@chromium.org8b851c62012-06-15 16:25:11 +000062 return;
63 }
alokp@chromium.org8b851c62012-06-15 16:25:11 +000064 else
65 {
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070066 const char kOptimize[] = "optimize";
67 const char kDebug[] = "debug";
68 const char kOn[] = "on";
69 const char kOff[] = "off";
alokp@chromium.org8b851c62012-06-15 16:25:11 +000070
Zhenyao Mo94ac7b72014-10-15 18:22:08 -070071 bool invalidValue = false;
72 if (name == kOptimize)
73 {
74 if (value == kOn) mPragma.optimize = true;
75 else if (value == kOff) mPragma.optimize = false;
76 else invalidValue = true;
77 }
78 else if (name == kDebug)
79 {
80 if (value == kOn) mPragma.debug = true;
81 else if (value == kOff) mPragma.debug = false;
82 else invalidValue = true;
83 }
84 else
85 {
86 mDiagnostics.report(pp::Diagnostics::PP_UNRECOGNIZED_PRAGMA, loc, name);
87 return;
88 }
89
90 if (invalidValue)
91 {
92 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
93 "invalid pragma value", value,
94 "'on' or 'off' expected");
95 }
96 }
alokp@chromium.org8b851c62012-06-15 16:25:11 +000097}
98
99void TDirectiveHandler::handleExtension(const pp::SourceLocation& loc,
100 const std::string& name,
101 const std::string& behavior)
102{
Zhenyao Mo94ac7b72014-10-15 18:22:08 -0700103 const char kExtAll[] = "all";
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000104
105 TBehavior behaviorVal = getBehavior(behavior);
106 if (behaviorVal == EBhUndefined)
107 {
Shannon Woods7f2d7942013-11-19 15:07:58 -0500108 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000109 "behavior", name, "invalid");
110 return;
111 }
112
113 if (name == kExtAll)
114 {
115 if (behaviorVal == EBhRequire)
116 {
Shannon Woods7f2d7942013-11-19 15:07:58 -0500117 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000118 "extension", name,
119 "cannot have 'require' behavior");
120 }
121 else if (behaviorVal == EBhEnable)
122 {
Shannon Woods7f2d7942013-11-19 15:07:58 -0500123 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000124 "extension", name,
125 "cannot have 'enable' behavior");
126 }
127 else
128 {
alokp@chromium.org73bc2982012-06-19 18:48:05 +0000129 for (TExtensionBehavior::iterator iter = mExtensionBehavior.begin();
130 iter != mExtensionBehavior.end(); ++iter)
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000131 iter->second = behaviorVal;
132 }
133 return;
134 }
135
alokp@chromium.org73bc2982012-06-19 18:48:05 +0000136 TExtensionBehavior::iterator iter = mExtensionBehavior.find(name);
137 if (iter != mExtensionBehavior.end())
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000138 {
139 iter->second = behaviorVal;
140 return;
141 }
142
Shannon Woods7f2d7942013-11-19 15:07:58 -0500143 pp::Diagnostics::Severity severity = pp::Diagnostics::PP_ERROR;
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000144 switch (behaviorVal) {
145 case EBhRequire:
Shannon Woods7f2d7942013-11-19 15:07:58 -0500146 severity = pp::Diagnostics::PP_ERROR;
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000147 break;
148 case EBhEnable:
149 case EBhWarn:
150 case EBhDisable:
Shannon Woods7f2d7942013-11-19 15:07:58 -0500151 severity = pp::Diagnostics::PP_WARNING;
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000152 break;
153 default:
154 UNREACHABLE();
155 break;
156 }
157 mDiagnostics.writeInfo(severity, loc,
158 "extension", name, "is not supported");
159}
160
161void TDirectiveHandler::handleVersion(const pp::SourceLocation& loc,
162 int version)
163{
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000164 if (version == 100 ||
165 version == 300)
166 {
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +0000167 mShaderVersion = version;
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000168 }
169 else
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000170 {
171 std::stringstream stream;
172 stream << version;
173 std::string str = stream.str();
Shannon Woods7f2d7942013-11-19 15:07:58 -0500174 mDiagnostics.writeInfo(pp::Diagnostics::PP_ERROR, loc,
alokp@chromium.org8b851c62012-06-15 16:25:11 +0000175 "version number", str, "not supported");
176 }
177}