blob: 058be2250f988361d289be650c70a114403af4df [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// DxilSubobject.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. //
// //
// Defines Subobject types for DxilModule. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "DxilConstants.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/StringRef.h"
#include <map>
#include <memory>
#include <unordered_map>
#include <vector>
namespace hlsl {
class DxilSubobjects;
namespace RDAT {
class DxilRuntimeData;
}
class DxilSubobject {
public:
using Kind = DXIL::SubobjectKind;
DxilSubobject() = delete;
DxilSubobject(const DxilSubobject &other) = delete;
DxilSubobject(DxilSubobject &&other);
~DxilSubobject();
DxilSubobject &operator=(const DxilSubobject &other) = delete;
Kind GetKind() const { return m_Kind; }
llvm::StringRef GetName() const { return m_Name; }
// Note: strings and root signature data is owned by DxilModule
// When creating subobjects, use canonical strings from module
bool GetStateObjectConfig(uint32_t &Flags) const;
bool GetRootSignature(bool local, const void *&Data, uint32_t &Size,
const char **pText = nullptr) const;
bool GetSubobjectToExportsAssociation(llvm::StringRef &Subobject,
const char *const *&Exports,
uint32_t &NumExports) const;
bool GetRaytracingShaderConfig(uint32_t &MaxPayloadSizeInBytes,
uint32_t &MaxAttributeSizeInBytes) const;
bool GetRaytracingPipelineConfig(uint32_t &MaxTraceRecursionDepth) const;
bool GetRaytracingPipelineConfig1(uint32_t &MaxTraceRecursionDepth,
uint32_t &Flags) const;
bool GetHitGroup(DXIL::HitGroupType &hitGroupType, llvm::StringRef &AnyHit,
llvm::StringRef &ClosestHit,
llvm::StringRef &Intersection) const;
private:
DxilSubobject(DxilSubobjects &owner, Kind kind, llvm::StringRef name);
DxilSubobject(DxilSubobjects &owner, const DxilSubobject &other,
llvm::StringRef name);
void CopyUnionedContents(const DxilSubobject &other);
void InternStrings();
DxilSubobjects &m_Owner;
Kind m_Kind;
llvm::StringRef m_Name;
std::vector<const char *> m_Exports;
struct StateObjectConfig_t {
uint32_t Flags; // DXIL::StateObjectFlags
};
struct RootSignature_t {
uint32_t Size;
const void *Data;
const char *Text; // can be null
};
struct SubobjectToExportsAssociation_t {
const char *Subobject;
// see m_Exports for export list
};
struct RaytracingShaderConfig_t {
uint32_t MaxPayloadSizeInBytes;
uint32_t MaxAttributeSizeInBytes;
};
struct RaytracingPipelineConfig_t {
uint32_t MaxTraceRecursionDepth;
};
struct RaytracingPipelineConfig1_t {
uint32_t MaxTraceRecursionDepth;
uint32_t Flags; // DXIL::RaytracingPipelineFlags
};
struct HitGroup_t {
DXIL::HitGroupType Type;
const char *AnyHit;
const char *ClosestHit;
const char *Intersection;
};
union {
StateObjectConfig_t StateObjectConfig;
RootSignature_t RootSignature;
SubobjectToExportsAssociation_t SubobjectToExportsAssociation;
RaytracingShaderConfig_t RaytracingShaderConfig;
RaytracingPipelineConfig_t RaytracingPipelineConfig;
HitGroup_t HitGroup;
RaytracingPipelineConfig1_t RaytracingPipelineConfig1;
};
friend class DxilSubobjects;
};
class DxilSubobjects {
public:
typedef std::pair<std::unique_ptr<char[]>, size_t> StoredBytes;
typedef llvm::MapVector<llvm::StringRef, StoredBytes> BytesStorage;
typedef llvm::MapVector<llvm::StringRef, std::unique_ptr<DxilSubobject>>
SubobjectStorage;
using Kind = DXIL::SubobjectKind;
DxilSubobjects();
DxilSubobjects(const DxilSubobjects &other) = delete;
DxilSubobjects(DxilSubobjects &&other);
~DxilSubobjects();
DxilSubobjects &operator=(const DxilSubobjects &other) = delete;
// Add/find string in owned subobject strings, returning canonical ptr
llvm::StringRef InternString(llvm::StringRef value);
// Add/find raw bytes, returning canonical ptr
const void *InternRawBytes(const void *ptr, size_t size);
DxilSubobject *FindSubobject(llvm::StringRef name);
void RemoveSubobject(llvm::StringRef name);
DxilSubobject &CloneSubobject(const DxilSubobject &Subobject,
llvm::StringRef Name);
const SubobjectStorage &GetSubobjects() const { return m_Subobjects; }
// Create DxilSubobjects
DxilSubobject &CreateStateObjectConfig(llvm::StringRef Name, uint32_t Flags);
// Local/Global RootSignature
DxilSubobject &CreateRootSignature(llvm::StringRef Name, bool local,
const void *Data, uint32_t Size,
llvm::StringRef *pText = nullptr);
DxilSubobject &CreateSubobjectToExportsAssociation(llvm::StringRef Name,
llvm::StringRef Subobject,
llvm::StringRef *Exports,
uint32_t NumExports);
DxilSubobject &CreateRaytracingShaderConfig(llvm::StringRef Name,
uint32_t MaxPayloadSizeInBytes,
uint32_t MaxAttributeSizeInBytes);
DxilSubobject &
CreateRaytracingPipelineConfig(llvm::StringRef Name,
uint32_t MaxTraceRecursionDepth);
DxilSubobject &CreateRaytracingPipelineConfig1(
llvm::StringRef Name, uint32_t MaxTraceRecursionDepth, uint32_t Flags);
DxilSubobject &CreateHitGroup(llvm::StringRef Name,
DXIL::HitGroupType hitGroupType,
llvm::StringRef AnyHit,
llvm::StringRef ClosestHit,
llvm::StringRef Intersection);
private:
DxilSubobject &CreateSubobject(Kind kind, llvm::StringRef Name);
BytesStorage m_BytesStorage;
SubobjectStorage m_Subobjects;
};
bool LoadSubobjectsFromRDAT(DxilSubobjects &subobjects,
const RDAT::DxilRuntimeData &rdat);
} // namespace hlsl