2
// Copyright 2015 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.
7
// Class which describes a mapping from varyings to registers in D3D
8
// for linking between shader stages.
11
#ifndef LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_
12
#define LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_
14
#include "libANGLE/renderer/d3d/RendererD3D.h"
18
class ProgramD3DMetadata;
22
PackedVarying(const sh::ShaderVariable &varyingIn, sh::InterpolationType interpolationIn)
23
: varying(&varyingIn), vertexOnly(false), interpolation(interpolationIn)
26
PackedVarying(const sh::ShaderVariable &varyingIn,
27
sh::InterpolationType interpolationIn,
28
const std::string &parentStructNameIn)
29
: varying(&varyingIn),
31
interpolation(interpolationIn),
32
parentStructName(parentStructNameIn)
36
bool isStructField() const { return !parentStructName.empty(); }
38
const sh::ShaderVariable *varying;
40
// Transform feedback varyings can be only referenced in the VS.
43
// Cached so we can store sh::ShaderVariable to point to varying fields.
44
sh::InterpolationType interpolation;
47
std::string parentStructName;
50
struct PackedVaryingRegister final
52
PackedVaryingRegister()
53
: packedVarying(nullptr),
61
PackedVaryingRegister(const PackedVaryingRegister &) = default;
62
PackedVaryingRegister &operator=(const PackedVaryingRegister &) = default;
64
bool operator<(const PackedVaryingRegister &other) const
66
return sortOrder() < other.sortOrder();
69
unsigned int sortOrder() const
71
// TODO(jmadill): Handle interpolation types
72
return registerRow * 4 + registerColumn;
75
bool isStructField() const { return !structFieldName.empty(); }
77
// Index to the array of varyings.
78
const PackedVarying *packedVarying;
80
// The array element of the packed varying.
81
unsigned int varyingArrayIndex;
83
// The row of the array element of the packed varying.
84
unsigned int varyingRowIndex;
86
// The register row to which we've assigned this packed varying.
87
unsigned int registerRow;
89
// The column of the register row into which we've packed this varying.
90
unsigned int registerColumn;
92
// Assigned after packing
93
unsigned int semanticIndex;
95
// Struct member this varying corresponds to.
96
std::string structFieldName;
99
class VaryingPacking final : angle::NonCopyable
102
VaryingPacking(GLuint maxVaryingVectors);
104
bool packVaryings(gl::InfoLog &infoLog,
105
const std::vector<PackedVarying> &packedVaryings,
106
const std::vector<std::string> &transformFeedbackVaryings);
110
Register() { data[0] = data[1] = data[2] = data[3] = false; }
112
bool &operator[](unsigned int index) { return data[index]; }
113
bool operator[](unsigned int index) const { return data[index]; }
118
Register &operator[](unsigned int index) { return mRegisterMap[index]; }
119
const Register &operator[](unsigned int index) const { return mRegisterMap[index]; }
121
const std::vector<PackedVaryingRegister> &getRegisterList() const { return mRegisterList; }
122
unsigned int getMaxSemanticIndex() const
124
return static_cast<unsigned int>(mRegisterList.size());
126
unsigned int getRegisterCount() const;
128
void enableBuiltins(ShaderType shaderType, const ProgramD3DMetadata &programMetadata);
130
struct BuiltinVarying final : angle::NonCopyable
134
std::string str() const;
135
void enableSystem(const std::string &systemValueSemantic);
136
void enable(const std::string &semanticVal, unsigned int indexVal);
139
std::string semantic;
146
BuiltinVarying dxPosition;
147
BuiltinVarying glPosition;
148
BuiltinVarying glFragCoord;
149
BuiltinVarying glPointCoord;
150
BuiltinVarying glPointSize;
153
const BuiltinInfo &builtins(ShaderType shaderType) const { return mBuiltinInfo[shaderType]; }
155
bool usesPointSize() const { return mBuiltinInfo[SHADER_VERTEX].glPointSize.enabled; }
158
bool packVarying(const PackedVarying &packedVarying);
159
bool isFree(unsigned int registerRow,
160
unsigned int registerColumn,
161
unsigned int varyingRows,
162
unsigned int varyingColumns) const;
163
void insert(unsigned int registerRow,
164
unsigned int registerColumn,
165
const PackedVarying &packedVarying);
167
std::vector<Register> mRegisterMap;
168
std::vector<PackedVaryingRegister> mRegisterList;
170
std::vector<BuiltinInfo> mBuiltinInfo;
175
#endif // LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_