Skip to content

Commit 77272b1

Browse files
authored
Support using C++17 std::byte for FromMemory functions (#545)
1 parent 9260384 commit 77272b1

File tree

5 files changed

+210
-3
lines changed

5 files changed

+210
-3
lines changed

Auxiliary/DirectXTexXbox.h

+49
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,39 @@ namespace Xbox
132132
HRESULT __cdecl SaveToDDSMemory(_In_ const XboxImage& xbox, _Out_ DirectX::Blob& blob);
133133
HRESULT __cdecl SaveToDDSFile(_In_ const XboxImage& xbox, _In_z_ const wchar_t* szFile);
134134

135+
#ifdef __cpp_lib_byte
136+
inline HRESULT __cdecl GetMetadataFromDDSMemory(
137+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
138+
_Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox)
139+
{
140+
return GetMetadataFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, isXbox);
141+
}
142+
143+
inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(
144+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
145+
_Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox,
146+
_Out_opt_ DirectX::DDSMetaData* ddPixelFormat)
147+
{
148+
return GetMetadataFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, metadata, isXbox, ddPixelFormat);
149+
}
150+
151+
inline HRESULT __cdecl LoadFromDDSMemory(
152+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
153+
_Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image)
154+
{
155+
return LoadFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, image);
156+
}
157+
158+
inline HRESULT __cdecl LoadFromDDSMemoryEx(
159+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
160+
_Out_opt_ DirectX::TexMetadata* metadata,
161+
_Out_opt_ DirectX::DDSMetaData* ddPixelFormat,
162+
_Out_ XboxImage& image)
163+
{
164+
return LoadFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, metadata, ddPixelFormat, image);
165+
}
166+
#endif // __cpp_lib_byte
167+
135168
//---------------------------------------------------------------------------------
136169
// Xbox Texture Tiling / Detiling (requires XG DLL to be present at runtime)
137170

@@ -178,4 +211,20 @@ namespace Xbox
178211
const XboxImage& xbox,
179212
_Out_writes_bytes_(maxsize) uint8_t* pDestination, _In_ size_t maxsize) noexcept;
180213

214+
#ifdef __cpp_lib_byte
215+
inline HRESULT __cdecl EncodeDDSHeader(
216+
const XboxImage& xbox,
217+
_Out_writes_bytes_(maxsize) std::byte* pDestination, _In_ size_t maxsize) noexcept
218+
{
219+
return EncodeDDSHeader(xbox, reinterpret_cast<uint8_t*>(pDestination), maxsize);
220+
}
221+
222+
inline HRESULT __cdecl EncodeDDSHeader(
223+
const XboxImage& xbox,
224+
_Reserved_ std::nullptr_t, _In_ size_t maxsize) noexcept
225+
{
226+
return EncodeDDSHeader(xbox, static_cast<uint8_t*>(nullptr), maxsize);
227+
}
228+
#endif
229+
181230
} // namespace

CMakeLists.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -319,13 +319,13 @@ endif()
319319

320320
if(directxmath_FOUND)
321321
message(STATUS "Using DirectXMath package")
322-
target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectXMath)
322+
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectXMath)
323323
endif()
324324

325325
if(directx-headers_FOUND)
326326
message(STATUS "Using DirectX-Headers package")
327-
target_link_libraries(${PROJECT_NAME} PUBLIC Microsoft::DirectX-Headers)
328-
target_compile_definitions(${PROJECT_NAME} PUBLIC USING_DIRECTX_HEADERS)
327+
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::DirectX-Headers)
328+
target_compile_definitions(${PROJECT_NAME} PRIVATE USING_DIRECTX_HEADERS)
329329
target_compile_options(${PROJECT_NAME} PRIVATE $<$<CXX_COMPILER_ID:MSVC,Intel>:/wd4062> $<$<CXX_COMPILER_ID:Clang,IntelLLVM>:-Wno-switch-enum>)
330330
endif()
331331

DirectXTex/DirectXTex.h

+68
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,34 @@ namespace DirectX
382382
_In_z_ const wchar_t* szFile,
383383
_Out_ TexMetadata& metadata) noexcept;
384384

