change D3D9 implementation of TEXTYPE_SHADOWMAP textures to use CreateDepthStencilSur...
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 16 Sep 2010 10:58:28 +0000 (10:58 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 16 Sep 2010 10:58:28 +0000 (10:58 +0000)
implement freeing of D3D9 textures
disable the texture size padding on D3D9 as it was not the cause of PIX trouble

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@10465 d7cf8633-e32d-0410-b094-e92efae38249

gl_backend.c
gl_textures.c
r_textures.h

index a17730c..15adfc7 100644 (file)
@@ -1026,11 +1026,7 @@ void R_Mesh_SetRenderTargets(int fbo, rtexture_t *depthtexture, rtexture_t *colo
                        gl_state.framebufferobject = 1;
                        gl_state.d3drt_depthtexture = depthtexture;
                        if (gl_state.d3drt_depthtexture)
-                       {
-                               IDirect3DTexture9_GetSurfaceLevel((IDirect3DTexture9 *)gl_state.d3drt_depthtexture->d3dtexture, 0, &gl_state.d3drt_depthsurface);
-                               IDirect3DDevice9_SetDepthStencilSurface(vid_d3d9dev, gl_state.d3drt_depthsurface);
-                               IDirect3DSurface9_Release(gl_state.d3drt_depthsurface);
-                       }
+                               IDirect3DDevice9_SetDepthStencilSurface(vid_d3d9dev, (IDirect3DSurface9 *)gl_state.d3drt_depthtexture->d3dtexture);
                        else
                                IDirect3DDevice9_SetDepthStencilSurface(vid_d3d9dev, NULL);
                        for (i = 0;i < vid.maxdrawbuffers;i++)
@@ -1043,7 +1039,7 @@ void R_Mesh_SetRenderTargets(int fbo, rtexture_t *depthtexture, rtexture_t *colo
                                        IDirect3DSurface9_Release(gl_state.d3drt_colorsurfaces[i]);
                                }
                                else
-                                       IDirect3DDevice9_SetRenderTarget(vid_d3d9dev, i, NULL);
+                                       IDirect3DDevice9_SetRenderTarget(vid_d3d9dev, i, i ? NULL : gl_state.d3drt_backbuffercolorsurface);
                        }
                }
                else
index c6f1f55..9678325 100644 (file)
@@ -122,6 +122,7 @@ typedef struct gltexture_s
        // d3d stuff the backend needs
        void *d3dtexture;
 #ifdef SUPPORTD3D
+       qboolean d3disdepthsurface; // for depth/stencil surfaces
        int d3dformat;
        int d3dusage;
        int d3dpool;
@@ -292,10 +293,37 @@ void R_FreeTexture(rtexture_t *rt)
        else
                Host_Error("R_FreeTexture: texture \"%s\" not linked in pool", glt->identifier);
 
-       if (glt->texnum)
+       switch(vid.renderpath)
        {
-               CHECKGLERROR
-               qglDeleteTextures(1, (GLuint *)&glt->texnum);CHECKGLERROR
+       case RENDERPATH_GL11:
+       case RENDERPATH_GL13:
+       case RENDERPATH_GL20:
+       case RENDERPATH_CGGL:
+               if (glt->texnum)
+               {
+                       CHECKGLERROR
+                       qglDeleteTextures(1, (GLuint *)&glt->texnum);CHECKGLERROR
+               }
+               break;
+       case RENDERPATH_D3D9:
+#ifdef SUPPORTD3D
+               if (glt->d3disdepthsurface)
+                       IDirect3DSurface9_Release((IDirect3DSurface9 *)glt->d3dtexture);
+               else if (glt->tiledepth > 1)
+                       IDirect3DVolumeTexture9_Release((IDirect3DVolumeTexture9 *)glt->d3dtexture);
+               else if (glt->sides == 6)
+                       IDirect3DCubeTexture9_Release((IDirect3DCubeTexture9 *)glt->d3dtexture);
+               else
+                       IDirect3DTexture9_Release((IDirect3DTexture9 *)glt->d3dtexture);
+               glt->d3dtexture = NULL;
+#endif
+               break;
+       case RENDERPATH_D3D10:
+               Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
+               break;
+       case RENDERPATH_D3D11:
+               Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__);
+               break;
        }
 
        if (glt->inputtexels)
