118 строки
3.9 KiB
C++
118 строки
3.9 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// ComputeViewIdState.h //
|
|
// Copyright (C) Microsoft Corporation. All rights reserved. //
|
|
// This file is distributed under the University of Illinois Open Source //
|
|
// License. See LICENSE.TXT for details. //
|
|
// //
|
|
// Computes output registers dependent on ViewID. //
|
|
// Computes sets of input registers on which output registers depend. //
|
|
// Computes which input/output shapes are dynamically indexed. //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
#include "dxc/HLSL/ControlDependence.h"
|
|
#include "llvm/Pass.h"
|
|
#include "llvm/Support/GenericDomTree.h"
|
|
|
|
#include <bitset>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <set>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
|
|
namespace llvm {
|
|
class Module;
|
|
class Function;
|
|
class BasicBlock;
|
|
class Instruction;
|
|
class ReturnInst;
|
|
class Value;
|
|
class PHINode;
|
|
class AnalysisUsage;
|
|
class CallGraph;
|
|
class CallGraphNode;
|
|
class ModulePass;
|
|
class raw_ostream;
|
|
} // namespace llvm
|
|
|
|
namespace hlsl {
|
|
|
|
class DxilModule;
|
|
class DxilSignature;
|
|
class DxilSignatureElement;
|
|
|
|
struct DxilViewIdStateData {
|
|
static const unsigned kNumComps = 4;
|
|
static const unsigned kMaxSigScalars = 32 * 4;
|
|
|
|
using OutputsDependentOnViewIdType = std::bitset<kMaxSigScalars>;
|
|
using InputsContributingToOutputType = std::map<unsigned, std::set<unsigned>>;
|
|
|
|
static const unsigned kNumStreams = 4;
|
|
|
|
unsigned m_NumInputSigScalars = 0;
|
|
unsigned m_NumOutputSigScalars[kNumStreams] = {0, 0, 0, 0};
|
|
unsigned m_NumPCOrPrimSigScalars = 0;
|
|
|
|
// Set of scalar outputs dependent on ViewID.
|
|
OutputsDependentOnViewIdType m_OutputsDependentOnViewId[kNumStreams];
|
|
OutputsDependentOnViewIdType m_PCOrPrimOutputsDependentOnViewId;
|
|
|
|
// Set of scalar inputs contributing to computation of scalar outputs.
|
|
InputsContributingToOutputType m_InputsContributingToOutputs[kNumStreams];
|
|
InputsContributingToOutputType
|
|
m_InputsContributingToPCOrPrimOutputs; // HS PC and MS Prim only.
|
|
InputsContributingToOutputType m_PCInputsContributingToOutputs; // DS only.
|
|
|
|
bool m_bUsesViewId = false;
|
|
};
|
|
|
|
class DxilViewIdState : public DxilViewIdStateData {
|
|
static const unsigned kNumComps = 4;
|
|
static const unsigned kMaxSigScalars = 32 * 4;
|
|
|
|
public:
|
|
using OutputsDependentOnViewIdType = std::bitset<kMaxSigScalars>;
|
|
using InputsContributingToOutputType = std::map<unsigned, std::set<unsigned>>;
|
|
|
|
DxilViewIdState(DxilModule *pDxilModule);
|
|
|
|
unsigned getNumInputSigScalars() const;
|
|
unsigned getNumOutputSigScalars(unsigned StreamId) const;
|
|
unsigned getNumPCSigScalars() const;
|
|
const OutputsDependentOnViewIdType &
|
|
getOutputsDependentOnViewId(unsigned StreamId) const;
|
|
const OutputsDependentOnViewIdType &getPCOutputsDependentOnViewId() const;
|
|
const InputsContributingToOutputType &
|
|
getInputsContributingToOutputs(unsigned StreamId) const;
|
|
const InputsContributingToOutputType &
|
|
getInputsContributingToPCOutputs() const;
|
|
const InputsContributingToOutputType &
|
|
getPCInputsContributingToOutputs() const;
|
|
|
|
void Serialize();
|
|
const std::vector<unsigned> &GetSerialized();
|
|
const std::vector<unsigned> &
|
|
GetSerialized() const; // returns previously serialized data
|
|
void Deserialize(const unsigned *pData, unsigned DataSizeInUINTs);
|
|
void PrintSets(llvm::raw_ostream &OS);
|
|
|
|
private:
|
|
DxilModule *m_pModule;
|
|
// Serialized form.
|
|
std::vector<unsigned> m_SerializedState;
|
|
void Clear();
|
|
};
|
|
|
|
} // namespace hlsl
|
|
|
|
namespace llvm {
|
|
|
|
void initializeComputeViewIdStatePass(llvm::PassRegistry &);
|
|
llvm::ModulePass *createComputeViewIdStatePass();
|
|
|
|
} // namespace llvm
|