DirectXShaderCompiler/lib/DXIL/DxilWaveMatrix.cpp

79 строки
3.2 KiB
C++
Исходник Обычный вид История

///////////////////////////////////////////////////////////////////////////////
// //
// DxilWaveMatrix.cpp //
// Copyright (C) Microsoft Corporation. All rights reserved. //
// This file is distributed under the University of Illinois Open Source //
// License. See LICENSE.TXT for details. //
// //
///////////////////////////////////////////////////////////////////////////////
#include "dxc/DXIL/DxilWaveMatrix.h"
#include "dxc/DXIL/DxilInstructions.h"
#include "dxc/DXIL/DxilModule.h"
#include "dxc/DXIL/DxilOperations.h"
#include "dxc/DXIL/DxilShaderModel.h"
#include "dxc/DXIL/DxilUtil.h"
#include "dxc/Support/Global.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
using namespace llvm;
namespace hlsl {
DxilWaveMatrixProperties
wavemat_helper::LoadInfoFromConstant(llvm::Constant *C) {
DXASSERT(!isa<ConstantAggregateZero>(C),
"otherwise, DxilWaveMatrixProperties has invalid value");
const ConstantStruct *CS = cast<ConstantStruct>(C);
DXASSERT(CS->getType()->getNumElements() == 4,
"otherwise, struct is not expected layout");
DxilWaveMatrixProperties info;
info.kind = (DXIL::WaveMatrixKind)cast<ConstantInt>(CS->getOperand(0))
->getLimitedValue();
info.compType = (DXIL::ComponentType)cast<ConstantInt>(CS->getOperand(1))
->getLimitedValue();
info.dimM = (uint32_t)cast<ConstantInt>(CS->getOperand(2))->getLimitedValue();
info.dimN = (uint32_t)cast<ConstantInt>(CS->getOperand(3))->getLimitedValue();
return info;
}
Constant *
wavemat_helper::GetInfoConstantFromWaveMatPtr(llvm::Value *waveMatPtr) {
DXASSERT_NOMSG(isa<AllocaInst>(waveMatPtr));
for (auto *U : waveMatPtr->users()) {
Instruction *I = cast<Instruction>(U);
DxilInst_WaveMatrix_Annotate annotate(I);
if (annotate) {
DXASSERT_NOMSG(isa<Constant>(annotate.get_waveMatProps()));
return cast<Constant>(annotate.get_waveMatProps());
}
}
return nullptr;
}
DxilWaveMatrixProperties
wavemat_helper::GetInfoFromWaveMatPtr(llvm::Value *waveMatPtr) {
Constant *infoC = wavemat_helper::GetInfoConstantFromWaveMatPtr(waveMatPtr);
DXASSERT(infoC, "otherwise, no WaveMatAnnotate call found for ptr");
return wavemat_helper::LoadInfoFromConstant(infoC);
}
llvm::Constant *
wavemat_helper::GetAsConstant(const DxilWaveMatrixProperties &info,
llvm::StructType *infoTy) {
LLVMContext &Ctx = infoTy->getContext();
IntegerType *i8Ty = IntegerType::get(Ctx, 8);
IntegerType *i32Ty = IntegerType::get(Ctx, 32);
return ConstantStruct::get(cast<StructType>(infoTy),
{ConstantInt::get(i8Ty, (unsigned)info.kind),
ConstantInt::get(i8Ty, (unsigned)info.compType),
ConstantInt::get(i32Ty, (unsigned)info.dimM),
ConstantInt::get(i32Ty, (unsigned)info.dimN)});
}
} // namespace hlsl