adding multiple mapping support on textures

This commit is contained in:
kbz_8
2023-04-23 22:11:44 +02:00
parent 77f707ca7a
commit 4edd619841
20 changed files with 133 additions and 89 deletions

View File

@@ -6,7 +6,7 @@
/* By: maldavid <kbz_8.dev@akel-engine.com> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/31 18:03:35 by maldavid #+# #+# */
/* Updated: 2023/04/21 19:31:15 by maldavid ### ########.fr */
/* Updated: 2023/04/23 15:30:54 by maldavid ### ########.fr */
/* */
/* ************************************************************************** */
@@ -14,20 +14,39 @@
#include <renderer/images/texture.h>
#include <renderer/buffers/vk_buffer.h>
#include <renderer/renderer.h>
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
namespace mlx
{
void Texture::create(uint8_t* pixels, uint32_t width, uint32_t height, VkFormat format)
void Texture::create(uint8_t* pixels, uint32_t width, uint32_t height, VkFormat format, bool enable_mapping)
{
Image::create(width, height, format,
VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
);
if(enable_mapping)
{
#ifdef DEBUG
core::error::report(e_kind::message, "Texture : creating CPU mappable texture");
#endif
Image::create(width, height, format, VK_IMAGE_TILING_LINEAR,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
{
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
}
);
}
else
{
#ifdef DEBUG
core::error::report(e_kind::message, "Texture : creating non CPU mappable texture");
#endif
Image::create(width, height, format, VK_IMAGE_TILING_OPTIMAL,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
{ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT }
);
}
Image::createImageView(VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_ASPECT_COLOR_BIT);
Image::createSampler();
@@ -52,28 +71,49 @@ namespace mlx
Image::copyFromBuffer(staging_buffer);
staging_buffer.destroy();
}
_cpu_map = nullptr;
_cpu_map_adress = nullptr;
}
void* Texture::openCPUmap()
{
if(_cpu_map_adress != nullptr)
return _cpu_map_adress;
_cpu_map = std::make_shared<Buffer>();
_cpu_map->create(Buffer::kind::dynamic, sizeof(uint32_t) * (getWidth() * getHeight()), VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
Image::copyToBuffer(*_cpu_map);
if(!_cpu_map->isMapped())
_cpu_map->mapMem(&_cpu_map_adress);
if(_cpu_map_adress == nullptr)
core::error::report(e_kind::fatal_error, "Texture : CPU memory mapping failed");
return _cpu_map_adress;
if(_cpu_map != nullptr)
return _cpu_map;
#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
}
#ifdef DEBUG
else
core::error::report(e_kind::message, "Texture : mapped CPU memory using direct memory mapping");
#endif
return _cpu_map;
}
void Texture::render(Renderer& renderer, int x, int y)
{
if(_cpu_map_adress != nullptr)
Image::copyFromBuffer(*_cpu_map);
if(_buf_map.has_value())
Image::copyFromBuffer(*_buf_map);
auto cmd = renderer.getActiveCmdBuffer().get();
_vbo.bind(renderer);
_ibo.bind(renderer);
@@ -85,8 +125,8 @@ namespace mlx
void Texture::destroy() noexcept
{
Image::destroy();
if(_cpu_map != nullptr)
_cpu_map->destroy();
if(_buf_map.has_value())
_buf_map->destroy();
_vbo.destroy();
_ibo.destroy();
}
@@ -95,7 +135,6 @@ namespace mlx
{
Texture texture;
int channels;
VkFormat format;
uint8_t* data = nullptr;
std::string filename = file.string();
@@ -104,8 +143,7 @@ namespace mlx
if(stbi_is_hdr(filename.c_str()))
core::error::report(e_kind::fatal_error, "Texture : unsupported image format '%s'", filename.c_str());
data = stbi_load(filename.c_str(), w, h, &channels, 4);
format = VK_FORMAT_R8G8B8A8_UNORM;
texture.create(data, *w, *h, format);
texture.create(data, *w, *h, VK_FORMAT_R8G8B8A8_UNORM);
stbi_image_free(data);
return texture;
}