From e98bd490b23bb0197e474dc2110162942fc0c562 Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Tue, 6 Jun 2023 16:35:08 +0200 Subject: [PATCH] yes --- Makefile | 4 +-- src/renderer/images/texture.cpp | 63 ++++++++++++++++++--------------- src/renderer/images/texture.h | 6 +++- test/.gdb_history | 59 ++++++++++++++++++++++++++++++ test/main.c | 34 ++++++++++-------- test/run.sh | 2 +- 6 files changed, 122 insertions(+), 46 deletions(-) create mode 100644 test/.gdb_history diff --git a/Makefile b/Makefile index b75bf02..369b703 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: maldavid +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2022/10/04 16:43:41 by maldavid #+# #+# # -# Updated: 2023/04/22 20:28:48 by maldavid ### ########.fr # +# Updated: 2023/06/06 15:59:27 by maldavid ### ########.fr # # # # **************************************************************************** # @@ -29,7 +29,7 @@ ifeq ($(TOOLCHAIN), gcc) endif CXXFLAGS = -std=c++17 -O3 -fPIC -INCLUDES = -I./includes -I./src -I./third_party +INCLUDES = -I./includes -I./src -I./third_party -I ~/.xmake/packages/l/libsdl/2.26.4/8dfbcb8049e744a597cd5333e1b399cd/include ifeq ($(DEBUG), true) CXXFLAGS += -g -D DEBUG diff --git a/src/renderer/images/texture.cpp b/src/renderer/images/texture.cpp index e858b57..13c5fc2 100644 --- a/src/renderer/images/texture.cpp +++ b/src/renderer/images/texture.cpp @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/31 18:03:35 by maldavid #+# #+# */ -/* Updated: 2023/04/25 22:13:45 by maldavid ### ########.fr */ +/* Updated: 2023/06/06 16:05:02 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -52,49 +52,56 @@ namespace mlx } } - void Texture::setPixel() + void Texture::setPixel(int x, int y, uint32_t color) noexcept + { + if(x < 0 || y < 0 || x > getWidth() || y > getHeight()) + return; + if(_cpu_map == nullptr) + openCPUmap(); + unsigned char* mem = static_cast(_cpu_map) + (y * getWidth() * formatSize(getFormat())) + (x * formatSize(getFormat())); + *reinterpret_cast(mem) = color; + _has_been_modified = true; + } - void* Texture::openCPUmap() + int Texture::getPixel(int x, int y) noexcept + { + if(x < 0 || y < 0 || x > getWidth() || y > getHeight()) + return 0; + if(_cpu_map == nullptr) + openCPUmap(); + uint32_t color = 0; + unsigned char* mem = static_cast(_cpu_map) + (y * getWidth() * formatSize(getFormat())) + (x * formatSize(getFormat())); + color = *reinterpret_cast(mem); + color >>= 8; + return (color); + } + + void Texture::openCPUmap() { if(_cpu_map != nullptr) - return _cpu_map; + return; #ifdef DEBUG core::error::report(e_kind::message, "Texture : enabling CPU mapping"); #endif - Buffer staging_buffer; std::size_t size = getWidth() * getHeight() * formatSize(getFormat()); - staging_buffer.create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, nullptr); - Image::copyToBuffer(staging_buffer); - - this->destroy(); - this->create(nullptr, getWidth(), getHeight(), getFormat(), true); - - Image::copyFromBuffer(staging_buffer); - staging_buffer.destroy(); - - if(vkMapMemory(Render_Core::get().getDevice().get(), getDeviceMemory(), 0, VK_WHOLE_SIZE, 0, &_cpu_map) != VK_SUCCESS) - { - _buf_map.emplace(); - _buf_map->create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); - Image::copyToBuffer(*_buf_map); - _buf_map->mapMem(&_cpu_map); - #ifdef DEBUG - core::error::report(e_kind::message, "Texture : mapped CPU memory using staging buffer"); - #endif - } + _buf_map.emplace(); + _buf_map->create(Buffer::kind::dynamic, size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT); + Image::copyToBuffer(*_buf_map); + _buf_map->mapMem(&_cpu_map); #ifdef DEBUG - else - core::error::report(e_kind::message, "Texture : mapped CPU memory using direct memory mapping"); + core::error::report(e_kind::message, "Texture : mapped CPU memory using staging buffer"); #endif - return _cpu_map; } void Texture::render(Renderer& renderer, int x, int y) { - if(_buf_map.has_value()) + if(_has_been_modified) + { Image::copyFromBuffer(*_buf_map); + _has_been_modified = false; + } auto cmd = renderer.getActiveCmdBuffer().get(); _vbo.bind(renderer); _ibo.bind(renderer); diff --git a/src/renderer/images/texture.h b/src/renderer/images/texture.h index 5f5cbda..31cb068 100644 --- a/src/renderer/images/texture.h +++ b/src/renderer/images/texture.h @@ -6,7 +6,7 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2023/03/08 02:24:58 by maldavid #+# #+# */ -/* Updated: 2023/04/25 20:10:44 by maldavid ### ########.fr */ +/* Updated: 2023/06/06 15:54:44 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ @@ -44,12 +44,16 @@ namespace mlx ~Texture() = default; + private: + void openCPUmap(); + private: C_VBO _vbo; C_IBO _ibo; DescriptorSet _set; std::optional _buf_map = std::nullopt; void* _cpu_map = nullptr; + bool _has_been_modified = false; bool _has_been_updated = false; }; diff --git a/test/.gdb_history b/test/.gdb_history new file mode 100644 index 0000000..6eef341 --- /dev/null +++ b/test/.gdb_history @@ -0,0 +1,59 @@ +run +a +q +run +bt +q +run +a +q +run +bt +a +y +q +run +p (i / 400) * 100 +q +run +bt +q +run +bt +q +b create_image +run +tui n +n +n +n +n +n +n +n +n +s +n +n +s +s +n +n +n +n +n +n +n +n +n +n +n +n +n +n +n +n +n +s +s +q diff --git a/test/main.c b/test/main.c index 500ff16..9aa1f41 100644 --- a/test/main.c +++ b/test/main.c @@ -6,11 +6,12 @@ /* By: maldavid +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2022/10/04 17:55:21 by maldavid #+# #+# */ -/* Updated: 2023/04/19 11:54:51 by maldavid ### ########.fr */ +/* Updated: 2023/06/06 16:22:26 by maldavid ### ########.fr */ /* */ /* ************************************************************************** */ #include +#include #include "../includes/mlx.h" typedef struct s_mlx @@ -46,24 +47,29 @@ int update(t_mlx *mlx) void *create_image(t_mlx *mlx) { - int ignore[3]; - void *img; - char *addr; - int i; + unsigned char pixel[4]; + int i[3]; + void *img; + memset(i, 0, sizeof(int) * 3); img = mlx_new_image(mlx->mlx, 100, 100); - addr = mlx_get_data_addr(mlx->mlx, img, &ignore[0], &ignore[1], &ignore[2]); - i = 0; - while (i < (100 * 100) * 4) + while (i[0] < (100 * 100) * 4) { - if (i < 10000 || i > 20000) + if (i[0] < 10000 || i[0] > 20000) { - addr[i + 0] = 0xFF; - addr[i + 1] = i; - addr[i + 2] = 0x00; - addr[i + 3] = 0xFF; + pixel[i[0] + 0] = 0xFF; + pixel[i[0] + 1] = i[0]; + pixel[i[0] + 2] = 0x00; + pixel[i[0] + 3] = 0xFF; + } + mlx_set_image_pixel(mlx->mlx, img, i[1], i[2], *((int *)pixel)); + i[0] += 4; + i[1]++; + if (i[1] >= 100) + { + i[1] = 0; + i[2]++; } - i += 4; } return (img); } diff --git a/test/run.sh b/test/run.sh index f3c908d..1b2a692 100755 --- a/test/run.sh +++ b/test/run.sh @@ -1 +1 @@ -clang main.c ../libmlx.so -lSDL2 -g && ./a.out +clang main.c ../libmlx.so `/nfs/homes/maldavid/.xmake/packages/l/libsdl/2.26.4/8dfbcb8049e744a597cd5333e1b399cd/bin/sdl2-config --cflags --libs` -g && ./a.out