blob: 017caddebf21ae6ffc6b8c37e340dd5edcd3f35a [file] [log] [blame] [edit]
///////////////////////////////////////////////////////////////////////////////
// //
// DxilContainerReader.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. //
// //
// Helper class for reading from dxil container. //
// //
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "dxc/DxilContainer/DxilContainer.h"
#include "dxc/Support/Global.h"
#include "dxc/Support/WinIncludes.h"
#include "llvm/ADT/STLExtras.h"
namespace hlsl {
const uint32_t DXIL_CONTAINER_BLOB_NOT_FOUND = UINT_MAX;
struct DxilContainerHeader;
//============================================================================
// DxilContainerReader
//
// Parse a DXIL or DXBC Container that you provide as input.
//
// Basic usage:
// (1) Call Load()
// (2) Call various Get*() commands to retrieve information about the
// container such as how many blobs are in it, the hash of the container,
// the version #, and most importantly retrieve all of the Blobs. You can
// retrieve blobs by searching for the FourCC, or enumerate through all of
// them. Multiple blobs can even have the same FourCC, if you choose to
// create the DXBC that way, and this parser will let you discover all of
// them.
// (3) You can parse a new container by calling Load() again, or just get rid
// of the class.
//
class DxilContainerReader {
public:
DxilContainerReader() {}
// Sets the container to be parsed, and does some
// basic integrity checking, making sure the blob FourCCs
// are all from the known list, and ensuring the version is:
// Major = DXBC_MAJOR_VERSION
// Minor = DXBC_MAJOR_VERSION
//
// Returns S_OK or E_FAIL
HRESULT Load(const void *pContainer, uint32_t containerSizeInBytes);
HRESULT GetVersion(DxilContainerVersion *pResult);
HRESULT GetPartCount(uint32_t *pResult);
HRESULT GetPartContent(uint32_t idx, const void **ppResult,
uint32_t *pResultSize = nullptr);
HRESULT GetPartFourCC(uint32_t idx, uint32_t *pResult);
HRESULT FindFirstPartKind(uint32_t kind, uint32_t *pResult);
private:
const void *m_pContainer = nullptr;
uint32_t m_uContainerSize = 0;
const DxilContainerHeader *m_pHeader = nullptr;
bool IsLoaded() const { return m_pHeader != nullptr; }
};
} // namespace hlsl