Index: src/gpu/vk/GrVkUniformHandler.cpp |
diff --git a/src/gpu/vk/GrVkUniformHandler.cpp b/src/gpu/vk/GrVkUniformHandler.cpp |
index 4ffbcfe7d8a73d8f8319f7855e7af03ff852eb87..3451d6b3441d077d682a9e0953d3e85ec08175fa 100644 |
--- a/src/gpu/vk/GrVkUniformHandler.cpp |
+++ b/src/gpu/vk/GrVkUniformHandler.cpp |
@@ -136,6 +136,7 @@ GrGLSLUniformHandler::UniformHandle GrVkUniformHandler::internalAddUniformArray( |
SkASSERT(0 == (~kVisibilityMask & visibility)); |
SkASSERT(0 != visibility); |
SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type)); |
+ GrSLTypeIsFloatType(type); |
UniformInfo& uni = fUniforms.push_back(); |
uni.fVariable.setType(type); |
@@ -155,58 +156,63 @@ GrGLSLUniformHandler::UniformHandle GrVkUniformHandler::internalAddUniformArray( |
SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == visibility); |
uni.fVisibility = visibility; |
uni.fVariable.setPrecision(precision); |
- 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); |
+ // 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; |
+ uint32_t* currentOffset = kVertex_GrShaderFlag == visibility ? &fCurrentVertexUBOOffset |
+ : &fCurrentFragmentUBOOffset; |
+ get_ubo_aligned_offset(&uni.fUBOffset, currentOffset, type, arrayCount); |
- 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()); |
+ if (outName) { |
+ *outName = uni.fVariable.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); |
- uint32_t uniformBinding = (visibility == kVertex_GrShaderFlag) ? kVertexBinding : kFragBinding; |
+ |
+ 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; |
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); |