From 9e34fadda08b856ca8afb69b996c46a8659223f3 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Sun, 27 Mar 2022 17:29:48 -0700 Subject: [PATCH] DDSView sample cleanup and added to CMake --- CMakeLists.txt | 15 +- DDSView/ddsview.cpp | 542 +++++++++++++++++++++++--------------------- DDSView/ddsview.fx | 42 ++-- 3 files changed, 323 insertions(+), 276 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 61e8ad8..750f4e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,8 @@ project (DirectXTex option(BUILD_TOOLS "Build tex command-line tools" ON) +option(BUILD_SAMPLE "Build DDSView sample" ON) + # Includes the functions for Direct3D 11 resources and DirectCompute compression option(BUILD_DX11 "Build with DirectX11 Runtime support" ON) @@ -244,6 +246,17 @@ if(BUILD_TOOLS AND WIN32 AND (NOT WINDOWS_STORE)) endif() endif() +#--- DDSView sample +if(BUILD_SAMPLE AND WIN32 AND (NOT WINDOWS_STORE)) + list(APPEND TOOL_EXES ddsview) + + add_executable(ddsview WIN32 + DDSView/ddsview.cpp + DDSView/ddsview.rc) + target_link_libraries(ddsview ${PROJECT_NAME} d3d11.lib) + source_group(ddsview REGULAR_EXPRESSION DDSView/*.*) +endif() + if(MSVC) foreach(t IN LISTS TOOL_EXES ITEMS ${PROJECT_NAME}) target_compile_options(${t} PRIVATE /fp:fast "$<$>:/guard:cf>") @@ -264,7 +277,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") # OpenMP is not supported for clang for Windows by default - set(WarningsEXE ${WarningsLib} "-Wno-c++98-compat" "-Wno-c++98-compat-pedantic" "-Wno-switch" "-Wno-switch-enum" "-Wno-language-extension-token" "-Wno-missing-prototypes" "-Wno-global-constructors" "-Wno-double-promotion") + set(WarningsEXE ${WarningsLib} "-Wno-c++98-compat" "-Wno-c++98-compat-pedantic" "-Wno-switch" "-Wno-switch-enum" "-Wno-covered-switch-default" "-Wno-language-extension-token" "-Wno-missing-prototypes" "-Wno-global-constructors" "-Wno-double-promotion") foreach(t IN LISTS TOOL_EXES) target_compile_options(${t} PRIVATE ${WarningsEXE}) endforeach() diff --git a/DDSView/ddsview.cpp b/DDSView/ddsview.cpp index f16989a..4a1172f 100644 --- a/DDSView/ddsview.cpp +++ b/DDSView/ddsview.cpp @@ -1,7 +1,7 @@ //-------------------------------------------------------------------------------------- // File: DDSView.cpp // -// DirectX 11 DDS File Viewer +// DirectX 11 DDS File Viewer sample for DirectXTex // // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. @@ -13,8 +13,12 @@ #include #include +#include +#include #include #include +#include +#include #include #include @@ -47,6 +51,8 @@ struct CBArrayControl //-------------------------------------------------------------------------------------- +namespace +{ // fxc ddsview.fx /nologo /EVS /Tvs_4_1 /Fhshaders\vs.h #include "shaders\vs.h" @@ -67,70 +73,76 @@ struct CBArrayControl // fxc ddsview.fx /nologo /EPS_Cube /Tps_4_1 /Fhshaders\psCube.h #include "shaders\psCube.h" +} //-------------------------------------------------------------------------------------- -HINSTANCE g_hInst = nullptr; -HWND g_hWnd = nullptr; -D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL; -D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0; -ID3D11Device* g_pd3dDevice = nullptr; -ID3D11DeviceContext* g_pImmediateContext = nullptr; -IDXGISwapChain* g_pSwapChain = nullptr; -ID3D11RenderTargetView* g_pRenderTargetView = nullptr; -ID3D11Texture2D* g_pDepthStencil = nullptr; -ID3D11DepthStencilView* g_pDepthStencilView = nullptr; -ID3D11VertexShader* g_pVertexShader = nullptr; -ID3D11PixelShader* g_pPixelShader = nullptr; -ID3D11InputLayout* g_pVertexLayout = nullptr; -ID3D11Buffer* g_pVertexBuffer = nullptr; -ID3D11Buffer* g_pIndexBuffer = nullptr; -ID3D11Buffer* g_pCBArrayControl = nullptr; -ID3D11ShaderResourceView* g_pSRV = nullptr; -ID3D11BlendState* g_AlphaBlendState = nullptr; -ID3D11SamplerState* g_pSamplerLinear = nullptr; +namespace +{ + HINSTANCE g_hInst = nullptr; + HWND g_hWnd = nullptr; + D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL; + D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0; + ID3D11Device* g_pd3dDevice = nullptr; + ID3D11DeviceContext* g_pImmediateContext = nullptr; + IDXGISwapChain* g_pSwapChain = nullptr; + ID3D11RenderTargetView* g_pRenderTargetView = nullptr; + ID3D11Texture2D* g_pDepthStencil = nullptr; + ID3D11DepthStencilView* g_pDepthStencilView = nullptr; + ID3D11VertexShader* g_pVertexShader = nullptr; + ID3D11PixelShader* g_pPixelShader = nullptr; + ID3D11InputLayout* g_pVertexLayout = nullptr; + ID3D11Buffer* g_pVertexBuffer = nullptr; + ID3D11Buffer* g_pIndexBuffer = nullptr; + ID3D11Buffer* g_pCBArrayControl = nullptr; + ID3D11ShaderResourceView* g_pSRV = nullptr; + ID3D11BlendState* g_AlphaBlendState = nullptr; + ID3D11SamplerState* g_pSamplerLinear = nullptr; -UINT g_iCurrentIndex = 0; -UINT g_iMaxIndex = 1; + UINT g_iCurrentIndex = 0; + UINT g_iMaxIndex = 1; -UINT g_iIndices = 0; + UINT g_iIndices = 0; + LPCWSTR g_szAppName = L"DDSView"; +} //-------------------------------------------------------------------------------------- -HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata ); -HRESULT InitDevice( const TexMetadata& mdata ); +HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata); +HRESULT InitDevice(const TexMetadata& mdata); void CleanupDevice(); -LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); +LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void Render(); //-------------------------------------------------------------------------------------- #pragma warning( suppress : 6262 ) -int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow ) +int WINAPI wWinMain( + _In_ HINSTANCE hInstance, + _In_opt_ HINSTANCE /*hPrevInstance*/, + _In_ LPWSTR lpCmdLine, + _In_ int nCmdShow) { - UNREFERENCED_PARAMETER( hPrevInstance ); - UNREFERENCED_PARAMETER( lpCmdLine ); - - if ( !*lpCmdLine ) + if (!*lpCmdLine) { - MessageBoxW( nullptr, L"Usage: ddsview ", L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + MessageBoxW(nullptr, L"Usage: ddsview ", g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } TexMetadata mdata; - HRESULT hr = GetMetadataFromDDSFile( lpCmdLine, DDS_FLAGS_NONE, mdata ); - if ( FAILED(hr) ) + HRESULT hr = GetMetadataFromDDSFile(lpCmdLine, DDS_FLAGS_NONE, mdata); + if (FAILED(hr)) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"Failed to open texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast(hr) ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + swprintf_s(buff, L"Failed to open texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast(hr)); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } - if( FAILED( InitWindow( hInstance, nCmdShow, mdata ) ) ) + if (FAILED(InitWindow(hInstance, nCmdShow, mdata))) return 0; - SetWindowTextW( g_hWnd, lpCmdLine ); + SetWindowTextW(g_hWnd, lpCmdLine); - if( FAILED( InitDevice( mdata ) ) ) + if (FAILED(InitDevice(mdata))) { CleanupDevice(); return 0; @@ -138,34 +150,57 @@ int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, if (mdata.dimension == TEX_DIMENSION_TEXTURE3D) { - if ( mdata.arraySize > 1 ) + if (mdata.arraySize > 1) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"Arrays of volume textures are not supported\n\nFilename = %ls\nArray size %zu", lpCmdLine, mdata.arraySize ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + swprintf_s(buff, L"Arrays of volume textures are not supported\n\nFilename = %ls\nArray size %zu", lpCmdLine, mdata.arraySize); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } - g_iMaxIndex = static_cast( mdata.depth ); + g_iMaxIndex = static_cast(mdata.depth); } - else + else if (mdata.arraySize > 1) { - g_iMaxIndex = static_cast( mdata.arraySize ); + if (g_featureLevel < D3D_FEATURE_LEVEL_10_0) + { + 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); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); + return 0; + } + + g_iMaxIndex = static_cast(mdata.arraySize); } - switch( mdata.format ) + switch (mdata.format) { + case DXGI_FORMAT_BC4_TYPELESS: + case DXGI_FORMAT_BC4_SNORM: + case DXGI_FORMAT_BC4_UNORM: + case DXGI_FORMAT_BC5_TYPELESS: + case DXGI_FORMAT_BC5_SNORM: + case DXGI_FORMAT_BC5_UNORM: + if (g_featureLevel < D3D_FEATURE_LEVEL_10_0) + { + 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); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); + return 0; + } + break; + case DXGI_FORMAT_BC6H_TYPELESS: case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: - if ( g_featureLevel < D3D_FEATURE_LEVEL_11_0 ) + if (g_featureLevel < D3D_FEATURE_LEVEL_11_0) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"BC6H/BC7 requires DirectX 11 hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", lpCmdLine, mdata.format, g_featureLevel ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + 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); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } break; @@ -173,12 +208,13 @@ int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, default: { UINT flags = 0; - hr = g_pd3dDevice->CheckFormatSupport ( mdata.format, &flags ); - if ( FAILED(hr) || !(flags & (D3D11_FORMAT_SUPPORT_TEXTURE1D|D3D11_FORMAT_SUPPORT_TEXTURE2D|D3D11_FORMAT_SUPPORT_TEXTURE3D)) ) + hr = g_pd3dDevice->CheckFormatSupport(mdata.format, &flags); + constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE1D | D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D; + if (FAILED(hr) || !(flags & required)) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"Format not supported by DirectX hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d\nHRESULT = %08X", lpCmdLine, mdata.format, g_featureLevel, static_cast(hr) ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + 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(hr)); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } } @@ -186,35 +222,35 @@ int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, } ScratchImage image; - hr = LoadFromDDSFile( lpCmdLine, DDS_FLAGS_NONE, &mdata, image ); - if ( FAILED(hr) ) + hr = LoadFromDDSFile(lpCmdLine, DDS_FLAGS_NONE, &mdata, image); + if (FAILED(hr)) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"Failed to load texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast(hr) ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + swprintf_s(buff, L"Failed to load texture file\n\nFilename = %ls\nHRESULT %08X", lpCmdLine, static_cast(hr)); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } // Special case to make sure Texture cubes remain arrays mdata.miscFlags &= ~TEX_MISC_TEXTURECUBE; - hr = CreateShaderResourceView( g_pd3dDevice, image.GetImages(), image.GetImageCount(), mdata, &g_pSRV ); - if ( FAILED(hr) ) + hr = CreateShaderResourceView(g_pd3dDevice, image.GetImages(), image.GetImageCount(), mdata, &g_pSRV); + if (FAILED(hr)) { wchar_t buff[2048] = {}; - swprintf_s( buff, L"Failed creating texture from file\n\nFilename = %ls\nHRESULT = %08X", lpCmdLine, static_cast(hr) ); - MessageBoxW( nullptr, buff, L"DDSView", MB_OK | MB_ICONEXCLAMATION ); + swprintf_s(buff, L"Failed creating texture from file\n\nFilename = %ls\nHRESULT = %08X", lpCmdLine, static_cast(hr)); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 0; } // Main message loop MSG msg = {}; - while( WM_QUIT != msg.message ) + while (WM_QUIT != msg.message) { - if( PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) ) + if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { - TranslateMessage( &msg ); - DispatchMessage( &msg ); + TranslateMessage(&msg); + DispatchMessage(&msg); } else { @@ -224,103 +260,103 @@ int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, CleanupDevice(); - return ( int )msg.wParam; + return static_cast(msg.wParam); } //-------------------------------------------------------------------------------------- -HRESULT InitWindow( HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata ) +HRESULT InitWindow( + HINSTANCE hInstance, + int nCmdShow, + const TexMetadata& mdata) { // Register class - WNDCLASSEXW wcex; - wcex.cbSize = sizeof( WNDCLASSEXW ); + WNDCLASSEXW wcex = {}; + wcex.cbSize = sizeof(WNDCLASSEXW); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; - wcex.cbClsExtra = 0; - wcex.cbWndExtra = 0; wcex.hInstance = hInstance; - wcex.hIcon = LoadIcon( hInstance, ( LPCTSTR )IDI_MAIN_ICON ); - wcex.hCursor = LoadCursor( nullptr, IDC_ARROW ); - wcex.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 ); - wcex.lpszMenuName = nullptr; + wcex.hIcon = LoadIconW(hInstance, reinterpret_cast(IDI_MAIN_ICON)); + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + wcex.hbrBackground = reinterpret_cast(COLOR_WINDOW + 1); wcex.lpszClassName = L"DDSViewWindowClass"; - wcex.hIconSm = LoadIcon( wcex.hInstance, ( LPCTSTR )IDI_MAIN_ICON ); - if( !RegisterClassExW( &wcex ) ) + wcex.hIconSm = LoadIconW(wcex.hInstance, reinterpret_cast(IDI_MAIN_ICON)); + if (!RegisterClassExW(&wcex)) return E_FAIL; // Create window g_hInst = hInstance; RECT rc = { 0, 0, 640, 480 }; - int cxborder = GetSystemMetrics( SM_CXBORDER ); - int cxedge = GetSystemMetrics( SM_CXEDGE ); - int screenX = GetSystemMetrics( SM_CXSCREEN ) - std::max( cxborder, cxedge ); - if( rc.right < (LONG)mdata.width ) - rc.right = (LONG)mdata.width; - if ( rc.right > screenX ) + int cxborder = GetSystemMetrics(SM_CXBORDER); + int cxedge = GetSystemMetrics(SM_CXEDGE); + int screenX = GetSystemMetrics(SM_CXSCREEN) - std::max(cxborder, cxedge); + if (rc.right < static_cast(mdata.width)) + rc.right = static_cast(mdata.width); + if (rc.right > screenX) rc.right = screenX; - int cyborder = GetSystemMetrics( SM_CYBORDER ); - int cyedge = GetSystemMetrics( SM_CYEDGE ); - int screenY = GetSystemMetrics( SM_CYSCREEN ) - std::max( cyborder, cyedge ); - if ( rc.bottom < (LONG)mdata.height ) - rc.bottom = (LONG)mdata.height; - if ( rc.bottom > screenY ) + int cyborder = GetSystemMetrics(SM_CYBORDER); + int cyedge = GetSystemMetrics(SM_CYEDGE); + int screenY = GetSystemMetrics(SM_CYSCREEN) - std::max(cyborder, cyedge); + if (rc.bottom < static_cast(mdata.height)) + rc.bottom = static_cast(mdata.height); + if (rc.bottom > screenY) rc.bottom = screenY; - AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE ); - g_hWnd = CreateWindowW( L"DDSViewWindowClass", L"DDS View", WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInstance, - nullptr ); - if( !g_hWnd ) + AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); + g_hWnd = CreateWindowW(L"DDSViewWindowClass", g_szAppName, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInstance, + nullptr); + if (!g_hWnd) return E_FAIL; - ShowWindow( g_hWnd, nCmdShow ); + ShowWindow(g_hWnd, nCmdShow); return S_OK; } //-------------------------------------------------------------------------------------- -LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { - PAINTSTRUCT ps; - HDC hdc; - - switch( message ) + switch (message) { - case WM_PAINT: - hdc = BeginPaint( hWnd, &ps ); - EndPaint( hWnd, &ps ); - break; + case WM_PAINT: + { + PAINTSTRUCT ps; + std::ignore = BeginPaint(hWnd, &ps); + EndPaint(hWnd, &ps); + } + break; - case WM_DESTROY: - PostQuitMessage( 0 ); - break; + case WM_DESTROY: + PostQuitMessage(0); + break; - case WM_KEYDOWN: - if ( wParam == VK_RIGHT ) + case WM_KEYDOWN: + if (wParam == VK_RIGHT) + { + if (g_iCurrentIndex < g_iMaxIndex - 1) + ++g_iCurrentIndex; + } + else if (wParam == VK_LEFT) + { + if (g_iCurrentIndex > 0) { - if ( g_iCurrentIndex < g_iMaxIndex-1 ) - ++g_iCurrentIndex; + --g_iCurrentIndex; } - else if ( wParam == VK_LEFT ) - { - if ( g_iCurrentIndex > 0 ) - { - --g_iCurrentIndex; - } - } - else if ( wParam >= '0' && wParam <= '9' ) - { - UINT index = (wParam == '0') ? 10 : ((UINT) (wParam - '1')); - if ( index < g_iMaxIndex ) - g_iCurrentIndex = index; - } - InvalidateRect( hWnd, nullptr, FALSE ); - break; + } + else if (wParam >= '0' && wParam <= '9') + { + UINT index = (wParam == '0') ? 10u : static_cast(wParam - '1'); + if (index < g_iMaxIndex) + g_iCurrentIndex = index; + } + InvalidateRect(hWnd, nullptr, FALSE); + break; - default: - return DefWindowProc( hWnd, message, wParam, lParam ); + default: + return DefWindowProc(hWnd, message, wParam, lParam); } return 0; @@ -328,14 +364,14 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam //-------------------------------------------------------------------------------------- -HRESULT InitDevice( const TexMetadata& mdata ) +HRESULT InitDevice(const TexMetadata& mdata) { HRESULT hr = S_OK; RECT rc; - GetClientRect( g_hWnd, &rc ); - UINT width = rc.right - rc.left; - UINT height = rc.bottom - rc.top; + GetClientRect(g_hWnd, &rc); + auto width = static_cast(rc.right - rc.left); + auto height = static_cast(rc.bottom - rc.top); UINT createDeviceFlags = 0; #if defined( DEBUG ) || defined( _DEBUG ) @@ -368,32 +404,35 @@ HRESULT InitDevice( const TexMetadata& mdata ) sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = g_hWnd; sd.SampleDesc.Count = 1; - sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; - for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ ) + for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) { g_driverType = driverTypes[driverTypeIndex]; - hr = D3D11CreateDeviceAndSwapChain( nullptr, g_driverType, nullptr, createDeviceFlags, featureLevels, numFeatureLevels, - D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext ); - if( SUCCEEDED( hr ) ) + + // See https://walbourn.github.io/anatomy-of-direct3d-11-create-device/ + hr = D3D11CreateDeviceAndSwapChain(nullptr, g_driverType, nullptr, + createDeviceFlags, featureLevels, numFeatureLevels, + D3D11_SDK_VERSION, &sd, + &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext); + if (SUCCEEDED(hr)) break; } - if( FAILED( hr ) ) + if (FAILED(hr)) return hr; // Create a render target view ID3D11Texture2D* pBackBuffer = nullptr; - hr = g_pSwapChain->GetBuffer( 0, IID_PPV_ARGS(&pBackBuffer) ); - if( FAILED( hr ) ) + hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); + if (FAILED(hr)) return hr; D3D11_RENDER_TARGET_VIEW_DESC vd = {}; vd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; vd.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, &vd, &g_pRenderTargetView ); + hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &vd, &g_pRenderTargetView); pBackBuffer->Release(); - if( FAILED( hr ) ) + if (FAILED(hr)) return hr; // Create depth stencil texture @@ -404,13 +443,10 @@ HRESULT InitDevice( const TexMetadata& mdata ) descDepth.ArraySize = 1; descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDepth.SampleDesc.Count = 1; - descDepth.SampleDesc.Quality = 0; descDepth.Usage = D3D11_USAGE_DEFAULT; descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; - descDepth.CPUAccessFlags = 0; - descDepth.MiscFlags = 0; - hr = g_pd3dDevice->CreateTexture2D( &descDepth, nullptr, &g_pDepthStencil ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencil); + if (FAILED(hr)) return hr; // Create the depth stencil view @@ -418,25 +454,24 @@ HRESULT InitDevice( const TexMetadata& mdata ) descDSV.Format = descDepth.Format; descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSV.Texture2D.MipSlice = 0; - hr = g_pd3dDevice->CreateDepthStencilView( g_pDepthStencil, &descDSV, &g_pDepthStencilView ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencil, &descDSV, &g_pDepthStencilView); + if (FAILED(hr)) return hr; - g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, g_pDepthStencilView ); + g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, g_pDepthStencilView); // Setup the viewport - D3D11_VIEWPORT vp; - vp.Width = (FLOAT)width; - vp.Height = (FLOAT)height; - vp.MinDepth = 0.0f; - vp.MaxDepth = 1.0f; - vp.TopLeftX = 0; - vp.TopLeftY = 0; - g_pImmediateContext->RSSetViewports( 1, &vp ); + D3D11_VIEWPORT vp = {}; + vp.TopLeftX = vp.TopLeftY = 0.f; + vp.Width = static_cast(width); + vp.Height = static_cast(height); + vp.MinDepth = D3D11_MIN_DEPTH; + vp.MaxDepth = D3D11_MAX_DEPTH; + g_pImmediateContext->RSSetViewports(1, &vp); // Create the vertex shader - hr = g_pd3dDevice->CreateVertexShader( g_VS, sizeof(g_VS), nullptr, &g_pVertexShader ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateVertexShader(g_VS, sizeof(g_VS), nullptr, &g_pVertexShader); + if (FAILED(hr)) return hr; // Define the input layout @@ -448,12 +483,12 @@ HRESULT InitDevice( const TexMetadata& mdata ) constexpr UINT numElements = static_cast(std::size(layout)); // Create the input layout - hr = g_pd3dDevice->CreateInputLayout( layout, numElements, g_VS, sizeof(g_VS), &g_pVertexLayout ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateInputLayout(layout, numElements, g_VS, sizeof(g_VS), &g_pVertexLayout); + if (FAILED(hr)) return hr; // Set the input layout - g_pImmediateContext->IASetInputLayout( g_pVertexLayout ); + g_pImmediateContext->IASetInputLayout(g_pVertexLayout); // Select the pixel shader bool isCubeMap = false; @@ -461,10 +496,10 @@ HRESULT InitDevice( const TexMetadata& mdata ) const BYTE* pshader = nullptr; size_t pshader_size = 0; - switch ( mdata.dimension ) + switch (mdata.dimension) { case TEX_DIMENSION_TEXTURE1D: - if ( mdata.arraySize > 1) + if (mdata.arraySize > 1) { pshader = g_PS_1DArray; pshader_size = sizeof(g_PS_1DArray); @@ -478,13 +513,13 @@ HRESULT InitDevice( const TexMetadata& mdata ) break; case TEX_DIMENSION_TEXTURE2D: - if ( mdata.miscFlags & TEX_MISC_TEXTURECUBE ) + if (mdata.miscFlags & TEX_MISC_TEXTURECUBE) { pshader = g_PS_Cube; pshader_size = sizeof(g_PS_Cube); isCubeMap = true; } - else if ( mdata.arraySize > 1 ) + else if (mdata.arraySize > 1) { pshader = g_PS_2DArray; pshader_size = sizeof(g_PS_2DArray); @@ -505,11 +540,11 @@ HRESULT InitDevice( const TexMetadata& mdata ) return E_FAIL; } - assert( pshader && pshader_size > 0 ); + assert(pshader && pshader_size > 0); // Create the pixel shader - hr = g_pd3dDevice->CreatePixelShader( pshader, pshader_size, nullptr, &g_pPixelShader ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreatePixelShader(pshader, pshader_size, nullptr, &g_pPixelShader); + if (FAILED(hr)) return hr; // Create vertex buffer @@ -521,64 +556,64 @@ HRESULT InitDevice( const TexMetadata& mdata ) // Render cubemaps as horizontal cross // XPOS - { XMFLOAT4( .5f, .25f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, .25f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( .5f, -.25f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, -.25f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 0.f, 0.f ) }, + { XMFLOAT4(.5f, .25f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, .25f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(.5f, -.25f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 0.f, 0.f) }, // XNEG - { XMFLOAT4( -.5f, .25f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 1.f, 0.f ) }, - { XMFLOAT4( 0.f, .25f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 1.f, 0.f ) }, - { XMFLOAT4( -.5f, -.25f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 1.f, 0.f ) }, - { XMFLOAT4( 0.f, -.25f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 1.f, 0.f ) }, + { XMFLOAT4(-.5f, .25f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 1.f, 0.f) }, + { XMFLOAT4(0.f, .25f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 1.f, 0.f) }, + { XMFLOAT4(-.5f, -.25f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 1.f, 0.f) }, + { XMFLOAT4(0.f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 1.f, 0.f) }, // YPOS - { XMFLOAT4( -.5f, .75f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 2.f, 0.f ) }, - { XMFLOAT4( 0.f, .75f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 2.f, 0.f ) }, - { XMFLOAT4( -.5f, .25f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 2.f, 0.f ) }, - { XMFLOAT4( 0.f, .25f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 2.f, 0.f ) }, + { XMFLOAT4(-.5f, .75f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 2.f, 0.f) }, + { XMFLOAT4(0.f, .75f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 2.f, 0.f) }, + { XMFLOAT4(-.5f, .25f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 2.f, 0.f) }, + { XMFLOAT4(0.f, .25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 2.f, 0.f) }, // YNEG - { XMFLOAT4( -.5f, -.25f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 3.f, 0.f ) }, - { XMFLOAT4( 0.f, -.25f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 3.f, 0.f ) }, - { XMFLOAT4( -.5f, -.75f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 3.f, 0.f ) }, - { XMFLOAT4( 0.f, -.75f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 3.f, 0.f ) }, + { XMFLOAT4(-.5f, -.25f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 3.f, 0.f) }, + { XMFLOAT4(0.f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 3.f, 0.f) }, + { XMFLOAT4(-.5f, -.75f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 3.f, 0.f) }, + { XMFLOAT4(0.f, -.75f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 3.f, 0.f) }, // ZPOS - { XMFLOAT4( 0.f, .25f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 4.f, 0.f ) }, - { XMFLOAT4( .5f, .25f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 4.f, 0.f ) }, - { XMFLOAT4( 0.f, -.25f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 4.f, 0.f ) }, - { XMFLOAT4( .5f, -.25f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 4.f, 0.f ) }, + { XMFLOAT4(0.f, .25f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 4.f, 0.f) }, + { XMFLOAT4(.5f, .25f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 4.f, 0.f) }, + { XMFLOAT4(0.f, -.25f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 4.f, 0.f) }, + { XMFLOAT4(.5f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 4.f, 0.f) }, // ZNEG - { XMFLOAT4( -1.f, .25f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 5.f, 0.f ) }, - { XMFLOAT4( -.5f, .25f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 5.f, 0.f ) }, - { XMFLOAT4( -1.f, -.25f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 5.f, 0.f ) }, - { XMFLOAT4( -.5f, -.25f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 5.f, 0.f ) }, + { XMFLOAT4(-1.f, .25f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 5.f, 0.f) }, + { XMFLOAT4(-.5f, .25f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 5.f, 0.f) }, + { XMFLOAT4(-1.f, -.25f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 5.f, 0.f) }, + { XMFLOAT4(-.5f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 5.f, 0.f) }, }; static const SimpleVertex vertices[] = { - { XMFLOAT4( -1.f, 1.f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, 1.f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( -1.f, -1.f, 0.f, 1.f ), XMFLOAT4( 0.f, 1.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, -1.f, 0.f, 1.f ), XMFLOAT4( 1.f, 1.f, 0.f, 0.f ) }, + { XMFLOAT4(-1.f, 1.f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, 1.f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(-1.f, -1.f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, -1.f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 0.f, 0.f) }, }; static const SimpleVertex vertices1D[] = { - { XMFLOAT4( -1.f, .05f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, .05f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( -1.f, -.05f, 0.f, 1.f ), XMFLOAT4( 0.f, 0.f, 0.f, 0.f ) }, - { XMFLOAT4( 1.f, -.05f, 0.f, 1.f ), XMFLOAT4( 1.f, 0.f, 0.f, 0.f ) }, + { XMFLOAT4(-1.f, .05f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, .05f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(-1.f, -.05f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, + { XMFLOAT4(1.f, -.05f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, }; - if ( isCubeMap ) + if (isCubeMap) { nverts = static_cast(std::size(verticesCube)); InitData.pSysMem = verticesCube; } - else if ( is1D ) + else if (is1D) { nverts = static_cast(std::size(vertices1D)); InitData.pSysMem = vertices1D; @@ -591,17 +626,17 @@ HRESULT InitDevice( const TexMetadata& mdata ) D3D11_BUFFER_DESC bd = {}; bd.Usage = D3D11_USAGE_DEFAULT; - bd.ByteWidth = sizeof( SimpleVertex ) * nverts; + bd.ByteWidth = sizeof(SimpleVertex) * nverts; bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pVertexBuffer ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); + if (FAILED(hr)) return hr; // Set vertex buffer - UINT stride = sizeof( SimpleVertex ); + UINT stride = sizeof(SimpleVertex); UINT offset = 0; - g_pImmediateContext->IASetVertexBuffers( 0, 1, &g_pVertexBuffer, &stride, &offset ); + g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // Create index buffer static const WORD indicesCube[] = @@ -626,7 +661,7 @@ HRESULT InitDevice( const TexMetadata& mdata ) 2, 1, 3 }; - if ( isCubeMap ) + if (isCubeMap) { g_iIndices = static_cast(std::size(indicesCube)); InitData.pSysMem = indicesCube; @@ -641,23 +676,23 @@ HRESULT InitDevice( const TexMetadata& mdata ) bd.ByteWidth = g_iIndices * sizeof(WORD); bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer( &bd, &InitData, &g_pIndexBuffer ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer); + if (FAILED(hr)) return hr; // Set index buffer - g_pImmediateContext->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0 ); + g_pImmediateContext->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R16_UINT, 0); // Set primitive topology - g_pImmediateContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST ); + g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Create the constant buffers bd.Usage = D3D11_USAGE_DEFAULT; bd.ByteWidth = sizeof(CBArrayControl); bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer( &bd, nullptr, &g_pCBArrayControl ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateBuffer(&bd, nullptr, &g_pCBArrayControl); + if (FAILED(hr)) return hr; // Create the state objects @@ -669,11 +704,11 @@ HRESULT InitDevice( const TexMetadata& mdata ) sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; sampDesc.MinLOD = 0; sampDesc.MaxLOD = D3D11_FLOAT32_MAX; - hr = g_pd3dDevice->CreateSamplerState( &sampDesc, &g_pSamplerLinear ); - if( FAILED( hr ) ) + hr = g_pd3dDevice->CreateSamplerState(&sampDesc, &g_pSamplerLinear); + if (FAILED(hr)) return hr; - D3D11_BLEND_DESC dsc = + D3D11_BLEND_DESC dsc = { false, false, @@ -688,11 +723,11 @@ HRESULT InitDevice( const TexMetadata& mdata ) D3D11_BLEND_OP_ADD, D3D11_COLOR_WRITE_ENABLE_ALL }, - // ... - } + // ... + } }; - hr = g_pd3dDevice->CreateBlendState(&dsc, &g_AlphaBlendState ); - if( FAILED(hr) ) + hr = g_pd3dDevice->CreateBlendState(&dsc, &g_AlphaBlendState); + if (FAILED(hr)) return hr; return S_OK; @@ -703,46 +738,45 @@ HRESULT InitDevice( const TexMetadata& mdata ) void Render() { float ClearColor[4] = { 0.f, 1.f, 1.f, 1.0f }; //red,green,blue,alpha - g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, ClearColor ); - g_pImmediateContext->ClearDepthStencilView( g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 ); + g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, ClearColor); + g_pImmediateContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); - float bf [4] = {1.0f, 1.0f, 1.0f, 1.0f}; - g_pImmediateContext->OMSetBlendState( g_AlphaBlendState, bf, 0xffffffff ); + float bf[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + g_pImmediateContext->OMSetBlendState(g_AlphaBlendState, bf, 0xffffffff); - CBArrayControl cb; - cb.Index = (float)g_iCurrentIndex; - g_pImmediateContext->UpdateSubresource( g_pCBArrayControl, 0, nullptr, &cb, 0, 0 ); + CBArrayControl cb = {}; + cb.Index = static_cast(g_iCurrentIndex); + g_pImmediateContext->UpdateSubresource(g_pCBArrayControl, 0, nullptr, &cb, 0, 0); - g_pImmediateContext->VSSetShader( g_pVertexShader, nullptr, 0 ); - g_pImmediateContext->PSSetShader( g_pPixelShader, nullptr, 0 ); - g_pImmediateContext->PSSetConstantBuffers( 0, 1, &g_pCBArrayControl ); - g_pImmediateContext->PSSetShaderResources( 0, 1, &g_pSRV ); - g_pImmediateContext->PSSetSamplers( 0, 1, &g_pSamplerLinear ); - g_pImmediateContext->DrawIndexed( g_iIndices, 0, 0 ); + g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); + g_pImmediateContext->PSSetShader(g_pPixelShader, nullptr, 0); + g_pImmediateContext->PSSetConstantBuffers(0, 1, &g_pCBArrayControl); + g_pImmediateContext->PSSetShaderResources(0, 1, &g_pSRV); + g_pImmediateContext->PSSetSamplers(0, 1, &g_pSamplerLinear); + g_pImmediateContext->DrawIndexed(g_iIndices, 0, 0); - g_pSwapChain->Present( 0, 0 ); + g_pSwapChain->Present(0, 0); } //-------------------------------------------------------------------------------------- void CleanupDevice() { - if( g_pImmediateContext ) g_pImmediateContext->ClearState(); + if (g_pImmediateContext) g_pImmediateContext->ClearState(); - if( g_pSamplerLinear ) g_pSamplerLinear->Release(); - if( g_AlphaBlendState ) g_AlphaBlendState->Release(); - if( g_pSRV ) g_pSRV->Release(); - if( g_pVertexBuffer ) g_pVertexBuffer->Release(); - if( g_pIndexBuffer ) g_pIndexBuffer->Release(); - if( g_pCBArrayControl ) g_pCBArrayControl->Release(); - if( g_pVertexLayout ) g_pVertexLayout->Release(); - if( g_pVertexShader ) g_pVertexShader->Release(); - if( g_pPixelShader ) g_pPixelShader->Release(); - if( g_pDepthStencil ) g_pDepthStencil->Release(); - if( g_pDepthStencilView ) g_pDepthStencilView->Release(); - if( g_pRenderTargetView ) g_pRenderTargetView->Release(); - if( g_pSwapChain ) g_pSwapChain->Release(); - if( g_pImmediateContext ) g_pImmediateContext->Release(); - if( g_pd3dDevice ) g_pd3dDevice->Release(); + if (g_pSamplerLinear) g_pSamplerLinear->Release(); + if (g_AlphaBlendState) g_AlphaBlendState->Release(); + if (g_pSRV) g_pSRV->Release(); + if (g_pVertexBuffer) g_pVertexBuffer->Release(); + if (g_pIndexBuffer) g_pIndexBuffer->Release(); + if (g_pCBArrayControl) g_pCBArrayControl->Release(); + if (g_pVertexLayout) g_pVertexLayout->Release(); + if (g_pVertexShader) g_pVertexShader->Release(); + if (g_pPixelShader) g_pPixelShader->Release(); + if (g_pDepthStencil) g_pDepthStencil->Release(); + if (g_pDepthStencilView) g_pDepthStencilView->Release(); + if (g_pRenderTargetView) g_pRenderTargetView->Release(); + if (g_pSwapChain) g_pSwapChain->Release(); + if (g_pImmediateContext) g_pImmediateContext->Release(); + if (g_pd3dDevice) g_pd3dDevice->Release(); } - diff --git a/DDSView/ddsview.fx b/DDSView/ddsview.fx index c9fc171..ba876d2 100644 --- a/DDSView/ddsview.fx +++ b/DDSView/ddsview.fx @@ -8,17 +8,17 @@ //-------------------------------------------------------------------------------------- // Constant Buffer Variables //-------------------------------------------------------------------------------------- -Texture1D tx1D : register( t0 ); -Texture1DArray tx1DArray : register( t0 ); +Texture1D tx1D : register(t0); +Texture1DArray tx1DArray : register(t0); -Texture2D tx2D : register( t0 ); -Texture2DArray tx2DArray : register( t0 ); +Texture2D tx2D : register(t0); +Texture2DArray tx2DArray : register(t0); -Texture3D tx3D : register( t0 ); +Texture3D tx3D : register(t0); -SamplerState samLinear : register( s0 ); +SamplerState samLinear : register(s0); -cbuffer cbArrayControl : register( b0 ) +cbuffer cbArrayControl : register(b0) { float Index; }; @@ -40,7 +40,7 @@ struct PS_INPUT //-------------------------------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------------------------------- -PS_INPUT VS( VS_INPUT input ) +PS_INPUT VS(VS_INPUT input) { PS_INPUT output = (PS_INPUT)0; output.Pos = input.Pos; @@ -52,35 +52,35 @@ PS_INPUT VS( VS_INPUT input ) //-------------------------------------------------------------------------------------- // Pixel Shader //-------------------------------------------------------------------------------------- -float4 PS_1D( PS_INPUT input) : SV_Target +float4 PS_1D(PS_INPUT input) : SV_Target { - return tx1D.Sample( samLinear, input.Tex.x ); + return tx1D.Sample(samLinear, input.Tex.x); } -float4 PS_1DArray( PS_INPUT input) : SV_Target +float4 PS_1DArray(PS_INPUT input) : SV_Target { - return tx1DArray.Sample( samLinear, float2(input.Tex.x, Index) ); + return tx1DArray.Sample(samLinear, float2(input.Tex.x, Index)); } -float4 PS_2D( PS_INPUT input) : SV_Target +float4 PS_2D(PS_INPUT input) : SV_Target { - return tx2D.Sample( samLinear, input.Tex.xy ); + return tx2D.Sample(samLinear, input.Tex.xy); } -float4 PS_2DArray( PS_INPUT input) : SV_Target +float4 PS_2DArray(PS_INPUT input) : SV_Target { - return tx2DArray.Sample( samLinear, float3(input.Tex.xy, Index) ); + return tx2DArray.Sample(samLinear, float3(input.Tex.xy, Index)); } -float4 PS_3D( PS_INPUT input) : SV_Target +float4 PS_3D(PS_INPUT input) : SV_Target { int Width, Height, Depth; - tx3D.GetDimensions( Width, Height, Depth); + tx3D.GetDimensions(Width, Height, Depth); - return tx3D.Sample( samLinear, float3(input.Tex.xy, Index / Depth) ); + return tx3D.Sample(samLinear, float3(input.Tex.xy, Index / Depth)); } -float4 PS_Cube( PS_INPUT input) : SV_Target +float4 PS_Cube(PS_INPUT input) : SV_Target { - return tx2DArray.Sample( samLinear, float3(input.Tex.xy, input.Tex.z + (6*Index)) ); + return tx2DArray.Sample(samLinear, float3(input.Tex.xy, input.Tex.z + (6*Index))); }