1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLConstructorDiagonalMatrix.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLConstantFolder.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLType.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { 15*c8dee2aaSAndroid Build Coastguard Worker Make(const Context & context,Position pos,const Type & type,std::unique_ptr<Expression> arg)16*c8dee2aaSAndroid Build Coastguard Workerstd::unique_ptr<Expression> ConstructorDiagonalMatrix::Make(const Context& context, 17*c8dee2aaSAndroid Build Coastguard Worker Position pos, 18*c8dee2aaSAndroid Build Coastguard Worker const Type& type, 19*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<Expression> arg) { 20*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(type.isMatrix()); 21*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(type.isAllowedInES2(context)); 22*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(arg->type().isScalar()); 23*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(arg->type().matches(type.componentType())); 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker // Look up the value of constant variables. This allows constant-expressions like `mat4(five)` 26*c8dee2aaSAndroid Build Coastguard Worker // to be replaced with `mat4(5.0)`. 27*c8dee2aaSAndroid Build Coastguard Worker arg = ConstantFolder::MakeConstantValueForVariable(pos, std::move(arg)); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker return std::make_unique<ConstructorDiagonalMatrix>(pos, type, std::move(arg)); 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker getConstantValue(int n) const32*c8dee2aaSAndroid Build Coastguard Workerstd::optional<double> ConstructorDiagonalMatrix::getConstantValue(int n) const { 33*c8dee2aaSAndroid Build Coastguard Worker int rows = this->type().rows(); 34*c8dee2aaSAndroid Build Coastguard Worker int row = n % rows; 35*c8dee2aaSAndroid Build Coastguard Worker int col = n / rows; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(col >= 0); 38*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(row >= 0); 39*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(col < this->type().columns()); 40*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(row < this->type().rows()); 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker return (col == row) ? this->argument()->getConstantValue(0) : 0.0; 43*c8dee2aaSAndroid Build Coastguard Worker } 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker } // namespace SkSL 46