@@ -459,7 +487,7 @@ static void GL_TextureMode_f (void)
                        for (glt = pool->gltchain;glt;glt = glt->chain)
                        {
                                // only update already uploaded images
-                               if (glt->d3dtexture && (gl_filter_force || !(glt->flags & (TEXF_FORCENEAREST | TEXF_FORCELINEAR))))
+                               if (glt->d3dtexture && !glt->d3disdepthsurface && (gl_filter_force || !(glt->flags & (TEXF_FORCENEAREST | TEXF_FORCELINEAR))))
                                {
                                        if (glt->flags & TEXF_MIPMAP)
                                        {
@@ -538,12 +566,14 @@ static void GL_Texture_CalcImageSize(int texturetype, int flags, int miplevel, i
        case RENDERPATH_D3D11:
                break;
        case RENDERPATH_D3D9:
+#if 0
                // for some reason the REF rasterizer (and hence the PIX debugger) does not like small textures...
                if (texturetype == GLTEXTURETYPE_2D)
                {
                        width2 = max(width2, 2);
                        height2 = max(height2, 2);
                }
+#endif
                break;
        }
 
@@ -719,7 +749,9 @@ static void r_textures_devicelost(void)
                        break;
                case RENDERPATH_D3D9:
 #ifdef SUPPORTD3D
-                       if (glt->tiledepth > 1)
+                       if (glt->d3disdepthsurface)
+                               IDirect3DSurface9_Release((IDirect3DSurface9 *)glt->d3dtexture);
+                       else if (glt->tiledepth > 1)
                                IDirect3DVolumeTexture9_Release((IDirect3DVolumeTexture9 *)glt->d3dtexture);
                        else if (glt->sides == 6)
                                IDirect3DCubeTexture9_Release((IDirect3DCubeTexture9 *)glt->d3dtexture);
@@ -759,7 +791,12 @@ static void r_textures_devicerestored(void)
 #ifdef SUPPORTD3D
                        {
                                HRESULT d3dresult;
-                               if (glt->tiledepth > 1)
+                               if (glt->d3disdepthsurface)
+                               {
+                                       if (FAILED(d3dresult = IDirect3DDevice9_CreateDepthStencilSurface(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dtexture, NULL)))
+                                               Sys_Error("IDirect3DDevice9_CreateDepthStencilSurface failed!");
+                               }
+                               else if (glt->tiledepth > 1)
                                {
                                        if (FAILED(d3dresult = IDirect3DDevice9_CreateVolumeTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->tiledepth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DVolumeTexture9 **)&glt->d3dtexture, NULL)))
                                                Sys_Error("IDirect3DDevice9_CreateVolumeTexture failed!");
@@ -1516,7 +1553,13 @@ static rtexture_t *R_SetupTexture(rtexturepool_t *rtexturepool, const char *iden
                        glt->d3dformat = d3dformat;
                        glt->d3dusage = d3dusage;
                        glt->d3dpool = d3dpool;
-                       if (glt->tiledepth > 1)
+                       glt->d3disdepthsurface = textype == TEXTYPE_SHADOWMAP;
+                       if (glt->d3disdepthsurface)
+                       {
+                               if (FAILED(d3dresult = IDirect3DDevice9_CreateDepthStencilSurface(vid_d3d9dev, glt->tilewidth, glt->tileheight, (D3DFORMAT)glt->d3dformat, D3DMULTISAMPLE_NONE, 0, false, (IDirect3DSurface9 **)&glt->d3dtexture, NULL)))
+                                       Sys_Error("IDirect3DDevice9_CreateDepthStencilSurface failed!");
+                       }
+                       else if (glt->tiledepth > 1)
                        {
                                if (FAILED(d3dresult = IDirect3DDevice9_CreateVolumeTexture(vid_d3d9dev, glt->tilewidth, glt->tileheight, glt->tiledepth, glt->miplevels, glt->d3dusage, (D3DFORMAT)glt->d3dformat, (D3DPOOL)glt->d3dpool, (IDirect3DVolumeTexture9 **)&glt->d3dtexture, NULL)))
                                        Sys_Error("IDirect3DDevice9_CreateVolumeTexture failed!");
index c898118..f63224a 100644 (file)
@@ -78,6 +78,7 @@ typedef struct rtexture_s
        // d3d stuff the backend needs
        void *d3dtexture;
 #ifdef SUPPORTD3D
+       qboolean d3disdepthsurface; // for depth/stencil surfaces
        int d3dformat;
        int d3dusage;
        int d3dpool;