Skip to content

Commit

Permalink
Create Vulkan textures
Browse files Browse the repository at this point in the history
  • Loading branch information
RobDangerous committed Feb 15, 2025
1 parent b50ce07 commit d0dd195
Show file tree
Hide file tree
Showing 6 changed files with 260 additions and 166 deletions.
86 changes: 85 additions & 1 deletion Backends/Graphics5/Vulkan/Sources/kope/vulkan/device.c
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,91 @@ void kope_vulkan_device_create_command_list(kope_g5_device *device, kope_g5_comm
vkBeginCommandBuffer(list->vulkan.command_buffer, &begin_info);
}

void kope_vulkan_device_create_texture(kope_g5_device *device, const kope_g5_texture_parameters *parameters, kope_g5_texture *texture) {}
void kope_vulkan_device_create_texture(kope_g5_device *device, const kope_g5_texture_parameters *parameters, kope_g5_texture *texture) {
VkFormat format = convert_format(parameters->format);

VkFormatProperties format_properties;
vkGetPhysicalDeviceFormatProperties(gpu, format, &format_properties);

assert((format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) != 0);

texture->vulkan.width = parameters->width;
texture->vulkan.height = parameters->height;

VkImageCreateInfo image_create_info = {
.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
.pNext = NULL,
.imageType = VK_IMAGE_TYPE_2D,
.format = format,
.extent.width = parameters->width,
.extent.height = parameters->height,
.extent.depth = 1,
.mipLevels = 1,
.arrayLayers = 1,
.samples = VK_SAMPLE_COUNT_1_BIT,
.tiling = VK_IMAGE_TILING_OPTIMAL,
.usage = VK_IMAGE_USAGE_SAMPLED_BIT,
.flags = 0,
.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED,
};

VkMemoryAllocateInfo memory_allocate_info = {
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
.pNext = NULL,
.allocationSize = 0,
.memoryTypeIndex = 0,
};

VkResult result = vkCreateImage(device->vulkan.device, &image_create_info, NULL, &texture->vulkan.image);
assert(result == VK_SUCCESS);

VkMemoryRequirements memory_requirements;
vkGetImageMemoryRequirements(device->vulkan.device, texture->vulkan.image, &memory_requirements);

texture->vulkan.device_size = memory_allocate_info.allocationSize = memory_requirements.size;

bool memory_type_found =
memory_type_from_properties(device, memory_requirements.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &memory_allocate_info.memoryTypeIndex);
assert(memory_type_found);

result = vkAllocateMemory(device->vulkan.device, &memory_allocate_info, NULL, &texture->vulkan.device_memory);
assert(result == VK_SUCCESS);

result = vkBindImageMemory(device->vulkan.device, texture->vulkan.image, texture->vulkan.device_memory, 0);
assert(result == VK_SUCCESS);

VkImageSubresource subresource = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.mipLevel = 0,
.arrayLayer = 0,
};

VkSubresourceLayout layout;
vkGetImageSubresourceLayout(device->vulkan.device, texture->vulkan.image, &subresource, &layout);

texture->vulkan.row_pitch = layout.rowPitch;

VkImageViewCreateInfo view_create_info = {
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
.pNext = NULL,
.image = texture->vulkan.image,
.viewType = VK_IMAGE_VIEW_TYPE_2D,
.format = format,
.components.r = VK_COMPONENT_SWIZZLE_R,
.components.g = VK_COMPONENT_SWIZZLE_G,
.components.b = VK_COMPONENT_SWIZZLE_B,
.components.a = VK_COMPONENT_SWIZZLE_A,
.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.subresourceRange.baseMipLevel = 0,
.subresourceRange.levelCount = 1,
.subresourceRange.baseArrayLayer = 0,
.subresourceRange.layerCount = 1,
.flags = 0,
};

result = vkCreateImageView(device->vulkan.device, &view_create_info, NULL, &texture->vulkan.image_view);
assert(result == VK_SUCCESS);
}

