#ifndef EMULATOR_INCLUDE_EMULATOR_GRAPHICS_UTILS_H_ #define EMULATOR_INCLUDE_EMULATOR_GRAPHICS_UTILS_H_ #include "Kyty/Core/Common.h" #include "Emulator/Common.h" #include #ifdef KYTY_EMU_ENABLED namespace Kyty { template class Vector; } // namespace Kyty namespace Kyty::Libs::Graphics { class CommandBuffer; struct GraphicContext; struct VulkanBuffer; struct VulkanImage; struct DepthStencilVulkanImage; struct VulkanSwapchain; struct BufferImageCopy { uint32_t offset; uint32_t pitch; uint32_t dst_level; uint32_t width; uint32_t height; int dst_x; int dst_y; }; struct ImageImageCopy { VulkanImage* src_image; uint32_t src_level; uint32_t dst_level; uint32_t width; uint32_t height; int src_x; int src_y; int dst_x; int dst_y; }; void UtilBufferToImage(CommandBuffer* buffer, VulkanBuffer* src_buffer, uint32_t src_pitch, VulkanImage* dst_image); void UtilBufferToImage(CommandBuffer* buffer, VulkanBuffer* src_buffer, VulkanImage* dst_image, const Vector& regions, uint64_t dst_layout); void UtilImageToImage(CommandBuffer* buffer, const Vector& regions, VulkanImage* dst_image, uint64_t dst_layout); void UtilBlitImage(CommandBuffer* buffer, VulkanImage* src_image, VulkanSwapchain* dst_swapchain); void UtilFillImage(GraphicContext* ctx, VulkanImage* dst_image, const void* src_data, uint64_t size, uint32_t src_pitch); void UtilFillImage(GraphicContext* ctx, VulkanImage* dst_image, const void* src_data, uint64_t size, const Vector& regions, uint64_t dst_layout); void UtilFillImage(GraphicContext* ctx, const Vector& regions, VulkanImage* dst_image, uint64_t dst_layout); void UtilCopyBuffer(VulkanBuffer* src_buffer, VulkanBuffer* dst_buffer, uint64_t size); void UtilSetDepthLayoutOptimal(DepthStencilVulkanImage* image); void UtilSetImageLayoutOptimal(VulkanImage* image); void VulkanCreateBuffer(GraphicContext* gctx, uint64_t size, VulkanBuffer* buffer); void VulkanDeleteBuffer(GraphicContext* gctx, VulkanBuffer* buffer); inline std::pair UtilCalcMipmapOffset(uint32_t lod, uint32_t width, uint32_t height) { uint32_t mip_width = width; uint32_t mip_height = height; int mip_x = 0; int mip_y = 0; for (uint32_t i = 0; i < 16; i++) { if (i == lod) { return {mip_x, mip_y}; } bool odd = ((i & 1u) != 0); mip_x += static_cast(odd ? mip_width : 0); mip_y += static_cast(odd ? 0 : mip_height); mip_width >>= (mip_width > 1 ? 1u : 0u); mip_height >>= (mip_height > 1 ? 1u : 0u); } return {mip_x, mip_y}; } } // namespace Kyty::Libs::Graphics #endif // KYTY_EMU_ENABLED #endif /* EMULATOR_INCLUDE_EMULATOR_GRAPHICS_UTILS_H_ */