浏览代码

map/unmap/find memory

Nicolas Cannasse 3 年之前
父节点
当前提交
d0787b1f34
共有 2 个文件被更改,包括 142 次插入100 次删除
  1. 119 97
      libs/sdl/sdl/Vulkan.hx
  2. 23 3
      libs/sdl/vulkan.c

+ 119 - 97
libs/sdl/sdl/Vulkan.hx

@@ -82,45 +82,45 @@ enum abstract VkStructureType(Int) {
 enum VkPipelineCreateFlags {
 	DISABLE_OPTIMIZATION;
 	ALLOW_DERIVATIVES;
-	DERIVATIVE_BIT;
-	VIEW_INDEX_FROM_DEVICE_INDEX_BIT;
-	DISPATCH_BASE_BIT;
-	DEFER_COMPILE_BIT_NV;
-	CAPTURE_STATISTICS_BIT_KHR;
-	CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR;
-	FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT;
-	EARLY_RETURN_ON_FAILURE_BIT_EXT;
-	LIBRARY_BIT_KHR;
-	RAY_TRACING_SKIP_TRIANGLES_BIT_KHR;
-	RAY_TRACING_SKIP_AABBS_BIT_KHR;
-	RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR;
-	RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR;
-	RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR;
-	RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR;
-	INDIRECT_BINDABLE_BIT_NV;
-	RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR;
+	DERIVATIVE;
+	VIEW_INDEX_FROM_DEVICE_INDEX;
+	DISPATCH_BASE;
+	DEFER_COMPILE_NV;
+	CAPTURE_STATISTICS_KHR;
+	CAPTURE_INTERNAL_REPRESENTATIONS_KHR;
+	FAIL_ON_PIPELINE_COMPILE_REQUIRED_EXT;
+	EARLY_RETURN_ON_FAILURE_EXT;
+	LIBRARY_KHR;
+	RAY_TRACING_SKIP_TRIANGLES_KHR;
+	RAY_TRACING_SKIP_AABBS_KHR;
+	RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_KHR;
+	RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_KHR;
+	RAY_TRACING_NO_NULL_MISS_SHADERS_KHR;
+	RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_KHR;
+	INDIRECT_BINDABLE_NV;
+	RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_KHR;
 }
 
 enum VkPipelineShaderStageCreateFlag {
-	ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT;
-	REQUIRE_FULL_SUBGROUPS_BIT_EXT;
+	ALLOW_VARYING_SUBGROUP_SIZE_EXT;
+	REQUIRE_FULL_SUBGROUPS_EXT;
 }
 
 enum VkShaderStageFlag {
-	VERTEX_BIT;
-	TESSELLATION_CONTROL_BIT;
-	TESSELLATION_EVALUATION_BIT;
-	GEOMETRY_BIT;
-	FRAGMENT_BIT;
-	COMPUTE_BIT;
-	TASK_BIT_NV;
-	MESH_BIT_NV;
-	RAYGEN_BIT_KHR;
-	ANY_HIT_BIT_KHR;
-	CLOSEST_HIT_BIT_KHR;
-	MISS_BIT_KHR;
-	INTERSECTION_BIT_KHR;
-	CALLABLE_BIT_KHR;
+	VERTEX;
+	TESSELLATION_CONTROL;
+	TESSELLATION_EVALUATION;
+	GEOMETRY;
+	FRAGMENT;
+	COMPUTE;
+	TASK_NV;
+	MESH_NV;
+	RAYGEN_KHR;
+	ANY_HIT_KHR;
+	CLOSEST_HIT_KHR;
+	MISS_KHR;
+	INTERSECTION_KHR;
+	CALLABLE_KHR;
 	//ALL_GRAPHICS = 0x0000001F,
 	//ALL = 0x7FFFFFFF,
 }
@@ -843,7 +843,7 @@ enum abstract VkDescriptorType(Int) {
 }
 
 enum VkAttachmentDescriptionFlag {
-	MAY_ALIAS_BIT;
+	MAY_ALIAS;
 }
 
 enum abstract VkAttachmentLoadOp(Int) {
@@ -872,10 +872,10 @@ enum abstract VkAttachmentStoreOp(Int) {
 }
 
 enum VkSubpassDescriptionFlag {
-	PER_VIEW_ATTRIBUTES_BIT_NVX;
-	PER_VIEW_POSITION_X_ONLY_BIT_NVX;
-	FRAGMENT_REGION_BIT_QCOM;
-	SHADER_RESOLVE_BIT_QCOM;
+	PER_VIEW_ATTRIBUTES_NVX;
+	PER_VIEW_POSITION_X_ONLY_NVX;
+	FRAGMENT_REGION_QCOM;
+	SHADER_RESOLVE_QCOM;
 }
 
 enum abstract VkPipelineBindPoint(Int) {
@@ -929,69 +929,69 @@ enum abstract VkImageLayout(Int) {
 }
 
 enum VkPipelineStageFlag {
-	TOP_OF_PIPE_BIT;
-	DRAW_INDIRECT_BIT;
-	VERTEX_INPUT_BIT;
-	VERTEX_SHADER_BIT;
-	TESSELLATION_CONTROL_SHADER_BIT;
-	TESSELLATION_EVALUATION_SHADER_BIT;
-	GEOMETRY_SHADER_BIT;
-	FRAGMENT_SHADER_BIT;
-	EARLY_FRAGMENT_TESTS_BIT;
-	LATE_FRAGMENT_TESTS_BIT;
-	COLOR_ATTACHMENT_OUTPUT_BIT;
-	COMPUTE_SHADER_BIT;
-	TRANSFER_BIT;
-	BOTTOM_OF_PIPE_BIT;
-	HOST_BIT;
-	ALL_GRAPHICS_BIT;
-	ALL_COMMANDS_BIT;
-	COMMAND_PREPROCESS_BIT_NV;
-	CONDITIONAL_RENDERING_BIT_EXT;
-	TASK_SHADER_BIT_NV;
-	MESH_SHADER_BIT_NV;
-	RAY_TRACING_SHADER_BIT_KHR;
-	SHADING_RATE_IMAGE_BIT_NV;
-	FRAGMENT_DENSITY_PROCESS_BIT_EXT;
-	TRANSFORM_FEEDBACK_BIT_EXT;
-	ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
+	TOP_OF_PIPE;
+	DRAW_INDIRECT;
+	VERTEX_INPUT;
+	VERTEX_SHADER;
+	TESSELLATION_CONTROL_SHADER;
+	TESSELLATION_EVALUATION_SHADER;
+	GEOMETRY_SHADER;
+	FRAGMENT_SHADER;
+	EARLY_FRAGMENT_TESTS;
+	LATE_FRAGMENT_TESTS;
+	COLOR_ATTACHMENT_OUTPUT;
+	COMPUTE_SHADER;
+	TRANSFER;
+	BOTTOM_OF_PIPE;
+	HOST;
+	ALL_GRAPHICS;
+	ALL_COMMANDS;
+	COMMAND_PREPROCESS_NV;
+	CONDITIONAL_RENDERING_EXT;
+	TASK_SHADER_NV;
+	MESH_SHADER_NV;
+	RAY_TRACING_SHADER_KHR;
+	SHADING_RATE_IMAGE_NV;
+	FRAGMENT_DENSITY_PROCESS_EXT;
+	TRANSFORM_FEEDBACK_EXT;
+	ACCELERATION_STRUCTURE_BUILD_KHR;
 }
 
 enum VkAccessFlag {
-	INDIRECT_COMMAND_READ_BIT;
-	INDEX_READ_BIT;
-	VERTEX_ATTRIBUTE_READ_BIT;
-	UNIFORM_READ_BIT;
-	INPUT_ATTACHMENT_READ_BIT;
-	SHADER_READ_BIT;
-	SHADER_WRITE_BIT;
-	COLOR_ATTACHMENT_READ_BIT;
-	COLOR_ATTACHMENT_WRITE_BIT;
-	DEPTH_STENCIL_ATTACHMENT_READ_BIT;
-	DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
-	TRANSFER_READ_BIT;
-	TRANSFER_WRITE_BIT;
-	HOST_READ_BIT;
-	HOST_WRITE_BIT;
-	MEMORY_READ_BIT;
-	MEMORY_WRITE_BIT;
-	COMMAND_PREPROCESS_READ_BIT_NV;
-	COMMAND_PREPROCESS_WRITE_BIT_NV;
-	COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT;
-	CONDITIONAL_RENDERING_READ_BIT_EXT;
-	ACCELERATION_STRUCTURE_READ_BIT_KHR;
-	ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
-	SHADING_RATE_IMAGE_READ_BIT_NV;
-	FRAGMENT_DENSITY_MAP_READ_BIT_EXT;
-	TRANSFORM_FEEDBACK_WRITE_BIT_EXT;
-	TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT;
-	TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT;
+	INDIRECT_COMMAND_READ;
+	INDEX_READ;
+	VERTEX_ATTRIBUTE_READ;
+	UNIFORM_READ;
+	INPUT_ATTACHMENT_READ;
+	SHADER_READ;
+	SHADER_WRITE;
+	COLOR_ATTACHMENT_READ;
+	COLOR_ATTACHMENT_WRITE;
+	DEPTH_STENCIL_ATTACHMENT_READ;
+	DEPTH_STENCIL_ATTACHMENT_WRITE;
+	TRANSFER_READ;
+	TRANSFER_WRITE;
+	HOST_READ;
+	HOST_WRITE;
+	MEMORY_READ;
+	MEMORY_WRITE;
+	COMMAND_PREPROCESS_READ_NV;
+	COMMAND_PREPROCESS_WRITE_NV;
+	COLOR_ATTACHMENT_READ_NONCOHERENT_EXT;
+	CONDITIONAL_RENDERING_READ_EXT;
+	ACCELERATION_STRUCTURE_READ_KHR;
+	ACCELERATION_STRUCTURE_WRITE_KHR;
+	SHADING_RATE_IMAGE_READ_NV;
+	FRAGMENT_DENSITY_MAP_READ_EXT;
+	TRANSFORM_FEEDBACK_WRITE_EXT;
+	TRANSFORM_FEEDBACK_COUNTER_READ_EXT;
+	TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT;
 }
 
 enum VkDependencyFlag {
-	BY_REGION_BIT;
-	VIEW_LOCAL_BIT;
-	DEVICE_GROUP_BIT;
+	BY_REGION;
+	VIEW_LOCAL;
+	DEVICE_GROUP;
 }
 
 @:struct class VkSubpassDependency {
@@ -1097,8 +1097,8 @@ enum VkFramebufferCreateFlag {
 }
 
 enum VkImageViewCreateFlag {
-	FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT;
-	FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT;
+	FRAGMENT_DENSITY_MAP_DYNAMIC_EXT;
+	FRAGMENT_DENSITY_MAP_DEFERRED_EXT;
 }
 
 enum abstract VkImageViewType(Int) {
@@ -1218,6 +1218,17 @@ enum abstract VkSharingMode(Int) {
 	}
 }
 
+enum VkMemoryPropertyFlag {
+    DEVICE_LOCAL;
+    HOST_VISIBLE;
+    HOST_COHERENT;
+    HOST_CACHED;
+	LAZILY_ALLOCATED;
+	PROTECTED;
+	DEVICE_COHERENT_AMD;
+	DEVICE_UNCACHED_AMD;
+}
+
 @:hlNative("?sdl","vk_img_")
 abstract VkImage(hl.Abstract<"vk_image">) {}
 
@@ -1291,6 +1302,17 @@ abstract VkContext(hl.Abstract<"vk_context">) {
 		return false;
 	}
 
+	public function findMemoryType( allowed : Int, required : haxe.EnumFlags<VkMemoryPropertyFlag> ) : Int {
+		return 0;
+	}
+
+	public function mapMemory( mem : VkDeviceMemory, offset : Int, size : Int, flags : Int ) : hl.Bytes {
+		return null;
+	}
+
+	public function unmapMemory( mem : VkDeviceMemory ) {
+	}
+
 }
 
 enum abstract ShaderKind(Int) {

+ 23 - 3
libs/sdl/vulkan.c

@@ -69,6 +69,7 @@ typedef struct {
 typedef struct _VkContext {
 	VkSurfaceKHR surface;
 	VkPhysicalDevice pdevice;
+	VkPhysicalDeviceMemoryProperties memProps;
 	VkDevice device;
 	VkQueue queue;
 	int queueFamily;
@@ -97,7 +98,6 @@ void *vk_init_context( VkSurfaceKHR surface ) {
 	VkQueueFamilyProperties queueFamilyProperties[MAX_QUEUE_COUNT];
 	VkPhysicalDeviceProperties deviceProperties;
 	VkPhysicalDeviceFeatures deviceFeatures;
-	VkPhysicalDeviceMemoryProperties deviceMemoryProperties;
 
 	vkEnumeratePhysicalDevices(instance, &physicalDeviceCount, 0);
 	physicalDeviceCount = physicalDeviceCount > MAX_DEVICE_COUNT ? MAX_DEVICE_COUNT : physicalDeviceCount;
@@ -110,7 +110,6 @@ void *vk_init_context( VkSurfaceKHR surface ) {
 		vkGetPhysicalDeviceQueueFamilyProperties(deviceHandles[i], &queueFamilyCount, queueFamilyProperties);
 		vkGetPhysicalDeviceProperties(deviceHandles[i], &deviceProperties);
 		vkGetPhysicalDeviceFeatures(deviceHandles[i], &deviceFeatures);
-		vkGetPhysicalDeviceMemoryProperties(deviceHandles[i], &deviceMemoryProperties);
 		for(int j=0; j<queueFamilyCount; j++) {
 			VkBool32 supportsPresent = VK_FALSE;
 			vkGetPhysicalDeviceSurfaceSupportKHR(deviceHandles[i], j, ctx->surface, &supportsPresent);
@@ -145,6 +144,7 @@ void *vk_init_context( VkSurfaceKHR surface ) {
 		return NULL;
 
 	vkGetDeviceQueue(ctx->device, ctx->queueFamily, 0, &ctx->queue);
+	vkGetPhysicalDeviceMemoryProperties(ctx->pdevice, &ctx->memProps);
 
 	VkCommandPoolCreateInfo poolInf = {
 		.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
@@ -177,7 +177,14 @@ void *vk_init_context( VkSurfaceKHR surface ) {
 	return ctx;
 }
 
-
+int HL_NAME(vk_find_memory_type)( VkContext ctx, int allowed, int req ) {
+	unsigned int i;
+    for(i=0;i<ctx->memProps.memoryTypeCount;i++) {
+		if( (allowed & (1<< i)) && (ctx->memProps.memoryTypes[i].propertyFlags & req) == req )
+			return i;
+    }
+    return -1;
+}
 
 bool HL_NAME(vk_init_swapchain)( VkContext ctx, int width, int height ) {
 
@@ -410,6 +417,16 @@ VkDeviceMemory HL_NAME(vk_allocate_memory)( VkContext ctx, VkMemoryAllocateInfo
 	return m;
 }
 
+vbyte *HL_NAME(vk_map_memory)( VkContext ctx, VkDeviceMemory mem, int offset, int size, int flags ) {
+	void *ptr = NULL;
+	vkMapMemory(ctx->device, mem, offset, size, flags, &ptr);
+	return ptr;
+}
+
+void HL_NAME(vk_unmap_memory)( VkContext ctx, VkDeviceMemory mem ) {
+	vkUnmapMemory(ctx->device, mem);
+}
+
 bool HL_NAME(vk_bind_buffer_memory)( VkContext ctx, VkBuffer buf, VkDeviceMemory mem, int offset ) {
 	return vkBindBufferMemory(ctx->device, buf, mem, offset) == VK_SUCCESS;
 }
@@ -444,6 +461,7 @@ 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(_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 );
 DEFINE_PRIM(_GPIPELINE, vk_create_graphics_pipeline, _VCTX _STRUCT);
 DEFINE_PRIM(_PIPELAYOUT, vk_create_pipeline_layout, _VCTX _STRUCT);
@@ -454,6 +472,8 @@ DEFINE_PRIM(_DESCRIPTOR_SET, vk_create_descriptor_set_layout, _VCTX _STRUCT);
 DEFINE_PRIM(_BUFFER, vk_create_buffer, _VCTX _STRUCT);
 DEFINE_PRIM(_VOID, vk_get_buffer_memory_requirements, _VCTX _BUFFER _STRUCT);
 DEFINE_PRIM(_MEMORY, vk_allocate_memory, _VCTX _STRUCT);
+DEFINE_PRIM(_BYTES, vk_map_memory, _VCTX _MEMORY _I32 _I32 _I32);
+DEFINE_PRIM(_VOID, vk_unmap_memory, _VCTX _MEMORY);
 DEFINE_PRIM(_BOOL, vk_bind_buffer_memory, _VCTX _BUFFER _MEMORY _I32);
 DEFINE_PRIM(_IMAGE, vk_get_current_image, _VCTX);
 DEFINE_PRIM(_I32, vk_get_current_image_format, _VCTX);