mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
Move client only code from rtech libraries
Moved, and renamed to 'CreateTextureResource'. Reason for move was that the rtech libraries is used by server and client, and using this on dedicated requires linking directx libraries, as it has to be hooked (even when not used). Moved to client only code to avoid having to hook it. Material system is no longer linked to the dedicated server module, as nothing from it was getting used.
This commit is contained in:
parent
d9cc37914a
commit
8d38de1ce0
@ -433,10 +433,9 @@ void DetourRegister() // Register detour classes to be searched and hooked.
|
||||
// StaticPropMgr
|
||||
REGISTER(VStaticPropMgr);
|
||||
|
||||
#ifndef DEDICATED
|
||||
// MaterialSystem
|
||||
REGISTER(VMaterialSystem);
|
||||
|
||||
#ifndef DEDICATED
|
||||
REGISTER(VMaterialGlue);
|
||||
REGISTER(VShaderGlue);
|
||||
|
||||
|
@ -33,6 +33,9 @@ inline auto v_DispatchDrawCall = p_DispatchDrawCall.RCast<void*(*)(int64_t a1, u
|
||||
inline CMemory p_DispatchDrawCall;
|
||||
inline auto v_DispatchDrawCall = p_DispatchDrawCall.RCast<void*(*)(int64_t a1, uint64_t a2, int a3, int a4, int64_t a5, int a6, uint8_t a7, int64_t a8, uint32_t a9, uint32_t a10, int a11, __m128* a12, int a13, int64_t a14)>();
|
||||
#endif
|
||||
inline CMemory p_GetStreamOverlay;
|
||||
inline auto v_GetStreamOverlay = p_GetStreamOverlay.RCast<void(*)(const char* mode, char* buf, size_t bufSize)>();
|
||||
|
||||
inline CMemory p_DrawStreamOverlay;
|
||||
inline auto v_DrawStreamOverlay = p_DrawStreamOverlay.RCast<const char*(*)(void* thisptr, uint8_t* a2, void* unused, void* a4)>();
|
||||
|
||||
@ -54,6 +57,7 @@ class VMaterialSystem : public IDetour
|
||||
LogFunAdr("CMaterialSystem::FindMaterialEx", p_CMaterialSystem__FindMaterialEx.GetPtr());
|
||||
LogFunAdr("CMaterialSystem::GetScreenSize", p_CMaterialSystem_GetScreenSize.GetPtr());
|
||||
LogFunAdr("CMaterialSystem::DispatchDrawCall", p_DispatchDrawCall.GetPtr());
|
||||
LogFunAdr("CMaterialSystem::GetStreamOverlay", p_GetStreamOverlay.GetPtr());
|
||||
LogFunAdr("CMaterialSystem::DrawStreamOverlay", p_DrawStreamOverlay.GetPtr());
|
||||
LogVarAdr("g_nTotalStreamingTextureMemory", reinterpret_cast<uintptr_t>(g_nTotalStreamingTextureMemory));
|
||||
LogVarAdr("g_nUnfreeStreamingTextureMemory", reinterpret_cast<uintptr_t>(g_nUnfreeStreamingTextureMemory));
|
||||
@ -79,6 +83,9 @@ class VMaterialSystem : public IDetour
|
||||
p_DispatchDrawCall = g_GameDll.FindPatternSIMD("44 89 4C 24 ?? 44 89 44 24 ?? 48 89 4C 24 ?? 55 53 56");
|
||||
v_DispatchDrawCall = p_DispatchDrawCall.RCast<void*(*)(int64_t, uint64_t, int, int, int64_t, int, uint8_t, int64_t, uint32_t, uint32_t, int, __m128*, int, int64_t )>();
|
||||
#endif
|
||||
p_GetStreamOverlay = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 80 7C 24 ?? ?? 0F 84 ?? ?? ?? ?? 48 89 9C 24 ?? ?? ?? ??").FollowNearCallSelf();
|
||||
v_GetStreamOverlay = p_GetStreamOverlay.RCast<void(*)(const char*, char*, size_t)>(); /*E8 ? ? ? ? 80 7C 24 ? ? 0F 84 ? ? ? ? 48 89 9C 24 ? ? ? ?*/
|
||||
|
||||
p_DrawStreamOverlay = g_GameDll.FindPatternSIMD("41 56 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 2B E0 C6 02 ??");
|
||||
v_DrawStreamOverlay = p_DrawStreamOverlay.RCast<const char*(*)(void*, uint8_t*, void*, void*)>(); // 41 56 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 2B E0 C6 02 00 //
|
||||
#endif // !DEDICATED
|
||||
|
@ -484,109 +484,6 @@ LABEL_69:
|
||||
return result;
|
||||
}
|
||||
|
||||
#if !defined(DEDICATED)
|
||||
|
||||
#pragma warning( push )
|
||||
// Disable stack warning, tells us to move more data to the heap instead. Not really possible with 'initialData' here. Since its parallel processed.
|
||||
// Also disable 6378, complains that there is no control path where it would use 'nullptr', if that happens 'Error' will be called though.
|
||||
#pragma warning( disable : 6262 6387)
|
||||
constexpr uint32_t ALIGNMENT_SIZE = 15; // Used by the game in CreateDXTexture.
|
||||
//----------------------------------------------------------------------------------
|
||||
// Purpose: creates 2D texture and shader resource from textureHeader and imageData.
|
||||
//----------------------------------------------------------------------------------
|
||||
void RTech::CreateDXTexture(TextureHeader_t* textureHeader, int64_t imageData)
|
||||
{
|
||||
if (textureHeader->m_nDepth && !textureHeader->m_nHeight) // Return never gets hit. Maybe its some debug check?
|
||||
return;
|
||||
|
||||
__int64 initialData[4096]{};
|
||||
textureHeader->m_nTextureMipLevels = textureHeader->m_nPermanentMipCount;
|
||||
|
||||
const int totalStreamedMips = textureHeader->m_nOptStreamedMipCount + textureHeader->m_nStreamedMipCount;
|
||||
int mipLevel = textureHeader->m_nPermanentMipCount + totalStreamedMips;
|
||||
if (mipLevel != totalStreamedMips)
|
||||
{
|
||||
do
|
||||
{
|
||||
--mipLevel;
|
||||
if (textureHeader->m_nArraySize)
|
||||
{
|
||||
int mipWidth = 0;
|
||||
if (textureHeader->m_nWidth >> mipLevel > 1)
|
||||
mipWidth = (textureHeader->m_nWidth >> mipLevel) - 1;
|
||||
|
||||
int mipHeight = 0;
|
||||
if (textureHeader->m_nHeight >> mipLevel > 1)
|
||||
mipHeight = (textureHeader->m_nHeight >> mipLevel) - 1;
|
||||
|
||||
uint8_t x = s_pBytesPerPixel[textureHeader->m_nImageFormat].first;
|
||||
uint8_t y = s_pBytesPerPixel[textureHeader->m_nImageFormat].second;
|
||||
|
||||
uint32_t bppWidth = (y + mipWidth) >> (y >> 1);
|
||||
uint32_t bppHeight = (y + mipHeight) >> (y >> 1);
|
||||
uint32_t sliceWidth = x * (y >> (y >> 1));
|
||||
|
||||
uint32_t rowPitch = sliceWidth * bppWidth;
|
||||
uint32_t slicePitch = x * bppWidth * bppHeight;
|
||||
|
||||
uint32_t subResourceEntry = mipLevel;
|
||||
for (int i = 0; i < textureHeader->m_nArraySize; i++)
|
||||
{
|
||||
uint32_t offsetCurrentResourceData = subResourceEntry << 4u;
|
||||
|
||||
*(int64_t*)((uint8_t*)initialData + offsetCurrentResourceData) = imageData;
|
||||
*(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData) = rowPitch;
|
||||
*(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData + 4) = slicePitch;
|
||||
|
||||
imageData += (slicePitch + ALIGNMENT_SIZE) & ~ALIGNMENT_SIZE;
|
||||
subResourceEntry += textureHeader->m_nPermanentMipCount;
|
||||
}
|
||||
}
|
||||
} while (mipLevel != totalStreamedMips);
|
||||
}
|
||||
|
||||
const DXGI_FORMAT dxgiFormat = g_TxtrAssetToDxgiFormat[textureHeader->m_nImageFormat]; // Get dxgi format
|
||||
|
||||
D3D11_TEXTURE2D_DESC textureDesc{};
|
||||
textureDesc.Width = textureHeader->m_nWidth >> mipLevel;
|
||||
textureDesc.Height = textureHeader->m_nHeight >> mipLevel;
|
||||
textureDesc.MipLevels = textureHeader->m_nPermanentMipCount;
|
||||
textureDesc.ArraySize = textureHeader->m_nArraySize;
|
||||
textureDesc.Format = dxgiFormat;
|
||||
textureDesc.SampleDesc.Count = 1;
|
||||
textureDesc.SampleDesc.Quality = 0;
|
||||
textureDesc.Usage = textureHeader->m_nCPUAccessFlag != 2 ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT;
|
||||
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
textureDesc.MiscFlags = 0;
|
||||
|
||||
const uint32_t offsetStartResourceData = mipLevel << 4u;
|
||||
const D3D11_SUBRESOURCE_DATA* subResData = (D3D11_SUBRESOURCE_DATA*)((uint8_t*)initialData + offsetStartResourceData);
|
||||
const HRESULT createTextureRes = (*g_ppGameDevice)->CreateTexture2D(&textureDesc, subResData, &textureHeader->m_ppTexture);
|
||||
if (createTextureRes < S_OK)
|
||||
Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createTextureRes);
|
||||
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResource{};
|
||||
shaderResource.Format = dxgiFormat;
|
||||
shaderResource.Texture2D.MipLevels = textureHeader->m_nTextureMipLevels;
|
||||
if (textureHeader->m_nArraySize > 1) // Do we have a texture array?
|
||||
{
|
||||
shaderResource.Texture2DArray.FirstArraySlice = 0;
|
||||
shaderResource.Texture2DArray.ArraySize = textureHeader->m_nArraySize;
|
||||
shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
|
||||
}
|
||||
|
||||
const HRESULT createShaderResourceRes = (*g_ppGameDevice)->CreateShaderResourceView(textureHeader->m_ppTexture, &shaderResource, &textureHeader->m_ppShaderResourceView);
|
||||
if (createShaderResourceRes < S_OK)
|
||||
Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create shader resource view for texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createShaderResourceRes);
|
||||
}
|
||||
#pragma warning( pop )
|
||||
#endif
|
||||
|
||||
#ifndef DEDICATED
|
||||
//----------------------------------------------------------------------------------
|
||||
// Purpose: start loading shader sets, assign vftable pointer
|
||||
//----------------------------------------------------------------------------------
|
||||
@ -595,7 +492,6 @@ void** RTech::LoadShaderSet(void** VTablePtr)
|
||||
*VTablePtr = &g_pShaderGlueVFTable;
|
||||
return &g_pShaderGlueVFTable;
|
||||
}
|
||||
#endif
|
||||
|
||||
//----------------------------------------------------------------------------------
|
||||
// Purpose: open a file and add it to m_FileHandles.
|
||||
@ -811,10 +707,6 @@ void V_RTechUtils::Attach() const
|
||||
#ifdef GAMEDLL_S3
|
||||
DetourAttach(&RTech_Pak_ProcessGuidRelationsForAsset, &RTech::PakProcessGuidRelationsForAsset);
|
||||
#endif
|
||||
|
||||
#if !defined (DEDICATED) && defined (GAMEDLL_S3)
|
||||
DetourAttach(&RTech_CreateDXTexture, &RTech::CreateDXTexture);
|
||||
#endif // !DEDICATED
|
||||
}
|
||||
|
||||
void V_RTechUtils::Detach() const
|
||||
@ -824,10 +716,6 @@ void V_RTechUtils::Detach() const
|
||||
#ifdef GAMEDLL_S3
|
||||
DetourDetach(&RTech_Pak_ProcessGuidRelationsForAsset, &RTech::PakProcessGuidRelationsForAsset);
|
||||
#endif
|
||||
|
||||
#if !defined (DEDICATED) && defined (GAMEDLL_S3)
|
||||
DetourDetach(&RTech_CreateDXTexture, &RTech::CreateDXTexture);
|
||||
#endif // !DEDICATED
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -2,9 +2,7 @@
|
||||
#include "tier0/jobthread.h"
|
||||
#include "vpklib/packedstore.h"
|
||||
#include "rtech/rtech_game.h"
|
||||
#ifndef DEDICATED
|
||||
#include "public/rendersystem/schema/texture.g.h"
|
||||
#endif // !DEDICATED
|
||||
|
||||
#define PAK_MAX_TYPES 64
|
||||
#define PAK_PARAM_SIZE 0xB0
|
||||
@ -376,14 +374,6 @@ static_assert(sizeof(RPakDecompState_t) == 136);
|
||||
static_assert(sizeof(RPakPatchCompressedHeader_t) == 16);
|
||||
|
||||
/* ==== RTECH =========================================================================================================================================================== */
|
||||
#if !defined (DEDICATED)
|
||||
inline CMemory p_RTech_CreateDXTexture;
|
||||
inline auto RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast<void(*)(TextureHeader_t*, int64_t)>();
|
||||
|
||||
inline CMemory p_GetStreamOverlay;
|
||||
inline auto GetStreamOverlay = p_GetStreamOverlay.RCast<void(*)(const char* mode, char* buf, size_t bufSize)>();
|
||||
#endif
|
||||
|
||||
// [ PIXIE ]: I'm very unsure about this, but it really seems like it
|
||||
inline CMemory p_RTech_FindFreeSlotInFiles;
|
||||
inline auto RTech_FindFreeSlotInFiles = p_RTech_FindFreeSlotInFiles.RCast<int32_t(*)(int32_t*)>();
|
||||
@ -431,10 +421,7 @@ public:
|
||||
static void PakProcessGuidRelationsForAsset(PakFile_t* pak, RPakAssetEntry_t* asset);
|
||||
#endif // GAMEDLL_S3
|
||||
|
||||
#if !defined (DEDICATED)
|
||||
static void CreateDXTexture(TextureHeader_t* textureHeader, int64_t cpuArg);
|
||||
void** LoadShaderSet(void** VTablePtr);
|
||||
#endif // !DEDICATED
|
||||
};
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
@ -445,14 +432,9 @@ class V_RTechUtils : public IDetour
|
||||
{
|
||||
virtual void GetAdr(void) const
|
||||
{
|
||||
#if !defined (DEDICATED)
|
||||
LogFunAdr("RTech::CreateDXTexture", p_RTech_CreateDXTexture.GetPtr());
|
||||
#endif // !DEDICATED
|
||||
LogFunAdr("RTech::FindFreeSlotInFiles", p_RTech_FindFreeSlotInFiles.GetPtr());
|
||||
LogFunAdr("RTech::OpenFile", p_RTech_OpenFile.GetPtr());
|
||||
#if !defined (DEDICATED)
|
||||
LogFunAdr("GetStreamOverlay", p_GetStreamOverlay.GetPtr());
|
||||
#endif // !DEDICATED
|
||||
|
||||
LogFunAdr("StreamDB_Init", p_StreamDB_Init.GetPtr());
|
||||
LogVarAdr("s_FileArray", reinterpret_cast<uintptr_t>(s_pFileArray));
|
||||
LogVarAdr("s_FileArrayMutex", reinterpret_cast<uintptr_t>(s_pFileArrayMutex));
|
||||
@ -471,17 +453,6 @@ class V_RTechUtils : public IDetour
|
||||
}
|
||||
virtual void GetFun(void) const
|
||||
{
|
||||
#if !defined (DEDICATED)
|
||||
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
||||
p_RTech_CreateDXTexture = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 53 55 41 55");
|
||||
RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast<void(*)(TextureHeader_t*, int64_t)>(); /*48 8B C4 48 89 48 08 53 55 41 55*/
|
||||
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
||||
p_RTech_CreateDXTexture = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60").FollowNearCallSelf();
|
||||
RTech_CreateDXTexture = p_RTech_CreateDXTexture.RCast<void(*)(TextureHeader_t*, int64_t)>(); /*E8 ? ? ? ? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60*/
|
||||
#endif
|
||||
p_GetStreamOverlay = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 80 7C 24 ?? ?? 0F 84 ?? ?? ?? ?? 48 89 9C 24 ?? ?? ?? ??").FollowNearCallSelf();
|
||||
GetStreamOverlay = p_GetStreamOverlay.RCast<void(*)(const char*, char*, size_t)>(); /*E8 ? ? ? ? 80 7C 24 ? ? 0F 84 ? ? ? ? 48 89 9C 24 ? ? ? ?*/
|
||||
#endif // !DEDICATED
|
||||
p_StreamDB_Init = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 54 41 56 41 57 48 83 EC 40 48 8B E9");
|
||||
v_StreamDB_Init = p_StreamDB_Init.RCast<void (*)(const char*)>(); /*48 89 5C 24 ?? 48 89 6C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 54 41 56 41 57 48 83 EC 40 48 8B E9*/
|
||||
|
||||
|
@ -247,7 +247,7 @@ void CTextOverlay::DrawStreamOverlay(void) const
|
||||
static char szLogbuf[4096];
|
||||
static const Color c = { 255, 255, 255, 255 };
|
||||
|
||||
GetStreamOverlay(stream_overlay_mode->GetString(), szLogbuf, sizeof(szLogbuf));
|
||||
v_GetStreamOverlay(stream_overlay_mode->GetString(), szLogbuf, sizeof(szLogbuf));
|
||||
CMatSystemSurface_DrawColoredText(g_pMatSystemSurface, v_Rui_GetFontFace(), m_nFontHeight, 20, 300, c.r(), c.g(), c.b(), c.a(), "%s", szLogbuf);
|
||||
}
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "engine/sys_mainwind.h"
|
||||
#include "inputsystem/inputsystem.h"
|
||||
#include "public/bitmap/stb_image.h"
|
||||
#include "public/rendersystem/schema/texture.g.h"
|
||||
|
||||
/**********************************************************************************
|
||||
-----------------------------------------------------------------------------------
|
||||
@ -151,6 +152,102 @@ HRESULT __stdcall ResizeBuffers(IDXGISwapChain* pSwapChain, UINT nBufferCount, U
|
||||
// INTERNALS
|
||||
//#################################################################################
|
||||
|
||||
#pragma warning( push )
|
||||
// Disable stack warning, tells us to move more data to the heap instead. Not really possible with 'initialData' here. Since its parallel processed.
|
||||
// Also disable 6378, complains that there is no control path where it would use 'nullptr', if that happens 'Error' will be called though.
|
||||
#pragma warning( disable : 6262 6387)
|
||||
constexpr uint32_t ALIGNMENT_SIZE = 15; // Creates 2D texture and shader resource from textureHeader and imageData.
|
||||
void CreateTextureResource(TextureHeader_t* textureHeader, int64_t imageData)
|
||||
{
|
||||
if (textureHeader->m_nDepth && !textureHeader->m_nHeight) // Return never gets hit. Maybe its some debug check?
|
||||
return;
|
||||
|
||||
__int64 initialData[4096]{};
|
||||
textureHeader->m_nTextureMipLevels = textureHeader->m_nPermanentMipCount;
|
||||
|
||||
const int totalStreamedMips = textureHeader->m_nOptStreamedMipCount + textureHeader->m_nStreamedMipCount;
|
||||
int mipLevel = textureHeader->m_nPermanentMipCount + totalStreamedMips;
|
||||
if (mipLevel != totalStreamedMips)
|
||||
{
|
||||
do
|
||||
{
|
||||
--mipLevel;
|
||||
if (textureHeader->m_nArraySize)
|
||||
{
|
||||
int mipWidth = 0;
|
||||
if (textureHeader->m_nWidth >> mipLevel > 1)
|
||||
mipWidth = (textureHeader->m_nWidth >> mipLevel) - 1;
|
||||
|
||||
int mipHeight = 0;
|
||||
if (textureHeader->m_nHeight >> mipLevel > 1)
|
||||
mipHeight = (textureHeader->m_nHeight >> mipLevel) - 1;
|
||||
|
||||
uint8_t x = s_pBytesPerPixel[textureHeader->m_nImageFormat].first;
|
||||
uint8_t y = s_pBytesPerPixel[textureHeader->m_nImageFormat].second;
|
||||
|
||||
uint32_t bppWidth = (y + mipWidth) >> (y >> 1);
|
||||
uint32_t bppHeight = (y + mipHeight) >> (y >> 1);
|
||||
uint32_t sliceWidth = x * (y >> (y >> 1));
|
||||
|
||||
uint32_t rowPitch = sliceWidth * bppWidth;
|
||||
uint32_t slicePitch = x * bppWidth * bppHeight;
|
||||
|
||||
uint32_t subResourceEntry = mipLevel;
|
||||
for (int i = 0; i < textureHeader->m_nArraySize; i++)
|
||||
{
|
||||
uint32_t offsetCurrentResourceData = subResourceEntry << 4u;
|
||||
|
||||
*(int64_t*)((uint8_t*)initialData + offsetCurrentResourceData) = imageData;
|
||||
*(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData) = rowPitch;
|
||||
*(uint32_t*)((uint8_t*)&initialData[1] + offsetCurrentResourceData + 4) = slicePitch;
|
||||
|
||||
imageData += (slicePitch + ALIGNMENT_SIZE) & ~ALIGNMENT_SIZE;
|
||||
subResourceEntry += textureHeader->m_nPermanentMipCount;
|
||||
}
|
||||
}
|
||||
} while (mipLevel != totalStreamedMips);
|
||||
}
|
||||
|
||||
const DXGI_FORMAT dxgiFormat = g_TxtrAssetToDxgiFormat[textureHeader->m_nImageFormat]; // Get dxgi format
|
||||
|
||||
D3D11_TEXTURE2D_DESC textureDesc{};
|
||||
textureDesc.Width = textureHeader->m_nWidth >> mipLevel;
|
||||
textureDesc.Height = textureHeader->m_nHeight >> mipLevel;
|
||||
textureDesc.MipLevels = textureHeader->m_nPermanentMipCount;
|
||||
textureDesc.ArraySize = textureHeader->m_nArraySize;
|
||||
textureDesc.Format = dxgiFormat;
|
||||
textureDesc.SampleDesc.Count = 1;
|
||||
textureDesc.SampleDesc.Quality = 0;
|
||||
textureDesc.Usage = textureHeader->m_nCPUAccessFlag != 2 ? D3D11_USAGE_IMMUTABLE : D3D11_USAGE_DEFAULT;
|
||||
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
textureDesc.MiscFlags = 0;
|
||||
|
||||
const uint32_t offsetStartResourceData = mipLevel << 4u;
|
||||
const D3D11_SUBRESOURCE_DATA* subResData = (D3D11_SUBRESOURCE_DATA*)((uint8_t*)initialData + offsetStartResourceData);
|
||||
const HRESULT createTextureRes = (*g_ppGameDevice)->CreateTexture2D(&textureDesc, subResData, &textureHeader->m_ppTexture);
|
||||
if (createTextureRes < S_OK)
|
||||
Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createTextureRes);
|
||||
|
||||
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResource{};
|
||||
shaderResource.Format = dxgiFormat;
|
||||
shaderResource.Texture2D.MipLevels = textureHeader->m_nTextureMipLevels;
|
||||
if (textureHeader->m_nArraySize > 1) // Do we have a texture array?
|
||||
{
|
||||
shaderResource.Texture2DArray.FirstArraySlice = 0;
|
||||
shaderResource.Texture2DArray.ArraySize = textureHeader->m_nArraySize;
|
||||
shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY;
|
||||
}
|
||||
else
|
||||
{
|
||||
shaderResource.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D;
|
||||
}
|
||||
|
||||
const HRESULT createShaderResourceRes = (*g_ppGameDevice)->CreateShaderResourceView(textureHeader->m_ppTexture, &shaderResource, &textureHeader->m_ppShaderResourceView);
|
||||
if (createShaderResourceRes < S_OK)
|
||||
Error(eDLL_T::RTECH, EXIT_FAILURE, "Couldn't create shader resource view for texture \"%s\": error code = %08x\n", textureHeader->m_pDebugName, createShaderResourceRes);
|
||||
}
|
||||
#pragma warning( pop )
|
||||
|
||||
bool LoadTextureBuffer(unsigned char* buffer, int len, ID3D11ShaderResourceView** out_srv, int* out_width, int* out_height)
|
||||
{
|
||||
// Load PNG buffer to a raw RGBA buffer
|
||||
@ -295,11 +392,23 @@ void VDXGI::GetAdr(void) const
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
LogFunAdr("IDXGISwapChain::Present", reinterpret_cast<uintptr_t>(s_fnSwapChainPresent));
|
||||
LogFunAdr("CreateTextureResource", p_CreateTextureResource.GetPtr());
|
||||
LogVarAdr("g_pSwapChain", reinterpret_cast<uintptr_t>(g_ppSwapChain));
|
||||
LogVarAdr("g_pGameDevice", reinterpret_cast<uintptr_t>(g_ppGameDevice));
|
||||
LogVarAdr("g_pImmediateContext", reinterpret_cast<uintptr_t>(g_ppImmediateContext));
|
||||
}
|
||||
|
||||
void VDXGI::GetFun(void) const
|
||||
{
|
||||
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
||||
p_CreateTextureResource = g_GameDll.FindPatternSIMD("48 8B C4 48 89 48 08 53 55 41 55");
|
||||
v_CreateTextureResource = p_CreateTextureResource.RCast<void(*)(TextureHeader_t*, int64_t)>(); /*48 8B C4 48 89 48 08 53 55 41 55*/
|
||||
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
||||
p_CreateTextureResource = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60").FollowNearCallSelf();
|
||||
v_CreateTextureResource = p_CreateTextureResource.RCast<void(*)(TextureHeader_t*, int64_t)>(); /*E8 ? ? ? ? 4C 8B C7 48 8B D5 48 8B CB 48 83 C4 60*/
|
||||
#endif
|
||||
}
|
||||
|
||||
void VDXGI::GetVar(void) const
|
||||
{
|
||||
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
||||
@ -316,4 +425,18 @@ void VDXGI::GetVar(void) const
|
||||
g_ppSwapChain = pBase.FindPattern("48 8B 0D").ResolveRelativeAddressSelf(0x3, 0x7).RCast<IDXGISwapChain**>();
|
||||
}
|
||||
|
||||
void VDXGI::Attach(void) const
|
||||
{
|
||||
#ifdef GAMEDLL_S3
|
||||
DetourAttach(&v_CreateTextureResource, &CreateTextureResource);
|
||||
#endif // GAMEDLL_S3
|
||||
}
|
||||
|
||||
void VDXGI::Detach(void) const
|
||||
{
|
||||
#ifdef GAMEDLL_S3
|
||||
DetourDetach(&v_CreateTextureResource, &CreateTextureResource);
|
||||
#endif // GAMEDLL_S3
|
||||
}
|
||||
|
||||
#endif // !DEDICATED
|
||||
|
@ -10,7 +10,7 @@ void DirectX_Shutdown();
|
||||
|
||||
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
extern HRESULT __stdcall Present(IDXGISwapChain* pSwapChain, UINT nSyncInterval, UINT nFlags);
|
||||
//extern bool LoadTextureBuffer(unsigned char* image_data, const int& image_width, const int& image_height, ID3D11ShaderResourceView** out_srv);
|
||||
extern void CreateTextureResource(TextureHeader_t* textureHeader, int64_t imageData);
|
||||
extern bool LoadTextureBuffer(unsigned char* buffer, int len, ID3D11ShaderResourceView** out_srv, int* out_width, int* out_height);
|
||||
|
||||
extern void ResetInput();
|
||||
@ -21,6 +21,9 @@ extern bool PanelsVisible();
|
||||
typedef HRESULT(__stdcall* IDXGISwapChainPresent)(IDXGISwapChain* pSwapChain, UINT nSyncInterval, UINT nFlags);
|
||||
typedef HRESULT(__stdcall* IDXGIResizeBuffers) (IDXGISwapChain* pSwapChain, UINT nBufferCount, UINT nWidth, UINT nHeight, DXGI_FORMAT dxFormat, UINT nSwapChainFlags);
|
||||
|
||||
inline CMemory p_CreateTextureResource;
|
||||
inline auto v_CreateTextureResource = p_CreateTextureResource.RCast<void(*)(TextureHeader_t*, int64_t)>();
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Globals
|
||||
inline UINT g_nWindowRect[2];
|
||||
@ -117,8 +120,8 @@ class VDXGI : public IDetour
|
||||
virtual void GetFun(void) const { }
|
||||
virtual void GetVar(void) const;
|
||||
virtual void GetCon(void) const { }
|
||||
virtual void Attach(void) const { }
|
||||
virtual void Detach(void) const { }
|
||||
virtual void Attach(void) const;
|
||||
virtual void Detach(void) const;
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
};
|
||||
#endif // !BUILDING_LIBIMGUI
|
||||
|
Loading…
x
Reference in New Issue
Block a user