From d5a130fc29da4a9d3dbc9c7882d256f62d62eb2a Mon Sep 17 00:00:00 2001 From: Shinovon Date: Wed, 29 Apr 2026 13:17:43 +0500 Subject: [PATCH] Fix textures on VC4 --- group/re3.mmp | 1 + src/core/Streaming.cpp | 26 +++++++++++------- src/rw/TexRead.cpp | 17 ++++++++---- src/skel/symbian/symbian.cpp | 45 +++++++++++++++++++++++-------- vendor/librw/src/gl/gl3raster.cpp | 20 +++++++++----- 5 files changed, 78 insertions(+), 31 deletions(-) diff --git a/group/re3.mmp b/group/re3.mmp index f076f56..40d61b8 100644 --- a/group/re3.mmp +++ b/group/re3.mmp @@ -17,6 +17,7 @@ LIBRARY eikcore.lib LIBRARY avkon.lib LIBRARY ws32.lib LIBRARY hal.lib +LIBRARY platformver.lib EPOCSTACKSIZE 0x14000 EPOCHEAPSIZE 0x80000 0x4000000 diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index fea24dc..8097c5d 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -220,12 +220,15 @@ CStreaming::Init2(void) // PC only, figure out how much memory we got #ifdef GTA_PC #define MB (1024*1024) - -// extern size_t _dwMemAvailPhys; -// ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2; -// if(ms_memoryAvailable < 50*MB) -// ms_memoryAvailable = 50*MB; -// desiredNumVehiclesLoaded = (int32)((ms_memoryAvailable / MB - 50) / 3 + 12); +#ifdef __SYMBIAN32__ + extern bool moreVram; + if (moreVram) { + extern size_t _dwMemAvailPhys; + ms_memoryAvailable = (_dwMemAvailPhys - 10*MB)/2; + if(ms_memoryAvailable < 10*MB) + ms_memoryAvailable = 10*MB; + } else +#endif ms_memoryAvailable = STREAMING_MEM_SIZE; desiredNumVehiclesLoaded = 12; if(desiredNumVehiclesLoaded > MAXVEHICLESLOADED) @@ -2691,9 +2694,14 @@ CStreaming::MakeSpaceFor(int32 size) #ifdef FIX_BUGS #define MB (1024 * 1024) if(ms_memoryAvailable == 0) { -// extern size_t _dwMemAvailPhys; -// ms_memoryAvailable = (_dwMemAvailPhys - 10 * MB) / 2; -// if(ms_memoryAvailable < 50 * MB) ms_memoryAvailable = 50 * MB; +#ifdef __SYMBIAN32__ + extern bool moreVram; + if (moreVram) { + extern size_t _dwMemAvailPhys; + ms_memoryAvailable = (_dwMemAvailPhys - 10 * MB) / 2; + if(ms_memoryAvailable < 10 * MB) ms_memoryAvailable = 10 * MB; + } else +#endif ms_memoryAvailable = STREAMING_MEM_SIZE; } #undef MB diff --git a/src/rw/TexRead.cpp b/src/rw/TexRead.cpp index ca8945e..bbfee01 100644 --- a/src/rw/TexRead.cpp +++ b/src/rw/TexRead.cpp @@ -28,6 +28,7 @@ float texLoadTime; int32 texNumLoaded; +#ifdef __SYMBIAN32__ static RwImage* resizeImage(RwImage *image, int newWidth, int newHeight) { image->convertTo32(); @@ -84,9 +85,9 @@ static RwImage* resizeImage(RwImage *image, int newWidth, int newHeight) } -static int clamp(int32 size) +static int clamp(int size, int targetSize) { - while (size > 32 && size > 1) { + while (size > targetSize && size > 1) { size = (size + 1) / 2; } return size; @@ -97,13 +98,16 @@ static void downscaleTexture(RwTexture *texture) RwRaster *oldRaster = RwTextureGetRaster(texture); if (oldRaster == nil) return; + + extern bool moreVram; + int targetSize = moreVram ? 64 : 32; int oldWidth = RwRasterGetWidth(oldRaster); int oldHeight = RwRasterGetHeight(oldRaster); - if (oldWidth <= 32 && oldHeight <= 32) return; + if (oldWidth <= targetSize && oldHeight <= targetSize) return; - int newWidth = clamp(oldWidth); - int newHeight = clamp(oldHeight); + int newWidth = clamp(oldWidth, targetSize); + int newHeight = clamp(oldHeight, targetSize); if (newWidth == oldWidth && newHeight == oldHeight) return; RwImage *image = oldRaster->toImage(); @@ -120,6 +124,7 @@ static void downscaleTexture(RwTexture *texture) RwTextureSetRaster(texture, newRaster); RwRasterDestroy(oldRaster); } +#endif #ifdef LIBRW #define READNATIVE(stream, tex, size) rwNativeTextureHackRead(stream, tex, size) @@ -490,11 +495,13 @@ CreateTxdImageForVideoCard() sprintf(filename, "%s.txd", CTxdStore::GetTxdName(i)); if (CTxdStore::GetSlot(i)->texDict) { +#ifdef __SYMBIAN32__ RwTexDictionary *texDict = CTxdStore::GetSlot(i)->texDict; FORLIST(lnk, texDict->textures){ rw::Texture *texture = rw::Texture::fromDict(lnk); downscaleTexture(texture); } +#endif int32 pos = STREAMTELL(img); if (RwTexDictionaryStreamWrite(CTxdStore::GetSlot(i)->texDict, img) == nil) { diff --git a/src/skel/symbian/symbian.cpp b/src/skel/symbian/symbian.cpp index 8cc8261..38e47d7 100644 --- a/src/skel/symbian/symbian.cpp +++ b/src/skel/symbian/symbian.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "common.h" #include "rwcore.h" @@ -74,6 +75,10 @@ static psGlobalType PsGlobal; static TBool foreground; +bool moreVram; + +static bool spinning; + void _InputTranslateShiftKeyUpDown(RsKeyCodes *rs) { } @@ -82,6 +87,18 @@ const char* _psGetUserFilesFolder() { } void HandleExit() { + if (IsForegroundApp()) { + User::ResetInactivityTime(); + } + RThread thread; + TInt error = KErrNone; + spinning = true; + while (thread.RequestCount()) { + if (!CActiveScheduler::RunIfReady(error, CActive::EPriorityIdle)) + continue; + User::WaitForAnyRequest(); + } + spinning = false; } RwInt32 _psGetNumVideModes() { @@ -178,18 +195,15 @@ void psTerminate(void) { RwBool psInitialize(void) { CFileMgr::Initialise(); TInt memFree = 0; - if (HAL::Get(HALData::EMemoryRAMFree, memFree) == KErrNone) { - if (memFree > 40 * 1024 * 1024) { - _dwMemAvailPhys = 40 * 1024 * 1024; - } else if (memFree <= 0) { - _dwMemAvailPhys = 10 * 1024 * 1024; - } else { - _dwMemAvailPhys = memFree; - } + HAL::Get(HALData::EMemoryRAMFree, memFree); + if (memFree <= 0) { + _dwMemAvailPhys = 10 * 1024 * 1024; + } else if (memFree > 60 * 1024 * 1024) { + _dwMemAvailPhys = 60 * 1024 * 1024; } else { - _dwMemAvailPhys = 40 * 1024 * 1024; + _dwMemAvailPhys = memFree; } - + C_PcSave::SetSaveDirectory(_psGetUserFilesFolder()); return TRUE; @@ -240,6 +254,8 @@ public: return EFalse; } + if (spinning) return ETrue; + switch (container->gGameState) { case GS_START_UP: foreground = true; @@ -311,17 +327,23 @@ public: void RestartTimerL(TInt aInterval) { if (iPeriodic) iPeriodic->Cancel(); - else iPeriodic = CPeriodic::NewL(CActive::EPriorityStandard); + else iPeriodic = CPeriodic::NewL(CActive::EPriorityLow); iPeriodic->Start(aInterval, aInterval, TCallBack(CCContainer::LoopCallBack, this)); } void ConstructL(const TRect& aRect, CAknAppUi* aAppUi) { iAppUi = aAppUi; CreateWindowL(); + iAppUi->SetOrientationL(CAknAppUiBase::EAppUiOrientationLandscape); SetExtentToWholeScreen(); Window().EnableAdvancedPointers(); EnableDragEvents(); ActivateL(); + + // VC4 check + VersionInfo::TPlatformVersion platformVersion; + VersionInfo::GetVersion(platformVersion); + moreVram = platformVersion.iMajorVersion == 5 && platformVersion.iMinorVersion >= 4; TSize size = Size(); RsGlobal.width = size.iWidth; @@ -524,6 +546,7 @@ public: void HandleCommandL(TInt aCommand) { if (aCommand == EAknSoftkeyBack || aCommand == EEikCmdExit) { RsGlobal.quit = 1; +// Exit(); } } }; diff --git a/vendor/librw/src/gl/gl3raster.cpp b/vendor/librw/src/gl/gl3raster.cpp index 37beff6..54d400f 100644 --- a/vendor/librw/src/gl/gl3raster.cpp +++ b/vendor/librw/src/gl/gl3raster.cpp @@ -16,6 +16,10 @@ #define PLUGIN_ID ID_DRIVER +#ifdef __SYMBIAN32__ +extern bool moreVram; +#endif + namespace rw { namespace gl3 { @@ -202,7 +206,6 @@ rasterCreateCameraTexture(Raster *raster) break; } - // i don't remember why this was once here... if(gl3Caps.gles){ natras->internalFormat = natras->format; } @@ -609,8 +612,11 @@ rasterUnlock(Raster *raster, int32 level) natras->backingStore->levels[level].size); } }else{ -// glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - if (raster->pixels != nil && natras->format == GL_RGBA && natras->type == GL_UNSIGNED_BYTE) { + if (raster->pixels != nil && natras->format == GL_RGBA && natras->type == GL_UNSIGNED_BYTE +#ifdef __SYMBIAN32__ + && !moreVram +#endif + ) { // convert to 16-bit uint16_t* pixels16 = (uint16_t*)malloc(raster->width * raster->height * sizeof(uint16_t)); uint8_t* pixels8 = (uint8_t*)raster->pixels; @@ -625,14 +631,16 @@ rasterUnlock(Raster *raster, int32 level) } glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, raster->width, raster->height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, pixels16); free(pixels16); - } else { + } else + { +// glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glTexImage2D(GL_TEXTURE_2D, level, natras->internalFormat, raster->width, raster->height, 0, natras->format, natras->type, raster->pixels); } } - if(level == 0 && natras->autogenMipmap) - glGenerateMipmap(GL_TEXTURE_2D); +// if(level == 0 && natras->autogenMipmap) +// glGenerateMipmap(GL_TEXTURE_2D); bindTexture(prev); } break;