From bdce95a31bb6c0bd6d077e9031e0a6aba906cd4b Mon Sep 17 00:00:00 2001 From: lewa_j Date: Sun, 11 Jan 2026 00:50:44 +0300 Subject: [PATCH] ref: dx2: implement FreeTexture --- ref/dx2/r_context.c | 8 +++++++- ref/dx2/r_image.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/ref/dx2/r_context.c b/ref/dx2/r_context.c index 50b8678f..b87ac6ae 100644 --- a/ref/dx2/r_context.c +++ b/ref/dx2/r_context.c @@ -190,6 +190,10 @@ static qboolean D3D_InitDevice() search.dwSize = sizeof(search); search.dwFlags = D3DFDS_COLORMODEL; search.dcmColorModel = D3DCOLOR_RGB; +#if 0 + search.dwFlags |= D3DFDS_HARDWARE; + search.bHardware = FALSE; +#endif D3DFINDDEVICERESULT result = { 0 }; memset(&result, 0, sizeof(result)); result.dwSize = sizeof(result); @@ -319,6 +323,8 @@ static qboolean R_Init( void ) void R_Shutdown(void) { + gEngfuncs.Con_Printf("ref: R_Shutdown()\n"); + Mem_FreePool(&r_temppool); gEngfuncs.R_Free_Video(); @@ -516,7 +522,7 @@ static void R_DrawStretchPic( float x, float y, float w, float h, float s1, floa } #else -#define DX2_CREATE_EB 1 +#define DX2_CREATE_EB 0 if (!dxc.pd3dd) return; diff --git a/ref/dx2/r_image.c b/ref/dx2/r_image.c index 9046deae..c2b1e894 100644 --- a/ref/dx2/r_image.c +++ b/ref/dx2/r_image.c @@ -718,6 +718,45 @@ void GL_FreeTexture(unsigned int texnum) return; gEngfuncs.Con_Printf("GL_FreeTexture(%d) %s\n", texnum, dx_textures[texnum].name); + + dx_texture_t* tex = R_GetTexture(texnum); + if (!tex->dds) + return; + + // debug + if (!tex->name[0]) + { + gEngfuncs.Con_Printf(S_ERROR "%s: trying to free unnamed texture with handle %X\n", __func__, tex->d3dHandle); + return; + } + + // remove from hash table + dx_texture_t **prev = &dx_texturesHashTable[tex->hashValue]; + + while (1) + { + dx_texture_t *cur = *prev; + if (!cur) break; + + if (cur == tex) + { + *prev = cur->nextHash; + break; + } + prev = &cur->nextHash; + } + + // TODO invalidate texture state + + // release source + if (tex->original) + gEngfuncs.FS_FreeImage(tex->original); + + if (tex->d3dTex) + IDirect3DTexture_Release(tex->d3dTex); + if (tex->dds) + IDirectDrawSurface_Release(tex->dds); + memset(tex, 0, sizeof(*tex)); } void R_OverrideTextureSourceSize(unsigned int textnum, unsigned int srcWidth, unsigned int srcHeight)