| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrVkUniformHandler.h" | 8 #include "GrVkUniformHandler.h" |
| 9 #include "glsl/GrGLSLProgramBuilder.h" | 9 #include "glsl/GrGLSLProgramBuilder.h" |
| 10 | 10 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 GrSL
Precision precision, | 129 GrSL
Precision precision, |
| 130 cons
t char* name, | 130 cons
t char* name, |
| 131 bool
mangleName, | 131 bool
mangleName, |
| 132 int
arrayCount, | 132 int
arrayCount, |
| 133 cons
t char** outName) { | 133 cons
t char** outName) { |
| 134 SkASSERT(name && strlen(name)); | 134 SkASSERT(name && strlen(name)); |
| 135 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_GrShaderFlag|kFr
agment_GrShaderFlag); | 135 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_GrShaderFlag|kFr
agment_GrShaderFlag); |
| 136 SkASSERT(0 == (~kVisibilityMask & visibility)); | 136 SkASSERT(0 == (~kVisibilityMask & visibility)); |
| 137 SkASSERT(0 != visibility); | 137 SkASSERT(0 != visibility); |
| 138 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type)); | 138 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type)); |
| 139 GrSLTypeIsFloatType(type); | |
| 140 | 139 |
| 141 UniformInfo& uni = fUniforms.push_back(); | 140 UniformInfo& uni = fUniforms.push_back(); |
| 142 uni.fVariable.setType(type); | 141 uni.fVariable.setType(type); |
| 143 // TODO this is a bit hacky, lets think of a better way. Basically we need
to be able to use | 142 // TODO this is a bit hacky, lets think of a better way. Basically we need
to be able to use |
| 144 // the uniform view matrix name in the GP, and the GP is immutable so it has
to tell the PB | 143 // the uniform view matrix name in the GP, and the GP is immutable so it has
to tell the PB |
| 145 // exactly what name it wants to use for the uniform view matrix. If we pre
fix anythings, then | 144 // exactly what name it wants to use for the uniform view matrix. If we pre
fix anythings, then |
| 146 // the names will mismatch. I think the correct solution is to have all GPs
which need the | 145 // the names will mismatch. I think the correct solution is to have all GPs
which need the |
| 147 // uniform view matrix, they should upload the view matrix in their setData
along with regular | 146 // uniform view matrix, they should upload the view matrix in their setData
along with regular |
| 148 // uniforms. | 147 // uniforms. |
| 149 char prefix = 'u'; | 148 char prefix = 'u'; |
| 150 if ('u' == name[0]) { | 149 if ('u' == name[0]) { |
| 151 prefix = '\0'; | 150 prefix = '\0'; |
| 152 } | 151 } |
| 153 fProgramBuilder->nameVariable(uni.fVariable.accessName(), prefix, name, mang
leName); | 152 fProgramBuilder->nameVariable(uni.fVariable.accessName(), prefix, name, mang
leName); |
| 154 uni.fVariable.setArrayCount(arrayCount); | 153 uni.fVariable.setArrayCount(arrayCount); |
| 155 // For now asserting the the visibility is either only vertex or only fragme
nt | 154 // For now asserting the the visibility is either only vertex or only fragme
nt |
| 156 SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == vis
ibility); | 155 SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == vis
ibility); |
| 157 uni.fVisibility = visibility; | 156 uni.fVisibility = visibility; |
| 158 uni.fVariable.setPrecision(precision); | 157 uni.fVariable.setPrecision(precision); |
| 159 // When outputing the GLSL, only the outer uniform block will get the Unifor
m modifier. Thus | 158 if (GrSLTypeIsFloatType(type)) { |
| 160 // we set the modifier to none for all uniforms declared inside the block. | 159 // When outputing the GLSL, only the outer uniform block will get the Un
iform modifier. Thus |
| 161 uni.fVariable.setTypeModifier(GrGLSLShaderVar::kNone_TypeModifier); | 160 // we set the modifier to none for all uniforms declared inside the bloc
k. |
| 161 uni.fVariable.setTypeModifier(GrGLSLShaderVar::kNone_TypeModifier); |
| 162 | 162 |
| 163 uint32_t* currentOffset = kVertex_GrShaderFlag == visibility ? &fCurrentVert
exUBOOffset | 163 uint32_t* currentOffset = kVertex_GrShaderFlag == visibility ? &fCurrent
VertexUBOOffset |
| 164 : &fCurrentFr
agmentUBOOffset; | 164 : &fCurrent
FragmentUBOOffset; |
| 165 get_ubo_aligned_offset(&uni.fUBOffset, currentOffset, type, arrayCount); | 165 get_ubo_aligned_offset(&uni.fUBOffset, currentOffset, type, arrayCount); |
| 166 uni.fSetNumber = kUniformBufferDescSet; |
| 167 uni.fBinding = kVertex_GrShaderFlag == visibility ? kVertexBinding : kFr
agBinding; |
| 166 | 168 |
| 167 if (outName) { | 169 if (outName) { |
| 168 *outName = uni.fVariable.c_str(); | 170 *outName = uni.fVariable.c_str(); |
| 171 } |
| 172 } else { |
| 173 SkASSERT(type == kSampler2D_GrSLType); |
| 174 uni.fVariable.setTypeModifier(GrGLSLShaderVar::kUniform_TypeModifier); |
| 175 |
| 176 uni.fSetNumber = kSamplerDescSet; |
| 177 uni.fBinding = fCurrentSamplerBinding++; |
| 178 uni.fUBOffset = 0; // This value will be ignored, but initializing to av
oid any errors. |
| 179 SkString layoutQualifier; |
| 180 layoutQualifier.appendf("set=%d, binding=%d", uni.fSetNumber, uni.fBindi
ng); |
| 181 uni.fVariable.setLayoutQualifier(layoutQualifier.c_str()); |
| 169 } | 182 } |
| 170 | 183 |
| 171 return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1); | 184 return GrGLSLUniformHandler::UniformHandle(fUniforms.count() - 1); |
| 172 } | 185 } |
| 173 | 186 |
| 174 GrGLSLUniformHandler::SamplerHandle GrVkUniformHandler::internalAddSampler(uint3
2_t visibility, | |
| 175 GrPix
elConfig config, | |
| 176 GrSLT
ype type, | |
| 177 GrSLP
recision precision, | |
| 178 const
char* name) { | |
| 179 SkASSERT(name && strlen(name)); | |
| 180 SkDEBUGCODE(static const uint32_t kVisMask = kVertex_GrShaderFlag | kFragmen
t_GrShaderFlag); | |
| 181 SkASSERT(0 == (~kVisMask & visibility)); | |
| 182 SkASSERT(0 != visibility); | |
| 183 SkString mangleName; | |
| 184 char prefix = 'u'; | |
| 185 fProgramBuilder->nameVariable(&mangleName, prefix, name, true); | |
| 186 fSamplers.emplace_back(visibility, config, type, precision, mangleName.c_str
(), | |
| 187 (uint32_t)fSamplers.count(), kSamplerDescSet); | |
| 188 return GrGLSLUniformHandler::SamplerHandle(fSamplers.count() - 1); | |
| 189 } | |
| 190 | |
| 191 void GrVkUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString*
out) const { | 187 void GrVkUniformHandler::appendUniformDecls(GrShaderFlags visibility, SkString*
out) const { |
| 188 SkTArray<UniformInfo*> uniformBufferUniform; |
| 189 // Used to collect all the variables that will be place inside the uniform b
uffer |
| 190 SkString uniformsString; |
| 192 SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == vis
ibility); | 191 SkASSERT(kVertex_GrShaderFlag == visibility || kFragment_GrShaderFlag == vis
ibility); |
| 193 | 192 uint32_t uniformBinding = (visibility == kVertex_GrShaderFlag) ? kVertexBind
ing : kFragBinding; |
| 194 for (int i = 0; i < fSamplers.count(); ++i) { | |
| 195 const GrVkGLSLSampler& sampler = fSamplers[i]; | |
| 196 SkASSERT(sampler.type() == kSampler2D_GrSLType); | |
| 197 if (visibility == sampler.visibility()) { | |
| 198 sampler.fShaderVar.appendDecl(fProgramBuilder->glslCaps(), out); | |
| 199 out->append(";\n"); | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 SkString uniformsString; | |
| 204 for (int i = 0; i < fUniforms.count(); ++i) { | 193 for (int i = 0; i < fUniforms.count(); ++i) { |
| 205 const UniformInfo& localUniform = fUniforms[i]; | 194 const UniformInfo& localUniform = fUniforms[i]; |
| 206 if (visibility == localUniform.fVisibility) { | 195 if (visibility == localUniform.fVisibility) { |
| 207 if (GrSLTypeIsFloatType(localUniform.fVariable.getType())) { | 196 if (GrSLTypeIsFloatType(localUniform.fVariable.getType())) { |
| 197 SkASSERT(uniformBinding == localUniform.fBinding); |
| 198 SkASSERT(kUniformBufferDescSet == localUniform.fSetNumber); |
| 208 localUniform.fVariable.appendDecl(fProgramBuilder->glslCaps(), &
uniformsString); | 199 localUniform.fVariable.appendDecl(fProgramBuilder->glslCaps(), &
uniformsString); |
| 209 uniformsString.append(";\n"); | 200 uniformsString.append(";\n"); |
| 201 } else { |
| 202 SkASSERT(localUniform.fVariable.getType() == kSampler2D_GrSLType
); |
| 203 SkASSERT(kSamplerDescSet == localUniform.fSetNumber); |
| 204 localUniform.fVariable.appendDecl(fProgramBuilder->glslCaps(), o
ut); |
| 205 out->append(";\n"); |
| 210 } | 206 } |
| 211 } | 207 } |
| 212 } | 208 } |
| 213 if (!uniformsString.isEmpty()) { | 209 if (!uniformsString.isEmpty()) { |
| 214 uint32_t uniformBinding = (visibility == kVertex_GrShaderFlag) ? kVertex
Binding | |
| 215 : kFragBi
nding; | |
| 216 const char* stage = (visibility == kVertex_GrShaderFlag) ? "vertex" : "f
ragment"; | 210 const char* stage = (visibility == kVertex_GrShaderFlag) ? "vertex" : "f
ragment"; |
| 217 out->appendf("layout (set=%d, binding=%d) uniform %sUniformBuffer\n{\n", | 211 out->appendf("layout (set=%d, binding=%d) uniform %sUniformBuffer\n{\n", |
| 218 kUniformBufferDescSet, uniformBinding, stage); | 212 kUniformBufferDescSet, uniformBinding, stage); |
| 219 out->appendf("%s\n};\n", uniformsString.c_str()); | 213 out->appendf("%s\n};\n", uniformsString.c_str()); |
| 220 } | 214 } |
| 221 } | 215 } |
| OLD | NEW |