Reuse image data instead of fetching it every time off the GPU

This commit is contained in:
ShadelessFox 2025-02-22 17:49:36 +01:00
parent 8a8c1525fd
commit 0b6ba2faee
No known key found for this signature in database
GPG Key ID: 1CF8D77ADDADADD9
5 changed files with 29 additions and 16 deletions

View File

@ -5,8 +5,9 @@
#include "graphics/core/Texture.hpp"
gui::Canvas::Canvas(ImageFormat inFormat, glm::uvec2 inSize) : UINode(inSize) {
ImageData data {inFormat, inSize.x, inSize.y};
mTexture = Texture::from(&data);
auto data = std::make_shared<ImageData>(inFormat, inSize.x, inSize.y);
mTexture = Texture::from(data.get());
mData = std::move(data);
}
void gui::Canvas::draw(const DrawContext& pctx, const Assets& assets) {

View File

@ -15,11 +15,15 @@ namespace gui {
void draw(const DrawContext& pctx, const Assets& assets) override;
[[nodiscard]] std::shared_ptr<::Texture> texture() const {
[[nodiscard]] auto texture() const {
return mTexture;
}
[[nodiscard]] auto data() const {
return mData;
}
private:
std::shared_ptr<::Texture> mTexture;
std::unique_ptr<ImageData> mData;
std::shared_ptr<ImageData> mData;
};
}

View File

@ -326,7 +326,7 @@ static int p_get_src(UINode* node, lua::State* L) {
static int p_get_data(UINode* node, lua::State* L) {
if (auto canvas = dynamic_cast<Canvas*>(node)) {
return lua::newuserdata<lua::LuaCanvas>(L, canvas->texture());
return lua::newuserdata<lua::LuaCanvas>(L, canvas->texture(), canvas->data());
}
return 0;
}

View File

@ -96,22 +96,29 @@ namespace lua {
class LuaCanvas : public Userdata {
public:
explicit LuaCanvas(std::shared_ptr<Texture> inTexture);
explicit LuaCanvas(
std::shared_ptr<Texture> inTexture,
std::shared_ptr<ImageData> inData
);
~LuaCanvas() override = default;
const std::string& getTypeName() const override {
return TYPENAME;
}
[[nodiscard]] Texture& texture() const { return *mTexture; }
[[nodiscard]] auto& texture() const {
return *mTexture;
}
[[nodiscard]] ImageData& data() const { return *mData; }
[[nodiscard]] auto& data() const {
return *mData;
}
static int createMetatable(lua::State*);
inline static std::string TYPENAME = "Canvas";
private:
std::shared_ptr<Texture> mTexture;
std::unique_ptr<ImageData> mData;
std::shared_ptr<ImageData> mData;
};
static_assert(!std::is_abstract<LuaCanvas>());
}

View File

@ -7,9 +7,10 @@
using namespace lua;
LuaCanvas::LuaCanvas(std::shared_ptr<Texture> inTexture)
: mTexture(std::move(inTexture)) {
mData = mTexture->readData();
LuaCanvas::LuaCanvas(
std::shared_ptr<Texture> inTexture, std::shared_ptr<ImageData> inData
)
: mTexture(std::move(inTexture)), mData(std::move(inData)) {
}
union RGBA {
@ -29,8 +30,8 @@ static RGBA* get_at(const ImageData& data, uint x, uint y) {
}
static RGBA* get_at(State* L, uint x, uint y) {
if (auto texture = touserdata<LuaCanvas>(L, 1)) {
return get_at(texture->data(), x, y);
if (auto canvas = touserdata<LuaCanvas>(L, 1)) {
return get_at(canvas->data(), x, y);
}
return nullptr;
}
@ -76,8 +77,8 @@ static int l_set(State* L) {
}
static int l_update(State* L) {
if (auto texture = touserdata<LuaCanvas>(L, 1)) {
texture->texture().reload(texture->data());
if (auto canvas = touserdata<LuaCanvas>(L, 1)) {
canvas->texture().reload(canvas->data());
}
return 0;
}