kope_g5_texture *kope_vulkan_device_get_framebuffer(kope_g5_device *device) {
VkResult result = vulkan_AcquireNextImageKHR(device->vulkan.device, swapchain, UINT64_MAX, *get_next_framebuffer_available_semaphore(), VK_NULL_HANDLE,
Expand Down
91 changes: 0 additions & 91 deletions Backends/Graphics5/Vulkan/Sources/kope/vulkan/pipeline.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,97 +3,6 @@

#include <kinc/log.h>

static VkFormat convert_format(kope_g5_texture_format format) {
switch (format) {
case KOPE_G5_TEXTURE_FORMAT_R8_UNORM:
return VK_FORMAT_R8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_R8_SNORM:
return VK_FORMAT_R8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_R8_UINT:
return VK_FORMAT_R8_UINT;
case KOPE_G5_TEXTURE_FORMAT_R8_SINT:
return VK_FORMAT_R8_SINT;
case KOPE_G5_TEXTURE_FORMAT_R16_UINT:
return VK_FORMAT_R16_UINT;
case KOPE_G5_TEXTURE_FORMAT_R16_SINT:
return VK_FORMAT_R16_SINT;
case KOPE_G5_TEXTURE_FORMAT_R16_FLOAT:
return VK_FORMAT_R16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RG8_UNORM:
return VK_FORMAT_R8G8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_RG8_SNORM:
return VK_FORMAT_R8G8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_RG8_UINT:
return VK_FORMAT_R8G8_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG8_SINT:
return VK_FORMAT_R8G8_SINT;
case KOPE_G5_TEXTURE_FORMAT_R32_UINT:
return VK_FORMAT_R32_UINT;
case KOPE_G5_TEXTURE_FORMAT_R32_SINT:
return VK_FORMAT_R32_SINT;
case KOPE_G5_TEXTURE_FORMAT_R32_FLOAT:
return VK_FORMAT_R32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RG16_UINT:
return VK_FORMAT_R16G16_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG16_SINT:
return VK_FORMAT_R16G16_SINT;
case KOPE_G5_TEXTURE_FORMAT_RG16_FLOAT:
return VK_FORMAT_R16G16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UNORM:
return VK_FORMAT_R8G8B8A8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UNORM_SRGB:
return VK_FORMAT_R8G8B8A8_SRGB;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_SNORM:
return VK_FORMAT_R8G8B8A8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UINT:
return VK_FORMAT_R8G8B8A8_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_SINT:
return VK_FORMAT_R8G8B8A8_SINT;
case KOPE_G5_TEXTURE_FORMAT_BGRA8_UNORM:
return VK_FORMAT_B8G8R8A8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_BGRA8_UNORM_SRGB:
return VK_FORMAT_B8G8R8A8_SRGB;
case KOPE_G5_TEXTURE_FORMAT_RGB9E5U_FLOAT:
return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RGB10A2_UINT:
return VK_FORMAT_A2R10G10B10_UINT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RGB10A2_UNORM:
return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RG11B10U_FLOAT:
return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RG32_UINT:
return VK_FORMAT_R32G32_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG32_SINT:
return VK_FORMAT_R32G32_SINT;
case KOPE_G5_TEXTURE_FORMAT_RG32_FLOAT:
return VK_FORMAT_R32G32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_UINT:
return VK_FORMAT_R16G16B16A16_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_SINT:
return VK_FORMAT_R16G16B16A16_SINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_FLOAT:
VK_FORMAT_R16G16B16A16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_UINT:
return VK_FORMAT_R32G32B32A32_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_SINT:
return VK_FORMAT_R32G32B32A32_SINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_FLOAT:
return VK_FORMAT_R32G32B32A32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH16_UNORM:
return VK_FORMAT_D16_UNORM;
case KOPE_G5_TEXTURE_FORMAT_DEPTH24PLUS_NOTHING8:
return VK_FORMAT_X8_D24_UNORM_PACK32;
case KOPE_G5_TEXTURE_FORMAT_DEPTH24PLUS_STENCIL8:
return VK_FORMAT_D24_UNORM_S8_UINT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH32FLOAT:
return VK_FORMAT_D32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH32FLOAT_STENCIL8_NOTHING24:
return VK_FORMAT_D32_SFLOAT_S8_UINT;
}

return VK_FORMAT_R8G8B8A8_UNORM;
}

static uint32_t vertex_attribute_size(kope_vulkan_vertex_format format) {
switch (format) {
case KOPE_VULKAN_VERTEX_FORMAT_UINT8X2:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ extern "C" {
typedef struct kope_vulkan_texture {
uint32_t width;
uint32_t height;

VkDeviceMemory device_memory;
VkDeviceSize device_size;
VkDeviceSize row_pitch;

VkImage image;
VkImageView image_view;
} kope_vulkan_texture;
Expand Down
163 changes: 89 additions & 74 deletions Backends/Graphics5/Vulkan/Sources/kope/vulkan/vulkanunit.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,81 +4,96 @@

#include <assert.h>

#ifdef KINC_WINDOWS
static VkFormat convert_format(kope_g5_texture_format format) {
switch (format) {
case KOPE_G5_TEXTURE_FORMAT_R8_UNORM:
return VK_FORMAT_R8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_R8_SNORM:
return VK_FORMAT_R8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_R8_UINT:
return VK_FORMAT_R8_UINT;
case KOPE_G5_TEXTURE_FORMAT_R8_SINT:
return VK_FORMAT_R8_SINT;
case KOPE_G5_TEXTURE_FORMAT_R16_UINT:
return VK_FORMAT_R16_UINT;
case KOPE_G5_TEXTURE_FORMAT_R16_SINT:
return VK_FORMAT_R16_SINT;
case KOPE_G5_TEXTURE_FORMAT_R16_FLOAT:
return VK_FORMAT_R16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RG8_UNORM:
return VK_FORMAT_R8G8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_RG8_SNORM:
return VK_FORMAT_R8G8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_RG8_UINT:
return VK_FORMAT_R8G8_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG8_SINT:
return VK_FORMAT_R8G8_SINT;
case KOPE_G5_TEXTURE_FORMAT_R32_UINT:
return VK_FORMAT_R32_UINT;
case KOPE_G5_TEXTURE_FORMAT_R32_SINT:
return VK_FORMAT_R32_SINT;
case KOPE_G5_TEXTURE_FORMAT_R32_FLOAT:
return VK_FORMAT_R32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RG16_UINT:
return VK_FORMAT_R16G16_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG16_SINT:
return VK_FORMAT_R16G16_SINT;
case KOPE_G5_TEXTURE_FORMAT_RG16_FLOAT:
return VK_FORMAT_R16G16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UNORM:
return VK_FORMAT_R8G8B8A8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UNORM_SRGB:
return VK_FORMAT_R8G8B8A8_SRGB;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_SNORM:
return VK_FORMAT_R8G8B8A8_SNORM;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_UINT:
return VK_FORMAT_R8G8B8A8_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA8_SINT:
return VK_FORMAT_R8G8B8A8_SINT;
case KOPE_G5_TEXTURE_FORMAT_BGRA8_UNORM:
return VK_FORMAT_B8G8R8A8_UNORM;
case KOPE_G5_TEXTURE_FORMAT_BGRA8_UNORM_SRGB:
return VK_FORMAT_B8G8R8A8_SRGB;
case KOPE_G5_TEXTURE_FORMAT_RGB9E5U_FLOAT:
return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RGB10A2_UINT:
return VK_FORMAT_A2R10G10B10_UINT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RGB10A2_UNORM:
return VK_FORMAT_A2R10G10B10_UNORM_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RG11B10U_FLOAT:
return VK_FORMAT_B10G11R11_UFLOAT_PACK32;
case KOPE_G5_TEXTURE_FORMAT_RG32_UINT:
return VK_FORMAT_R32G32_UINT;
case KOPE_G5_TEXTURE_FORMAT_RG32_SINT:
return VK_FORMAT_R32G32_SINT;
case KOPE_G5_TEXTURE_FORMAT_RG32_FLOAT:
return VK_FORMAT_R32G32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_UINT:
return VK_FORMAT_R16G16B16A16_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_SINT:
return VK_FORMAT_R16G16B16A16_SINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA16_FLOAT:
VK_FORMAT_R16G16B16A16_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_UINT:
return VK_FORMAT_R32G32B32A32_UINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_SINT:
return VK_FORMAT_R32G32B32A32_SINT;
case KOPE_G5_TEXTURE_FORMAT_RGBA32_FLOAT:
return VK_FORMAT_R32G32B32A32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH16_UNORM:
return VK_FORMAT_D16_UNORM;
case KOPE_G5_TEXTURE_FORMAT_DEPTH24PLUS_NOTHING8:
return VK_FORMAT_X8_D24_UNORM_PACK32;
case KOPE_G5_TEXTURE_FORMAT_DEPTH24PLUS_STENCIL8:
return VK_FORMAT_D24_UNORM_S8_UINT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH32FLOAT:
return VK_FORMAT_D32_SFLOAT;
case KOPE_G5_TEXTURE_FORMAT_DEPTH32FLOAT_STENCIL8_NOTHING24:
return VK_FORMAT_D32_SFLOAT_S8_UINT;
}

// Windows 7
#define WINVER 0x0601
#define _WIN32_WINNT 0x0601

#define NOATOM
#define NOCLIPBOARD
#define NOCOLOR
#define NOCOMM
#define NOCTLMGR
#define NODEFERWINDOWPOS
#define NODRAWTEXT
#define NOGDI
#define NOGDICAPMASKS
#define NOHELP
#define NOICONS
#define NOKANJI
#define NOKEYSTATES
// #define NOMB
#define NOMCX
#define NOMEMMGR
#define NOMENUS
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NONLS
#define NOOPENFILE
#define NOPROFILER
#define NORASTEROPS
#define NOSCROLL
#define NOSERVICE
#define NOSHOWWINDOW
#define NOSOUND
#define NOSYSCOMMANDS
#define NOSYSMETRICS
#define NOTEXTMETRIC
// #define NOUSER
#define NOVIRTUALKEYCODES
#define NOWH
#define NOWINMESSAGES
#define NOWINOFFSETS
#define NOWINSTYLES
#define WIN32_LEAN_AND_MEAN

// avoids a warning in the Windows headers
#define MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS 0

#endif

#ifndef NDEBUG
#define VALIDATE
#endif

#include <vulkan/vulkan.h>

static PFN_vkGetPhysicalDeviceSurfaceSupportKHR vulkan_GetPhysicalDeviceSurfaceSupportKHR = NULL;
static PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vulkan_GetPhysicalDeviceSurfaceCapabilitiesKHR = NULL;
static PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vulkan_GetPhysicalDeviceSurfaceFormatsKHR = NULL;
static PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vulkan_GetPhysicalDeviceSurfacePresentModesKHR = NULL;
static PFN_vkCreateSwapchainKHR vulkan_CreateSwapchainKHR = NULL;
static PFN_vkDestroySwapchainKHR vulkan_DestroySwapchainKHR = NULL;
static PFN_vkGetSwapchainImagesKHR vulkan_GetSwapchainImagesKHR = NULL;
static PFN_vkDestroySurfaceKHR vulkan_DestroySurfaceKHR = NULL;

static PFN_vkCreateDebugUtilsMessengerEXT vulkan_CreateDebugUtilsMessengerEXT = NULL;
static PFN_vkDestroyDebugUtilsMessengerEXT vulkan_DestroyDebugUtilsMessengerEXT = NULL;

static PFN_vkAcquireNextImageKHR vulkan_AcquireNextImageKHR = NULL;
static PFN_vkQueuePresentKHR vulkan_QueuePresentKHR = NULL;

static PFN_vkDebugMarkerSetObjectNameEXT vulkan_DebugMarkerSetObjectNameEXT = NULL;
static PFN_vkCmdDebugMarkerBeginEXT vulkan_CmdDebugMarkerBeginEXT = NULL;
static PFN_vkCmdDebugMarkerEndEXT vulkan_CmdDebugMarkerEndEXT = NULL;
static PFN_vkCmdDebugMarkerInsertEXT vulkan_CmdDebugMarkerInsertEXT = NULL;
return VK_FORMAT_R8G8B8A8_UNORM;
}

#include "buffer.c"
#include "commandlist.c"
Expand Down
Loading

0 comments on commit d0dd195

Please sign in to comment.