/////////////////////////////////////////////////////////////////////////////// // // // 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 "llvm/ADT/STLExtras.h" #include "dxc/Support/Global.h" #include "dxc/Support/WinIncludes.h" #include "dxc/DxilContainer/DxilContainer.h" namespace hlsl { #define DXIL_CONTAINER_BLOB_NOT_FOUND -1 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(_In_ const void* pContainer, _In_ uint32_t containerSizeInBytes); HRESULT GetVersion(_Out_ DxilContainerVersion *pResult); HRESULT GetPartCount(_Out_ uint32_t *pResult); HRESULT GetPartContent(uint32_t idx, _Outptr_ const void **ppResult, _Out_ uint32_t *pResultSize = nullptr); HRESULT GetPartFourCC(uint32_t idx, _Out_ uint32_t *pResult); HRESULT FindFirstPartKind(uint32_t kind, _Out_ 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