Hash :
dc1c1cb5
Author :
Date :
2020-08-12T13:30:26
Restrict to translate uniform block to StructuredBuffer We had translated an uniform block only containing a large array member into StructuredBuffer instead of cbuffer on D3D backend for slow fxc compile performance issue with dynamic uniform indexing. Now we add more conditions to restrict the translation. Only indexing operator is allowed to operate on this uniform block variable. And we also restrict the types of uniform block's member. Bug: angleproject:3682 Change-Id: I992b7890d84fcaa6169722af6d7e14785526d48a Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2351728 Commit-Queue: Xinghua Cao <xinghua.cao@intel.com> Reviewed-by: Geoff Lang <geofflang@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jiajia Qin <jiajia.qin@intel.com>
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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
//
// Copyright 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:
// HLSL translation of GLSL constructors and 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, bool forcePadding);
TString prePaddingString(const TType &type, bool forcePadding);
TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking, bool forcePadding);
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.
TString addStructConstructor(const TStructure &structure);
TString addBuiltInConstructor(const TType &type, const TIntermSequence *parameters);
static TString defineNameless(const TStructure &structure);
void ensureStructDefined(const TStructure &structure);
std::string structsHeader() const;
Std140PaddingHelper getPaddingHelper();
private:
unsigned mUniquePaddingCounter;
std::map<TString, int> mStd140StructElementIndexes;
struct TStructProperties : public angle::NonCopyable
{
POOL_ALLOCATOR_NEW_DELETE
TStructProperties() {}
// Constructor is an empty string in case the struct doesn't have a constructor yet.
TString constructor;
};
// Map from struct name to struct properties.
typedef std::map<TString, TStructProperties *> DefinedStructs;
DefinedStructs mDefinedStructs;
// Struct declarations need to be kept in a vector instead of having them inside mDefinedStructs
// since maintaining the original order is necessary for nested structs.
typedef std::vector<TString> StructDeclarations;
StructDeclarations mStructDeclarations;
typedef std::set<TString> BuiltInConstructors;
BuiltInConstructors mBuiltInConstructors;
void storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking);
TString defineQualified(const TStructure &structure,
bool useHLSLRowMajorPacking,
bool useStd140Packing,
bool forcePackingEnd);
DefinedStructs::iterator defineVariants(const TStructure &structure, const TString &name);
};
} // namespace sh
#endif // COMPILER_TRANSLATOR_STRUCTUREHLSL_H_