2
0
Nicolas Cannasse 3 жил өмнө
parent
commit
f03742946a
2 өөрчлөгдсөн 104 нэмэгдсэн , 72 устгасан
  1. 82 9
      libs/sdl/sdl/Vulkan.hx
  2. 22 63
      libs/sdl/vulkan.c

+ 82 - 9
libs/sdl/sdl/Vulkan.hx

@@ -995,13 +995,13 @@ enum VkDependencyFlag {
 }
 
 @:struct class VkSubpassDependency {
-	var srcSubpass : Int;
-	var dstSubpass : Int;
-	var srcStageMask : haxe.EnumFlags<VkPipelineStageFlag>;
-	var dstStageMask : haxe.EnumFlags<VkPipelineStageFlag>;
-	var srcAccessMask : haxe.EnumFlags<VkAccessFlag>;
-	var dstAccessMask : haxe.EnumFlags<VkAccessFlag>;
-	var dependencyFlags : haxe.EnumFlags<VkDependencyFlag>;
+	public var srcSubpass : Int;
+	public var dstSubpass : Int;
+	public var srcStageMask : haxe.EnumFlags<VkPipelineStageFlag>;
+	public var dstStageMask : haxe.EnumFlags<VkPipelineStageFlag>;
+	public var srcAccessMask : haxe.EnumFlags<VkAccessFlag>;
+	public var dstAccessMask : haxe.EnumFlags<VkAccessFlag>;
+	public var dependencyFlags : haxe.EnumFlags<VkDependencyFlag>;
 	public function new() {}
 }
 
@@ -1326,13 +1326,82 @@ enum abstract ShaderKind(Int) {
 	var Fragment = 1;
 }
 
