blob: 14a6f34297205aebff36ea2213706d6b4b4c826c [file] [log] [blame]
/*
* 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/SkM44.h"
#include "include/core/SkMatrix.h"
#include "src/core/SkMatrixPriv.h"
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());
}