Engine icon indicating copy to clipboard operation
Engine copied to clipboard

VK renderer backend causes NPE

Open xtexChooser opened this issue 2 years ago • 6 comments

Log:

[20:01:07] [Engine/main] [INFO]: Initializing engine!
[20:01:07] [Engine/main] [INFO]: ----- System Information -----
[20:01:07] [Engine/main] [INFO]: 	Engine Version: 0.3.1-alpha
[20:01:07] [Engine/main] [INFO]: 	Engine Side: CLIENT
[20:01:07] [Engine/main] [INFO]: 	Runtime Environment: DEPLOYMENT
[20:01:07] [Engine/main] [INFO]: 	Operating System: Windows 10 (amd64) version 10.0
[20:01:07] [Engine/main] [INFO]: 	Java Version: 17.0.1 (17.0.1+12), Eclipse Adoptium
[20:01:07] [Engine/main] [INFO]: 	JVM Information: OpenJDK 64-Bit Server VM (mixed mode, sharing), Eclipse Adoptium
[20:01:07] [Engine/main] [INFO]: 	Max Heap Memory: 2130706432 bytes (2032 MB)
[20:01:07] [Engine/main] [INFO]: 	JVM Flags (1 totals): --add-opens=java.base/java.lang=ALL-UNNAMED
[20:01:07] [Engine/main] [INFO]: ------------------------------
[20:01:07] [Engine/main] [INFO]: Initializing client engine!
[20:01:07] [Engine/main] [INFO]: Initializing asset!
[20:01:07] [Engine/main] [INFO]: Initializing graphics!
[20:01:07] [Graphics/main] [INFO]: Graphics debug enable!
[20:01:07] [Graphics/main] [INFO]: Graphics backend: vulkan
[20:01:07] [Graphics/main] [INFO]: Initializing GLFW context!
[20:01:07] [Graphics/main] [INFO]: Initializing Vulkan instance!
[20:01:07] [Graphics/main] [INFO]: ----- Vulkan Information -----
[20:01:07] [Graphics/main] [INFO]: 	VK_VENDOR: NVIDIA
[20:01:07] [Graphics/main] [INFO]: 	VK_DEVICE: NVIDIA GeForce GTX 750 Ti
[20:01:07] [Graphics/main] [INFO]: 	VK_VERSION: 1.0.0
[20:01:07] [Graphics/main] [INFO]: 	VK_AVAILABLE_EXTENSIONS: VK_KHR_16bit_storage, VK_KHR_8bit_storage, VK_KHR_bind_memory2, VK_KHR_buffer_device_address, VK_KHR_copy_commands2, VK_KHR_create_renderpass2, VK_KHR_dedicated_allocation, VK_KHR_depth_stencil_resolve, VK_KHR_descriptor_update_template, VK_KHR_device_group, VK_KHR_draw_indirect_count, VK_KHR_driver_properties, VK_KHR_external_fence, VK_KHR_external_fence_win32, VK_KHR_external_memory, VK_KHR_external_memory_win32, VK_KHR_external_semaphore, VK_KHR_external_semaphore_win32, VK_KHR_get_memory_requirements2, VK_KHR_image_format_list, VK_KHR_imageless_framebuffer, VK_KHR_maintenance1, VK_KHR_maintenance2, VK_KHR_maintenance3, VK_KHR_multiview, VK_KHR_pipeline_executable_properties, VK_KHR_push_descriptor, VK_KHR_relaxed_block_layout, VK_KHR_sampler_mirror_clamp_to_edge, VK_KHR_sampler_ycbcr_conversion, VK_KHR_separate_depth_stencil_layouts, VK_KHR_shader_atomic_int64, VK_KHR_shader_clock, VK_KHR_shader_draw_parameters, VK_KHR_shader_float16_int8, VK_KHR_shader_float_controls, VK_KHR_shader_non_semantic_info, VK_KHR_shader_subgroup_extended_types, VK_KHR_shader_terminate_invocation, VK_KHR_spirv_1_4, VK_KHR_storage_buffer_storage_class, VK_KHR_swapchain, VK_KHR_swapchain_mutable_format, VK_KHR_synchronization2, VK_KHR_timeline_semaphore, VK_KHR_uniform_buffer_standard_layout, VK_KHR_variable_pointers, VK_KHR_vulkan_memory_model, VK_KHR_win32_keyed_mutex, VK_KHR_workgroup_memory_explicit_layout, VK_KHR_zero_initialize_workgroup_memory, VK_EXT_4444_formats, VK_EXT_blend_operation_advanced, VK_EXT_buffer_device_address, VK_EXT_calibrated_timestamps, VK_EXT_color_write_enable, VK_EXT_conditional_rendering, VK_EXT_custom_border_color, VK_EXT_depth_clip_enable, VK_EXT_depth_range_unrestricted, VK_EXT_descriptor_indexing, VK_EXT_discard_rectangles, VK_EXT_extended_dynamic_state, VK_EXT_extended_dynamic_state2, VK_EXT_external_memory_host, VK_EXT_full_screen_exclusive, VK_EXT_hdr_metadata, VK_EXT_host_query_reset, VK_EXT_image_robustness, VK_EXT_index_type_uint8, VK_EXT_inline_uniform_block, VK_EXT_line_rasterization, VK_EXT_memory_budget, VK_EXT_memory_priority, VK_EXT_pci_bus_info, VK_EXT_pipeline_creation_cache_control, VK_EXT_pipeline_creation_feedback, VK_EXT_private_data, VK_EXT_provoking_vertex, VK_EXT_robustness2, VK_EXT_scalar_block_layout, VK_EXT_separate_stencil_usage, VK_EXT_shader_atomic_float, VK_EXT_shader_demote_to_helper_invocation, VK_EXT_shader_image_atomic_int64, VK_EXT_shader_subgroup_ballot, VK_EXT_shader_subgroup_vote, VK_EXT_subgroup_size_control, VK_EXT_texel_buffer_alignment, VK_EXT_tooling_info, VK_EXT_transform_feedback, VK_EXT_vertex_attribute_divisor, VK_EXT_vertex_input_dynamic_state, VK_EXT_ycbcr_image_arrays, VK_NV_acquire_winrt_display, VK_NV_dedicated_allocation, VK_NV_dedicated_allocation_image_aliasing, VK_NV_device_diagnostic_checkpoints, VK_NV_device_diagnostics_config, VK_NV_device_generated_commands, VK_NV_external_memory, VK_NV_external_memory_win32, VK_NV_inherited_viewport_scissor, VK_NV_shader_sm_builtins, VK_NV_shader_subgroup_partitioned, VK_NV_win32_keyed_mutex, VK_NVX_multiview_per_view_attributes
[20:01:07] [Graphics/main] [INFO]: 	GPU_TOTAL_MEMORY: 6285 MB
[20:01:07] [Graphics/main] [INFO]: ------------------------------
[20:01:07] [Engine/main] [ERROR]: Caught unhandled exception!!! Engine will terminate!
[20:01:07] [Engine/main] [ERROR]: /////////////// CRASH ///////////////
[20:01:07] [Engine/main] [ERROR]: Thread: main
[20:01:07] [Engine/main] [ERROR]: (no message is provided from exception)
java.lang.NullPointerException: null
	at org.lwjgl.system.Checks.check(Checks.java:100)
	at org.lwjgl.util.vma.VmaAllocatorCreateInfo.validate(VmaAllocatorCreateInfo.java:367)
	at org.lwjgl.util.vma.Vma.vmaCreateAllocator(Vma.java:1557)
	at engine.graphics.vulkan.VulkanMemoryAllocator.createAllocator(VulkanMemoryAllocator.java:33)
	at engine.graphics.vulkan.VKGraphicsBackend.initVulkan(VKGraphicsBackend.java:220)
	at engine.graphics.vulkan.VKGraphicsBackend.init(VKGraphicsBackend.java:170)
	at engine.graphics.GraphicsEngine.start(GraphicsEngine.java:64)
	at engine.graphics.EngineGraphicsManager.initialize(EngineGraphicsManager.java:118)
	at engine.graphics.EngineGraphicsManager.<init>(EngineGraphicsManager.java:64)
	at engine.client.EngineClientImpl.resourceStage(EngineClientImpl.java:147)
	at engine.EngineBase.initEngine(EngineBase.java:102)
	at engine.client.launch.Bootstrap.main(Bootstrap.java:22)
