blob: c70b375181770cb006b9fc2a0bd5e5560be80694 [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// DxilContainerAssembler.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. //
// //
// Helpers for writing to dxil container. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "dxc/DxilContainer/DxilContainer.h"
#include "llvm/ADT/StringRef.h"
#include <functional>
struct IDxcVersionInfo;
struct IStream;
class DxilPipelineStateValidation;
namespace llvm {
class Module;
}
namespace hlsl {
class AbstractMemoryStream;
class DxilModule;
class RootSignatureHandle;
class ShaderModel;
namespace DXIL {
enum class SignatureKind;
}
class DxilPartWriter {
public:
virtual ~DxilPartWriter() {}
virtual uint32_t size() const = 0;
virtual void write(AbstractMemoryStream *pStream) = 0;
};
class DxilContainerWriter : public DxilPartWriter {
public:
typedef std::function<void(AbstractMemoryStream *)> WriteFn;
virtual ~DxilContainerWriter() {}
virtual void AddPart(uint32_t FourCC, uint32_t Size, WriteFn Write) = 0;
};
DxilPartWriter *NewProgramSignatureWriter(const DxilModule &M,
DXIL::SignatureKind Kind);
DxilPartWriter *NewRootSignatureWriter(const RootSignatureHandle &S);
DxilPartWriter *NewFeatureInfoWriter(const DxilModule &M);
DxilPartWriter *NewPSVWriter(const DxilModule &M,
uint32_t PSVVersion = UINT_MAX);
// DxilModule is non-const because it caches per-function flag computations
// used by both CollectShaderFlagsForModule and RDATWriter.
DxilPartWriter *NewRDATWriter(DxilModule &M);
DxilPartWriter *NewVersionWriter(IDxcVersionInfo *pVersionInfo);
// Store serialized ViewID data from DxilModule to PipelineStateValidation.
void StoreViewIDStateToPSV(const uint32_t *pInputData,
unsigned InputSizeInUInts,
DxilPipelineStateValidation &PSV);
// Load ViewID state from PSV back to DxilModule view state vector.
// Pass nullptr for pOutputData to compute and return needed OutputSizeInUInts.
unsigned LoadViewIDStateFromPSV(unsigned *pOutputData,
unsigned OutputSizeInUInts,
const DxilPipelineStateValidation &PSV);
// Unaligned is for matching container for validator version < 1.7.
DxilContainerWriter *NewDxilContainerWriter(bool bUnaligned = false);
// Set validator version to 0,0 (not validated) then re-emit as much reflection
// metadata as possible.
void ReEmitLatestReflectionData(llvm::Module *pReflectionM);
// Strip functions and serialize module.
void StripAndCreateReflectionStream(
llvm::Module *pReflectionM, uint32_t *pReflectionPartSizeInBytes,
AbstractMemoryStream **ppReflectionStreamOut);
void WriteProgramPart(const hlsl::ShaderModel *pModel,
AbstractMemoryStream *pModuleBitcode, IStream *pStream);
void SerializeDxilContainerForModule(
hlsl::DxilModule *pModule, AbstractMemoryStream *pModuleBitcode,
IDxcVersionInfo *DXCVersionInfo, AbstractMemoryStream *pStream,
llvm::StringRef DebugName, SerializeDxilFlags Flags,
DxilShaderHash *pShaderHashOut = nullptr,
AbstractMemoryStream *pReflectionStreamOut = nullptr,
AbstractMemoryStream *pRootSigStreamOut = nullptr,
void *pPrivateData = nullptr, size_t PrivateDataSize = 0);
void SerializeDxilContainerForRootSignature(
hlsl::RootSignatureHandle *pRootSigHandle, AbstractMemoryStream *pStream);
} // namespace hlsl