mirror of
https://github.com/microsoft/DirectXTex
synced 2024-12-17 23:21:06 +00:00
DDSView updated with -forcesrgb switch (#305)
This commit is contained in:
parent
e4f5af944c
commit
fa9967bc74
@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include "DirectXTex.h"
|
#include "DirectXTex.h"
|
||||||
|
|
||||||
|
#include <shellapi.h>
|
||||||
|
|
||||||
using namespace DirectX;
|
using namespace DirectX;
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
@ -69,21 +71,21 @@ namespace
|
|||||||
HWND g_hWnd = nullptr;
|
HWND g_hWnd = nullptr;
|
||||||
D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;
|
D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL;
|
||||||
D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;
|
D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0;
|
||||||
ID3D11Device* g_pd3dDevice = nullptr;
|
ID3D11Device* g_pd3dDevice = nullptr;
|
||||||
ID3D11DeviceContext* g_pImmediateContext = nullptr;
|
ID3D11DeviceContext* g_pImmediateContext = nullptr;
|
||||||
IDXGISwapChain* g_pSwapChain = nullptr;
|
IDXGISwapChain* g_pSwapChain = nullptr;
|
||||||
ID3D11RenderTargetView* g_pRenderTargetView = nullptr;
|
ID3D11RenderTargetView* g_pRenderTargetView = nullptr;
|
||||||
ID3D11Texture2D* g_pDepthStencil = nullptr;
|
ID3D11Texture2D* g_pDepthStencil = nullptr;
|
||||||
ID3D11DepthStencilView* g_pDepthStencilView = nullptr;
|
ID3D11DepthStencilView* g_pDepthStencilView = nullptr;
|
||||||
ID3D11VertexShader* g_pVertexShader = nullptr;
|
ID3D11VertexShader* g_pVertexShader = nullptr;
|
||||||
ID3D11PixelShader* g_pPixelShader = nullptr;
|
ID3D11PixelShader* g_pPixelShader = nullptr;
|
||||||
ID3D11InputLayout* g_pVertexLayout = nullptr;
|
ID3D11InputLayout* g_pVertexLayout = nullptr;
|
||||||
ID3D11Buffer* g_pVertexBuffer = nullptr;
|
ID3D11Buffer* g_pVertexBuffer = nullptr;
|
||||||
ID3D11Buffer* g_pIndexBuffer = nullptr;
|
ID3D11Buffer* g_pIndexBuffer = nullptr;
|
||||||
ID3D11Buffer* g_pCBArrayControl = nullptr;
|
ID3D11Buffer* g_pCBArrayControl = nullptr;
|
||||||
ID3D11ShaderResourceView* g_pSRV = nullptr;
|
ID3D11ShaderResourceView* g_pSRV = nullptr;
|
||||||
ID3D11BlendState* g_AlphaBlendState = nullptr;
|
ID3D11BlendState* g_AlphaBlendState = nullptr;
|
||||||
ID3D11SamplerState* g_pSamplerLinear = nullptr;
|
ID3D11SamplerState* g_pSamplerLinear = nullptr;
|
||||||
|
|
||||||
UINT g_iCurrentIndex = 0;
|
UINT g_iCurrentIndex = 0;
|
||||||
UINT g_iMaxIndex = 1;
|
UINT g_iMaxIndex = 1;
|
||||||
@ -108,31 +110,59 @@ int WINAPI wWinMain(
|
|||||||
_In_ LPWSTR lpCmdLine,
|
_In_ LPWSTR lpCmdLine,
|
||||||
_In_ int nCmdShow)
|
_In_ int nCmdShow)
|
||||||
{
|
{
|
||||||
|
static const wchar_t* c_usage = L"Usage: ddsview [-forcesrgb] <filename>";
|
||||||
|
|
||||||
if (!*lpCmdLine)
|
if (!*lpCmdLine)
|
||||||
{
|
{
|
||||||
MessageBoxW(nullptr, L"Usage: ddsview <filename>", g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, c_usage, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int argc = 0;
|
||||||
|
auto argList = CommandLineToArgvW(lpCmdLine, &argc);
|
||||||
|
|
||||||
|
const wchar_t* filename = nullptr;
|
||||||
|
bool forceSRGB = false;
|
||||||
|
for(int i = 0; i < argc; ++i)
|
||||||
|
{
|
||||||
|
if (*argList[i] == '-' || *argList[i] == '/')
|
||||||
|
{
|
||||||
|
if (_wcsicmp(argList[i]+1, L"forcesrgb") == 0)
|
||||||
|
{
|
||||||
|
forceSRGB = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!filename)
|
||||||
|
{
|
||||||
|
filename = argList[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filename)
|
||||||
|
{
|
||||||
|
MessageBoxW(nullptr, c_usage, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
TexMetadata mdata;
|
TexMetadata mdata;
|
||||||
HRESULT hr = GetMetadataFromDDSFile(lpCmdLine, DDS_FLAGS_NONE, mdata);
|
HRESULT hr = GetMetadataFromDDSFile(filename, DDS_FLAGS_NONE, mdata);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Failed to open texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast<unsigned int>(hr));
|
swprintf_s(buff, L"Failed to open texture file\n\nFilename = %ls\nHRESULT %08X", filename, static_cast<unsigned int>(hr));
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FAILED(InitWindow(hInstance, nCmdShow, mdata)))
|
if (FAILED(InitWindow(hInstance, nCmdShow, mdata)))
|
||||||
return 0;
|
return 1;
|
||||||
|
|
||||||
SetWindowTextW(g_hWnd, lpCmdLine);
|
SetWindowTextW(g_hWnd, filename);
|
||||||
|
|
||||||
if (FAILED(InitDevice(mdata)))
|
if (FAILED(InitDevice(mdata)))
|
||||||
{
|
{
|
||||||
CleanupDevice();
|
CleanupDevice();
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mdata.dimension == TEX_DIMENSION_TEXTURE3D)
|
if (mdata.dimension == TEX_DIMENSION_TEXTURE3D)
|
||||||
@ -140,9 +170,9 @@ int WINAPI wWinMain(
|
|||||||
if (mdata.arraySize > 1)
|
if (mdata.arraySize > 1)
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Arrays of volume textures are not supported\n\nFilename = %ls\nArray size %zu", lpCmdLine, mdata.arraySize);
|
swprintf_s(buff, L"Arrays of volume textures are not supported\n\nFilename = %ls\nArray size %zu", filename, mdata.arraySize);
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_iMaxIndex = static_cast<UINT>(mdata.depth);
|
g_iMaxIndex = static_cast<UINT>(mdata.depth);
|
||||||
@ -152,9 +182,9 @@ int WINAPI wWinMain(
|
|||||||
if (g_featureLevel < D3D_FEATURE_LEVEL_10_0)
|
if (g_featureLevel < D3D_FEATURE_LEVEL_10_0)
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Texture arrays require DirectX 10 hardware or later\n\nFilename = %ls\nArray size %zu", lpCmdLine, mdata.arraySize);
|
swprintf_s(buff, L"Texture arrays require DirectX 10 hardware or later\n\nFilename = %ls\nArray size %zu", filename, mdata.arraySize);
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_iMaxIndex = static_cast<UINT>(mdata.arraySize);
|
g_iMaxIndex = static_cast<UINT>(mdata.arraySize);
|
||||||
@ -171,9 +201,9 @@ int WINAPI wWinMain(
|
|||||||
if (g_featureLevel < D3D_FEATURE_LEVEL_10_0)
|
if (g_featureLevel < D3D_FEATURE_LEVEL_10_0)
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"BC4/BC5 requires DirectX 10 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", lpCmdLine, mdata.format, g_featureLevel);
|
swprintf_s(buff, L"BC4/BC5 requires DirectX 10 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", filename, mdata.format, g_featureLevel);
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -186,9 +216,9 @@ int WINAPI wWinMain(
|
|||||||
if (g_featureLevel < D3D_FEATURE_LEVEL_11_0)
|
if (g_featureLevel < D3D_FEATURE_LEVEL_11_0)
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"BC6H/BC7 requires DirectX 11 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", lpCmdLine, mdata.format, g_featureLevel);
|
swprintf_s(buff, L"BC6H/BC7 requires DirectX 11 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", filename, mdata.format, g_featureLevel);
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -200,34 +230,40 @@ int WINAPI wWinMain(
|
|||||||
if (FAILED(hr) || !(flags & required))
|
if (FAILED(hr) || !(flags & required))
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Format not supported by this DirectX hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d\nHRESULT = %08X", lpCmdLine, mdata.format, g_featureLevel, static_cast<unsigned int>(hr));
|
swprintf_s(buff, L"Format not supported by this DirectX hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d\nHRESULT = %08X", filename, mdata.format, g_featureLevel, static_cast<unsigned int>(hr));
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ScratchImage image;
|
ScratchImage image;
|
||||||
hr = LoadFromDDSFile(lpCmdLine, DDS_FLAGS_NONE, &mdata, image);
|
hr = LoadFromDDSFile(filename, DDS_FLAGS_NONE, &mdata, image);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Failed to load texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast<unsigned int>(hr));
|
swprintf_s(buff, L"Failed to load texture file\n\nFilename = %ls\nHRESULT %08X", filename, static_cast<unsigned int>(hr));
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Special case to make sure Texture cubes remain arrays
|
// Special case to make sure Texture cubes remain arrays
|
||||||
mdata.miscFlags &= ~TEX_MISC_TEXTURECUBE;
|
mdata.miscFlags &= ~TEX_MISC_TEXTURECUBE;
|
||||||
|
|
||||||
|
if (forceSRGB)
|
||||||
|
{
|
||||||
|
mdata.format = MakeSRGB(mdata.format);
|
||||||
|
image.OverrideFormat(mdata.format);
|
||||||
|
}
|
||||||
|
|
||||||
hr = CreateShaderResourceView(g_pd3dDevice, image.GetImages(), image.GetImageCount(), mdata, &g_pSRV);
|
hr = CreateShaderResourceView(g_pd3dDevice, image.GetImages(), image.GetImageCount(), mdata, &g_pSRV);
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
wchar_t buff[2048] = {};
|
wchar_t buff[2048] = {};
|
||||||
swprintf_s(buff, L"Failed creating texture from file\n\nFilename = %ls\nHRESULT = %08X", lpCmdLine, static_cast<unsigned int>(hr));
|
swprintf_s(buff, L"Failed creating texture from file\n\nFilename = %ls\nHRESULT = %08X", filename, static_cast<unsigned int>(hr));
|
||||||
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION);
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main message loop
|
// Main message loop
|
||||||
|
Loading…
Reference in New Issue
Block a user