Merge pull request #1289 from Igalia/igalia/dmat-scalar-division
Use the correct type for the constant for matrix/scalar division
This commit is contained in:
		
						commit
						cb32c54466
					
				@ -4137,7 +4137,8 @@ spv::Id TGlslangToSpvTraverser::createBinaryMatrixOperation(spv::Op op, spv::Dec
 | 
				
			|||||||
    case spv::OpFDiv:
 | 
					    case spv::OpFDiv:
 | 
				
			||||||
        if (builder.isMatrix(left) && builder.isScalar(right)) {
 | 
					        if (builder.isMatrix(left) && builder.isScalar(right)) {
 | 
				
			||||||
            // turn matrix / scalar into a multiply...
 | 
					            // turn matrix / scalar into a multiply...
 | 
				
			||||||
            right = builder.createBinOp(spv::OpFDiv, builder.getTypeId(right), builder.makeFloatConstant(1.0F), right);
 | 
					            spv::Id resultType = builder.getTypeId(right);
 | 
				
			||||||
 | 
					            right = builder.createBinOp(spv::OpFDiv, resultType, builder.makeFpConstant(resultType, 1.0), right);
 | 
				
			||||||
            op = spv::OpMatrixTimesScalar;
 | 
					            op = spv::OpMatrixTimesScalar;
 | 
				
			||||||
        } else
 | 
					        } else
 | 
				
			||||||
            firstClass = false;
 | 
					            firstClass = false;
 | 
				
			||||||
 | 
				
			|||||||
@ -848,6 +848,23 @@ Id Builder::makeFloat16Constant(float f16, bool specConstant)
 | 
				
			|||||||
    return c->getResultId();
 | 
					    return c->getResultId();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Id Builder::makeFpConstant(Id type, double d, bool specConstant)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					        assert(isFloatType(type));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (getScalarTypeWidth(type)) {
 | 
				
			||||||
 | 
					        case 16:
 | 
				
			||||||
 | 
					                return makeFloat16Constant(d, specConstant);
 | 
				
			||||||
 | 
					        case 32:
 | 
				
			||||||
 | 
					                return makeFloatConstant(d, specConstant);
 | 
				
			||||||
 | 
					        case 64:
 | 
				
			||||||
 | 
					                return makeDoubleConstant(d, specConstant);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert(false);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Id Builder::findCompositeConstant(Op typeClass, const std::vector<Id>& comps)
 | 
					Id Builder::findCompositeConstant(Op typeClass, const std::vector<Id>& comps)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Instruction* constant = 0;
 | 
					    Instruction* constant = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -226,6 +226,7 @@ public:
 | 
				
			|||||||
    Id makeFloatConstant(float f, bool specConstant = false);
 | 
					    Id makeFloatConstant(float f, bool specConstant = false);
 | 
				
			||||||
    Id makeDoubleConstant(double d, bool specConstant = false);
 | 
					    Id makeDoubleConstant(double d, bool specConstant = false);
 | 
				
			||||||
    Id makeFloat16Constant(float f16, bool specConstant = false);
 | 
					    Id makeFloat16Constant(float f16, bool specConstant = false);
 | 
				
			||||||
 | 
					    Id makeFpConstant(Id type, double d, bool specConstant = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Turn the array of constants into a proper spv constant of the requested type.
 | 
					    // Turn the array of constants into a proper spv constant of the requested type.
 | 
				
			||||||
    Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
 | 
					    Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user