| /* | |
| * Copyright 2016 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "src/gpu/ganesh/glsl/GrGLSLProgramDataManager.h" | |
| #include "include/core/SkMatrix.h" | |
| #include "include/private/SkTemplates.h" | |
| #include "src/core/SkMatrixPriv.h" | |
| #include <cstddef> | |
| void GrGLSLProgramDataManager::setSkMatrix(UniformHandle u, const SkMatrix& matrix) const { | |
| float mt[] = { | |
| matrix.get(SkMatrix::kMScaleX), | |
| matrix.get(SkMatrix::kMSkewY), | |
| matrix.get(SkMatrix::kMPersp0), | |
| matrix.get(SkMatrix::kMSkewX), | |
| matrix.get(SkMatrix::kMScaleY), | |
| matrix.get(SkMatrix::kMPersp1), | |
| matrix.get(SkMatrix::kMTransX), | |
| matrix.get(SkMatrix::kMTransY), | |
| matrix.get(SkMatrix::kMPersp2), | |
| }; | |
| this->setMatrix3f(u, mt); | |
| } | |
| void GrGLSLProgramDataManager::setSkM44(UniformHandle u, const SkM44& matrix) const { | |
| this->setMatrix4f(u, SkMatrixPriv::M44ColMajor(matrix)); | |
| } | |
| void GrGLSLProgramDataManager::setRuntimeEffectUniforms( | |
| SkSpan<const SkRuntimeEffect::Uniform> uniforms, | |
| SkSpan<const UniformHandle> handles, | |
| SkSpan<const Specialized> specialized, | |
| const void* src) const { | |
| SkASSERT(uniforms.empty() || src); | |
| SkASSERT(specialized.empty() || specialized.size() == uniforms.size()); | |
| SkASSERT(!specialized.empty() || handles.size() == uniforms.size()); | |
| using Type = SkRuntimeEffect::Uniform::Type; | |
| size_t handleIdx = 0; | |
| for (size_t uniformIdx = 0; uniformIdx < uniforms.size(); ++uniformIdx) { | |
| const auto& u = uniforms[uniformIdx]; | |
| auto floatData = [=] { return SkTAddOffset<const float>(src, u.offset); }; | |
| auto intData = [=] { return SkTAddOffset<const int >(src, u.offset); }; | |
| if (!specialized.empty() && specialized[uniformIdx] == Specialized::kYes) { | |
| continue; | |
| } | |
| const auto h = handles[handleIdx++]; | |
| switch (u.type) { | |
| case Type::kFloat: this->set1fv(h, u.count, floatData()); break; | |
| case Type::kFloat2: this->set2fv(h, u.count, floatData()); break; | |
| case Type::kFloat3: this->set3fv(h, u.count, floatData()); break; | |
| case Type::kFloat4: this->set4fv(h, u.count, floatData()); break; | |
| case Type::kFloat2x2: this->setMatrix2fv(h, u.count, floatData()); break; | |
| case Type::kFloat3x3: this->setMatrix3fv(h, u.count, floatData()); break; | |
| case Type::kFloat4x4: this->setMatrix4fv(h, u.count, floatData()); break; | |
| case Type::kInt: this->set1iv(h, u.count, intData()); break; | |
| case Type::kInt2: this->set2iv(h, u.count, intData()); break; | |
| case Type::kInt3: this->set3iv(h, u.count, intData()); break; | |
| case Type::kInt4: this->set4iv(h, u.count, intData()); break; | |
| default: | |
| SkDEBUGFAIL("Unsupported uniform type"); | |
| break; | |
| } | |
| } | |
| SkASSERT(handleIdx == handles.size()); | |
| } |