Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

146 lines
5.1 KiB

/*==========================================================================;
*
* Copyright (C) 1995 Microsoft Corporation. All Rights Reserved.
*
* File: haltex.c
* Content: Direct3D HAL texture handling
*@@BEGIN_MSINTERNAL
*
* $Id: haltex.c,v 1.1 1995/11/21 15:12:43 sjl Exp $
*
* History:
* Date By Reason
* ==== == ======
* 07/11/95 stevela Initial rev.
*@@END_MSINTERNAL
*
***************************************************************************/
#include "pch.cpp"
#pragma hdrstop
/*
* Texture functionality is not emulated.
*/
HRESULT D3DHAL_TextureCreate(LPDIRECT3DDEVICEI lpDevI,
LPD3DTEXTUREHANDLE lphTex,
LPDIRECTDRAWSURFACE lpDDS)
{
D3DHAL_TEXTURECREATEDATA data;
HRESULT ret;
if (!lpDevI->lpD3DHALCallbacks->TextureCreate) {
D3D_ERR("TextureCreate called, but no texture support.");
return (D3DERR_TEXTURE_NO_SUPPORT);
}
memset(&data, 0, sizeof(D3DHAL_TEXTURECREATEDATA));
data.dwhContext = lpDevI->dwhContext;
data.lpDDS = lpDDS;
D3D_INFO(6, "TextureCreate, creating texture dwhContext = %08lx, lpDDS = %08lx",
data.dwhContext, data.lpDDS);
CALL_HALONLY(ret, lpDevI, TextureCreate, &data);
if (ret != DDHAL_DRIVER_HANDLED || data.ddrval != DD_OK) {
D3D_ERR("HAL failed to handle TextureCreate");
return (D3DERR_TEXTURE_CREATE_FAILED);
}
*lphTex = data.dwHandle;
D3D_INFO(6, "TextureCreate, created texture hTex = %08lx", data.dwHandle);
return (D3D_OK);
}
HRESULT D3DHAL_TextureDestroy(LPD3DI_TEXTUREBLOCK lpBlock)
{
LPDIRECT3DDEVICEI lpDevI=lpBlock->lpDevI;
D3DTEXTUREHANDLE hTex=lpBlock->hTex;
DDASSERT(!IS_DX7HAL_DEVICE(lpDevI));
if (!(lpDevI->lpD3DHALCallbacks->TextureDestroy))
{
D3D_ERR("TextureDestroy called, but no texture support.");
return (D3DERR_TEXTURE_NO_SUPPORT);
}
// The following code ensures that before we ask the driver to unmap
// the texture, we set the stages to NULL if the texture is still present
// in any stage. This is probably not necessary, but we are just trying
// to be extra cautious here. The CAVEAT here is that it is possible that
// D3DHAL_TextureDestroy() is being called from DestroyDevice() and hence
// IT COULD BE REALLY BAD TO BATCH additional commands to the device at
// this stage. (snene - 3/2/98)
BOOL bNeedFlush = FALSE;
if (IS_DP2HAL_DEVICE(lpDevI)) {
int dwStage;
CDirect3DDeviceIDP2 *dp2dev = static_cast<CDirect3DDeviceIDP2 *>(lpDevI);
// Find out the first stage with hTex and NULL out all the stages after
for (dwStage=0;dwStage<(int)lpDevI->dwMaxTextureBlendStages; dwStage++)
{
if (hTex == lpDevI->tsstates[dwStage][D3DTSS_TEXTUREMAP])
{
// We need to do this backwards because we cannot have a texture bound to
// stage i + 1 when there is no texture bound to stage i.
for(int iCurStage=lpDevI->dwMaxTextureBlendStages-1; iCurStage>=dwStage; iCurStage--)
{
if (lpDevI->tsstates[iCurStage][D3DTSS_TEXTUREMAP] != 0)
{
dp2dev->SetTSSI(iCurStage, (D3DTEXTURESTAGESTATETYPE)D3DTSS_TEXTUREMAP, 0);
bNeedFlush = TRUE;
}
}
break;
}
}
}
if (lpDevI->rstates[D3DRENDERSTATE_TEXTUREHANDLE] == hTex)
{
lpDevI->rstates[D3DRENDERSTATE_TEXTUREHANDLE] = 0;
lpDevI->SetRenderStateI(D3DRENDERSTATE_TEXTUREHANDLE, 0);
bNeedFlush = TRUE;
}
// Make sure that we send down the command immediately to guarantee
// that the driver gets it before we call it with Destroy
if(bNeedFlush)
{
if(lpDevI->FlushStates())
{
D3D_ERR("Error trying to render batched commands in D3DHAL_TextureDestroy");
}
}
else // Now we decide whether to flush due to a referenced texture in the batch or not
{
if(lpDevI->m_qwBatch <= ((LPDDRAWI_DDRAWSURFACE_INT)(lpBlock->lpD3DTextureI->lpDDS))->lpLcl->lpSurfMore->qwBatch.QuadPart)
{
if(lpDevI->FlushStates())
{
D3D_ERR("Error trying to render batched commands in D3DHAL_TextureDestroy");
}
}
}
D3DHAL_TEXTUREDESTROYDATA data;
HRESULT ret;
memset(&data, 0, sizeof(D3DHAL_TEXTUREDESTROYDATA));
data.dwhContext = lpDevI->dwhContext;
data.dwHandle = hTex;
D3D_INFO(6, "TextureDestroy, destroying texture dwhContext = %08lx, hTex = %08lx",
data.dwhContext, hTex);
CALL_HALONLY(ret, lpDevI, TextureDestroy, &data);
if (ret != DDHAL_DRIVER_HANDLED || data.ddrval != DD_OK) {
D3D_ERR("HAL failed to handle TextureDestroy");
return (D3DERR_TEXTURE_DESTROY_FAILED);
}
D3D_INFO(6, "TextureDestroy, destroyed texture hTex = %08lx", hTex);
lpBlock->hTex=0;
return (D3D_OK);
}