blob: b8c6d62555dfc5ba2f2475fb2023960bf57c225d [file] [log] [blame]
//
// Copyright (c) 2014 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.
//
// StructureHLSL.h:
// Interfaces of methods for HLSL translation of GLSL structures.
//
#ifndef COMPILER_TRANSLATOR_STRUCTUREHLSL_H_
#define COMPILER_TRANSLATOR_STRUCTUREHLSL_H_
#include "compiler/translator/Common.h"
#include "compiler/translator/IntermNode.h"
#include <set>
class TInfoSinkBase;
class TScopeBracket;
namespace sh
{
// This helper class assists structure and interface block definitions in determining
// how to pack std140 structs within HLSL's packing rules.
class Std140PaddingHelper
{
public:
explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
unsigned int *uniqueCounter);
Std140PaddingHelper(const Std140PaddingHelper &other);
Std140PaddingHelper &operator=(const Std140PaddingHelper &other);
int elementIndex() const { return mElementIndex; }
int prePadding(const TType &type);
TString prePaddingString(const TType &type);
TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking);
private:
TString next();
unsigned *mPaddingCounter;
int mElementIndex;
const std::map<TString, int> *mStructElementIndexes;
};
class StructureHLSL : angle::NonCopyable
{
public:
StructureHLSL();
// Returns the name of the constructor function. "name" parameter is the name of the type being
// constructed.
TString addConstructor(const TType &type,
const TString &name,
const TIntermSequence *parameters);
std::string structsHeader() const;
TString defineQualified(const TStructure &structure,
bool useHLSLRowMajorPacking,
bool useStd140Packing);
static TString defineNameless(const TStructure &structure);
Std140PaddingHelper getPaddingHelper();
private:
unsigned mUniquePaddingCounter;
std::map<TString, int> mStd140StructElementIndexes;
typedef std::set<TString> StructNames;
StructNames mStructNames;
typedef std::set<TString> Constructors;
Constructors mConstructors;
typedef std::vector<TString> StructDeclarations;
StructDeclarations mStructDeclarations;
void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking);
static TString define(const TStructure &structure,
bool useHLSLRowMajorPacking,
bool useStd140Packing,
Std140PaddingHelper *padHelper);
};
}
#endif // COMPILER_TRANSLATOR_STRUCTUREHLSL_H_