From b48931d6045719162c19d2316d6d6f68857ab62c Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Sat, 11 Feb 2023 01:43:03 +0300 Subject: [PATCH 1/3] dxvk: add basic DXVK Native support and cmake for Gallium Nine --- CMakeLists.txt | 41 ++++++ Externals/imgui-proj/imgui.cmake | 2 + src/Common/PlatformLinux.inl | 17 +++ src/Layers/CMakeLists.txt | 2 +- src/Layers/xrRender/Debug/dxPixEventWrapper.h | 2 +- src/Layers/xrRender/DetailModel.cpp | 2 +- src/Layers/xrRender/R_Backend_Runtime.cpp | 4 +- src/Layers/xrRender/SH_Texture.cpp | 6 + src/Layers/xrRender/ShaderResourceTraits.h | 4 + src/Layers/xrRender/Texture.cpp | 16 ++ .../xrRender/blenders/Blender_LaEmB.cpp | 2 +- src/Layers/xrRender/r__screenshot.cpp | 2 + src/Layers/xrRender/r_constants.cpp | 2 + src/Layers/xrRenderDX9/BufferUtils.cpp | 12 ++ src/Layers/xrRenderDX9/CommonTypes.h | 4 + src/Layers/xrRenderDX9/dx9HW.cpp | 21 +++ src/Layers/xrRenderDX9/dx9HWCaps.cpp | 4 +- .../dx9ResourceManager_Resources.cpp | 4 + src/Layers/xrRenderPC_R1/CMakeLists.txt | 139 ++++++++++++++++-- .../xrRenderPC_R1/FStaticRender_Blenders.cpp | 28 ++-- .../xrRenderPC_R1/FStaticRender_Shaders.cpp | 9 +- src/Layers/xrRenderPC_R1/LightShadows.cpp | 8 + src/Layers/xrRenderPC_R1/stdafx.h | 14 +- 23 files changed, 306 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7caceb465eb..c3d85631b03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,6 +71,10 @@ if (STATIC_BUILD) #add_definitions(-DXRAY_STATIC_BUILD) endif() +if (NOT WIN32) + option(USE_MESA_NINE "Use Gallium Nine from Mesa (without WINE) for D3D9 API" OFF) +endif() + function(xr_install tgt) if (NOT MSVC) install(TARGETS ${tgt} DESTINATION "." @@ -251,6 +255,43 @@ if (NOT WIN32) find_package(Theora REQUIRED) find_package(LZO REQUIRED) find_package(mimalloc NAMES mimalloc2 mimalloc2.0 mimalloc) + + if (USE_MESA_NINE) # for Gallium Nine + message("Using Gallium Nine for native D3D9 API") + + #sudo apt install libd3dadapter9-mesa-dev + find_package(PkgConfig REQUIRED) + pkg_check_modules(D3D REQUIRED IMPORTED_TARGET d3d) + + add_subdirectory(nine-native) + set(NINE_NATIVE_INCLUDE_DIRS + "${CMAKE_CURRENT_SOURCE_DIR}/Externals/nine-native/include" + "${CMAKE_CURRENT_SOURCE_DIR}/Externals/nine-native/include/D3D9" + ) + include_directories("${NINE_NATIVE_INCLUDE_DIRS}") + else() # for DXVK Native + message("Using DXVK-native for D3D9 API") + + include(ExternalProject) + ExternalProject_Add(dxvk-native + GIT_REPOSITORY https://github.com/q4a/dxvk-native + GIT_TAG 304434892a241d1c5be580f5a66f8a7418cbd675 + GIT_SHALLOW ON + BUILD_ALWAYS OFF + CONFIGURE_HANDLED_BY_BUILD ON + CONFIGURE_COMMAND meson ../dxvk-native + BUILD_COMMAND ninja + INSTALL_COMMAND "" + ) + ExternalProject_Get_property(dxvk-native SOURCE_DIR BINARY_DIR) + set(DXVK_NATIVE_INCLUDE_DIRS + "${SOURCE_DIR}/include/native/directx" + "${SOURCE_DIR}/include/native/windows" + ) + set(DXVK_NATIVE_D3D9_LIB ${BINARY_DIR}/src/d3d9/libdxvk_d3d9.so) + include_directories("${DXVK_NATIVE_INCLUDE_DIRS}") + ADD_CUSTOM_TARGET(dependencies ALL DEPENDS dxvk-native) + endif() endif() # Memory allocator option diff --git a/Externals/imgui-proj/imgui.cmake b/Externals/imgui-proj/imgui.cmake index 4098a51e430..cfcf5fc88b5 100644 --- a/Externals/imgui-proj/imgui.cmake +++ b/Externals/imgui-proj/imgui.cmake @@ -13,6 +13,8 @@ set(KERNEL_SRC "${IMGUI_DIR}/imgui_internal.h" "${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp" "${IMGUI_DIR}/backends/imgui_impl_opengl3.h" + "${IMGUI_DIR}/backends/imgui_impl_dx9.cpp" + "${IMGUI_DIR}/backends/imgui_impl_dx9.h" "${IMGUI_DIR}/imstb_rectpack.h" "${IMGUI_DIR}/imstb_textedit.h" "${IMGUI_DIR}/imstb_truetype.h" diff --git a/src/Common/PlatformLinux.inl b/src/Common/PlatformLinux.inl index dd2ec9595d6..64a389bd5fe 100644 --- a/src/Common/PlatformLinux.inl +++ b/src/Common/PlatformLinux.inl @@ -46,6 +46,8 @@ #define __declspec(x) #define CALLBACK #define TEXT(x) strdup(x) +#define LOWORD(l) ((uint16_t) (l)) +#define HIWORD(l) ((uint16_t) (((uint32_t) (l) >> 16) & 0xffff)) /* inline char* _strlwr_l(char* str, locale_t loc) @@ -161,7 +163,9 @@ typedef char* LPTSTR; typedef const char* LPCSTR; typedef const char* LPCTSTR; typedef unsigned int UINT; +#ifndef USE_DX9 typedef long long int LARGE_INTEGER; +#endif typedef unsigned long long int ULARGE_INTEGER; typedef wchar_t WCHAR; @@ -219,11 +223,14 @@ typedef void* PVOID; typedef void* LPVOID; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; +#ifndef USE_DX9 typedef long HRESULT; +#endif typedef long LRESULT; typedef void* HWND; typedef void* HDC; +#ifndef USE_DX9 typedef struct _RECT { long left; long top; @@ -235,6 +242,7 @@ typedef struct tagPOINT { long x; long y; } POINT, *PPOINT, *LPPOINT; +#endif #define DWORD_PTR UINT_PTR #define WM_USER 0x0400 @@ -474,6 +482,7 @@ inline int _mkdir(const char *dir) { return mkdir(dir, S_IRWXU); } ((DWORD)(uint8_t)(ch2) << 16) | ((DWORD)(uint8_t)(ch3) << 24 )) #endif +#ifndef USE_DX9 typedef enum _D3DFORMAT { D3DFMT_UNKNOWN = 0, @@ -1014,6 +1023,14 @@ typedef enum _D3DTEXTURETRANSFORMFLAGS { D3DTTFF_FORCE_DWORD = 0x7fffffff } D3DTEXTURETRANSFORMFLAGS; +#endif // USE_DX9 + +typedef struct _D3DXMACRO +{ + LPCSTR Name; + LPCSTR Definition; + +} D3DXMACRO, *LPD3DXMACRO; #define D3DTS_WORLD D3DTS_WORLDMATRIX(0) #define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1) diff --git a/src/Layers/CMakeLists.txt b/src/Layers/CMakeLists.txt index 2ac726ff79a..4e744505155 100644 --- a/src/Layers/CMakeLists.txt +++ b/src/Layers/CMakeLists.txt @@ -1,5 +1,5 @@ add_subdirectory(xrAPI) -#add_subdirectory(xrRenderPC_R1) +add_subdirectory(xrRenderPC_R1) #add_subdirectory(xrRenderPC_R2) #add_subdirectory(xrRenderPC_R3) #add_subdirectory(xrRenderPC_R4) diff --git a/src/Layers/xrRender/Debug/dxPixEventWrapper.h b/src/Layers/xrRender/Debug/dxPixEventWrapper.h index d3e136591b8..745ad915bc9 100644 --- a/src/Layers/xrRender/Debug/dxPixEventWrapper.h +++ b/src/Layers/xrRender/Debug/dxPixEventWrapper.h @@ -4,7 +4,7 @@ # define PIX_EVENT(Name) do { } while (false) #else #if defined(USE_DX9) || defined(USE_DX11) -# define PIX_EVENT(Name) dxPixEventWrapper pixEvent##Name(L#Name) +# define PIX_EVENT(Name) dxPixEventWrapper pixEvent##Name(L""#Name"") class dxPixEventWrapper { diff --git a/src/Layers/xrRender/DetailModel.cpp b/src/Layers/xrRender/DetailModel.cpp index 9b255fa89aa..ba67063d5a0 100644 --- a/src/Layers/xrRender/DetailModel.cpp +++ b/src/Layers/xrRender/DetailModel.cpp @@ -119,7 +119,7 @@ void CDetail::Load(IReader* S) } #if !defined(_EDITOR) && (defined(USE_DX9) || defined(USE_DX11)) -#include "xrstripify.h" +#include "xrStripify.h" void CDetail::Optimize() { diff --git a/src/Layers/xrRender/R_Backend_Runtime.cpp b/src/Layers/xrRender/R_Backend_Runtime.cpp index d3604cd4740..56656c412bc 100644 --- a/src/Layers/xrRender/R_Backend_Runtime.cpp +++ b/src/Layers/xrRender/R_Backend_Runtime.cpp @@ -8,7 +8,7 @@ #include "Layers/xrRenderDX11/StateManager/dx11ShaderResourceStateCache.h" #endif -#if defined(USE_DX9) || defined(USE_DX11) +#if defined(XR_PLATFORM_WINDOWS) && (defined(USE_DX9) || defined(USE_DX11)) #include #endif @@ -162,6 +162,7 @@ void CBackend::set_ClipPlanes(u32 _enable, Fplane* _planes /*=NULL */, u32 count if (count > HW.Caps.geometry.dwClipPlanes) count = HW.Caps.geometry.dwClipPlanes; +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX XMMATRIX using namespace DirectX; const XMMATRIX transform = XMLoadFloat4x4(reinterpret_cast(&Device.mFullTransform)); @@ -176,6 +177,7 @@ void CBackend::set_ClipPlanes(u32 _enable, Fplane* _planes /*=NULL */, u32 count XMStoreFloat4(&planeClip, XMPlaneTransform(planeWorld, worldToClipMatrixIT)); CHK_DX(HW.pDevice->SetClipPlane(it, reinterpret_cast(&planeClip))); } +#endif // Enable them u32 e_mask = (1 << count) - 1; diff --git a/src/Layers/xrRender/SH_Texture.cpp b/src/Layers/xrRender/SH_Texture.cpp index 5eddfd5e3a2..704840deaa5 100644 --- a/src/Layers/xrRender/SH_Texture.cpp +++ b/src/Layers/xrRender/SH_Texture.cpp @@ -3,7 +3,9 @@ #include "ResourceManager.h" +#if defined(XR_PLATFORM_WINDOWS) #include "xrEngine/tntQAVI.h" +#endif #include "xrEngine/xrTheora_Surface.h" #define PRIORITY_HIGH 12 @@ -106,6 +108,7 @@ void CTexture::apply_theora(u32 dwStage) }; void CTexture::apply_avi(u32 dwStage) const { +#if defined(XR_PLATFORM_WINDOWS) if (pAVI->NeedUpdate()) { R_ASSERT(D3DRTYPE_TEXTURE == pSurface->GetType()); @@ -123,6 +126,7 @@ void CTexture::apply_avi(u32 dwStage) const R_CHK(T2D->UnlockRect(0)); } +#endif CHK_DX(HW.pDevice->SetTexture(dwStage, pSurface)); }; void CTexture::apply_seq(u32 dwStage) @@ -216,6 +220,7 @@ void CTexture::Load() } else if (FS.exist(fn, "$game_textures$", *cName, ".avi")) { +#if defined(XR_PLATFORM_WINDOWS) // AVI pAVI = xr_new(); @@ -241,6 +246,7 @@ void CTexture::Load() pSurface = nullptr; } } +#endif } else if (FS.exist(fn, "$game_textures$", *cName, ".seq")) { diff --git a/src/Layers/xrRender/ShaderResourceTraits.h b/src/Layers/xrRender/ShaderResourceTraits.h index f65bbf0c7ac..a4051323baf 100644 --- a/src/Layers/xrRender/ShaderResourceTraits.h +++ b/src/Layers/xrRender/ShaderResourceTraits.h @@ -694,6 +694,7 @@ T* CResourceManager::CreateShader(cpcstr name, pcstr filename /*= nullptr*/, u32 pcstr c_target, c_entry; ShaderTypeTraits::GetCompilationTarget(c_target, c_entry, data); +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX shader_compile #if defined(USE_DX9) # ifdef NDEBUG flags |= D3DXSHADER_PACKMATRIX_ROWMAJOR; @@ -710,6 +711,9 @@ T* CResourceManager::CreateShader(cpcstr name, pcstr filename /*= nullptr*/, u32 // Compile HRESULT const _hr = GEnv.Render->shader_compile(name, file, c_entry, c_target, flags, (void*&)sh); +#else + HRESULT const _hr = E_FAIL; +#endif FS.r_close(file); diff --git a/src/Layers/xrRender/Texture.cpp b/src/Layers/xrRender/Texture.cpp index 35bb308fef2..0044dff5ed2 100644 --- a/src/Layers/xrRender/Texture.cpp +++ b/src/Layers/xrRender/Texture.cpp @@ -121,7 +121,9 @@ void TW_Save(ID3DTexture2D* T, LPCSTR name, LPCSTR prefix, LPCSTR postfix) string256 fn2; strconcat(sizeof(fn2), fn2, "debug" DELIMITER, fn, ".dds"); Log("* debug texture save: ", fn2); +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures R_CHK(D3DXSaveTextureToFile(fn2, D3DXIFF_DDS, T, nullptr)); +#endif } ID3DTexture2D* TW_LoadTextureFromTexture( @@ -137,11 +139,13 @@ ID3DTexture2D* TW_LoadTextureFromTexture( Reduce(top_width, top_height, levels_exist, levels_2_skip); // Create HW-surface +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures if (D3DX_DEFAULT == t_dest_fmt) t_dest_fmt = t_from_desc0.Format; R_CHK(D3DXCreateTexture(HW.pDevice, top_width, top_height, levels_exist, 0, t_dest_fmt, (RImplementation.o.no_ram_textures ? D3DPOOL_DEFAULT : D3DPOOL_MANAGED), &t_dest)); +#endif // Copy surfaces & destroy temporary ID3DTexture2D* T_src = t_from; @@ -157,7 +161,9 @@ ID3DTexture2D* TW_LoadTextureFromTexture( R_CHK(T_dst->GetSurfaceLevel(L_dst, &S_dst)); // Copy +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures R_CHK(D3DXLoadSurfaceFromSurface(S_dst, NULL, NULL, S_src, NULL, NULL, D3DX_FILTER_NONE, 0)); +#endif // Release surfaces _RELEASE(S_src); @@ -322,6 +328,7 @@ ID3DBaseTexture* CRender::texture_load(LPCSTR fRName, u32& ret_msize) _DDS: { // Load and get header +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures D3DXIMAGE_INFO IMG; S = FS.r_open(fn); #ifdef DEBUG @@ -403,6 +410,9 @@ ID3DBaseTexture* CRender::texture_load(LPCSTR fRName, u32& ret_msize) ret_msize = calc_texture_size(img_loaded_lod, mip_cnt, img_size); return pTexture2D; } +#else +_DDS_2D:{} +#endif } /* _BUMP: @@ -506,16 +516,21 @@ ID3DBaseTexture* CRender::texture_load(LPCSTR fRName, u32& ret_msize) R_ASSERT2(FS.exist(fn, "$game_textures$", fname, ".dds"), fname); // Load SYS-MEM-surface, bound to device restrictions +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures D3DXIMAGE_INFO IMG; +#endif S = FS.r_open(fn); img_size = S->length(); ID3DTexture2D* T_base; +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures R_CHK2(D3DXCreateTextureFromFileInMemoryEx(HW.pDevice, S->pointer(), S->length(), D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, D3DX_DEFAULT, D3DX_DEFAULT, 0, &IMG, nullptr, &T_base), fn); +#endif FS.r_close(S); // Create HW-surface ID3DTexture2D* T_normal_1 = nullptr; +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX textures R_CHK(D3DXCreateTexture( HW.pDevice, IMG.Width, IMG.Height, D3DX_DEFAULT, 0, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &T_normal_1)); R_CHK(D3DXComputeNormalMap( @@ -523,6 +538,7 @@ ID3DBaseTexture* CRender::texture_load(LPCSTR fRName, u32& ret_msize) // Transfer gloss-map TW_Iterate_1OP(T_normal_1, T_base, it_gloss_rev_base); +#endif // Compress fmt = D3DFMT_DXT5; diff --git a/src/Layers/xrRender/blenders/Blender_LaEmB.cpp b/src/Layers/xrRender/blenders/Blender_LaEmB.cpp index a7a1dafb939..89f9282c8ba 100644 --- a/src/Layers/xrRender/blenders/Blender_LaEmB.cpp +++ b/src/Layers/xrRender/blenders/Blender_LaEmB.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #pragma hdrstop -#include "blender_LaEmB.h" +#include "Blender_LaEmB.h" /* * TODO: Seems there is no use for this blender even in R1. diff --git a/src/Layers/xrRender/r__screenshot.cpp b/src/Layers/xrRender/r__screenshot.cpp index 86ff4611496..fb231711122 100644 --- a/src/Layers/xrRender/r__screenshot.cpp +++ b/src/Layers/xrRender/r__screenshot.cpp @@ -46,6 +46,7 @@ IC void MouseRayFromPoint(Fvector& direction, int x, int y, Fmatrix& m_CamMat) #if defined(USE_DX9) void CRender::ScreenshotImpl(ScreenshotMode mode, LPCSTR name, CMemoryWriter* memory_writer) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX Screenshot if (!Device.b_is_Ready) return; // Create temp-surface @@ -246,6 +247,7 @@ void CRender::ScreenshotImpl(ScreenshotMode mode, LPCSTR name, CMemoryWriter* me _end_: _RELEASE(pFB); +#endif } #elif defined(USE_DX11) void CRender::ScreenshotImpl(ScreenshotMode mode, LPCSTR name, CMemoryWriter* memory_writer) diff --git a/src/Layers/xrRender/r_constants.cpp b/src/Layers/xrRender/r_constants.cpp index a3238232ad2..146944b63b4 100644 --- a/src/Layers/xrRender/r_constants.cpp +++ b/src/Layers/xrRender/r_constants.cpp @@ -68,6 +68,7 @@ ref_constant R_constant_table::get(const shared_str& S, u16 type /*= u16(-1)*/) #ifdef USE_DX9 BOOL R_constant_table::parse(void* _desc, u32 destination) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX shader_compile D3DXSHADER_CONSTANTTABLE* desc = (D3DXSHADER_CONSTANTTABLE*)_desc; D3DXSHADER_CONSTANTINFO* it = (D3DXSHADER_CONSTANTINFO*)((u8*)(desc) + desc->ConstantInfo); u8* ptr = (u8*)(desc); @@ -190,6 +191,7 @@ BOOL R_constant_table::parse(void* _desc, u32 destination) } } std::sort(table.begin(), table.end(), p_sort); +#endif return TRUE; } #endif // USE_DX9 diff --git a/src/Layers/xrRenderDX9/BufferUtils.cpp b/src/Layers/xrRenderDX9/BufferUtils.cpp index f4a7e2af2eb..4b8dcba7219 100644 --- a/src/Layers/xrRenderDX9/BufferUtils.cpp +++ b/src/Layers/xrRenderDX9/BufferUtils.cpp @@ -8,17 +8,29 @@ enum u32 GetFVFVertexSize(u32 FVF) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX D3DXGetFVFVertexSize return D3DXGetFVFVertexSize(FVF); +#else + return 0; +#endif } u32 GetDeclVertexSize(const VertexElement* decl, u32 Stream) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX D3DXGetDeclVertexSize return D3DXGetDeclVertexSize(decl, Stream); +#else + return 0; +#endif } u32 GetDeclLength(const VertexElement* decl) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX D3DXGetDeclLength return D3DXGetDeclLength(decl); +#else + return 0; +#endif } //----------------------------------------------------------------------------- diff --git a/src/Layers/xrRenderDX9/CommonTypes.h b/src/Layers/xrRenderDX9/CommonTypes.h index cf28cb8ff69..30def9b65e5 100644 --- a/src/Layers/xrRenderDX9/CommonTypes.h +++ b/src/Layers/xrRenderDX9/CommonTypes.h @@ -2,11 +2,15 @@ typedef IDirect3DVertexShader9 ID3DVertexShader; typedef IDirect3DPixelShader9 ID3DPixelShader; +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX typedef ID3DXBuffer ID3DBlob; typedef D3DXMACRO D3D_SHADER_MACRO; +#endif typedef D3DDEVTYPE D3D_DRIVER_TYPE; typedef IDirect3DQuery9 ID3DQuery; +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX typedef ID3DXInclude ID3DInclude; +#endif typedef IDirect3DTexture9 ID3DTexture2D; typedef IDirect3DSurface9 ID3DRenderTargetView; typedef IDirect3DSurface9 ID3DDepthStencilView; diff --git a/src/Layers/xrRenderDX9/dx9HW.cpp b/src/Layers/xrRenderDX9/dx9HW.cpp index a4bb7e92525..f64da94e7a5 100644 --- a/src/Layers/xrRenderDX9/dx9HW.cpp +++ b/src/Layers/xrRenderDX9/dx9HW.cpp @@ -24,19 +24,34 @@ CHW::~CHW() void CHW::OnAppActivate() { +#if defined(XR_PLATFORM_WINDOWS) if (!DevPP.Windowed) { ShowWindow(DevPP.hDeviceWindow, SW_RESTORE); } +#else + if (DevPP.hDeviceWindow) + { + SDL_RestoreWindow((SDL_Window *)DevPP.hDeviceWindow); + } +#endif } void CHW::OnAppDeactivate() { +#if defined(XR_PLATFORM_WINDOWS) if (!DevPP.Windowed) { if (psDeviceMode.WindowStyle == rsFullscreen || psDeviceMode.WindowStyle == rsFullscreenBorderless) ShowWindow(DevPP.hDeviceWindow, SW_MINIMIZE); } +#else + if (DevPP.hDeviceWindow) + { + if (psDeviceMode.WindowStyle == rsFullscreen || psDeviceMode.WindowStyle == rsFullscreenBorderless) + SDL_MinimizeWindow((SDL_Window *)DevPP.hDeviceWindow); + } +#endif } ////////////////////////////////////////////////////////////////////// @@ -168,7 +183,11 @@ void CHW::CreateDevice(SDL_Window* m_sdlWnd) switch (info.subsystem) { case SDL_SYSWM_WINDOWS: +#if defined(XR_PLATFORM_WINDOWS) P.hDeviceWindow = info.info.win.window; +#else + P.hDeviceWindow = m_sdlWnd; +#endif break; default: break; } @@ -227,8 +246,10 @@ void CHW::CreateDevice(SDL_Window* m_sdlWnd) } // Capture PIX events +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX D3DPERF_*Event d3dperf_BeginEvent = static_cast(hD3D->GetProcAddress("D3DPERF_BeginEvent")); d3dperf_EndEvent = static_cast(hD3D->GetProcAddress("D3DPERF_EndEvent")); +#endif // Capture misc data #ifdef DEBUG diff --git a/src/Layers/xrRenderDX9/dx9HWCaps.cpp b/src/Layers/xrRenderDX9/dx9HWCaps.cpp index 1a4b6455b74..f98a5ef8d93 100644 --- a/src/Layers/xrRenderDX9/dx9HWCaps.cpp +++ b/src/Layers/xrRenderDX9/dx9HWCaps.cpp @@ -4,13 +4,13 @@ #include "Layers/xrRender/HWCaps.h" #include "dx9HW.h" -#if !defined(_EDITOR) +#if defined(XR_PLATFORM_WINDOWS) && !defined(_EDITOR) #include #endif namespace { -#if !defined(_EDITOR) +#if defined(XR_PLATFORM_WINDOWS) && !defined(_EDITOR) u32 GetNVGpuNum() { NvLogicalGpuHandle logicalGPUs[NVAPI_MAX_LOGICAL_GPUS]; diff --git a/src/Layers/xrRenderDX9/dx9ResourceManager_Resources.cpp b/src/Layers/xrRenderDX9/dx9ResourceManager_Resources.cpp index 19afb7196b4..11f840b9553 100644 --- a/src/Layers/xrRenderDX9/dx9ResourceManager_Resources.cpp +++ b/src/Layers/xrRenderDX9/dx9ResourceManager_Resources.cpp @@ -118,10 +118,14 @@ SGeometry* CResourceManager::CreateGeom(VertexElement* decl, VertexBufferHandle } SGeometry* CResourceManager::CreateGeom(u32 FVF, VertexBufferHandle vb, IndexBufferHandle ib) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX D3DXDeclaratorFromFVF VertexElement dcl[MAX_FVF_DECL_SIZE]; CHK_DX(D3DXDeclaratorFromFVF(FVF, dcl)); SGeometry* g = CreateGeom(dcl, vb, ib); return g; +#else + return nullptr; +#endif } #ifdef _EDITOR diff --git a/src/Layers/xrRenderPC_R1/CMakeLists.txt b/src/Layers/xrRenderPC_R1/CMakeLists.txt index 28ceb224141..61f8d58ce39 100644 --- a/src/Layers/xrRenderPC_R1/CMakeLists.txt +++ b/src/Layers/xrRenderPC_R1/CMakeLists.txt @@ -1,26 +1,137 @@ project(xrRenderPC_R1) set(SRC_FILES - "FStaticRender_Blenders.cpp" + "../xrRenderDX9/BufferUtils.cpp" + "../xrRenderDX9/dx9HW.cpp" + "../xrRenderDX9/dx9HWCaps.cpp" + "../xrRenderDX9/dx9ResourceManager_Resources.cpp" + "../xrRenderDX9/dx9r_constants_cache.cpp" + "../xrRenderDX9/dx9SH_RT.cpp" + "../xrRender/Animation.cpp" + "../xrRender/Blender.cpp" + "../xrRender/Blender_Recorder.cpp" + "../xrRender/blenders/Blender_BmmD.cpp" + "../xrRender/blenders/Blender_detail_still.cpp" + "../xrRender/blenders/Blender_Editor_Selection.cpp" + "../xrRender/blenders/Blender_Editor_Wire.cpp" + "../xrRender/blenders/Blender_Lm(EbB).cpp" + "../xrRender/blenders/Blender_Model_EbB.cpp" + "../xrRender/blenders/Blender_Particle.cpp" + "../xrRender/Blender_Recorder_R2.cpp" + "../xrRender/Blender_Recorder_StandartBinding.cpp" + "../xrRender/blenders/Blender_Screen_SET.cpp" + "../xrRender/blenders/Blender_tree.cpp" + "../xrRender/ColorMapManager.cpp" + "../xrRender/D3DUtils.cpp" + "../xrRender/D3DXRenderBase.cpp" + "../xrRender/DetailManager.cpp" + "../xrRender/DetailManager_CACHE.cpp" + "../xrRender/DetailManager_Decompress.cpp" + "../xrRender/DetailManager_VS.cpp" + "../xrRender/DetailModel.cpp" + "../xrRender/du_box.cpp" + "../xrRender/du_cone.cpp" + "../xrRender/du_cylinder.cpp" + "../xrRender/du_sphere.cpp" + "../xrRender/du_sphere_part.cpp" + "../xrRender/dxConsoleRender.cpp" + "../xrRender/dxDebugRender.cpp" + "../xrRender/dxEnvironmentRender.cpp" + "../xrRender/dxFontRender.cpp" + "../xrRender/dxImGuiRender.cpp" + "../xrRender/dxLensFlareRender.cpp" + "../xrRender/dxObjectSpaceRender.cpp" + "../xrRender/dxParticleCustom.cpp" + "../xrRender/dxRainRender.cpp" + "../xrRender/dxRenderFactory.cpp" + "../xrRender/dxStatGraphRender.cpp" + "../xrRender/dxThunderboltDescRender.cpp" + "../xrRender/dxThunderboltRender.cpp" + "../xrRender/dxUIRender.cpp" + "../xrRender/dxUISequenceVideoItem.cpp" + "../xrRender/dxUIShader.cpp" + "../xrRender/dxWallMarkArray.cpp" + "../xrRender/ETextureParams.cpp" + "../xrRender/FBasicVisual.cpp" + "../xrRender/FHierrarhyVisual.cpp" + "../xrRender/FLOD.cpp" + "../xrRender/FProgressive.cpp" + "../xrRender/FSkinned.cpp" + "../xrRender/FTreeVisual.cpp" + "../xrRender/FVisual.cpp" + "../xrRender/HOM.cpp" + "../xrRender/light.cpp" + "../xrRender/LightTrack.cpp" + "../xrRender/Light_DB.cpp" + "../xrRender/Light_Package.cpp" + "../xrRender/ModelPool.cpp" + "../xrRender/NvTriStrip.cpp" + "../xrRender/NvTriStripObjects.cpp" + "../xrRender/occRasterizer.cpp" + "../xrRender/occRasterizer_core.cpp" + "../xrRender/ParticleEffect.cpp" + "../xrRender/ParticleEffectDef.cpp" + "../xrRender/ParticleGroup.cpp" + "../xrRender/PSLibrary.cpp" + "../xrRender/ResourceManager.cpp" + "../xrRender/ResourceManager_Loader.cpp" + "../xrRender/ResourceManager_Reset.cpp" + "../xrRender/ResourceManager_Resources.cpp" + "../xrRender/ResourceManager_Scripting.cpp" + "../xrRender/R_Backend.cpp" + "../xrRender/R_Backend_DBG.cpp" + "../xrRender/R_Backend_hemi.cpp" + "../xrRender/R_Backend_Runtime.cpp" + "../xrRender/R_Backend_tree.cpp" + "../xrRender/R_Backend_xform.cpp" + "../xrRender/r_constants.cpp" + "../xrRender/R_DStreams.cpp" + "../xrRender/r__dsgraph_build.cpp" + "../xrRender/r__dsgraph_render.cpp" + "../xrRender/r__dsgraph_render_lods.cpp" + "../xrRender/r__screenshot.cpp" + "../xrRender/r__sector.cpp" + "../xrRender/r__sector_detect.cpp" + "../xrRender/r__sector_traversal.cpp" + "../xrRender/Shader.cpp" + "../xrRender/SH_Atomic.cpp" + "../xrRender/SH_Constant.cpp" + "../xrRender/SH_Matrix.cpp" + "../xrRender/SH_Texture.cpp" + "../xrRender/SkeletonAnimated.cpp" + "../xrRender/SkeletonCustom.cpp" + "../xrRender/SkeletonRigid.cpp" + "../xrRender/SkeletonX.cpp" + "../xrRender/SkeletonXSkinXW_CPP.cpp" + "../xrRender/SkeletonXSkinXW_SSE.cpp" + "../xrRender/stats_manager.cpp" + "../xrRender/Texture.cpp" + "../xrRender/TextureDescrManager.cpp" + "../xrRender/tss_def.cpp" + "../xrRender/VertexCache.cpp" + "../xrRender/WallmarksEngine.cpp" + "../xrRender/xrRender_console.cpp" + "../xrRender/xrStripify.cpp" + "../xrRender/xr_effgamma.cpp" + "../xrRender/blenders/BlenderDefault.cpp" + "../xrRender/blenders/Blender_Blur.cpp" + "../xrRender/blenders/Blender_default_aref.cpp" + "../xrRender/blenders/Blender_LaEmB.cpp" + "../xrRender/blenders/Blender_Model.cpp" + "../xrRender/blenders/Blender_Screen_GRAY.cpp" + "../xrRender/blenders/Blender_Shadow_World.cpp" + "../xrRender/blenders/Blender_Vertex.cpp" + "../xrRender/blenders/Blender_Vertex_aref.cpp" "FStaticRender.cpp" - "FStaticRender_DetectSector.cpp" - "FStaticRender.h" + "FStaticRender_Blenders.cpp" "FStaticRender_Loader.cpp" "FStaticRender_RenderTarget.cpp" - "FStaticRender_RenderTarget.h" "FStaticRender_Shaders.cpp" - "FStaticRender_Types.h" "GlowManager.cpp" - "GlowManager.h" "LightPPA.cpp" - "LightPPA.h" "LightProjector.cpp" - "LightProjector.h" "LightShadows.cpp" - "LightShadows.h" "stdafx.cpp" - "stdafx.h" - "xrRender_R1.cpp" ) group_sources(SRC_FILES) @@ -29,10 +140,13 @@ add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) target_include_directories(${PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../xrRender/blenders ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/Externals/luabind ${CMAKE_SOURCE_DIR}/sdk/include ${SDL2_INCLUDE_DIRS} + ${DXVK_NATIVE_INCLUDE_DIRS} ) target_link_libraries(${PROJECT_NAME} @@ -45,12 +159,15 @@ target_link_libraries(${PROJECT_NAME} xrScriptEngine xrAPI xrMiscMath + xrImGui ${SDL2_LIBRARIES} ) target_compile_definitions(${PROJECT_NAME} PRIVATE -DXRRENDER_R1_EXPORTS + -DUSE_DX9 + -DNO_XR_VDECLARATOR ) set_target_properties(${PROJECT_NAME} PROPERTIES diff --git a/src/Layers/xrRenderPC_R1/FStaticRender_Blenders.cpp b/src/Layers/xrRenderPC_R1/FStaticRender_Blenders.cpp index a2a2dc38cb8..5ffc4fba0d8 100644 --- a/src/Layers/xrRenderPC_R1/FStaticRender_Blenders.cpp +++ b/src/Layers/xrRenderPC_R1/FStaticRender_Blenders.cpp @@ -1,18 +1,18 @@ #include "stdafx.h" -#include "Layers/xrRender/blenders/blenderdefault.h" -#include "Layers/xrRender/blenders/blender_default_aref.h" -#include "Layers/xrRender/blenders/blender_vertex.h" -#include "Layers/xrRender/blenders/blender_vertex_aref.h" -#include "Layers/xrRender/blenders/blender_screen_set.h" -#include "Layers/xrRender/blenders/blender_screen_gray.h" -#include "Layers/xrRender/blenders/blender_editor_wire.h" -#include "Layers/xrRender/blenders/blender_editor_selection.h" -#include "Layers/xrRender/blenders/blender_LaEmB.h" -#include "Layers/xrRender/blenders/blender_Lm(EbB).h" -#include "Layers/xrRender/blenders/blender_BmmD.h" -#include "Layers/xrRender/blenders/blender_shadow_world.h" -#include "Layers/xrRender/blenders/blender_blur.h" -#include "Layers/xrRender/blenders/blender_model.h" +#include "Layers/xrRender/blenders/BlenderDefault.h" +#include "Layers/xrRender/blenders/Blender_default_aref.h" +#include "Layers/xrRender/blenders/Blender_Vertex.h" +#include "Layers/xrRender/blenders/Blender_Vertex_aref.h" +#include "Layers/xrRender/blenders/Blender_Screen_SET.h" +#include "Layers/xrRender/blenders/Blender_Screen_GRAY.h" +#include "Layers/xrRender/blenders/Blender_Editor_Wire.h" +#include "Layers/xrRender/blenders/Blender_Editor_Selection.h" +#include "Layers/xrRender/blenders/Blender_LaEmB.h" +#include "Layers/xrRender/blenders/Blender_Lm(EbB).h" +#include "Layers/xrRender/blenders/Blender_BmmD.h" +#include "Layers/xrRender/blenders/Blender_Shadow_World.h" +#include "Layers/xrRender/blenders/Blender_Blur.h" +#include "Layers/xrRender/blenders/Blender_Model.h" #include "Layers/xrRender/blenders/Blender_Model_EbB.h" #include "Layers/xrRender/blenders/Blender_detail_still.h" #include "Layers/xrRender/blenders/Blender_tree.h" diff --git a/src/Layers/xrRenderPC_R1/FStaticRender_Shaders.cpp b/src/Layers/xrRenderPC_R1/FStaticRender_Shaders.cpp index ee0cfc106ef..07061afb524 100644 --- a/src/Layers/xrRenderPC_R1/FStaticRender_Shaders.cpp +++ b/src/Layers/xrRenderPC_R1/FStaticRender_Shaders.cpp @@ -3,6 +3,7 @@ #include "Layers/xrRender/ShaderResourceTraits.h" #include "xrCore/FileCRC32.h" +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX shader_compile template static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name, T*& result, bool const disasm) @@ -45,21 +46,24 @@ static HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 cons return _hr; } +#endif inline HRESULT create_shader(LPCSTR const pTarget, DWORD const* buffer, u32 const buffer_size, LPCSTR const file_name, void*& result, bool const disasm) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX shader_compile if (pTarget[0] == 'p') return create_shader(pTarget, buffer, buffer_size, file_name, (SPS*&)result, disasm); if (pTarget[0] == 'v') return create_shader(pTarget, buffer, buffer_size, file_name, (SVS*&)result, disasm); +#endif NODEFAULT; return E_FAIL; } - +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX ID3DXInclude class includer : public ID3DXInclude { public: @@ -94,6 +98,7 @@ class includer : public ID3DXInclude return D3D_OK; } }; +#endif static inline bool match_shader_id( LPCSTR const debug_shader_id, LPCSTR const full_shader_id, FS_FileSet const& file_set, string_path& result); @@ -247,6 +252,7 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName, pc if (FAILED(_result)) { +#if defined(XR_PLATFORM_WINDOWS) // FIX_LINUX ID3DXInclude includer Includer; LPD3DXBUFFER pShaderBuf = nullptr; LPD3DXBUFFER pErrorBuf = nullptr; @@ -281,6 +287,7 @@ HRESULT CRender::shader_compile(pcstr name, IReader* fs, pcstr pFunctionName, pc else Msg("Can't compile shader hr=0x%08x", _result); } +#endif } return _result; diff --git a/src/Layers/xrRenderPC_R1/LightShadows.cpp b/src/Layers/xrRenderPC_R1/LightShadows.cpp index 1b89d0005ae..76089326262 100644 --- a/src/Layers/xrRenderPC_R1/LightShadows.cpp +++ b/src/Layers/xrRenderPC_R1/LightShadows.cpp @@ -5,6 +5,14 @@ #include "Layers/xrRender/FBasicVisual.h" #include "xrEngine/CustomHUD.h" +#if defined(XR_ARCHITECTURE_X86) || defined(XR_ARCHITECTURE_X64) || defined(XR_ARCHITECTURE_E2K) +#include +#elif defined(XR_ARCHITECTURE_ARM) || defined(XR_ARCHITECTURE_ARM64) +#include "sse2neon/sse2neon.h" +#else +#error Add your platform here +#endif + const float S_distance = 144; const float S_distance2 = S_distance * S_distance; const float S_ideal_size = 4.f; // ideal size for the object diff --git a/src/Layers/xrRenderPC_R1/stdafx.h b/src/Layers/xrRenderPC_R1/stdafx.h index ca2806f4b47..2ebc2a5076a 100644 --- a/src/Layers/xrRenderPC_R1/stdafx.h +++ b/src/Layers/xrRenderPC_R1/stdafx.h @@ -2,6 +2,14 @@ #include "Common/Common.hpp" +#ifdef _DEBUG +#define D3D_DEBUG_INFO +#endif +#include +#if defined(XR_PLATFORM_WINDOWS) +#include +#endif + #include "xrEngine/stdafx.h" #include "xrEngine/vis_common.h" @@ -10,12 +18,6 @@ #include "xrParticles/psystem.h" -#ifdef _DEBUG -#define D3D_DEBUG_INFO -#endif -#include -#include - #include "Layers/xrRenderDX9/CommonTypes.h" #include "Layers/xrRenderDX9/dx9HW.h" From 87ad4f00374177db401003d66611245c2b2dd235 Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Wed, 15 Feb 2023 20:17:59 +0300 Subject: [PATCH 2/3] dxvk: add -fpermissive to fix building r1 --- src/Layers/xrRenderPC_R1/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Layers/xrRenderPC_R1/CMakeLists.txt b/src/Layers/xrRenderPC_R1/CMakeLists.txt index 61f8d58ce39..72c28523764 100644 --- a/src/Layers/xrRenderPC_R1/CMakeLists.txt +++ b/src/Layers/xrRenderPC_R1/CMakeLists.txt @@ -134,6 +134,9 @@ set(SRC_FILES "stdafx.cpp" ) +# Fix for dx9HW.h. It has weird member: stats_manager stats_manager; +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive") + group_sources(SRC_FILES) add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) From c5247d74e5397a211b21584dea22f82e3248175c Mon Sep 17 00:00:00 2001 From: Aleksey Komarov Date: Wed, 15 Feb 2023 20:21:56 +0300 Subject: [PATCH 3/3] dxvk: add meson to Linux CI builds --- .github/workflows/cibuild.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cibuild.yml b/.github/workflows/cibuild.yml index a3e57fad386..b0040c9be03 100644 --- a/.github/workflows/cibuild.yml +++ b/.github/workflows/cibuild.yml @@ -81,7 +81,7 @@ jobs: if: ${{ matrix.Platform == 'x64' }} run: | sudo apt-get update -qq - sudo apt-get install -qq -y libsdl2-dev libglew-dev liblzo2-dev libjpeg-dev && + sudo apt-get install -qq -y meson libsdl2-dev libglew-dev liblzo2-dev libjpeg-dev && sudo apt-get install -qq -y libopenal-dev libogg-dev libtheora-dev libvorbis-dev - name: Install x86 packages @@ -89,7 +89,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt-get update -qq - sudo apt-get install -qq -y libsdl2-dev:i386 libglew-dev:i386 liblzo2-dev:i386 libjpeg-dev:i386 && + sudo apt-get install -qq -y meson libsdl2-dev:i386 libglew-dev:i386 liblzo2-dev:i386 libjpeg-dev:i386 && sudo apt-get install -qq -y libopenal-dev:i386 libogg-dev:i386 libtheora-dev:i386 libvorbis-dev:i386 - name: Install GCC x64 @@ -187,7 +187,7 @@ jobs: with: arch: ${{ matrix.Platform }} branch: 'latest-stable' - packages: build-base cmake mold sdl2-dev glew-dev lzo-dev libjpeg-turbo-dev openal-soft-dev libogg-dev libtheora-dev libvorbis-dev + packages: build-base cmake meson mold sdl2-dev glew-dev lzo-dev libjpeg-turbo-dev openal-soft-dev libogg-dev libtheora-dev libvorbis-dev - name: Run CMake x64 if: ${{ matrix.Platform == 'x86_64' }}