79 строки
3.2 KiB
C++
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
|