#pragma once #include // 对于 create_task namespace DX { inline void ThrowIfFailed(HRESULT hr) { if (FAILED(hr)) { // 在此行中设置断点,以捕获 Win32 API 错误。 throw Platform::Exception::CreateException(hr); } } // 从二进制文件中执行异步读取操作的函数。 inline Concurrency::task> ReadDataAsync(const std::wstring& filename) { using namespace Windows::Storage; using namespace Concurrency; auto folder = Windows::ApplicationModel::Package::Current->InstalledLocation; return create_task(folder->GetFileAsync(Platform::StringReference(filename.c_str()))).then([](StorageFile^ file) { return FileIO::ReadBufferAsync(file); }).then([](Streams::IBuffer^ fileBuffer) -> std::vector { std::vector returnBuffer; returnBuffer.resize(fileBuffer->Length); Streams::DataReader::FromBuffer(fileBuffer)->ReadBytes(Platform::ArrayReference(returnBuffer.data(), fileBuffer->Length)); return returnBuffer; }); } // 将使用与设备无关的像素(DIP)表示的长度转换为使用物理像素表示的长度。 inline float ConvertDipsToPixels(float dips, float dpi) { static const float dipsPerInch = 96.0f; return floorf(dips * dpi / dipsPerInch + 0.5f); // 舍入到最接近的整数。 } // 向对象分配名称以帮助调试。 #if defined(_DEBUG) inline void SetName(ID3D12Object* pObject, LPCWSTR name) { pObject->SetName(name); } #else inline void SetName(ID3D12Object*, LPCWSTR) { } #endif } // 为 ComPtr 命名 helper 函数。 // 将变量名称指定为对象名称。 #define NAME_D3D12_OBJECT(x) DX::SetName(x.Get(), L#x)