Revert "Revert "New approach to GrProcessor uniforms.""
This reverts commit ae59426ea6e9b351d9d52f2a9c12d05023351994.
Bug: skia:12182
Change-Id: I591a0a89ffad1a3d5d867dd247ceeec71b6041a4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/449516
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
diff --git a/src/gpu/GrSPIRVUniformHandler.cpp b/src/gpu/GrSPIRVUniformHandler.cpp
index f073496..90505e6 100644
--- a/src/gpu/GrSPIRVUniformHandler.cpp
+++ b/src/gpu/GrSPIRVUniformHandler.cpp
@@ -293,7 +293,37 @@
return fSamplerSwizzles[handle.toIndex()];
}
-void GrSPIRVUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString* out) const {
+GrUniformDataManager::ProgramUniforms GrSPIRVUniformHandler::getNewProgramUniforms(
+ const GrUniformAggregator& aggregator) {
+ GrUniformDataManager::ProgramUniforms result;
+ result.reserve(aggregator.numProcessors());
+ for (int p = 0; p < aggregator.numProcessors(); ++p) {
+ GrUniformDataManager::ProcessorUniforms uniforms;
+ auto records = aggregator.processorRecords(p);
+ uniforms.reserve(records.size());
+ for (const GrUniformAggregator::Record& record : records) {
+ const GrProcessor::Uniform& u = record.uniform();
+ uint32_t offset = get_ubo_offset(&fCurrentUBOOffset, u.type(), u.count());
+ uniforms.push_back({record.indexInProcessor, u.type(), u.count(), offset});
+
+ // Add to fNewUniforms so that these get declared.
+ SPIRVUniformInfo& info = fNewUniforms.push_back();
+ GrShaderVar var(record.name, u.type(), u.count());
+ SkString qualifier = SkStringPrintf("offset = %d", offset);
+ var.addLayoutQualifier(qualifier.c_str());
+ info.fUBOOffset = offset;
+ info.fVariable = var;
+ info.fVisibility = u.visibility();
+ info.fOwner = nullptr;
+ }
+ result.push_back(std::move(uniforms));
+ }
+ return result;
+}
+
+void GrSPIRVUniformHandler::appendUniformDecls(const GrUniformAggregator&,
+ GrShaderFlags visibility,
+ SkString* out) const {
auto textures = fTextures.items().begin();
for (const SPIRVUniformInfo& sampler : fSamplers.items()) {
if (sampler.fVisibility & visibility) {
@@ -311,6 +341,12 @@
uniformsString.append(";\n");
}
}
+ for (const UniformInfo& uniform : fNewUniforms.items()) {
+ if (uniform.fVisibility & visibility) {
+ uniform.fVariable.appendDecl(fProgramBuilder->shaderCaps(), &uniformsString);
+ uniformsString.append(";\n");
+ }
+ }
if (!uniformsString.isEmpty()) {
out->appendf("layout (set = %d, binding = %d) uniform UniformBuffer\n{\n",
kUniformDescriptorSet, kUniformBinding);