working on endianness with vulkan images

This commit is contained in:
2024-12-17 00:11:21 +01:00
parent a85ad6378e
commit c636229875
12 changed files with 162 additions and 109 deletions

View File

@@ -22,12 +22,12 @@ namespace mlx
void Render() noexcept;
inline void ResetRenderData(int color) noexcept;
inline void ResetRenderData(mlx_color color) noexcept;
inline void PixelPut(int x, int y, int color) noexcept;
inline void PixelPutArray(int x, int y, int* pixels, std::size_t pixels_size) noexcept;
inline void PixelPutRegion(int x, int y, int w, int h, int* pixels) noexcept;
inline void StringPut(int x, int y, int, std::string str);
inline void PixelPut(int x, int y, mlx_color color) noexcept;
inline void PixelPutArray(int x, int y, mlx_color* color, std::size_t pixels_size) noexcept;
inline void PixelPutRegion(int x, int y, int w, int h, mlx_color* color) noexcept;
inline void StringPut(int x, int y, mlx_color color, std::string str);
inline void TexturePut(NonOwningPtr<class Texture> texture, int x, int y, float scale_x, float scale_y, float angle);
inline void TryEraseSpritesInScene(NonOwningPtr<Texture> texture) noexcept;

View File

@@ -3,14 +3,14 @@
namespace mlx
{
void GraphicsSupport::ResetRenderData(int color) noexcept
void GraphicsSupport::ResetRenderData(mlx_color color) noexcept
{
MLX_PROFILE_FUNCTION();
Vec4f vec_color = {
static_cast<float>((color & 0xFF000000) >> 24) / 255.0f,
static_cast<float>((color & 0x00FF0000) >> 16) / 255.0f,
static_cast<float>((color & 0x0000FF00) >> 8) / 255.0f,
static_cast<float>((color & 0x000000FF)) / 255.0f,
static_cast<float>(color.r) / 255.0f,
static_cast<float>(color.g) / 255.0f,
static_cast<float>(color.b) / 255.0f,
static_cast<float>(color.a) / 255.0f
};
p_scene->ResetScene(std::move(vec_color));
m_put_pixel_manager.ResetRenderData();
@@ -18,7 +18,7 @@ namespace mlx
m_pixelput_called = false;
}
void GraphicsSupport::PixelPut(int x, int y, int color) noexcept
void GraphicsSupport::PixelPut(int x, int y, mlx_color color) noexcept
{
MLX_PROFILE_FUNCTION();
NonOwningPtr<Texture> texture = m_put_pixel_manager.DrawPixel(x, y, m_draw_layer, color);
@@ -30,7 +30,7 @@ namespace mlx
}
}
void GraphicsSupport::PixelPutArray(int x, int y, int* pixels, std::size_t pixels_size) noexcept
void GraphicsSupport::PixelPutArray(int x, int y, mlx_color* pixels, std::size_t pixels_size) noexcept
{
MLX_PROFILE_FUNCTION();
NonOwningPtr<Texture> texture = m_put_pixel_manager.DrawPixelsArray(x, y, m_draw_layer, pixels, pixels_size);
@@ -42,7 +42,7 @@ namespace mlx
}
}
void GraphicsSupport::PixelPutRegion(int x, int y, int w, int h, int* pixels) noexcept
void GraphicsSupport::PixelPutRegion(int x, int y, int w, int h, mlx_color* pixels) noexcept
{
MLX_PROFILE_FUNCTION();
NonOwningPtr<Texture> texture = m_put_pixel_manager.DrawPixelsRegion(x, y, w, h, m_draw_layer, pixels);
@@ -54,17 +54,17 @@ namespace mlx
}
}
void GraphicsSupport::StringPut(int x, int y, int color, std::string str)
void GraphicsSupport::StringPut(int x, int y, mlx_color color, std::string str)
{
MLX_PROFILE_FUNCTION();
if(str.empty())
return;
Vec4f vec_color = {
static_cast<float>((color & 0xFF000000) >> 24) / 255.0f,
static_cast<float>((color & 0x00FF0000) >> 16) / 255.0f,
static_cast<float>((color & 0x0000FF00) >> 8) / 255.0f,
static_cast<float>((color & 0x000000FF)) / 255.0f,
static_cast<float>(color.r) / 255.0f,
static_cast<float>(color.g) / 255.0f,
static_cast<float>(color.b) / 255.0f,
static_cast<float>(color.a) / 255.0f,
};
NonOwningPtr<Text> text = p_scene->GetTextFromPositionAndColor(str, Vec2f{ static_cast<float>(x), static_cast<float>(y) }, vec_color);

View File

@@ -11,9 +11,9 @@ namespace mlx
PutPixelManager(NonOwningPtr<class Renderer> renderer) : p_renderer(renderer) {}
// Returns a valid pointer when a new texture has been created
NonOwningPtr<Texture> DrawPixel(int x, int y, std::uint64_t draw_layer, int color);
NonOwningPtr<Texture> DrawPixelsArray(int x, int y, std::uint64_t draw_layer, int* pixels, std::size_t pixels_size);
NonOwningPtr<Texture> DrawPixelsRegion(int x, int y, int w, int h, std::uint64_t draw_layer, int* pixels);
NonOwningPtr<Texture> DrawPixel(int x, int y, std::uint64_t draw_layer, mlx_color color);
NonOwningPtr<Texture> DrawPixelsArray(int x, int y, std::uint64_t draw_layer, mlx_color* pixels, std::size_t pixels_size);
NonOwningPtr<Texture> DrawPixelsRegion(int x, int y, int w, int h, std::uint64_t draw_layer, mlx_color* pixels);
void ResetRenderData();
~PutPixelManager() = default;

View File

@@ -83,11 +83,11 @@ namespace mlx
void Init(CPUBuffer pixels, std::uint32_t width, std::uint32_t height, VkFormat format, bool is_multisampled, [[maybe_unused]] std::string_view debug_name);
void Destroy() noexcept override;
void SetPixel(int x, int y, int color) noexcept;
void SetRegion(int x, int y, int w, int h, int* pixels) noexcept;
void SetLinearRegion(int x, int y, std::size_t len, int* pixels) noexcept;
int GetPixel(int x, int y) noexcept;
void GetRegion(int x, int y, int w, int h, int* dst) noexcept;
void SetPixel(int x, int y, mlx_color color) noexcept;
void SetRegion(int x, int y, int w, int h, mlx_color* color) noexcept;
void SetLinearRegion(int x, int y, std::size_t len, mlx_color* color) noexcept;
mlx_color GetPixel(int x, int y) noexcept;
void GetRegion(int x, int y, int w, int h, mlx_color* dst) noexcept;
void Clear(VkCommandBuffer cmd, Vec4f color) override;
void Update(VkCommandBuffer cmd);
@@ -98,7 +98,7 @@ namespace mlx
void OpenCPUBuffer();
private:
std::vector<int> m_cpu_buffer;
std::vector<mlx_color> m_cpu_buffer;
std::optional<GPUBuffer> m_staging_buffer;
bool m_has_been_modified = false;
};

