From e93d1e3ebc4221fa44c9adc1234460d76e966732 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Wed, 18 Jul 2018 06:46:30 +0200 Subject: [PATCH] - change software renderer upload code to use GL_STREAM_DRAW and a memcpy from system memory --- src/gl/textures/gl_hwtexture.cpp | 2 +- src/swrenderer/r_swscene.cpp | 10 ++++++++-- src/swrenderer/r_swscene.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/gl/textures/gl_hwtexture.cpp b/src/gl/textures/gl_hwtexture.cpp index 77f9da593..3401f15c8 100644 --- a/src/gl/textures/gl_hwtexture.cpp +++ b/src/gl/textures/gl_hwtexture.cpp @@ -296,7 +296,7 @@ void FHardwareTexture::AllocateBuffer(int w, int h, int texelsize) { glGenBuffers(1, &glBufferID); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, glBufferID); - glBufferData(GL_PIXEL_UNPACK_BUFFER, w*h*texelsize, nullptr, GL_DYNAMIC_DRAW); + glBufferData(GL_PIXEL_UNPACK_BUFFER, w*h*texelsize, nullptr, GL_STREAM_DRAW); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); } } diff --git a/src/swrenderer/r_swscene.cpp b/src/swrenderer/r_swscene.cpp index 8e2522266..56c5448e6 100644 --- a/src/swrenderer/r_swscene.cpp +++ b/src/swrenderer/r_swscene.cpp @@ -111,11 +111,17 @@ sector_t *SWSceneDrawer::RenderView(player_t *player) fbtex->SystemTexture[0]->AllocateBuffer(screen->GetWidth(), screen->GetHeight(), V_IsTrueColor() ? 4 : 1); auto mat = FMaterial::ValidateTexture(fbtex.get(), false); mat->AddTextureLayer(PaletteTexture.get()); + + FBBuffer.Resize(screen->GetWidth() * screen->GetHeight()); } - auto buf = fbtex->SystemTexture[0]->MapBuffer(); - if (!buf) I_FatalError("Unable to map buffer for software rendering"); + + auto buf = (uint8_t*)&FBBuffer[0]; buffer.SetBuffer(screen->GetWidth(), screen->GetHeight(), screen->GetWidth(), buf); SWRenderer->RenderView(player, &buffer); + + auto pbobuf = fbtex->SystemTexture[0]->MapBuffer(); + if (!pbobuf) I_FatalError("Unable to map buffer for software rendering"); + memcpy(pbobuf, buf, FBBuffer.Size() * (V_IsTrueColor() ? 4 : 1)); fbtex->SystemTexture[0]->CreateTexture(nullptr, screen->GetWidth(), screen->GetHeight(), 0, false, 0, "swbuffer"); auto map = swrenderer::CameraLight::Instance()->ShaderColormap(); diff --git a/src/swrenderer/r_swscene.h b/src/swrenderer/r_swscene.h index 9c6921ee4..c145a6a16 100644 --- a/src/swrenderer/r_swscene.h +++ b/src/swrenderer/r_swscene.h @@ -14,6 +14,7 @@ class SWSceneDrawer { std::unique_ptr PaletteTexture; std::unique_ptr FBTexture[2]; + TArray FBBuffer; int FBTextureIndex = 0; bool FBIsTruecolor = false;