From 4dff95bafe28b9934c6f60e241fe890e92d2a028 Mon Sep 17 00:00:00 2001 From: Igor Novikov Date: Sat, 17 Feb 2018 22:21:36 +0500 Subject: [PATCH] Work on CHW and reduce differences between files. --- src/Layers/xrRender/HW.cpp | 407 +++++++++++------------ src/Layers/xrRender/HW.h | 62 ++-- src/Layers/xrRender/SH_RT.cpp | 4 +- src/Layers/xrRenderDX10/dx10HW.cpp | 444 ++++---------------------- src/Layers/xrRenderDX10/dx10SH_RT.cpp | 4 +- 5 files changed, 308 insertions(+), 613 deletions(-) diff --git a/src/Layers/xrRender/HW.cpp b/src/Layers/xrRender/HW.cpp index 90cbde10cf5..3c62931f197 100644 --- a/src/Layers/xrRender/HW.cpp +++ b/src/Layers/xrRender/HW.cpp @@ -1,15 +1,6 @@ -// HW.cpp: implementation of the CHW class. -////////////////////////////////////////////////////////////////////// - #include "stdafx.h" -#pragma hdrstop - -#pragma warning(push) -#pragma warning(disable : 4995) -#include -#pragma warning(pop) -#include "HW.h" +#include "Layers/xrRender/HW.h" #include "xrEngine/XR_IOConsole.h" #include "xrCore/xr_token.h" @@ -28,167 +19,35 @@ void free_render_mode_list() {} CHW HW; -#ifdef DEBUG -IDirect3DStateBlock9* dwDebugSB = nullptr; -#endif - -CHW::CHW() : hD3D(nullptr), pD3D(nullptr), pDevice(nullptr), pBaseRT(nullptr), pBaseZB(nullptr), m_move_window(true), maxRefreshRate(200)/*ECO_RENDER*/ {} -CHW::~CHW() {} -void CHW::Reset(HWND hwnd) +CHW::CHW() { -#ifdef DEBUG - _RELEASE(dwDebugSB); -#endif - _RELEASE(pBaseZB); - _RELEASE(pBaseRT); -#ifndef _EDITOR - bool bWindowed = true; - if (!GEnv.isDedicatedServer) - bWindowed = !psDeviceFlags.is(rsFullscreen); - - selectResolution(DevPP.BackBufferWidth, DevPP.BackBufferHeight, bWindowed); - // Windoze - DevPP.SwapEffect = bWindowed ? D3DSWAPEFFECT_COPY : D3DSWAPEFFECT_DISCARD; - DevPP.Windowed = bWindowed; - if (!bWindowed) - { - DevPP.PresentationInterval = selectPresentInterval(); // Vsync (R1\R2) - DevPP.FullScreen_RefreshRateInHz = selectRefresh(DevPP.BackBufferWidth, DevPP.BackBufferHeight, Caps.fTarget); - } - else - { - DevPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - DevPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; - } -#endif - - while (true) - { - HRESULT _hr = HW.pDevice->Reset(&DevPP); - if (SUCCEEDED(_hr)) - break; - Msg("! ERROR: [%dx%d]: %s", DevPP.BackBufferWidth, DevPP.BackBufferHeight, xrDebug::ErrorToString(_hr)); - Sleep(100); - } - R_CHK(pDevice->GetRenderTarget(0, &pBaseRT)); - R_CHK(pDevice->GetDepthStencilSurface(&pBaseZB)); -#ifdef DEBUG - R_CHK(pDevice->CreateStateBlock(D3DSBT_ALL, &dwDebugSB)); -#endif -#ifndef _EDITOR - updateWindowProps(hwnd); - ShowWindow(hwnd, SW_SHOWNORMAL); -#endif } -void CHW::CreateD3D() +CHW::~CHW() { - const pcstr _name = GEnv.isDedicatedServer ? "xrD3D9-Null" : "d3d9.dll"; - - hD3D = XRay::LoadModule(_name); - R_ASSERT2(hD3D->exist(), "Can't find 'd3d9.dll'\nPlease install latest version of DirectX before running this program"); - typedef IDirect3D9* WINAPI _Direct3DCreate9(UINT SDKVersion); - auto createD3D = (_Direct3DCreate9*)hD3D->getProcAddress("Direct3DCreate9"); - R_ASSERT(createD3D); - this->pD3D = createD3D(D3D_SDK_VERSION); - R_ASSERT2(this->pD3D, "Please install DirectX 9.0c"); -} - -void CHW::DestroyD3D() -{ - _RELEASE(this->pD3D); } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// -D3DFORMAT CHW::selectDepthStencil(D3DFORMAT fTarget) +void CHW::CreateD3D() { -// R2 hack -#pragma todo("R2 need to specify depth format") - if (GEnv.CurrentRenderer == 2) - return D3DFMT_D24S8; - - // R1 usual - static D3DFORMAT fDS_Try1[6] = {D3DFMT_D24S8, D3DFMT_D24X4S4, D3DFMT_D32, D3DFMT_D24X8, D3DFMT_D16, D3DFMT_D15S1}; - - D3DFORMAT* fDS_Try = fDS_Try1; - int fDS_Cnt = 6; + hD3D = XRay::LoadModule(GEnv.isDedicatedServer ? "xrD3D9-Null" : "d3d9.dll"); + R_ASSERT2(hD3D->exist(), "Can't find 'd3d9.dll'\nPlease install latest version of DirectX before running this program"); - for (int it = 0; it < fDS_Cnt; it++) - { - if (SUCCEEDED(pD3D->CheckDeviceFormat( - DevAdapter, DevT, fTarget, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, fDS_Try[it]))) - { - if (SUCCEEDED(pD3D->CheckDepthStencilMatch(DevAdapter, DevT, fTarget, fTarget, fDS_Try[it]))) - { - return fDS_Try[it]; - } - } - } - return D3DFMT_UNKNOWN; + typedef IDirect3D9* WINAPI _Direct3DCreate9(UINT SDKVersion); + auto createD3D = (_Direct3DCreate9*)hD3D->getProcAddress("Direct3DCreate9"); + R_ASSERT(createD3D); + pD3D = createD3D(D3D_SDK_VERSION); + R_ASSERT2(pD3D, "Please install DirectX 9.0c"); } -void CHW::DestroyDevice() -{ - _SHOW_REF("refCount:pBaseZB", pBaseZB); - _RELEASE(pBaseZB); - - _SHOW_REF("refCount:pBaseRT", pBaseRT); - _RELEASE(pBaseRT); -#ifdef DEBUG - _SHOW_REF("refCount:dwDebugSB", dwDebugSB); - _RELEASE(dwDebugSB); -#endif -#ifdef _EDITOR - _RELEASE(HW.pDevice); -#else - _SHOW_REF("DeviceREF:", HW.pDevice); - _RELEASE(HW.pDevice); -#endif - DestroyD3D(); - -#ifndef _EDITOR - free_vid_mode_list(); -#endif -} -void CHW::selectResolution(u32& dwWidth, u32& dwHeight, BOOL bWindowed) +void CHW::DestroyD3D() { - fill_vid_mode_list(this); -#ifndef _EDITOR - if (GEnv.isDedicatedServer) - { - dwWidth = 640; - dwHeight = 480; - } - else -#endif - { - if (bWindowed) - { - dwWidth = psCurrentVidMode[0]; - dwHeight = psCurrentVidMode[1]; - } - else // check - { -#ifndef _EDITOR - string64 buff; - xr_sprintf(buff, sizeof(buff), "%dx%d", psCurrentVidMode[0], psCurrentVidMode[1]); - - if (_ParseItem(buff, GEnv.vid_mode_token) == u32(-1)) // not found - { // select safe - xr_sprintf(buff, sizeof(buff), "vid_mode %s", GEnv.vid_mode_token[0].name); - Console->Execute(buff); - } - - dwWidth = psCurrentVidMode[0]; - dwHeight = psCurrentVidMode[1]; -#endif - } - } - //#endif + _SHOW_REF("refCount:pD3D", pD3D); + _RELEASE(pD3D); } void CHW::CreateDevice(HWND m_hWnd, bool move_window) @@ -196,25 +55,26 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) m_move_window = move_window; CreateD3D(); - bool bWindowed = true; + bool bWindowed = !psDeviceFlags.is(rsFullscreen); #ifndef _EDITOR - if (!GEnv.isDedicatedServer) - bWindowed = !psDeviceFlags.is(rsFullscreen); + if (GEnv.isDedicatedServer) + bWindowed = true; #endif + m_DriverType = Caps.bForceGPU_REF ? D3DDEVTYPE_REF : D3DDEVTYPE_HAL; + DevAdapter = D3DADAPTER_DEFAULT; - DevT = Caps.bForceGPU_REF ? D3DDEVTYPE_REF : D3DDEVTYPE_HAL; // Display the name of video board D3DADAPTER_IDENTIFIER9 adapterID; R_CHK(pD3D->GetAdapterIdentifier(DevAdapter, 0, &adapterID)); Msg("* GPU [vendor:%X]-[device:%X]: %s", adapterID.VendorId, adapterID.DeviceId, adapterID.Description); - u16 drv_Product = HIWORD(adapterID.DriverVersion.HighPart); - u16 drv_Version = LOWORD(adapterID.DriverVersion.HighPart); + u16 drv_Product = HIWORD(adapterID.DriverVersion.HighPart); + u16 drv_Version = LOWORD(adapterID.DriverVersion.HighPart); u16 drv_SubVersion = HIWORD(adapterID.DriverVersion.LowPart); - u16 drv_Build = LOWORD(adapterID.DriverVersion.LowPart); + u16 drv_Build = LOWORD(adapterID.DriverVersion.LowPart); Msg("* GPU driver: %d.%d.%d.%d", u32(drv_Product), u32(drv_Version), u32(drv_SubVersion), u32(drv_Build)); Caps.id_vendor = adapterID.VendorId; @@ -230,7 +90,7 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) if (bWindowed) { fTarget = mWindowed.Format; - R_CHK(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, TRUE)); + R_CHK(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, TRUE)); fDepth = selectDepthStencil(fTarget); } else @@ -239,26 +99,26 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) { case 32: fTarget = D3DFMT_X8R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_A8R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_UNKNOWN; break; case 16: default: fTarget = D3DFMT_R5G6B5; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_X1R5G5B5; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_X4R4G4B4; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, DevT, fTarget, fTarget, FALSE))) + if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter, m_DriverType, fTarget, fTarget, FALSE))) break; fTarget = D3DFMT_UNKNOWN; break; @@ -305,26 +165,26 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) P.Flags = 0; //. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; // Refresh rate - if (!bWindowed) + if (bWindowed) { - P.PresentationInterval = selectPresentInterval(); // Vsync (R1\R2) - P.FullScreen_RefreshRateInHz = selectRefresh(P.BackBufferWidth, P.BackBufferHeight, fTarget); + P.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + P.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; } else { - P.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - P.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; + P.PresentationInterval = selectPresentInterval(); // Vsync (R1\R2) + P.FullScreen_RefreshRateInHz = selectRefresh(P.BackBufferWidth, P.BackBufferHeight, fTarget); } // Create the device u32 GPU = selectGPU(); - HRESULT R = HW.pD3D->CreateDevice(DevAdapter, DevT, m_hWnd, + HRESULT R = HW.pD3D->CreateDevice(DevAdapter, m_DriverType, m_hWnd, GPU | D3DCREATE_MULTITHREADED, //. ? locks at present &P, &pDevice); if (FAILED(R)) { - R = HW.pD3D->CreateDevice(DevAdapter, DevT, m_hWnd, + R = HW.pD3D->CreateDevice(DevAdapter, m_DriverType, m_hWnd, GPU | D3DCREATE_MULTITHREADED, //. ? locks at present &P, &pDevice); } @@ -339,14 +199,13 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) MB_OK | MB_ICONERROR); TerminateProcess(GetCurrentProcess(), 0); }; - R_CHK(R); _SHOW_REF("* CREATE: DeviceREF:", HW.pDevice); switch (GPU) { - case D3DCREATE_SOFTWARE_VERTEXPROCESSING: Log("* Vertex Processor: SOFTWARE"); break; - case D3DCREATE_MIXED_VERTEXPROCESSING: Log("* Vertex Processor: MIXED"); break; - case D3DCREATE_HARDWARE_VERTEXPROCESSING: Log("* Vertex Processor: HARDWARE"); break; + case D3DCREATE_SOFTWARE_VERTEXPROCESSING: Log("* Vertex Processor: SOFTWARE" ); break; + case D3DCREATE_MIXED_VERTEXPROCESSING: Log("* Vertex Processor: MIXED" ); break; + case D3DCREATE_HARDWARE_VERTEXPROCESSING: Log("* Vertex Processor: HARDWARE" ); break; case D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE: Log("* Vertex Processor: PURE HARDWARE"); break; } @@ -357,18 +216,155 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) R_CHK(pDevice->GetRenderTarget(0, &pBaseRT)); R_CHK(pDevice->GetDepthStencilSurface(&pBaseZB)); u32 memory = pDevice->GetAvailableTextureMem(); - Msg("* Texture memory: %d M", memory / (1024 * 1024)); - Msg("* DDI-level: %2.1f", float(D3DXGetDriverLevel(pDevice)) / 100.f); + Msg("* Texture memory: %d M", memory / (1024 * 1024)); + Msg("* DDI-level: %2.1f", float(D3DXGetDriverLevel(pDevice)) / 100.f); #ifndef _EDITOR updateWindowProps(m_hWnd); fill_vid_mode_list(this); #endif } +void CHW::DestroyDevice() +{ + _SHOW_REF("refCount:pBaseZB", pBaseZB); + _RELEASE(pBaseZB); + + _SHOW_REF("refCount:pBaseRT", pBaseRT); + _RELEASE(pBaseRT); +#ifdef DEBUG + _SHOW_REF("refCount:dwDebugSB", dwDebugSB); + _RELEASE(dwDebugSB); +#endif + _SHOW_REF("DeviceREF:", HW.pDevice); + _RELEASE(HW.pDevice); + + DestroyD3D(); + +#ifndef _EDITOR + free_vid_mode_list(); +#endif +} + +////////////////////////////////////////////////////////////////////// +// Resetting device +////////////////////////////////////////////////////////////////////// +void CHW::Reset(HWND hwnd) +{ +#ifdef DEBUG + _RELEASE(dwDebugSB); +#endif + _SHOW_REF("refCount:pBaseZB", pBaseZB); + _SHOW_REF("refCount:pBaseRT", pBaseRT); + _RELEASE(pBaseZB); + _RELEASE(pBaseRT); + +#ifndef _EDITOR + bool bWindowed = true; + if (!GEnv.isDedicatedServer) + bWindowed = !psDeviceFlags.is(rsFullscreen); + + selectResolution(DevPP.BackBufferWidth, DevPP.BackBufferHeight, bWindowed); + // Windoze + DevPP.SwapEffect = bWindowed ? D3DSWAPEFFECT_COPY : D3DSWAPEFFECT_DISCARD; + DevPP.Windowed = bWindowed; + if (!bWindowed) + { + DevPP.PresentationInterval = selectPresentInterval(); // Vsync (R1\R2) + DevPP.FullScreen_RefreshRateInHz = selectRefresh(DevPP.BackBufferWidth, DevPP.BackBufferHeight, Caps.fTarget); + } + else + { + DevPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + DevPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; + } +#endif + + while (true) + { + HRESULT _hr = HW.pDevice->Reset(&DevPP); + if (SUCCEEDED(_hr)) + break; + Msg("! ERROR: [%dx%d]: %s", DevPP.BackBufferWidth, DevPP.BackBufferHeight, xrDebug::ErrorToString(_hr)); + Sleep(100); + } + R_CHK(pDevice->GetRenderTarget(0, &pBaseRT)); + R_CHK(pDevice->GetDepthStencilSurface(&pBaseZB)); +#ifdef DEBUG + R_CHK(pDevice->CreateStateBlock(D3DSBT_ALL, &dwDebugSB)); +#endif +#ifndef _EDITOR + updateWindowProps(hwnd); + ShowWindow(hwnd, SW_SHOWNORMAL); +#endif +} + +D3DFORMAT CHW::selectDepthStencil(D3DFORMAT fTarget) +{ + // R2 hack +#pragma todo("R2 need to specify depth format") + if (GEnv.CurrentRenderer == 2) + return D3DFMT_D24S8; + + // R1 usual + static D3DFORMAT fDS_Try1[6] = { D3DFMT_D24S8, D3DFMT_D24X4S4, D3DFMT_D32, D3DFMT_D24X8, D3DFMT_D16, D3DFMT_D15S1 }; + + D3DFORMAT* fDS_Try = fDS_Try1; + int fDS_Cnt = 6; + + for (int it = 0; it < fDS_Cnt; it++) + { + if (SUCCEEDED(pD3D->CheckDeviceFormat( + DevAdapter, m_DriverType, fTarget, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, fDS_Try[it]))) + { + if (SUCCEEDED(pD3D->CheckDepthStencilMatch(DevAdapter, m_DriverType, fTarget, fTarget, fDS_Try[it]))) + { + return fDS_Try[it]; + } + } + } + return D3DFMT_UNKNOWN; +} + +void CHW::selectResolution(u32& dwWidth, u32& dwHeight, BOOL bWindowed) +{ + fill_vid_mode_list(this); +#ifndef _EDITOR + if (GEnv.isDedicatedServer) + { + dwWidth = 640; + dwHeight = 480; + } + else +#endif + { + if (bWindowed) + { + dwWidth = psCurrentVidMode[0]; + dwHeight = psCurrentVidMode[1]; + } + else // check + { +#ifndef _EDITOR + string64 buff; + xr_sprintf(buff, sizeof(buff), "%dx%d", psCurrentVidMode[0], psCurrentVidMode[1]); + + if (_ParseItem(buff, GEnv.vid_mode_token) == u32(-1)) // not found + { // select safe + xr_sprintf(buff, sizeof(buff), "vid_mode %s", GEnv.vid_mode_token[0].name); + Console->Execute(buff); + } + + dwWidth = psCurrentVidMode[0]; + dwHeight = psCurrentVidMode[1]; +#endif + } + } +} + u32 CHW::selectPresentInterval() { D3DCAPS9 caps; - pD3D->GetDeviceCaps(DevAdapter, DevT, &caps); + pD3D->GetDeviceCaps(DevAdapter, m_DriverType, &caps); if (!psDeviceFlags.test(rsVSync)) { @@ -430,7 +426,7 @@ u32 CHW::selectGPU() return D3DCREATE_SOFTWARE_VERTEXPROCESSING; D3DCAPS9 caps; - pD3D->GetDeviceCaps(DevAdapter, DevT, &caps); + pD3D->GetDeviceCaps(DevAdapter, m_DriverType, &caps); if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) { @@ -452,7 +448,9 @@ u32 CHW::selectGPU() u32 CHW::selectRefresh(u32 dwWidth, u32 dwHeight, D3DFORMAT fmt) { if (psDeviceFlags.is(rsRefresh60hz)) + { return D3DPRESENT_RATE_DEFAULT; + } else { u32 selected = D3DPRESENT_RATE_DEFAULT; @@ -475,7 +473,7 @@ u32 CHW::selectRefresh(u32 dwWidth, u32 dwHeight, D3DFORMAT fmt) BOOL CHW::support(D3DFORMAT fmt, DWORD type, DWORD usage) { - HRESULT hr = pD3D->CheckDeviceFormat(DevAdapter, DevT, Caps.fTarget, usage, (D3DRESOURCETYPE)type, fmt); + HRESULT hr = pD3D->CheckDeviceFormat(DevAdapter, m_DriverType, Caps.fTarget, usage, (D3DRESOURCETYPE)type, fmt); if (FAILED(hr)) return FALSE; else @@ -484,11 +482,11 @@ BOOL CHW::support(D3DFORMAT fmt, DWORD type, DWORD usage) void CHW::updateWindowProps(HWND m_hWnd) { - bool bWindowed = true; + bool bWindowed = !psDeviceFlags.is(rsFullscreen); #ifndef _EDITOR - if (!GEnv.isDedicatedServer) - bWindowed = !psDeviceFlags.is(rsFullscreen); + if (GEnv.isDedicatedServer) + bWindowed = true; #endif u32 dwWindowStyle = 0; @@ -497,9 +495,9 @@ void CHW::updateWindowProps(HWND m_hWnd) { if (m_move_window) { - bool bBordersMode = strstr(Core.Params, "-draw_borders"); + const bool drawBorders = strstr(Core.Params, "-draw_borders"); dwWindowStyle = WS_VISIBLE; - if (bBordersMode) + if (drawBorders) dwWindowStyle |= WS_BORDER | WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX; SetWindowLong(m_hWnd, GWL_STYLE, dwWindowStyle); // When moving from fullscreen to windowed mode, it is important to @@ -513,11 +511,11 @@ void CHW::updateWindowProps(HWND m_hWnd) RECT m_rcWindowBounds; float fYOffset = 0.f; - bool bCenter = false; + bool centerScreen = false; if (GEnv.isDedicatedServer || strstr(Core.Params, "-center_screen")) - bCenter = true; + centerScreen = true; - if (bCenter) + if (centerScreen) { RECT DesktopRect; @@ -531,7 +529,7 @@ void CHW::updateWindowProps(HWND m_hWnd) } else { - if (bBordersMode) + if (drawBorders) fYOffset = GetSystemMetrics(SM_CYCAPTION); // size of the window title bar SetRect(&m_rcWindowBounds, 0, 0, DevPP.BackBufferWidth, DevPP.BackBufferHeight); }; @@ -584,19 +582,24 @@ void fill_vid_mode_list(CHW* _hw) if (GEnv.vid_mode_token != nullptr) return; xr_vector _tmp; - u32 cnt = _hw->pD3D->GetAdapterModeCount(_hw->DevAdapter, _hw->Caps.fTarget); + xr_vector modes; + + // Get the number of display modes available + UINT cnt = _hw->pD3D->GetAdapterModeCount(_hw->DevAdapter, _hw->Caps.fTarget); + + // Get the list of display modes + modes.resize(cnt); + for (auto i = 0; i < cnt; ++i) + _hw->pD3D->EnumAdapterModes(_hw->DevAdapter, _hw->Caps.fTarget, i, &modes[i]); - u32 i; - for (i = 0; i < cnt; ++i) + for (auto &i : modes) { - D3DDISPLAYMODE Mode; string32 str; - _hw->pD3D->EnumAdapterModes(_hw->DevAdapter, _hw->Caps.fTarget, i, &Mode); - if (Mode.Width < 800) + if (i.Width < 800) continue; - xr_sprintf(str, sizeof(str), "%dx%d", Mode.Width, Mode.Height); + xr_sprintf(str, sizeof(str), "%dx%d", i.Width, i.Height); if (_tmp.end() != std::find_if(_tmp.begin(), _tmp.end(), _uniq_mode(str))) continue; @@ -615,7 +618,7 @@ void fill_vid_mode_list(CHW* _hw) #ifdef DEBUG Msg("Available video modes[%d]:", _tmp.size()); #endif // DEBUG - for (i = 0; i < _tmp.size(); ++i) + for (auto i = 0; i < _tmp.size(); ++i) { GEnv.vid_mode_token[i].id = i; GEnv.vid_mode_token[i].name = _tmp[i]; diff --git a/src/Layers/xrRender/HW.h b/src/Layers/xrRender/HW.h index a74376264cc..2fd34af3e20 100644 --- a/src/Layers/xrRender/HW.h +++ b/src/Layers/xrRender/HW.h @@ -1,9 +1,3 @@ -// HW.h: interface for the CHW class. -// -////////////////////////////////////////////////////////////////////// - -#if !defined(AFX_HW_H__0E25CF4A_FFEC_11D3_B4E3_4854E82A090D__INCLUDED_) -#define AFX_HW_H__0E25CF4A_FFEC_11D3_B4E3_4854E82A090D__INCLUDED_ #pragma once #include "HWCaps.h" @@ -78,49 +72,53 @@ class CHW HGLRC m_hRC; #elif defined(USE_DX11) public: - IDXGIAdapter* m_pAdapter; // pD3D equivalent - ID3D11Device* pDevice; // combine with DX9 pDevice via typedef - ID3D11DeviceContext* pContext; // combine with DX9 pDevice via typedef - IDXGISwapChain* m_pSwapChain; - ID3D11RenderTargetView* pBaseRT; // combine with DX9 pBaseRT via typedef - ID3D11DepthStencilView* pBaseZB; + IDXGIFactory1* m_pFactory = nullptr; + IDXGIAdapter1* m_pAdapter = nullptr; // pD3D equivalent + ID3D11Device* pDevice = nullptr; // combine with DX9 pDevice via typedef + ID3D11DeviceContext* pContext = nullptr; // combine with DX9 pDevice via typedef + IDXGISwapChain* m_pSwapChain = nullptr; + ID3D11RenderTargetView* pBaseRT = nullptr; // combine with DX9 pBaseRT via typedef + ID3D11DepthStencilView* pBaseZB = nullptr; CHWCaps Caps; - D3D_DRIVER_TYPE m_DriverType; // DevT equivalent + D3D_DRIVER_TYPE m_DriverType; DXGI_SWAP_CHAIN_DESC m_ChainDesc; // DevPP equivalent D3D_FEATURE_LEVEL FeatureLevel; #elif defined(USE_DX10) public: - IDXGIAdapter* m_pAdapter; // pD3D equivalent - ID3D10Device1* pDevice1; // combine with DX9 pDevice via typedef - ID3D10Device* pDevice; // combine with DX9 pDevice via typedef - ID3D10Device1* pContext1; // combine with DX9 pDevice via typedef - ID3D10Device* pContext; // combine with DX9 pDevice via typedef - IDXGISwapChain* m_pSwapChain; - ID3D10RenderTargetView* pBaseRT; // combine with DX9 pBaseRT via typedef - ID3D10DepthStencilView* pBaseZB; + IDXGIFactory1* m_pFactory = nullptr; + IDXGIAdapter1* m_pAdapter = nullptr; // pD3D equivalent + ID3D10Device1* pDevice1 = nullptr; // combine with DX9 pDevice via typedef + ID3D10Device* pDevice = nullptr; // combine with DX9 pDevice via typedef + ID3D10Device1* pContext1 = nullptr; // combine with DX9 pDevice via typedef + ID3D10Device* pContext = nullptr; // combine with DX9 pDevice via typedef + IDXGISwapChain* m_pSwapChain = nullptr; + ID3D10RenderTargetView* pBaseRT = nullptr; // combine with DX9 pBaseRT via typedef + ID3D10DepthStencilView* pBaseZB = nullptr; CHWCaps Caps; - D3D10_DRIVER_TYPE m_DriverType; // DevT equivalent + D3D10_DRIVER_TYPE m_DriverType; DXGI_SWAP_CHAIN_DESC m_ChainDesc; // DevPP equivalent D3D_FEATURE_LEVEL FeatureLevel; #else private: - XRay::Module hD3D; +#ifdef DEBUG + IDirect3DStateBlock9* dwDebugSB = nullptr; +#endif + XRay::Module hD3D = nullptr; public: - IDirect3D9* pD3D; // D3D - IDirect3DDevice9* pDevice; // render device - - IDirect3DSurface9* pBaseRT; - IDirect3DSurface9* pBaseZB; + IDirect3D9* pD3D = nullptr; // D3D + IDirect3DDevice9* pDevice = nullptr; // render device + IDirect3DSurface9* pBaseRT = nullptr; + IDirect3DSurface9* pBaseZB = nullptr; CHWCaps Caps; UINT DevAdapter; - D3DDEVTYPE DevT; + D3DDEVTYPE m_DriverType; D3DPRESENT_PARAMETERS DevPP; #endif // USE_DX10 @@ -147,12 +145,10 @@ class CHW HRESULT Present(UINT SyncInterval, UINT Flags); #endif // USE_OGL - int maxRefreshRate; //ECO_RENDER add + int maxRefreshRate = 200; //ECO_RENDER add private: - bool m_move_window; + bool m_move_window = true; }; extern ECORE_API CHW HW; - -#endif // !defined(AFX_HW_H__0E25CF4A_FFEC_11D3_B4E3_4854E82A090D__INCLUDED_) diff --git a/src/Layers/xrRender/SH_RT.cpp b/src/Layers/xrRender/SH_RT.cpp index 932913781b4..3383882c2a0 100644 --- a/src/Layers/xrRender/SH_RT.cpp +++ b/src/Layers/xrRender/SH_RT.cpp @@ -68,7 +68,7 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 /*SampleCount*/) usage = D3DUSAGE_RENDERTARGET; // Validate render-target usage - _hr = HW.pD3D->CheckDeviceFormat(HW.DevAdapter, HW.DevT, HW.Caps.fTarget, usage, D3DRTYPE_TEXTURE, f); + _hr = HW.pD3D->CheckDeviceFormat(HW.DevAdapter, HW.m_DriverType, HW.Caps.fTarget, usage, D3DRTYPE_TEXTURE, f); if (FAILED(_hr)) return; @@ -150,7 +150,7 @@ void CRTC::create (LPCSTR Name, u32 size, D3DFORMAT f) // Validate render-target usage _hr = HW.pD3D->CheckDeviceFormat( HW.DevAdapter, - HW.DevT, + HW.m_DriverType, HW.Caps.fTarget, D3DUSAGE_RENDERTARGET, D3DRTYPE_CUBETEXTURE, diff --git a/src/Layers/xrRenderDX10/dx10HW.cpp b/src/Layers/xrRenderDX10/dx10HW.cpp index 304c27a110f..8411629f05e 100644 --- a/src/Layers/xrRenderDX10/dx10HW.cpp +++ b/src/Layers/xrRenderDX10/dx10HW.cpp @@ -1,13 +1,5 @@ -// dx10HW.cpp: implementation of the DX10 specialisation of CHW. -////////////////////////////////////////////////////////////////////// - #include "stdafx.h" -#pragma warning(push) -#pragma warning(disable : 4995) -#include -#pragma warning(pop) - #include "Layers/xrRender/HW.h" #include "xrEngine/XR_IOConsole.h" #include "xrCore/xr_token.h" @@ -30,20 +22,7 @@ void free_render_mode_list() {} CHW HW; -// DX10: Don't need this? -/* -#ifdef DEBUG -IDirect3DStateBlock9* dwDebugSB = 0; -#endif -*/ - CHW::CHW() - : // hD3D(NULL), - // pD3D(NULL), - m_pAdapter(0), - pDevice(NULL), m_move_window(true) -// pBaseRT(NULL), -// pBaseZB(NULL) { Device.seqAppActivate.Add(this); Device.seqAppDeactivate.Add(this); @@ -54,57 +33,42 @@ CHW::~CHW() Device.seqAppActivate.Remove(this); Device.seqAppDeactivate.Remove(this); } + +void CHW::OnAppActivate() +{ + if (m_pSwapChain && !m_ChainDesc.Windowed) + { + ShowWindow(m_ChainDesc.OutputWindow, SW_RESTORE); + m_pSwapChain->SetFullscreenState(TRUE, NULL); + } +} + +void CHW::OnAppDeactivate() +{ + if (m_pSwapChain && !m_ChainDesc.Windowed) + { + m_pSwapChain->SetFullscreenState(FALSE, NULL); + ShowWindow(m_ChainDesc.OutputWindow, SW_MINIMIZE); + } +} + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// void CHW::CreateD3D() { - /* Partially implemented dynamic load - LPCSTR _name = "d3d10.dll"; - - hD3D = LoadLibrary(_name); - - // If library can't be loaded computer don't support DirectX 10 at all - if (!hD3D) return; - // check if adapter support Direc3D 10 interface - - typedef HRESULT _CreateDXGIFactory( REFIID riid, void **ppFactory); - - _CreateDXGIFactory *CreateFactory = (_CreateDXGIFactory*)GetProcAddress(hD3D,"CreateDXGIFactory"); - R_ASSERT(CreateFactory); - - IDXGIFactory * pFactory; - R_CHK( CreateFactory(__uuidof(IDXGIFactory), (void**)(&pFactory)) ); - pFactory->EnumAdapters(0, &m_pAdapter); - pFactory->Release(); - */ - - IDXGIFactory* pFactory; - - R_CHK(CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&pFactory))); - - pFactory->EnumAdapters(0, &m_pAdapter); - - pFactory->Release(); - - /* - R_ASSERT2 (hD3D,"Can't find 'd3d10.dll'\nPlease install latest version of DirectX before - running this program"); - typedef IDirect3D9 * WINAPI _Direct3DCreate9(UINT SDKVersion); - _Direct3DCreate9* createD3D = (_Direct3DCreate9*)GetProcAddress(hD3D,"Direct3DCreate9"); R_ASSERT(createD3D); - this->pD3D = createD3D( D3D_SDK_VERSION ); - R_ASSERT2 (this->pD3D,"Please install DirectX 9.0c"); - */ + // Минимально поддерживаемая версия Windows => Windows Vista SP2 или Windows 7. + R_CHK(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)(&m_pFactory))); + R_CHK(m_pFactory->EnumAdapters1(0, &m_pAdapter)); } void CHW::DestroyD3D() { - //_RELEASE (this->pD3D); - _SHOW_REF("refCount:m_pAdapter", m_pAdapter); _RELEASE(m_pAdapter); - // FreeLibrary(hD3D); + _SHOW_REF("refCount:m_pFactory", m_pFactory); + _RELEASE(m_pFactory); } void CHW::CreateDevice(HWND m_hWnd, bool move_window) @@ -112,65 +76,19 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) m_move_window = move_window; CreateD3D(); - /* Partially implemented dynamic load - typedef HRESULT _D3DxxCreateDeviceAndSwapChain( - IDXGIAdapter *pAdapter, - D3Dxx_DRIVER_TYPE DriverType, - HMODULE Software, - UINT Flags, - UINT SDKVersion, - DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, - IDXGISwapChain **ppSwapChain, - ID3DxxDevice **ppDevice - ); - - - - _D3DxxCreateDeviceAndSwapChain *CreateDeviceAndSwapChain = - (_D3DxxCreateDeviceAndSwapChain*) - GetProcAddress(hD3D,"D3DxxCreateDeviceAndSwapChain"); - R_ASSERT(CreateDeviceAndSwapChain); - */ - - // TODO: DX10: Create appropriate initialization - - // General - select adapter and device - BOOL bWindowed = !psDeviceFlags.is(rsFullscreen); + bool bWindowed = !psDeviceFlags.is(rsFullscreen); m_DriverType = Caps.bForceGPU_REF ? D3D_DRIVER_TYPE_REFERENCE : D3D_DRIVER_TYPE_HARDWARE; // Display the name of video board - DXGI_ADAPTER_DESC Desc; - R_CHK(m_pAdapter->GetDesc(&Desc)); + DXGI_ADAPTER_DESC1 Desc; + R_CHK(m_pAdapter->GetDesc1(&Desc)); // Warning: Desc.Description is wide string Msg("* GPU [vendor:%X]-[device:%X]: %S", Desc.VendorId, Desc.DeviceId, Desc.Description); - /* - // Display the name of video board - D3DADAPTER_IDENTIFIER9 adapterID; - R_CHK (pD3D->GetAdapterIdentifier(DevAdapter,0,&adapterID)); - Msg ("* GPU [vendor:%X]-[device:%X]: %s",adapterID.VendorId,adapterID.DeviceId,adapterID.Description); - - u16 drv_Product = HIWORD(adapterID.DriverVersion.HighPart); - u16 drv_Version = LOWORD(adapterID.DriverVersion.HighPart); - u16 drv_SubVersion = HIWORD(adapterID.DriverVersion.LowPart); - u16 drv_Build = LOWORD(adapterID.DriverVersion.LowPart); - Msg ("* GPU driver: %d.%d.%d.%d",u32(drv_Product),u32(drv_Version),u32(drv_SubVersion), u32(drv_Build)); - */ - - /* - Caps.id_vendor = adapterID.VendorId; - Caps.id_device = adapterID.DeviceId; - */ Caps.id_vendor = Desc.VendorId; Caps.id_device = Desc.DeviceId; - /* - // Retreive windowed mode - D3DDISPLAYMODE mWindowed; - R_CHK(pD3D->GetAdapterDisplayMode(DevAdapter, &mWindowed)); - - */ // Select back-buffer & depth-stencil format D3DFORMAT& fTarget = Caps.fTarget; D3DFORMAT& fDepth = Caps.fDepth; @@ -178,53 +96,6 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) // HACK: DX10: Embed hard target format. fTarget = D3DFMT_X8R8G8B8; // No match in DX10. D3DFMT_A8B8G8R8->DXGI_FORMAT_R8G8B8A8_UNORM fDepth = selectDepthStencil(fTarget); - /* - if (bWindowed) - { - fTarget = mWindowed.Format; - R_CHK(pD3D->CheckDeviceType (DevAdapter,DevT,fTarget,fTarget,TRUE)); - fDepth = selectDepthStencil(fTarget); - } else { - switch (psCurrentBPP) { - case 32: - fTarget = D3DFMT_X8R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_A8R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_R8G8B8; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_UNKNOWN; - break; - case 16: - default: - fTarget = D3DFMT_R5G6B5; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_X1R5G5B5; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_X4R4G4B4; - if (SUCCEEDED(pD3D->CheckDeviceType(DevAdapter,DevT,fTarget,fTarget,FALSE))) - break; - fTarget = D3DFMT_UNKNOWN; - break; - } - fDepth = selectDepthStencil(fTarget); - } - - - if ((D3DFMT_UNKNOWN==fTarget) || (D3DFMT_UNKNOWN==fTarget)) { - Msg ("Failed to initialize graphics hardware.\nPlease try to restart the game."); - FlushLog (); - MessageBox (NULL,"Failed to initialize graphics hardware.\nPlease try to restart the - game.","Error!",MB_OK|MB_ICONERROR); - TerminateProcess (GetCurrentProcess(),0); - } - - */ // Set up the presentation parameters DXGI_SWAP_CHAIN_DESC& sd = m_ChainDesc; @@ -245,24 +116,16 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) sd.SampleDesc.Quality = 0; // Windoze - // P.SwapEffect = bWindowed?D3DSWAPEFFECT_COPY:D3DSWAPEFFECT_DISCARD; - // P.hDeviceWindow = m_hWnd; - // P.Windowed = bWindowed; sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; sd.OutputWindow = m_hWnd; sd.Windowed = bWindowed; - // Depth/stencil - // DX10 don't need this? - // P.EnableAutoDepthStencil= TRUE; - // P.AutoDepthStencilFormat= fDepth; - // P.Flags = 0; //. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; + // Depth/stencil (DX10 don't need this?) + //P.EnableAutoDepthStencil = TRUE; + //P.AutoDepthStencilFormat = fDepth; + //P.Flags = 0; //. D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL; // Refresh rate - // P.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - // if( !bWindowed ) P.FullScreen_RefreshRateInHz = selectRefresh (P.BackBufferWidth, - // P.BackBufferHeight,fTarget); - // else P.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; if (bWindowed) { sd.BufferDesc.RefreshRate.Numerator = 60; @@ -281,9 +144,6 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) // createDeviceFlags |= D3Dxx_CREATE_DEVICE_DEBUG; #endif HRESULT R; -// Create the device -// DX10 don't need it? -// u32 GPU = selectGPU(); #ifdef USE_DX11 D3D_FEATURE_LEVEL pFeatureLevels[] = { D3D_FEATURE_LEVEL_11_0, @@ -291,12 +151,14 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) // D3D_FEATURE_LEVEL_10_0, }; - R = D3D11CreateDeviceAndSwapChain( - 0, // m_pAdapter,//What wrong with adapter??? We should use another version of DXGI????? - m_DriverType, NULL, createDeviceFlags, pFeatureLevels, sizeof(pFeatureLevels) / sizeof(pFeatureLevels[0]), - D3D11_SDK_VERSION, &sd, &m_pSwapChain, &pDevice, &FeatureLevel, &pContext); + R = D3D11CreateDevice(m_pAdapter, + D3D_DRIVER_TYPE_UNKNOWN, // Если мы выбираем конкретный адаптер, то мы обязаны использовать D3D_DRIVER_TYPE_UNKNOWN. + NULL, createDeviceFlags, pFeatureLevels, sizeof(pFeatureLevels) / sizeof(pFeatureLevels[0]), + D3D11_SDK_VERSION, &pDevice, &FeatureLevel, &pContext); + + R_CHK(m_pFactory->CreateSwapChain(pDevice, &sd, &m_pSwapChain)); #else - R = D3DX10CreateDeviceAndSwapChain(m_pAdapter, m_DriverType, NULL, createDeviceFlags, &sd, &m_pSwapChain, &pDevice); + R = D3D10CreateDevice(m_pAdapter, m_DriverType, NULL, createDeviceFlags, D3D10_SDK_VERSION, &pDevice); pContext = pDevice; FeatureLevel = D3D_FEATURE_LEVEL_10_0; @@ -307,18 +169,8 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) } pContext1 = pDevice1; #endif + R_CHK(m_pFactory->CreateSwapChain(pDevice, &sd, &m_pSwapChain)); - /* - if (FAILED(R)) { - R = HW.pD3D->CreateDevice( DevAdapter, - DevT, - m_hWnd, - GPU | D3DCREATE_MULTITHREADED, //. ? locks at present - &P, - &pDevice ); - } - */ - // if (D3DERR_DEVICELOST==R) { if (FAILED(R)) { // Fatal error! Cannot create rendering device AT STARTUP !!! @@ -326,43 +178,19 @@ void CHW::CreateDevice(HWND m_hWnd, bool move_window) "Please try to restart the game.\n" "CreateDevice returned 0x%08x", R); FlushLog(); - MessageBox(NULL, "Failed to initialize graphics hardware.\nPlease try to restart the game.", "Error!", + MessageBox(nullptr, "Failed to initialize graphics hardware.\nPlease try to restart the game.", "Error!", MB_OK | MB_ICONERROR); TerminateProcess(GetCurrentProcess(), 0); }; - R_CHK(R); _SHOW_REF("* CREATE: DeviceREF:", HW.pDevice); - /* - switch (GPU) - { - case D3DCREATE_SOFTWARE_VERTEXPROCESSING: - Log ("* Vertex Processor: SOFTWARE"); - break; - case D3DCREATE_MIXED_VERTEXPROCESSING: - Log ("* Vertex Processor: MIXED"); - break; - case D3DCREATE_HARDWARE_VERTEXPROCESSING: - Log ("* Vertex Processor: HARDWARE"); - break; - case D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE: - Log ("* Vertex Processor: PURE HARDWARE"); - break; - } - */ - // Capture misc data - // DX10: Don't neeed this? - //#ifdef DEBUG - // R_CHK (pDevice->CreateStateBlock (D3DSBT_ALL,&dwDebugSB)); - //#endif // Create render target and depth-stencil views here UpdateViews(); - // u32 memory = pDevice->GetAvailableTextureMem (); size_t memory = Desc.DedicatedVideoMemory; - Msg("* Texture memory: %d M", memory / (1024 * 1024)); -// Msg ("* DDI-level: %2.1f", float(D3DXGetDriverLevel(pDevice))/100.f); + Msg("* Texture memory: %d M", memory / (1024 * 1024)); + //Msg("* DDI-level: %2.1f", float(D3DXGetDriverLevel(pDevice)) / 100.f); #ifndef _EDITOR updateWindowProps(m_hWnd); fill_vid_mode_list(this); @@ -383,10 +211,6 @@ void CHW::DestroyDevice() _SHOW_REF("refCount:pBaseRT", pBaseRT); _RELEASE(pBaseRT); - //#ifdef DEBUG - // _SHOW_REF ("refCount:dwDebugSB",dwDebugSB); - // _RELEASE (dwDebugSB); - //#endif // Must switch to windowed mode to release swap chain if (!m_ChainDesc.Windowed) @@ -430,9 +254,7 @@ void CHW::Reset(HWND hwnd) else desc.RefreshRate = selectRefresh(desc.Width, desc.Height, desc.Format); CHK_DX(m_pSwapChain->ResizeTarget(&desc)); -#ifdef DEBUG -// _RELEASE (dwDebugSB); -#endif + _SHOW_REF("refCount:pBaseZB", pBaseZB); _SHOW_REF("refCount:pBaseRT", pBaseRT); _RELEASE(pBaseZB); @@ -441,70 +263,8 @@ void CHW::Reset(HWND hwnd) cd.BufferCount, desc.Width, desc.Height, desc.Format, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH)); UpdateViews(); - /* - // Windoze - DevPP.SwapEffect = bWindowed?D3DSWAPEFFECT_COPY:D3DSWAPEFFECT_DISCARD; - DevPP.Windowed = bWindowed; - DevPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - if( !bWindowed ) DevPP.FullScreen_RefreshRateInHz = selectRefresh - (DevPP.BackBufferWidth,DevPP.BackBufferHeight,Caps.fTarget); - else DevPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; - #endif - - while (TRUE) { - HRESULT _hr = HW.pDevice->Reset (&DevPP); - if (SUCCEEDED(_hr)) break; - Msg ("! ERROR: [%dx%d]: %s",DevPP.BackBufferWidth,DevPP.BackBufferHeight,xrDebug::ErrorToString(_hr)); - Sleep (100); - } - R_CHK (pDevice->GetRenderTarget (0,&pBaseRT)); - R_CHK (pDevice->GetDepthStencilSurface (&pBaseZB)); - */ - - //#ifdef DEBUG - // R_CHK (pDevice->CreateStateBlock (D3DSBT_ALL,&dwDebugSB)); - //#endif - updateWindowProps(hwnd); ShowWindow(hwnd, SW_SHOWNORMAL); - - /* -#ifdef DEBUG -_RELEASE (dwDebugSB); -#endif -_RELEASE (pBaseZB); -_RELEASE (pBaseRT); - -BOOL bWindowed = !psDeviceFlags.is (rsFullscreen); -#else -BOOL bWindowed = TRUE; -#endif - -selectResolution (DevPP.BackBufferWidth, DevPP.BackBufferHeight, bWindowed); -// Windoze -DevPP.SwapEffect = bWindowed?D3DSWAPEFFECT_COPY:D3DSWAPEFFECT_DISCARD; -DevPP.Windowed = bWindowed; -DevPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; -if( !bWindowed ) DevPP.FullScreen_RefreshRateInHz = selectRefresh -(DevPP.BackBufferWidth,DevPP.BackBufferHeight,Caps.fTarget); -else DevPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; -#endif - -while (TRUE) { - HRESULT _hr = HW.pDevice->Reset (&DevPP); - if (SUCCEEDED(_hr)) break; - Msg ("! ERROR: [%dx%d]: %s",DevPP.BackBufferWidth,DevPP.BackBufferHeight,xrDebug::ErrorToString(_hr)); - Sleep (100); -} -R_CHK (pDevice->GetRenderTarget (0,&pBaseRT)); -R_CHK (pDevice->GetDepthStencilSurface (&pBaseZB)); -#ifdef DEBUG -R_CHK (pDevice->CreateStateBlock (D3DSBT_ALL,&dwDebugSB)); -#endif -#ifndef _EDITOR -updateWindowProps (hwnd); -#endif -*/ } D3DFORMAT CHW::selectDepthStencil(D3DFORMAT /*fTarget*/) @@ -539,53 +299,11 @@ void CHW::selectResolution(u32& dwWidth, u32& dwHeight, BOOL bWindowed) } } -// TODO: DX10: check if we need these -/* -u32 CHW::selectPresentInterval () -{ - D3DCAPS9 caps; - pD3D->GetDeviceCaps(DevAdapter,DevT,&caps); - - if (!psDeviceFlags.test(rsVSync)) - { - if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) - return D3DPRESENT_INTERVAL_IMMEDIATE; - if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE) - return D3DPRESENT_INTERVAL_ONE; - } - return D3DPRESENT_INTERVAL_DEFAULT; -} - -u32 CHW::selectGPU () -{ - if (Caps.bForceGPU_SW) return D3DCREATE_SOFTWARE_VERTEXPROCESSING; - - D3DCAPS9 caps; - pD3D->GetDeviceCaps(DevAdapter,DevT,&caps); - - if(caps.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT) - { - if (Caps.bForceGPU_NonPure) return D3DCREATE_HARDWARE_VERTEXPROCESSING; - else { - if (caps.DevCaps&D3DDEVCAPS_PUREDEVICE) return D3DCREATE_HARDWARE_VERTEXPROCESSING|D3DCREATE_PUREDEVICE; - else return D3DCREATE_HARDWARE_VERTEXPROCESSING; - } - // return D3DCREATE_MIXED_VERTEXPROCESSING; - } else return D3DCREATE_SOFTWARE_VERTEXPROCESSING; -} -*/ DXGI_RATIONAL CHW::selectRefresh(u32 dwWidth, u32 dwHeight, DXGI_FORMAT fmt) { - DXGI_RATIONAL res; - - res.Numerator = 60; - res.Denominator = 1; - - float CurrentFreq = 60.0f; - if (psDeviceFlags.is(rsRefresh60hz)) { - return res; + return DXGI_RATIONAL({ 60, 1 }); } else { @@ -600,7 +318,7 @@ DXGI_RATIONAL CHW::selectRefresh(u32 dwWidth, u32 dwHeight, DXGI_FORMAT fmt) UINT flags = 0; // Get the number of display modes available - pOutput->GetDisplayModeList(format, flags, &num, 0); + pOutput->GetDisplayModeList(format, flags, &num, nullptr); // Get the list of display modes modes.resize(num); @@ -608,18 +326,19 @@ DXGI_RATIONAL CHW::selectRefresh(u32 dwWidth, u32 dwHeight, DXGI_FORMAT fmt) _RELEASE(pOutput); - for (u32 i = 0; i < num; ++i) - { - DXGI_MODE_DESC& desc = modes[i]; + float CurrentFreq = 60.0f; + DXGI_RATIONAL res = { 60, 1 }; - if ((desc.Width == dwWidth) && (desc.Height == dwHeight)) + for (auto &i : modes) + { + if ((i.Width == dwWidth) && (i.Height == dwHeight)) { - VERIFY(desc.RefreshRate.Denominator); - float TempFreq = float(desc.RefreshRate.Numerator) / float(desc.RefreshRate.Denominator); + VERIFY(i.RefreshRate.Denominator); + float TempFreq = float(i.RefreshRate.Numerator) / float(i.RefreshRate.Denominator); if (TempFreq > CurrentFreq) { CurrentFreq = TempFreq; - res = desc.RefreshRate; + res = i.RefreshRate; } } } @@ -628,39 +347,16 @@ DXGI_RATIONAL CHW::selectRefresh(u32 dwWidth, u32 dwHeight, DXGI_FORMAT fmt) } } -void CHW::OnAppActivate() -{ - if (m_pSwapChain && !m_ChainDesc.Windowed) - { - ShowWindow(m_ChainDesc.OutputWindow, SW_RESTORE); - m_pSwapChain->SetFullscreenState(TRUE, NULL); - } -} - -void CHW::OnAppDeactivate() -{ - if (m_pSwapChain && !m_ChainDesc.Windowed) - { - m_pSwapChain->SetFullscreenState(FALSE, NULL); - ShowWindow(m_ChainDesc.OutputWindow, SW_MINIMIZE); - } -} - BOOL CHW::support(D3DFORMAT fmt, DWORD type, DWORD usage) { - // TODO: DX10: implement stub for this code. + // TODO: DX10: implement stub for this code. VERIFY(!"Implement CHW::support"); - /* - HRESULT hr = pD3D->CheckDeviceFormat(DevAdapter,DevT,Caps.fTarget,usage,(D3DRESOURCETYPE)type,fmt); - if (FAILED(hr)) return FALSE; - else return TRUE; - */ return TRUE; } void CHW::updateWindowProps(HWND m_hWnd) { - const bool bWindowed = !psDeviceFlags.is(rsFullscreen); + bool bWindowed = !psDeviceFlags.is(rsFullscreen); u32 dwWindowStyle = 0; // Set window properties depending on what mode were in. @@ -740,12 +436,12 @@ void free_vid_mode_list() xr_free(GEnv.vid_mode_token[i].name); } xr_free(GEnv.vid_mode_token); - GEnv.vid_mode_token = NULL; + GEnv.vid_mode_token = nullptr; } void fill_vid_mode_list(CHW* _hw) { - if (GEnv.vid_mode_token != NULL) + if (GEnv.vid_mode_token != nullptr) return; xr_vector _tmp; xr_vector modes; @@ -755,46 +451,46 @@ void fill_vid_mode_list(CHW* _hw) _hw->m_pAdapter->EnumOutputs(0, &pOutput); VERIFY(pOutput); - UINT num = 0; + UINT cnt = 0; DXGI_FORMAT format = DXGI_FORMAT_R8G8B8A8_UNORM; UINT flags = 0; // Get the number of display modes available - pOutput->GetDisplayModeList(format, flags, &num, 0); + pOutput->GetDisplayModeList(format, flags, &cnt, nullptr); // Get the list of display modes - modes.resize(num); - pOutput->GetDisplayModeList(format, flags, &num, &modes.front()); + modes.resize(cnt); + pOutput->GetDisplayModeList(format, flags, &cnt, &modes.front()); _RELEASE(pOutput); - for (u32 i = 0; i < num; ++i) + for (auto &i : modes) { - DXGI_MODE_DESC& desc = modes[i]; string32 str; - if (desc.Width < 800) + if (i.Width < 800) continue; - xr_sprintf(str, sizeof(str), "%dx%d", desc.Width, desc.Height); + xr_sprintf(str, sizeof(str), "%dx%d", i.Width, i.Height); if (_tmp.end() != std::find_if(_tmp.begin(), _tmp.end(), _uniq_mode(str))) continue; - _tmp.push_back(NULL); + _tmp.push_back(nullptr); _tmp.back() = xr_strdup(str); } + u32 _cnt = _tmp.size() + 1; GEnv.vid_mode_token = xr_alloc(_cnt); GEnv.vid_mode_token[_cnt - 1].id = -1; - GEnv.vid_mode_token[_cnt - 1].name = NULL; + GEnv.vid_mode_token[_cnt - 1].name = nullptr; #ifdef DEBUG Msg("Available video modes[%d]:", _tmp.size()); #endif // DEBUG - for (u32 i = 0; i < _tmp.size(); ++i) + for (auto i = 0; i < _tmp.size(); ++i) { GEnv.vid_mode_token[i].id = i; GEnv.vid_mode_token[i].name = _tmp[i]; @@ -816,7 +512,7 @@ void CHW::UpdateViews() R_CHK(R); R = pDevice->CreateRenderTargetView(pBuffer, NULL, &pBaseRT); - pBuffer->Release(); + _RELEASE(pBuffer); R_CHK(R); // Create Depth/stencil buffer @@ -844,6 +540,6 @@ void CHW::UpdateViews() R = pDevice->CreateDepthStencilView(pDepthStencil, NULL, &pBaseZB); R_CHK(R); - pDepthStencil->Release(); + _RELEASE(pDepthStencil); } #endif diff --git a/src/Layers/xrRenderDX10/dx10SH_RT.cpp b/src/Layers/xrRenderDX10/dx10SH_RT.cpp index 978e1c074e6..b42f139db26 100644 --- a/src/Layers/xrRenderDX10/dx10SH_RT.cpp +++ b/src/Layers/xrRenderDX10/dx10SH_RT.cpp @@ -93,7 +93,7 @@ void CRT::create(LPCSTR Name, u32 w, u32 h, D3DFORMAT f, u32 SampleCount) // Validate render-target usage //_hr = HW.pD3D->CheckDeviceFormat( // HW.DevAdapter, - // HW.DevT, + // HW.m_DriverType, // HW.Caps.fTarget, // usage, // D3DRTYPE_TEXTURE, @@ -268,7 +268,7 @@ void CRTC::create (LPCSTR Name, u32 size, D3DFORMAT f) // Validate render-target usage //_hr = HW.pD3D->CheckDeviceFormat( // HW.DevAdapter, - // HW.DevT, + // HW.m_DriverType, // HW.Caps.fTarget, // D3DUSAGE_RENDERTARGET, // D3DRTYPE_CUBETEXTURE,