From 6f5703baf1737ca1d7dd70982e878fd83d288cdd Mon Sep 17 00:00:00 2001 From: x2048 Date: Mon, 23 Jan 2023 00:18:48 +0100 Subject: [PATCH] Clear exposure compensation state textures on creation (#13151) --- src/client/render/pipeline.cpp | 22 +++++++++++++++++----- src/client/render/pipeline.h | 5 +++-- src/client/render/secondstage.cpp | 4 ++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/client/render/pipeline.cpp b/src/client/render/pipeline.cpp index cc275a7ef..c6dec2542 100644 --- a/src/client/render/pipeline.cpp +++ b/src/client/render/pipeline.cpp @@ -40,7 +40,7 @@ video::ITexture *TextureBuffer::getTexture(u8 index) } -void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format) +void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::string &name, video::ECOLOR_FORMAT format, bool clear) { assert(index != NO_DEPTH_TEXTURE); @@ -54,9 +54,10 @@ void TextureBuffer::setTexture(u8 index, core::dimension2du size, const std::str definition.size = size; definition.name = name; definition.format = format; + definition.clear = clear; } -void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format) +void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &name, video::ECOLOR_FORMAT format, bool clear) { assert(index != NO_DEPTH_TEXTURE); @@ -70,6 +71,7 @@ void TextureBuffer::setTexture(u8 index, v2f scale_factor, const std::string &na definition.scale_factor = scale_factor; definition.name = name; definition.format = format; + definition.clear = clear; } void TextureBuffer::reset(PipelineContext &context) @@ -135,10 +137,20 @@ bool TextureBuffer::ensureTexture(video::ITexture **texture, const TextureDefini if (*texture) m_driver->removeTexture(*texture); - if (definition.valid) - *texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format); - else + if (definition.valid) { + if (definition.clear) { + video::IImage *image = m_driver->createImage(definition.format, size); + image->fill(0u); + *texture = m_driver->addTexture(definition.name.c_str(), image); + image->drop(); + } + else { + *texture = m_driver->addRenderTargetTexture(size, definition.name.c_str(), definition.format); + } + } + else { *texture = nullptr; + } return true; } diff --git a/src/client/render/pipeline.h b/src/client/render/pipeline.h index bfdef2931..f446773ba 100644 --- a/src/client/render/pipeline.h +++ b/src/client/render/pipeline.h @@ -126,7 +126,7 @@ public: * @param name unique name of the texture * @param format color format */ - void setTexture(u8 index, core::dimension2du size, const std::string& name, video::ECOLOR_FORMAT format); + void setTexture(u8 index, core::dimension2du size, const std::string& name, video::ECOLOR_FORMAT format, bool clear = false); /** * Configure relative-size texture for the specific index @@ -136,7 +136,7 @@ public: * @param name unique name of the texture * @param format color format */ - void setTexture(u8 index, v2f scale_factor, const std::string& name, video::ECOLOR_FORMAT format); + void setTexture(u8 index, v2f scale_factor, const std::string& name, video::ECOLOR_FORMAT format, bool clear = false); virtual u8 getTextureCount() override { return m_textures.size(); } virtual video::ITexture *getTexture(u8 index) override; @@ -150,6 +150,7 @@ private: bool valid { false }; bool fixed_size { false }; bool dirty { false }; + bool clear { false }; v2f scale_factor; core::dimension2du size; std::string name; diff --git a/src/client/render/secondstage.cpp b/src/client/render/secondstage.cpp index 395a0fe6b..1575cfb1f 100644 --- a/src/client/render/secondstage.cpp +++ b/src/client/render/secondstage.cpp @@ -121,8 +121,8 @@ RenderStep *addPostProcessing(RenderPipeline *pipeline, RenderStep *previousStep static const u8 TEXTURE_BLOOM_UP = 20; buffer->setTexture(TEXTURE_COLOR, scale, "3d_render", color_format); - buffer->setTexture(TEXTURE_EXPOSURE_1, core::dimension2du(1,1), "exposure_1", color_format); - buffer->setTexture(TEXTURE_EXPOSURE_2, core::dimension2du(1,1), "exposure_2", color_format); + buffer->setTexture(TEXTURE_EXPOSURE_1, core::dimension2du(1,1), "exposure_1", color_format, /*clear:*/ true); + buffer->setTexture(TEXTURE_EXPOSURE_2, core::dimension2du(1,1), "exposure_2", color_format, /*clear:*/ true); buffer->setTexture(TEXTURE_DEPTH, scale, "3d_depthmap", depth_format); // attach buffer to the previous step