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 |