DirectXShaderCompiler/include/dxc/Support/dxcapi.impl.h

120 строки
3.9 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// //
// dxcapi.impl.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. //
// //
// Provides support for DXC API implementations. //
// //
///////////////////////////////////////////////////////////////////////////////
#ifndef __DXCAPI_IMPL__
#define __DXCAPI_IMPL__
#include "dxc/dxcapi.h"
#include "dxc/Support/microcom.h"
#include "llvm/Support/raw_ostream.h"
// Simple adaptor for IStream. Can probably do better.
class raw_stream_ostream : public llvm::raw_ostream {
private:
CComPtr<hlsl::AbstractMemoryStream> m_pStream;
void write_impl(const char *Ptr, size_t Size) override {
ULONG cbWritten;
IFT(m_pStream->Write(Ptr, Size, &cbWritten));
}
uint64_t current_pos() const override { return m_pStream->GetPosition(); }
public:
raw_stream_ostream(hlsl::AbstractMemoryStream* pStream) : m_pStream(pStream) { }
~raw_stream_ostream() override {
flush();
}
};
class DxcOperationResult : public IDxcOperationResult {
private:
DXC_MICROCOM_TM_REF_FIELDS()
void Init(_In_opt_ IDxcBlob *pResultBlob,
_In_opt_ IDxcBlobEncoding *pErrorBlob, HRESULT status) {
m_status = status;
m_result = pResultBlob;
m_errors = pErrorBlob;
}
public:
DXC_MICROCOM_TM_ADDREF_RELEASE_IMPL()
DXC_MICROCOM_TM_CTOR(DxcOperationResult)
HRESULT m_status;
CComPtr<IDxcBlob> m_result;
CComPtr<IDxcBlobEncoding> m_errors;
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject) override {
return DoBasicQueryInterface<IDxcOperationResult>(this, iid, ppvObject);
}
static HRESULT CreateFromResultErrorStatus(_In_opt_ IDxcBlob *pResultBlob,
_In_opt_ IDxcBlobEncoding *pErrorBlob,
HRESULT status,
_COM_Outptr_ IDxcOperationResult **ppResult) {
*ppResult = nullptr;
CComPtr<DxcOperationResult> result = DxcOperationResult::Alloc(DxcGetThreadMallocNoRef());
IFROOM(result.p);
result->Init(pResultBlob, pErrorBlob, status);
*ppResult = result.Detach();
return S_OK;
}
static HRESULT
CreateFromUtf8Strings(_In_opt_z_ LPCSTR pErrorStr,
_In_opt_z_ LPCSTR pResultStr, HRESULT status,
_COM_Outptr_ IDxcOperationResult **pResult) {
*pResult = nullptr;
CComPtr<IDxcBlobEncoding> resultBlob;
CComPtr<IDxcBlobEncoding> errorBlob;
CComPtr<DxcOperationResult> result;
HRESULT hr = S_OK;
if (pErrorStr != nullptr) {
hr = hlsl::DxcCreateBlobWithEncodingOnHeapCopy(
pErrorStr, strlen(pErrorStr), CP_UTF8, &errorBlob);
if (FAILED(hr)) {
return hr;
}
}
if (pResultStr != nullptr) {
hr = hlsl::DxcCreateBlobWithEncodingOnHeap(
pResultStr, strlen(pResultStr), CP_UTF8, &resultBlob);
if (FAILED(hr)) {
return hr;
}
}
return CreateFromResultErrorStatus(resultBlob, errorBlob, status, pResult);
}
HRESULT STDMETHODCALLTYPE GetStatus(_Out_ HRESULT *pStatus) override {
if (pStatus == nullptr)
return E_INVALIDARG;
*pStatus = m_status;
return S_OK;
}
HRESULT STDMETHODCALLTYPE
GetResult(_COM_Outptr_result_maybenull_ IDxcBlob **ppResult) override {
return m_result.CopyTo(ppResult);
}
HRESULT STDMETHODCALLTYPE
GetErrorBuffer(_COM_Outptr_result_maybenull_ IDxcBlobEncoding **ppErrors) override {
return m_errors.CopyTo(ppErrors);
}
};
#endif