From c9f8624b8bd285cadd348baf192ce21f3de2e052 Mon Sep 17 00:00:00 2001 From: Alexis Maiquez Date: Sat, 29 Oct 2022 14:02:10 +0200 Subject: [PATCH] Reduced amount of glClears used in the rendering process Signed-off-by: Alexis Maiquez --- src/WallpaperEngine/Assets/CTexture.cpp | 24 ++++++++++--------- src/WallpaperEngine/Render/Objects/CImage.cpp | 5 ++++ .../Render/Objects/Effects/CPass.cpp | 3 --- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/WallpaperEngine/Assets/CTexture.cpp b/src/WallpaperEngine/Assets/CTexture.cpp index a24799d..46affed 100644 --- a/src/WallpaperEngine/Assets/CTexture.cpp +++ b/src/WallpaperEngine/Assets/CTexture.cpp @@ -97,11 +97,11 @@ CTexture::CTexture (void* fileData) { // bind the texture to assign information to it glBindTexture (GL_TEXTURE_2D, this->m_textureID [index]); + // set mipmap levels glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, this->m_header->mipmapCount - 1); - // TODO: ADD SUPPORT FOR .tex-json FILES AS THEY ALSO HAVE FLAGS LIKE THESE ONES // setup texture wrapping and filtering if (this->m_header->flags & TextureFlags::ClampUVs) { @@ -127,9 +127,6 @@ CTexture::CTexture (void* fileData) glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 8.0f); - // TODO: USE THIS ONE - // uint32_t blockSize = (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16; - auto cur = (*imgCur).second.begin (); auto end = (*imgCur).second.end (); @@ -141,6 +138,7 @@ CTexture::CTexture (void* fileData) void* dataptr = (*cur)->uncompressedData; uint32_t width = (*cur)->width; uint32_t height = (*cur)->height; + uint32_t bufferSize = (*cur)->uncompressedSize; GLenum textureFormat = GL_RGBA; if (this->m_header->freeImageFormat != FREE_IMAGE_FORMAT::FIF_UNKNOWN) @@ -157,6 +155,7 @@ CTexture::CTexture (void* fileData) dataptr = FreeImage_GetBits (converted); width = FreeImage_GetWidth (converted); height = FreeImage_GetHeight (converted); + bufferSize = FreeImage_GetMemorySize (converted); textureFormat = GL_BGRA; } else @@ -172,21 +171,24 @@ CTexture::CTexture (void* fileData) case GL_RGBA8: case GL_RG8: case GL_R8: - glTexImage2D (GL_TEXTURE_2D, level, internalFormat, - width, height, 0, - textureFormat, GL_UNSIGNED_BYTE, - dataptr + glTexImage2D ( + GL_TEXTURE_2D, level, internalFormat, + width, height, 0, + textureFormat, GL_UNSIGNED_BYTE, + dataptr ); break; case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: glCompressedTexImage2D ( - GL_TEXTURE_2D, level, internalFormat, - (*cur)->width, (*cur)->height, 0, - (*cur)->uncompressedSize, dataptr + GL_TEXTURE_2D, level, internalFormat, + width, height, 0, + bufferSize, dataptr ); break; + default: + throw std::runtime_error ("Cannot load texture, unknown format"); } // freeimage buffer won't be used anymore, so free memory diff --git a/src/WallpaperEngine/Render/Objects/CImage.cpp b/src/WallpaperEngine/Render/Objects/CImage.cpp index 6aedec9..33e0afe 100644 --- a/src/WallpaperEngine/Render/Objects/CImage.cpp +++ b/src/WallpaperEngine/Render/Objects/CImage.cpp @@ -298,6 +298,11 @@ void CImage::complexRender () CFBO* drawTo = this->m_mainFBO; ITexture* asInput = this->getTexture (); + // clear the main framebuffer + glBindFramebuffer (GL_FRAMEBUFFER, this->m_mainFBO->getFramebuffer ()); + // attach the main texture + glClear (GL_COLOR_BUFFER_BIT); + // do the first pass render into the main framebuffer auto cur = this->m_copyMaterial->getPasses ().begin (); auto end = this->m_copyMaterial->getPasses ().end (); diff --git a/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp b/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp index be89cfe..129337d 100644 --- a/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp +++ b/src/WallpaperEngine/Render/Objects/Effects/CPass.cpp @@ -70,9 +70,6 @@ void CPass::render (CFBO* drawTo, ITexture* input, GLuint position, GLuint texco // set proper viewport based on what we're drawing to glViewport (0, 0, drawTo->getRealWidth (), drawTo->getRealHeight ()); - if (drawTo != this->m_material->getImage ()->getScene ()->getFBO()) - glClear (GL_COLOR_BUFFER_BIT); - // set texture blending if (this->m_pass->getBlendingMode () == "translucent") {