Added Ex variants to DX9 DDSTextureLoader, WICTextureLoader (#198)

This commit is contained in:
Chuck Walbourn 2020-09-28 15:05:15 -07:00 коммит произвёл GitHub
Родитель 80f38c3903
Коммит 61bdcf751c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
4 изменённых файлов: 430 добавлений и 46 удалений

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

@ -733,6 +733,8 @@ namespace
_In_ const DDS_HEADER* header, _In_ const DDS_HEADER* header,
_In_reads_bytes_(bitSize) const uint8_t* bitData, _In_reads_bytes_(bitSize) const uint8_t* bitData,
_In_ size_t bitSize, _In_ size_t bitSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_Outptr_ LPDIRECT3DBASETEXTURE9* texture, _Outptr_ LPDIRECT3DBASETEXTURE9* texture,
bool generateMipsIfMissing) noexcept bool generateMipsIfMissing) noexcept
{ {
@ -776,15 +778,22 @@ namespace
// Create the volume texture (let the runtime do the validation) // Create the volume texture (let the runtime do the validation)
ComPtr<IDirect3DVolumeTexture9> pTexture; ComPtr<IDirect3DVolumeTexture9> pTexture;
hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount, hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount,
0, fmt, D3DPOOL_DEFAULT, pTexture.GetAddressOf(), nullptr); usage, fmt, pool, pTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
ComPtr<IDirect3DVolumeTexture9> pStagingTexture; ComPtr<IDirect3DVolumeTexture9> pStagingTexture;
if (pool == D3DPOOL_DEFAULT)
{
hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount, hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount,
0, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
else
{
pStagingTexture = pTexture;
}
// Lock, fill, unlock // Lock, fill, unlock
size_t NumBytes = 0; size_t NumBytes = 0;
@ -841,9 +850,12 @@ namespace
iDepth = 1; iDepth = 1;
} }
if (pool == D3DPOOL_DEFAULT)
{
hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get()); hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get());
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
*texture = pTexture.Detach(); *texture = pTexture.Detach();
} }
@ -864,15 +876,22 @@ namespace
// Create the cubemap (let the runtime do the validation) // Create the cubemap (let the runtime do the validation)
ComPtr<IDirect3DCubeTexture9> pTexture; ComPtr<IDirect3DCubeTexture9> pTexture;
hr = device->CreateCubeTexture(iWidth, iMipCount, hr = device->CreateCubeTexture(iWidth, iMipCount,
0, fmt, D3DPOOL_DEFAULT, pTexture.GetAddressOf(), nullptr); usage, fmt, pool, pTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
ComPtr<IDirect3DCubeTexture9> pStagingTexture; ComPtr<IDirect3DCubeTexture9> pStagingTexture;
if (pool == D3DPOOL_DEFAULT)
{
hr = device->CreateCubeTexture(iWidth, iMipCount, hr = device->CreateCubeTexture(iWidth, iMipCount,
0, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
else
{
pStagingTexture = pTexture;
}
// Lock, fill, unlock // Lock, fill, unlock
size_t NumBytes = 0; size_t NumBytes = 0;
@ -926,9 +945,12 @@ namespace
} }
} }
if (pool == D3DPOOL_DEFAULT)
{
hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get()); hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get());
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
*texture = pTexture.Detach(); *texture = pTexture.Detach();
} }
@ -941,19 +963,28 @@ namespace
} }
// Create the texture (let the runtime do the validation) // Create the texture (let the runtime do the validation)
if (generateMipsIfMissing)
usage |= D3DUSAGE_AUTOGENMIPMAP;
ComPtr<IDirect3DTexture9> pTexture; ComPtr<IDirect3DTexture9> pTexture;
hr = device->CreateTexture(iWidth, iHeight, iMipCount, hr = device->CreateTexture(iWidth, iHeight, iMipCount,
generateMipsIfMissing ? D3DUSAGE_AUTOGENMIPMAP : 0u, usage, fmt, pool,
fmt, D3DPOOL_DEFAULT,
pTexture.GetAddressOf(), nullptr); pTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
ComPtr<IDirect3DTexture9> pStagingTexture; ComPtr<IDirect3DTexture9> pStagingTexture;
if (pool == D3DPOOL_DEFAULT)
{
hr = device->CreateTexture(iWidth, iHeight, iMipCount, hr = device->CreateTexture(iWidth, iHeight, iMipCount,
0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
else
{
pStagingTexture = pTexture;
}
// Lock, fill, unlock // Lock, fill, unlock
size_t NumBytes = 0; size_t NumBytes = 0;
@ -998,9 +1029,12 @@ namespace
iHeight = 1; iHeight = 1;
} }
if (pool == D3DPOOL_DEFAULT)
{
hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get()); hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get());
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
*texture = pTexture.Detach(); *texture = pTexture.Detach();
} }
@ -1017,6 +1051,19 @@ HRESULT DirectX::CreateDDSTextureFromMemory(
size_t ddsDataSize, size_t ddsDataSize,
LPDIRECT3DBASETEXTURE9* texture, LPDIRECT3DBASETEXTURE9* texture,
bool generateMipsIfMissing) noexcept bool generateMipsIfMissing) noexcept
{
return CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, texture);
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromMemoryEx(
LPDIRECT3DDEVICE9 d3dDevice,
const uint8_t* ddsData,
size_t ddsDataSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
LPDIRECT3DBASETEXTURE9* texture) noexcept
{ {
if (texture) if (texture)
{ {
@ -1046,11 +1093,13 @@ HRESULT DirectX::CreateDDSTextureFromMemory(
header, header,
bitData, bitData,
bitSize, bitSize,
usage,
pool,
texture, texture,
generateMipsIfMissing); generateMipsIfMissing);
} }
// Type-specific versions // Type-specific standard versions
_Use_decl_annotations_ _Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromMemory( HRESULT DirectX::CreateDDSTextureFromMemory(
LPDIRECT3DDEVICE9 d3dDevice, LPDIRECT3DDEVICE9 d3dDevice,
@ -1068,7 +1117,7 @@ HRESULT DirectX::CreateDDSTextureFromMemory(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemory(d3dDevice, ddsData, ddsDataSize, tex.GetAddressOf(), generateMipsIfMissing); HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;
@ -1098,7 +1147,7 @@ HRESULT DirectX::CreateDDSTextureFromMemory(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemory(d3dDevice, ddsData, ddsDataSize, tex.GetAddressOf(), false); HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;
@ -1128,7 +1177,105 @@ HRESULT DirectX::CreateDDSTextureFromMemory(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemory(d3dDevice, ddsData, ddsDataSize, tex.GetAddressOf(), false); HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_VOLUMETEXTURE)
{
*texture = static_cast<LPDIRECT3DVOLUMETEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
// Type-specific extended versions
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromMemoryEx(
LPDIRECT3DDEVICE9 d3dDevice,
const uint8_t* ddsData,
size_t ddsDataSize,
DWORD usage,
D3DPOOL pool,
bool generateMipsIfMissing,
LPDIRECT3DTEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !ddsData || !ddsDataSize || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, usage, pool, generateMipsIfMissing, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_TEXTURE)
{
*texture = static_cast<LPDIRECT3DTEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromMemoryEx(
LPDIRECT3DDEVICE9 d3dDevice,
const uint8_t* ddsData,
size_t ddsDataSize,
DWORD usage,
D3DPOOL pool,
LPDIRECT3DCUBETEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !ddsData || !ddsDataSize || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, usage, pool, false, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_CUBETEXTURE)
{
*texture = static_cast<LPDIRECT3DCUBETEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromMemoryEx(
LPDIRECT3DDEVICE9 d3dDevice,
const uint8_t* ddsData,
size_t ddsDataSize,
DWORD usage,
D3DPOOL pool,
LPDIRECT3DVOLUMETEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !ddsData || !ddsDataSize || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, usage, pool, false, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;
@ -1150,6 +1297,18 @@ HRESULT DirectX::CreateDDSTextureFromFile(
const wchar_t* fileName, const wchar_t* fileName,
LPDIRECT3DBASETEXTURE9* texture, LPDIRECT3DBASETEXTURE9* texture,
bool generateMipsIfMissing) noexcept bool generateMipsIfMissing) noexcept
{
return CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, texture);
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromFileEx(
LPDIRECT3DDEVICE9 d3dDevice,
const wchar_t* fileName,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
LPDIRECT3DBASETEXTURE9* texture) noexcept
{ {
if (texture) if (texture)
{ {
@ -1180,11 +1339,13 @@ HRESULT DirectX::CreateDDSTextureFromFile(
header, header,
bitData, bitData,
bitSize, bitSize,
usage,
pool,
texture, texture,
generateMipsIfMissing); generateMipsIfMissing);
} }
// Type-specific versions // Type-specific standard versions
_Use_decl_annotations_ _Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromFile( HRESULT DirectX::CreateDDSTextureFromFile(
LPDIRECT3DDEVICE9 d3dDevice, LPDIRECT3DDEVICE9 d3dDevice,
@ -1201,7 +1362,7 @@ HRESULT DirectX::CreateDDSTextureFromFile(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFile(d3dDevice, fileName, tex.GetAddressOf(), generateMipsIfMissing); HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;
@ -1230,7 +1391,7 @@ HRESULT DirectX::CreateDDSTextureFromFile(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFile(d3dDevice, fileName, tex.GetAddressOf(), false); HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;
@ -1259,7 +1420,102 @@ HRESULT DirectX::CreateDDSTextureFromFile(
return E_INVALIDARG; return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex; ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFile(d3dDevice, szFileName, tex.GetAddressOf(), false); HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_VOLUMETEXTURE)
{
*texture = static_cast<LPDIRECT3DVOLUMETEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
// Type-specific extended versions
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromFileEx(
LPDIRECT3DDEVICE9 d3dDevice,
const wchar_t* fileName,
DWORD usage,
D3DPOOL pool,
bool generateMipsIfMissing,
LPDIRECT3DTEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !fileName || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, usage, pool, generateMipsIfMissing, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_TEXTURE)
{
*texture = static_cast<LPDIRECT3DTEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromFileEx(
LPDIRECT3DDEVICE9 d3dDevice,
const wchar_t* fileName,
DWORD usage,
D3DPOOL pool,
LPDIRECT3DCUBETEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !fileName || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, usage, pool, false, tex.GetAddressOf());
if (SUCCEEDED(hr))
{
hr = E_FAIL;
if (tex->GetType() == D3DRTYPE_CUBETEXTURE)
{
*texture = static_cast<LPDIRECT3DCUBETEXTURE9>(tex.Detach());
return S_OK;
}
}
return hr;
}
_Use_decl_annotations_
HRESULT DirectX::CreateDDSTextureFromFileEx(
LPDIRECT3DDEVICE9 d3dDevice,
const wchar_t* szFileName,
DWORD usage,
D3DPOOL pool,
LPDIRECT3DVOLUMETEXTURE9* texture) noexcept
{
if (texture)
{
*texture = nullptr;
}
if (!d3dDevice || !szFileName || !texture)
return E_INVALIDARG;
ComPtr<IDirect3DBaseTexture9> tex;
HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, usage, pool, false, tex.GetAddressOf());
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {
hr = E_FAIL; hr = E_FAIL;

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

@ -40,7 +40,25 @@ namespace DirectX
_Outptr_ LPDIRECT3DBASETEXTURE9* texture, _Outptr_ LPDIRECT3DBASETEXTURE9* texture,
bool generateMipsIfMissing = false) noexcept; bool generateMipsIfMissing = false) noexcept;
// Type-specific versions // Extended version
HRESULT CreateDDSTextureFromMemoryEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
_In_ size_t ddsDataSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
_Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromFileEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
_Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept;
// Type-specific standard versions
HRESULT CreateDDSTextureFromMemory( HRESULT CreateDDSTextureFromMemory(
_In_ LPDIRECT3DDEVICE9 d3dDevice, _In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
@ -75,4 +93,52 @@ namespace DirectX
_In_ LPDIRECT3DDEVICE9 d3dDevice, _In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName, _In_z_ const wchar_t* fileName,
_Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept;
// Type-specific extended versions
HRESULT CreateDDSTextureFromMemoryEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
_In_ size_t ddsDataSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromFileEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName,
_In_ DWORD usage,
_In_ D3DPOOL pool,
bool generateMipsIfMissing,
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromMemoryEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
_In_ size_t ddsDataSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromFileEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromMemoryEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(ddsDataSize) const uint8_t* ddsData,
_In_ size_t ddsDataSize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept;
HRESULT CreateDDSTextureFromFileEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept;
} }

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

@ -261,6 +261,8 @@ namespace
_In_ LPDIRECT3DDEVICE9 device, _In_ LPDIRECT3DDEVICE9 device,
_In_ IWICBitmapFrameDecode* frame, _In_ IWICBitmapFrameDecode* frame,
_In_ size_t maxsize, _In_ size_t maxsize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_In_ unsigned int loadFlags, _In_ unsigned int loadFlags,
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept
{ {
@ -344,21 +346,30 @@ namespace
} }
// Create texture // Create texture
if (loadFlags & WIC_LOADER_MIP_AUTOGEN)
usage |= D3DUSAGE_AUTOGENMIPMAP;
ComPtr<IDirect3DTexture9> pTexture; ComPtr<IDirect3DTexture9> pTexture;
hr = device->CreateTexture(twidth, theight, 1u, hr = device->CreateTexture(twidth, theight, 1u,
(loadFlags & WIC_LOADER_MIP_AUTOGEN) ? D3DUSAGE_AUTOGENMIPMAP : 0u, usage, format, pool,
format, D3DPOOL_DEFAULT,
pTexture.GetAddressOf(), nullptr); pTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
// Create staging texture memory // Create staging texture memory
ComPtr<IDirect3DTexture9> pStagingTexture; ComPtr<IDirect3DTexture9> pStagingTexture;
if (pool == D3DPOOL_DEFAULT)
{
hr = device->CreateTexture(twidth, theight, 1u, hr = device->CreateTexture(twidth, theight, 1u,
0u, format, D3DPOOL_SYSTEMMEM, 0u, format, D3DPOOL_SYSTEMMEM,
pStagingTexture.GetAddressOf(), nullptr); pStagingTexture.GetAddressOf(), nullptr);
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
else
{
pStagingTexture = pTexture;
}
D3DLOCKED_RECT LockedRect = {}; D3DLOCKED_RECT LockedRect = {};
hr = pStagingTexture->LockRect(0, &LockedRect, nullptr, 0); hr = pStagingTexture->LockRect(0, &LockedRect, nullptr, 0);
@ -495,9 +506,12 @@ namespace
return hr; return hr;
} }
if (pool == D3DPOOL_DEFAULT)
{
hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get()); hr = device->UpdateTexture(pStagingTexture.Get(), pTexture.Get());
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
}
*texture = pTexture.Detach(); *texture = pTexture.Detach();
@ -514,6 +528,21 @@ HRESULT DirectX::CreateWICTextureFromMemory(
LPDIRECT3DTEXTURE9* texture, LPDIRECT3DTEXTURE9* texture,
size_t maxsize, size_t maxsize,
unsigned int loadFlags) noexcept unsigned int loadFlags) noexcept
{
return CreateWICTextureFromMemoryEx(d3dDevice, wicData, wicDataSize, maxsize, 0u, D3DPOOL_DEFAULT, loadFlags, texture);
}
_Use_decl_annotations_
HRESULT DirectX::CreateWICTextureFromMemoryEx(
LPDIRECT3DDEVICE9 d3dDevice,
const uint8_t* wicData,
size_t wicDataSize,
_In_ size_t maxsize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_In_ unsigned int loadFlags,
LPDIRECT3DTEXTURE9* texture) noexcept
{ {
if (texture) if (texture)
{ {
@ -554,7 +583,7 @@ HRESULT DirectX::CreateWICTextureFromMemory(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
return CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, loadFlags, texture); return CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, usage, pool, loadFlags, texture);
} }
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
@ -565,6 +594,19 @@ HRESULT DirectX::CreateWICTextureFromFile(
LPDIRECT3DTEXTURE9* texture, LPDIRECT3DTEXTURE9* texture,
size_t maxsize, size_t maxsize,
unsigned int loadFlags) noexcept unsigned int loadFlags) noexcept
{
return CreateWICTextureFromFileEx(d3dDevice, fileName, maxsize, 0u, D3DPOOL_DEFAULT, loadFlags, texture);
}
_Use_decl_annotations_
HRESULT DirectX::CreateWICTextureFromFileEx(
LPDIRECT3DDEVICE9 d3dDevice,
const wchar_t* fileName,
size_t maxsize,
DWORD usage,
D3DPOOL pool,
unsigned int loadFlags,
LPDIRECT3DTEXTURE9* texture) noexcept
{ {
if (texture) if (texture)
{ {
@ -593,5 +635,5 @@ HRESULT DirectX::CreateWICTextureFromFile(
if (FAILED(hr)) if (FAILED(hr))
return hr; return hr;
return CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, loadFlags, texture); return CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, usage, pool, loadFlags, texture);
} }

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

@ -55,4 +55,24 @@ namespace DirectX
_Outptr_ LPDIRECT3DTEXTURE9* texture, _Outptr_ LPDIRECT3DTEXTURE9* texture,
_In_ size_t maxsize = 0, _In_ size_t maxsize = 0,
_In_ unsigned int loadFlags = 0) noexcept; _In_ unsigned int loadFlags = 0) noexcept;
// Extended version
HRESULT CreateWICTextureFromMemoryEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_reads_bytes_(wicDataSize) const uint8_t* wicData,
_In_ size_t wicDataSize,
_In_ size_t maxsize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_In_ unsigned int loadFlags,
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept;
HRESULT CreateWICTextureFromFileEx(
_In_ LPDIRECT3DDEVICE9 d3dDevice,
_In_z_ const wchar_t* fileName,
_In_ size_t maxsize,
_In_ DWORD usage,
_In_ D3DPOOL pool,
_In_ unsigned int loadFlags,
_Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept;
} }