[20:01:07] [Engine/main] [ERROR]: Generated crash report file at F:\Project\UnknownDomainGames\PanguEngine\client\build\install\client\bin\run\crashreport\Crash_2022-01-14_20-01-07_CLIENT.txt.

Crash report:

====== Crash Report ======

Time: 2022-01-14 20:01:07 +08:00

--- Exception Stack Traces ---
Thread: main
java.lang.NullPointerException
	at org.lwjgl.system.Checks.check(Checks.java:100)
	at org.lwjgl.util.vma.VmaAllocatorCreateInfo.validate(VmaAllocatorCreateInfo.java:367)
	at org.lwjgl.util.vma.Vma.vmaCreateAllocator(Vma.java:1557)
	at engine.graphics.vulkan.VulkanMemoryAllocator.createAllocator(VulkanMemoryAllocator.java:33)
	at engine.graphics.vulkan.VKGraphicsBackend.initVulkan(VKGraphicsBackend.java:220)
	at engine.graphics.vulkan.VKGraphicsBackend.init(VKGraphicsBackend.java:170)
	at engine.graphics.GraphicsEngine.start(GraphicsEngine.java:64)
	at engine.graphics.EngineGraphicsManager.initialize(EngineGraphicsManager.java:118)
	at engine.graphics.EngineGraphicsManager.<init>(EngineGraphicsManager.java:64)
	at engine.client.EngineClientImpl.resourceStage(EngineClientImpl.java:147)
	at engine.EngineBase.initEngine(EngineBase.java:102)
	at engine.client.launch.Bootstrap.main(Bootstrap.java:22)