385+
#ifdef __cpp_lib_byte
386+
HRESULT __cdecl GetMetadataFromDDSMemory(
387+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
388+
_In_ DDS_FLAGS flags,
389+
_Out_ TexMetadata& metadata) noexcept;
390+
HRESULT __cdecl GetMetadataFromDDSMemoryEx(
391+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
392+
_In_ DDS_FLAGS flags,
393+
_Out_ TexMetadata& metadata,
394+
_Out_opt_ DDSMetaData* ddPixelFormat) noexcept;
395+
HRESULT __cdecl GetMetadataFromHDRMemory(
396+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
397+
_Out_ TexMetadata& metadata) noexcept;
398+
HRESULT __cdecl GetMetadataFromTGAMemory(
399+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
400+
_In_ TGA_FLAGS flags,
401+
_Out_ TexMetadata& metadata) noexcept;
402+
403+
#ifdef _WIN32
404+
HRESULT __cdecl GetMetadataFromWICMemory(
405+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
406+
_In_ WIC_FLAGS flags,
407+
_Out_ TexMetadata& metadata,
408+
_In_ std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR = nullptr);
409+
#endif
410+
#endif // __cpp_lib_byte
411+
412+
385413
//---------------------------------------------------------------------------------
386414
// Bitmap image container
387415
struct Image
@@ -590,6 +618,34 @@ namespace DirectX
590618
HRESULT __cdecl SaveToTGAMemory(_In_ const Image& image, _Out_ Blob& blob, _In_opt_ const TexMetadata* metadata = nullptr) noexcept;
591619
HRESULT __cdecl SaveToTGAFile(_In_ const Image& image, _In_z_ const wchar_t* szFile, _In_opt_ const TexMetadata* metadata = nullptr) noexcept;
592620

