Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions include/dxc/DXIL/DxilModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ class DxilModule {
// Intermediate options that do not make it to DXIL
void SetLegacyResourceReservation(bool legacyResourceReservation);
bool GetLegacyResourceReservation() const;
void SetKeepAllResources(bool keepAllResources);
bool GetKeepAllResources() const;
void ClearIntermediateOptions();

// Hull and Domain shaders.
Expand Down Expand Up @@ -346,6 +348,8 @@ class DxilModule {

enum IntermediateFlags : uint32_t {
LegacyResourceReservation = 1 << 0,
KeepAllResources =
1 << 2 // To be compatible with ConsistentBindings in different PR
};

llvm::LLVMContext &m_Ctx;
Expand Down
5 changes: 3 additions & 2 deletions include/dxc/HLSL/HLModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ struct HLOptions {
bDisableOptimizations(false), PackingStrategy(0),
bUseMinPrecision(false), bDX9CompatMode(false), bFXCCompatMode(false),
bLegacyResourceReservation(false), bForceZeroStoreLifetimes(false),
unused(0) {}
bKeepAllResources(false), unused(0) {}
uint32_t GetHLOptionsRaw() const;
void SetHLOptionsRaw(uint32_t data);
unsigned bDefaultRowMajor : 1;
Expand All @@ -70,7 +70,8 @@ struct HLOptions {
unsigned bLegacyResourceReservation : 1;
unsigned bForceZeroStoreLifetimes : 1;
unsigned bResMayAlias : 1;
unsigned unused : 19;
unsigned bKeepAllResources : 1;
unsigned unused : 18;
};

typedef std::unordered_map<const llvm::Function *,
Expand Down
1 change: 1 addition & 0 deletions include/dxc/Support/HLSLOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ class DxcOpts {
std::string TimeTrace = ""; // OPT_ftime_trace[EQ]
unsigned TimeTraceGranularity = 500; // OPT_ftime_trace_granularity_EQ
bool VerifyDiagnostics = false; // OPT_verify
bool KeepAllResources = false; // OPT_keep_all_resources

// Optimization pass enables, disables and selects
OptimizationToggles
Expand Down
3 changes: 3 additions & 0 deletions include/dxc/Support/HLSLOptions.td
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,9 @@ def getprivate : JoinedOrSeparate<["-", "/"], "getprivate">, Flags<[DriverOption
def nologo : Flag<["-", "/"], "nologo">, Group<hlslcore_Group>, Flags<[DriverOption, HelpHidden]>,
HelpText<"Suppress copyright message">;

def keep_all_resources : Flag<["-", "/"], "keep-all-resources">, Group<hlslcomp_Group>, Flags<[CoreOption]>,
HelpText<"Keep even optimized out resources for dxil reflection purposes.">;

//////////////////////////////////////////////////////////////////////////////
// Rewriter Options

Expand Down
10 changes: 10 additions & 0 deletions lib/DXIL/DxilModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -586,6 +586,16 @@ bool DxilModule::GetLegacyResourceReservation() const {
return (m_IntermediateFlags & LegacyResourceReservation) != 0;
}

void DxilModule::SetKeepAllResources(bool keepAllResources) {
m_IntermediateFlags &= ~KeepAllResources;
if (keepAllResources)
m_IntermediateFlags |= KeepAllResources;
}

bool DxilModule::GetKeepAllResources() const {
return (m_IntermediateFlags & KeepAllResources) != 0;
}

void DxilModule::ClearIntermediateOptions() { m_IntermediateFlags = 0; }

unsigned DxilModule::GetInputControlPointCount() const {
Expand Down
4 changes: 4 additions & 0 deletions lib/DxcSupport/HLSLOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,10 @@ int ReadDxcOpts(const OptTable *optionTable, unsigned flagsToInclude,
opts.TimeReport = Args.hasFlag(OPT_ftime_report, OPT_INVALID, false);
opts.TimeTrace = Args.hasFlag(OPT_ftime_trace, OPT_INVALID, false) ? "-" : "";
opts.VerifyDiagnostics = Args.hasFlag(OPT_verify, OPT_INVALID, false);

opts.KeepAllResources =
Args.hasFlag(OPT_keep_all_resources, OPT_INVALID, false);

if (Args.hasArg(OPT_ftime_trace_EQ))
opts.TimeTrace = Args.getLastArgValue(OPT_ftime_trace_EQ);
if (Arg *A = Args.getLastArg(OPT_ftime_trace_granularity_EQ)) {
Expand Down
20 changes: 14 additions & 6 deletions lib/HLSL/DxilCondenseResources.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -550,7 +550,8 @@ class DxilLowerCreateHandleForLib : public ModulePass {
ResourceRegisterAllocator.GatherReservedRegisters(DM);

// Remove unused resources.
DM.RemoveResourcesWithUnusedSymbols();
if (!DM.GetKeepAllResources())
DM.RemoveResourcesWithUnusedSymbols();

unsigned newResources = DM.GetCBuffers().size() + DM.GetUAVs().size() +
DM.GetSRVs().size() + DM.GetSamplers().size();
Expand All @@ -564,7 +565,9 @@ class DxilLowerCreateHandleForLib : public ModulePass {
bool bLocalChanged = LegalizeResources(M, DVC);
if (bLocalChanged) {
// Remove unused resources.
DM.RemoveResourcesWithUnusedSymbols();

if (!DM.GetKeepAllResources())
DM.RemoveResourcesWithUnusedSymbols();
}
bChanged |= bLocalChanged;
}
Expand Down Expand Up @@ -2122,6 +2125,15 @@ void DxilLowerCreateHandleForLib::ReplaceResourceUserWithHandle(
void DxilLowerCreateHandleForLib::TranslateDxilResourceUses(
DxilResourceBase &res) {
OP *hlslOP = m_DM->GetOP();

Value *GV = res.GetGlobalSymbol();

if (isa<UndefValue>(GV))
return;

DXASSERT(isa<GlobalValue>(GV), "DxilLowerCreateHandleForLib cannot deal with "
"resources that aren't GlobalValue.");

// Generate createHandleFromBinding for sm66 and later.
bool bCreateFromBinding = m_DM->GetShaderModel()->IsSM66Plus();
OP::OpCode createOp = bCreateFromBinding ? OP::OpCode::CreateHandleFromBinding
Expand Down Expand Up @@ -2149,10 +2161,6 @@ void DxilLowerCreateHandleForLib::TranslateDxilResourceUses(

Value *isUniformRes = hlslOP->GetI1Const(0);

Value *GV = res.GetGlobalSymbol();
DXASSERT(isa<GlobalValue>(GV),
"DxilLowerCreateHandleForLib cannot deal with unused resources.");

Module *pM = m_DM->GetModule();
// TODO: add debug info to create handle.
DIVariable *DIV = nullptr;
Expand Down
1 change: 1 addition & 0 deletions lib/HLSL/DxilGenerationPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ void InitDxilModuleFromHLModule(HLModule &H, DxilModule &M, bool HasDebugInfo) {
// bool m_bDisableOptimizations;
M.SetDisableOptimization(H.GetHLOptions().bDisableOptimizations);
M.SetLegacyResourceReservation(H.GetHLOptions().bLegacyResourceReservation);
M.SetKeepAllResources(H.GetHLOptions().bKeepAllResources);
// bool m_bDisableMathRefactoring;
// bool m_bEnableDoublePrecision;
// bool m_bEnableDoubleExtensions;
Expand Down
17 changes: 11 additions & 6 deletions lib/HLSL/HLModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,12 +231,13 @@ void HLModule::RemoveFunction(llvm::Function *F) {
namespace {
template <typename TResource>
bool RemoveResource(std::vector<std::unique_ptr<TResource>> &vec,
GlobalVariable *pVariable, bool keepAllocated) {
GlobalVariable *pVariable, bool keepAllocated,
bool keepAllResources) {
for (auto p = vec.begin(), e = vec.end(); p != e; ++p) {
if ((*p)->GetGlobalSymbol() != pVariable)
continue;

if (keepAllocated && (*p)->IsAllocated()) {
if ((keepAllocated && (*p)->IsAllocated()) || keepAllResources) {
// Keep the resource, but it has no more symbol.
(*p)->SetGlobalSymbol(UndefValue::get(pVariable->getType()));
} else {
Expand All @@ -262,16 +263,20 @@ void HLModule::RemoveGlobal(llvm::GlobalVariable *GV) {
// register range from being allocated to other resources.
bool keepAllocated = GetHLOptions().bLegacyResourceReservation;

// Keep all resources is for reflection purposes to simulate -Od with -spirv
// for dxil.
bool keepAllResources = GetHLOptions().bKeepAllResources;

// This could be considerably faster - check variable type to see which
// resource type this is rather than scanning all lists, and look for
// usage and removal patterns.
if (RemoveResource(m_CBuffers, GV, keepAllocated))
if (RemoveResource(m_CBuffers, GV, keepAllocated, keepAllResources))
return;
if (RemoveResource(m_SRVs, GV, keepAllocated))
if (RemoveResource(m_SRVs, GV, keepAllocated, keepAllResources))
return;
if (RemoveResource(m_UAVs, GV, keepAllocated))
if (RemoveResource(m_UAVs, GV, keepAllocated, keepAllResources))
return;
if (RemoveResource(m_Samplers, GV, keepAllocated))
if (RemoveResource(m_Samplers, GV, keepAllocated, keepAllResources))
return;
// TODO: do m_TGSMVariables and m_StreamOutputs need maintenance?
}
Expand Down
2 changes: 2 additions & 0 deletions tools/clang/include/clang/Frontend/CodeGenOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,8 @@ class CodeGenOptions : public CodeGenOptionsBase {
bool HLSLOnlyWarnOnUnrollFail = false;
/// Whether use legacy resource reservation.
bool HLSLLegacyResourceReservation = false;
/// Whether to keep bindings even if they're optimized out.
bool HLSLKeepAllResources = false;
/// Set [branch] on every if.
bool HLSLPreferControlFlow = false;
/// Set [flatten] on every if.
Expand Down
1 change: 1 addition & 0 deletions tools/clang/lib/CodeGen/CGHLSLMS.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ CGMSHLSLRuntime::CGMSHLSLRuntime(CodeGenModule &CGM)
opts.PackingStrategy = CGM.getCodeGenOpts().HLSLSignaturePackingStrategy;
opts.bLegacyResourceReservation =
CGM.getCodeGenOpts().HLSLLegacyResourceReservation;
opts.bKeepAllResources = CGM.getCodeGenOpts().HLSLKeepAllResources;
opts.bForceZeroStoreLifetimes =
CGM.getCodeGenOpts().HLSLForceZeroStoreLifetimes;

Expand Down
1 change: 1 addition & 0 deletions tools/clang/tools/dxcompiler/dxcompilerobj.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1602,6 +1602,7 @@ class DxcCompiler : public IDxcCompiler3,
compiler.getCodeGenOpts().HLSLAvoidControlFlow = Opts.AvoidFlowControl;
compiler.getCodeGenOpts().HLSLLegacyResourceReservation =
Opts.LegacyResourceReservation;
compiler.getCodeGenOpts().HLSLKeepAllResources = Opts.KeepAllResources;
compiler.getCodeGenOpts().HLSLDefines = defines;
compiler.getCodeGenOpts().HLSLPreciseOutputs = Opts.PreciseOutputs;
compiler.getCodeGenOpts().MainFileName = pMainFile;
Expand Down