Hash :
570e04d8
Author :
Date :
2013-06-21T09:15:33
Add support for passing nested structs in standard layout by value. We add support for this by using global scratch values as storage for the structs in uniform blocks. Any structs in std140 layouts that are referenced by value are initialized in the shader scope, without any packing, so the type of the structs are equivalent with what a GLSL program would expect. TRAC #23327 Signed-off-by: Geoff Lang Signed-off-by: Shannon Woods Authored-by: Jamie Madill
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
//
// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
#ifndef COMPILER_FLAGSTD140STRUCTS_H_
#define COMPILER_FLAGSTD140STRUCTS_H_
#include "compiler/intermediate.h"
namespace sh
{
// This class finds references to nested structs of std140 blocks that access
// the nested struct "by value", where the padding added in the translator
// conflicts with the "natural" unpadded type.
class FlagStd140Structs : public TIntermTraverser
{
public:
const std::vector<TIntermTyped *> getFlaggedNodes() const { return mFlaggedNodes; }
protected:
virtual bool visitBinary(Visit visit, TIntermBinary *binaryNode);
virtual void visitSymbol(TIntermSymbol *symbol);
private:
bool isInStd140InterfaceBlock(TIntermTyped *node) const;
std::vector<TIntermTyped *> mFlaggedNodes;
};
std::vector<TIntermTyped *> FlagStd140ValueStructs(TIntermNode *node);
}
#endif // COMPILER_FLAGSTD140STRUCTS_H_