//===================================================================================== // SetupTexture //===================================================================================== geBoolean SetupTexture(int32 Stage, geRDriver_THandle *THandle, int32 MipLevel) { #ifdef D3D_MANAGE_TEXTURES D3DSetTexture(Stage, THandle->MipData[MipLevel].Texture); return GE_TRUE; #else THandle_MipData *MipData; MipData = &THandle->MipData[MipLevel]; if (!SetupMipData(MipData)) { MipData->Flags |= THANDLE_UPDATE; // Force an upload CacheInfo.TexMisses++; } if (MipData->Flags & THANDLE_UPDATE) { HRESULT Error; LPDIRECTDRAWSURFACE4 Surface; Surface = D3DCache_SlotGetSurface(MipData->Slot); Error = Surface->BltFast(0, 0, MipData->Surface, NULL, DDBLTFAST_WAIT); if (Error != DD_OK) { if(Error==DDERR_SURFACELOST) { if (!D3DMain_RestoreAllSurfaces()) return FALSE; } else { D3DMain_Log("SetupTexture: System to Video cache Blt failed.\n %s", D3DErrorToString(Error)); return GE_FALSE; } } } MipData->Flags &= ~THANDLE_UPDATE; D3DCache_SlotSetLRU(MipData->Slot, CurrentLRU); D3DSetTexture(Stage, D3DCache_SlotGetTexture(MipData->Slot)); return GE_TRUE; #endif }
//============================================================================================ // CreateLightmapTHandle //============================================================================================ geRDriver_THandle *CreateLightmapTHandle(geRDriver_THandle *THandle, int32 Width, int32 Height, int32 NumMipLevels, const geRDriver_PixelFormat *PixelFormat) { int32 Size, Stage; assert(NumMipLevels < THANDLE_MAX_MIP_LEVELS); assert(NumMipLevels == 1); // Save some info about the lightmap THandle->Width = Width; THandle->Height = Height; THandle->NumMipLevels = (uint8)NumMipLevels; THandle->Log = (uint8)GetLog(Width, Height); THandle->Stride = 1<<THandle->Log; assert(THandle->Log < MAX_LMAP_LOG_SIZE); Size = 1<<THandle->Log; THandle->MipData = (THandle_MipData*)malloc(sizeof(THandle_MipData)*NumMipLevels); memset(THandle->MipData, 0, sizeof(THandle_MipData)*NumMipLevels); THandle->MipData[0].Flags = THANDLE_UPDATE; #ifdef D3D_MANAGE_TEXTURES #ifndef USE_TPAGES { int32 Stage; if (AppInfo.CanDoMultiTexture) Stage = STAGE_1; else Stage = 0; if (!THandle_CreateSurfaces(&THandle->MipData[0], Size, Size, &CurrentSurfDesc, GE_FALSE, Stage)) { THandle_Destroy(THandle); return NULL; } D3DSetTexture(0, THandle->MipData[0].Texture); } #endif #endif if (AppInfo.CanDoMultiTexture) Stage = TSTAGE_1; else Stage = 0; #ifdef USE_ONE_CACHE THandle->MipData[0].CacheType = D3DCache_TypeCreate(TextureCache, Size, Size, NumMipLevels, Stage, &CurrentSurfDesc); #else THandle->MipData[0].CacheType = D3DCache_TypeCreate(LMapCache, Size, Size, NumMipLevels, Stage, &CurrentSurfDesc); #endif if (!THandle->MipData[0].CacheType) { THandle_Destroy(THandle); return NULL; } return THandle; }
//==================================================================================== // PCache_FlushMiscPolys //==================================================================================== BOOL PCache_FlushMiscPolys(void) { int32 i; Misc_Poly *pPoly; if (!MiscCache.NumPolys) return TRUE; if (!THandle_CheckCache()) return GE_FALSE; // Set the render states if (AppInfo.CanDoMultiTexture) { AppInfo.lpD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); AppInfo.lpD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); D3DSetTexture(1, NULL); // Reset texture stage 1 } AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); AppInfo.lpD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); D3DBlendFunc (D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); D3DBlendEnable(TRUE); // Sort the polys by handle SortMiscPolysByHandle(); for (i=0; i< MiscCache.NumPolys; i++) { pPoly = MiscCache.SortedPolys[i]; if (pPoly->Flags & DRV_RENDER_NO_ZMASK) // We are assuming that this is not going to change all that much D3DZEnable(FALSE); else D3DZEnable(TRUE); if (pPoly->Flags & DRV_RENDER_NO_ZWRITE) // We are assuming that this is not going to change all that much D3DZWriteEnable(FALSE); else D3DZWriteEnable(TRUE); if (pPoly->Flags & DRV_RENDER_CLAMP_UV) D3DTexWrap(0, FALSE); else D3DTexWrap(0, TRUE); if (!SetupTexture(0, pPoly->THandle, pPoly->MipLevel)) return GE_FALSE; if ( (pPoly->Flags & DRV_RENDER_POLY_NO_FOG) && AppInfo.FogEnable) // poly fog AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE , FALSE); D3DTexturedPoly(&MiscCache.Verts[pPoly->FirstVert], pPoly->NumVerts); if ( (pPoly->Flags & DRV_RENDER_POLY_NO_FOG) && AppInfo.FogEnable) // poly fog AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE , TRUE); } // Turn z stuff back on... D3DZWriteEnable (TRUE); D3DZEnable(TRUE); MiscCache.NumPolys = 0; MiscCache.NumVerts = 0; #ifdef SUPER_FLUSH AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FLUSHBATCH, 0); AppInfo.lpD3DDevice->EndScene(); AppInfo.lpD3DDevice->BeginScene(); #endif return TRUE; }
//===================================================================================== // SetupLMap //===================================================================================== geBoolean SetupLMap(int32 Stage, DRV_LInfo *LInfo, int32 LNum, geBoolean Dynamic) { #ifdef D3D_MANAGE_TEXTURES #ifdef USE_TPAGES { geRDriver_THandle *THandle; THandle = LInfo->THandle; if (Dynamic) THandle->Flags |= THANDLE_UPDATE; if (!THandle->Block) { THandle->Block = TPage_MgrFindOptimalBlock(TPageMgr, CurrentLRU); THandle->Flags |= THANDLE_UPDATE; TPage_BlockSetUserData(THandle->Block, THandle); assert(THandle->Block); } else if (TPage_BlockGetUserData(THandle->Block) != THandle) { // Find another block THandle->Block = TPage_MgrFindOptimalBlock(TPageMgr, CurrentLRU); assert(THandle->Block); THandle->Flags |= THANDLE_UPDATE; TPage_BlockSetUserData(THandle->Block, THandle); } if (THandle->Flags & THANDLE_UPDATE) FillLMapSurface2(LInfo, LNum); TPage_BlockSetLRU(THandle->Block, CurrentLRU); D3DSetTexture(Stage, TPage_BlockGetTexture(THandle->Block)); if (Dynamic) THandle->Flags |= THANDLE_UPDATE; else THandle->Flags &= ~THANDLE_UPDATE; return GE_TRUE; } #else { geRDriver_THandle *THandle; THandle = LInfo->THandle; if (Dynamic) THandle->MipData[0].Flags |= THANDLE_UPDATE; if (THandle->MipData[0].Flags & THANDLE_UPDATE) FillLMapSurface(LInfo, LNum); D3DSetTexture(Stage, THandle->MipData[0].Texture); if (Dynamic) THandle->MipData[0].Flags |= THANDLE_UPDATE; else THandle->MipData[0].Flags &= ~THANDLE_UPDATE; return GE_TRUE; } #endif #else geRDriver_THandle *THandle; THandle_MipData *MipData; THandle = LInfo->THandle; MipData = &THandle->MipData[0]; if (Dynamic) MipData->Flags |= THANDLE_UPDATE; if (!SetupMipData(MipData)) { MipData->Flags |= THANDLE_UPDATE; // Force an upload CacheInfo.LMapMisses++; } if (MipData->Flags & THANDLE_UPDATE) { HRESULT Error; LPDIRECTDRAWSURFACE4 Surface; assert(MipData->Slot); Surface = D3DCache_SlotGetSurface(MipData->Slot); assert(Surface); assert(THandle->Log < MAX_LMAP_LOG_SIZE); assert(SystemToVideo[THandle->Log].Surface); LoadLMapFromSystem(LInfo, THandle->Log, LNum); Error = Surface->BltFast(0, 0, SystemToVideo[THandle->Log].Surface, NULL, DDBLTFAST_WAIT); //Error = Surface->BltFast(0, 0, SystemToVideo[THandle->Log].Surface, NULL, 0); //Error = Surface->Blt(NULL, SystemToVideo[THandle->Log].Surface, NULL, DDBLT_WAIT, NULL); //Error = Surface->Blt(NULL, SystemToVideo[THandle->Log].Surface, NULL, 0, NULL); if (Error != DD_OK) { if(Error==DDERR_SURFACELOST) { if (!D3DMain_RestoreAllSurfaces()) return GE_FALSE; } else { D3DMain_Log("SetupTexture: System to Video cache Blt failed.\n %s", D3DErrorToString(Error)); return GE_FALSE; } } } if (Dynamic) // If it was dynmamic, force an update for one more frame MipData->Flags |= THANDLE_UPDATE; else MipData->Flags &= ~THANDLE_UPDATE; D3DCache_SlotSetLRU(MipData->Slot, CurrentLRU); D3DSetTexture(Stage, D3DCache_SlotGetTexture(MipData->Slot)); return GE_TRUE; #endif }