From 3b8498c0b8b8ae1740c13519d3ceea8d9823774e Mon Sep 17 00:00:00 2001 From: havoc Date: Thu, 16 Sep 2010 10:58:28 +0000 Subject: [PATCH] change D3D9 implementation of TEXTYPE_SHADOWMAP textures to use CreateDepthStencilSurface instead of CreateTexture, this fixes lots of errors (PIX works, REF rasterizer works, etc) 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 | 8 ++------ gl_textures.c | 57 ++++++++++++++++++++++++++++++++++++++++++++------- r_textures.h | 1 + 3 files changed, 53 insertions(+), 13 deletions(-) diff --git a/gl_backend.c b/gl_backend.c index a17730cf..15adfc73 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -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 diff --git a/gl_textures.c b/gl_textures.c index c6f1f553..96783250 100644 --- a/gl_textures.c +++ b/gl_textures.c @@ -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!"); diff --git a/r_textures.h b/r_textures.h index c8981183..f63224ac 100644 --- a/r_textures.h +++ b/r_textures.h @@ -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; -- 2.39.2