621+
#ifdef __cpp_lib_byte
622+
HRESULT __cdecl LoadFromDDSMemory(
623+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
624+
_In_ DDS_FLAGS flags,
625+
_Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
626+
HRESULT __cdecl LoadFromDDSMemoryEx(
627+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
628+
_In_ DDS_FLAGS flags,
629+
_Out_opt_ TexMetadata* metadata,
630+
_Out_opt_ DDSMetaData* ddPixelFormat,
631+
_Out_ ScratchImage& image) noexcept;
632+
HRESULT __cdecl LoadFromHDRMemory(
633+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
634+
_Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
635+
HRESULT __cdecl LoadFromTGAMemory(
636+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
637+
_In_ TGA_FLAGS flags,
638+
_Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept;
639+
640+
#ifdef _WIN32
641+
HRESULT __cdecl LoadFromWICMemory(
642+
_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size,
643+
_In_ WIC_FLAGS flags,
644+
_Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image,
645+
_In_ std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR = nullptr);
646+
#endif
647+
#endif // __cpp_lib_byte
648+
593649
//---------------------------------------------------------------------------------
594650
// Texture conversion, resizing, mipmap generation, and block compression
595651

@@ -959,6 +1015,18 @@ namespace DirectX
9591015
_Out_writes_bytes_to_opt_(maxsize, required) uint8_t* pDestination, _In_ size_t maxsize,
9601016
_Out_ size_t& required) noexcept;
9611017

1018+
#ifdef __cpp_lib_byte
1019+
HRESULT __cdecl EncodeDDSHeader(
1020+
_In_ const TexMetadata& metadata, DDS_FLAGS flags,
1021+
_Out_writes_bytes_to_opt_(maxsize, required) std::byte* pDestination, _In_ size_t maxsize,
1022+
_Out_ size_t& required) noexcept;
1023+
1024+
HRESULT __cdecl EncodeDDSHeader(
1025+
_In_ const TexMetadata& metadata, DDS_FLAGS flags,
1026+
_Reserved_ std::nullptr_t, _In_ size_t maxsize,
1027+
_Out_ size_t& required) noexcept;
1028+
#endif
1029+
9621030
//---------------------------------------------------------------------------------
9631031
// Direct3D interop
9641032

DirectXTex/DirectXTex.inl

+82
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,85 @@ inline HRESULT __cdecl SaveToTGAFile(const Image& image, const wchar_t* szFile,
190190
{
191191
return SaveToTGAFile(image, TGA_FLAGS_NONE, szFile, metadata);
192192
}
193+
194+
195+
//=====================================================================================
196+
// C++17 helpers
197+
//=====================================================================================
198+
#ifdef __cpp_lib_byte
199+
200+
_Use_decl_annotations_
201+
inline HRESULT __cdecl GetMetadataFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata) noexcept
202+
{
203+
return GetMetadataFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata);
204+
}
205+
206+
_Use_decl_annotations_
207+
inline HRESULT __cdecl LoadFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept
208+
{
209+
return LoadFromDDSMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image);
210+
}
211+
212+
_Use_decl_annotations_
213+
inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata, DDSMetaData* ddPixelFormat) noexcept
214+
{
215+
return GetMetadataFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, ddPixelFormat);
216+
}
217+
218+
_Use_decl_annotations_
219+
inline HRESULT __cdecl LoadFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, DDSMetaData* ddPixelFormat, ScratchImage& image) noexcept
220+
{
221+
return LoadFromDDSMemoryEx(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, ddPixelFormat, image);
222+
}
223+
224+
_Use_decl_annotations_
225+
inline HRESULT __cdecl GetMetadataFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata& metadata) noexcept
226+
{
227+
return GetMetadataFromHDRMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata);
228+
}
229+
230+
_Use_decl_annotations_
231+
inline HRESULT __cdecl LoadFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept
232+
{
233+
return LoadFromHDRMemory(reinterpret_cast<const uint8_t*>(pSource), size, metadata, image);
234+
}
235+
236+
_Use_decl_annotations_
237+
inline HRESULT __cdecl GetMetadataFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata& metadata) noexcept
238+
{
239+
return GetMetadataFromTGAMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata);
240+
}
241+
242+
_Use_decl_annotations_
243+
inline HRESULT __cdecl LoadFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept
244+
{
245+
return LoadFromTGAMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image);
246+
}
247+
248+
_Use_decl_annotations_
249+
inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::byte* pDestination, size_t maxsize, size_t& required) noexcept
250+
{
251+
return EncodeDDSHeader(metadata, flags, reinterpret_cast<uint8_t*>(pDestination), maxsize, required);
252+
}
253+
254+
_Use_decl_annotations_
255+
inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::nullptr_t, size_t maxsize, size_t& required) noexcept
256+
{
257+
return EncodeDDSHeader(metadata, flags, static_cast<uint8_t*>(nullptr), maxsize, required);
258+
}
259+
260+
#ifdef _WIN32
261+
_Use_decl_annotations_
262+
inline HRESULT __cdecl GetMetadataFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata& metadata, std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR)
263+
{
264+
return GetMetadataFromWICMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, getMQR);
265+
}
266+
267+
_Use_decl_annotations_
268+
inline HRESULT __cdecl LoadFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata* metadata, ScratchImage& image, std::function<void __cdecl(IWICMetadataQueryReader*)> getMQR)
269+
{
270+
return LoadFromWICMemory(reinterpret_cast<const uint8_t*>(pSource), size, flags, metadata, image, getMQR);
271+
}
272+
#endif // _WIN32
273+
274+
#endif // __cpp_lib_byte

ScreenGrab/ScreenGrab12.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -853,15 +853,23 @@ namespace
853853

854854
hr = commandList->Close();
855855
if (FAILED(hr))
856+
{
857+
(*pStaging)->Release();
858+
*pStaging = nullptr;
856859
return hr;
860+
}
857861

858862
// Execute the command list
859863
pCommandQ->ExecuteCommandLists(1, CommandListCast(commandList.GetAddressOf()));
860864

861865
// Signal the fence
862866
hr = pCommandQ->Signal(fence.Get(), 1);
863867
if (FAILED(hr))
868+
{
869+
(*pStaging)->Release();
870+
*pStaging = nullptr;
864871
return hr;
872+
}
865873

866874
// Block until the copy is complete
867875
while (fence->GetCompletedValue() < 1)

0 commit comments

Comments
 (0)