From 10bc37b37eeded2797b423e9ac6a77a37f5d0b52 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 25 Apr 2020 17:58:26 +0200 Subject: [PATCH] - moved RenderView out of the framebuffer classes to complete the consolidation of the renderer's entry points. --- src/d_main.cpp | 5 +- src/rendering/gl/renderer/gl_renderer.cpp | 16 ---- src/rendering/gl/renderer/gl_renderer.h | 4 - src/rendering/gl/renderer/gl_scene.cpp | 93 +++++++++++++++++++ src/rendering/gl/system/gl_framebuffer.cpp | 91 ------------------ src/rendering/gl/system/gl_framebuffer.h | 2 - src/rendering/hwrenderer/scene/hw_drawinfo.h | 2 + .../polyrenderer/backend/poly_framebuffer.cpp | 80 ---------------- .../polyrenderer/backend/poly_framebuffer.h | 4 - src/rendering/swrenderer/r_swscene.h | 1 + src/rendering/v_framebuffer.cpp | 1 + src/rendering/v_video.h | 4 +- .../vulkan/system/vk_framebuffer.cpp | 89 ++---------------- src/rendering/vulkan/system/vk_framebuffer.h | 5 +- 14 files changed, 108 insertions(+), 289 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index d699a69c1..815a726d0 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -113,6 +113,7 @@ #include "scriptutil.h" #include "v_palette.h" #include "texturemanager.h" +#include "hwrenderer/scene/hw_drawinfo.h" #ifdef __unix__ #include "i_system.h" // for SHARE_DIR @@ -925,7 +926,7 @@ void D_Display () D_Render([&]() { - viewsec = screen->RenderView(&players[consoleplayer]); + viewsec = RenderView(&players[consoleplayer]); }, true); screen->Begin2D(); @@ -3471,7 +3472,7 @@ void D_Cleanup() M_SaveDefaults(NULL); // save config before the restart // delete all data that cannot be left until reinitialization - if (screen) screen->CleanForRestart(); + CleanSWDrawer(); V_ClearFonts(); // must clear global font pointers ColorSets.Clear(); PainFlashes.Clear(); diff --git a/src/rendering/gl/renderer/gl_renderer.cpp b/src/rendering/gl/renderer/gl_renderer.cpp index 79713ae75..acaed2500 100644 --- a/src/rendering/gl/renderer/gl_renderer.cpp +++ b/src/rendering/gl/renderer/gl_renderer.cpp @@ -63,8 +63,6 @@ EXTERN_CVAR(Int, screenblocks) -extern bool NoInterpolateView; - namespace OpenGLRenderer { @@ -124,7 +122,6 @@ FGLRenderer::~FGLRenderer() } if (PortalQueryObject != 0) glDeleteQueries(1, &PortalQueryObject); - if (swdrawer) delete swdrawer; if (mBuffers) delete mBuffers; if (mSaveBuffers) delete mSaveBuffers; if (mPresentShader) delete mPresentShader; @@ -140,19 +137,6 @@ FGLRenderer::~FGLRenderer() // //=========================================================================== -void FGLRenderer::ResetSWScene() -{ - // force recreation of the SW scene drawer to ensure it gets a new set of resources. - if (swdrawer != nullptr) delete swdrawer; - swdrawer = nullptr; -} - -//=========================================================================== -// -// -// -//=========================================================================== - bool FGLRenderer::StartOffscreen() { bool firstBind = (mFBID == 0); diff --git a/src/rendering/gl/renderer/gl_renderer.h b/src/rendering/gl/renderer/gl_renderer.h index ea8aaf44a..5b61d7aa8 100644 --- a/src/rendering/gl/renderer/gl_renderer.h +++ b/src/rendering/gl/renderer/gl_renderer.h @@ -68,8 +68,6 @@ public: //FRotator mAngles; - SWSceneDrawer *swdrawer = nullptr; - FGLRenderer(OpenGLFrameBuffer *fb); ~FGLRenderer() ; @@ -77,8 +75,6 @@ public: void ClearBorders(); - void ResetSWScene(); - void PresentStereo(); void RenderScreenQuad(); void PostProcessScene(int fixedcm, const std::function &afterBloomDrawEndScene2D); diff --git a/src/rendering/gl/renderer/gl_scene.cpp b/src/rendering/gl/renderer/gl_scene.cpp index 324703a45..dd8a22c9c 100644 --- a/src/rendering/gl/renderer/gl_scene.cpp +++ b/src/rendering/gl/renderer/gl_scene.cpp @@ -32,6 +32,8 @@ #include "r_data/r_interpolate.h" #include "r_utility.h" #include "d_player.h" +#include "i_time.h" +#include "swrenderer/r_swscene.h" #include "swrenderer/r_renderer.h" #include "hwrenderer/dynlights/hw_dynlightdata.h" #include "hwrenderer/utility/hw_clock.h" @@ -45,6 +47,16 @@ #include "hwrenderer/scene/hw_portal.h" #include "hwrenderer/utility/hw_vrmodes.h" +EXTERN_CVAR(Bool, cl_capfps) +extern bool NoInterpolateView; + +static SWSceneDrawer *swdrawer; + +void CleanSWDrawer() +{ + if (swdrawer) delete swdrawer; + swdrawer = nullptr; +} //----------------------------------------------------------------------------- // @@ -224,3 +236,84 @@ void WriteSavePic(player_t* player, FileWriter* file, int width, int height) } } +//=========================================================================== +// +// Renders the main view +// +//=========================================================================== + +sector_t* RenderView(player_t* player) +{ + auto RenderState = screen->RenderState(); + RenderState->SetVertexBuffer(screen->mVertexData); + screen->mVertexData->Reset(); + + sector_t* retsec; + if (!V_IsHardwareRenderer()) + { + screen->SetActiveRenderTarget(); // only relevant for Vulkan + + if (!swdrawer) swdrawer = new SWSceneDrawer; + retsec = swdrawer->RenderView(player); + } + else + { + hw_ClearFakeFlat(); + + iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; + + checkBenchActive(); + + // reset statistics counters + ResetProfilingData(); + + // Get this before everything else + if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; + else r_viewpoint.TicFrac = I_GetTimeFrac(); + + screen->mLights->Clear(); + screen->mViewpoints->Clear(); + + // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. + bool saved_niv = NoInterpolateView; + NoInterpolateView = false; + + // Shader start time does not need to be handled per level. Just use the one from the camera to render from. + if (player->camera) + RenderState->CheckTimer(player->camera->Level->ShaderStartTime); + // prepare all camera textures that have been used in the last frame. + // This must be done for all levels, not just the primary one! + for (auto Level : AllLevels()) + { + Level->canvasTextureInfo.UpdateAll([&](AActor* camera, FCanvasTexture* camtex, double fov) + { + screen->RenderTextureView(camtex, [=](IntRect& bounds) + { + FRenderViewpoint texvp; + float ratio = camtex->aspectRatio; + RenderViewpoint(texvp, camera, &bounds, fov, ratio, ratio, false, false); + }); + }); + } + NoInterpolateView = saved_niv; + + // now render the main view + float fovratio; + float ratio = r_viewwindow.WidescreenRatio; + if (r_viewwindow.WidescreenRatio >= 1.3f) + { + fovratio = 1.333333f; + } + else + { + fovratio = ratio; + } + + screen->ImageTransitionScene(true); // Only relevant for Vulkan. + + retsec = RenderViewpoint(r_viewpoint, player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true); + } + All.Unclock(); + return retsec; +} + diff --git a/src/rendering/gl/system/gl_framebuffer.cpp b/src/rendering/gl/system/gl_framebuffer.cpp index 77bb54bfe..0ec8d4eaf 100644 --- a/src/rendering/gl/system/gl_framebuffer.cpp +++ b/src/rendering/gl/system/gl_framebuffer.cpp @@ -57,8 +57,6 @@ EXTERN_CVAR(Bool, r_drawvoxels) EXTERN_CVAR(Int, gl_tonemap) EXTERN_CVAR(Bool, cl_capfps) -extern bool NoInterpolateView; - void gl_LoadExtensions(); void gl_PrintStartupLog(); void Draw2D(F2DDrawer *drawer, FRenderState &state); @@ -228,89 +226,6 @@ void OpenGLFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::function(screen)->camtexcount++; } -//=========================================================================== -// -// -// -//=========================================================================== - -sector_t *OpenGLFrameBuffer::RenderView(player_t *player) -{ - if (GLRenderer != nullptr) - { - gl_RenderState.SetVertexBuffer(screen->mVertexData); - screen->mVertexData->Reset(); - sector_t* retsec; - - if (!V_IsHardwareRenderer()) - { - if (GLRenderer->swdrawer == nullptr) GLRenderer->swdrawer = new SWSceneDrawer; - retsec = GLRenderer->swdrawer->RenderView(player); - } - else - { - hw_ClearFakeFlat(); - - iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; - - checkBenchActive(); - - // reset statistics counters - ResetProfilingData(); - - // Get this before everything else - if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; - else r_viewpoint.TicFrac = I_GetTimeFrac(); - - screen->mLights->Clear(); - screen->mViewpoints->Clear(); - - // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. - bool saved_niv = NoInterpolateView; - NoInterpolateView = false; - - // Shader start time does not need to be handled per level. Just use the one from the camera to render from. - if (player->camera) - gl_RenderState.CheckTimer(player->camera->Level->ShaderStartTime); - // prepare all camera textures that have been used in the last frame. - // This must be done for all levels, not just the primary one! - for (auto Level : AllLevels()) - { - Level->canvasTextureInfo.UpdateAll([&](AActor* camera, FCanvasTexture* camtex, double fov) - { - RenderTextureView(camtex, [=](IntRect &bounds) - { - FRenderViewpoint texvp; - float ratio = camtex->aspectRatio; - RenderViewpoint(texvp, camera, &bounds, fov, ratio, ratio, false, false); - }); - }); - } - NoInterpolateView = saved_niv; - - - // now render the main view - float fovratio; - float ratio = r_viewwindow.WidescreenRatio; - if (r_viewwindow.WidescreenRatio >= 1.3f) - { - fovratio = 1.333333f; - } - else - { - fovratio = ratio; - } - - retsec = RenderViewpoint(r_viewpoint, player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true); - } - All.Unclock(); - return retsec; - } - return nullptr; -} - - - //=========================================================================== // // @@ -388,12 +303,6 @@ void OpenGLFrameBuffer::SetVSync(bool vsync) // //=========================================================================== -void OpenGLFrameBuffer::CleanForRestart() -{ - if (GLRenderer) - GLRenderer->ResetSWScene(); -} - void OpenGLFrameBuffer::SetTextureFilterMode() { if (GLRenderer != nullptr && GLRenderer->mSamplerManager != nullptr) GLRenderer->mSamplerManager->SetTextureFilterMode(); diff --git a/src/rendering/gl/system/gl_framebuffer.h b/src/rendering/gl/system/gl_framebuffer.h index f84fcf8b7..46a91e88c 100644 --- a/src/rendering/gl/system/gl_framebuffer.h +++ b/src/rendering/gl/system/gl_framebuffer.h @@ -38,11 +38,9 @@ public: bool FlipSavePic() const override { return true; } FRenderState* RenderState() override; - void CleanForRestart() override; void UpdatePalette() override; uint32_t GetCaps() override; const char* DeviceName() const override; - sector_t *RenderView(player_t *player) override; void SetTextureFilterMode() override; IHardwareTexture *CreateHardwareTexture() override; void PrecacheMaterial(FMaterial *mat, int translation) override; diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index a3eab8ccc..65d12c56c 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -329,5 +329,7 @@ public: }; +void CleanSWDrawer(); sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen); void WriteSavePic(player_t* player, FileWriter* file, int width, int height); +sector_t* RenderView(player_t* player); diff --git a/src/rendering/polyrenderer/backend/poly_framebuffer.cpp b/src/rendering/polyrenderer/backend/poly_framebuffer.cpp index b4491f6f9..6fbdb0fd4 100644 --- a/src/rendering/polyrenderer/backend/poly_framebuffer.cpp +++ b/src/rendering/polyrenderer/backend/poly_framebuffer.cpp @@ -59,7 +59,6 @@ EXTERN_CVAR(Int, gl_tonemap) EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Bool, cl_capfps) -extern bool NoInterpolateView; extern int rendered_commandbuffers; extern int current_rendered_commandbuffers; @@ -217,79 +216,6 @@ void PolyFrameBuffer::Update() } -sector_t *PolyFrameBuffer::RenderView(player_t *player) -{ - // To do: this is virtually identical to FGLRenderer::RenderView and should be merged. - - mRenderState->SetVertexBuffer(mVertexData); - mVertexData->Reset(); - - sector_t *retsec; - if (!V_IsHardwareRenderer()) - { - if (!swdrawer) swdrawer.reset(new SWSceneDrawer); - retsec = swdrawer->RenderView(player); - } - else - { - hw_ClearFakeFlat(); - - iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; - - checkBenchActive(); - - // reset statistics counters - ResetProfilingData(); - - // Get this before everything else - if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; - else r_viewpoint.TicFrac = I_GetTimeFrac(); - - mLights->Clear(); - mViewpoints->Clear(); - - // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. - bool saved_niv = NoInterpolateView; - NoInterpolateView = false; - - // Shader start time does not need to be handled per level. Just use the one from the camera to render from. - if (player->camera) - GetRenderState()->CheckTimer(player->camera->Level->ShaderStartTime); - // prepare all camera textures that have been used in the last frame. - // This must be done for all levels, not just the primary one! - for (auto Level : AllLevels()) - { - Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) - { - RenderTextureView(camtex, [=](IntRect &bounds) - { - FRenderViewpoint texvp; - float ratio = camtex->aspectRatio; - RenderViewpoint(texvp, camera, &bounds, fov, ratio, ratio, false, false); - }); - }); - } - NoInterpolateView = saved_niv; - - // now render the main view - float fovratio; - float ratio = r_viewwindow.WidescreenRatio; - if (r_viewwindow.WidescreenRatio >= 1.3f) - { - fovratio = 1.333333f; - } - else - { - fovratio = ratio; - } - - retsec = RenderViewpoint(r_viewpoint, player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true); - } - All.Unclock(); - return retsec; -} - - void PolyFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::function renderFunc) { auto BaseLayer = static_cast(tex->GetHardwareTexture(0, 0)); @@ -384,12 +310,6 @@ void PolyFrameBuffer::SetVSync(bool vsync) cur_vsync = vsync; } -void PolyFrameBuffer::CleanForRestart() -{ - // force recreation of the SW scene drawer to ensure it gets a new set of resources. - swdrawer.reset(); -} - FRenderState* PolyFrameBuffer::RenderState() { return mRenderState.get(); diff --git a/src/rendering/polyrenderer/backend/poly_framebuffer.h b/src/rendering/polyrenderer/backend/poly_framebuffer.h index d902e6fe3..b3c2c5610 100644 --- a/src/rendering/polyrenderer/backend/poly_framebuffer.h +++ b/src/rendering/polyrenderer/backend/poly_framebuffer.h @@ -24,8 +24,6 @@ public: unsigned int GetLightBufferBlockSize() const; - std::unique_ptr swdrawer; - PolyFrameBuffer(void *hMonitor, bool fullscreen); ~PolyFrameBuffer(); @@ -36,11 +34,9 @@ public: void InitializeState() override; FRenderState* RenderState() override; - void CleanForRestart() override; void PrecacheMaterial(FMaterial *mat, int translation) override; void UpdatePalette() override; uint32_t GetCaps() override; - sector_t *RenderView(player_t *player) override; void SetTextureFilterMode() override; void TextureFilterChanged() override; void BeginFrame() override; diff --git a/src/rendering/swrenderer/r_swscene.h b/src/rendering/swrenderer/r_swscene.h index ad6b6d450..cff2eb7a5 100644 --- a/src/rendering/swrenderer/r_swscene.h +++ b/src/rendering/swrenderer/r_swscene.h @@ -9,6 +9,7 @@ #include class FWrapperTexture; +class DCanvas; class SWSceneDrawer { diff --git a/src/rendering/v_framebuffer.cpp b/src/rendering/v_framebuffer.cpp index 143189a3f..470409c9a 100644 --- a/src/rendering/v_framebuffer.cpp +++ b/src/rendering/v_framebuffer.cpp @@ -51,6 +51,7 @@ #include "hwrenderer/scene/hw_portal.h" #include "hwrenderer/utility/hw_clock.h" #include "hwrenderer/data/flatvertices.h" +#include "swrenderer/r_swscene.h" #include #include diff --git a/src/rendering/v_video.h b/src/rendering/v_video.h index 79aa6cbdc..d01775676 100644 --- a/src/rendering/v_video.h +++ b/src/rendering/v_video.h @@ -215,7 +215,6 @@ public: IntRect mOutputLetterbox; float mSceneClearColor[4]; - public: DFrameBuffer (int width=1, int height=1); virtual ~DFrameBuffer(); @@ -261,7 +260,6 @@ public: virtual void SetVSync (bool vsync); // Delete any resources that need to be deleted after restarting with a different IWAD - virtual void CleanForRestart() {} virtual void SetTextureFilterMode() {} virtual IHardwareTexture *CreateHardwareTexture() { return nullptr; } virtual void PrecacheMaterial(FMaterial *mat, int translation) {} @@ -309,7 +307,6 @@ public: virtual uint32_t GetCaps(); virtual int Backend() { return 0; } virtual const char* DeviceName() const { return "Unknown"; } - virtual sector_t *RenderView(player_t *player) { return nullptr; } virtual void AmbientOccludeScene(float m5) {} virtual void FirstEye() {} virtual void NextEye(int eyecount) {} @@ -321,6 +318,7 @@ public: virtual void CopyScreenToBuffer(int width, int height, uint8_t* buffer) { memset(buffer, 0, width* height); } virtual bool FlipSavePic() const { return false; } virtual void RenderTextureView(FCanvasTexture* tex, std::function renderFunc) {} + virtual void SetActiveRenderTarget() {} // Screen wiping diff --git a/src/rendering/vulkan/system/vk_framebuffer.cpp b/src/rendering/vulkan/system/vk_framebuffer.cpp index ee236d945..7cf64196b 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.cpp +++ b/src/rendering/vulkan/system/vk_framebuffer.cpp @@ -67,7 +67,6 @@ EXTERN_CVAR(Int, gl_tonemap) EXTERN_CVAR(Int, screenblocks) EXTERN_CVAR(Bool, cl_capfps) -extern bool NoInterpolateView; extern int rendered_commandbuffers; int current_rendered_commandbuffers; @@ -317,82 +316,6 @@ void VulkanFrameBuffer::WaitForCommands(bool finish) } } -sector_t *VulkanFrameBuffer::RenderView(player_t *player) -{ - // To do: this is virtually identical to FGLRenderer::RenderView and should be merged. - - mRenderState->SetVertexBuffer(screen->mVertexData); - screen->mVertexData->Reset(); - - sector_t *retsec; - if (!V_IsHardwareRenderer()) - { - mPostprocess->SetActiveRenderTarget(); - - if (!swdrawer) swdrawer.reset(new SWSceneDrawer); - retsec = swdrawer->RenderView(player); - } - else - { - hw_ClearFakeFlat(); - - iter_dlightf = iter_dlight = draw_dlight = draw_dlightf = 0; - - checkBenchActive(); - - // reset statistics counters - ResetProfilingData(); - - // Get this before everything else - if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; - else r_viewpoint.TicFrac = I_GetTimeFrac(); - - screen->mLights->Clear(); - screen->mViewpoints->Clear(); - - // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. - bool saved_niv = NoInterpolateView; - NoInterpolateView = false; - - // Shader start time does not need to be handled per level. Just use the one from the camera to render from. - if (player->camera) - GetRenderState()->CheckTimer(player->camera->Level->ShaderStartTime); - // prepare all camera textures that have been used in the last frame. - // This must be done for all levels, not just the primary one! - for (auto Level : AllLevels()) - { - Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) - { - RenderTextureView(camtex, [=](IntRect &bounds) - { - FRenderViewpoint texvp; - float ratio = camtex->aspectRatio; - RenderViewpoint(texvp, camera, &bounds, fov, ratio, ratio, false, false); - }); - }); - } - NoInterpolateView = saved_niv; - - // now render the main view - float fovratio; - float ratio = r_viewwindow.WidescreenRatio; - if (r_viewwindow.WidescreenRatio >= 1.3f) - { - fovratio = 1.333333f; - } - else - { - fovratio = ratio; - } - - mPostprocess->ImageTransitionScene(true); // This is the only line that differs compared to FGLRenderer::RenderView - - retsec = RenderViewpoint(r_viewpoint, player->camera, NULL, r_viewpoint.FieldOfView.Degrees, ratio, fovratio, true, true); - } - All.Unclock(); - return retsec; -} - void VulkanFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::function renderFunc) { auto BaseLayer = static_cast(tex->GetHardwareTexture(0, 0)); @@ -462,12 +385,6 @@ void VulkanFrameBuffer::SetVSync(bool vsync) cur_vsync = vsync; } -void VulkanFrameBuffer::CleanForRestart() -{ - // force recreation of the SW scene drawer to ensure it gets a new set of resources. - swdrawer.reset(); -} - void VulkanFrameBuffer::PrecacheMaterial(FMaterial *mat, int translation) { if (mat->Source()->GetUseType() == ETextureType::SWCanvas) return; @@ -638,6 +555,12 @@ void VulkanFrameBuffer::CopyScreenToBuffer(int w, int h, uint8_t *data) staging->Unmap(); } +void VulkanFrameBuffer::SetActiveRenderTarget() +{ + mPostprocess->SetActiveRenderTarget(); +} + + TArray VulkanFrameBuffer::GetScreenshotBuffer(int &pitch, ESSType &color_type, float &gamma) { int w = SCREENWIDTH; diff --git a/src/rendering/vulkan/system/vk_framebuffer.h b/src/rendering/vulkan/system/vk_framebuffer.h index 9b26c4b15..9acc4c70f 100644 --- a/src/rendering/vulkan/system/vk_framebuffer.h +++ b/src/rendering/vulkan/system/vk_framebuffer.h @@ -64,8 +64,6 @@ public: std::vector> CommandBuffers; } FrameDeleteList; - std::unique_ptr swdrawer; - VulkanFrameBuffer(void *hMonitor, bool fullscreen, VulkanDevice *dev); ~VulkanFrameBuffer(); bool IsVulkan() override { return true; } @@ -74,13 +72,11 @@ public: void InitializeState() override; - void CleanForRestart() override; void PrecacheMaterial(FMaterial *mat, int translation) override; void UpdatePalette() override; uint32_t GetCaps() override; const char* DeviceName() const override; int Backend() override { return 1; } - sector_t *RenderView(player_t *player) override; void SetTextureFilterMode() override; void TextureFilterChanged() override; void StartPrecaching() override; @@ -92,6 +88,7 @@ public: void UpdateShadowMap() override; void SetSaveBuffers(bool yes) override; void ImageTransitionScene(bool unknown) override; + void SetActiveRenderTarget() override; IHardwareTexture *CreateHardwareTexture() override; FMaterial* CreateMaterial(FGameTexture* tex, int scaleflags) override;