From 021604c600dd4519188a498e3a042a913461dbf2 Mon Sep 17 00:00:00 2001 From: Jason Edmeades Date: Thu, 3 Jul 2003 18:10:22 +0000 Subject: [PATCH] Implement UpdateTexture for 2D textures only. Handle alphaop disabled but color op not-disable in a more appropriate way (Docs say this is an illegal state and then proceed to use it). Trace out textures as they are created. Update the comments around the debug code and complete the debugging set so textures which are used in the game can also be viewed. --- dlls/d3d8/d3d8_private.h | 17 ++++++++++++----- dlls/d3d8/device.c | 27 +++++++++++++++------------ dlls/d3d8/drawprim.c | 18 +++++++++++++++++- dlls/d3d8/surface.c | 7 +++++-- dlls/d3d8/utils.c | 11 ++++++++++- 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index d70d265b0cc..1e494acda65 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -1274,15 +1274,22 @@ const char *debug_d3dtexturestate(DWORD State); # define FRAME_DEBUGGING /* Adding in the SINGLE_FRAME_DEBUGGING gives a trace of just what makes up a single frame, before the file is deleted */ -# if 1 +# if 1 /* NOTE: Must be 1 in cvs, as this is mostly more useful than a trace from program start */ # define SINGLE_FRAME_DEBUGGING # endif /* The following, when enabled, lets you see the makeup of the frame, by drawprimitive calls. - A check is made for the existence of C:\D3DSHOWFRAME, and if it exists will write the - contents of the back buffer into /tmp/backbuffer_* after each primitive array is drawn - for a single frame. At the end of the frame, the file is deleted. */ -# if 1 + It can only be enabled when FRAME_DEBUGGING is also enabled + The contents of the back buffer are written into /tmp/backbuffer_* after each primitive + array is drawn. */ +# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */ # define SHOW_FRAME_MAKEUP 1 +# endif + /* The following, when enabled, lets you see the makeup of the all the textures used during each + of the drawprimitive calls. It can only be enabled when SHOW_FRAME_MAKEUP is also enabled. + The contents of the textures assigned to each stage are written into + /tmp/texture_*_.ppm after each primitive array is drawn. */ +# if 0 /* NOTE: Must be 0 in cvs, as this give a lot of ppm files when compiled in */ +# define SHOW_TEXTURE_MAKEUP 0 # endif extern BOOL isOn; extern BOOL isDumpingFrames; diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 87212c4a655..7ab080f1bcd 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -462,6 +462,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UIN } *ppTexture = (LPDIRECT3DTEXTURE8) object; + TRACE("(%p) : Created texture %p\n", This, object); return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, @@ -552,6 +553,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 ifac } *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object; + TRACE("(%p) : Created volume texture %p\n", This, object); return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, @@ -809,7 +811,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, NULL, 0L); TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", dst->myDesc.Width, dst->myDesc.Height); - /*memcpy(dst->allocatedMemory, src->allocatedMemory, src->myDesc.Size);*/ memcpy(lrDst.pBits, lrSrc.pBits, src->myDesc.Size); IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src); @@ -917,7 +918,11 @@ HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDi IDirect3DSurface8* dstSur = NULL; hr = IDirect3DTexture8Impl_GetSurfaceLevel((LPDIRECT3DTEXTURE8) src, i, &srcSur); hr = IDirect3DTexture8Impl_GetSurfaceLevel((LPDIRECT3DTEXTURE8) dst, i - skipLevels, &dstSur); - /*IDirect3DDevice8_CopyRects*/ + + /* Fixme: Work out how to just do the dirty regions (src or dst dirty region, and what + about dst with less levels than the source?) */ + IDirect3DDevice8Impl_CopyRects(iface, srcSur, NULL, 0, dstSur, NULL); + IDirect3DSurface8Impl_Release(srcSur); IDirect3DSurface8Impl_Release(dstSur); } @@ -934,7 +939,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDi for (j = 0; j < 5; ++j) { hr = IDirect3DCubeTexture8Impl_GetCubeMapSurface((LPDIRECT3DCUBETEXTURE8) src, j, i, &srcSur); hr = IDirect3DCubeTexture8Impl_GetCubeMapSurface((LPDIRECT3DCUBETEXTURE8) dst, j, i - skipLevels, &srcSur); - /*IDirect3DDevice8_CopyRects*/ + FIXME("D3DRTYPE_CUBETEXTURE does not support UpdateTexture yet\n"); IDirect3DSurface8Impl_Release(srcSur); IDirect3DSurface8Impl_Release(dstSur); } @@ -2999,16 +3004,14 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa case D3DTSS_COLOROP : { - if (Value == D3DTOP_DISABLE) { + if ((Value == D3DTOP_DISABLE) && (Type == D3DTSS_COLOROP)) { /* TODO: Disable by making this and all later levels disabled */ - if (Type == D3DTSS_COLOROP) { - glDisable(GL_TEXTURE_1D); - checkGLcall("Disable GL_TEXTURE_1D"); - glDisable(GL_TEXTURE_2D); - checkGLcall("Disable GL_TEXTURE_2D"); - glDisable(GL_TEXTURE_3D); - checkGLcall("Disable GL_TEXTURE_3D"); - } + glDisable(GL_TEXTURE_1D); + checkGLcall("Disable GL_TEXTURE_1D"); + glDisable(GL_TEXTURE_2D); + checkGLcall("Disable GL_TEXTURE_2D"); + glDisable(GL_TEXTURE_3D); + checkGLcall("Disable GL_TEXTURE_3D"); break; /* Dont bother setting the texture operations */ } else { /* Enable only the appropriate texture dimension */ diff --git a/dlls/d3d8/drawprim.c b/dlls/d3d8/drawprim.c index 490a2c35563..f9993bceaf6 100644 --- a/dlls/d3d8/drawprim.c +++ b/dlls/d3d8/drawprim.c @@ -1343,10 +1343,26 @@ void drawPrimitive(LPDIRECT3DDEVICE8 iface, D3DLOCKED_RECT r; char buffer[80]; IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->backBuffer, &r, NULL, D3DLOCK_READONLY); - sprintf(buffer, "/tmp/backbuffer_%ld.ppm", primCounter++); + sprintf(buffer, "/tmp/backbuffer_%ld.ppm", primCounter); TRACE("Saving screenshot %s\n", buffer); IDirect3DSurface8Impl_SaveSnapshot((LPDIRECT3DSURFACE8) This->backBuffer, buffer); IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) This->backBuffer); + +#if defined(SHOW_TEXTURE_MAKEUP) + { + LPDIRECT3DSURFACE8 pSur; + int textureNo; + for (textureNo = 0; textureNo < GL_LIMITS(textures); ++textureNo) { + if (This->StateBlock->textures[textureNo] != NULL) { + sprintf(buffer, "/tmp/texture_%ld_%d.ppm", primCounter, textureNo); + TRACE("Saving texture %s\n", buffer); + IDirect3DTexture8Impl_GetSurfaceLevel((LPDIRECT3DTEXTURE8) This->StateBlock->textures[textureNo], 0, &pSur); + IDirect3DSurface8Impl_SaveSnapshot(pSur, buffer); + } + } + } +#endif + primCounter = primCounter + 1; } } #endif diff --git a/dlls/d3d8/surface.c b/dlls/d3d8/surface.c index e18d4f9e23f..2f97c1b2db1 100644 --- a/dlls/d3d8/surface.c +++ b/dlls/d3d8/surface.c @@ -120,8 +120,11 @@ HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKE /* fixme: should we really lock as such? */ if (FALSE == This->lockable) { - ERR("trying to lock unlockable surf@%p\n", This); - return D3DERR_INVALIDCALL; + /* Note: UpdateTextures calls CopyRects which calls this routine to populate the + texture regions, and since the destination is an unlockable region we need + to tolerate this */ + TRACE("Warning: trying to lock unlockable surf@%p\n", This); + /*return D3DERR_INVALIDCALL; */ } if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer || This->Device->depthStencilBuffer) { diff --git a/dlls/d3d8/utils.c b/dlls/d3d8/utils.c index bc325517908..35d979df5bd 100644 --- a/dlls/d3d8/utils.c +++ b/dlls/d3d8/utils.c @@ -689,7 +689,6 @@ void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP o ICOM_THIS(IDirect3DDevice8Impl,iface); TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3); - if (op == D3DTOP_DISABLE) return; ENTER_GL(); @@ -741,6 +740,16 @@ void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP o Handled = TRUE; /* Assume will be handled */ switch (op) { + case D3DTOP_DISABLE: /* Only for alpha */ + glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); + checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE"); + glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT); + checkGLcall("GL_TEXTURE_ENV, src0_target, src1"); + glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA); + checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); + glTexEnvi(GL_TEXTURE_ENV, scal_target, 1); + checkGLcall("GL_TEXTURE_ENV, scal_target, 1"); + break; case D3DTOP_SELECTARG1: glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE); checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");