blob: bd9666fdd00ce65580fb2df3bc8c75eabc88cd0d [file] [log] [blame]
Qin Jiajia7835b522016-10-08 11:20:17 +08001//
2// Copyright 2016 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// UseInterfaceBlockFields.cpp: insert statements to reference all members in InterfaceBlock list at
8// the beginning of main. This is to work around a Mac driver that treats unused standard/shared
9// uniform blocks as inactive.
10
11#include "compiler/translator/UseInterfaceBlockFields.h"
12
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030013#include "compiler/translator/FindMain.h"
Qin Jiajia7835b522016-10-08 11:20:17 +080014#include "compiler/translator/IntermNode.h"
Olli Etuaho3ec75682017-07-05 17:02:55 +030015#include "compiler/translator/IntermNode_util.h"
Zhenyao Mod7490962016-11-09 15:49:51 -080016#include "compiler/translator/SymbolTable.h"
Qin Jiajia7835b522016-10-08 11:20:17 +080017#include "compiler/translator/util.h"
18
19namespace sh
20{
21
22namespace
23{
24
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030025void AddFieldUseStatements(const ShaderVariable &var,
26 TIntermSequence *sequence,
27 const TSymbolTable &symbolTable)
Qin Jiajia7835b522016-10-08 11:20:17 +080028{
29 TString name = TString(var.name.c_str());
Qin Jiajia7835b522016-10-08 11:20:17 +080030 if (var.isArray())
31 {
32 size_t pos = name.find_last_of('[');
33 if (pos != TString::npos)
34 {
35 name = name.substr(0, pos);
36 }
Zhenyao Mod7490962016-11-09 15:49:51 -080037 }
Olli Etuaho4cafb862017-07-05 14:05:06 +030038 TIntermSymbol *symbol = ReferToGlobalSymbol(name, symbolTable);
Zhenyao Mod7490962016-11-09 15:49:51 -080039 if (var.isArray())
40 {
Olli Etuaho4cafb862017-07-05 14:05:06 +030041 for (unsigned int i = 0u; i < var.arraySize; ++i)
Qin Jiajia7835b522016-10-08 11:20:17 +080042 {
Olli Etuaho4cafb862017-07-05 14:05:06 +030043 TIntermBinary *element =
44 new TIntermBinary(EOpIndexDirect, symbol->deepCopy(), CreateIndexNode(i));
Qin Jiajia7835b522016-10-08 11:20:17 +080045 sequence->insert(sequence->begin(), element);
46 }
47 }
48 else
49 {
Qin Jiajia7835b522016-10-08 11:20:17 +080050 sequence->insert(sequence->begin(), symbol);
51 }
52}
53
Olli Etuaho4cafb862017-07-05 14:05:06 +030054void InsertUseCode(const InterfaceBlock &block, TIntermTyped *blockNode, TIntermSequence *sequence)
55{
56 for (unsigned int i = 0; i < block.fields.size(); ++i)
57 {
58 TIntermBinary *element = new TIntermBinary(EOpIndexDirectInterfaceBlock,
59 blockNode->deepCopy(), CreateIndexNode(i));
60 sequence->insert(sequence->begin(), element);
61 }
62}
63
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030064void InsertUseCode(TIntermSequence *sequence,
65 const InterfaceBlockList &blocks,
66 const TSymbolTable &symbolTable)
Qin Jiajia7835b522016-10-08 11:20:17 +080067{
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030068 for (const auto &block : blocks)
Qin Jiajia7835b522016-10-08 11:20:17 +080069 {
70 if (block.instanceName.empty())
71 {
72 for (const auto &var : block.fields)
73 {
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030074 AddFieldUseStatements(var, sequence, symbolTable);
Qin Jiajia7835b522016-10-08 11:20:17 +080075 }
76 }
Olli Etuaho4cafb862017-07-05 14:05:06 +030077 else if (block.arraySize > 0u)
Qin Jiajia7835b522016-10-08 11:20:17 +080078 {
Olli Etuaho4cafb862017-07-05 14:05:06 +030079 TString name(block.instanceName.c_str());
80 TIntermSymbol *arraySymbol = ReferToGlobalSymbol(name, symbolTable);
81 for (unsigned int i = 0u; i < block.arraySize; ++i)
Qin Jiajia7835b522016-10-08 11:20:17 +080082 {
Olli Etuaho4cafb862017-07-05 14:05:06 +030083 TIntermBinary *elementSymbol =
84 new TIntermBinary(EOpIndexDirect, arraySymbol->deepCopy(), CreateIndexNode(i));
85 InsertUseCode(block, elementSymbol, sequence);
Qin Jiajia7835b522016-10-08 11:20:17 +080086 }
87 }
88 else
89 {
Olli Etuaho4cafb862017-07-05 14:05:06 +030090 TString name(block.instanceName.c_str());
91 TIntermSymbol *blockSymbol = ReferToGlobalSymbol(name, symbolTable);
92 InsertUseCode(block, blockSymbol, sequence);
Qin Jiajia7835b522016-10-08 11:20:17 +080093 }
94 }
95}
96
97} // namespace anonymous
98
Olli Etuaho9cbc07c2017-05-10 18:22:01 +030099void UseInterfaceBlockFields(TIntermBlock *root,
Zhenyao Mod7490962016-11-09 15:49:51 -0800100 const InterfaceBlockList &blocks,
101 const TSymbolTable &symbolTable)
Qin Jiajia7835b522016-10-08 11:20:17 +0800102{
Martin Radevb50ccd32017-07-06 17:09:58 +0300103 TIntermBlock *mainBody = FindMainBody(root);
Olli Etuaho9cbc07c2017-05-10 18:22:01 +0300104 InsertUseCode(mainBody->getSequence(), blocks, symbolTable);
Qin Jiajia7835b522016-10-08 11:20:17 +0800105}
106
107} // namespace sh