Code review for shared helpers

This commit is contained in:
Chuck Walbourn 2021-01-06 00:45:54 -08:00
Родитель 556caba51f
Коммит a6e52b155a
5 изменённых файлов: 38 добавлений и 9 удалений

Просмотреть файл

@ -11,6 +11,8 @@
#pragma once #pragma once
#include <malloc.h> #include <malloc.h>
#include <cstddef>
#include <exception> #include <exception>
@ -29,9 +31,10 @@ namespace DirectX
// Allocate aligned memory. // Allocate aligned memory.
static void* operator new (size_t size) static void* operator new (size_t size)
{ {
const size_t alignment = __alignof(TDerived); const size_t alignment = alignof(TDerived);
static_assert(alignment > 8, "AlignedNew is only useful for types with > 8 byte alignment. Did you forget a __declspec(align) on TDerived?"); static_assert(alignment > 8, "AlignedNew is only useful for types with > 8 byte alignment. Did you forget a __declspec(align) on TDerived?");
static_assert(((alignment - 1) & alignment) == 0, "AlignedNew only works with power of two alignment");
void* ptr = _aligned_malloc(size, alignment); void* ptr = _aligned_malloc(size, alignment);

Просмотреть файл

@ -44,8 +44,16 @@ BinaryReader::BinaryReader(_In_reads_bytes_(dataSize) uint8_t const* dataBlob, s
// Reads from the filesystem into memory. // Reads from the filesystem into memory.
HRESULT BinaryReader::ReadEntireFile(_In_z_ wchar_t const* fileName, _Inout_ std::unique_ptr<uint8_t[]>& data, _Out_ size_t* dataSize) HRESULT BinaryReader::ReadEntireFile(
_In_z_ wchar_t const* fileName,
_Inout_ std::unique_ptr<uint8_t[]>& data,
_Out_ size_t* dataSize)
{ {
if (!fileName || !dataSize)
return E_INVALIDARG;
*dataSize = 0;
// Open the file. // Open the file.
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr)));

Просмотреть файл

@ -22,7 +22,13 @@ namespace DirectX
T* result = comPtr.Get(); T* result = comPtr.Get();
// Double-checked lock pattern. // Double-checked lock pattern.
#ifdef _MSC_VER
MemoryBarrier(); MemoryBarrier();
#elif defined(__GNUC__)
__sync_synchronize();
#else
#error Unknown memory barrier syntax
#endif
if (!result) if (!result)
{ {
@ -37,7 +43,11 @@ namespace DirectX
createFunc(&result) createFunc(&result)
); );
#ifdef _MSC_VER
MemoryBarrier(); MemoryBarrier();
#elif defined(__GNUC__)
__sync_synchronize();
#endif
comPtr.Attach(result); comPtr.Attach(result);
} }

Просмотреть файл

@ -296,6 +296,8 @@ namespace DirectX
return E_POINTER; return E_POINTER;
} }
*bitSize = 0;
if (ddsDataSize > UINT32_MAX) if (ddsDataSize > UINT32_MAX)
{ {
return E_FAIL; return E_FAIL;
@ -328,7 +330,7 @@ namespace DirectX
(MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC))
{ {
// Must be long enough for both headers and magic value // Must be long enough for both headers and magic value
if (ddsDataSize < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) if (ddsDataSize < (sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10)))
{ {
return E_FAIL; return E_FAIL;
} }
@ -360,6 +362,8 @@ namespace DirectX
return E_POINTER; return E_POINTER;
} }
*bitSize = 0;
// open the file // open the file
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
ScopedHandle hFile(safe_handle(CreateFile2(fileName, ScopedHandle hFile(safe_handle(CreateFile2(fileName,
@ -409,19 +413,21 @@ namespace DirectX
} }
// read the data in // read the data in
DWORD BytesRead = 0; DWORD bytesRead = 0;
if (!ReadFile(hFile.get(), if (!ReadFile(hFile.get(),
ddsData.get(), ddsData.get(),
fileInfo.EndOfFile.LowPart, fileInfo.EndOfFile.LowPart,
&BytesRead, &bytesRead,
nullptr nullptr
)) ))
{ {
ddsData.reset();
return HRESULT_FROM_WIN32(GetLastError()); return HRESULT_FROM_WIN32(GetLastError());
} }
if (BytesRead < fileInfo.EndOfFile.LowPart) if (bytesRead < fileInfo.EndOfFile.LowPart)
{ {
ddsData.reset();
return E_FAIL; return E_FAIL;
} }
@ -429,6 +435,7 @@ namespace DirectX
auto dwMagicNumber = *reinterpret_cast<const uint32_t*>(ddsData.get()); auto dwMagicNumber = *reinterpret_cast<const uint32_t*>(ddsData.get());
if (dwMagicNumber != DDS_MAGIC) if (dwMagicNumber != DDS_MAGIC)
{ {
ddsData.reset();
return E_FAIL; return E_FAIL;
} }
@ -438,6 +445,7 @@ namespace DirectX
if (hdr->size != sizeof(DDS_HEADER) || if (hdr->size != sizeof(DDS_HEADER) ||
hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) hdr->ddspf.size != sizeof(DDS_PIXELFORMAT))
{ {
ddsData.reset();
return E_FAIL; return E_FAIL;
} }
@ -447,8 +455,9 @@ namespace DirectX
(MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC))
{ {
// Must be long enough for both headers and magic value // Must be long enough for both headers and magic value
if (fileInfo.EndOfFile.LowPart < (sizeof(DDS_HEADER) + sizeof(uint32_t) + sizeof(DDS_HEADER_DXT10))) if (fileInfo.EndOfFile.LowPart < (sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10)))
{ {
ddsData.reset();
return E_FAIL; return E_FAIL;
} }

Просмотреть файл

@ -70,7 +70,6 @@ namespace DirectX
#endif #endif
} }
// Helper smart-pointers // Helper smart-pointers
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) || (defined(_XBOX_ONE) && defined(_TITLE)) || !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) || (defined(_XBOX_ONE) && defined(_TITLE)) || !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)
struct virtual_deleter { void operator()(void* p) noexcept { if (p) VirtualFree(p, 0, MEM_RELEASE); } }; struct virtual_deleter { void operator()(void* p) noexcept { if (p) VirtualFree(p, 0, MEM_RELEASE); } };