diff --git a/vulkan.d b/vulkan.d index db07a71..cc74be9 100644 --- a/vulkan.d +++ b/vulkan.d @@ -8,26 +8,6 @@ import core.stdc.stdio : Printf = printf; import std.format : sformat; import std.math.rounding : Ceil = ceil; -alias i8 = byte; -alias i16 = short; -alias i32 = int; -alias i64 = long; - -alias u8 = ubyte; -alias u16 = ushort; -alias u32 = uint; -alias u64 = ulong; - -alias f32 = float; -alias f64 = double; - -alias b32 = uint; - -alias intptr = intptr_t; -alias uintptr = uintptr_t; - -alias usize = size_t; - alias InitRenderer = Init; alias Renderer = Vulkan; alias Shader = VkShaderModule; @@ -59,6 +39,12 @@ version(linux) "libvulkan.so.1", "libvulkan.so", ]; + + struct PlatformHandles + { + xcb_connection_t *conn; + xcb_window_t window; + } } version(Windows) @@ -66,6 +52,12 @@ version(Windows) const string[] VULKAN_LIBS = [ "vulkan-1.dll", ]; + + struct PlatformHandles + { + HINSTANCE hinstance; + HWND hwnd; + } } const char*[] VK_INSTANCE_LAYERS = []; @@ -292,7 +284,7 @@ struct Vulkan SLList!(SI) cleanup_list; - PlatformWindow* window; + PlatformHandles platform_handles; VkDebugUtilsMessengerEXT dbg_msg; VkInstance instance; @@ -383,7 +375,7 @@ struct QueueInfo } Vulkan -Init(PlatformWindow* window, u64 permanent_mem, u64 frame_mem) +Init(PlatformHandles platform_handles, u64 permanent_mem, u64 frame_mem) { bool success = true; @@ -393,7 +385,7 @@ Init(PlatformWindow* window, u64 permanent_mem, u64 frame_mem) CreateArena(frame_mem), CreateArena(frame_mem), ], - window: window, + platform_handles: platform_handles, }; Push(&vk, SI.Renderer); @@ -608,12 +600,6 @@ CreateBuffer(Vulkan* vk, Buffer* buf, BufferType type, u64 size, bool host_visib buf.dynamic = dynamic; } -void -UpdateIndexBuffer(Vulkan* vk, Model* model) -{ - assert(Transfer(vk, &model.index_buffer, model.indices), "UpdateIndexBuffer failure"); -} - void InitBuffers(Vulkan* vk) { @@ -664,18 +650,6 @@ CurrentImage(Vulkan* vk) return vk.present_images[vk.image_index].image; } -UIVertex[] -GetUIVertexBuffer(Vulkan* vk) -{ - return vk.ui_vert_buf.data; -} - -u32[] -GetUIIndexBuffer(Vulkan* vk) -{ - return vk.ui_index_buf.data; -} - void BeginFrame(Vulkan* vk) { @@ -763,10 +737,13 @@ ResizeDrawImageIfNeeded(Vulkan* vk, ImageView* view) } } -pragma(inline): UVec2 +pragma(inline): u32[2] GetExtent(Vulkan* vk) { - return UVec2(vk.swapchain_extent.width, vk.swapchain_extent.height); + u32[2] extent; + extent[0] = vk.swapchain_extent.width; + extent[1] = vk.swapchain_extent.height; + return extent; } pragma(inline): f32 @@ -1907,7 +1884,7 @@ CreateComputePipeline(Vulkan* vk, CompPipelineInfo* comp_info) } void -ClearColor(Vulkan* vk, ImageView* view, Vec4 color) +ClearColor(Vulkan* vk, ImageView* view, f32[4] color) { VkImageSubresourceRange clear_range = { aspectMask: (view.depth_image ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT), @@ -1919,7 +1896,7 @@ ClearColor(Vulkan* vk, ImageView* view, Vec4 color) vk.cmds[vk.frame_index], view.image, view.layout, - cast(VkClearColorValue*)color.v, + cast(VkClearColorValue*)color, 1, &clear_range ); @@ -3200,8 +3177,8 @@ version(linux) { VkXcbSurfaceCreateInfoKHR surface_info = { sType: VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR, - connection: vk.window.conn, - window: vk.window.window, + connection: vk.platform_handles.conn, + window: vk.platform_handles.window, }; VkResult result = vkCreateXcbSurfaceKHR(vk.instance, &surface_info, null, &vk.surface); @@ -3211,8 +3188,8 @@ version(Windows) { VkWin32SurfaceCreateInfoKHR surface_info = { sType: VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR, - hinstance: vk.window.instance, - hwnd: vk.window.handle, + hinstance: vk.platform_handles.instance, + hwnd: vk.platform_handles.handle, }; VkResult result = vkCreateWin32SurfaceKHR(vk.instance, &surface_info, null, &vk.surface); diff --git a/vulkan_util.d b/vulkan_util.d index f89546b..4724bbc 100644 --- a/vulkan_util.d +++ b/vulkan_util.d @@ -1,5 +1,25 @@ import core.stdc.stdio : Printf = printf; +alias i8 = byte; +alias i16 = short; +alias i32 = int; +alias i64 = long; + +alias u8 = ubyte; +alias u16 = ushort; +alias u32 = uint; +alias u64 = ulong; + +alias f32 = float; +alias f64 = double; + +alias b32 = uint; + +alias intptr = intptr_t; +alias uintptr = uintptr_t; + +alias usize = size_t; + version(linux) { import core.sys.posix.sys.mman; @@ -18,6 +38,40 @@ MemFree(void* ptr, u64 size) } +struct Node(T) +{ + Node!(T)* next; + T value; +} + +struct SLList(T) +{ + Node!(T)* first; + Node!(T)* last; +} + +pragma(inline): void +Push(T)(SLList!(T)*list, Node!(T)* node, Node!(T)* nil) +{ + if (CheckNil(nil, list.first)) + { + list.first = list.last = node; + node.next = nil; + } + else + { + list.last.next = node; + list.last = node; + node.next = nil; + } +} + +pragma(inline): bool +CheckNil(T)(Node!(T)* nil, Node!(T)* node) +{ + return node == null || node == nil; +} + struct Arena { u8* mem;