View File

@@ -11,6 +11,38 @@ namespace mlx
std::ranges::reverse(value_representation);
return std::bit_cast<T>(value_representation);
}
constexpr std::uint32_t Rmask() noexcept
{
if constexpr(std::endian::native == std::endian::big)
return 0xFF000000;
else
return 0x000000FF;
}
constexpr std::uint32_t Gmask() noexcept
{
if constexpr(std::endian::native == std::endian::big)
return 0x00FF0000;
else
return 0x0000FF00;
}
constexpr std::uint32_t Bmask() noexcept
{
if constexpr(std::endian::native == std::endian::big)
return 0x0000FF00;
else
return 0x00FF0000;
}
constexpr std::uint32_t Amask() noexcept
{
if constexpr(std::endian::native == std::endian::big)
return 0x000000FF;
else
return 0xFF000000;
}
}
#endif

View File

@@ -126,7 +126,7 @@ extern "C"
gs->GetWindow()->GetSize(x, y);
}
void mlx_clear_window(mlx_context mlx, mlx_window win, int color)
void mlx_clear_window(mlx_context mlx, mlx_window win, mlx_color color)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::GraphicsSupport> gs = mlx->app->GetGraphicsSupport(win);
@@ -201,7 +201,7 @@ extern "C"
mlx->app->OnEvent(win, static_cast<int>(event), funct_ptr, param);
}
void mlx_pixel_put(mlx_context mlx, mlx_window win, int x, int y, int color)
void mlx_pixel_put(mlx_context mlx, mlx_window win, int x, int y, mlx_color color)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::GraphicsSupport> gs = mlx->app->GetGraphicsSupport(win);
@@ -248,16 +248,16 @@ extern "C"
mlx->app->DestroyTexture(image);
}
int mlx_get_image_pixel(mlx_context mlx, mlx_image image, int x, int y)
mlx_color mlx_get_image_pixel(mlx_context mlx, mlx_image image, int x, int y)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::Texture> texture = mlx->app->GetTexture(image);
if(!texture)
return 0;
return { .rgba = 0x00000000 };
return texture->GetPixel(x, y);
}
void mlx_set_image_pixel(mlx_context mlx, mlx_image image, int x, int y, int color)
void mlx_set_image_pixel(mlx_context mlx, mlx_image image, int x, int y, mlx_color color)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::Texture> texture = mlx->app->GetTexture(image);
@@ -278,7 +278,7 @@ extern "C"
gs->TexturePut(texture, x, y, 1.0f, 1.0f, 0.0f);
}
void mlx_string_put(mlx_context mlx, mlx_window win, int x, int y, int color, char* str)
void mlx_string_put(mlx_context mlx, mlx_window win, int x, int y, mlx_color color, char* str)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::GraphicsSupport> gs = mlx->app->GetGraphicsSupport(win);
@@ -381,7 +381,7 @@ extern "C"
gs->GetWindow()->Restore();
}
void mlx_pixel_put_array(mlx_context mlx, mlx_window win, int x, int y, int* pixels, size_t pixels_size)
void mlx_pixel_put_array(mlx_context mlx, mlx_window win, int x, int y, mlx_color* pixels, size_t pixels_size)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::GraphicsSupport> gs = mlx->app->GetGraphicsSupport(win);
@@ -390,7 +390,7 @@ extern "C"
gs->PixelPutArray(x, y, pixels, pixels_size);
}
void mlx_pixel_put_region(mlx_context mlx, mlx_window win, int x, int y, int w, int h, int* pixels)
void mlx_pixel_put_region(mlx_context mlx, mlx_window win, int x, int y, int w, int h, mlx_color* pixels)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::GraphicsSupport> gs = mlx->app->GetGraphicsSupport(win);
@@ -399,7 +399,7 @@ extern "C"
gs->PixelPutRegion(x, y, w, h, pixels);
}
void mlx_get_image_region(mlx_context mlx, mlx_image image, int x, int y, int w, int h, int* dst)
void mlx_get_image_region(mlx_context mlx, mlx_image image, int x, int y, int w, int h, mlx_color* dst)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::Texture> texture = mlx->app->GetTexture(image);
@@ -408,7 +408,7 @@ extern "C"
texture->GetRegion(x, y, w, h, dst);
}
void mlx_set_image_region(mlx_context mlx, mlx_image image, int x, int y, int w, int h, int* pixels)
void mlx_set_image_region(mlx_context mlx, mlx_image image, int x, int y, int w, int h, mlx_color* pixels)
{
MLX_CHECK_APPLICATION_POINTER(mlx);
mlx::NonOwningPtr<mlx::Texture> texture = mlx->app->GetTexture(image);

View File

@@ -2,21 +2,10 @@
#include <Core/SDLManager.h>
#include <Core/Memory.h>
#include <Embedded/IconMlx.h>
#include <Utils/Bits.h>
namespace mlx
{
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
constexpr const std::uint32_t rmask = 0xff000000;
constexpr const std::uint32_t gmask = 0x00ff0000;
constexpr const std::uint32_t bmask = 0x0000ff00;
constexpr const std::uint32_t amask = 0x000000ff;
#else
constexpr const std::uint32_t rmask = 0x000000ff;
constexpr const std::uint32_t gmask = 0x0000ff00;
constexpr const std::uint32_t bmask = 0x00ff0000;
constexpr const std::uint32_t amask = 0xff000000;
#endif
namespace Internal
{
struct WindowInfos
@@ -65,7 +54,7 @@ namespace mlx
infos->window = SDL_CreateWindow(info->title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, info->width, info->height, flags);
if(!infos->window)
FatalError("SDL: unable to open a new window; %", SDL_GetError());
infos->icon = SDL_CreateRGBSurfaceFrom(static_cast<void*>(logo_mlx), logo_mlx_width, logo_mlx_height, 32, 4 * logo_mlx_width, rmask, gmask, bmask, amask);
infos->icon = SDL_CreateRGBSurfaceFrom(static_cast<void*>(logo_mlx), logo_mlx_width, logo_mlx_height, 32, 4 * logo_mlx_width, Rmask(), Gmask(), Bmask(), Amask());
SDL_SetWindowIcon(infos->window, infos->icon);
m_windows_registry.insert(infos);

View File

@@ -2,10 +2,11 @@
#include <Graphics/PutPixelManager.h>
#include <Renderer/Renderer.h>
#include <Utils/Bits.h>
namespace mlx
{
NonOwningPtr<Texture> PutPixelManager::DrawPixel(int x, int y, std::uint64_t draw_layer, int color)
NonOwningPtr<Texture> PutPixelManager::DrawPixel(int x, int y, std::uint64_t draw_layer, mlx_color color)
{
MLX_PROFILE_FUNCTION();
bool is_newlayer;
@@ -16,7 +17,7 @@ namespace mlx
return (is_newlayer ? layer : nullptr);
}
NonOwningPtr<Texture> PutPixelManager::DrawPixelsArray(int x, int y, std::uint64_t draw_layer, int* pixels, std::size_t pixels_size)
NonOwningPtr<Texture> PutPixelManager::DrawPixelsArray(int x, int y, std::uint64_t draw_layer, mlx_color* pixels, std::size_t pixels_size)
{
MLX_PROFILE_FUNCTION();
bool is_newlayer;
@@ -27,7 +28,7 @@ namespace mlx
return (is_newlayer ? layer : nullptr);
}
NonOwningPtr<Texture> PutPixelManager::DrawPixelsRegion(int x, int y, int w, int h, std::uint64_t draw_layer, int* pixels)
NonOwningPtr<Texture> PutPixelManager::DrawPixelsRegion(int x, int y, int w, int h, std::uint64_t draw_layer, mlx_color* pixels)
{
MLX_PROFILE_FUNCTION();
bool is_newlayer;
@@ -70,7 +71,7 @@ namespace mlx
try
{
m_placements[draw_layer] = m_textures.at(m_current_texture_index).get();
m_textures.at(m_current_texture_index)->Clear(VK_NULL_HANDLE, Vec4f{ 0.0f });
m_textures.at(m_current_texture_index)->Clear(VK_NULL_HANDLE, Vec4f{ 0.f });
NonOwningPtr<Texture> texture = m_textures.at(m_current_texture_index).get();
m_current_texture_index++;
return texture;

View File

@@ -5,7 +5,6 @@
#include <Renderer/RenderCore.h>
#include <Utils/CallOnExit.h>
#include <Core/Memory.h>
#include <Utils/Bits.h>
#define STB_IMAGE_IMPLEMENTATION
@@ -200,20 +199,21 @@ namespace mlx
Image::Destroy();
}
void Texture::SetPixel(int x, int y, int color) noexcept
void Texture::SetPixel(int x, int y, mlx_color color) noexcept
{
MLX_PROFILE_FUNCTION();
if(x < 0 || y < 0 || static_cast<std::uint32_t>(x) > m_width || static_cast<std::uint32_t>(y) > m_height)
return;
if(!m_staging_buffer.has_value())
OpenCPUBuffer();
// Needs to reverse bytes order because why not
color = ByteSwap(color);
m_cpu_buffer[(y * m_width) + x] = color;
if constexpr(std::endian::native == std::endian::little)
m_cpu_buffer[(y * m_width) + x] = mlx_color{ .r = color.a, .g = color.b, .b = color.g, .a = color.r };
else
m_cpu_buffer[(y * m_width) + x] = color;
m_has_been_modified = true;
}
void Texture::SetRegion(int x, int y, int w, int h, int* pixels) noexcept
void Texture::SetRegion(int x, int y, int w, int h, mlx_color* pixels) noexcept
{
MLX_PROFILE_FUNCTION();
if(x < 0 || y < 0 || static_cast<std::uint32_t>(x) > m_width || static_cast<std::uint32_t>(y) > m_height)
@@ -231,40 +231,48 @@ namespace mlx
break;
moving_y++;
}
// Needs to reverse bytes order because why not
int color = ByteSwap(pixels[i]);
m_cpu_buffer[(moving_y * m_width) + moving_x] = color;
if constexpr(std::endian::native == std::endian::little)
m_cpu_buffer[(moving_y * m_width) + moving_x] = mlx_color{ .r = pixels[i].a, .g = pixels[i].b, .b = pixels[i].g, .a = pixels[i].r };
else
m_cpu_buffer[(moving_y * m_width) + moving_x] = pixels[i];
}
m_has_been_modified = true;
}
void Texture::SetLinearRegion(int x, int y, std::size_t len, int* pixels) noexcept
void Texture::SetLinearRegion(int x, int y, std::size_t len, mlx_color* pixels) noexcept
{
MLX_PROFILE_FUNCTION();
if(x < 0 || y < 0 || static_cast<std::uint32_t>(x) > m_width || static_cast<std::uint32_t>(y) > m_height)
return;
if(!m_staging_buffer.has_value())
OpenCPUBuffer();
for(std::size_t i = 0; i < len; i++)
if constexpr(std::endian::native == std::endian::little)
for(std::size_t i = 0; i < len; i++)
m_cpu_buffer[(y * m_width) + x + i] = mlx_color{ .r = pixels[i].a, .g = pixels[i].b, .b = pixels[i].g, .a = pixels[i].r };
else
{
// Needs to reverse bytes order because why not
int color = ByteSwap(pixels[i]);
m_cpu_buffer[(y * m_width) + x + i] = color;
std::memcpy(&m_cpu_buffer[(y * m_width) + x], pixels, len);
}
m_has_been_modified = true;
}
int Texture::GetPixel(int x, int y) noexcept
mlx_color Texture::GetPixel(int x, int y) noexcept
{
MLX_PROFILE_FUNCTION();
if(x < 0 || y < 0 || static_cast<std::uint32_t>(x) > m_width || static_cast<std::uint32_t>(y) > m_height)
return 0;
return { .rgba = 0x00000000 };
if(!m_staging_buffer.has_value())
OpenCPUBuffer();
return m_cpu_buffer[(y * m_width) + x];
if constexpr(std::endian::native == std::endian::little)
{
mlx_color color = m_cpu_buffer[(y * m_width) + x];
return { .r = color.a, .g = color.b, .b = color.g, .a = color.r };
}
else
return m_cpu_buffer[(y * m_width) + x];
}
void Texture::GetRegion(int x, int y, int w, int h, int* dst) noexcept
void Texture::GetRegion(int x, int y, int w, int h, mlx_color* dst) noexcept
{
MLX_PROFILE_FUNCTION();
if(x < 0 || y < 0 || static_cast<std::uint32_t>(x) > m_width || static_cast<std::uint32_t>(y) > m_height)
@@ -280,8 +288,13 @@ namespace mlx
break;
moving_y++;
}
// Needs to reverse bytes order because why not
dst[i] = ByteSwap(m_cpu_buffer[(moving_y * m_width) + moving_x]);
if constexpr(std::endian::native == std::endian::little)
{
mlx_color color = m_cpu_buffer[(moving_y * m_width) + moving_x];
dst[i] = mlx_color{ .r = color.a, .g = color.b, .b = color.g, .a = color.r };
}
else
dst[i] = m_cpu_buffer[(moving_y * m_width) + moving_x];
}
}
@@ -291,12 +304,13 @@ namespace mlx
Image::Clear(cmd, std::move(color));
if(m_staging_buffer.has_value())
{
std::uint8_t color_bytes[4];
color_bytes[0] = static_cast<std::uint8_t>(color.r * 255.f);
color_bytes[1] = static_cast<std::uint8_t>(color.g * 255.f);
color_bytes[2] = static_cast<std::uint8_t>(color.b * 255.f);
color_bytes[3] = static_cast<std::uint8_t>(color.a * 255.f);
std::fill(m_cpu_buffer.begin(), m_cpu_buffer.end(), *reinterpret_cast<int*>(color_bytes));
mlx_color processed_color{
.r = static_cast<std::uint8_t>(color.r * 255.f),
.g = static_cast<std::uint8_t>(color.g * 255.f),
.b = static_cast<std::uint8_t>(color.b * 255.f),
.a = static_cast<std::uint8_t>(color.a * 255.f)
};
std::fill(m_cpu_buffer.begin(), m_cpu_buffer.end(), processed_color);
}
}