+@:struct class VkClearColorValue {
+	public var r : Single;
+	public var g : Single;
+	public var b : Single;
+	public var a : Single;
+	public var v1 : Int;
+	public var v2 : Int;
+	public var v3 : Int;
+	public var v4 : Int;
+	public var u1 : Int;
+	public var u2 : Int;
+	public var u3 : Int;
+	public var u4 : Int;
+	public function new() {
+	}
+}
+
+@:struct class VkClearDepthStencilValue {
+	public var depth : Single;
+	public var stencil : Int;
+	public function new() {
+	}
+}
+
+@:struct class VkImageSubResourceRange {
+	public var aspectMask : haxe.EnumFlags<VkImageAspectFlag>;
+	public var baseMipLevel : Int;
+	public var levelCount : Int;
+	public var baseArrayLayer : Int;
+	public var layerCount : Int;
+	public function new() {
+	}
+}
+
+@:struct class VkClearAttachment {
+	public var aspectMask : haxe.EnumFlags<VkImageAspectFlag>;
+    public var colorAttachment : Int;
+	public var r : Single;
+	public var g : Single;
+	public var b : Single;
+	public var a : Single;
+	public var v1 : Int;
+	public var v2 : Int;
+	public var v3 : Int;
+	public var v4 : Int;
+	public var u1 : Int;
+	public var u2 : Int;
+	public var u3 : Int;
+	public var u4 : Int;
+	public var depth : Single;
+	public var stencil : Int;
+	public function new() {
+	}
+}
+
+@:struct class VkClearRect {
+	public var offsetX : Int;
+	public var offsetY : Int;
+	public var extendX : Int;
+	public var extendY : Int;
+	public var baseArrayLayer : Int;
+	public var layerCount : Int;
+	public function new() {
+	}
+}
+
 @:hlNative("?sdl","vk_")
 abstract VkCommandBuffer(hl.Abstract<"vk_command_buffer">) {
 
-	public function clearColorImage( img : VkImage, r : Float, g : Float, b : Float, a : Float ) {
+	public function clearColorImage( img : VkImage, layout : VkImageLayout, colors : ArrayStruct<VkClearColorValue>, colorCount : Int, range : VkImageSubResourceRange ) {
 	}
 
-	public function clearDepthStencilImage( img : VkImage, depth : Float, stencil : Int ) {
+	public function clearDepthStencilImage( img : VkImage, layout : VkImageLayout, values : ArrayStruct<VkClearDepthStencilValue>, valuesCount : Int, range : VkImageSubResourceRange ) {
+	}
+
+	public function clearAttachments( attachCount : Int, attachs : ArrayStruct<VkClearAttachment>, rectCount : Int, rects : ArrayStruct<VkClearRect> ) {
 	}
 
 	public function drawIndexed( indexCount : Int, instanceCount : Int, firstIndex : Int, vertexOffset : Int, firstInstance : Int ) {
@@ -1375,6 +1444,10 @@ class Vulkan {
 		return null;
 	}
 
+	public static function makeRef<T>( arr : T ) : ArrayStruct<T> {
+		return null;
+	}
+
 	public static function makeArray<T>( arr : hl.NativeArray<T> ) : ArrayStruct<T> {
 		return null;
 	}

+ 22 - 63
libs/sdl/vulkan.c

@@ -38,6 +38,11 @@ HL_PRIM bool HL_NAME(vk_init)( bool enable_validation ) {
 	return true;
 }
 
+vbyte *HL_NAME(vk_make_ref)( vdynamic *v ) {
+	if( v->t->kind != HSTRUCT ) hl_error("assert");
+	return v->v.ptr;
+}
+
 vbyte *HL_NAME(vk_make_array)( varray *a ) {
 	if( a->size == 0 )
 		return NULL;
@@ -62,6 +67,7 @@ vbyte *HL_NAME(vk_make_array)( varray *a ) {
 typedef struct {
 	VkCommandBuffer buffer;
 	VkFence fence;
+	VkFence wait;
 	VkSemaphore imageAvailable;
 	VkSemaphore renderFinished;
 } VkFrame;
@@ -78,6 +84,7 @@ typedef struct _VkContext {
 	int swapchainImageCount;
 	VkFormat imageFormat;
 	VkImage swapchainImages[MAX_SWAPCHAIN_IMAGES];
+	VkFence imagesFences[MAX_SWAPCHAIN_IMAGES];
 
 	unsigned int currentFrame;
 	unsigned int currentImage;
@@ -213,17 +220,6 @@ bool HL_NAME(vk_init_swapchain)( VkContext ctx, int width, int height ) {
 	VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR;   // always supported.
 	ctx->swapchainImageCount = 2;
 
-	// using MAILBOX will be same as no vsync
-	/*
-	for(int i=0; i<modeCount; i++) {
-		if( modes[i] == VK_PRESENT_MODE_MAILBOX_KHR ) {
-			presentMode = VK_PRESENT_MODE_MAILBOX_KHR;
-			ctx->swapchainImageCount = 3;
-			break;
-		}
-	}
-	*/
-
 	VkSurfaceCapabilitiesKHR scaps;
 	vkGetPhysicalDeviceSurfaceCapabilitiesKHR(ctx->pdevice, ctx->surface, &scaps);
 
@@ -260,14 +256,6 @@ bool HL_NAME(vk_init_swapchain)( VkContext ctx, int width, int height ) {
 	return true;
 }
 
-const VkImageSubresourceRange RANGE_ALL = {
-	.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-	.baseMipLevel = 0,
-	.levelCount = VK_REMAINING_MIP_LEVELS,
-	.baseArrayLayer = 0,
-	.layerCount = VK_REMAINING_ARRAY_LAYERS,
-};
-
 HL_PRIM bool HL_NAME(vk_begin_frame)( VkContext ctx ) {
 	VkFrame *frame = &ctx->frames[ctx->currentFrame];
 	VkCommandBuffer buffer = frame->buffer;
@@ -277,6 +265,9 @@ HL_PRIM bool HL_NAME(vk_begin_frame)( VkContext ctx ) {
 	if( vkAcquireNextImageKHR(ctx->device, ctx->swapchain, UINT64_MAX, frame->imageAvailable, VK_NULL_HANDLE, &ctx->currentImage) != VK_SUCCESS )
 		return false;
 
+	if( ctx->imagesFences[ctx->currentImage] )
+		vkWaitForFences(ctx->device, 1, &ctx->imagesFences[ctx->currentImage], VK_TRUE, UINT64_MAX);
+	ctx->imagesFences[ctx->currentImage] = frame->fence;
 	vkResetFences(ctx->device, 1, &frame->fence);
 
 	VkCommandBufferBeginInfo beginInfo = {
@@ -285,45 +276,11 @@ HL_PRIM bool HL_NAME(vk_begin_frame)( VkContext ctx ) {
 	};
 	vkBeginCommandBuffer(buffer, &beginInfo);
 
-	VkImageMemoryBarrier barrier = {
-		.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
-		  .srcAccessMask = 0,
-			.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-			.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED,
-			.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-			.srcQueueFamilyIndex = ctx->queueFamily,
-			.dstQueueFamilyIndex = ctx->queueFamily,
-			.image = ctx->swapchainImages[ctx->currentImage],
-			.subresourceRange = RANGE_ALL,
-	};
-	vkCmdPipelineBarrier(buffer,
-		VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
-		0, 0, NULL, 0, NULL, 1, &barrier
-	);
-
 	return true;
 }
 
 HL_PRIM void HL_NAME(vk_end_frame)( VkContext ctx ) {
 	VkFrame *frame = &ctx->frames[ctx->currentFrame];
-
-	VkImageMemoryBarrier barrier2 = {
-		.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
-		.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT,
-		.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT,
-		.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
-		.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
-		.srcQueueFamilyIndex = ctx->queueFamily,
-		.dstQueueFamilyIndex = ctx->queueFamily,
-		.image = ctx->swapchainImages[ctx->currentImage],
-		.subresourceRange = RANGE_ALL,
-	};
-	vkCmdPipelineBarrier(frame->buffer,
-		VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
-		0, 0, NULL, 0, NULL, 1,
-		&barrier2
-	);
-
 	vkEndCommandBuffer(frame->buffer);
 
 	VkSubmitInfo submitInfo = {
@@ -350,8 +307,6 @@ HL_PRIM void HL_NAME(vk_end_frame)( VkContext ctx ) {
 
 	ctx->currentFrame++;
 	ctx->currentFrame %= FRAME_COUNT;
-	ctx->currentImage++;
-	ctx->currentImage %= ctx->swapchainImageCount;
 }
 
 VkShaderModule HL_NAME(vk_create_shader_module)( VkContext ctx, vbyte *data, int len ) {
@@ -460,6 +415,7 @@ DEFINE_PRIM(_BOOL, vk_init, _BOOL);
 DEFINE_PRIM(_BOOL, vk_init_swapchain, _VCTX _I32 _I32);
 DEFINE_PRIM(_BOOL, vk_begin_frame, _VCTX);
 DEFINE_PRIM(_BYTES, vk_make_array, _ARR);
+DEFINE_PRIM(_BYTES, vk_make_ref, _DYN);
 DEFINE_PRIM(_VOID, vk_end_frame, _VCTX);
 DEFINE_PRIM(_I32, vk_find_memory_type, _VCTX _I32 _I32);
 DEFINE_PRIM(_SHADER_MODULE, vk_create_shader_module, _VCTX _BYTES _I32 );
@@ -481,14 +437,16 @@ DEFINE_PRIM(_CMD, vk_get_current_command_buffer, _VCTX);
 
 // ------ COMMAND BUFFER OPERATIONS -----------------------
 
-HL_PRIM void HL_NAME(vk_clear_color_image)( VkCommandBuffer out, VkImage img, double r, double g, double b, double a ) {
-	VkClearColorValue color = { (float)r, (float)g, (float)b, (float)a };
-	vkCmdClearColorImage(out, img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &color, 1, &RANGE_ALL);
+HL_PRIM void HL_NAME(vk_clear_color_image)( VkCommandBuffer out, VkImage img, VkImageLayout layout, VkClearColorValue *colors, int count, VkImageSubresourceRange *range) {
+	vkCmdClearColorImage(out, img, layout, colors, count, range);
+}
+
+HL_PRIM void HL_NAME(vk_clear_attachments)( VkCommandBuffer out, int count, VkClearAttachment *attachs, int rectCount, VkClearRect *rects ) {
+	vkCmdClearAttachments(out, count, attachs, rectCount, rects);
 }
 
-HL_PRIM void HL_NAME(vk_clear_depth_stencil_image)( VkCommandBuffer out, VkImage img, double d, int stencil ) {
-	VkClearDepthStencilValue ds = { (float)d, (uint32_t)stencil };
-	vkCmdClearDepthStencilImage(out, img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &ds, 1, &RANGE_ALL);
+HL_PRIM void HL_NAME(vk_clear_depth_stencil_image)( VkCommandBuffer out, VkImage img, VkImageLayout layout, VkClearDepthStencilValue *values, int count, VkImageSubresourceRange *range) {
+	vkCmdClearDepthStencilImage(out, img, layout, values, count, range);
 }
 
 HL_PRIM void HL_NAME(vk_draw_indexed)( VkCommandBuffer out, int indexCount, int instanceCount, int firstIndex, int vertexOffset, int firstInstance ) {
@@ -515,8 +473,9 @@ HL_PRIM void HL_NAME(vk_end_render_pass)( VkCommandBuffer out ) {
 	vkCmdEndRenderPass(out);
 }
 
-DEFINE_PRIM(_VOID, vk_clear_color_image, _CMD _IMAGE _F64 _F64 _F64 _F64);
-DEFINE_PRIM(_VOID, vk_clear_depth_stencil_image, _CMD _IMAGE _F64 _I32);
+DEFINE_PRIM(_VOID, vk_clear_color_image, _CMD _IMAGE _I32 _BYTES _I32 _STRUCT);
+DEFINE_PRIM(_VOID, vk_clear_depth_stencil_image, _CMD _IMAGE _I32 _BYTES _I32 _STRUCT);
+DEFINE_PRIM(_VOID, vk_clear_attachments, _CMD _I32 _BYTES _I32 _BYTES);
 DEFINE_PRIM(_VOID, vk_draw_indexed, _CMD _I32 _I32 _I32 _I32 _I32);
 DEFINE_PRIM(_VOID, vk_bind_pipeline, _CMD _I32 _GPIPELINE);
 DEFINE_PRIM(_VOID, vk_begin_render_pass, _CMD _STRUCT _I32);