----------------------------------------------------------------

--- Exception Details ---
----------------------------------------------------------------

--- System Details ---
Engine Version: 0.3.1-alpha
Engine Side: CLIENT
Runtime Environment: DEPLOYMENT
Loaded Mods: [engine(0.3.1-alpha)]
Operating System: Windows 10 (amd64) version 10.0
Java Version: 17.0.1 (17.0.1+12), 17.0.1
JVM Information: OpenJDK 64-Bit Server VM (mixed mode, sharing), Eclipse Adoptium
Heap Memory Usage: 16 MB / 128 MB (Max: 2032 MB)
Non Heap Memory Usage: 15 MB / -1 MB
JVM Flags: (1 totals) --add-opens=java.base/java.lang=ALL-UNNAMED
----------------------------------------------------------------

--- All Stack Traces ---
Thread: Notification Thread
Daemon: true
StackTrace:

Thread: Attach Listener
Daemon: true
StackTrace:

Thread: Signal Dispatcher
Daemon: true
StackTrace:

Thread: Common-Cleaner
Daemon: true
StackTrace:
	at [email protected]/java.lang.Object.wait(Native Method)
	at [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
	at [email protected]/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
	at [email protected]/java.lang.Thread.run(Thread.java:833)
	at [email protected]/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:162)

Thread: Reference Handler
Daemon: true
StackTrace:
	at [email protected]/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
	at [email protected]/java.lang.ref.Reference.processPendingReferences(Reference.java:253)
	at [email protected]/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:215)

