dxcapi.impl.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. ///////////////////////////////////////////////////////////////////////////////
  2. // //
  3. // dxcapi.impl.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. // Provides support for DXC API implementations. //
  9. // //
  10. ///////////////////////////////////////////////////////////////////////////////
  11. #ifndef __DXCAPI_IMPL__
  12. #define __DXCAPI_IMPL__
  13. #include "dxc/dxcapi.h"
  14. #include "dxc/Support/microcom.h"
  15. #include "llvm/Support/raw_ostream.h"
  16. // Simple adaptor for IStream. Can probably do better.
  17. class raw_stream_ostream : public llvm::raw_ostream {
  18. private:
  19. CComPtr<hlsl::AbstractMemoryStream> m_pStream;
  20. void write_impl(const char *Ptr, size_t Size) override {
  21. ULONG cbWritten;
  22. IFT(m_pStream->Write(Ptr, Size, &cbWritten));
  23. }
  24. uint64_t current_pos() const { return m_pStream->GetPosition(); }
  25. public:
  26. raw_stream_ostream(hlsl::AbstractMemoryStream* pStream) : m_pStream(pStream) { }
  27. ~raw_stream_ostream() override {
  28. flush();
  29. }
  30. };
  31. class DxcOperationResult : public IDxcOperationResult {
  32. private:
  33. DXC_MICROCOM_TM_REF_FIELDS()
  34. void Init(_In_opt_ IDxcBlob *pResultBlob,
  35. _In_opt_ IDxcBlobEncoding *pErrorBlob, HRESULT status) {
  36. m_status = status;
  37. m_result = pResultBlob;
  38. m_errors = pErrorBlob;
  39. }
  40. public:
  41. DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
  42. DXC_MICROCOM_TM_CTOR(DxcOperationResult)
  43. HRESULT m_status;
  44. CComPtr<IDxcBlob> m_result;
  45. CComPtr<IDxcBlobEncoding> m_errors;
  46. HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) {
  47. return DoBasicQueryInterface<IDxcOperationResult>(this, iid, ppvObject);
  48. }
  49. static HRESULT CreateFromResultErrorStatus(_In_opt_ IDxcBlob *pResultBlob,
  50. _In_opt_ IDxcBlobEncoding *pErrorBlob,
  51. HRESULT status,
  52. _COM_Outptr_ IDxcOperationResult **ppResult) {
  53. *ppResult = nullptr;
  54. CComPtr<DxcOperationResult> result = DxcOperationResult::Alloc(DxcGetThreadMallocNoRef());
  55. IFROOM(result.p);
  56. result->Init(pResultBlob, pErrorBlob, status);
  57. *ppResult = result.Detach();
  58. return S_OK;
  59. }
  60. static HRESULT
  61. CreateFromUtf8Strings(_In_opt_z_ LPCSTR pErrorStr,
  62. _In_opt_z_ LPCSTR pResultStr, HRESULT status,
  63. _COM_Outptr_ IDxcOperationResult **pResult) {
  64. *pResult = nullptr;
  65. CComPtr<IDxcBlobEncoding> resultBlob;
  66. CComPtr<IDxcBlobEncoding> errorBlob;
  67. CComPtr<DxcOperationResult> result;
  68. HRESULT hr = S_OK;
  69. if (pErrorStr != nullptr) {
  70. hr = hlsl::DxcCreateBlobWithEncodingOnHeapCopy(
  71. pErrorStr, strlen(pErrorStr), CP_UTF8, &errorBlob);
  72. if (FAILED(hr)) {
  73. return hr;
  74. }
  75. }
  76. if (pResultStr != nullptr) {
  77. hr = hlsl::DxcCreateBlobWithEncodingOnHeap(
  78. pResultStr, strlen(pResultStr), CP_UTF8, &resultBlob);
  79. if (FAILED(hr)) {
  80. return hr;
  81. }
  82. }
  83. return CreateFromResultErrorStatus(resultBlob, errorBlob, status, pResult);
  84. }
  85. __override HRESULT STDMETHODCALLTYPE GetStatus(_Out_ HRESULT *pStatus) {
  86. if (pStatus == nullptr)
  87. return E_INVALIDARG;
  88. *pStatus = m_status;
  89. return S_OK;
  90. }
  91. __override HRESULT STDMETHODCALLTYPE
  92. GetResult(_COM_Outptr_result_maybenull_ IDxcBlob **ppResult) {
  93. return m_result.CopyTo(ppResult);
  94. }
  95. __override HRESULT STDMETHODCALLTYPE
  96. GetErrorBuffer(_COM_Outptr_result_maybenull_ IDxcBlobEncoding **ppErrors) {
  97. return m_errors.CopyTo(ppErrors);
  98. }
  99. };
  100. #endif