25class QSSGShaderResourceMergeContext
29 QSSGShaderResourceMergeContext()
30 : m_nextFreeResourceBinding(FIRST_CUSTOM_RESOURCE_BINDING_POINT + s_additionalBuffers)
35 static const int FIRST_CUSTOM_RESOURCE_BINDING_POINT = 3;
38 QSSGShaderGeneratorStageFlags stageOutputFrom;
39 QSSGShaderGeneratorStageFlags stagesInputIn;
50 QSSGRenderShaderMetadata::Uniform::Condition conditionType;
51 QByteArray conditionName;
55 struct Image :
public Sampler
58 QByteArray qualifiers;
64 QSSGRenderShaderMetadata::Uniform::Condition conditionType;
65 QByteArray conditionName;
74 QMap<QByteArray, InOutVar> m_inOutVars;
75 QMap<QByteArray, Sampler> m_samplers;
76 QMap<QByteArray, Image> m_images;
77 QMap<QByteArray, BlockMember> m_uniformMembers;
79 int m_nextFreeResourceBinding = FIRST_CUSTOM_RESOURCE_BINDING_POINT;
80 int m_nextFreeImageBinding = 0;
81 QHash<
int,
int> m_nextFreeInLocation;
82 QHash<
int,
int> m_nextFreeOutLocation;
86 void rearrangeResources()
93 int binding = FIRST_CUSTOM_RESOURCE_BINDING_POINT + s_additionalBuffers;
94 for (
auto &image : m_images)
95 image.binding = binding++;
96 for (
auto &sampler : m_samplers)
97 sampler.binding = binding++;
100 void registerInput(QSSGShaderGeneratorStage stage,
const QByteArray &type,
const QByteArray &name,
bool flat =
false)
102 auto it = m_inOutVars.find(name);
103 if (it != m_inOutVars.end()) {
104 it->stagesInputIn |= stage;
107 InOutVar var { {}, stage, type, name, m_nextFreeInLocation[
int(stage)]++,
false, flat };
108 m_inOutVars.insert(name, var);
111 void registerOutput(QSSGShaderGeneratorStage stage,
const QByteArray &type,
const QByteArray &name,
bool flat =
false)
113 auto it = m_inOutVars.find(name);
114 if (it != m_inOutVars.end()) {
115 it->stageOutputFrom |= stage;
118 InOutVar var { stage, {}, type, name, m_nextFreeOutLocation[
int(stage)]++,
true, flat };
119 m_inOutVars.insert(name, var);
122 void registerSampler(
const QByteArray &type,
123 const QByteArray &name,
124 QSSGRenderShaderMetadata::Uniform::Condition conditionType = QSSGRenderShaderMetadata::Uniform::None,
125 const QByteArray &conditionName = QByteArray())
127 if (m_samplers.contains(name) || m_images.contains(name))
129 Sampler var { type, name, conditionType, conditionName, m_nextFreeResourceBinding++ };
130 m_samplers.insert(name, var);
133 void registerImage(
const QByteArray &type,
134 const QByteArray &name,
135 const QByteArray &imgtype,
136 const QByteArray &qualifiers,
137 QSSGRenderShaderMetadata::Uniform::Condition conditionType = QSSGRenderShaderMetadata::Uniform::None,
138 const QByteArray &conditionName = QByteArray())
140 if (m_samplers.contains(name) || m_images.contains(name))
142 Image var { {type, name, conditionType, conditionName, m_nextFreeResourceBinding++}, imgtype, qualifiers};
143 m_images.insert(name, var);
146 void registerUniformMember(
const QByteArray &type,
147 const QByteArray &name,
148 QSSGRenderShaderMetadata::Uniform::Condition conditionType = QSSGRenderShaderMetadata::Uniform::None,
149 const QByteArray &conditionName = QByteArray())
151 auto it = m_uniformMembers.constFind(name);
152 if (it != m_uniformMembers.constEnd()) {
153 if (it->conditionType != conditionType) {
154 qWarning(
"Encountered uniform %s with different conditions, this is not supported.",
159 BlockMember var { type, name, conditionType, conditionName };
160 m_uniformMembers.insert(name, var);
162 static int s_additionalBuffers;
163 static void setAdditionalBufferAmount(
int amount)
165 s_additionalBuffers = amount;