Thread: Finalizer
Daemon: true
StackTrace:
	at [email protected]/java.lang.Object.wait(Native Method)
	at [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
	at [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
	at [email protected]/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:172)


Here is the patch to enable VK backend:

 graphics/src/main/java/engine/graphics/GraphicsEngine.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/graphics/src/main/java/engine/graphics/GraphicsEngine.java b/graphics/src/main/java/engine/graphics/GraphicsEngine.java
index c0f2bf6..8f8e247 100644
--- a/graphics/src/main/java/engine/graphics/GraphicsEngine.java
+++ b/graphics/src/main/java/engine/graphics/GraphicsEngine.java
@@ -91,7 +91,7 @@ public final class GraphicsEngine {
     }
 
     public static class Settings {
-        private String backend = "opengl";
+        private String backend = "vulkan";
         private String imageLoader = "stb";
         private String fontManager = "stb";
 

xtexChooser avatar Jan 14 '22 12:01 xtexChooser

See VmaAllocatorCreateInfo#367: long pVulkanFunctions = memGetAddress(struct + VmaAllocatorCreateInfo.PVULKANFUNCTIONS);

xtexChooser avatar Jan 14 '22 12:01 xtexChooser

这是一个暂时性的修复:

 .../graphics/vulkan/VulkanMemoryAllocator.java     | 22 +++++++++++++++++++++-
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/graphics/src/main/java/engine/graphics/vulkan/VulkanMemoryAllocator.java b/graphics/src/main/java/engine/graphics/vulkan/VulkanMemoryAllocator.java
index 3da57c7..b238a13 100644
--- a/graphics/src/main/java/engine/graphics/vulkan/VulkanMemoryAllocator.java
+++ b/graphics/src/main/java/engine/graphics/vulkan/VulkanMemoryAllocator.java
@@ -6,6 +6,8 @@ import org.lwjgl.system.MemoryStack;
 import org.lwjgl.util.vma.Vma;
 import org.lwjgl.util.vma.VmaAllocationCreateInfo;
 import org.lwjgl.util.vma.VmaAllocatorCreateInfo;
+import org.lwjgl.util.vma.VmaVulkanFunctions;
+import org.lwjgl.vulkan.VK;
 import org.lwjgl.vulkan.VK10;
 import org.lwjgl.vulkan.VkBufferCreateInfo;
 
@@ -28,7 +30,25 @@ public class VulkanMemoryAllocator {
         try(var stack = MemoryStack.stackPush()){
             var info = VmaAllocatorCreateInfo.callocStack(stack)
                     .physicalDevice(device.getPhysicalDevice().getNativePhysicalDevice())
-                    .device(device.getNativeDevice());
+                    .device(device.getNativeDevice())
+                    .pVulkanFunctions(VmaVulkanFunctions.callocStack(stack)
+                            .vkGetPhysicalDeviceProperties(VK10.vkGetInstanceProcAddr(device.getNativeDevice().getPhysicalDevice().getInstance(), stack.ASCII("vkGetPhysicalDeviceProperties")))
+                            .vkGetPhysicalDeviceMemoryProperties(VK10.vkGetInstanceProcAddr(device.getNativeDevice().getPhysicalDevice().getInstance(),stack.ASCII("vkGetPhysicalDeviceMemoryProperties")))
+                            .vkAllocateMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkAllocateMemory")))
+                            .vkFreeMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkFreeMemory")))
+                            .vkMapMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkMapMemory")))
+                            .vkUnmapMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkUnmapMemory")))
+                            .vkFlushMappedMemoryRanges(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkFlushMappedMemoryRanges")))
+                            .vkInvalidateMappedMemoryRanges(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkInvalidateMappedMemoryRanges")))
+                            .vkBindBufferMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkBindBufferMemory")))
+                            .vkBindImageMemory(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkBindImageMemory")))
+                            .vkGetBufferMemoryRequirements(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkGetBufferMemoryRequirements")))
+                            .vkGetImageMemoryRequirements(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkGetImageMemoryRequirements")))
+                            .vkCreateBuffer(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkCreateBuffer")))
+                            .vkDestroyBuffer(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkDestroyBuffer")))
+                            .vkCreateImage(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkCreateImage")))
+                            .vkDestroyImage(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkDestroyImage")))
+                            .vkCmdCopyBuffer(VK10.vkGetDeviceProcAddr(device.getNativeDevice(),stack.ASCII("vkCmdCopyBuffer"))));
             var ptr = stack.mallocPointer(1);
             var err = Vma.vmaCreateAllocator(info, ptr);
             if(err != VK_SUCCESS){

@mouse0w0 没有直接提交是因为:(*****************)

[20:41:56] [Engine/main] [ERROR]: Queue from QueueFamily#0 out of bound. size: 0 index: 0
java.lang.IllegalArgumentException: Queue from QueueFamily#0 out of bound. size: 0 index: 0
        at engine.graphics.vulkan.device.LogicalDevice.getQueue(LogicalDevice.java:95)
        at engine.graphics.vulkan.VKGraphicsBackend.initVulkan(VKGraphicsBackend.java:222)
        at engine.graphics.vulkan.VKGraphicsBackend.init(VKGraphicsBackend.java:170)
        at engine.graphics.GraphicsEngine.start(GraphicsEngine.java:64)
        at engine.graphics.EngineGraphicsManager.initialize(EngineGraphicsManager.java:118)
        at engine.graphics.EngineGraphicsManager.<init>(EngineGraphicsManager.java:64)
        at engine.client.EngineClientImpl.resourceStage(EngineClientImpl.java:147)
        at engine.EngineBase.initEngine(EngineBase.java:102)
        at engine.client.launch.Bootstrap.main(Bootstrap.java:22)
[20:41:56] [Engine/main] [ERROR]: Generated crash report file at F:\Project\UnknownDomainGames\PanguEngine\client\run\crashreport\Crash_2022-01-14_20-41-56_CLIENT.txt.

xtexChooser avatar Jan 14 '22 12:01 xtexChooser

这咋整啊

mouse0w0 avatar Jan 14 '22 13:01 mouse0w0

这咋整啊

修啊((((

xtexChooser avatar Jan 14 '22 13:01 xtexChooser

Vulkan实现的维护者是@cvrunmin,现在这个光荣的任务就交给你们了。

mouse0w0 avatar Jan 14 '22 13:01 mouse0w0

        VmaAllocatorCreateInfo allocatorInfo = VmaAllocatorCreateInfo.calloc();
        allocatorInfo.physicalDevice(_chosenGPU);
        allocatorInfo.device(_device);
        allocatorInfo.instance(_instance);

        VmaVulkanFunctions vmaVulkanFunctions = VmaVulkanFunctions.calloc().set(_instance, _device);
        allocatorInfo.pVulkanFunctions(vmaVulkanFunctions);

I think you need those last 2 lines of code.

enesaltinkaya avatar Feb 07 '22 03:02 enesaltinkaya