DxilContainerReader.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // DxilContainerReader.h //
  4. // Copyright (C) Microsoft Corporation. All rights reserved. //
  5. // This file is distributed under the University of Illinois Open Source //
  6. // License. See LICENSE.TXT for details. //
  7. // //
  8. // Helper class for reading from dxil container. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #include "dxc/Support/Global.h"
  12. #include "dxc/Support/WinAdapter.h"
  13. #include "dxc/DxilContainer/DxilContainer.h"
  14. #include "dxc/DxilContainer/DxilContainerReader.h"
  15. namespace hlsl {
  16. HRESULT DxilContainerReader::Load(_In_ const void* pContainer, _In_ uint32_t containerSizeInBytes) {
  17. if (pContainer == nullptr) {
  18. return E_FAIL;
  19. }
  20. const DxilContainerHeader *pHeader = IsDxilContainerLike(pContainer, containerSizeInBytes);
  21. if (pHeader == nullptr) {
  22. return E_FAIL;
  23. }
  24. if (!IsValidDxilContainer(pHeader, containerSizeInBytes)) {
  25. return E_FAIL;
  26. }
  27. m_pContainer = pContainer;
  28. m_uContainerSize = containerSizeInBytes;
  29. m_pHeader = pHeader;
  30. return S_OK;
  31. }
  32. HRESULT DxilContainerReader::GetVersion(_Out_ DxilContainerVersion *pResult) {
  33. if (pResult == nullptr) return E_POINTER;
  34. if (!IsLoaded()) return E_NOT_VALID_STATE;
  35. *pResult = m_pHeader->Version;
  36. return S_OK;
  37. }
  38. HRESULT DxilContainerReader::GetPartCount(_Out_ uint32_t *pResult) {
  39. if (pResult == nullptr) return E_POINTER;
  40. if (!IsLoaded()) return E_NOT_VALID_STATE;
  41. *pResult = m_pHeader->PartCount;
  42. return S_OK;
  43. }
  44. HRESULT DxilContainerReader::GetPartContent(uint32_t idx, _Outptr_ const void **ppResult, _Out_ uint32_t *pResultSize) {
  45. if (ppResult == nullptr) return E_POINTER;
  46. *ppResult = nullptr;
  47. if (!IsLoaded()) return E_NOT_VALID_STATE;
  48. if (idx >= m_pHeader->PartCount) return E_BOUNDS;
  49. const DxilPartHeader *pPart = GetDxilContainerPart(m_pHeader, idx);
  50. *ppResult = GetDxilPartData(pPart);
  51. if (pResultSize != nullptr) {
  52. *pResultSize = pPart->PartSize;
  53. }
  54. return S_OK;
  55. }
  56. HRESULT DxilContainerReader::GetPartFourCC(uint32_t idx, _Out_ uint32_t *pResult) {
  57. if (pResult == nullptr) return E_POINTER;
  58. if (!IsLoaded()) return E_NOT_VALID_STATE;
  59. if (idx >= m_pHeader->PartCount) return E_BOUNDS;
  60. const DxilPartHeader *pPart = GetDxilContainerPart(m_pHeader, idx);
  61. *pResult = pPart->PartFourCC;
  62. return S_OK;
  63. }
  64. HRESULT DxilContainerReader::FindFirstPartKind(uint32_t kind, _Out_ uint32_t *pResult) {
  65. if (pResult == nullptr) return E_POINTER;
  66. *pResult = 0;
  67. if (!IsLoaded()) return E_NOT_VALID_STATE;
  68. DxilPartIterator it = std::find_if(begin(m_pHeader), end(m_pHeader), DxilPartIsType(kind));
  69. *pResult = (it == end(m_pHeader)) ? DXIL_CONTAINER_BLOB_NOT_FOUND : it.index;
  70. return S_OK;
  71. }
  72. } // namespace hlsl