BOOL DRIVERCC BeginScene(BOOL Clear, BOOL ClearZ, RECT *WorldRect) { HRESULT Result; CurrentLRU++; if (!AppInfo.lpD3DDevice) { D3DMain_Log("BeginScene: No D3D Device!."); return FALSE; } // Make sure we clear the cache info structure... memset(&CacheInfo, 0, sizeof(DRV_CacheInfo)); if (!THandle_CheckCache()) return GE_FALSE; // Watch for inactive app or minimize if(AppInfo.RenderingIsOK) { if (!Main_ClearBackBuffer(Clear, ClearZ)) { D3DMain_Log("D3DClearBuffers failed."); return FALSE; } D3DDRV.NumRenderedPolys = 0; Result = AppInfo.lpD3DDevice->BeginScene(); if (Result != D3D_OK) { D3DMain_Log("BeginScene: D3D BeginScene Failed.\n%s.", D3DErrorToString(Result)); return FALSE; } D3DBilinearFilter(D3DFILTER_LINEAR, D3DFILTER_LINEAR); D3DPolygonMode (D3DFILL_SOLID); D3DZWriteEnable (TRUE); D3DZEnable(TRUE); D3DZFunc(D3DCMP_LESSEQUAL); D3DBlendFunc (D3DBLEND_SRCALPHA, D3DBLEND_INVSRCALPHA); D3DBlendEnable(TRUE); if (AppInfo.FogEnable) { AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE , TRUE); AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR , ((DWORD)AppInfo.FogR<<16)|((DWORD)AppInfo.FogG<<8)|(DWORD)AppInfo.FogB); } else { AppInfo.lpD3DDevice->SetRenderState(D3DRENDERSTATE_FOGENABLE , FALSE); } } return TRUE; }
BOOL DRIVERCC EndScene(void) { HRESULT Result; if (!AppInfo.lpD3DDevice) return FALSE; if(AppInfo.RenderingIsOK) { // Flush everything one last time... PCache_FlushWorldPolys(); PCache_FlushMiscPolys(); Result = AppInfo.lpD3DDevice->EndScene(); if (Result != D3D_OK) { D3DMain_Log("EndScene: D3D EndScene Failed.\n%s", D3DErrorToString(Result)); return FALSE; } if (!Main_ShowBackBuffer()) return FALSE; } return TRUE; }
//===================================================================================== // 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 }
//===================================================================================== // 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 }