110 строки
3.9 KiB
C++
110 строки
3.9 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// DxilResourceBinding.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/DxilResourceBinding.h"
|
|
#include "dxc/DXIL/DxilCBuffer.h"
|
|
#include "dxc/DXIL/DxilInstructions.h"
|
|
#include "dxc/DXIL/DxilOperations.h"
|
|
#include "dxc/DXIL/DxilResource.h"
|
|
#include "dxc/DXIL/DxilResourceBase.h"
|
|
#include "dxc/DXIL/DxilSampler.h"
|
|
#include "dxc/DXIL/DxilShaderModel.h"
|
|
#include "dxc/DXIL/DxilUtil.h"
|
|
#include "llvm/IR/Constant.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace hlsl {
|
|
|
|
bool DxilResourceBinding::operator==(const DxilResourceBinding &B) {
|
|
return rangeLowerBound == B.rangeLowerBound &&
|
|
rangeUpperBound == B.rangeUpperBound && spaceID == B.spaceID &&
|
|
resourceClass == B.resourceClass;
|
|
}
|
|
|
|
bool DxilResourceBinding::operator!=(const DxilResourceBinding &B) {
|
|
return !(*this == B);
|
|
}
|
|
|
|
namespace resource_helper {
|
|
|
|
// The constant is as struct with int fields.
|
|
// ShaderModel 6.6 has 4 fileds.
|
|
llvm::Constant *getAsConstant(const DxilResourceBinding &B, llvm::Type *Ty,
|
|
const ShaderModel &) {
|
|
StructType *ST = cast<StructType>(Ty);
|
|
switch (ST->getNumElements()) {
|
|
case 4: {
|
|
Constant *RawDwords[] = {
|
|
ConstantInt::get(ST->getElementType(0), B.rangeLowerBound),
|
|
ConstantInt::get(ST->getElementType(1), B.rangeUpperBound),
|
|
ConstantInt::get(ST->getElementType(2), B.spaceID),
|
|
ConstantInt::get(ST->getElementType(3), B.resourceClass)};
|
|
return ConstantStruct::get(ST, RawDwords);
|
|
} break;
|
|
default:
|
|
return nullptr;
|
|
break;
|
|
}
|
|
return nullptr;
|
|
}
|
|
DxilResourceBinding loadBindingFromConstant(const llvm::Constant &C) {
|
|
DxilResourceBinding B;
|
|
|
|
// Ty Should match C.getType().
|
|
Type *Ty = C.getType();
|
|
StructType *ST = cast<StructType>(Ty);
|
|
switch (ST->getNumElements()) {
|
|
case 4: {
|
|
if (isa<ConstantAggregateZero>(&C)) {
|
|
B.rangeLowerBound = 0;
|
|
B.rangeUpperBound = 0;
|
|
B.spaceID = 0;
|
|
B.resourceClass = 0;
|
|
} else {
|
|
const ConstantStruct *CS = cast<ConstantStruct>(&C);
|
|
const Constant *rangeLowerBound = CS->getOperand(0);
|
|
const Constant *rangeUpperBound = CS->getOperand(1);
|
|
const Constant *spaceID = CS->getOperand(2);
|
|
const Constant *resourceClass = CS->getOperand(3);
|
|
B.rangeLowerBound = cast<ConstantInt>(rangeLowerBound)->getLimitedValue();
|
|
B.rangeUpperBound = cast<ConstantInt>(rangeUpperBound)->getLimitedValue();
|
|
B.spaceID = cast<ConstantInt>(spaceID)->getLimitedValue();
|
|
B.resourceClass = cast<ConstantInt>(resourceClass)->getLimitedValue();
|
|
}
|
|
} break;
|
|
default:
|
|
B.resourceClass = (uint8_t)DXIL::ResourceClass::Invalid;
|
|
break;
|
|
}
|
|
return B;
|
|
}
|
|
DxilResourceBinding loadBindingFromCreateHandleFromBinding(
|
|
const DxilInst_CreateHandleFromBinding &createHandle, llvm::Type *Ty,
|
|
const ShaderModel &) {
|
|
Constant *B = cast<Constant>(createHandle.get_bind());
|
|
return loadBindingFromConstant(*B);
|
|
}
|
|
DxilResourceBinding loadBindingFromResourceBase(DxilResourceBase *Res) {
|
|
DxilResourceBinding B = {};
|
|
B.resourceClass = (uint8_t)DXIL::ResourceClass::Invalid;
|
|
if (!Res)
|
|
return B;
|
|
B.rangeLowerBound = Res->GetLowerBound();
|
|
B.rangeUpperBound = Res->GetUpperBound();
|
|
B.spaceID = Res->GetSpaceID();
|
|
B.resourceClass = (uint8_t)Res->GetClass();
|
|
return B;
|
|
}
|
|
|
|
} // namespace resource_helper
|
|
} // namespace hlsl
|