OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2016 Google Inc. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. |
| 6 */ |
| 7 |
| 8 #include "GrVkProgramDataManager.h" |
| 9 |
| 10 #include "GrVkGpu.h" |
| 11 #include "GrVkUniformBuffer.h" |
| 12 |
| 13 GrVkProgramDataManager::GrVkProgramDataManager(const UniformInfoArray& uniforms, |
| 14 uint32_t vertexUniformSize, |
| 15 uint32_t fragmentUniformSize) |
| 16 : fVertexUniformSize(vertexUniformSize) |
| 17 , fFragmentUniformSize(fragmentUniformSize) { |
| 18 fVertexUniformData.reset(vertexUniformSize); |
| 19 fFragmentUniformData.reset(fragmentUniformSize); |
| 20 int count = uniforms.count(); |
| 21 fUniforms.push_back_n(count); |
| 22 // We must add uniforms in same order is the UniformInfoArray so that Unifor
mHandles already |
| 23 // owned by other objects will still match up here. |
| 24 for (int i = 0; i < count; i++) { |
| 25 Uniform& uniform = fUniforms[i]; |
| 26 const GrVkUniformHandler::UniformInfo uniformInfo = uniforms[i]; |
| 27 SkASSERT(GrGLSLShaderVar::kNonArray == uniformInfo.fVariable.getArrayCou
nt() || |
| 28 uniformInfo.fVariable.getArrayCount() > 0); |
| 29 SkDEBUGCODE( |
| 30 uniform.fArrayCount = uniformInfo.fVariable.getArrayCount(); |
| 31 uniform.fType = uniformInfo.fVariable.getType(); |
| 32 ); |
| 33 uniform.fBinding = uniformInfo.fBinding; |
| 34 uniform.fOffset = uniformInfo.fUBOffset; |
| 35 SkDEBUGCODE( |
| 36 uniform.fSetNumber = uniformInfo.fSetNumber; |
| 37 ); |
| 38 } |
| 39 } |
| 40 |
| 41 void GrVkProgramDataManager::set1f(UniformHandle u, float v0) const { |
| 42 const Uniform& uni = fUniforms[u.toIndex()]; |
| 43 SkASSERT(uni.fType == kFloat_GrSLType); |
| 44 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 45 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 46 void* buffer; |
| 47 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 48 buffer = fVertexUniformData.get(); |
| 49 } else { |
| 50 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 51 buffer = fFragmentUniformData.get(); |
| 52 } |
| 53 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 54 SkASSERT(sizeof(float) == 4); |
| 55 memcpy(buffer, &v0, sizeof(float)); |
| 56 } |
| 57 |
| 58 void GrVkProgramDataManager::set1fv(UniformHandle u, |
| 59 int arrayCount, |
| 60 const float v[]) const { |
| 61 const Uniform& uni = fUniforms[u.toIndex()]; |
| 62 SkASSERT(uni.fType == kFloat_GrSLType); |
| 63 SkASSERT(arrayCount > 0); |
| 64 SkASSERT(arrayCount <= uni.fArrayCount || |
| 65 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 66 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 67 |
| 68 void* buffer; |
| 69 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 70 buffer = fVertexUniformData.get(); |
| 71 } else { |
| 72 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 73 buffer = fFragmentUniformData.get(); |
| 74 } |
| 75 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 76 SkASSERT(sizeof(float) == 4); |
| 77 memcpy(buffer, v, arrayCount * sizeof(float)); |
| 78 } |
| 79 |
| 80 void GrVkProgramDataManager::set2f(UniformHandle u, float v0, float v1) const { |
| 81 const Uniform& uni = fUniforms[u.toIndex()]; |
| 82 SkASSERT(uni.fType == kVec2f_GrSLType); |
| 83 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 84 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 85 void* buffer; |
| 86 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 87 buffer = fVertexUniformData.get(); |
| 88 } else { |
| 89 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 90 buffer = fFragmentUniformData.get(); |
| 91 } |
| 92 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 93 SkASSERT(sizeof(float) == 4); |
| 94 float v[2] = { v0, v1 }; |
| 95 memcpy(buffer, v, 2 * sizeof(float)); |
| 96 } |
| 97 |
| 98 void GrVkProgramDataManager::set2fv(UniformHandle u, |
| 99 int arrayCount, |
| 100 const float v[]) const { |
| 101 const Uniform& uni = fUniforms[u.toIndex()]; |
| 102 SkASSERT(uni.fType == kVec2f_GrSLType); |
| 103 SkASSERT(arrayCount > 0); |
| 104 SkASSERT(arrayCount <= uni.fArrayCount || |
| 105 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 106 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 107 |
| 108 void* buffer; |
| 109 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 110 buffer = fVertexUniformData.get(); |
| 111 } else { |
| 112 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 113 buffer = fFragmentUniformData.get(); |
| 114 } |
| 115 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 116 SkASSERT(sizeof(float) == 4); |
| 117 memcpy(buffer, v, arrayCount * 2* sizeof(float)); |
| 118 } |
| 119 |
| 120 void GrVkProgramDataManager::set3f(UniformHandle u, float v0, float v1, float v2
) const { |
| 121 const Uniform& uni = fUniforms[u.toIndex()]; |
| 122 SkASSERT(uni.fType == kVec3f_GrSLType); |
| 123 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 124 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 125 void* buffer; |
| 126 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 127 buffer = fVertexUniformData.get(); |
| 128 } else { |
| 129 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 130 buffer = fFragmentUniformData.get(); |
| 131 } |
| 132 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 133 SkASSERT(sizeof(float) == 4); |
| 134 float v[3] = { v0, v1, v2 }; |
| 135 memcpy(buffer, v, 3 * sizeof(float)); |
| 136 } |
| 137 |
| 138 void GrVkProgramDataManager::set3fv(UniformHandle u, |
| 139 int arrayCount, |
| 140 const float v[]) const { |
| 141 const Uniform& uni = fUniforms[u.toIndex()]; |
| 142 SkASSERT(uni.fType == kVec3f_GrSLType); |
| 143 SkASSERT(arrayCount > 0); |
| 144 SkASSERT(arrayCount <= uni.fArrayCount || |
| 145 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 146 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 147 |
| 148 void* buffer; |
| 149 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 150 buffer = fVertexUniformData.get(); |
| 151 } else { |
| 152 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 153 buffer = fFragmentUniformData.get(); |
| 154 } |
| 155 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 156 SkASSERT(sizeof(float) == 4); |
| 157 memcpy(buffer, v, arrayCount * 3 * sizeof(float)); |
| 158 } |
| 159 |
| 160 void GrVkProgramDataManager::set4f(UniformHandle u, float v0, float v1, float v2
, float v3) const { |
| 161 const Uniform& uni = fUniforms[u.toIndex()]; |
| 162 SkASSERT(uni.fType == kVec4f_GrSLType); |
| 163 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 164 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 165 void* buffer; |
| 166 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 167 buffer = fVertexUniformData.get(); |
| 168 } else { |
| 169 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 170 buffer = fFragmentUniformData.get(); |
| 171 } |
| 172 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 173 SkASSERT(sizeof(float) == 4); |
| 174 float v[4] = { v0, v1, v2, v3 }; |
| 175 memcpy(buffer, v, 4 * sizeof(float)); |
| 176 } |
| 177 |
| 178 void GrVkProgramDataManager::set4fv(UniformHandle u, |
| 179 int arrayCount, |
| 180 const float v[]) const { |
| 181 const Uniform& uni = fUniforms[u.toIndex()]; |
| 182 SkASSERT(uni.fType == kVec4f_GrSLType); |
| 183 SkASSERT(arrayCount > 0); |
| 184 SkASSERT(arrayCount <= uni.fArrayCount || |
| 185 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 186 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 187 |
| 188 void* buffer; |
| 189 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 190 buffer = fVertexUniformData.get(); |
| 191 } else { |
| 192 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 193 buffer = fFragmentUniformData.get(); |
| 194 } |
| 195 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 196 SkASSERT(sizeof(float) == 4); |
| 197 memcpy(buffer, v, arrayCount * 4 * sizeof(float)); |
| 198 } |
| 199 |
| 200 void GrVkProgramDataManager::setMatrix3f(UniformHandle u, const float matrix[])
const { |
| 201 const Uniform& uni = fUniforms[u.toIndex()]; |
| 202 SkASSERT(uni.fType == kMat33f_GrSLType); |
| 203 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 204 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 205 void* buffer; |
| 206 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 207 buffer = fVertexUniformData.get(); |
| 208 } else { |
| 209 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 210 buffer = fFragmentUniformData.get(); |
| 211 } |
| 212 |
| 213 SkASSERT(sizeof(float) == 4); |
| 214 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 215 memcpy(buffer, &matrix[0], 3 * sizeof(float)); |
| 216 buffer = static_cast<char*>(buffer) + 4*sizeof(float); |
| 217 memcpy(buffer, &matrix[3], 3 * sizeof(float)); |
| 218 buffer = static_cast<char*>(buffer) + 4 * sizeof(float); |
| 219 memcpy(buffer, &matrix[6], 3 * sizeof(float)); |
| 220 } |
| 221 |
| 222 void GrVkProgramDataManager::setMatrix3fv(UniformHandle u, |
| 223 int arrayCount, |
| 224 const float matrices[]) const { |
| 225 const Uniform& uni = fUniforms[u.toIndex()]; |
| 226 SkASSERT(uni.fType == kMat33f_GrSLType); |
| 227 SkASSERT(arrayCount > 0); |
| 228 SkASSERT(arrayCount <= uni.fArrayCount || |
| 229 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 230 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 231 |
| 232 void* buffer; |
| 233 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 234 buffer = fVertexUniformData.get(); |
| 235 } else { |
| 236 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 237 buffer = fFragmentUniformData.get(); |
| 238 } |
| 239 SkASSERT(sizeof(float) == 4); |
| 240 buffer = static_cast<char*>(buffer)+uni.fOffset; |
| 241 for (int i = 0; i < arrayCount; ++i) { |
| 242 const float* matrix = &matrices[9 * i]; |
| 243 memcpy(buffer, &matrix[0], 3 * sizeof(float)); |
| 244 buffer = static_cast<char*>(buffer)+4 * sizeof(float); |
| 245 memcpy(buffer, &matrix[3], 3 * sizeof(float)); |
| 246 buffer = static_cast<char*>(buffer)+4 * sizeof(float); |
| 247 memcpy(buffer, &matrix[6], 3 * sizeof(float)); |
| 248 buffer = static_cast<char*>(buffer)+4 * sizeof(float); |
| 249 } |
| 250 } |
| 251 |
| 252 |
| 253 void GrVkProgramDataManager::setMatrix4f(UniformHandle u, const float matrix[])
const { |
| 254 const Uniform& uni = fUniforms[u.toIndex()]; |
| 255 SkASSERT(uni.fType == kMat44f_GrSLType); |
| 256 SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount); |
| 257 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 258 void* buffer; |
| 259 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 260 buffer = fVertexUniformData.get(); |
| 261 } else { |
| 262 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 263 buffer = fFragmentUniformData.get(); |
| 264 } |
| 265 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 266 SkASSERT(sizeof(float) == 4); |
| 267 memcpy(buffer, matrix, 16 * sizeof(float)); |
| 268 } |
| 269 |
| 270 void GrVkProgramDataManager::setMatrix4fv(UniformHandle u, |
| 271 int arrayCount, |
| 272 const float matrices[]) const { |
| 273 const Uniform& uni = fUniforms[u.toIndex()]; |
| 274 SkASSERT(uni.fType == kMat44f_GrSLType); |
| 275 SkASSERT(arrayCount > 0); |
| 276 SkASSERT(arrayCount <= uni.fArrayCount || |
| 277 (1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount))
; |
| 278 SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber); |
| 279 |
| 280 void* buffer; |
| 281 if (GrVkUniformHandler::kVertexBinding == uni.fBinding) { |
| 282 buffer = fVertexUniformData.get(); |
| 283 } else { |
| 284 SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding); |
| 285 buffer = fFragmentUniformData.get(); |
| 286 } |
| 287 buffer = static_cast<char*>(buffer) + uni.fOffset; |
| 288 SkASSERT(sizeof(float) == 4); |
| 289 memcpy(buffer, matrices, arrayCount * 16 * sizeof(float)); |
| 290 } |
| 291 |
| 292 void GrVkProgramDataManager::uploadUniformBuffers(const GrVkGpu* gpu, |
| 293 GrVkUniformBuffer* vertexBuffe
r, |
| 294 GrVkUniformBuffer* fragmentBuf
fer) const { |
| 295 if (vertexBuffer) { |
| 296 vertexBuffer->addMemoryBarrier(gpu, |
| 297 VK_ACCESS_UNIFORM_READ_BIT, |
| 298 VK_ACCESS_HOST_WRITE_BIT, |
| 299 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, |
| 300 VK_PIPELINE_STAGE_HOST_BIT, |
| 301 false); |
| 302 SkAssertResult(vertexBuffer->updateData(gpu, fVertexUniformData.get(), f
VertexUniformSize)); |
| 303 } |
| 304 |
| 305 if (fragmentBuffer) { |
| 306 fragmentBuffer->addMemoryBarrier(gpu, |
| 307 VK_ACCESS_UNIFORM_READ_BIT, |
| 308 VK_ACCESS_HOST_WRITE_BIT, |
| 309 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, |
| 310 VK_PIPELINE_STAGE_HOST_BIT, |
| 311 false); |
| 312 SkAssertResult(fragmentBuffer->updateData(gpu, fFragmentUniformData.get(
), |
| 313 fFragmentUniformSize)); |
| 314 } |
| 315 } |
OLD | NEW |