Index: src/gpu/vk/GrVkUniformHandler.cpp |
diff --git a/src/gpu/vk/GrVkUniformHandler.cpp b/src/gpu/vk/GrVkUniformHandler.cpp |
index 3451d6b3441d077d682a9e0953d3e85ec08175fa..4ffbcfe7d8a73d8f8319f7855e7af03ff852eb87 100644 |
--- a/src/gpu/vk/GrVkUniformHandler.cpp |
+++ b/src/gpu/vk/GrVkUniformHandler.cpp |
@@ -136,7 +136,6 @@ |
SkASSERT(0 == (~kVisibilityMask & visibility)); |
SkASSERT(0 != visibility); |
SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type)); |
- GrSLTypeIsFloatType(type); |
UniformInfo& uni = fUniforms.push_back(); |
uni.fVariable.setType(type); |
@@ -156,63 +155,58 @@ |
SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == visibility); |
uni.fVisibility = visibility; |
uni.fVariable.setPrecision(precision); |
- // When outputing the GLSL, only the outer uniform block will get the Uniform modifier. Thus |
- // we set the modifier to none for all uniforms declared inside the block. |
- uni.fVariable.setTypeModifier(GrGLSLShaderVar::kNone_TypeModifier); |
- |
- uint32_t* currentOffset = kVertex_GrShaderFlag == visibility ? &fCurrentVertexUBOOffset |
- : &fCurrentFragmentUBOOffset; |
- get_ubo_aligned_offset(&uni.fUBOffset, currentOffset, type, arrayCount); |
- |
- if (outName) { |
- *outName = uni.fVariable.c_str(); |
+ if (GrSLTypeIsFloatType(type)) { |
+ // When outputing the GLSL, only the outer uniform block will get the Uniform modifier. Thus |
+ // we set the modifier to none for all uniforms declared inside the block. |
+ uni.fVariable.setTypeModifier(GrGLSLShaderVar::kNone_TypeModifier); |
+ |
+ uint32_t* currentOffset = kVertex_GrShaderFlag == visibility ? &fCurrentVertexUBOOffset |
+ : &fCurrentFragmentUBOOffset; |
+ get_ubo_aligned_offset(&uni.fUBOffset, currentOffset, type, arrayCount); |
+ uni.fSetNumber = kUniformBufferDescSet; |
+ uni.fBinding = kVertex_GrShaderFlag == visibility ? kVertexBinding : kFragBinding; |
+ |
+ if (outName) { |
+ *outName = uni.fVariable.c_str(); |
+ } |
+ } else { |
+ SkASSERT(type == kSampler2D_GrSLType); |
+ uni.fVariable.setTypeModifier(GrGLSLShaderVar::kUniform_TypeModifier); |
+ |
+ uni.fSetNumber = kSamplerDescSet; |
+ uni.fBinding = fCurrentSamplerBinding++; |
+ uni.fUBOffset = 0; // This value will be ignored, but initializing to avoid any errors. |
+ SkString layoutQualifier; |
+ layoutQualifier.appendf("set=%d, binding=%d", uni.fSetNumber, uni.fBinding); |
+ uni.fVariable.setLayoutQualifier(layoutQualifier.c_str()); |
} |
return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1); |
} |
-GrGLSLUniformHandler::SamplerHandle GrVkUniformHandler::internalAddSampler(uint32_t visibility, |
- GrPixelConfig config, |
- GrSLType type, |
- GrSLPrecision precision, |
- const char* name) { |
- SkASSERT(name && strlen(name)); |
- SkDEBUGCODE(static const uint32_t kVisMask = kVertex_GrShaderFlag | kFragment_GrShaderFlag); |
- SkASSERT(0 == (~kVisMask & visibility)); |
- SkASSERT(0 != visibility); |
- SkString mangleName; |
- char prefix = 'u'; |
- fProgramBuilder->nameVariable(&mangleName, prefix, name, true); |
- fSamplers.emplace_back(visibility, config, type, precision, mangleName.c_str(), |
- (uint32_t)fSamplers.count(), kSamplerDescSet); |
- return GrGLSLUniformHandler::SamplerHandle(fSamplers.count() - 1); |
-} |
- |
void GrVkUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString* out) const { |
+ SkTArray<UniformInfo*> uniformBufferUniform; |
+ // Used to collect all the variables that will be place inside the uniform buffer |
+ SkString uniformsString; |
SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == visibility); |
- |
- for (int i = 0; i < fSamplers.count(); ++i) { |
- const GrVkGLSLSampler& sampler = fSamplers[i]; |
- SkASSERT(sampler.type() == kSampler2D_GrSLType); |
- if (visibility == sampler.visibility()) { |
- sampler.fShaderVar.appendDecl(fProgramBuilder->glslCaps(), out); |
- out->append(";\n"); |
- } |
- } |
- |
- SkString uniformsString; |
+ uint32_t uniformBinding = (visibility == kVertex_GrShaderFlag) ? kVertexBinding : kFragBinding; |
for (int i = 0; i < fUniforms.count(); ++i) { |
const UniformInfo& localUniform = fUniforms[i]; |
if (visibility == localUniform.fVisibility) { |
if (GrSLTypeIsFloatType(localUniform.fVariable.getType())) { |
+ SkASSERT(uniformBinding == localUniform.fBinding); |
+ SkASSERT(kUniformBufferDescSet == localUniform.fSetNumber); |
localUniform.fVariable.appendDecl(fProgramBuilder->glslCaps(), &uniformsString); |
uniformsString.append(";\n"); |
+ } else { |
+ SkASSERT(localUniform.fVariable.getType() == kSampler2D_GrSLType); |
+ SkASSERT(kSamplerDescSet == localUniform.fSetNumber); |
+ localUniform.fVariable.appendDecl(fProgramBuilder->glslCaps(), out); |
+ out->append(";\n"); |
} |
} |
} |
if (!uniformsString.isEmpty()) { |
- uint32_t uniformBinding = (visibility == kVertex_GrShaderFlag) ? kVertexBinding |
- : kFragBinding; |
const char* stage = (visibility == kVertex_GrShaderFlag) ? "vertex" : "fragment"; |
out->appendf("layout (set=%d, binding=%d) uniform %sUniformBuffer\n{\n", |
kUniformBufferDescSet, uniformBinding, stage); |